diff --git a/EF-COACH/landing/app.js b/EF-COACH/landing/app.js index 8cbc46e..4fff494 100644 --- a/EF-COACH/landing/app.js +++ b/EF-COACH/landing/app.js @@ -1,82 +1,9 @@ -const demos = [ - { - label: "Life freeze", - prompt: "I need to pay the bill, eat something, and answer the text, but I am frozen.", - generic: - "Make a list, decide what is most important, set a timer, and reward yourself when you finish.", - unstuck: - "I am holding the three loops. Biology comes first because planning on empty is false data. Eat the smallest available food, then reply with one word: fed.", - }, - { - label: "Get started", - prompt: "I need a coach to get started on this.", - generic: - "You can do it. Try setting a timer, making a to-do list, and reminding yourself why this matters.", - unstuck: - "You do not need to make this clear before I can help. Send the messy task pile as-is, or any three items if the pile is too much. I will sort it outside your head and give back one next move.", - }, - { - label: "Message spiral", - prompt: "That message makes me feel like I did something wrong.", - generic: - "Try not to take it personally. People are usually not as upset as you think.", - unstuck: - "We are not processing your worth through a notification. First pass: quote the sentence that carries the threat, then write what it literally asks for.", - }, - { - label: "Inbox/calendar", - prompt: "My inbox and calendar are a mess and I do not know what is real.", - generic: - "Clean your inbox, update your calendar, prioritize every commitment, and make a better schedule.", - unstuck: - "That is system overload, not a character problem. We are rescuing live obligations: open the calendar, name the next hard anchor, then pick one inbox item tied to time, money, safety, or another person.", - }, - { - label: "Too many loops", - prompt: "I need to shower, answer the text, find the form, and clean the kitchen.", - generic: - "Prioritize your tasks by urgency and importance. You can use a matrix to decide what to do first.", - unstuck: - "I am holding the list. You only need the first relief move. Choose the loop that gets easier if it moves 10 percent, then touch only that surface.", - }, - { - label: "Failed plan", - prompt: "I tried to start the insurance form Monday, yesterday, and this morning. I keep failing.", - generic: - "Stay positive and try again. Consistency is built by showing up, even when motivation is low.", - unstuck: - "That is three attempts. We are not trying harder at the same plan. The plan failed; you did not. Pick the closest blocker: energy, missing document, unclear first field, or dread.", - }, -]; - globalThis.document?.documentElement?.classList?.add("js"); -function optionalSelector(selector) { - try { - return document.querySelector(selector); - } catch { - return null; - } -} - -function optionalSelectorAll(selector) { - try { - return Array.from(document.querySelectorAll(selector)); - } catch { - return []; - } -} - -function trackUnstuck(eventName, properties = {}) { - window.UnstuckAnalytics?.track?.(eventName, properties); -} - -const navToggle = optionalSelector(".nav-toggle"); -const navLinks = optionalSelectorAll(".nav-links a"); - -navLinks.forEach((link, index) => { - link.style.setProperty("--link-index", index); -}); +const navToggle = document.querySelector(".nav-toggle"); +const navLinks = Array.from(document.querySelectorAll("#nav-links a")); +const sampleButtons = Array.from(document.querySelectorAll("[data-sample]")); +const stuckSentence = document.querySelector("#stuck-sentence"); if (navToggle) { navToggle.addEventListener("click", () => { @@ -84,382 +11,19 @@ if (navToggle) { document.body.classList.toggle("nav-open", nextState); navToggle.setAttribute("aria-expanded", String(nextState)); }); - - navLinks.forEach((link) => { - link.addEventListener("click", () => { - document.body.classList.remove("nav-open"); - navToggle.setAttribute("aria-expanded", "false"); - }); - }); } -const reviewPanels = optionalSelectorAll(".review-panel"); -const reviewPanelIds = new Set(reviewPanels.map((panel) => panel.id).filter(Boolean)); -const reviewPanelAliases = new Map([ - ["reviewer", "demo"], - ["submission", "demo"], -]); -const reviewPanelLinks = optionalSelectorAll('a[href^="#"]').filter((link) => - reviewPanelIds.has(link.getAttribute("href").replace(/^#/, "")), -); -const defaultReviewPanel = reviewPanelIds.has("demo") ? "demo" : reviewPanels[0]?.id; - -function setActiveReviewPanel(panelId = defaultReviewPanel, options = {}) { - panelId = reviewPanelAliases.get(panelId) || panelId; - if (!panelId || !reviewPanelIds.has(panelId)) return false; - - const { updateHash = false, scroll = false } = options; - reviewPanels.forEach((panel) => { - const active = panel.id === panelId; - panel.classList.toggle("is-active", active); - panel.hidden = !active; - panel.setAttribute("aria-hidden", String(!active)); - }); - - reviewPanelLinks.forEach((link) => { - const active = link.getAttribute("href") === `#${panelId}`; - link.classList.toggle("is-active", active); - if (active) { - link.setAttribute("aria-current", "true"); - } else { - link.removeAttribute("aria-current"); - } - }); - - document.body.classList.add("review-deck-ready"); - - trackUnstuck("landing panel viewed", { - panel: panelId, - source: updateHash ? "navigation" : "load", - }); - - if (updateHash && window.location.hash !== `#${panelId}`) { - window.history.pushState(null, "", `#${panelId}`); - } - - if (scroll) { - optionalSelector(".review-deck")?.scrollIntoView({ block: "start", behavior: "auto" }); - } - - return true; -} - -if (reviewPanels.length) { - reviewPanelLinks.forEach((link) => { - link.addEventListener("click", (event) => { - const panelId = link.getAttribute("href").replace(/^#/, ""); - event.preventDefault(); - setActiveReviewPanel(panelId, { updateHash: true, scroll: true }); - document.body.classList.remove("nav-open"); - navToggle?.setAttribute("aria-expanded", "false"); - }); - }); - - window.addEventListener("hashchange", () => { - const panelId = window.location.hash.replace(/^#/, ""); - if (reviewPanelIds.has(panelId) || reviewPanelAliases.has(panelId)) { - setActiveReviewPanel(panelId, { scroll: true, updateHash: reviewPanelAliases.has(panelId) }); - } - }); - - const initialPanel = window.location.hash.replace(/^#/, ""); - const didSelectHash = setActiveReviewPanel(initialPanel, { - scroll: Boolean(initialPanel), - updateHash: reviewPanelAliases.has(initialPanel), - }); - if (!didSelectHash) { - setActiveReviewPanel(defaultReviewPanel); - } - - window.UnstuckLanding = { - showPanel(panelId, options = {}) { - return setActiveReviewPanel(panelId, options); - }, - }; -} - -const promptEl = optionalSelector("#demo-prompt"); -const genericEl = optionalSelector("#demo-generic"); -const unstuckEl = optionalSelector("#demo-unstuck"); -const tabs = optionalSelectorAll(".prompt-tab"); -let activeDemo = 0; -let cycleTimer = null; - -function setDemo(index, userInitiated = false) { - if (!promptEl || !genericEl || !unstuckEl || !tabs.length) return; - - activeDemo = index; - const demo = demos[index]; - promptEl.textContent = demo.prompt; - genericEl.textContent = demo.generic; - unstuckEl.textContent = demo.unstuck; - - tabs.forEach((tab, tabIndex) => { - const active = tabIndex === index; - tab.classList.toggle("active", active); - tab.setAttribute("aria-selected", String(active)); - }); - - if (userInitiated) { - trackUnstuck("example selected", { - example: demo.label, - example_index: index, - source: "prompt-tab", - }); - restartCycle(); - } -} - -function restartCycle() { - window.clearInterval(cycleTimer); - cycleTimer = null; -} - -if (promptEl && genericEl && unstuckEl && tabs.length) { - tabs.forEach((tab) => { - tab.addEventListener("click", () => { - const index = Number.parseInt(tab.dataset.demo, 10); - setDemo(index, true); - }); - }); - - restartCycle(); -} - -const coachConsole = optionalSelector("#coach-console"); -const coachInput = optionalSelector("#coach-input"); -const sampleChips = optionalSelectorAll(".sample-chip"); -const consoleState = optionalSelector("#console-state"); -const consoleStateNote = optionalSelector("#console-state-note"); -const consoleFriction = optionalSelector("#console-friction"); -const consoleFrictionNote = optionalSelector("#console-friction-note"); -const consoleMove = optionalSelector("#console-move"); -const consoleMoveNote = optionalSelector("#console-move-note"); -const consoleCheck = optionalSelector("#console-check"); -const consoleCheckNote = optionalSelector("#console-check-note"); - -const consolePatterns = [ - { - match: /(brain dump|braindump|dump:|dumping|everything in my head|too much in my head|mental clutter|dentist.*bill|bill.*dishes.*email)/i, - state: "Yellow", - stateNote: "The user is carrying too many loops internally. The coach becomes the sorting surface.", - friction: "Brain dump overload", - frictionNote: "The raw dump is valid input. The user should not have to organize it before receiving help.", - move: "Sort outside the head.", - moveNote: "Bucket the dump into Body/State, Now, Next, Later, Waiting, and Trash, then return one next move.", - check: "One next move.", - checkNote: "Check is a single action signal, with the rest visibly held.", - }, - { - match: /(dopamine menu|dopamine|understimulated|stimulation|activation fuel|need a spark|nothing feels rewarding|boring|reward menu|fun menu)/i, - state: "Yellow", - stateNote: "The task may be clear, but the state system needs activation fuel.", - friction: "Activation fuel gap", - frictionNote: "This is a regulation bridge, not clinical dopamine advice and not a reward rabbit hole.", - move: "Choose one tiny spark.", - moveNote: "Pick or assign one 2-10 minute body, novelty, comfort, social, or quick-win cue, then name the return target.", - check: "Spark plus target.", - checkNote: "Check is that the target is visible when the spark ends.", - }, - { - match: /(idea|maybe|what if|could build|new feature|checklist|someday|another thing|remember|remind me|note to self)/i, - state: "Green-yellow", - stateNote: "The idea has energy, but it can steal the active lane.", - friction: "Capture versus execution", - frictionNote: "Novelty needs a parking lot, not a takeover.", - move: "Park with a return time.", - moveNote: "Write the idea in one sentence, add why it matters, and decide when it gets looked at again.", - check: "One parked idea.", - checkNote: "The active work continues unless the idea is explicitly promoted.", - }, - { - match: /(message|email|reply|review|comment|critique|feedback|approved|rejected|bad at this|spiral|did something wrong|mad at me|upset|conflict)/i, - state: "Red-yellow", - stateNote: "Worth is too close to the message. Sort before interpreting.", - friction: "Communication threat", - frictionNote: "The task is not to feel better on command. It is to separate what was said from what it means.", - move: "Separate ask from meaning.", - moveNote: "Quote the sentence that carries the threat, then write what it literally asks for.", - check: "One quoted sentence.", - checkNote: "Check is a quote and a literal ask, not a rebuttal or apology.", - }, - { - match: /(inbox|calendar|schedule|appointment|meeting|unread|reply debt|double-book|overdue|deadline)/i, - state: "Yellow", - stateNote: "The surfaces are noisy, so the first job is reality, not cleanup.", - friction: "Calendar/inbox overload", - frictionNote: "The user needs live obligations rescued before any full-system processing.", - move: "Rescue live obligations.", - moveNote: "Open one surface, name the next hard anchor, then choose one inbox item tied to time, money, safety, relationship, or another person.", - check: "One hard anchor or live item.", - checkNote: "Check is one real calendar anchor or inbox item, not a cleaned system.", - }, - { - match: /(too many|overwhelm|everything|tabs|switching|all of this|list|head|brain|bill|form|kitchen|laundry|dishes|shower|groceries|errand|admin)/i, - state: "Yellow", - stateNote: "Working memory is saturated. The coach holds the list so the user does not have to.", - friction: "Working-memory overload", - frictionNote: "Prioritizing inside the head is the failure mode.", - move: "Externalize the loops.", - moveNote: "Write each active loop as a rough line, then mark the one that creates the most relief at 10 percent done.", - check: "One relief mark.", - checkNote: "The output is a marked line, not a complete priority system.", - }, - { - match: /(failed|tried|again|same plan|three times|keeps failing|cannot make myself|avoid|dread|stuck all week)/i, - state: "Yellow-red", - stateNote: "Repeated failed starts mean the strategy failed. The person did not.", - friction: "Plan mismatch", - frictionNote: "Trying harder at the same plan is now noise.", - move: "Name the closest blocker.", - moveNote: "Choose one: energy, fear of response or conflict, unclear first action, or too many surfaces open.", - check: "One blocker named.", - checkNote: "The next plan changes only after the blocker is named.", - }, - { - match: /(tired|fried|crash|hungry|late|hyperfocus|forgot to eat|body|sleep|exhausted|ate|eat|food|water|shower|overstimulated)/i, - state: "Red", - stateNote: "Biology is in the loop. Planning quality is not the bottleneck.", - friction: "Recovery before re-entry", - frictionNote: "The coach protects the next session instead of extracting one more task.", - move: "Close the loop.", - moveNote: "Save state, write one re-entry breadcrumb, and take the smallest body reset available.", - check: "A re-entry breadcrumb.", - checkNote: "The work is not abandoned if the next start point is visible.", - }, - { - match: /(start|begin|blank|stuck|cannot|can't|open|frozen|freeze|first step|where do i start)/i, - state: "Yellow", - stateNote: "Enough capacity to externalize the pile, not enough for a plan essay.", - friction: "Task pile overload", - frictionNote: "The blocker is choosing from the whole pile while already overloaded.", - move: "Send the messy task pile.", - moveNote: "Fragments, repeats, and half-words are fine. If the pile is too much, send any three items.", - check: "Any three items.", - checkNote: "Check is the raw pile leaving the user's head, not a polished plan.", - }, -]; - -const fallbackConsole = { - state: "Unknown-yellow", - stateNote: "The coach does not guess capacity from a polished prompt.", - friction: "Needs calibration", - frictionNote: "Start with the smallest question that changes the next move.", - move: "Ask one state question.", - moveNote: "Choose: green, yellow, red, or body-first. Then pick the smallest visible action.", - check: "One honest signal.", - checkNote: "Check is the user's state answer, not a productivity plan.", -}; - -function renderConsole(result) { - if ( - !consoleState || - !consoleStateNote || - !consoleFriction || - !consoleFrictionNote || - !consoleMove || - !consoleMoveNote || - !consoleCheck || - !consoleCheckNote - ) { - return; - } - - consoleState.textContent = result.state; - consoleStateNote.textContent = result.stateNote; - consoleFriction.textContent = result.friction; - consoleFrictionNote.textContent = result.frictionNote; - consoleMove.textContent = result.move; - consoleMoveNote.textContent = result.moveNote; - consoleCheck.textContent = result.check; - consoleCheckNote.textContent = result.checkNote; -} - -function coachMoment(text) { - const normalized = text.trim(); - if (!normalized) { - return fallbackConsole; - } - return consolePatterns.find((pattern) => pattern.match.test(normalized)) || fallbackConsole; -} - -if (coachConsole && coachInput) { - coachConsole.addEventListener("submit", (event) => { - event.preventDefault(); - const result = coachMoment(coachInput.value); - renderConsole(result); - trackUnstuck("coach preview submitted", { - input_length_bucket: window.UnstuckAnalytics?.bucketLength?.(coachInput.value) || "unknown", - state: result.state, - friction: result.friction, - move: result.move, - source: "manual-input", - }); - }); - - sampleChips.forEach((chip) => { - chip.addEventListener("click", () => { - coachInput.value = chip.dataset.sample; - const result = coachMoment(coachInput.value); - renderConsole(result); - trackUnstuck("sample chip selected", { - input_length_bucket: window.UnstuckAnalytics?.bucketLength?.(coachInput.value) || "unknown", - state: result.state, - friction: result.friction, - move: result.move, - }); - }); - }); -} - -const copyControls = Array.from(document.querySelectorAll(".copy-control")); - -async function copyText(text) { - if (navigator.clipboard && window.isSecureContext) { - try { - await navigator.clipboard.writeText(text); - return; - } catch { - // Fall through to the textarea path for local file previews. - } - } - - const textarea = document.createElement("textarea"); - textarea.value = text; - textarea.setAttribute("readonly", ""); - textarea.style.position = "fixed"; - textarea.style.left = "-9999px"; - document.body.append(textarea); - textarea.select(); - document.execCommand("copy"); - textarea.remove(); -} - -copyControls.forEach((control) => { - control.addEventListener("click", async () => { - const target = document.querySelector(control.dataset.copyTarget); - if (!target) return; - - const label = control.querySelector("span:last-child"); - const original = label.textContent; - await copyText(target.textContent.trim()); - control.classList.add("copied"); - trackUnstuck("setup copied", { - copy_target: control.dataset.copyTarget || "unknown", - copied_length_bucket: window.UnstuckAnalytics?.bucketLength?.(target.textContent) || "unknown", - }); - label.textContent = "Copied"; - window.setTimeout(() => { - control.classList.remove("copied"); - label.textContent = original; - }, 1400); +navLinks.forEach((link) => { + link.addEventListener("click", () => { + document.body.classList.remove("nav-open"); + navToggle?.setAttribute("aria-expanded", "false"); }); }); -const revealTargets = optionalSelectorAll( - ".section-heading, .scope-core, .scope-lanes li, .admin-rhythm-visual, .admin-rhythm-card, .admin-boundary, .coldrun-steps li, .brief-board article, .quality-board article, .thesis-points article, .handoff-figure, .setup-board article, .response-pane, .coach-console, .console-output article, .file-node, .behavior-grid article", -); - -revealTargets.forEach((target) => { - target.classList.add("reveal-item", "is-visible"); +sampleButtons.forEach((button) => { + button.addEventListener("click", () => { + if (!stuckSentence) return; + stuckSentence.value = button.dataset.sample || ""; + stuckSentence.focus(); + }); }); diff --git a/EF-COACH/landing/assets/unstuck-handoff-card.svg b/EF-COACH/landing/assets/unstuck-handoff-card.svg index 8b69561..2f7b2c6 100644 --- a/EF-COACH/landing/assets/unstuck-handoff-card.svg +++ b/EF-COACH/landing/assets/unstuck-handoff-card.svg @@ -1,53 +1,53 @@ Unstuck Coach handoff card A visual summary of the Unstuck Coach loop: state, friction, move, hold, check, close. - - - - Unstuck Coach Handoff Card - SUMMARY - External executive function for the whole human. - For people who need accessible support to start, switch, remember, recover, and close. + + + + Unstuck Coach Handoff Card + SUMMARY + Paste the stuck sentence. + For people who need one humane next move when executive load gets sticky. - - 1 - State - Green, yellow, red, or body-first signal. + + 1 + State + Green, yellow, red, or body-first signal. - - 2 - Friction - Name the blocker without blame. + + 2 + Friction + Name the blocker without blame. - - 3 - Move - Choose one visible first action. + + 3 + Move + Choose one visible first action. - - 4 - Hold - Keep extra context out of working memory. + + 4 + Hold + Keep extra context out of working memory. - - 5 - Check - Ask for tiny check, not a polished report. + + 5 + Check + Ask for tiny check, not a polished report. - - 6 - Close - Finish, park, schedule, delegate, or pause. + + 6 + Close + Finish, park, schedule, delegate, or pause. diff --git a/EF-COACH/landing/index.html b/EF-COACH/landing/index.html index 73ad33f..5172697 100644 --- a/EF-COACH/landing/index.html +++ b/EF-COACH/landing/index.html @@ -3,731 +3,159 @@ - Unstuck Coach | Executive Function Accessibility Coach + Unstuck Coach | Paste the stuck sentence - - - + + - - + + - +
- -
-

Whole-person executive-function accessibility coach

-

External executive function for the whole human.

-

- Unstuck Coach helps people start, switch, remember, regulate, - capture ideas, recover, and close loops when intention fails to become action. - Food, messages, bills, transitions, and re-entry all count as access work. - Calendar blocks and inbox triage are not an add-on; they are where a lot of life becomes real again. -

-
- Food/body - Calendar/inbox - Messages - Admin - Shutdown -
-
- Coach preview -
- Food firstbody before plan - Hard anchorcalendar before cleanup - Literal askmessage before meaning - Restart markre-entry before shame -
-

You do not need to make this clear first.

-
- Move - Send the messy task pile. - Check - Any three items. -
-
-
- Live demo flow -
    -
  1. Paste messy context or any three fragments.
  2. -
  3. Pick capacity so the move is sized to the person.
  4. -
  5. Get one next move while the rest stays parked.
  6. -
-

Limited release: no account memory, no crisis support, occasional rate limits.

-
- - -
-
- -
-
- Form - Portable Claude Project setup -
-
- Person - Whole person under executive load -
-
- Help - Start, switch, remember, regulate, recover, close -
-
- -
-
-
-

Unstuck routes

-

Start with the loop that is real right now.

-

- Unstuck meets executive load where it shows up: the first stuck sentence, - the overloaded inbox, the hungry body, the message spiral, the unfinished - bill, or the re-entry point after a lost thread. -

-
- -
- -
-
-
-

Whole-person operating surface

-

The first move can be food, a text, a calendar anchor, or a bill.

-

- Unstuck does not turn accessibility support into more output for work. - It protects the person carrying the loops, then chooses the smallest humane - move that makes the next minute more real. A brain dump counts, and so - does a bounded spark when the state system needs activation fuel. -

- -
- -
-
- Unstuck loop - State -> friction -> one humane concrete move -> tiny check -> re-entry trail. -

The coach holds the rest so the person does not have to hold it all at once.

-
- -
    -
  1. - -
    - Food and body -

    Hungry, fried, understimulated, overstimulated, late, or coming out of hyperfocus.

    -
    - Reset or spark -
  2. -
  3. - -
    - Calendar and inbox -

    Hard anchors, live obligations, reply debt, missed commitments, scheduling friction.

    -
    - Reality before cleanup -
  4. -
  5. - -
    - Messages and shame -

    Separate what was said from what it means before meaning-making takes over.

    -
    - Literal ask first -
  6. -
  7. - -
    - Home and admin loops -

    Dishes, forms, bills, bags, errands, and surfaces that become too loud to enter.

    -
    - One relief mark -
  8. -
  9. - -
    - Capture and re-entry -

    Park the idea, sort the brain dump, close the loop, and make restart visible.

    -
    - No lost thread -
  10. -
-
-
-
- -
-
-
-

Calendar and inbox layer

-

Calendar and inbox are part of the life loop.

-

- The coach does not need account access to be useful. It helps the user - turn calendar drift, inbox noise, reply debt, missed obligations, and - scheduling friction into one concrete decision at a time, without - pretending it can read accounts or run the user's life. -

- -
- -
-
- Layered bridge-style operating map with mail, calendar, reply, money, settings, and dashboard surfaces connected as one workflow. -
-
- Calendar reality - Find the next hard anchor before rebuilding the week. -

Meetings, deadlines, travel, pickup, sleep, meals, medication, and recovery buffers become the map.

-
-
- Inbox live obligation - Rescue consequence before cleanup. -

One sender, subject, date, or deadline cue. Reply, schedule, delegate, park, archive, or mark not live.

-
-
- Reply debt recovery - Repair trust without shame theater. -

Literal ask, real consequence, smallest honest reply, and a close status the user can believe.

-
-
- Boundary - No autonomous reading, sending, scheduling, or inbox-zero promises. -

Unstuck coaches the management pass and asks for a tiny check: one hard anchor, one live item, one draft, or one parked re-entry time.

-
-
-
-
- -
-
-
-

Quick start

-

Start before you read everything.

-

- The path is deliberately small: open the live demo or paste the setup - instructions into Claude Project, then start with one stuck sentence. - The coach should cross one real threshold, not ask the user to admire - the whole system first. -

- -
- -
    -
  1. - 01 - Open the live demo or GitHub source. -

    The start path is visible without making someone decode the whole repo first.

    -
  2. -
  3. - 02 - Paste `coach/PROJECT_INSTRUCTIONS.md`. -

    The coach starts from state, friction, one concrete move, held context, check, and closure.

    -
  4. -
  5. - 03 - Try the stuck-loop prompt. -

    `I need a coach to get started on this.` The coach should help immediately, not explain productivity.

    -
  6. -
-
-
- -
-
-
-

What makes it Unstuck

-

The coach has a clear operating loop.

-

- Unstuck works because the coach has a stable job: plain language, - one humane next move, held context, safety boundaries, and life-surface - protocols that keep help from turning into homework. -

-
- -
-
- Coach contract - Identity, rules, examples, and reference files each carry one job. - View source -
-
- Operating loop - State, friction, move, held context, check, close. - Read rules -
-
- Examples - One stuck sentence should become one usable next move. - See examples -
-
- Whole-person scope - Food, messages, bills, calendar reality, shutdown, and re-entry all count. - Read the thesis -
-
- Boundaries - The coach helps with access; it does not pretend to be therapy or account automation. - Read boundaries -
-
-
-
- -
-
-
-

Point of view

-

The design is simple: reduce the next threshold.

-

- Unstuck is built around a simple bet: the right next move is often - smaller than the user can find alone. The coach keeps the context - visible and turns the moment into something the person can actually do. -

- -
- -
-
- Context - The project files give the coach a stable job. -

Claude Project knowledge becomes the operating surface, so every file has one coaching purpose.

-
-
- Operating loop - The coach covers start, switch, remember, regulate, capture, recover, and close. -

The stuck-loop prompt is only the fastest example; the product is broader accessibility scaffolding for a whole person.

-
-
- Boundary - The coach stops before therapy or execution. -

It protects dignity, reduces the first move, and leaves re-entry visible.

-
-
-
-
- -
-
-
-

Shareable setup

-

A new user can test the coach without a call.

-

- The setup keeps the promise legible: when to use it, what good coaching - looks like, where the limits are, and where to start. -

- -
-
- Unstuck Coach handoff card showing the coaching loop: state, friction, move, hold, check, close. -
-
-
- -
-
-
-

Set it up

-

Load the coach files.

-

- Unstuck runs through the project context. Add the coach files to - Claude Project or another AI workspace, use the project instructions, - and begin with the stuck point in front of you. -

- -
- -
-
-
- Claude Project path - Add the project files as knowledge. -

Use `coach/PROJECT_INSTRUCTIONS.md` as the project instruction, then start with whatever is stuck.

-
-
- Codex path - Open this project as the workspace. -

Ask Codex to read `coach/PROJECT_INSTRUCTIONS.md`, `coach/START_HERE.md`, `coach/identity.md`, `coach/rules.md`, `coach/examples.md`, and `reference/` before coaching.

-
-
- Antigravity / AI IDE path - Create a project from the Unstuck files. -

Keep file access scoped to this project, then load the same coach contract.

-
-
- Local model path - Paste the operating files into context. -

Use `coach/PROJECT_INSTRUCTIONS.md`, `coach/identity.md`, `coach/rules.md`, `coach/examples.md`, `reference/coaching-protocols.md`, `reference/signal-map.md`, and `reference/safety-boundaries.md`.

-
-
- -
- What good help does - It should make the next move easier. -

Name the friction, give one concrete move, and ask for tiny check. No article, no menu, no moralizing.

-

`coach/PROJECT_INSTRUCTIONS.md` routes concrete stuck signals directly. The coach should not ask the traffic-light question first.

- Read setup instructions -
-
-
-
- -
-
-
-

Coach quality

-

Know whether the coach is helping.

-

- The fastest signal is the response to a stuck prompt. It should - change the next move, not explain executive dysfunction. -

- -
- -
-
- Pass 01 - Names friction. -

Task-start friction, overload, communication threat, capture, recovery, or calibration need.

-
-
- Pass 02 - Gives one move. -

One concrete action the user can do now, not a list of competing tactics.

-
-
- Pass 03 - Holds context. -

The coach keeps the rest of the task list out of working memory.

-
-
- Pass 04 - Asks for a tiny check. -

The reply ends with one answer or one state signal.

-
-
- Not good enough - Article, menu, moralizing, vague continuation, or unsafe clinical advice. -

If the response does that, the coach is not doing enough.

-
-
-
-
- -
-
-

Boundaries

-

The coach helps with the next move, not someone else's life.

+

Paste the stuck sentence.

- Unstuck does not read accounts, send messages, schedule events, or - promise inbox zero. It helps the user name what is real and choose one - humane next action. + Unstuck Coach gives you one humane next move for task initiation, + reply debt, re-entry, admin loops, and working-memory overload.

- -
- -
-
-

The difference in the first minute

-

Same prompt. Different intervention.

-

- A knowledge base explains executive dysfunction. A coach changes the next humane move and preserves the loop. -

-
-
-
- - - - - - +
+ + +
+ + +
- -
-
- User says -

I need to pay the bill, eat something, and answer the text, but I am frozen.

-
-
- Generic assistant -

Make a list, decide what is most important, set a timer, and reward yourself when you finish.

-
-
- Unstuck Coach -

I am holding the three loops. Biology comes first because planning on empty is false data. Eat the smallest available food, then reply with one word: fed.

-
-
-
+ +

No polished prompt needed. Fragments count.

+
-
-
-

Interpretable context methodology

-

Each file owns one coaching job.

-
- -
-
- 01 -

coach/identity.md

-

Defines the athlete, coaching promise, voice, and boundaries.

-
-
- 02 -

coach/rules.md

-

Turns executive-function signals into state, friction, move, hold, check, close.

-
-
- 03 -

coach/examples.md

-

Shows calibrated coaching under shame, overload, communication threat, and task-start friction.

+
+

It does not give you another productivity article.

+
+
+ 01 +

Name the friction without blame.

+

The coach treats stuckness as an access problem, not a character problem.

-
- 04 -

reference/

-

Holds protocols, admin operations playbooks, safety boundaries, source notes, and the signal map.

+
+ 02 +

Choose one concrete next move.

+

One visible action, small enough to do without decoding a plan.

-
- 05 -

README.md

-

Gives a stranger the setup path and starter messages.

+
+ 03 +

Hold the rest outside your head.

+

The pile stays parked while the next minute becomes possible.

-
-
-

Research made behavioral

-

The coach does not describe friction. It handles it.

+
+
+

Built for the moment before action.

+

+ Use it when you are frozen at a bill, a message, a calendar check, a + work task, a shutdown, or the awkward return after avoiding something. +

+
    +
  • Task initiation
  • +
  • Reply debt
  • +
  • Calendar and inbox reality
  • +
  • Admin loops
  • +
  • Re-entry after avoidance
  • +
  • Body-first planning
  • +
+
-
-
-

Working memory overload

-

Holds the list, returns one next move, and parks the rest visibly.

-
-
-

Time blindness

-

Budgets setup, resistance, testing, transitions, and re-entry before the hard stop.

-
-
-

Shame after avoidance

-

Reconstructs from artifacts, not memory, and removes the shame tax.

-
+
+

Non-clinical support, privacy-safe analytics.

+

+ Unstuck Coach is not therapy, diagnosis, or medical treatment. It is + executive-function accessibility support for the next useful move. +

+
-

Novelty pull

-

Uses a tangent firewall: chase, bookmark, or discard.

+

We measure the funnel.

+

Coarse events like chat opened, first prompt submitted, reply received, and errors.

-

Hyperfocus crash

-

Closes the loop with biological recovery and one re-entry breadcrumb.

+

We do not use analytics for prompt storage.

+

No prompt histories, request bodies, API keys, or provider payloads in analytics.

-

Communication threat

-

Sorts comments into correctness, style, scope, or confusion before meaning-making.

+

We keep claims plain.

+

The product helps with access and activation. It does not replace qualified care.

-
- -
-
+ + diff --git a/EF-COACH/landing/styles.css b/EF-COACH/landing/styles.css index abf048f..2f115ab 100644 --- a/EF-COACH/landing/styles.css +++ b/EF-COACH/landing/styles.css @@ -1,49 +1,38 @@ :root { color-scheme: light; - --ink: #060910; - --ink-soft: #24211f; - --muted: #6f625b; - --muted-strong: #403832; - --paper: #fff8ec; - --paper-soft: #f8f3eb; - --surface: #fffaf2; - --surface-deep: #eadcc6; - --cream-line: #fff5dc; - --line: #d9d0c4; - --line-strong: #766755; - --start: #ff4b1f; - --start-deep: #8f2a1b; - --sage: #008d99; - --steel: #06434a; - --gold: #ffc018; - --cyan: #00d7e8; - --lime: #b7f10b; - --orange: #ff8b00; - --magenta: #ff147f; - --magenta-muted: #c8004d; - --sky-muted: #00f0d4; - --taste-teal: #2f8e86; - --taste-cyan: #6fc7c5; - --taste-lichen: #a7af48; - --taste-saffron: #d9a72f; - --taste-coral: #ef724b; - --taste-clay: #d65f35; - --taste-berry: #9f365f; - --taste-ink: #07101c; - --taste-veil: rgba(255, 248, 236, 0.68); - --shadow-ambient: 0 30px 84px rgba(36, 33, 31, 0.14); - --shadow-soft: 0 18px 52px rgba(36, 33, 31, 0.11); - --shadow-tight: 0 8px 24px rgba(36, 33, 31, 0.09); - --shadow-ink: 0 28px 70px rgba(6, 9, 16, 0.28); + --font-sans: "Atkinson Hyperlegible", "Aptos", "Avenir Next", "Plus Jakarta Sans", system-ui, sans-serif; + --font-mono: "Geist Mono", "SF Mono", ui-monospace, monospace; + --ink: #101317; + --ink-soft: #252b31; + --muted: #5f655f; + --paper: #f7f3ea; + --paper-deep: #efe5d4; + --surface: #fffdf8; + --surface-soft: #fbf8f1; + --line: #d8d0c2; + --line-strong: #a69b89; + --apatite-950: #052733; + --apatite-900: #064b5f; + --apatite-800: #075e73; + --apatite-700: #08758d; + --apatite-500: #11a5ce; + --apatite-100: #d7f0f2; + --apatite-50: #eaf8f7; + --attention: #b86b2b; + --shadow-paper: 0 18px 52px rgba(37, 43, 49, 0.08); + --shadow-lift: 0 10px 28px rgba(8, 117, 141, 0.13); --radius: 8px; - --ease-out: cubic-bezier(0.2, 0, 0.2, 1); - --ease-spring: var(--ease-out); - --motion-fast: 120ms; - --motion-soft: 180ms; - --wrap: min(1180px, calc(100% - 3rem)); - --editorial: "PP Editorial New", "Canela", "Fraunces", "New York", serif; - font-family: "Avenir Next", "Plus Jakarta Sans", "Geist", "Satoshi", system-ui, sans-serif; - letter-spacing: 0; + --wrap: min(1120px, calc(100% - 2rem)); + --measure: 66ch; + --step--1: 0.92rem; + --step-0: 1rem; + --step-1: 1.18rem; + --step-2: 1.45rem; + --step-3: 1.85rem; + --step-4: 2.45rem; + --step-5: 3.35rem; + --ease: cubic-bezier(0.2, 0, 0.2, 1); + font-family: var(--font-sans); } * { @@ -52,24 +41,21 @@ html { scroll-behavior: auto; -} - -html.source-reader-shell { - scroll-behavior: auto; + font-size: 100%; + -webkit-text-size-adjust: 100%; } body { min-width: 320px; margin: 0; background: - linear-gradient(90deg, rgba(6, 9, 16, 0.018) 0 1px, transparent 1px 142px), - linear-gradient(180deg, rgba(6, 9, 16, 0.016) 0 1px, transparent 1px 142px), - linear-gradient(90deg, rgba(47, 142, 134, 0.08) 0 10%, transparent 10% 28%, rgba(217, 167, 47, 0.075) 28% 36%, transparent 36% 68%, rgba(214, 95, 53, 0.055) 68% 76%, transparent 76%), - linear-gradient(132deg, rgba(255, 253, 246, 0.54), rgba(217, 167, 47, 0.08) 28%, rgba(47, 142, 134, 0.055) 64%, transparent 100%), - linear-gradient(180deg, var(--surface) 0%, var(--paper) 52%, #f0dfc4 100%); + linear-gradient(90deg, rgba(8, 117, 141, 0.06) 0 10%, transparent 10% 34%, rgba(184, 107, 43, 0.05) 34% 43%, transparent 43%), + linear-gradient(180deg, var(--surface) 0%, var(--paper) 52%, var(--paper-deep) 100%); color: var(--ink); - font-size: 16px; + font-family: var(--font-sans); + font-size: var(--step-0); line-height: 1.5; + font-synthesis: none; text-rendering: optimizeLegibility; } @@ -77,3628 +63,445 @@ body::before { content: ""; position: fixed; inset: 0; - z-index: 4; + z-index: 1; pointer-events: none; - opacity: 0.038; - background-image: - repeating-radial-gradient(circle at 30% 20%, rgba(8, 7, 5, 0.9) 0 0.6px, transparent 0.7px 3px); + opacity: 0.035; + background-image: radial-gradient(rgba(16, 19, 23, 0.88) 0.55px, transparent 0.65px); + background-size: 3px 3px; mix-blend-mode: multiply; } -body::after { - content: ""; - position: fixed; - inset: 0 auto 0 0; - z-index: 3; - width: 0.46rem; - pointer-events: none; - background: - linear-gradient(180deg, var(--taste-ink), var(--taste-teal) 24%, var(--taste-lichen) 42%, var(--taste-saffron) 61%, var(--taste-clay) 78%, var(--taste-berry)), - repeating-linear-gradient(180deg, transparent 0 34px, rgba(255, 245, 220, 0.72) 34px 37px, transparent 37px 72px); - box-shadow: - 1px 0 0 rgba(6, 9, 16, 0.58), - 10px 0 34px rgba(6, 9, 16, 0.06); -} - a { color: inherit; text-decoration: none; } button, -input, textarea { font: inherit; } -button { - color: inherit; -} - -:where(a, button, textarea):focus-visible { - outline: 3px solid var(--cyan); +:focus-visible { + outline: 3px solid rgba(8, 117, 141, 0.46); outline-offset: 4px; - box-shadow: 0 0 0 7px rgba(0, 215, 232, 0.16); -} - -::selection { - background: rgba(214, 163, 56, 0.28); } .site-nav { position: sticky; top: 0; - z-index: 7; - width: 100%; + z-index: 20; display: flex; align-items: center; justify-content: space-between; gap: 1rem; - min-height: 4.2rem; - padding: 0.62rem max(1rem, calc((100vw - 1180px) / 2)); - border-bottom: 1px solid rgba(6, 9, 16, 0.16); - background: - linear-gradient(180deg, rgba(255, 253, 246, 0.98), rgba(255, 248, 236, 0.94)); - box-shadow: - inset 0 1px 0 rgba(255, 255, 255, 0.84), - inset 0 -1px 0 rgba(6, 9, 16, 0.05); + width: 100%; + padding: 0.9rem max(1rem, calc((100vw - 1120px) / 2)); + border-bottom: 1px solid rgba(16, 19, 23, 0.08); + background: rgba(255, 253, 248, 0.9); + backdrop-filter: blur(16px); } -.wordmark, +.brand, .nav-links { display: flex; align-items: center; } -.wordmark { - gap: 0.72rem; - padding: 0.38rem 0.68rem 0.38rem 0.2rem; - border-radius: 999px; - color: var(--ink); - font-size: 0.88rem; - font-weight: 840; - letter-spacing: 0; - white-space: nowrap; +.brand { + gap: 0.65rem; + color: var(--ink-soft); + font-weight: 820; } -.wordmark-mark { - width: 2.38rem; - height: 2.38rem; - display: block; - flex: 0 0 auto; - border: 1px solid rgba(6, 9, 16, 0.24); +.brand img { + width: 2.15rem; + height: 2.15rem; + border: 1px solid rgba(8, 117, 141, 0.28); border-radius: 50%; background: var(--surface); - box-shadow: - 0 0 0 3px rgba(255, 253, 246, 0.78), - 0 9px 20px rgba(47, 142, 134, 0.12), - 0 12px 28px rgba(71, 51, 30, 0.12); - object-fit: cover; - object-position: center; -} - -.nav-toggle { - display: none; - width: 2.7rem; - height: 2.7rem; - align-items: center; - justify-content: center; - border: 1px solid rgba(168, 148, 120, 0.34); - border-radius: 50%; - background: rgba(255, 253, 246, 0.82); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.78); - cursor: pointer; -} - -.nav-toggle-line { - position: absolute; - width: 1rem; - height: 1px; - background: var(--ink); - transform-origin: center; - transition: opacity var(--motion-fast) var(--ease-out); -} - -.nav-toggle-line:first-child { - transform: translateY(-0.22rem); -} - -.nav-toggle-line:last-child { - transform: translateY(0.22rem); -} - -.nav-open .nav-toggle-line:first-child { - transform: rotate(45deg); -} - -.nav-open .nav-toggle-line:last-child { - transform: rotate(-45deg); } .nav-links { - gap: 0.42rem; + gap: 0.35rem; } .nav-links a { - position: relative; - padding: 0.58rem 0.84rem; - border: 1px solid transparent; + padding: 0.68rem 0.9rem; border-radius: 999px; - color: var(--muted-strong); - font-size: 0.78rem; + color: var(--muted); + font-size: var(--step--1); font-weight: 720; - line-height: 1; - transition: - border-color var(--motion-fast) var(--ease-out), - color var(--motion-fast) var(--ease-out), - background var(--motion-fast) var(--ease-out); -} - -.nav-links a span { - display: block; - white-space: nowrap; } .nav-links a:hover { - border-color: rgba(47, 142, 134, 0.18); - background: rgba(44, 123, 115, 0.09); color: var(--ink); + background: rgba(8, 117, 141, 0.08); } -.nav-links a:active, -.action:active, -.prompt-tab:active, -.copy-control:active, -.sample-chip:active { - border-color: rgba(6, 9, 16, 0.34); +.nav-links .nav-cta { + color: #ffffff; + background: var(--apatite-900); } -.hero { - position: relative; - min-height: 84dvh; - display: grid; - grid-template-columns: minmax(0, 0.9fr) minmax(31rem, 1.1fr); - align-items: center; - gap: 4.35rem; - width: var(--wrap); - margin: 0 auto; - padding: 8.4rem 0 4.3rem; - isolation: isolate; +.nav-toggle { + display: none; + width: 2.6rem; + height: 2.6rem; + border: 1px solid var(--line); + border-radius: 999px; + background: var(--surface); } -.hero::before { - content: ""; - position: absolute; - inset: 6.7rem -1.85rem 2.05rem; - z-index: -2; - background: - linear-gradient(90deg, rgba(255, 250, 242, 0.985), rgba(255, 248, 236, 0.76) 58%, rgba(255, 248, 236, 0.32)), - linear-gradient(120deg, rgba(47, 142, 134, 0.065), transparent 31%, rgba(217, 167, 47, 0.07)), - repeating-linear-gradient(135deg, rgba(6, 9, 16, 0.02) 0 1px, transparent 1px 56px), - repeating-linear-gradient(90deg, rgba(217, 208, 196, 0.24) 0 1px, transparent 1px 142px), - repeating-linear-gradient(0deg, rgba(217, 208, 196, 0.2) 0 1px, transparent 1px 142px); - border: 1px solid rgba(6, 9, 16, 0.1); - border-radius: var(--radius); - box-shadow: - inset 0 1px 0 rgba(255, 255, 255, 0.84), - inset 0 0 0 0.42rem rgba(255, 245, 220, 0.34), - 0 24px 78px rgba(71, 51, 30, 0.08); +.nav-toggle span { + display: block; + width: 1rem; + height: 2px; + margin: 0.22rem auto; + background: var(--ink); } -.hero-copy { - order: 1; - position: relative; - min-width: 0; - max-width: 45rem; - padding-left: 1.05rem; +.hero { + width: var(--wrap); + min-height: min(720px, calc(100svh - 8rem)); + margin: 0 auto; + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(320px, 420px); + gap: 4rem; + align-items: center; + padding: 4.2rem 0 3.2rem; } -.hero-copy::before { - content: ""; - position: absolute; - top: 0.2rem; - bottom: 0.35rem; - left: 0; - width: 0.22rem; - border-radius: 999px; - background: - linear-gradient(180deg, var(--taste-ink), var(--taste-teal), var(--taste-cyan), var(--taste-saffron), var(--taste-clay), var(--taste-berry)), - repeating-linear-gradient(180deg, transparent 0 20px, rgba(255, 248, 236, 0.74) 20px 22px, transparent 22px 42px); - box-shadow: - 0 0 0 1px rgba(6, 9, 16, 0.72), - 0 18px 34px rgba(255, 75, 31, 0.12); +.hero h1, +.section h2 { + max-width: 11ch; + margin: 0; + color: var(--ink); + font-size: var(--step-5); + font-weight: 860; + letter-spacing: 0; + line-height: 0.96; + text-wrap: balance; } -.workbench-scene { - order: 2; - position: relative; - min-width: 0; - min-height: 36.8rem; - border: 2px solid var(--ink); - border-radius: var(--radius); - background: - linear-gradient(90deg, rgba(255, 245, 220, 0.055) 0 1px, transparent 1px 5.4rem), - linear-gradient(180deg, rgba(255, 245, 220, 0.04) 0 1px, transparent 1px 5.4rem), - linear-gradient(145deg, rgba(6, 9, 16, 0.98), rgba(6, 67, 74, 0.96)), - linear-gradient(126deg, transparent 0%, rgba(217, 167, 47, 0.1) 42%, transparent 72%); - outline: 1px solid rgba(255, 245, 220, 0.56); - outline-offset: -0.78rem; - box-shadow: - inset 0 1px 0 rgba(255, 245, 220, 0.18), - inset 0 0 0 0.5rem rgba(255, 245, 220, 0.08), - inset 0 0 0 0.9rem rgba(6, 9, 16, 0.32), - 0 2px 0 rgba(255, 245, 220, 0.48), - 0 36px 92px rgba(6, 9, 16, 0.3); - overflow: hidden; +.hero-copy p { + max-width: 42rem; + margin: 1.25rem 0 0; + color: var(--muted); + font-size: var(--step-1); + line-height: 1.42; + text-wrap: pretty; } -.workbench-scene::before { - content: ""; - position: absolute; - inset: 0.82rem; - border: 1px solid rgba(255, 245, 220, 0.5); - border-radius: 5px; - pointer-events: none; - z-index: 5; +.hero-actions { + display: flex; + flex-wrap: wrap; + gap: 0.8rem; + margin-top: 1.8rem; } -.workbench-scene::after { - content: ""; - position: absolute; - inset: 0; - background: - radial-gradient(circle at 50% 44%, rgba(255, 245, 220, 0.11), transparent 17rem), - repeating-linear-gradient(135deg, transparent 0 38px, rgba(255, 245, 220, 0.05) 38px 39px, transparent 39px 82px), - repeating-linear-gradient(45deg, transparent 0 68px, rgba(111, 199, 197, 0.04) 68px 69px, transparent 69px 136px), - linear-gradient(90deg, rgba(6, 9, 16, 0.52), transparent 42%, rgba(159, 54, 95, 0.055)); - opacity: 0.9; - pointer-events: none; +.button { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 3rem; + padding: 0.88rem 1.22rem; + border: 1px solid var(--line-strong); + border-radius: 999px; + font-weight: 820; + cursor: pointer; + transition: + transform 160ms var(--ease), + background 160ms var(--ease), + border-color 160ms var(--ease), + box-shadow 160ms var(--ease); } -.mola-bridge { - position: absolute; - z-index: 1; - border: 2px solid var(--ink); - border-radius: var(--radius); - box-shadow: - inset 0 0 0 2px rgba(255, 245, 220, 0.86), - inset 0 0 0 7px rgba(6, 9, 16, 0.32), - 0 18px 48px rgba(6, 9, 16, 0.22); - opacity: 0.78; +.button:active, +button:active { + transform: translateY(1px); } -.mola-bridge::before, -.mola-bridge::after { - content: ""; - position: absolute; - inset: 0.45rem; - border: 1px solid rgba(255, 253, 246, 0.82); - border-radius: 5px; +.button.primary { + color: #ffffff; + border-color: var(--apatite-900); + background: var(--apatite-700); + box-shadow: var(--shadow-lift); } -.bridge-one { - right: -12%; - top: 23.5%; - width: 40rem; - height: 6.35rem; - background: - linear-gradient(90deg, var(--taste-ink) 0 22%, var(--taste-teal) 22% 38%, var(--taste-cyan) 38% 51%, var(--taste-lichen) 51% 61%, var(--taste-saffron) 61% 72%, var(--taste-clay) 72% 86%, var(--taste-berry) 86% 100%); - transform: rotate(-13deg); - clip-path: polygon(0 22%, 8% 0, 16% 22%, 24% 0, 32% 22%, 40% 0, 48% 22%, 56% 0, 64% 22%, 72% 0, 80% 22%, 88% 0, 100% 22%, 100% 100%, 0 100%); +.button.primary:hover { + background: var(--apatite-800); } -.bridge-two { - left: -10%; - bottom: 19.5%; - width: 29rem; - height: 4.45rem; - background: - linear-gradient(90deg, var(--taste-berry) 0 18%, var(--taste-clay) 18% 38%, var(--taste-saffron) 38% 58%, var(--taste-cyan) 58% 78%, var(--taste-teal) 78% 100%); - transform: rotate(-13deg); - clip-path: polygon(0 0, 100% 0, 94% 100%, 0 100%); +.button.secondary { + color: var(--ink); + background: rgba(255, 253, 248, 0.62); } -.runway-line { - position: absolute; - z-index: 2; - left: 12%; - right: 9%; - bottom: 32%; - height: 2px; - background: linear-gradient(90deg, transparent, var(--taste-cyan), var(--taste-lichen), var(--taste-saffron), var(--taste-clay), transparent); - transform-origin: left center; - transform: rotate(-13deg); +.button.full { + width: 100%; } -.scene-panel { - position: absolute; - z-index: 3; - border: 1px solid rgba(6, 9, 16, 0.72); +.stuck-card { + display: grid; + gap: 1rem; + padding: 1.4rem; + border: 1px solid rgba(16, 19, 23, 0.14); border-radius: var(--radius); - background: - repeating-linear-gradient(90deg, rgba(6, 9, 16, 0.014) 0 1px, transparent 1px 32px), - linear-gradient(180deg, rgba(255, 250, 242, 0.985), rgba(248, 243, 235, 0.93)); - box-shadow: - inset 0 1px 0 rgba(255, 255, 255, 0.82), - 0 18px 40px rgba(6, 9, 16, 0.21); - padding: 0.95rem; - overflow: hidden; + background: rgba(255, 253, 248, 0.86); + box-shadow: var(--shadow-paper); } -.scene-panel::before { - content: ""; - position: absolute; - inset: 0.34rem; - border: 1px solid rgba(255, 245, 220, 0.86); - border-radius: 5px; - pointer-events: none; +.stuck-card label { + font-size: var(--step--1); + font-weight: 840; } -.panel-kicker, -.eyebrow, -.check-label, -.pane-label, -.file-index { - display: block; - color: var(--muted); - font-size: 0.68rem; - font-weight: 780; - letter-spacing: 0.18em; - text-transform: uppercase; +.stuck-card textarea { + width: 100%; + min-height: 10.5rem; + resize: vertical; + padding: 1rem; + border: 1px solid var(--line); + border-radius: var(--radius); + background: var(--surface); + color: var(--ink); + line-height: 1.5; } -.task-stack { - right: 4.7%; - top: 7.6%; - width: 12.9rem; - transform: rotate(0.45deg); - border-top: 3px solid var(--taste-cyan); +.stuck-card textarea::placeholder { + color: #73786f; } -.task-row { - position: relative; +.sample-row { display: grid; - grid-template-columns: 0.65rem 1fr; - gap: 0.72rem; - align-items: center; - padding: 0.78rem 0; - border-top: 1px solid rgba(168, 148, 120, 0.28); - color: var(--ink-soft); -} - -.task-row:first-of-type { - margin-top: 0.5rem; -} - -.task-row span { - width: 0.58rem; - height: 0.58rem; - border-radius: 50%; - background: var(--line-strong); -} - -.task-row.active span { - background: var(--taste-clay); - box-shadow: 0 0 0 7px rgba(214, 95, 53, 0.13); + grid-template-columns: repeat(3, 1fr); + gap: 0.55rem; } -.task-row:nth-of-type(3) span { - background: var(--taste-saffron); +.sample-row button { + min-height: 2.5rem; + border: 1px solid rgba(8, 117, 141, 0.24); + border-radius: 999px; + background: var(--apatite-50); + color: var(--apatite-900); + font-weight: 780; + cursor: pointer; } -.task-row:nth-of-type(4) span { - background: var(--taste-teal); +.fine-print { + margin: -0.25rem 0 0; + color: var(--muted); + font-size: var(--step--1); } -.coach-dialogue { - z-index: 4; - right: 5.4%; - bottom: 7.2%; - width: 18.8rem; - transform: rotate(-0.45deg); - border-top: 3px solid var(--taste-lichen); +.section { + width: var(--wrap); + margin: 0 auto; + padding: 4.8rem 0; } -.coach-dialogue p { - margin: 0.74rem 0; - max-width: 24ch; - color: var(--ink); - font-weight: 760; +.section.narrow { + max-width: 980px; } -.check-line { - display: flex; - align-items: center; - gap: 0.6rem; - color: var(--steel); - font-size: 0.82rem; - font-weight: 820; +.section h2 { + max-width: 15ch; + font-size: var(--step-4); } -.check-line span { - width: 0.55rem; - height: 0.55rem; - border-radius: 50%; - background: var(--taste-lichen); +.section > p, +.split p, +.trust > p { + max-width: var(--measure); + color: var(--muted); + font-size: var(--step-0); + text-wrap: pretty; } -.life-ledger { - left: 5.1%; - top: 15.2%; - width: 21.15rem; - color: var(--ink); - background: - linear-gradient(180deg, rgba(255, 250, 242, 0.98), rgba(255, 245, 220, 0.94)), - linear-gradient(120deg, rgba(159, 54, 95, 0.11), transparent 48%, rgba(111, 199, 197, 0.1)); - border-color: var(--ink); - border-top: 4px solid var(--taste-berry); - transform: rotate(-1.05deg); - box-shadow: - inset 0 1px 0 rgba(255, 255, 255, 0.88), - 0 26px 58px rgba(6, 9, 16, 0.28); +.steps, +.trust-grid { + display: grid; + grid-template-columns: 1.15fr 0.95fr 0.95fr; + gap: 1rem; + margin-top: 2rem; } -.life-ledger .panel-kicker { - color: var(--taste-berry); +.steps article, +.trust-grid article { + padding: 1.15rem; + border: 1px solid rgba(16, 19, 23, 0.1); + border-radius: var(--radius); + background: rgba(255, 253, 248, 0.68); } -.ledger-note { - margin: 0.58rem 0 0.62rem; - color: var(--steel); - font-size: 1.13rem; - font-weight: 880; +.steps span { + display: block; + color: var(--apatite-700); + font-family: var(--font-mono); + font-size: 0.82rem; + font-weight: 820; } -.ledger-status-grid { - position: relative; - z-index: 1; - display: grid; - grid-template-columns: 4.9rem 1fr; - gap: 0.24rem 0.64rem; - margin-bottom: 0.72rem; - padding: 0.62rem 0.72rem; - border: 1px solid rgba(168, 148, 120, 0.34); - border-radius: var(--radius); - background: - linear-gradient(90deg, rgba(47, 142, 134, 0.08), transparent 44%, rgba(217, 167, 47, 0.09)), - rgba(255, 253, 246, 0.62); +.steps h3, +.trust-grid h3 { + margin: 0.55rem 0 0.4rem; + font-size: var(--step-0); + line-height: 1.2; } -.ledger-status-grid span, -.ledger-close span { +.steps p, +.trust-grid p { + margin: 0; color: var(--muted); - font-size: 0.64rem; - font-weight: 840; - letter-spacing: 0.14em; - text-transform: uppercase; + text-wrap: pretty; } -.ledger-status-grid strong { - color: var(--ink); - font-size: 0.82rem; - line-height: 1.25; +.split { + display: grid; + grid-template-columns: minmax(0, 0.92fr) minmax(280px, 0.68fr); + gap: 3.5rem; + align-items: start; + border-top: 1px solid rgba(16, 19, 23, 0.1); + border-bottom: 1px solid rgba(16, 19, 23, 0.1); } -.ledger-list { - position: relative; - z-index: 1; +.fit-list { display: grid; - gap: 0.36rem; + gap: 0.65rem; margin: 0; padding: 0; list-style: none; } -.ledger-list li { - display: flex; - align-items: center; - gap: 0.52rem; - color: var(--ink-soft); - font-size: 0.88rem; - font-weight: 820; +.fit-list li { + padding: 0.85rem 1rem; + border: 1px solid var(--line); + border-radius: var(--radius); + background: rgba(255, 253, 248, 0.7); + font-weight: 760; } -.ledger-close { - position: relative; - z-index: 1; - display: grid; - gap: 0.18rem; - margin-top: 0.68rem; - padding-top: 0.66rem; - border-top: 1px solid rgba(168, 148, 120, 0.36); +.trust { + padding-bottom: 5.5rem; } -.ledger-close strong { - color: var(--ink); - font-family: var(--editorial); - font-size: 1.15rem; - font-weight: 560; - line-height: 1.08; +.site-footer { + display: flex; + justify-content: space-between; + gap: 1rem; + padding: 1.3rem max(1rem, calc((100vw - 1120px) / 2)); + border-top: 1px solid rgba(16, 19, 23, 0.1); + color: var(--muted); } -.ledger-list li::before { - content: ""; - width: 0.42rem; - height: 0.42rem; - flex: 0 0 auto; - border-radius: 50%; - background: var(--taste-berry); - box-shadow: 0 0 0 5px rgba(159, 54, 95, 0.1); +.site-footer a { + color: var(--apatite-900); + font-weight: 780; } -.state-meter { - left: 6.1%; - bottom: 5.5%; - width: 8.8rem; - transform: rotate(0.65deg); - border-top: 3px solid var(--taste-saffron); -} +@media (max-width: 820px) { + :root { + --step-4: 2.15rem; + --step-5: 2.75rem; + } -.meter-track { - height: 0.5rem; - margin: 0.9rem 0; - border-radius: 999px; - background: rgba(168, 148, 120, 0.24); - overflow: hidden; -} + .nav-toggle { + display: block; + } -.meter-track span { - display: block; - width: 58%; - height: 100%; - background: linear-gradient(90deg, var(--taste-teal), var(--taste-lichen), var(--taste-saffron), var(--taste-clay)); -} + .nav-links { + position: absolute; + top: calc(100% + 0.4rem); + right: 1rem; + display: none; + width: min(18rem, calc(100vw - 2rem)); + padding: 0.5rem; + border: 1px solid var(--line); + border-radius: var(--radius); + background: var(--surface); + box-shadow: var(--shadow-paper); + } -.state-meter p { - margin: 0; - color: var(--ink-soft); - font-weight: 720; -} + .nav-open .nav-links { + display: grid; + } -.eyebrow { - width: fit-content; - max-width: 100%; - margin: 0 0 1rem; - padding: 0.34rem 0.52rem; - border: 1px solid rgba(6, 9, 16, 0.18); - border-radius: 999px; - background: rgba(255, 250, 242, 0.78); - color: var(--start-deep); - overflow-wrap: anywhere; -} + .nav-links a { + border-radius: var(--radius); + } -h1, -h2, -h3, -p { - letter-spacing: 0; -} + .hero, + .split, + .steps, + .trust-grid { + grid-template-columns: 1fr; + } -h1 { - margin: 0; - max-width: 12.2ch; - font-family: var(--editorial); - font-size: 4.82rem; - font-weight: 560; - line-height: 0.985; - padding-bottom: 0.12em; - text-wrap: balance; + .hero { + min-height: auto; + gap: 2rem; + padding: 3.5rem 0 2.8rem; + } } -.hero-deck { - max-width: 38.5rem; - margin: 1.32rem 0 0; - color: var(--ink-soft); - font-size: 1.08rem; - line-height: 1.66; -} +@media (max-width: 520px) { + :root { + --step-4: 1.9rem; + --step-5: 2.05rem; + } -.hero-life-rail { - display: flex; - flex-wrap: wrap; - gap: 0.48rem; - margin-top: 1.15rem; -} + .hero { + gap: 1.1rem; + padding: 2rem 0 0.75rem; + } -.hero-life-rail span { - padding: 0.46rem 0.64rem; - border: 1px solid rgba(6, 9, 16, 0.2); - border-radius: 999px; - background: rgba(255, 250, 242, 0.72); - color: var(--muted-strong); - font-size: 0.76rem; - font-weight: 820; - box-shadow: - inset 0 -2px 0 rgba(217, 167, 47, 0.16), - 0 6px 16px rgba(36, 33, 31, 0.05); -} + .hero-copy p { + margin-top: 1rem; + line-height: 1.38; + } -.mobile-check-panel { - display: none; -} + .hero-actions { + gap: 0.65rem; + margin-top: 1.1rem; + } -.hero-actions, -.inline-actions { - display: flex; - flex-wrap: wrap; - gap: 0.72rem; -} + .button { + min-height: 2.55rem; + padding: 0.75rem 1rem; + } -.demo-preview { - display: grid; - gap: 0.55rem; - margin-top: 1.35rem; - border: 1px solid rgba(6, 9, 16, 0.16); - border-left: 5px solid var(--taste-cyan); - border-radius: var(--radius); - background: rgba(255, 253, 246, 0.74); - padding: 0.9rem 1rem; - box-shadow: 0 12px 28px rgba(36, 33, 31, 0.07); -} - -.demo-preview span { - color: var(--taste-teal); - font-size: 0.76rem; - font-weight: 860; - letter-spacing: 0.08em; - text-transform: uppercase; -} - -.demo-preview ol { - display: grid; - gap: 0.32rem; - margin: 0; - padding-left: 1.2rem; - color: var(--ink); - font-weight: 720; -} - -.demo-preview p { - margin: 0; - color: var(--muted-strong); - font-size: 0.9rem; -} - -.hero-actions { - margin-top: 2rem; -} - -.inline-actions { - margin-top: 1.4rem; -} - -.action { - --button-bg: rgba(255, 253, 246, 0.76); - --button-fg: var(--ink); - position: relative; - display: inline-flex; - align-items: center; - gap: 0.7rem; - min-height: 3.05rem; - padding: 0.58rem 0.68rem 0.58rem 1.08rem; - border: 1px solid rgba(6, 9, 16, 0.24); - border-radius: 999px; - background: var(--button-bg); - color: var(--button-fg); - box-shadow: - inset 0 1px 0 rgba(255, 255, 255, 0.78), - 0 12px 28px rgba(36, 33, 31, 0.08); - font-weight: 820; - transition: - border-color var(--motion-soft) var(--ease-out), - background var(--motion-soft) var(--ease-out), - color var(--motion-soft) var(--ease-out), - box-shadow var(--motion-soft) var(--ease-out); -} - -.action.primary { - --button-bg: var(--ink); - --button-fg: var(--surface); - border-color: rgba(6, 9, 16, 0.9); - box-shadow: - inset 0 1px 0 rgba(255, 255, 255, 0.16), - 0 18px 42px rgba(36, 33, 31, 0.2); -} - -.action.secondary { - --button-bg: rgba(255, 253, 246, 0.78); -} - -.action:hover { - border-color: rgba(6, 9, 16, 0.42); - box-shadow: - inset 0 1px 0 rgba(255, 255, 255, 0.78), - 0 18px 40px rgba(36, 33, 31, 0.12); -} - -.action .icon, -.copy-control .icon { - width: 1.85rem; - height: 1.85rem; - display: inline-flex; - position: relative; - align-items: center; - justify-content: center; - flex: 0 0 auto; - order: 2; - border-radius: 50%; - background: rgba(8, 7, 5, 0.07); - transition: background var(--motion-fast) var(--ease-out); -} - -.action.primary .icon { - background: rgba(255, 253, 246, 0.15); -} - -.action:hover .icon, -.copy-control:hover .icon { - background: rgba(8, 7, 5, 0.1); -} - -.icon-path::before, -.icon-path::after, -.icon-source::before, -.icon-source::after, -.icon-copy::before, -.icon-copy::after { - content: ""; - position: absolute; - border: 1.4px solid currentColor; -} - -.icon-path::before { - width: 0.56rem; - height: 0.56rem; - border-radius: 50%; -} - -.icon-path::after { - width: 0.38rem; - height: 0.38rem; - right: 0.42rem; - top: 0.42rem; - border-left: 0; - border-bottom: 0; -} - -.icon-source::before { - left: 0.46rem; - right: 0.46rem; - bottom: 0.5rem; - height: 0.56rem; - border-radius: 3px; -} - -.icon-source::after { - left: 0.52rem; - top: 0.48rem; - width: 0.44rem; - height: 0.24rem; - border-bottom: 0; - border-radius: 3px 3px 0 0; -} - -.icon-copy::before { - inset: 0.64rem 0.52rem 0.46rem 0.66rem; - border-radius: 3px; -} - -.icon-copy::after { - inset: 0.48rem 0.66rem 0.62rem 0.5rem; - border-radius: 3px; -} - -.check-strip { - position: relative; - z-index: 2; - width: var(--wrap); - display: grid; - grid-template-columns: 0.92fr 1.35fr 1fr; - gap: 0.55rem; - margin: -2.65rem auto 0; - padding: 0.48rem; - border: 2px solid var(--ink); - border-radius: var(--radius); - background: - linear-gradient(90deg, var(--steel), var(--ink) 46%, #07101c), - repeating-linear-gradient(90deg, transparent 0 46px, rgba(255, 245, 220, 0.09) 46px 47px, transparent 47px 92px); - box-shadow: 0 20px 50px rgba(36, 33, 31, 0.18); -} - -.check-strip div { - min-height: 6rem; - padding: 1rem; - border: 1px solid rgba(255, 245, 220, 0.42); - border-radius: 5px; - background: - linear-gradient(180deg, rgba(255, 250, 242, 0.97), rgba(255, 245, 220, 0.86)); -} - -.check-strip div:nth-child(1) { - box-shadow: inset 0 5px 0 var(--taste-cyan); -} - -.check-strip div:nth-child(2) { - box-shadow: inset 0 5px 0 var(--taste-saffron); -} - -.check-strip div:nth-child(3) { - box-shadow: inset 0 5px 0 var(--taste-berry); -} - -.check-strip strong { - display: block; - margin-top: 0.45rem; - color: var(--ink); - font-size: 1rem; - line-height: 1.28; -} - -.review-deck { - width: var(--wrap); - margin: 1rem auto 0; - scroll-margin-top: 5.7rem; -} - -.review-deck-shell { - --deck-height: clamp(680px, 90dvh, 820px); - display: grid; - grid-template-columns: minmax(15rem, 0.36fr) minmax(0, 1fr); - grid-template-rows: auto minmax(0, 1fr); - grid-template-areas: - "intro panels" - "nav panels"; - gap: 0.9rem; - align-items: stretch; - height: var(--deck-height); - min-height: 0; -} - -.review-deck-intro { - grid-area: intro; - padding: 1rem; - border: 1px solid rgba(6, 9, 16, 0.16); - border-radius: var(--radius); - background: - linear-gradient(180deg, rgba(255, 253, 246, 0.86), rgba(255, 248, 236, 0.7)); - box-shadow: - inset 0 1px 0 rgba(255, 255, 255, 0.78), - 0 12px 28px rgba(71, 51, 30, 0.08); -} - -.review-deck-intro h2 { - margin: 0; - max-width: 11ch; - font-family: var(--editorial); - font-size: 3.05rem; - font-weight: 560; - line-height: 1.02; - text-wrap: balance; -} - -.review-deck-intro p:not(.eyebrow) { - margin: 1rem 0 0; - color: var(--ink-soft); - line-height: 1.58; -} - -.review-deck-nav { - grid-area: nav; - display: grid; - align-self: stretch; - min-height: 0; - gap: 0.38rem; - max-height: none; - overflow: auto; - padding: 0.35rem; - border: 1px solid rgba(6, 9, 16, 0.14); - border-radius: var(--radius); - background: rgba(255, 250, 242, 0.66); -} - -.review-deck-nav a { - display: grid; - gap: 0.16rem; - min-height: 4rem; - padding: 0.72rem 0.82rem; - border: 1px solid rgba(168, 148, 120, 0.32); - border-radius: 6px; - background: - linear-gradient(180deg, rgba(255, 253, 246, 0.72), rgba(255, 248, 236, 0.58)); - transition: - background var(--motion-fast) var(--ease-out), - border-color var(--motion-fast) var(--ease-out), - box-shadow var(--motion-fast) var(--ease-out); -} - -.review-deck-nav a:hover { - border-color: rgba(47, 142, 134, 0.38); - background: rgba(255, 253, 246, 0.92); -} - -.review-deck-nav a.is-active { - border-color: rgba(6, 9, 16, 0.54); - background: - linear-gradient(135deg, rgba(6, 67, 74, 0.96), rgba(6, 9, 16, 0.94)); - box-shadow: - inset 4px 0 0 var(--taste-saffron), - 0 14px 28px rgba(6, 9, 16, 0.12); -} - -.review-deck-nav span { - color: var(--start-deep); - font-size: 0.66rem; - font-weight: 860; - letter-spacing: 0.13em; - text-transform: uppercase; -} - -.review-deck-nav strong { - color: var(--ink); - font-size: 0.92rem; - line-height: 1.18; -} - -.review-deck-nav a.is-active span, -.review-deck-nav a.is-active strong { - color: var(--cream-line); -} - -.review-deck-panels { - grid-area: panels; - align-self: stretch; - min-height: 0; - max-height: none; - height: 100%; - overflow: auto; - border: 1px solid rgba(6, 9, 16, 0.18); - border-radius: var(--radius); - background: - linear-gradient(90deg, rgba(255, 245, 220, 0.04) 0 1px, transparent 1px 6.5rem), - linear-gradient(180deg, rgba(255, 253, 246, 0.9), rgba(255, 248, 236, 0.76)); - box-shadow: - inset 0 1px 0 rgba(255, 255, 255, 0.8), - 0 24px 58px rgba(71, 51, 30, 0.12); - overscroll-behavior: contain; -} - -.js .review-panel { - display: none; -} - -.js .review-panel.is-active { - display: block; -} - -.review-deck .review-panel { - box-sizing: border-box; - min-height: 100%; - padding: 1.35rem; - border: 0; - background: transparent; - scroll-margin-top: 5.7rem; -} - -.review-deck .review-panel::before, -.review-deck .review-panel::after { - display: none; -} - -.review-deck .section-heading, -.review-deck .submission-copy { - width: min(640px, 100%); - margin: 0 0 1.45rem; -} - -.review-deck .section-heading h2 { - font-size: 2.72rem; -} - -.review-deck .demo-shell, -.review-deck .console-layout, -.review-deck .console-output, -.review-deck .file-map, -.review-deck .behavior-grid, -.review-deck .reviewer-layout, -.review-deck .checkgate-layout, -.review-deck .coldrun-layout, -.review-deck .admin-rhythm-layout, -.review-deck .brief-layout, -.review-deck .quality-layout, -.review-deck .thesis-layout, -.review-deck .handoff-layout, -.review-deck .setup-layout, -.review-deck .notes-grid { - width: 100%; -} - -.review-deck .setup-layout, -.review-deck .checkgate-layout { - grid-template-columns: 1fr; - gap: 1.1rem; -} - -.review-deck .scope-layout { - width: 100%; - margin: 0; -} - -.review-deck .note-list, -.review-deck .cold-prompt-strip, -.review-deck .release-check-links { - grid-template-columns: 1fr; -} - -.review-deck .setup-path-list article, -.review-deck .release-command-list article { - grid-template-columns: 1fr; -} - -.review-deck .setup-path-list .pane-label, -.review-deck .release-command-list .pane-label { - grid-row: auto; -} - -.nav-links a.is-active { - background: rgba(47, 142, 134, 0.12); - color: var(--ink); -} - -.section, -.submission-section { - position: relative; - padding: 7.5rem 1.5rem; - scroll-margin-top: 6.5rem; -} - -.section:nth-of-type(even) { - background: - linear-gradient(180deg, rgba(255, 253, 246, 0.58), rgba(251, 241, 223, 0.42)); -} - -.scope-section { - padding-top: 6.2rem; - background: - linear-gradient(180deg, rgba(255, 253, 246, 0.64), rgba(255, 248, 236, 0.36)), - repeating-linear-gradient(90deg, rgba(6, 9, 16, 0.018) 0 1px, transparent 1px 110px); -} - -.section-heading, -.submission-copy { - width: min(760px, 100%); - margin: 0 auto 2.5rem; -} - -.section-heading.compact { - width: min(620px, 100%); - margin-left: 0; -} - -.section-heading h2, -.submission-copy h2 { - margin: 0; - max-width: 15ch; - font-family: var(--editorial); - font-size: 3.05rem; - font-weight: 560; - line-height: 1.02; - padding-bottom: 0.1em; -} - -.submission-copy h2 { - font-family: var(--editorial); - font-weight: 560; - line-height: 1.04; -} - -.section-heading p:not(.eyebrow), -.submission-copy p { - color: var(--ink-soft); - font-size: 1.08rem; - line-height: 1.7; -} - -.demo-shell, -.console-layout, -.console-output, -.file-map, -.behavior-grid, -.reviewer-layout, -.checkgate-layout, -.coldrun-layout, -.admin-rhythm-layout, -.brief-layout, -.quality-layout, -.thesis-layout, -.handoff-layout, -.setup-layout, -.submission-copy { - width: var(--wrap); - margin: 0 auto; -} - -.coldrun-section, -.admin-rhythm-section, -.quality-section, -.checkgate-section { - border-top: 1px solid rgba(168, 148, 120, 0.26); - border-bottom: 1px solid rgba(168, 148, 120, 0.26); -} - -.coldrun-layout, -.admin-rhythm-layout, -.brief-layout, -.quality-layout, -.thesis-layout, -.handoff-layout, -.setup-layout, -.console-layout, -.checkgate-layout, -.reviewer-layout { - display: grid; - grid-template-columns: 0.76fr 1.24fr; - gap: 3.5rem; - align-items: start; -} - -.scope-layout { - width: var(--wrap); - display: grid; - grid-template-columns: minmax(0, 0.72fr) minmax(34rem, 1.28fr); - gap: 3.2rem; - align-items: center; - margin: 0 auto; -} - -.scope-board { - position: relative; - min-height: 34rem; - padding: 1rem; - border: 2px solid var(--ink); - border-radius: var(--radius); - background: - linear-gradient(90deg, rgba(255, 245, 220, 0.048) 0 1px, transparent 1px 5.2rem), - linear-gradient(135deg, rgba(6, 9, 16, 0.98), rgba(6, 67, 74, 0.96) 58%, rgba(7, 16, 28, 0.98)), - repeating-linear-gradient(90deg, transparent 0 48px, rgba(255, 245, 220, 0.08) 48px 49px, transparent 49px 96px); - box-shadow: - inset 0 1px 0 rgba(255, 245, 220, 0.18), - inset 0 0 0 0.52rem rgba(255, 245, 220, 0.075), - 0 32px 84px rgba(6, 9, 16, 0.24); - overflow: hidden; -} - -.scope-board::before { - content: ""; - position: absolute; - inset: 0.72rem; - border: 1px solid rgba(255, 245, 220, 0.44); - border-radius: 5px; - pointer-events: none; - z-index: 3; -} - -.scope-board::after { - content: ""; - position: absolute; - left: -7%; - right: -5%; - top: 48%; - height: 4.2rem; - border: 2px solid var(--ink); - border-radius: var(--radius); - background: - linear-gradient(90deg, var(--taste-berry) 0 13%, var(--taste-clay) 13% 27%, var(--taste-saffron) 27% 44%, var(--taste-lichen) 44% 58%, var(--taste-cyan) 58% 77%, var(--taste-teal) 77% 100%); - box-shadow: - inset 0 0 0 2px rgba(255, 245, 220, 0.66), - 0 20px 46px rgba(6, 9, 16, 0.24); - transform: rotate(-7deg); - opacity: 0.38; -} - -.scope-core { - position: relative; - z-index: 2; - width: min(28rem, 100%); - margin: 0 0 1rem auto; - padding: 1.3rem; - border: 1px solid rgba(6, 9, 16, 0.78); - border-top: 5px solid var(--taste-saffron); - border-radius: var(--radius); - background: - linear-gradient(180deg, rgba(255, 250, 242, 0.985), rgba(255, 245, 220, 0.9)); - box-shadow: - inset 0 1px 0 rgba(255, 255, 255, 0.82), - 0 24px 52px rgba(6, 9, 16, 0.22); -} - -.scope-core strong { - display: block; - margin-top: 0.72rem; - color: var(--ink); - font-size: 1.34rem; - line-height: 1.16; -} - -.scope-core p { - margin: 0.72rem 0 0; - color: var(--ink-soft); -} - -.scope-lanes { - position: relative; - z-index: 2; - display: grid; - gap: 0.62rem; - margin: 0; - padding: 0; - list-style: none; -} - -.scope-lanes li { - display: grid; - grid-template-columns: 0.72rem minmax(0, 1fr) auto; - gap: 0.9rem; - align-items: center; - min-height: 4.85rem; - padding: 0.88rem 1rem; - border: 1px solid rgba(255, 245, 220, 0.3); - border-radius: var(--radius); - background: - linear-gradient(180deg, rgba(6, 67, 74, 0.76), rgba(7, 16, 28, 0.68)); - color: var(--cream-line); - box-shadow: inset 0 1px 0 rgba(255, 245, 220, 0.12); -} - -.scope-signal { - width: 0.72rem; - height: 0.72rem; - border-radius: 50%; - box-shadow: 0 0 0 0.36rem rgba(255, 245, 220, 0.08); -} - -.signal-body { - background: var(--taste-lichen); -} - -.signal-admin { - background: var(--taste-cyan); -} - -.signal-message { - background: var(--taste-berry); -} - -.signal-home { - background: var(--taste-clay); -} - -.signal-capture { - background: var(--taste-saffron); -} - -.scope-lanes strong { - display: block; - color: var(--cream-line); - font-size: 1rem; - line-height: 1.15; -} - -.scope-lanes p { - margin: 0.24rem 0 0; - color: rgba(255, 245, 220, 0.76); - line-height: 1.36; -} - -.scope-lanes small { - justify-self: end; - width: max-content; - max-width: 10.8rem; - padding: 0.38rem 0.5rem; - border: 1px solid rgba(255, 245, 220, 0.26); - border-radius: 999px; - color: rgba(255, 245, 220, 0.84); - font-size: 0.7rem; - font-weight: 780; - letter-spacing: 0.08em; - text-transform: uppercase; -} - -.admin-rhythm-section { - background: - linear-gradient(180deg, rgba(255, 248, 236, 0.32), rgba(255, 253, 246, 0.7)), - repeating-linear-gradient(135deg, rgba(6, 9, 16, 0.018) 0 1px, transparent 1px 66px); -} - -.admin-rhythm-board { - position: relative; - display: grid; - grid-template-columns: 1fr 1fr; - gap: 0.78rem; - min-height: 38rem; - padding: 1rem; - border: 2px solid var(--ink); - border-radius: var(--radius); - background: - linear-gradient(145deg, rgba(255, 250, 242, 0.98), rgba(234, 220, 198, 0.82)), - repeating-linear-gradient(90deg, rgba(6, 9, 16, 0.024) 0 1px, transparent 1px 84px); - box-shadow: - inset 0 1px 0 rgba(255, 255, 255, 0.86), - inset 0 0 0 0.52rem rgba(255, 245, 220, 0.56), - 0 30px 84px rgba(36, 33, 31, 0.14); - overflow: hidden; -} - -.admin-rhythm-board::after { - content: ""; - position: absolute; - inset: 0.72rem; - border: 1px solid rgba(6, 9, 16, 0.1); - border-radius: 5px; - pointer-events: none; -} - -.admin-rhythm-board::before { - content: ""; - position: absolute; - inset: 1.2rem 0.8rem auto; - height: 5.2rem; - border: 2px solid var(--ink); - border-radius: var(--radius); - background: - linear-gradient(90deg, var(--taste-teal) 0 18%, var(--taste-cyan) 18% 35%, var(--taste-lichen) 35% 51%, var(--taste-saffron) 51% 68%, var(--taste-clay) 68% 84%, var(--taste-berry) 84% 100%); - box-shadow: - inset 0 0 0 2px rgba(255, 245, 220, 0.72), - 0 18px 42px rgba(6, 9, 16, 0.12); - transform: rotate(-2.5deg); - opacity: 0.72; -} - -.admin-rhythm-visual { - position: relative; - z-index: 1; - grid-column: 1 / -1; - min-height: 18rem; - margin: 0; - padding: 0.52rem; - border: 1px solid rgba(6, 9, 16, 0.82); - border-radius: var(--radius); - background: - linear-gradient(145deg, rgba(6, 9, 16, 0.96), rgba(6, 67, 74, 0.93)), - repeating-linear-gradient(90deg, transparent 0 44px, rgba(255, 245, 220, 0.055) 44px 45px, transparent 45px 88px); - box-shadow: - inset 0 1px 0 rgba(255, 245, 220, 0.15), - inset 0 0 0 0.34rem rgba(255, 245, 220, 0.08), - 0 24px 58px rgba(6, 9, 16, 0.18); - overflow: hidden; -} - -.admin-rhythm-visual::before { - content: ""; - position: absolute; - inset: 0.88rem; - z-index: 2; - border: 1px solid rgba(255, 245, 220, 0.58); - border-radius: 5px; - pointer-events: none; -} - -.admin-rhythm-visual::after { - content: ""; - position: absolute; - left: 0.52rem; - right: 0.52rem; - bottom: 0.52rem; - z-index: 2; - height: 0.54rem; - border-top: 1px solid rgba(6, 9, 16, 0.7); - background: - linear-gradient(90deg, var(--taste-teal) 0 18%, var(--taste-cyan) 18% 34%, var(--taste-lichen) 34% 50%, var(--taste-saffron) 50% 66%, var(--taste-clay) 66% 82%, var(--taste-berry) 82% 100%); - pointer-events: none; -} - -.admin-rhythm-visual img { - display: block; - width: 100%; - height: min(32vw, 24rem); - min-height: 17rem; - object-fit: cover; - object-position: center; - border: 1px solid rgba(255, 245, 220, 0.52); - border-radius: 5px; - filter: saturate(1.08) contrast(1.03); -} - -.admin-rhythm-card, -.admin-boundary { - position: relative; - z-index: 1; - min-height: 14.8rem; - display: grid; - align-content: space-between; - gap: 1rem; - padding: 1.25rem; - border: 1px solid rgba(6, 9, 16, 0.18); - border-radius: var(--radius); - background: - linear-gradient(90deg, rgba(47, 142, 134, 0.04), transparent 32%, rgba(217, 167, 47, 0.05)), - linear-gradient(180deg, rgba(255, 253, 246, 0.96), rgba(248, 243, 235, 0.86)); - box-shadow: - inset 0 1px 0 rgba(255, 255, 255, 0.82), - 0 16px 42px rgba(36, 33, 31, 0.08); - overflow: hidden; -} - -.admin-rhythm-card::before, -.admin-boundary::before { - content: ""; - position: absolute; - inset: 0.36rem; - border: 1px solid rgba(255, 245, 220, 0.78); - border-radius: 5px; - pointer-events: none; -} - -.admin-rhythm-card:nth-child(2) { - border-top: 5px solid var(--taste-cyan); -} - -.admin-rhythm-card:nth-child(3) { - border-top: 5px solid var(--taste-saffron); - transform: translateY(1.4rem); -} - -.admin-rhythm-card:nth-child(4) { - border-top: 5px solid var(--taste-clay); - transform: translateY(-0.4rem); -} - -.admin-rhythm-card strong, -.admin-boundary strong { - display: block; - max-width: 24rem; - color: var(--ink); - font-size: 1.34rem; - line-height: 1.13; -} - -.admin-rhythm-card p, -.admin-boundary p { - margin: 0; - color: var(--ink-soft); - line-height: 1.52; -} - -.admin-boundary { - grid-row: span 2; - color: var(--cream-line); - border-color: rgba(6, 9, 16, 0.82); - background: - linear-gradient(145deg, rgba(6, 67, 74, 0.98), rgba(6, 9, 16, 0.96)), - repeating-linear-gradient(135deg, transparent 0 40px, rgba(255, 245, 220, 0.05) 40px 41px, transparent 41px 82px); - box-shadow: - inset 0 1px 0 rgba(255, 245, 220, 0.14), - inset 0 0 0 0.44rem rgba(255, 245, 220, 0.08), - 0 24px 60px rgba(6, 9, 16, 0.2); -} - -.admin-boundary span { - color: rgba(255, 245, 220, 0.74); - font-size: 0.68rem; - font-weight: 780; - letter-spacing: 0.16em; - text-transform: uppercase; -} - -.admin-boundary strong { - color: var(--cream-line); - font-family: var(--editorial); - font-size: 2.34rem; - font-weight: 560; - line-height: 1.02; -} - -.admin-boundary p { - color: rgba(255, 245, 220, 0.8); -} - -.coldrun-steps, -.brief-board, -.quality-board, -.thesis-points, -.setup-board, -.comparison-grid, -.console-output, -.file-map, -.behavior-grid, -.notes-grid, -.checkgate-board { - display: grid; - gap: 0.75rem; -} - -.coldrun-steps { - grid-template-columns: 1.06fr 0.92fr 1fr; - list-style: none; - margin: 0; - padding: 0; -} - -.brief-board, -.quality-board, -.thesis-points, -.setup-board, -.checkgate-board { - grid-template-columns: repeat(2, minmax(0, 1fr)); -} - -.setup-board .start-prompt, -.quality-board .fail-card { - grid-column: 1 / -1; -} - -.coldrun-steps li, -.brief-board article, -.quality-board article, -.thesis-points article, -.setup-board article, -.response-pane, -.console-output article, -.file-node, -.behavior-grid article, -.notes-grid a, -.checkgate-board article, -.reviewer-steps li, -.handoff-figure, -.coach-console, -.slide-art, -.slide-grid article, -.terminal-card { - position: relative; - min-width: 0; - border: 1px solid rgba(6, 9, 16, 0.16); - border-radius: var(--radius); - background: - linear-gradient(180deg, rgba(255, 250, 242, 0.96), rgba(248, 243, 235, 0.84)); - box-shadow: - inset 0 1px 0 rgba(255, 255, 255, 0.78), - var(--shadow-tight); - overflow: hidden; -} - -.coldrun-steps li::before, -.brief-board article::before, -.quality-board article::before, -.thesis-points article::before, -.setup-board article::before, -.response-pane::before, -.console-output article::before, -.file-node::before, -.behavior-grid article::before, -.notes-grid a::before, -.checkgate-board article::before, -.reviewer-steps li::before { - content: ""; - position: absolute; - inset: 0.36rem; - border: 1px solid rgba(255, 245, 220, 0.74); - border-radius: 5px; - pointer-events: none; -} - -.coldrun-steps li::after, -.brief-board article::after, -.quality-board article::after, -.thesis-points article::after, -.setup-board article::after, -.response-pane::after, -.console-output article::after, -.file-node::after, -.behavior-grid article::after, -.notes-grid a::after, -.checkgate-board article::after { - content: ""; - position: absolute; - right: 0.72rem; - bottom: 0.72rem; - width: 1.2rem; - height: 1.2rem; - background: - linear-gradient(135deg, transparent 0 44%, rgba(6, 9, 16, 0.18) 44% 52%, transparent 52%), - linear-gradient(45deg, var(--taste-cyan) 0 28%, var(--taste-lichen) 28% 48%, var(--taste-saffron) 48% 66%, var(--taste-clay) 66% 82%, var(--taste-berry) 82% 100%); - clip-path: polygon(0 0, 100% 0, 100% 100%); - opacity: 0.72; - pointer-events: none; -} - -.coldrun-steps li, -.brief-board article, -.quality-board article, -.thesis-points article, -.setup-board article, -.console-output article, -.file-node, -.behavior-grid article, -.notes-grid a, -.checkgate-board article { - min-height: 13rem; - display: grid; - align-content: space-between; - gap: 1rem; - padding: 1.25rem; -} - -.coldrun-steps li:nth-child(1), -.brief-board article:nth-child(1), -.quality-board article:nth-child(1), -.thesis-points article:nth-child(1), -.setup-board article:nth-child(1), -.console-output article:nth-child(1), -.checkgate-board article:nth-child(1) { - border-top: 5px solid var(--taste-cyan); -} - -.coldrun-steps li:nth-child(2), -.brief-board article:nth-child(2), -.quality-board article:nth-child(2), -.thesis-points article:nth-child(2), -.setup-board article:nth-child(2), -.console-output article:nth-child(2), -.checkgate-board article:nth-child(2) { - border-top: 5px solid var(--taste-lichen); -} - -.coldrun-steps li:nth-child(3), -.brief-board article:nth-child(3), -.quality-board article:nth-child(3), -.thesis-points article:nth-child(3), -.setup-board article:nth-child(3), -.console-output article:nth-child(3), -.checkgate-board article:nth-child(3) { - border-top: 5px solid var(--taste-saffron); -} - -.brief-board article:nth-child(4), -.quality-board article:nth-child(4), -.setup-board article:nth-child(4), -.console-output article:nth-child(4), -.checkgate-board article:nth-child(4) { - border-top: 5px solid var(--taste-clay); -} - -.brief-board article:nth-child(5), -.setup-board article:nth-child(5), -.checkgate-board article:nth-child(5) { - border-top: 5px solid var(--magenta); - border-top: 5px solid var(--taste-berry); -} - -.coldrun-steps span, -.brief-board span, -.notes-grid span, -.notes-grid small { - color: var(--muted); - font-size: 0.68rem; - font-weight: 780; - letter-spacing: 0.16em; - text-transform: uppercase; -} - -.coldrun-steps strong, -.brief-board strong, -.quality-board strong, -.thesis-points strong, -.console-output strong, -.checkgate-board strong, -.notes-grid strong { - max-width: 24rem; - color: var(--ink); - font-size: 1.26rem; - line-height: 1.16; - overflow-wrap: anywhere; -} - -.coldrun-steps p, -.brief-board p, -.quality-board p, -.thesis-points p, -.setup-board p, -.console-output p, -.file-node p, -.behavior-grid p, -.checkgate-board p, -.reviewer-steps li, -.notes-grid small { - margin: 0; - color: var(--ink-soft); -} - -.brief-board a, -.setup-board a { - width: fit-content; - border-bottom: 1px solid rgba(125, 49, 37, 0.42); - color: var(--start-deep); - font-weight: 780; -} - -.quality-board .fail-card { - color: #fff8e8; - background: - linear-gradient(90deg, rgba(255, 245, 220, 0.07) 0 1px, transparent 1px 7rem), - linear-gradient(180deg, rgba(255, 245, 220, 0.045) 0 1px, transparent 1px 4.5rem), - radial-gradient(circle at 14% 0%, rgba(111, 199, 197, 0.18), transparent 34%), - linear-gradient(145deg, rgba(6, 67, 74, 0.98), rgba(7, 16, 28, 0.97) 72%, rgba(6, 9, 16, 0.98)); - border-color: rgba(255, 245, 220, 0.24); - border-top: 5px solid var(--magenta); - box-shadow: - inset 0 1px 0 rgba(255, 245, 220, 0.2), - var(--shadow-ink); -} - -.quality-board .fail-card strong { - color: #fffdf6; -} - -.quality-board .fail-card .pane-label, -.quality-board .fail-card p { - color: rgba(255, 248, 232, 0.84); -} - -.checkgate-board code, -.setup-board code { - font-family: "JetBrains Mono", "SFMono-Regular", Consolas, monospace; - font-size: 0.9em; -} - -.handoff-figure { - min-height: 24rem; - display: grid; - place-items: center; - padding: 1rem; - background: - linear-gradient(145deg, rgba(255, 250, 242, 0.94), rgba(234, 220, 198, 0.76)); -} - -.handoff-figure img { - display: block; - width: min(100%, 33rem); - height: auto; - filter: drop-shadow(0 20px 35px rgba(71, 51, 30, 0.12)); -} - -.setup-board pre, -.terminal-card pre { - margin: 0.9rem 0 0; - padding: 1rem; - border: 1px solid rgba(168, 148, 120, 0.28); - border-radius: var(--radius); - background: rgba(255, 253, 246, 0.58); - overflow-wrap: anywhere; - white-space: pre-wrap; -} - -.setup-flow, -.checkgate-summary { - grid-template-columns: 1fr; -} - -.setup-flow article, -.checkgate-summary article { - min-height: 0; -} - -.setup-flow article::before, -.setup-flow article::after, -.checkgate-summary article::before, -.checkgate-summary article::after { - display: none; -} - -.setup-primary, -.release-status, -.coverage-note { - border-top: 5px solid var(--taste-cyan); -} - -.setup-path-list, -.cold-prompt-strip, -.release-command-list, -.release-check-links { - display: grid; - gap: 0.62rem; -} - -.setup-path-list article, -.cold-prompt-strip article, -.release-command-list article { - min-height: 0; - padding: 0.95rem; -} - -.setup-path-list article { - grid-template-columns: minmax(8.5rem, 0.28fr) minmax(0, 1fr); - align-items: start; -} - -.setup-path-list .pane-label { - grid-row: span 2; -} - -.cold-prompt-strip { - grid-template-columns: repeat(2, minmax(0, 1fr)); -} - -.setup-note { - border-top: 5px solid var(--taste-saffron); -} - -.release-command-list article { - display: grid; - grid-template-columns: minmax(8rem, 0.28fr) minmax(0, 1fr); - gap: 0.3rem 0.85rem; - align-content: start; -} - -.release-command-list .pane-label { - grid-row: span 2; -} - -.release-command-list code, -.release-check-links code { - overflow-wrap: anywhere; - word-break: break-word; -} - -.release-check-links { - grid-template-columns: repeat(2, minmax(0, 1fr)); -} - -.release-check-links a { - padding: 0.78rem 0.85rem; - border: 1px solid rgba(6, 9, 16, 0.12); - border-radius: 7px; - background: rgba(255, 253, 246, 0.66); - color: var(--start-deep); - font-size: 0.84rem; - font-weight: 800; - line-height: 1.34; - text-decoration: none; -} - -.prompt-card-head { - display: flex; - align-items: center; - justify-content: space-between; - gap: 1rem; -} - -.copy-control { - display: inline-flex; - align-items: center; - gap: 0.45rem; - min-height: 2.6rem; - padding: 0.36rem 0.5rem 0.36rem 0.8rem; - border: 1px solid rgba(168, 148, 120, 0.36); - border-radius: 999px; - background: rgba(255, 253, 246, 0.76); - cursor: pointer; - font-weight: 760; - transition: - background var(--motion-fast) var(--ease-out), - border-color var(--motion-fast) var(--ease-out); -} - -.copy-control:hover, -.copy-control.copied { - border-color: rgba(44, 123, 115, 0.46); - background: rgba(126, 203, 208, 0.15); -} - -.demo-shell { - display: grid; - gap: 1rem; -} - -.prompt-rail { - display: flex; - gap: 0.5rem; - padding: 0.42rem; - border: 1px solid rgba(6, 9, 16, 0.16); - border-radius: var(--radius); - background: rgba(255, 250, 242, 0.64); - overflow-x: auto; -} - -.prompt-tab, -.sample-chip { - border: 1px solid rgba(6, 9, 16, 0.18); - border-radius: 999px; - background: rgba(255, 253, 246, 0.72); - color: var(--muted-strong); - cursor: pointer; - font-weight: 760; - white-space: nowrap; - transition: - color var(--motion-fast) var(--ease-out), - background var(--motion-fast) var(--ease-out), - border-color var(--motion-fast) var(--ease-out); -} - -.prompt-tab { - padding: 0.72rem 0.95rem; -} - -.sample-chip { - padding: 0.62rem 0.82rem; -} - -.prompt-tab:hover, -.prompt-tab.active, -.sample-chip:hover { - border-color: rgba(6, 9, 16, 0.32); - background: var(--ink); - color: var(--surface); -} - -.comparison-grid { - grid-template-columns: 0.86fr 1fr 1.18fr; - grid-template-areas: "user generic unstuck"; -} - -.response-pane { - min-height: 18rem; - display: grid; - align-content: space-between; - gap: 1.1rem; - padding: 1.35rem; -} - -.user-pane { - grid-area: user; -} - -.generic-pane { - grid-area: generic; -} - -.unstuck-pane { - grid-area: unstuck; - color: var(--cream-line); - background: - linear-gradient(145deg, rgba(6, 67, 74, 0.98), rgba(6, 9, 16, 0.96)); - border-color: rgba(23, 63, 62, 0.48); -} - -.unstuck-pane .pane-label, -.unstuck-pane p { - color: rgba(255, 245, 220, 0.82); -} - -.response-pane p { - margin: 0; - font-size: 1.16rem; - line-height: 1.56; -} - -.console-section { - border-top: 1px solid rgba(168, 148, 120, 0.26); -} - -.coach-console { - display: grid; - gap: 1rem; - padding: 1.2rem; -} - -.input-field { - display: grid; - gap: 0.55rem; -} - -.input-field label { - color: var(--muted); - font-size: 0.74rem; - font-weight: 780; - letter-spacing: 0.16em; - text-transform: uppercase; -} - -.input-field textarea { - width: 100%; - min-height: 9rem; - resize: vertical; - border: 1px solid rgba(168, 148, 120, 0.4); - border-radius: var(--radius); - background: rgba(255, 253, 246, 0.8); - color: var(--ink); - padding: 1rem; - outline: none; - transition: - border-color var(--motion-fast) var(--ease-out), - box-shadow var(--motion-fast) var(--ease-out), - background var(--motion-fast) var(--ease-out); -} - -.input-field textarea:focus { - border-color: rgba(44, 123, 115, 0.58); - background: var(--surface); - box-shadow: 0 0 0 5px rgba(126, 203, 208, 0.14); -} - -.input-field p { - margin: 0; - color: var(--muted); -} - -.sample-row { - display: flex; - flex-wrap: wrap; - gap: 0.55rem; -} - -.console-submit { - width: fit-content; -} - -.console-output { - grid-template-columns: repeat(4, 1fr); - margin-top: 1rem; -} - -.file-map { - grid-template-columns: repeat(5, 1fr); -} - -.file-node h3, -.behavior-grid h3 { - margin: 0; - color: var(--ink); - font-size: 1.04rem; -} - -.file-node:nth-child(2), -.file-node:nth-child(4) { - transform: translateY(1.8rem); -} - -.behavior-grid { - grid-template-columns: repeat(3, 1fr); -} - -.notes-section { - background: - linear-gradient(180deg, rgba(23, 63, 62, 0.05), rgba(255, 248, 236, 0.72)); -} - -.notes-grid { - width: var(--wrap); - margin: 0 auto; - grid-template-columns: repeat(4, minmax(0, 1fr)); -} - -.notes-grid a { - min-height: 12.5rem; - text-decoration: none; - transition: - border-color var(--motion-fast) var(--ease-out), - box-shadow var(--motion-fast) var(--ease-out); -} - -.notes-grid a:hover { - border-color: rgba(8, 7, 5, 0.28); - box-shadow: - inset 0 1px 0 rgba(255, 255, 255, 0.78), - 0 18px 42px rgba(71, 51, 30, 0.12); -} - -.note-reader { - grid-template-columns: 1fr; - gap: 0.82rem; -} - -.note-reader .note-feature, -.note-list a, -.note-compact-links { - min-height: 0; -} - -.note-reader .note-feature { - padding: 1.15rem; - border-top: 5px solid var(--taste-cyan); -} - -.note-reader .note-feature small { - max-width: 60ch; - font-size: 0.86rem; - line-height: 1.42; -} - -.note-list { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 0.72rem; -} - -.note-list a { - padding: 1rem; -} - -.note-compact-links { - display: flex; - flex-wrap: wrap; - gap: 0.48rem; - padding: 0.68rem; - border: 1px solid rgba(6, 9, 16, 0.12); - border-radius: var(--radius); - background: rgba(255, 253, 246, 0.62); -} - -.note-compact-links a { - min-height: 0; - padding: 0.48rem 0.62rem; - border-radius: 999px; - background: rgba(255, 250, 242, 0.86); - color: var(--start-deep); - font-size: 0.82rem; - font-weight: 820; - text-decoration: none; -} - -.note-more { - padding: 0.72rem; - border: 1px solid rgba(6, 9, 16, 0.12); - border-radius: var(--radius); - background: rgba(255, 253, 246, 0.54); -} - -.note-more summary { - cursor: pointer; - color: var(--start-deep); - font-size: 0.84rem; - font-weight: 840; -} - -.note-more .note-compact-links { - margin-top: 0.6rem; - padding: 0; - border: 0; - background: transparent; -} - -.note-reader a::before, -.note-reader a::after, -.note-compact-links::before, -.note-compact-links::after { - display: none; -} - -.reviewer-steps { - display: grid; - gap: 0.72rem; - list-style: none; - margin: 0; - padding: 0; - counter-reset: reviewer; -} - -.reviewer-steps li { - min-height: auto; - padding: 1rem 1rem 1rem 3.2rem; - counter-increment: reviewer; -} - -.reviewer-steps li::after { - content: counter(reviewer, decimal-leading-zero); - position: absolute; - left: 1rem; - top: 1rem; - color: var(--start-deep); - font-size: 0.72rem; - font-weight: 820; - letter-spacing: 0.12em; -} - -.submission-section { - overflow: hidden; - background: - linear-gradient(90deg, rgba(255, 245, 220, 0.045) 0 1px, transparent 1px 7rem), - linear-gradient(145deg, rgba(8, 7, 5, 0.96), rgba(23, 63, 62, 0.92)); - color: var(--cream-line); -} - -.submission-section::before { - content: ""; - position: absolute; - left: -2rem; - right: -2rem; - top: 1.35rem; - height: 0.72rem; - border-block: 1px solid rgba(255, 245, 220, 0.18); - background: - linear-gradient(90deg, var(--taste-teal) 0 18%, var(--taste-cyan) 18% 32%, var(--taste-lichen) 32% 47%, var(--taste-saffron) 47% 62%, var(--taste-clay) 62% 78%, var(--taste-berry) 78% 100%); - opacity: 0.78; - transform: rotate(-1.6deg); -} - -.submission-copy { - position: relative; - margin: 0 auto; - padding-left: 1.15rem; -} - -.submission-copy::before { - content: ""; - position: absolute; - inset: 0.25rem auto 0.35rem 0; - width: 0.22rem; - border-radius: 999px; - background: linear-gradient(180deg, var(--taste-cyan), var(--taste-saffron), var(--taste-clay), var(--taste-berry)); - box-shadow: 0 0 0 1px rgba(255, 245, 220, 0.28); -} - -.submission-copy .eyebrow, -.submission-copy p { - color: rgba(255, 245, 220, 0.78); -} - -.source-page main { - padding-top: 4.8rem; -} - -.source-hero, -.source-index, -.source-reader-layout { - width: var(--wrap); - margin-inline: auto; -} - -.source-hero { - min-height: min(640px, 82dvh); - display: grid; - grid-template-columns: minmax(0, 0.98fr) minmax(20rem, 0.82fr); - align-items: center; - gap: clamp(1.5rem, 4vw, 4rem); - padding-block: clamp(4.4rem, 7vw, 6.2rem) clamp(2.4rem, 5vw, 4rem); -} - -.source-heading { - max-width: 48rem; - margin: 0; -} - -.source-heading h1 { - max-width: 12.5ch; - margin: 0; - font-family: var(--editorial); - font-size: 4.85rem; - line-height: 0.98; -} - -.source-heading p { - max-width: 35rem; -} - -.source-hero-panel { - position: relative; - display: grid; - gap: 1.05rem; - min-height: 18.5rem; - align-content: end; - padding: clamp(1.2rem, 3vw, 1.8rem); - border: 1px solid rgba(255, 245, 220, 0.24); - border-top: 5px solid var(--taste-cyan); - border-radius: var(--radius); - background: - linear-gradient(90deg, rgba(255, 245, 220, 0.07) 0 1px, transparent 1px 7rem), - linear-gradient(180deg, rgba(255, 245, 220, 0.045) 0 1px, transparent 1px 4.5rem), - radial-gradient(circle at 14% 0%, rgba(217, 167, 47, 0.18), transparent 34%), - linear-gradient(145deg, rgba(6, 67, 74, 0.98), rgba(7, 16, 28, 0.97) 72%, rgba(6, 9, 16, 0.98)); - color: #fff8e8; - box-shadow: - inset 0 1px 0 rgba(255, 245, 220, 0.2), - var(--shadow-ink); - overflow: hidden; -} - -.source-hero-panel::before { - content: ""; - position: absolute; - inset: 0.36rem; - border: 1px solid rgba(255, 245, 220, 0.22); - border-radius: 5px; - pointer-events: none; -} - -.source-hero-panel strong { - max-width: 21rem; - color: #fffdf6; - font-size: 2.35rem; - line-height: 1.02; -} - -.source-hero-panel p { - max-width: 24rem; - margin: 0; - color: rgba(255, 248, 232, 0.84); -} - -.source-index { - display: flex; - flex-wrap: wrap; - gap: 0.6rem; - margin-bottom: clamp(2rem, 6vw, 4rem); -} - -.source-index a { - display: inline-flex; - align-items: center; - min-height: 2.6rem; - padding: 0.58rem 0.9rem; - border: 1px solid rgba(6, 9, 16, 0.14); - border-radius: 999px; - background: rgba(255, 250, 242, 0.72); - color: var(--ink); - font-weight: 760; - box-shadow: var(--shadow-tight); -} - -.source-mobile-index { - display: none; -} - -.source-reader-layout { - display: grid; - grid-template-columns: minmax(13.5rem, 16rem) minmax(0, 1fr); - gap: clamp(1rem, 3vw, 2.2rem); - align-items: start; -} - -.source-reader-content { - min-width: 0; -} - -.source-reader-rail { - position: sticky; - top: 5.8rem; - max-height: calc(100dvh - 6.6rem); - overflow: auto; - padding: 0.82rem; - border: 1px solid rgba(6, 9, 16, 0.13); - border-radius: var(--radius); - background: - linear-gradient(180deg, rgba(255, 250, 242, 0.94), rgba(248, 243, 235, 0.82)); - box-shadow: var(--shadow-tight); -} - -.reader-rail-inner { - display: grid; - gap: 0.82rem; -} - -.reader-rail-top, -.group-document-strip a, -.source-actions a, -.reader-rail-group a, -.mobile-index-groups a { - border: 1px solid rgba(6, 9, 16, 0.12); - border-radius: 7px; - background: rgba(255, 253, 246, 0.72); -} - -.reader-rail-top { - display: block; - padding: 0.58rem 0.64rem; - color: var(--ink); - font-weight: 820; -} - -.reader-rail-group { - display: grid; - gap: 0.4rem; -} - -.reader-rail-group h2, -.mobile-index-groups h2 { - margin: 0; - color: var(--muted-strong); - font-size: 0.68rem; - font-weight: 860; - letter-spacing: 0.1em; - text-transform: uppercase; -} - -.reader-rail-group ol, -.mobile-index-groups ol { - display: grid; - gap: 0.32rem; - margin: 0; - padding: 0; - list-style: none; -} - -.reader-rail-group a, -.mobile-index-groups a { - display: grid; - gap: 0.12rem; - padding: 0.46rem 0.54rem; -} - -.reader-rail-group a.is-active, -.mobile-index-groups a.is-active, -.group-document-strip a.is-active, -.source-actions a.is-active { - border-color: rgba(47, 142, 134, 0.34); - background: rgba(47, 142, 134, 0.11); - box-shadow: inset 0 0 0 1px rgba(47, 142, 134, 0.16); -} - -.reader-rail-group a span, -.mobile-index-groups a span, -.group-document-strip a span { - color: var(--ink); - font-size: 0.84rem; - font-weight: 820; - line-height: 1.12; -} - -.reader-rail-group a small, -.mobile-index-groups a small, -.group-document-strip a small, -.source-actions a small { - color: var(--muted); - font-size: 0.68rem; - font-weight: 720; - line-height: 1.18; - overflow-wrap: anywhere; -} - -.source-group { - width: 100%; - margin-inline: 0; - padding-block: clamp(2.6rem, 7vw, 5.5rem); - border-top: 1px solid rgba(6, 9, 16, 0.12); - scroll-margin-top: 6.4rem; -} - -.source-group-header { - display: grid; - grid-template-columns: minmax(0, 0.72fr) minmax(0, 1fr); - gap: clamp(1rem, 4vw, 4rem); - align-items: end; - margin-bottom: clamp(1.4rem, 4vw, 2.8rem); -} - -.source-group-header h2 { - max-width: 11ch; - margin: 0; - font-family: var(--editorial); - font-size: 5.8rem; - line-height: 0.92; -} - -.group-document-strip { - display: flex; - flex-wrap: wrap; - gap: 0.42rem; - margin: 0 0 1rem; -} - -.group-document-strip a { - display: grid; - min-width: min(100%, 10.5rem); - padding: 0.48rem 0.58rem; -} - -.source-grid { - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - gap: 0.8rem; -} - -.source-document-stack { - display: grid; - gap: 1rem; -} - -.source-page.reader-ready .source-group[data-source-group], -.source-page.reader-ready .rendered-source[data-reader-document], -.source-page.reader-ready .verification-group { - display: none; -} - -.source-page.reader-ready .source-group[data-source-group].has-active-doc, -.source-page.reader-ready .rendered-source[data-reader-document].is-active, -.source-page.reader-ready.show-verification .verification-group { - display: block; -} - -.source-page.reader-ready.show-verification .source-group[data-source-group] { - display: none; -} - -.source-card { - position: relative; - display: grid; - min-height: 15.2rem; - align-content: space-between; - gap: 1rem; - padding: 1rem; - border: 1px solid rgba(6, 9, 16, 0.14); - border-top: 4px solid var(--taste-saffron); - border-radius: var(--radius); - background: - linear-gradient(180deg, rgba(255, 250, 242, 0.97), rgba(248, 243, 235, 0.88)); - box-shadow: var(--shadow-tight); - overflow: hidden; -} - -.source-card:nth-child(3n + 1) { - border-top-color: var(--taste-teal); -} - -.source-card:nth-child(3n + 2) { - border-top-color: var(--taste-clay); -} - -.source-card > span { - color: var(--muted-strong); - font-size: 0.74rem; - font-weight: 780; - letter-spacing: 0.12em; - text-transform: uppercase; -} - -.source-card h3 { - margin: 0; - color: var(--ink); - font-size: 1.18rem; - line-height: 1.12; - overflow-wrap: anywhere; -} - -.source-card p { - margin: 0; - color: var(--ink-soft); -} - -.source-card > code, -.verifier-card code, -.source-check code { - display: block; - width: fit-content; - max-width: 100%; - padding: 0.42rem 0.54rem; - border: 1px solid rgba(6, 9, 16, 0.14); - border-radius: 6px; - background: rgba(255, 253, 246, 0.72); - color: var(--muted-strong); - font-size: 0.78rem; - overflow-wrap: anywhere; -} - -.source-grid.compact .source-card { - min-height: 11.5rem; -} - -.rendered-source { - display: block; - min-height: auto; - padding: clamp(1rem, 2vw, 1.45rem); - scroll-margin-top: 6.4rem; -} - -.rendered-source:target { - outline: 2px solid rgba(47, 142, 134, 0.44); - outline-offset: 0.18rem; -} - -.source-head { - display: grid; - grid-template-columns: minmax(0, 1fr) minmax(16rem, 0.42fr); - gap: 1rem; - align-items: start; -} - -.source-head span { - display: inline-block; - margin-bottom: 0.5rem; - color: var(--muted-strong); - font-size: 0.74rem; - font-weight: 780; - letter-spacing: 0.12em; - text-transform: uppercase; -} - -.source-check { - display: grid; - gap: 0.45rem; - margin: 0; - padding: 0.75rem; - border: 1px solid rgba(6, 9, 16, 0.12); - border-radius: 8px; - background: rgba(255, 253, 246, 0.7); -} - -.source-check div { - display: grid; - grid-template-columns: 4rem minmax(0, 1fr); - gap: 0.5rem; -} - -.source-check dt, -.verifier-card small { - color: var(--muted-strong); - font-size: 0.72rem; - font-weight: 820; - letter-spacing: 0.1em; - text-transform: uppercase; -} - -.source-check dd { - min-width: 0; - margin: 0; - color: var(--ink); - font-weight: 760; - overflow-wrap: anywhere; -} - -.section-controls { - display: flex; - flex-wrap: wrap; - gap: 0.45rem; - margin-top: 1rem; -} - -.section-controls button { - min-height: 2.45rem; - padding: 0.46rem 0.68rem; - border: 1px solid rgba(6, 9, 16, 0.14); - border-radius: 999px; - background: rgba(255, 253, 246, 0.72); - color: var(--ink); - font: inherit; - font-size: 0.82rem; - font-weight: 820; - cursor: pointer; -} - -.section-controls button:active { - transform: translateY(1px); -} - -.rendered-markdown { - display: grid; - gap: 0.62rem; - margin-top: 1rem; - padding-top: 1rem; - border-top: 1px solid rgba(6, 9, 16, 0.12); - color: var(--ink-soft); -} - -.rendered-section-list { - display: grid; - gap: 0.58rem; -} - -.rendered-section { - border: 1px solid rgba(6, 9, 16, 0.13); - border-radius: 8px; - background: rgba(255, 253, 246, 0.58); - overflow: hidden; -} - -.rendered-section summary { - display: grid; - grid-template-columns: minmax(0, 1fr) auto; - gap: 0.8rem; - align-items: center; - min-height: 3.1rem; - padding: 0.72rem 0.82rem; - color: var(--ink); - cursor: pointer; - list-style: none; -} - -.rendered-section summary::-webkit-details-marker { - display: none; -} - -.rendered-section summary::before { - content: "+"; - grid-row: 1; - grid-column: 2; - width: 1.35rem; - height: 1.35rem; - border: 1px solid rgba(6, 9, 16, 0.16); - border-radius: 999px; - color: var(--muted-strong); - font-weight: 860; - line-height: 1.2rem; - text-align: center; -} - -.rendered-section[open] summary::before { - content: "-"; -} - -.rendered-section summary span { - min-width: 0; - font-weight: 860; - line-height: 1.14; - overflow-wrap: anywhere; -} - -.rendered-section summary small { - grid-column: 1 / -1; - color: var(--muted-strong); - font-size: 0.68rem; - font-weight: 820; - letter-spacing: 0.08em; - text-transform: uppercase; -} - -.rendered-section-body { - padding: 0 0.82rem 0.82rem; - border-top: 1px solid rgba(6, 9, 16, 0.09); -} - -.rendered-markdown h2, -.rendered-markdown h3, -.rendered-markdown h4, -.rendered-markdown h5, -.rendered-markdown h6 { - max-width: 20ch; - margin: 1.2rem 0 0.65rem; - color: var(--ink); - font-family: inherit; - font-size: 1.15rem; - line-height: 1.18; -} - -.rendered-markdown h2:first-child, -.rendered-markdown h3:first-child { - margin-top: 0; -} - -.rendered-markdown p, -.rendered-markdown li, -.rendered-markdown blockquote, -.rendered-markdown td, -.rendered-markdown th { - font-size: 0.96rem; - line-height: 1.56; -} - -.rendered-markdown p { - max-width: 76ch; - margin: 0.7rem 0; -} - -.rendered-markdown ul, -.rendered-markdown ol { - display: grid; - gap: 0.34rem; - margin: 0.7rem 0; - padding-left: 1.2rem; - color: var(--ink-soft); -} - -.rendered-markdown code { - display: inline; - padding: 0.12rem 0.28rem; - border: 1px solid rgba(6, 9, 16, 0.12); - border-radius: 5px; - background: rgba(255, 253, 246, 0.86); - color: var(--muted-strong); - font-size: 0.86em; - overflow-wrap: anywhere; -} - -.rendered-code { - margin: 0.8rem 0; - padding: 0.85rem; - border: 1px solid rgba(6, 9, 16, 0.14); - border-radius: 8px; - background: - linear-gradient(180deg, rgba(255, 253, 246, 0.94), rgba(248, 243, 235, 0.78)); - overflow-x: auto; -} - -.rendered-code code { - display: block; - padding: 0; - border: 0; - background: transparent; - color: var(--ink); - white-space: pre-wrap; -} - -.rendered-table-wrap { - max-width: 100%; - margin: 0.9rem 0; - overflow-x: auto; -} - -.rendered-markdown table { - width: 100%; - min-width: 42rem; - border-collapse: collapse; - background: rgba(255, 253, 246, 0.74); -} - -.rendered-markdown th, -.rendered-markdown td { - padding: 0.55rem 0.65rem; - border: 1px solid rgba(6, 9, 16, 0.12); - text-align: left; - vertical-align: top; -} - -.rendered-markdown th { - color: var(--ink); - font-size: 0.78rem; - font-weight: 820; - letter-spacing: 0.08em; - text-transform: uppercase; -} - -.rendered-markdown blockquote { - margin: 0.8rem 0; - padding: 0.65rem 0.85rem; - border-left: 4px solid var(--taste-teal); - background: rgba(47, 142, 134, 0.08); - color: var(--ink); -} - -.rendered-link { - display: inline-flex; - flex-wrap: wrap; - gap: 0.22rem; - align-items: baseline; -} - -.source-actions { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 0.65rem; - margin-top: 1rem; - padding-top: 1rem; - border-top: 1px solid rgba(6, 9, 16, 0.12); -} - -.source-actions a { - display: grid; - gap: 0.2rem; - min-height: 4.8rem; - align-content: center; - padding: 0.66rem 0.72rem; -} - -.source-actions a span { - color: var(--muted-strong); - font-size: 0.68rem; - font-weight: 860; - letter-spacing: 0.1em; - text-transform: uppercase; -} - -.source-actions a strong { - color: var(--ink); - font-size: 1rem; - line-height: 1.1; -} - -.source-actions .next-source { - border-color: rgba(47, 142, 134, 0.28); - background: rgba(47, 142, 134, 0.09); -} - -.reveal-item { - opacity: 1; - transform: none; - filter: none; -} - -.reveal-item.is-visible { - opacity: 1; - transform: none; - filter: blur(0); -} - -@media (max-width: 1180px) { - .nav-links a { - padding-inline: 0.52rem; - font-size: 0.74rem; - } - - .hero { - grid-template-columns: 1fr; - gap: 2.5rem; - min-height: auto; - } - - .workbench-scene { - width: min(100%, 48rem); - min-height: 34rem; - } - - .source-hero { - grid-template-columns: 1fr; - min-height: auto; - } - - .source-reader-layout { - grid-template-columns: minmax(11.5rem, 14rem) minmax(0, 1fr); - } - - .source-heading h1 { - font-size: 4.2rem; - } - - .source-hero-panel { - min-height: 18rem; - } - - .source-group-header h2 { - font-size: 4.4rem; - } -} - -@media (max-width: 980px) { - :root { - --wrap: min(100% - 2rem, 760px); - } - - .review-deck-shell { - grid-template-columns: 1fr; - grid-template-rows: auto; - grid-template-areas: - "intro" - "nav" - "panels"; - align-items: start; - height: auto; - min-height: auto; - } - - .review-deck-intro h2 { - max-width: 15ch; - font-size: 2.7rem; - } - - .review-deck-nav { - display: flex; - gap: 0.45rem; - max-height: none; - overflow-x: auto; - scroll-snap-type: x proximity; - } - - .review-deck-nav a { - min-width: min(12rem, 62vw); - scroll-snap-align: start; - } - - .review-deck-panels { - height: auto; - min-height: min(72dvh, 780px); - max-height: min(72dvh, 780px); - } - - .nav-toggle { - display: inline-flex; - } - - .nav-links { - position: absolute; - left: 1rem; - right: 1rem; - top: calc(100% + 0.4rem); - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 0.45rem; - padding: 0.8rem; - border: 1px solid rgba(168, 148, 120, 0.34); - border-radius: var(--radius); - background: rgba(255, 253, 246, 0.88); - box-shadow: var(--shadow-ambient); - backdrop-filter: blur(20px) saturate(1.2); - opacity: 0; - pointer-events: none; - transform: none; - transition: opacity var(--motion-fast) var(--ease-out); - } - - .nav-open .nav-links { - opacity: 1; - pointer-events: auto; - transform: none; - } - - .nav-links a { - padding: 0.82rem; - transition-delay: 0ms; - } - - .source-group-header, - .source-grid, - .source-head { - grid-template-columns: 1fr; - } - - .source-reader-layout { - display: block; - } - - .source-reader-rail { - display: none; - } - - .source-mobile-index { - display: block; - width: var(--wrap); - margin: 0 auto 1rem; - border: 1px solid rgba(6, 9, 16, 0.13); - border-radius: var(--radius); - background: rgba(255, 250, 242, 0.86); - box-shadow: var(--shadow-tight); - } - - .source-mobile-index summary { - min-height: 3rem; - padding: 0.82rem 0.92rem; - color: var(--ink); - font-weight: 860; - cursor: pointer; - } - - .mobile-index-groups { - display: grid; - gap: 0.9rem; - padding: 0 0.92rem 0.92rem; - } - - .source-heading h1 { - font-size: 3.35rem; - } - - .source-hero-panel strong { - font-size: 2.1rem; - } - - .source-group-header h2 { - font-size: 3.7rem; - } - - .source-grid.compact { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - - .hero { - padding-top: 3.5rem; - padding-bottom: 3.6rem; - gap: 2rem; - } - - h1 { - font-size: 4rem; - } - - .section-heading h2, - .submission-copy h2 { - font-size: 2.85rem; - } - - .check-strip, - .scope-layout, - .coldrun-layout, - .admin-rhythm-layout, - .brief-layout, - .quality-layout, - .thesis-layout, - .handoff-layout, - .setup-layout, - .console-layout, - .checkgate-layout, - .reviewer-layout, - .coldrun-steps, - .brief-board, - .quality-board, - .thesis-points, - .setup-board, - .comparison-grid, - .console-output, - .file-map, - .behavior-grid, - .notes-grid, - .checkgate-board { - grid-template-columns: 1fr; - } - - .admin-rhythm-board { - grid-template-columns: 1fr; - min-height: auto; - } - - .admin-rhythm-board::before { - height: 4.6rem; - } - - .admin-rhythm-card:nth-child(3), - .admin-rhythm-card:nth-child(4) { - transform: none; - } - - .admin-rhythm-visual img { - height: 19rem; - } - - .admin-boundary { - grid-row: auto; - } - - .check-strip { - margin-top: -4.1rem; - } - - .scope-board { - min-height: auto; - } - - .scope-core { - margin-inline: 0; - } - - .scope-lanes li { - grid-template-columns: 0.72rem minmax(0, 1fr); - } - - .scope-lanes small { - justify-self: start; - grid-column: 2; - } - - .comparison-grid { - grid-template-areas: - "user" - "generic" - "unstuck"; - } - - .file-node:nth-child(2), - .file-node:nth-child(4), - .task-stack, - .coach-dialogue, - .life-ledger, - .state-meter { - transform: none; - } - - .life-ledger { - top: 11.5%; - } - - .workbench-scene { - min-height: 21.2rem; - } - - .scene-panel { - padding: 0.75rem; - } - - .task-stack { - width: 14.2rem; - } - - .life-ledger { - width: min(22rem, calc(100% - 2rem)); - } - - .coach-dialogue { - width: 19.2rem; - } - - .state-meter { - display: none; - } -} - -@media (max-width: 620px) { - :root { - --wrap: calc(100% - 2rem); - } - - .review-deck-intro h2 { - font-size: 2.28rem; - } - - .review-deck .section-heading h2 { - font-size: 2.1rem; - } - - .review-deck-panels { - min-height: 70dvh; - max-height: 70dvh; - } - - .review-deck .review-panel { + .stuck-card { + gap: 0.65rem; padding: 0.9rem; } - .review-deck-nav a { - min-width: 10.5rem; - } - - body { - font-size: 15px; - } - - body::after { - width: 0.38rem; - } - - .site-nav { - width: 100%; - min-height: 3.85rem; - padding-inline: 0.75rem; - } - - .wordmark { - font-size: 0.82rem; - } - - .wordmark-mark { - width: 1.96rem; - height: 1.96rem; - } - - .nav-links { - left: 0.5rem; - right: 0.5rem; - top: calc(100% + 0.35rem); - grid-template-columns: 1fr; - } - - .hero { - width: calc(100% - 2rem); - padding: 2.8rem 0 2.4rem; - } - - .source-page main { - padding-top: 4.4rem; - } - - .source-hero { - width: calc(100% - 2rem); - padding-block: 4rem 2.5rem; - } - - .source-heading h1 { - max-width: 12ch; - font-size: 2.65rem; - } - - .source-index { - width: calc(100% - 2rem); - display: grid; - grid-template-columns: 1fr; - } - - .source-reader-layout, - .source-mobile-index { - width: calc(100% - 2rem); - } - - .source-group { - width: 100%; - padding-block: 2.5rem; - } - - .source-group-header h2 { - font-size: 2.45rem; - } - - .source-grid.compact { - grid-template-columns: 1fr; - } - - .source-check div { - grid-template-columns: 1fr; - } - - .source-actions { - grid-template-columns: 1fr; - } - - .hero-copy { - width: min(100%, 21.6rem); - max-width: 21.6rem; - } - - .hero::before { - inset: 5.4rem -1rem 1.5rem; - } - - h1 { - font-size: 2.54rem; - max-width: 10.8ch; - } - - .hero-deck { - margin-top: 0.92rem; - font-size: 0.94rem; - line-height: 1.46; - } - - .hero-life-rail { - gap: 0.32rem; - margin-top: 0.76rem; - } - - .hero-life-rail span { - padding: 0.32rem 0.48rem; - font-size: 0.7rem; + .stuck-card textarea { + min-height: 5rem; + padding: 0.85rem; } - .hero .eyebrow { - width: auto; - line-height: 1.36; - white-space: normal; + .hero + .section { + padding-top: 1rem; } .hero-actions, - .inline-actions { - display: grid; - } - - .hero-actions { - margin-top: 1.35rem; - } - - .action { - width: 100%; - justify-content: space-between; - } - - .workbench-scene { - display: none; - } - - .mola-bridge { - opacity: 0.22; - } - - .bridge-one { - right: -8rem; - top: 3rem; - width: 18rem; - height: 5.2rem; - } - - .bridge-two { - left: -7rem; - bottom: 3rem; - width: 14rem; - height: 4.5rem; - } - - .task-stack, - .state-meter { - display: none; - } - - .coach-dialogue { - right: 1rem; - bottom: 1.2rem; - width: min(20rem, calc(100% - 2rem)); - } - - .life-ledger { - left: 1rem; - top: 4.8rem; - width: min(19rem, calc(100% - 2rem)); - } - - .ledger-status-grid, - .ledger-close { - display: none; - } - - .mobile-check-panel { - display: block; - margin-top: 0.95rem; - padding: 0.46rem; - border: 1px solid rgba(6, 9, 16, 0.2); - border-radius: 1.36rem; - background: - linear-gradient(135deg, rgba(6, 9, 16, 0.04), rgba(217, 167, 47, 0.1)), - rgba(255, 253, 246, 0.88); - box-shadow: - inset 0 1px 0 rgba(255, 255, 255, 0.82), - 0 14px 34px rgba(71, 51, 30, 0.12); - } - - .mobile-check-panel > .panel-kicker, - .mobile-check-panel > p, - .mobile-check-grid { - margin-inline: 0.38rem; - } - - .mobile-life-signal { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 0.32rem; - margin-top: 0.42rem; - padding: 0.35rem; - border: 1px solid rgba(255, 245, 220, 0.58); - border-radius: 1.02rem; - background: - linear-gradient(160deg, rgba(6, 9, 16, 0.96), rgba(6, 67, 74, 0.92)); - box-shadow: - inset 0 0 0 1px rgba(255, 245, 220, 0.14), - inset 0 0 0 0.42rem rgba(255, 245, 220, 0.045); - } - - .mobile-life-signal span { - min-width: 0; - padding: 0.42rem 0.44rem 0.4rem; - border: 1px solid rgba(255, 245, 220, 0.2); - border-radius: 0.78rem; - background: - linear-gradient(180deg, rgba(255, 245, 220, 0.11), rgba(255, 245, 220, 0.045)); + .site-footer { + flex-direction: column; } - .mobile-life-signal i { - display: block; + .hero-actions .button { width: 100%; - height: 0.28rem; - margin-bottom: 0.34rem; - border-radius: 999px; - background: linear-gradient(90deg, var(--taste-teal), var(--taste-saffron), var(--taste-berry)); - } - - .mobile-life-signal span:nth-child(2) i { - background: linear-gradient(90deg, var(--taste-saffron), var(--taste-clay)); - } - - .mobile-life-signal span:nth-child(3) i { - background: linear-gradient(90deg, var(--taste-berry), var(--taste-coral)); - } - - .mobile-life-signal span:nth-child(4) i { - background: linear-gradient(90deg, var(--taste-cyan), var(--taste-teal)); - } - - .mobile-life-signal strong, - .mobile-life-signal small { - display: block; - letter-spacing: 0; - } - - .mobile-life-signal strong { - color: var(--paper); - font-size: 0.72rem; - line-height: 1.05; - } - - .mobile-life-signal small { - margin-top: 0.14rem; - color: rgba(255, 245, 220, 0.66); - font-size: 0.64rem; - line-height: 1.15; - } - - .mobile-check-panel p { - margin-top: 0.46rem; - margin-bottom: 0.46rem; - font-size: 0.96rem; - color: var(--ink); - font-weight: 760; - } - - .mobile-check-grid { - display: grid; - grid-template-columns: 3.8rem 1fr; - gap: 0.34rem 0.58rem; - align-items: baseline; - } - - .mobile-check-grid span { - color: var(--muted); - font-size: 0.68rem; - font-weight: 780; - letter-spacing: 0.12em; - text-transform: uppercase; - } - - .mobile-check-grid strong { - color: var(--ink-soft); - font-size: 0.92rem; - } - - .prompt-rail { - flex-wrap: wrap; - overflow-x: visible; - } - - .prompt-tab { - flex: 1 1 calc(50% - 0.5rem); - justify-content: center; - min-height: 2.8rem; - text-align: center; - white-space: normal; - } - - .check-strip { - margin-top: -5.15rem; - } - - .scope-section { - padding-top: 5.2rem; - } - - .scope-layout { - gap: 1.8rem; - } - - .scope-board { - padding: 0.72rem; - } - - .scope-core { - padding: 1rem; - } - - .scope-core strong { - font-size: 1.1rem; - } - - .scope-lanes li { - padding: 0.78rem; - } - - .scope-lanes p { - font-size: 0.92rem; - } - - .admin-rhythm-board { - padding: 0.72rem; - } - - .admin-rhythm-card, - .admin-boundary { - min-height: 12.4rem; - padding: 1rem; - } - - .admin-boundary strong { - font-size: 1.86rem; - } - - .section, - .submission-section { - padding: 5.4rem 1rem; - } - - .section-heading h2, - .submission-copy h2 { - font-size: 2.25rem; } - .coldrun-steps li, - .brief-board article, - .quality-board article article, - .thesis-points article, - .setup-board article, - .console-output article, - .file-node, - .behavior-grid article, - .notes-grid a, - .checkgate-board article { - min-height: 11rem; + .sample-row { + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 0.45rem; } - .response-pane { - min-height: 14rem; + .sample-row button { + min-height: 2.35rem; + padding: 0.45rem 0.35rem; + font-size: 0.9rem; } } @@ -3706,14 +509,7 @@ h1 { *, *::before, *::after { - animation: none !important; scroll-behavior: auto !important; transition: none !important; } - - .reveal-item { - opacity: 1; - transform: none; - filter: none; - } } diff --git a/EF-COACH/live-demo/public/styles.css b/EF-COACH/live-demo/public/styles.css index 114d73c..3bf30c1 100644 --- a/EF-COACH/live-demo/public/styles.css +++ b/EF-COACH/live-demo/public/styles.css @@ -1,38 +1,39 @@ :root { color-scheme: light; - --ink: #060910; - --ink-soft: #24211f; - --muted: #6f625b; - --muted-strong: #403832; - --paper: #fff8ec; - --paper-soft: #f8f3eb; - --surface: #fffaf2; - --surface-deep: #eadcc6; - --cream-line: #fff5dc; - --line: #d9d0c4; - --line-strong: #766755; - --steel: #06434a; - --gold: #ffc018; - --cyan: #00d7e8; - --lime: #b7f10b; - --orange: #ff8b00; - --magenta: #ff147f; - --taste-teal: #2f8e86; - --taste-saffron: #d9a72f; - --taste-coral: #ef724b; - --taste-clay: #d65f35; - --taste-berry: #9f365f; - --taste-ink: #07101c; - --shadow-soft: 0 18px 52px rgba(36, 33, 31, 0.11); - --shadow-tight: 0 8px 24px rgba(36, 33, 31, 0.09); - --shadow-ink: 0 28px 70px rgba(6, 9, 16, 0.24); + --font-sans: "Atkinson Hyperlegible", "Aptos", "Avenir Next", "Plus Jakarta Sans", system-ui, sans-serif; + --font-mono: "Geist Mono", "SF Mono", ui-monospace, monospace; + --ink: #101317; + --ink-soft: #252b31; + --muted: #5f655f; + --muted-strong: #424941; + --paper: #f7f3ea; + --paper-deep: #efe5d4; + --surface: #fffdf8; + --surface-soft: #fbf8f1; + --line: #d8d0c2; + --line-strong: #a69b89; + --apatite-950: #052733; + --apatite-900: #064b5f; + --apatite-800: #075e73; + --apatite-700: #08758d; + --apatite-500: #11a5ce; + --apatite-100: #d7f0f2; + --apatite-50: #eaf8f7; + --attention: #b86b2b; + --shadow-paper: 0 18px 52px rgba(37, 43, 49, 0.08); + --shadow-tight: 0 8px 22px rgba(37, 43, 49, 0.07); --radius: 8px; + --measure: 66ch; --ease-out: cubic-bezier(0.2, 0, 0.2, 1); --motion-fast: 120ms; --motion-soft: 180ms; - --editorial: "PP Editorial New", "Canela", "Fraunces", "New York", serif; - --route-speed: 12s; - font-family: "Avenir Next", "Plus Jakarta Sans", "Geist", "Satoshi", system-ui, sans-serif; + --step--1: 0.92rem; + --step-0: 1rem; + --step-1: 1.18rem; + --step-2: 1.45rem; + --step-3: 1.85rem; + --energy-progress: 0%; + font-family: var(--font-sans); letter-spacing: 0; } @@ -43,6 +44,8 @@ html { min-width: 320px; background: var(--paper); + font-size: 100%; + -webkit-text-size-adjust: 100%; } body { @@ -50,14 +53,13 @@ body { min-height: 100dvh; margin: 0; background: - linear-gradient(90deg, rgba(6, 9, 16, 0.018) 0 1px, transparent 1px 142px), - linear-gradient(180deg, rgba(6, 9, 16, 0.016) 0 1px, transparent 1px 142px), - linear-gradient(90deg, rgba(47, 142, 134, 0.08) 0 10%, transparent 10% 28%, rgba(217, 167, 47, 0.075) 28% 36%, transparent 36% 68%, rgba(214, 95, 53, 0.055) 68% 76%, transparent 76%), - linear-gradient(132deg, rgba(255, 253, 246, 0.54), rgba(217, 167, 47, 0.08) 28%, rgba(47, 142, 134, 0.055) 64%, transparent 100%), - linear-gradient(180deg, var(--surface) 0%, var(--paper) 52%, #f0dfc4 100%); + linear-gradient(90deg, rgba(8, 117, 141, 0.06) 0 10%, transparent 10% 34%, rgba(184, 107, 43, 0.05) 34% 43%, transparent 43%), + linear-gradient(180deg, var(--surface) 0%, var(--paper) 58%, var(--paper-deep) 100%); color: var(--ink); - font-size: 16px; + font-family: var(--font-sans); + font-size: var(--step-0); line-height: 1.5; + font-synthesis: none; text-rendering: optimizeLegibility; } @@ -65,45 +67,14 @@ body::before { content: ""; position: fixed; inset: 0; - z-index: 4; + z-index: 1; pointer-events: none; - opacity: 0.038; - background-image: repeating-radial-gradient( - circle at 30% 20%, - rgba(8, 7, 5, 0.9) 0 0.6px, - transparent 0.7px 3px - ); + opacity: 0.035; + background-image: radial-gradient(rgba(16, 19, 23, 0.88) 0.55px, transparent 0.65px); + background-size: 3px 3px; mix-blend-mode: multiply; } -body::after { - content: ""; - position: fixed; - inset: 0 auto 0 0; - z-index: 3; - width: 0.46rem; - pointer-events: none; - background: - linear-gradient( - 180deg, - var(--taste-ink), - var(--taste-teal) 24%, - #a7af48 42%, - var(--taste-saffron) 61%, - var(--taste-clay) 78%, - var(--taste-berry) - ), - repeating-linear-gradient( - 180deg, - transparent 0 34px, - rgba(255, 245, 220, 0.72) 34px 37px, - transparent 37px 72px - ); - box-shadow: - 1px 0 0 rgba(6, 9, 16, 0.58), - 10px 0 34px rgba(6, 9, 16, 0.06); -} - button, textarea { font: inherit; @@ -114,99 +85,27 @@ button { } :where(button, textarea):focus-visible { - outline: 3px solid var(--cyan); + outline: 3px solid rgba(8, 117, 141, 0.46); outline-offset: 4px; - box-shadow: 0 0 0 7px rgba(0, 215, 232, 0.16); } ::selection { - background: rgba(214, 163, 56, 0.28); + background: rgba(8, 117, 141, 0.18); } .app-shell { position: relative; + z-index: 2; display: grid; grid-template-rows: auto auto minmax(0, 1fr); - gap: 0.72rem; + gap: 0.95rem; width: min(1240px, calc(100vw - 2.25rem)); min-height: 100dvh; margin: 0 auto; - padding: 1.15rem 0; -} - -.app-shell::before { - content: ""; - position: absolute; - inset: 5.9rem auto auto -0.2rem; - z-index: -1; - width: min(37rem, 58vw); - height: min(37rem, 58vw); - border: 2px solid rgba(6, 9, 16, 0.2); - border-radius: 50%; - background: - radial-gradient(circle at 44% 42%, rgba(255, 192, 24, 0.24) 0 12%, transparent 13% 100%), - conic-gradient( - from 212deg, - rgba(0, 215, 232, 0.22), - rgba(255, 20, 127, 0.18), - rgba(255, 139, 0, 0.2), - rgba(183, 241, 11, 0.16), - rgba(0, 215, 232, 0.22) - ); - opacity: 0.38; - transform: rotate(-8deg); -} - -.chat-header { - position: relative; - display: grid; - grid-template-columns: minmax(0, 1fr) auto; - gap: 1rem; - align-items: end; - min-height: 5.5rem; - overflow: hidden; - border: 2px solid var(--ink); - border-radius: var(--radius); - background: - linear-gradient(145deg, rgba(6, 9, 16, 0.98), rgba(6, 67, 74, 0.96)), - var(--taste-ink); - color: var(--surface); - padding: 1rem 1.08rem; - box-shadow: var(--shadow-ink); -} - -.chat-header::before { - content: ""; - position: absolute; - inset: auto 1rem 0.62rem auto; - width: min(28rem, 43vw); - height: 0.74rem; - border: 1px solid rgba(255, 250, 242, 0.18); - background: - linear-gradient(90deg, var(--magenta), var(--orange) 28%, var(--gold) 50%, var(--lime) 72%, var(--cyan)); - box-shadow: 0 12px 28px rgba(0, 215, 232, 0.16); - transform: rotate(-1.4deg); -} - -.chat-header::after { - content: ""; - position: absolute; - inset: 0; - pointer-events: none; - background: - linear-gradient(90deg, rgba(255, 248, 236, 0.06) 0 1px, transparent 1px 64px), - linear-gradient(180deg, rgba(255, 248, 236, 0.05) 0 1px, transparent 1px 64px); - opacity: 0.72; -} - -.chat-header > * { - position: relative; - z-index: 1; + padding: 1rem 0; } .demo-topbar { - position: relative; - z-index: 1; display: flex; flex-wrap: wrap; justify-content: space-between; @@ -215,36 +114,15 @@ button { min-height: 2.25rem; } -.eyebrow { - margin: 0 0 0.32rem; - color: var(--gold); - font-size: 0.76rem; - font-weight: 840; - letter-spacing: 0.08em; - text-transform: uppercase; -} - -h1 { - margin: 0; - font-family: var(--editorial); - font-size: clamp(2.65rem, 8vw, 5.2rem); - font-weight: 500; - line-height: 0.88; - letter-spacing: 0; -} - .landing-link, #provider { - border: 1px solid rgba(6, 9, 16, 0.2); + border: 1px solid rgba(16, 19, 23, 0.12); border-radius: 999px; - background: rgba(255, 250, 242, 0.74); + background: rgba(255, 253, 248, 0.76); color: var(--ink-soft); padding: 0.44rem 0.68rem; - font-size: 0.78rem; + font-size: var(--step--1); font-weight: 760; - box-shadow: - inset 0 1px 0 rgba(255, 255, 255, 0.72), - 0 7px 18px rgba(36, 33, 31, 0.06); } .landing-link { @@ -252,40 +130,96 @@ h1 { } .landing-link:hover { - border-color: rgba(6, 9, 16, 0.42); - background: var(--surface); + border-color: rgba(8, 117, 141, 0.34); + background: var(--apatite-50); } #provider { - max-width: 16ch; + max-width: 18ch; border: 0; background: transparent; padding: 0.16rem 0.08rem; color: var(--muted); - box-shadow: none; - font-size: 0.68rem; + font-size: 0.78rem; font-weight: 680; line-height: 1.2; text-align: right; } +.chat-header { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 1rem; + align-items: end; + min-height: 4.8rem; + border: 1px solid rgba(16, 19, 23, 0.12); + border-radius: var(--radius); + background: rgba(255, 253, 248, 0.78); + padding: 0.95rem 1rem; + box-shadow: var(--shadow-tight); +} + +.eyebrow { + margin: 0 0 0.28rem; + color: var(--apatite-900); + font-family: var(--font-mono); + font-size: 0.76rem; + font-weight: 820; + letter-spacing: 0.06em; + text-transform: uppercase; +} + +h1 { + margin: 0; + font-size: var(--step-3); + font-weight: 860; + line-height: 1; + letter-spacing: 0; + text-wrap: balance; +} + .work-surface { display: grid; - grid-template-columns: minmax(0, 1fr) minmax(320px, 390px); + grid-template-columns: minmax(0, 1fr) minmax(320px, 388px); gap: 1rem; min-height: 0; } .chat-shell { display: grid; - grid-template-rows: minmax(0, 1fr) auto auto; + grid-template-rows: auto minmax(0, 1fr) auto auto; min-height: 0; - border: 2px solid var(--ink); + border: 1px solid rgba(16, 19, 23, 0.13); border-radius: var(--radius); + background: rgba(255, 253, 248, 0.82); + box-shadow: var(--shadow-paper); +} + +.chat-orientation { + border-bottom: 1px solid rgba(16, 19, 23, 0.1); background: - linear-gradient(180deg, rgba(255, 253, 246, 0.8), rgba(255, 248, 236, 0.88)), - var(--surface); - box-shadow: var(--shadow-soft); + linear-gradient(90deg, rgba(215, 240, 242, 0.65), transparent 74%), + rgba(255, 253, 248, 0.72); + padding: 0.95rem 1rem; +} + +.chat-orientation h2 { + max-width: 18ch; + margin: 0 0 0.55rem; + font-size: var(--step-2); + font-weight: 840; + line-height: 1.1; + text-wrap: balance; +} + +.chat-orientation ul { + display: grid; + gap: 0.28rem; + max-width: var(--measure); + margin: 0; + padding-left: 1.15rem; + color: var(--muted-strong); + text-wrap: pretty; } .chat-log { @@ -300,83 +234,59 @@ h1 { .turn { position: relative; width: fit-content; - max-width: min(76ch, 86%); - border: 1px solid rgba(6, 9, 16, 0.2); + max-width: min(72ch, 86%); + border: 1px solid rgba(16, 19, 23, 0.12); border-radius: var(--radius); + background: var(--surface); padding: 0.82rem 0.92rem; line-height: 1.55; white-space: pre-wrap; - box-shadow: - inset 0 1px 0 rgba(255, 255, 255, 0.78), - var(--shadow-tight); + box-shadow: var(--shadow-tight); + text-wrap: pretty; } .turn::before { content: ""; position: absolute; inset: 0 auto 0 0; - width: 0.32rem; - background: var(--taste-teal); + width: 0.28rem; + border-radius: var(--radius) 0 0 var(--radius); + background: var(--apatite-700); } .turn.assistant { align-self: flex-start; - background: #f3fbf6; + background: var(--apatite-50); } .turn.user { align-self: flex-end; - background: #fff1d5; + background: var(--surface); } .turn.user::before { inset: 0 0 0 auto; - background: var(--orange); + border-radius: 0 var(--radius) var(--radius) 0; + background: var(--attention); } .turn.pending { color: var(--muted); } -.chat-orientation { - border: 1px solid rgba(6, 9, 16, 0.18); - border-left: 5px solid var(--gold); - border-radius: var(--radius); - background: - linear-gradient(135deg, rgba(255, 192, 24, 0.13), rgba(0, 215, 232, 0.08)), - var(--surface); - padding: 0.82rem 0.92rem; - box-shadow: 0 12px 28px rgba(36, 33, 31, 0.07); -} - -.chat-orientation h2 { - margin: 0 0 0.48rem; - font-family: var(--editorial); - font-size: clamp(1.35rem, 3vw, 2rem); - font-weight: 540; - line-height: 1.02; -} - -.chat-orientation ul { - display: grid; - gap: 0.28rem; - margin: 0; - padding-left: 1.15rem; - color: var(--muted-strong); -} - .turn.error { - border-color: var(--taste-coral); - color: var(--taste-clay); + border-color: rgba(184, 107, 43, 0.48); + color: #7d431b; } .speaker, .dock-label { display: block; margin-bottom: 0.28rem; - color: var(--steel); + color: var(--apatite-900); + font-family: var(--font-mono); font-size: 0.76rem; - font-weight: 840; + font-weight: 820; text-transform: uppercase; } @@ -389,17 +299,15 @@ h1 { } .starter-row { - border-top: 1px solid rgba(6, 9, 16, 0.14); + border-top: 1px solid rgba(16, 19, 23, 0.1); padding: 0.78rem 0.92rem 0; } button { min-height: 2.55rem; - border: 1px solid rgba(6, 9, 16, 0.22); - border-radius: var(--radius); - background: - linear-gradient(180deg, rgba(255, 253, 246, 0.94), rgba(255, 248, 236, 0.84)), - var(--surface); + border: 1px solid rgba(16, 19, 23, 0.14); + border-radius: 999px; + background: var(--surface); color: var(--ink); padding: 0.54rem 0.78rem; cursor: pointer; @@ -411,8 +319,8 @@ button { } button:hover { - border-color: rgba(6, 9, 16, 0.46); - box-shadow: 0 8px 18px rgba(36, 33, 31, 0.08); + border-color: rgba(8, 117, 141, 0.38); + background: var(--apatite-50); } button:active { @@ -428,19 +336,17 @@ button:active { grid-template-columns: auto minmax(0, 1fr) auto; gap: 0.58rem; align-items: end; - border: 2px solid var(--ink); + border: 1px solid rgba(16, 19, 23, 0.18); border-radius: var(--radius); background: var(--surface); padding: 0.58rem; - box-shadow: - inset 0 1px 0 rgba(255, 255, 255, 0.78), - 0 14px 34px rgba(36, 33, 31, 0.1); + box-shadow: var(--shadow-tight); } .icon-button { min-width: 3.15rem; - border-color: rgba(255, 139, 0, 0.72); - background: #fff1d5; + color: var(--apatite-900); + background: var(--apatite-50); font-weight: 780; } @@ -452,36 +358,44 @@ textarea { background: transparent; color: var(--ink); padding: 0.62rem 0.5rem; - line-height: 1.4; + line-height: 1.5; outline: 0; } textarea::placeholder { - color: rgba(64, 56, 50, 0.72); + color: #73786f; } button[type="submit"] { - border-color: var(--ink); - background: linear-gradient(180deg, var(--gold), #f0a41c); - color: var(--ink); + border-color: var(--apatite-900); + background: var(--apatite-700); + color: #ffffff; font-weight: 840; } +button[type="submit"]:hover { + background: var(--apatite-800); +} + button[aria-busy="true"] { cursor: wait; opacity: 0.72; } button[data-clicked="true"] { - border-color: var(--steel); - box-shadow: 0 0 0 3px rgba(47, 142, 134, 0.12); + border-color: var(--apatite-700); + box-shadow: 0 0 0 3px rgba(8, 117, 141, 0.13); +} + +.voice-status, +.composer-meta { + color: var(--muted); + font-size: var(--step--1); } .voice-status { min-height: 1.2em; margin: 0.42rem 0.25rem 0; - color: var(--muted); - font-size: 0.82rem; } .composer-meta { @@ -490,17 +404,15 @@ button[data-clicked="true"] { justify-content: space-between; gap: 0.5rem; margin: 0.42rem 0.25rem 0; - color: var(--muted); - font-size: 0.82rem; } #draft-status[data-state="big"] { - color: var(--taste-clay); + color: #7d431b; font-weight: 760; } #send-status[data-state="loading"] { - color: var(--steel); + color: var(--apatite-900); font-weight: 760; } @@ -510,14 +422,11 @@ button[data-clicked="true"] { gap: 0.62rem; min-height: 0; overflow-y: auto; - border: 2px solid var(--ink); + border: 1px solid rgba(16, 19, 23, 0.13); border-radius: var(--radius); - background: - linear-gradient(90deg, rgba(255, 20, 127, 0.08) 0 0.42rem, transparent 0.42rem), - linear-gradient(180deg, rgba(255, 253, 246, 0.84), rgba(255, 248, 236, 0.86)), - var(--surface); + background: rgba(255, 253, 248, 0.82); padding: 0.86rem; - box-shadow: var(--shadow-soft); + box-shadow: var(--shadow-paper); } .dock-header { @@ -525,25 +434,21 @@ button[data-clicked="true"] { grid-template-columns: 1fr auto; gap: 0.72rem; align-items: start; - border-bottom: 1px solid rgba(6, 9, 16, 0.14); + border-bottom: 1px solid rgba(16, 19, 23, 0.1); padding-bottom: 0.66rem; } .dock-header strong { - color: var(--steel); - font-size: 0.9rem; + color: var(--apatite-900); + font-size: var(--step--1); } .dock-card { - border: 1px solid rgba(6, 9, 16, 0.2); + border: 1px solid rgba(16, 19, 23, 0.1); border-radius: var(--radius); - background: - linear-gradient(180deg, rgba(255, 253, 246, 0.86), transparent 44%), - var(--surface); + background: var(--surface); padding: 0.78rem; - box-shadow: - inset 0 1px 0 rgba(255, 255, 255, 0.78), - 0 12px 28px rgba(36, 33, 31, 0.08); + box-shadow: var(--shadow-tight); } .dock-card p, @@ -551,31 +456,28 @@ button[data-clicked="true"] { margin: 0; color: var(--muted-strong); line-height: 1.45; + text-wrap: pretty; } .next-card { - border-top: 5px solid var(--magenta); - background: #fff1d5; + border-left: 5px solid var(--apatite-700); + background: var(--apatite-50); } .demo-limits { - border-left: 5px solid var(--cyan); - background: - linear-gradient(135deg, rgba(0, 215, 232, 0.12), rgba(255, 192, 24, 0.1)), - var(--surface); + border-left: 5px solid var(--attention); + background: var(--surface-soft); } .demo-limits p { - font-size: 0.92rem; + font-size: var(--step--1); } .relief-map { --energy-progress: 0%; overflow: hidden; - border-color: rgba(6, 9, 16, 0.28); background: - linear-gradient(160deg, rgba(255, 192, 24, 0.22), transparent 36%), - linear-gradient(24deg, rgba(0, 215, 232, 0.14), transparent 46%), + linear-gradient(90deg, rgba(8, 117, 141, 0.12), transparent var(--energy-progress)), var(--surface); } @@ -596,18 +498,16 @@ button[data-clicked="true"] { min-width: 0; min-height: 2.12rem; padding: 0; - border-color: rgba(6, 9, 16, 0.2); - background: var(--paper-soft); color: var(--muted); - font-weight: 840; + font-family: var(--font-mono); + font-weight: 820; font-variant-numeric: tabular-nums; } .energy-check button[aria-pressed="true"] { - border-color: var(--ink); - background: linear-gradient(180deg, rgba(255, 192, 24, 0.42), rgba(0, 215, 232, 0.16)); - color: var(--ink); - transform: translateY(-1px); + border-color: var(--apatite-800); + background: var(--apatite-100); + color: var(--apatite-950); } .energy-scale { @@ -619,7 +519,6 @@ button[data-clicked="true"] { padding-top: 1.1rem; color: var(--muted); font-size: 0.72rem; - font-weight: 780; text-align: center; } @@ -627,104 +526,91 @@ button[data-clicked="true"] { .energy-scale::after { content: ""; position: absolute; - inset: 0.18rem 0 auto; - height: 0.45rem; + top: 0.38rem; + left: 0; + height: 0.34rem; border-radius: 999px; } .energy-scale::before { - border: 1px solid rgba(6, 9, 16, 0.22); - background: rgba(255, 248, 236, 0.72); + width: 100%; + background: rgba(8, 117, 141, 0.11); } .energy-scale::after { width: var(--energy-progress); - background: linear-gradient(90deg, var(--taste-teal), var(--gold), var(--magenta)); - box-shadow: 0 7px 18px rgba(217, 167, 47, 0.18); - transition: width var(--motion-soft) var(--ease-out); -} - -.energy-scale span { - min-width: 0; - overflow-wrap: anywhere; -} - -.energy-scale span[data-selected] { - color: var(--ink); - font-weight: 880; + background: var(--apatite-700); } .energy-hint { - margin-top: 0.62rem; - font-size: 0.9rem; + margin-top: 0.6rem; + font-size: var(--step--1); } -.held-pile ul { - margin: 0.38rem 0 0; - padding-left: 1.12rem; -} - -.held-pile li + li { - margin-top: 0.25rem; +.tiny-checks button, +.dock-actions button, +.starter-row button { + background: var(--apatite-50); + color: var(--apatite-900); } .sr-only { position: absolute; width: 1px; height: 1px; + padding: 0; + margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; } -@media (max-width: 820px) { - .app-shell { - width: min(100vw - 1rem, 680px); - min-height: 100dvh; - padding: 0.62rem 0; +@media (max-width: 900px) { + :root { + --step-3: 1.65rem; } - .app-shell::before { - inset: 4.8rem auto auto -5rem; - width: 18rem; - height: 18rem; + .app-shell { + width: min(100% - 1rem, 760px); } - .chat-header { + .work-surface { grid-template-columns: 1fr; - min-height: auto; - } - - .chat-header::before { - width: 12rem; - } - - #provider { - max-width: 100%; - text-align: left; } - .demo-topbar { - align-items: flex-start; + .coach-dock { + max-height: none; } +} - .work-surface { - grid-template-columns: 1fr; +@media (max-width: 560px) { + .app-shell { + width: min(100% - 0.75rem, 760px); + padding: 0.75rem 0; } + .chat-header, + .chat-orientation, + .composer, + .starter-row, + .chat-log, .coach-dock { - overflow: visible; + padding-inline: 0.75rem; } - .turn { - max-width: 94%; + .composer-row, + .relief-topline { + grid-template-columns: 1fr; } - .composer-row { - grid-template-columns: auto minmax(0, 1fr) auto; + .icon-button, + button[type="submit"] { + width: 100%; } - .relief-topline { - grid-template-columns: 1fr; + .energy-check { + grid-template-columns: repeat(5, minmax(0, 1fr)); } } @@ -732,9 +618,7 @@ button[data-clicked="true"] { *, *::before, *::after { - animation-duration: 1ms !important; - animation-iteration-count: 1 !important; scroll-behavior: auto !important; - transition-duration: 1ms !important; + transition: none !important; } } diff --git a/EF-COACH/live-demo/scripts/build-hostinger-compose.mjs b/EF-COACH/live-demo/scripts/build-hostinger-compose.mjs index 0161958..c613e8d 100644 --- a/EF-COACH/live-demo/scripts/build-hostinger-compose.mjs +++ b/EF-COACH/live-demo/scripts/build-hostinger-compose.mjs @@ -18,7 +18,7 @@ const contextBase = process.env.UNSTUCK_CONTEXT_BASE || "https://unstuck.kyanite const outputPath = process.argv[2]; const routeRule = `Host(\`${host}\`) || (Host(\`${fallbackHost}\`) && PathPrefix(\`${pathPrefix}\`))`; -const liveHtml = String.raw`Unstuck

Unstuck

Unstuck

Mic

`; +const liveHtml = String.raw`Unstuck

Unstuck

Unstuck

Mic

`; const pageBr = brotliCompressSync(Buffer.from(liveHtml), { params: { [constants.BROTLI_PARAM_QUALITY]: constants.BROTLI_MAX_QUALITY }, }).toString("base64"); diff --git a/EF-COACH/live-demo/test/chat-ui.test.mjs b/EF-COACH/live-demo/test/chat-ui.test.mjs index b6980d8..3e57c1a 100644 --- a/EF-COACH/live-demo/test/chat-ui.test.mjs +++ b/EF-COACH/live-demo/test/chat-ui.test.mjs @@ -107,17 +107,20 @@ test("public demo includes a one-click energy check", () => { test("public demo uses the landing design language", () => { const css = readFileSync(new URL("../public/styles.css", import.meta.url), "utf8"); - assert.match(css, /--paper: #fff8ec/); - assert.match(css, /--ink: #060910/); - assert.match(css, /--gold: #ffc018/); - assert.match(css, /--magenta: #ff147f/); - assert.match(css, /body::after/); - assert.match(css, /border: 2px solid var\(--ink\)/); - assert.match(css, /linear-gradient\(145deg, rgba\(6, 9, 16, 0\.98\), rgba\(6, 67, 74, 0\.96\)\)/); - assert.match(css, /font-family: var\(--editorial\)/); + assert.match(css, /--paper: #f7f3ea/); + assert.match(css, /--ink: #101317/); + assert.match(css, /--apatite-700: #08758d/); + assert.match(css, /--apatite-50: #eaf8f7/); + assert.match(css, /--font-sans: "Atkinson Hyperlegible"/); + assert.match(css, /--measure: 66ch/); + assert.match(css, /body::before/); + assert.match(css, /button\[type="submit"\]/); + assert.match(css, /background: var\(--apatite-700\)/); assert.doesNotMatch(css, /\.coach-dock \{[\s\S]*?order: -1/); assert.doesNotMatch(css, /color-scheme: dark/); assert.doesNotMatch(css, /--bg: #0c0e0c/); assert.doesNotMatch(css, /#000\b/i); + assert.doesNotMatch(css, /--magenta|--cyan|--lime|--orange|--gold/); + assert.doesNotMatch(css, /font-family: var\(--editorial\)/); }); diff --git a/EF-COACH/live-demo/test/compose.test.mjs b/EF-COACH/live-demo/test/compose.test.mjs index 4cc30aa..77839cd 100644 --- a/EF-COACH/live-demo/test/compose.test.mjs +++ b/EF-COACH/live-demo/test/compose.test.mjs @@ -333,6 +333,24 @@ test("generated Hostinger demo presents a normal chat interface", () => { assert.doesNotMatch(page, /Optional context|Execution|Coach reply/); }); +test("generated Hostinger demo uses the Unstuck product design tokens", () => { + const result = spawnSync("node", ["live-demo/scripts/build-hostinger-compose.mjs"], { + cwd: new URL("../..", import.meta.url), + encoding: "utf8", + env: { + ...process.env, + UNSTUCK_LIVE_PROVIDER: "zai-coding-plan", + }, + }); + assert.equal(result.status, 0, result.stderr); + + const page = extractInlinePage(result.stdout); + assert.match(page, /#08758d/); + assert.match(page, /#064b5f/); + assert.match(page, /Atkinson Hyperlegible/); + assert.doesNotMatch(page, /#2f8e86|#d9a72f|Georgia|magenta|rainbow/i); +}); + test("generated Hostinger demo has parseable browser JavaScript", () => { const result = spawnSync("node", ["live-demo/scripts/build-hostinger-compose.mjs"], { cwd: new URL("../..", import.meta.url), diff --git a/EF-COACH/live-demo/test/server.test.mjs b/EF-COACH/live-demo/test/server.test.mjs index c0cf639..4967b11 100644 --- a/EF-COACH/live-demo/test/server.test.mjs +++ b/EF-COACH/live-demo/test/server.test.mjs @@ -22,7 +22,8 @@ test("GET routes serve the canonical landing site and chat demo", async (t) => { const landing = await fetch(`${baseUrl}/`); assert.equal(landing.status, 200); const landingHtml = await landing.text(); - assert.match(landingHtml, /Unstuck Coach \| Executive Function Accessibility Coach/); + assert.match(landingHtml, /Unstuck Coach \| Paste the stuck sentence/); + assert.match(landingHtml, /Paste the stuck sentence\./); assert.match(landingHtml, /href="https:\/\/unstuck\.kyanitelabs\.tech\/"/); assert.match(landingHtml, /href="https:\/\/unstuck\.kyanitelabs\.tech\/chat\/"/); assert.match(landing.headers.get("content-security-policy") || "", /connect-src 'self' https:\/\/puenteworks\.com/);