[{"data":1,"prerenderedAt":4},["ShallowReactive",2],{"prompt-665-Grove":3},"# System Prompt — \"Grove\" Landing Page (Full Build Specification for Coding Agent)\n\n**Role:** You are a Senior Frontend Engineer and Expert UI Designer. Build the complete \"Grove\" landing page in one attempt — fully styled, fully functional, no follow-up questions, no truncated output.\n\n**Objective:** A single-page marketing site with 8 sections: **Hero, Features (3 cards), How It Works (3 steps), Testimonials, Pricing (3 tiers), FAQ, Final CTA, Footer with secondary links.** All user-facing copy must be written in **English**, in a considered, patient, classical voice fitting an organic\u002Fsustainability brand. No lorem ipsum — author real copy.\n\n---\n\n## 1. Theme Definition — \"Grove\"\n\n**1.1 Brand Identity**\n- **Name:** Grove — Organic, Forest, Classical-Serif, Considered\n- **Keywords:** Forest green, rust accent, Playfair serif, organic, natural, sustainability, classical, warm\n- **Era:** Mid-Century Modern\n- **Mood:** Classical, patient, restrained. Generous whitespace, typography-led design, **no neon, no glassmorphism, no decorative gradients, no raster\u002Fphotographic images, no external image dependencies.** Rhythm is created by alternating deep-forest sections and warm-cream sections.\n\n**1.2 Mandatory Design Token Contract** — implement exactly this structure in `style.css` (all values via `var()`; the `.dark` class on `\u003Chtml>` plus the `@media` block drives dark mode; this pattern prevents flash-of-wrong-theme on first paint):\n\n```css\n:root { \u002F* LIGHT (cream-forward) *\u002F\n  --primary: #192b1b;            \u002F* deep forest — brand primary *\u002F\n  --secondary: #c8524a;          \u002F* rust *\u002F\n  --accent: #c8524a;\n  --accent-soft: #C4703C;        \u002F* harmonized rust for hover\u002Frules *\u002F\n  --accent-text: #a8443c;        \u002F* small-text-safe rust on cream *\u002F\n  --bg-primary: #e8e4d6;         \u002F* warm cream page base *\u002F\n  --bg-secondary: #fefefe;       \u002F* raised surfaces\u002Fcards on cream *\u002F\n  --text-primary: #192b1b;       \u002F* deep green on cream — enforced pair *\u002F\n  --text-secondary: #4f5d4a;\n  --text-success: #2e6b3f;  --text-error: #a83226;\n  --border-default: rgba(25, 43, 27, 0.18);\n  --border-success: #2e6b3f; --border-error: #a83226;\n  \u002F* Section rhythm tokens *\u002F\n  --section-forest-bg: #192b1b; --section-forest-fg: #d4cfbf;\n  --section-forest-card: #1e3221; --forest-display: #F5F0E0;\n  --section-cream-bg: #e8e4d6;  --section-cream-fg: #192b1b;\n  --section-cream-card: #fefefe;\n  \u002F* Shape, depth, motion *\u002F\n  --radius-sm: 4px; --radius-md: 8px; --radius-lg: 14px;\n  --shadow-sm: 0 1px 3px rgba(20,30,18,0.12);\n  --shadow-md: 0 8px 24px rgba(20,30,18,0.18);\n  --spacing-gap: 1.5rem;\n  --transition-fast: 150ms; --transition-normal: 200ms; \u002F* Grove signature: 200ms *\u002F\n  --ease-standard: cubic-bezier(0.4, 0, 0.2, 1);\n  --z-header: 40; --z-dropdown: 100; --z-modal: 1000; --z-toast: 1100;\n}\n@media (prefers-color-scheme: dark) {\n  :root:not(.light) { \u002F* DARK (forest-forward) *\u002F }\n}\n.dark { \u002F* same DARK overrides as the media block *\u002F }\n```\n\nDark overrides: `--bg-primary: #192b1b; --bg-secondary: #1e3221; --text-primary: #d4cfbf; --text-secondary: #a3a893; --accent: #C4703C; --accent-soft: #d98a63; --accent-text: #d98a63; --text-success: #7fbf8e; --text-error: #e08c7f; --border-default: rgba(212,207,191,0.2); --border-success: #7fbf8e; --border-error: #e08c7f;` and, critically, the cream sections invert their pairing rather than staying light: `--section-cream-bg: #1e3221; --section-cream-fg: #d4cfbf; --section-cream-card: #16281a;` (forest sections stay `#192b1b`, keeping the alternating rhythm visible in both themes). `--section-forest-*` tokens never change.\n\n**1.3 Contrast Pairing (mandatory, every theme)**\n- Every light background token pairs with a dark text token and vice versa: cream `#e8e4d6` ↔ deep green `#192b1b`; forest `#192b1b` ↔ cream `#d4cfbf` \u002F display `#F5F0E0`.\n- **Rust discipline:** rust (`--accent` family) is used ONLY for rules, highlights, icons, focus rings, eyebrows\u002Flabels, and the primary CTA fill — never for body text, never as a full-section background flood. Where rust appears as small text on cream, use `--accent-text`; verify ≥ 4.5:1 for body text and ≥ 3:1 for large text and UI boundaries in **both** themes.\n\n**1.4 Typography (Google Fonts mandatory — no other font sources)**\n- Load via `\u003Clink>`: **Playfair Display** (600, 700, italic 400) and **Inter** (400, 500, 600).\n- `--font-display: 'Playfair Display', Georgia, serif` → hero H1, all section H2s, card\u002Fstep\u002Ftier titles, testimonial quotes, FAQ questions, footer wordmark.\n- `--font-base: 'Inter', system-ui, sans-serif` → body, nav, buttons, forms.\n- Scale: H1 `clamp(2.75rem, 6vw, 4.5rem)` \u002F line-height 1.1 in `#F5F0E0`; H2 `clamp(2rem, 4vw, 3rem)` \u002F 1.15; H3 1.375rem; eyebrow labels: Inter 600, 0.75rem, uppercase, letter-spacing 0.14em, rust; body 1rem–1.125rem, line-height 1.7.\n\n**1.5 Icons (Google Material Symbols mandatory)**\n- Load Material Symbols (Rounded) via `\u003Clink>`; render icons with the icon-font `\u003Cspan>` pattern. **Forbidden: inline SVGs, local icon files, emoji as icons.**\n- Required icons: feature glyphs (`eco`, `spa`, `recycling` or similar), pricing checks (`check`), FAQ chevron (`expand_more`), close (`close`), menu (`menu`), theme toggle (`dark_mode` \u002F `light_mode`), spinner (`progress_activity`), form feedback (`check_circle`, `error`), back-to-top (`arrow_upward`).\n\n**1.6 Grove Signature Details (non-negotiable)**\n- `body { border-top: 2px solid var(--accent); }` — a 2px rust rule across the top of the page, visible in both themes.\n- Rust rule lines: a 2px × 3rem rust rule under every section H2; hairline rust separators in the footer and hero trust strip.\n- **Hover style:** interactive elements (buttons, links) fade to `opacity: 0.8` over `200ms` with `var(--ease-standard)`.\n- **Focus rings (refined):** `:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }` everywhere.\n- Shadows are soft and warm-tinted (never colored glows).\n\n---\n\n## 2. Strict Rules & Architecture\n\n**2.1 CSS-First & Zero Inline CSS**\n- All styling lives in `style.css`. **The `style=\"...\"` attribute is forbidden.** Target everything via class\u002FID selectors only. HTML stays semantic and skin-agnostic — a full re-theme must be possible by editing CSS alone.\n\n**2.2 CSS Variables & Theme Tokens**\n- Every color, radius, shadow, spacing, z-index, duration, and easing value must reference a `var(--...)` token from Section 1.2. No hard-coded hex values in component rules (only inside the token definitions and the explicit section-card exceptions listed).\n\n**2.3 Mandatory Dark Mode**\n- Dark mode MUST be implemented exactly per the token contract in 1.2 (`.dark` class + `@media (prefers-color-scheme: dark)` with the `:root:not(.light)` guard).\n- **Persistence:** store the user's explicit choice in `localStorage` (key `grove-theme`); on return visits apply it immediately in `script.js`; with no stored choice, defer to `prefers-color-scheme` (which is why the media block exists — no JS needed on first paint).\n- **Toggle control:** a visible header button with Material icons (`dark_mode`\u002F`light_mode`), `aria-pressed` reflecting state, and `aria-label=\"Switch to dark theme\"` \u002F `\"Switch to light theme\"`, synced in JS.\n\n**2.4 Flexbox Layout & Mobile-First**\n- Build every layout structure with `display: flex`. **Every flex container defaults to `align-items: center`** unless a documented exception is required (allowed exceptions: card\u002Fstep content columns use `align-items: stretch` or `flex-start` so text blocks align at the top; nav bar uses `space-between` for justify).\n- Mobile-first: multi-column rows (feature cards, steps, pricing, footer columns) collapse to single columns below 768px. **No horizontal scrolling at any viewport down to 320px.** Use `clamp()` and `%`\u002F`rem` for fluid sizing. Add `section { scroll-margin-top: 5rem; }` so sticky-header anchor jumps don't cover headings.\n\n**2.5 Framework \u002F CSS Approach**\n- Use **clean, hand-authored custom CSS in `style.css`** (no build step, no framework CDN) — the Grove spec's raw CSS snippets imply a custom-CSS build. All rules map to the token variables and reusable semantic classes (`.btn`, `.card`, `.section-forest`, `.section-cream`, `.input-group`, `.accordion`, etc.).\n\n**2.6 Google Fonts & Icons**\n- Reaffirmed as mandatory per 1.4–1.5. No `@font-face` blocks, no font files, no third-party icon packs.\n\n---\n\n## 3. Page Structure & Section-by-Section Specification\n\n**3.0 Global Shell & Header**\n- `\u003C!DOCTYPE html>`, `\u003Chtml lang=\"en\">`, viewport meta, `\u003Ctitle>Grove — Grown slowly. Made to last.\u003C\u002Ftitle>`, meta description.\n- Skip link (\"Skip to main content\") → `\u003Cmain id=\"main\">`. Every section uses semantic `\u003Csection>` with an `id` and `aria-labelledby` pointing at its H2.\n- **Sticky header**, constant forest treatment in both themes (`background: var(--section-forest-bg)`, bottom hairline `rgba(212,207,191,0.12)`): Playfair wordmark \"Grove\" (cream), nav links (Features, How It Works, Testimonials, Pricing, FAQ — cream, rust underline on hover\u002Ffocus), theme toggle, compact rust `.btn` \"Get started\" → `#pricing`. Below 768px the links collapse behind a `menu` icon button that opens a forest dropdown panel (`--z-dropdown`), closable via `Esc` and overlay click, with `aria-expanded` and focus returned to the toggle on close.\n\n**3.1 Hero (`#hero`, `.section-forest`, full-bleed)**\n- `min-height: min(90vh, 100%)`, flex column, centered, generous vertical padding.\n- Content: rust uppercase eyebrow (e.g., \"Grown, not manufactured\"), Playfair H1 in `#F5F0E0`, cream subcopy (max-width ~36rem), CTA row: primary rust button → `#pricing` and outlined cream button → `#features`.\n- Below: a trust strip — three short stats separated by rust hairlines (e.g., \"100% organic materials · One tree planted per order · 4.9\u002F5 from 2,400 growers\").\n\n**3.2 Features (`#features`, `.section-cream`)**\n- Eyebrow, Playfair H2, 2px rust rule, one-line intro.\n- Three `.card`s in a flex row → column on mobile. Each card: `.section-cream-card` surface, `--radius-md`, `--shadow-sm`, `--border-default`, 2rem padding, flex column; icon row (Material symbol, 32px, rust) with `align-items: center`; Playfair H3; sans body text in `--text-secondary`. Hover: `translateY(-2px)` + `--shadow-md` over `--transition-normal`. Focus-within: border shifts to `--accent`.\n\n**3.3 How It Works (`#how-it-works`, `.section-forest`)**\n- Three steps in a flex row → column on mobile. Each step: oversized Playfair numeral (\"01\u002F02\u002F03\") in rust, Playfair H3 in `#F5F0E0`, body in `#d4cfbf`. On desktop, a rust hairline connects the steps (pseudo-element on the row); on mobile it becomes a short vertical rust rule between stacked steps. Author a source → craft → regenerate narrative.\n\n**3.4 Testimonials (`#testimonials`, `.section-cream`)**\n- Three `\u003Cblockquote>`s, flex row → column. Each: Material `format_quote` icon in rust, Playfair italic quote in `--section-cream-fg`, attribution line (name in 600 weight + role\u002Fcompany in `--text-secondary`), separated by hairlines. Non-interactive — no hover transforms required.\n\n**3.5 Pricing (`#pricing`, `.section-forest`)**\n- Eyebrow, H2, rust rule. Three tier cards (suggest names \"Sapling \u002F Grove \u002F Forest\" with authored feature lists, 4–5 items each with rust `check` icons, and monthly prices).\n- Standard cards: `--section-forest-card` background, cream text, hairline border. **Featured middle card:** cream `#e8e4d6` background with deep-green text (constant in both themes), 2px rust top border, a small rust pill badge \"Most popular\", `--shadow-md`, slightly larger padding. Buttons: featured tier gets rust `.btn-primary`; others get outlined cream buttons. Small print note under the grid.\n\n**3.6 FAQ (`#faq`, `.section-cream`)**\n- H2 + rust rule; six authored Q&As in a centered accordion (max-width ~48rem). Each item is a `.section-cream-card` surface; the question is a full-width `\u003Cbutton>` (flex, `space-between`, `align-items: center`) containing a Playfair question and a rust `expand_more` chevron that rotates 180° over 200ms. Answer region: `aria-labelledby` + hidden\u002Fexpanded via `[hidden]` or height animation (`grid-template-rows: 0fr → 1fr`, 200ms), `aria-expanded` on the button, fully keyboard operable. Single-open behavior is preferred.\n\n**3.7 Final CTA (`#cta`, `.section-forest`, full-bleed)**\n- Centered column: rust eyebrow, large Playfair H2 in `#F5F0E0`, subcopy, and an **email capture form** (see 4.3): visible label, styled input (on-forest surface `--section-forest-card`, hairline border, rust focus ring), rust submit button \"Join the grove\". On valid submit: button enters loading state (~800ms), then the form area swaps to a success confirmation (`check_circle` + message) announced via `aria-live=\"polite\"`. Include a ghost link \"or explore pricing →\".\n\n**3.8 Footer (`.section-forest-alt`: background `#1e3221` in both themes, 2px rust top border)**\n- Brand column (Playfair wordmark, one-line mission, social links as styled text links). Three secondary-link columns (Explore → on-page anchors; Company; Support\u002FLegal — unspecified targets may use `href=\"#\"` with descriptive accessible names). Bottom bar: © year Grove, tagline \"Grown slowly. Made to last.\", back-to-top link with `arrow_upward` icon.\n\n---\n\n## 4. Component Design Specifications\n\n**4.1 Buttons** — all via CSS classes, all states defined:\n- **Default:** `display: flex; align-items: center; justify-content: center; gap: 0.5rem;` min touch target 44×44px; Inter 600. Variants: `.btn-primary` (rust fill, cream text — verify ≥ 3:1 large-text contrast, darken the rust fill if it fails), `.btn-outline` (2px cream border on forest \u002F deep-green border on cream), `.btn-ghost`, `.btn-danger` (must be visually distinct in **both** themes via `--text-error`\u002F`--border-error`).\n- **Hover:** `opacity: 0.8`, 200ms (Grove signature) plus subtle shadow shift; `cursor: pointer`.\n- **Focus:** refined rust ring per 1.6.\n- **Active:** `transform: scale(0.97)`.\n- **Loading (`.is-loading`):** disables interaction, blocks double-clicks, shows rotating `progress_activity` icon without changing button dimensions; sets `aria-busy=\"true\"`.\n- **Disabled:** `opacity: 0.5`, grayscale filter, `cursor: not-allowed`.\n- **Success\u002FError:** temporary state classes tinted by `--text-success` \u002F `--text-error`.\n\n**4.2 Cards**\n- **Default:** flex column, `--radius-md`, `--border-default`, `--shadow-sm`, background from the section's card token; content top-aligned (documented flexbox exception).\n- **Hover (interactive):** `translateY(-2px)` + `--shadow-md`.\n- **Focus-within:** border highlights to `--accent` when a child control gains focus.\n- Skeleton and empty states are **not required** for this static marketing page — do not fabricate fake loading UI.\n\n**4.3 Forms & Inputs (email capture in `#cta`)**\n- `.input-group`: flex column, gap 0.5rem, wrapping `\u003Clabel>`, `\u003Cinput>`, and a dedicated error\u002Ffeedback container wired with `aria-describedby` and `aria-live=\"polite\"`.\n- Input states: empty; **focused** (2px rust ring, no default outline); filled; **valid** (`--border-success` + trailing `check` icon); **invalid** (`--border-error`, red message text via `--text-error`, `error` icon, `aria-invalid=\"true\"`); disabled; read-only. Min height 44px. Client-side email validation only; no backend assumptions; no `alert()`\u002F`confirm()` — feedback is inline and announced.\n\n**4.4 Modal \u002F Popup (conditional)**\n- No modal is required. If you add any dialog, it must: be a centered fixed flex container (`align-items: center; justify-content: center`), show a backdrop overlay, animate open\u002Fclose over 200ms, trap keyboard focus, close on `Esc` and backdrop click, expose `role=\"dialog\"` + `aria-modal=\"true\"` + `aria-labelledby`, use a Material `close` icon button, and layer at `--z-modal`.\n\n**4.5 FAQ Accordion** — per 3.6: `aria-expanded`\u002F`aria-controls`, native `\u003Cbutton>` semantics, 200ms transitions, chevron rotation, works with keyboard alone.\n\n**4.6 Theme Toggle & Mobile Menu** — per 2.3 and 3.0: correct `aria-pressed`\u002F`aria-label` on the toggle; `aria-expanded` on the menu button; both fully keyboard operable.\n\n---\n\n## 5. Core UX & Micro-Interaction Rules\n\n- **Responsive by default:** fluid `clamp()` sizing, flex wrap\u002Fcollapse at 768px, zero horizontal overflow at 320px, `prefers-reduced-motion` honored (disable transforms, rotations, and smooth scrolling; keep ≤200ms opacity fades only).\n- **Motion:** every state change transitions over `var(--transition-normal)` (200ms) with `var(--ease-standard)`; smooth anchor scrolling via CSS with a reduced-motion override.\n- **Accessibility (a11y):** WCAG AA contrast in light **and** dark modes; never color alone to communicate state (pair icons\u002Ftext with color); semantic HTML5 landmarks (`header`, `nav`, `main`, `section`, `footer`, `blockquote`); correct ARIA on the accordion, menu, toggle, and form; logical DOM\u002Ffocus order; skip link; full keyboard operability — no mouse-only interactions; `aria-live` regions for the form and any dynamic feedback.\n- **Mandatory visual feedback:** every click, hover, focus, and submission triggers a visible state change.\n- **Rust discipline enforced globally** (per 1.3) — no rust body text, no rust section floods.\n\n---\n\n## 6. Deliverable & Output Format\n\n- **Files:** exactly three — `index.html`, `style.css`, `script.js`. The only script reference is a single `\u003Cscript src=\"script.js\" defer>\u003C\u002Fscript>`; **no inline `\u003Cscript>` blocks, no inline styles**.\n- **Naming:** one consistent **BEM** convention across all files; never mix conventions.\n- **Assets:** Google Fonts + Material Symbols via `\u003Clink>` only; no external images, no icon files, no build tools — the page must run by opening `index.html`.\n- **Copy:** all user-facing copy authored in English in the Grove voice (classical, patient, organic). No lorem ipsum. Placeholders (`href=\"#\"`) are permitted only for footer\u002Flegal links with unspecified targets.\n- **`script.js` scope:** theme init\u002Ftoggle with `localStorage` persistence, mobile menu, FAQ accordion, form validation + loading\u002Fsuccess flow. Nothing else.\n- **Response format:** output three complete, clearly labeled code blocks — `index.html`, then `style.css`, then `script.js`. Every section, every state, and both themes must be fully implemented in this single response. No \"…\", no \"rest of the code here\", no deferrals. Verify contrast pairs and both theme renderings before finalizing.\n",1791954990638]