diff --git a/PRODUCT.md b/PRODUCT.md index 932cdf2..7179ef4 100644 --- a/PRODUCT.md +++ b/PRODUCT.md @@ -23,9 +23,9 @@ Mastermind — separate free, open-source planning/orchestration product ## Public website contract -Canonical routes are `/`, `/evermind`, `/nevermind`, `/mastermind`, `/docs`, `/contact`, `/privacy`, and `/terms`. This cinematic visual contract applies to the first four routes only. The remaining public routes retain their existing page-specific presentation and legal substance; do not redesign them as part of the cinematic release. +Canonical routes are `/`, `/evermind`, `/nevermind`, `/mastermind`, `/docs`, `/contact`, `/privacy`, and `/terms`. The first four routes use one shared, scroll-driven cinematic template with one full-width navigation, two narrative sections, an intentional 80vh transition spacer, Golos Text display headings, and no footer. The utility routes `/docs`, `/contact`, `/privacy`, and `/terms` use the quieter static cinematic utility shell with one navigation, readable content, and no footer; legal-page meaning remains unchanged. -The home page product sentence is: “Evermind remembers. Nevermind brings context. Mastermind directs the work.” Preserve the distinct product roles and use accurate route-specific calls to action. +The homepage lead is: “A human-owned system for AI work — from memory to context to controlled execution.” The product-sequence line is: “Evermind remembers. Nevermind brings context. Mastermind directs the work.” Preserve the distinct product roles and use accurate route-specific calls to action. Current implementation and release evidence live in `docs/implementation-plan.md`, `docs/roadmap.md`, and `docs/repo-status.md`; older design/strategy briefs are historical unless those active documents explicitly adopt them. ## Copy and claim boundaries diff --git a/README.md b/README.md index 99cd653..95bfb4f 100644 --- a/README.md +++ b/README.md @@ -67,13 +67,10 @@ Use these docs for website implementation only: 5. `docs/design/` — design principles, visual language, product visual library, copy-to-visual mapping, motion storyboards, design-lab rules, and component contracts. 6. `docs/platform/` — page architecture, responsive strategy, accessibility strategy, and performance strategy. 7. `docs/migration/` — foundational legacy sweep, migration matrix, and content, route, component, style, motion, asset, and dependency audits. -8. `docs/homepage-design-spec.md` — central homepage design brief and closed decisions. -9. `docs/homepage-visual-storyboard.md` and `docs/homepage-example-data.md` — visual states and sanitized prototype content. -10. `docs/homepage-technical-design.md` and `docs/homepage-design-orchestration.md` — historical build-planning evidence; check current source before relying on details. -11. `docs/homepage-validation-plan.md` — visual, motion, accessibility, performance, and release gates. -12. `docs/roadmap.md` — canonical 15-phase public-platform roadmap and continuous-governance status. -13. `docs/implementation-plan.md` — dependency-gated implementation tasks with validation, rollback, and commit boundaries. -14. `docs/auth-status.md`, `docs/deployment.md`, `docs/content-platform.md`, and related implementation docs — runtime and deployment facts. +8. `docs/homepage-validation-plan.md` — active visual, motion, accessibility, performance, and release checks. +9. `docs/implementation-plan.md` and `docs/roadmap.md` — current website implementation status and active follow-up. +10. `docs/homepage-design-spec.md`, `docs/homepage-visual-storyboard.md`, `docs/homepage-example-data.md`, `docs/homepage-technical-design.md`, and `docs/homepage-design-orchestration.md` — historical/pre-build evidence; check current source before relying on details. +11. `docs/auth-status.md`, `docs/deployment.md`, `docs/content-platform.md`, and related implementation docs — runtime and deployment facts. ## Architecture overview diff --git a/docs/ai-guidelines.md b/docs/ai-guidelines.md index f08b4b7..0c7ed58 100644 --- a/docs/ai-guidelines.md +++ b/docs/ai-guidelines.md @@ -4,11 +4,11 @@ These rules describe how AI-assisted development and internal automation may int ## Current product boundary -The canonical public products are Memory, Memory for QA, and Workbench. The public site also exposes Docs, Contact, Privacy, and Terms. +Evermind and Nevermind are the connected Infinite Brain product system; Mastermind is a separate ProChat product. ProChat Memory for QA is paused/historical. The public site also exposes Docs, Contact, Privacy, and Terms. Retired Kits, ProChat OS, AI Workflows, Studio, Proof, Prompts, generated Docs, checkout/licensing, and MailerLite systems are historical only. Do not restore them because older docs or Git history mention them. -BuildFlow may appear only where a technical/internal compatibility identifier is required by Workbench implementation contracts. +BuildFlow may appear only where a technical/internal compatibility identifier is required by Mastermind implementation contracts. ## Repository safety diff --git a/docs/archive/retired-systems/github-entitlements.md b/docs/archive/retired-systems/github-entitlements.md index b3f23a2..9bec9cc 100644 --- a/docs/archive/retired-systems/github-entitlements.md +++ b/docs/archive/retired-systems/github-entitlements.md @@ -96,7 +96,7 @@ The entitlement state is therefore spread across: ## Required environment variables -The env contract lives in [environment.md](/Users/Office/Repos/Organisation/ProChat/Web/prochat/docs-public/environment.md). +The env contract lives in [environment.md](../../../docs-public/environment.md). GitHub App-specific values: @@ -120,6 +120,6 @@ This doc should not be read as a generic entitlement framework. It documents the ## Related references -- [integrations.md](/Users/Office/Repos/Organisation/ProChat/Web/prochat/docs/integrations.md) -- [environment.md](/Users/Office/Repos/Organisation/ProChat/Web/prochat/docs-public/environment.md) -- [production-lifecycle.md](/Users/Office/Repos/Organisation/ProChat/Web/prochat/docs/production-lifecycle.md) +- [integrations.md](../../integrations.md) +- [environment.md](../../../docs-public/environment.md) +- [production-lifecycle.md](../../production-lifecycle.md) diff --git a/docs/archive/retired-systems/mailerlite-funnel.md b/docs/archive/retired-systems/mailerlite-funnel.md index f413b71..efc0adf 100644 --- a/docs/archive/retired-systems/mailerlite-funnel.md +++ b/docs/archive/retired-systems/mailerlite-funnel.md @@ -28,7 +28,7 @@ Current behavior: ## Environment variables -Canonical env documentation lives in [environment.md](/Users/Office/Repos/Organisation/ProChat/Web/prochat/docs-public/environment.md). +Canonical env documentation lives in [environment.md](../../../docs-public/environment.md). Current values used by the route (required): @@ -70,6 +70,6 @@ The route does not currently store subscriber records in Prisma. ## Related references -- [integrations.md](/Users/Office/Repos/Organisation/ProChat/Web/prochat/docs/integrations.md) -- [environment.md](/Users/Office/Repos/Organisation/ProChat/Web/prochat/docs-public/environment.md) -- [content-platform.md](/Users/Office/Repos/Organisation/ProChat/Web/prochat/docs/content-platform.md) +- [integrations.md](../../integrations.md) +- [environment.md](../../../docs-public/environment.md) +- [content-platform.md](../../content-platform.md) diff --git a/docs/automation-routes.md b/docs/automation-routes.md index 8bf2b88..788e8c6 100644 --- a/docs/automation-routes.md +++ b/docs/automation-routes.md @@ -155,6 +155,6 @@ Required env: ## Related references -- [integrations.md](/Users/Office/Repos/Organisation/ProChat/Web/prochat/docs/integrations.md) -- [environment.md](/Users/Office/Repos/Organisation/ProChat/Web/prochat/docs-public/environment.md) -- [development.md](/Users/Office/Repos/Organisation/ProChat/Web/prochat/docs/development.md) +- [integrations.md](integrations.md) +- [environment.md](../docs-public/environment.md) +- [development.md](development.md) diff --git a/docs/content-platform.md b/docs/content-platform.md index e6ef24e..a21c4ff 100644 --- a/docs/content-platform.md +++ b/docs/content-platform.md @@ -7,9 +7,9 @@ This document describes the current root-domain public content and SEO contract. The active canonical public surface is intentionally small: - `/` -- `/memory` -- `/memory-qa` -- `/workbench` +- `/evermind` +- `/nevermind` +- `/mastermind` - `/docs` - `/contact` - `/privacy` @@ -19,7 +19,7 @@ The root sitemap emits only those eight routes. ## Documentation -The active `/docs` route is a repository-oriented hub for Memory for QA and Workbench. It links readers to repository documentation, issues, and beta/contact paths. +The active `/docs` route is a reading-friendly hub for Evermind, Nevermind, and Mastermind. It links readers to product routes and contact; canonical product documentation remains with the relevant repositories. The former generated public documentation system is retired. In particular: @@ -45,11 +45,11 @@ Current SEO behavior is deliberately bounded: - compatibility aliases redirect into canonical public routes rather than publishing duplicate bodies - retired product/content routes are not emitted by the sitemap -Structured data and page metadata should describe only active Memory, Memory for QA, Workbench, Docs, Contact, and legal surfaces. +Structured data and page metadata should describe only active Evermind, Nevermind, Mastermind, Docs, Contact, and legal surfaces. ## Compatibility boundaries -Some historical URLs remain only as redirect compatibility, including BuildFlow / ProChat OS aliases to Workbench, Learn aliases to Docs, legal aliases to the current Privacy/Terms pages, and waitlist aliases into the Memory for QA beta contact flow. +Some historical URLs remain only as redirect compatibility, including BuildFlow / ProChat OS aliases to Mastermind, Learn aliases to Docs, legal aliases to the current Privacy/Terms pages, and retired waitlist aliases into Contact. Compatibility routes must not restore retired product bodies or duplicate canonical content. diff --git a/docs/design-system.md b/docs/design-system.md index cd5d36d..91df2dd 100644 --- a/docs/design-system.md +++ b/docs/design-system.md @@ -1,11 +1,13 @@ # ProChat Design-System Implementation Bridge -**Status:** repository-local implementation guidance +**Status:** historical design-system migration guidance **Canonical design truth:** `DESIGN.md` and `brand-spec.md` **Canonical strategy and company design:** Mind This file explains how the approved ProChat design system should be introduced into the existing website repository. +> This migration plan predates the current cinematic and utility route systems. Its planned token files, GSAP direction, and migration sequence are not current implementation facts. For the live route contract and stylesheet ownership, use `docs/overview.md`, `docs/implementation-plan.md`, and `docs/homepage-validation-plan.md`. + Existing tokens, themes, gradients, fonts, hero components, and page-specific styles remain implementation inventory. They are not canonical design authority and must not be extended by default. ## Required reading order diff --git a/docs/design/MOTION_STORYBOARD.md b/docs/design/MOTION_STORYBOARD.md index 50ca1de..900545f 100644 --- a/docs/design/MOTION_STORYBOARD.md +++ b/docs/design/MOTION_STORYBOARD.md @@ -1,9 +1,9 @@ # ProChat Motion Storyboard -**Status:** canonical motion planning document +**Status:** historical pre-build motion planning document **Authority:** `docs/homepage-visual-storyboard.md`, `DESIGN.md` -> Historical pre-cinematic storyboard. Its Memory/QA-specific sequences are not the current public route specification. Current routes `/`, `/evermind`, `/nevermind`, and `/mastermind` share two full-viewport sections, an intentional 80vh empty spacer, and one scroll-driven cinematic media layer. Other public routes are outside this visual redesign. See `docs/homepage-validation-plan.md` and `docs/implementation-plan.md` for active behavior and evidence. +> Historical pre-build storyboard. Its Memory/QA-specific sequences are not the current public route specification. Current routes `/`, `/evermind`, `/nevermind`, and `/mastermind` share three ordered product stages, one scroll-driven cinematic media layer, and shared geometry. `/docs`, `/contact`, `/privacy`, and `/terms` use the static utility shell; legal body copy remains unchanged. See `docs/homepage-validation-plan.md` and `docs/implementation-plan.md` for active behavior and evidence. ## Purpose diff --git a/docs/development.md b/docs/development.md index b433fe9..03b6f35 100644 --- a/docs/development.md +++ b/docs/development.md @@ -27,9 +27,9 @@ npm run build The active public website is exactly: - `/` -- `/memory` -- `/memory-qa` -- `/workbench` +- `/evermind` +- `/nevermind` +- `/mastermind` - `/docs` - `/contact` - `/privacy` @@ -39,7 +39,7 @@ Compatibility aliases may redirect into those routes, but new public work should ## Documentation workflow -Internal repository documentation lives under `docs/` and `docs-public/`. The active public `/docs` page is a lean repository hub for Memory for QA and Workbench. +Internal repository documentation lives under `docs/` and `docs-public/`. The active public `/docs` page is a reading-friendly hub for Evermind, Nevermind, and Mastermind, presented in the shared static utility shell. Contact and legal routes use that shell too; legal body text remains unchanged. The former Nextra/generated `src/content/docs` + `scripts/docs` pipeline is retired. diff --git a/docs/docs-automation.md b/docs/docs-automation.md index a7c1fe9..3898506 100644 --- a/docs/docs-automation.md +++ b/docs/docs-automation.md @@ -15,7 +15,7 @@ The cleanup removed the generated documentation system, including: ## Current documentation model -The active public documentation surface is the lean `/docs` repository hub for Memory for QA and Workbench. Canonical product documentation should live with the relevant repositories and be linked from that hub. +The active public documentation surface is a reading-friendly `/docs` hub for Evermind, Nevermind, and Mastermind. Canonical product documentation should live with the relevant repositories and be linked from that hub. Internal repository documentation remains under `docs/` and `docs-public/` as appropriate. diff --git a/docs/getting-started.md b/docs/getting-started.md index c269518..9aeb80f 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -29,9 +29,9 @@ The default local port is `3056` unless overridden by `PORT`. Canonical public routes: - `/` -- `/memory` -- `/memory-qa` -- `/workbench` +- `/evermind` +- `/nevermind` +- `/mastermind` - `/docs` - `/contact` - `/privacy` diff --git a/docs/homepage-design-orchestration.md b/docs/homepage-design-orchestration.md index 5641af3..e3632ea 100644 --- a/docs/homepage-design-orchestration.md +++ b/docs/homepage-design-orchestration.md @@ -1,9 +1,11 @@ # ProChat Homepage Design Orchestration -**Status:** approved pre-build workflow +**Status:** historical pre-build workflow **Source skills:** Brain `ai/skills` **Scope:** design research, specification, prototyping, implementation, review, and polish +> This workflow is retained as historical planning evidence, not as current release authority. Follow the active source and validation references in `docs/overview.md`, `docs/implementation-plan.md`, and `docs/homepage-validation-plan.md`. + This document defines how GPT-5.6 Sol uses the Brain design skills across research, specification, prototyping, implementation, review, and polish. It prevents duplicated design authority, conflicting methods, and unstructured execution. ## Operating principle diff --git a/docs/homepage-design-spec.md b/docs/homepage-design-spec.md index 1030be7..d5559ea 100644 --- a/docs/homepage-design-spec.md +++ b/docs/homepage-design-spec.md @@ -1,13 +1,15 @@ # ProChat Homepage Design Specification -**Status:** approved pre-build design brief +**Status:** superseded pre-build design brief; retained as historical evidence **Canonical copy:** Mind `canonical-homepage-copy.md` **Design system:** `DESIGN.md` and `brand-spec.md` **Visual specification:** `docs/homepage-visual-storyboard.md` **Technical architecture:** `docs/homepage-technical-design.md` **Skill workflow:** `docs/homepage-design-orchestration.md` -This is the central repository-local brief for the ProChat homepage. It explains what must be designed, why it matters, and which decisions are already closed. +> This specification describes the retired Memory-first/Memory-for-QA/Workbench homepage direction. It is not current product, copy, route, or acceptance authority. Current direction is defined by Mind and the shipped implementation; use `docs/homepage-validation-plan.md`, `docs/implementation-plan.md`, and `docs/roadmap.md` for current website state. + +This document preserves the original pre-build design rationale and closed decisions for historical reference only. ## Objective diff --git a/docs/homepage-technical-design.md b/docs/homepage-technical-design.md index 1d04e58..11d1a76 100644 --- a/docs/homepage-technical-design.md +++ b/docs/homepage-technical-design.md @@ -1,9 +1,11 @@ # ProChat Homepage Technical Design -**Status:** approved pre-build architecture +**Status:** superseded pre-build architecture; retained as historical evidence **Scope:** homepage design system, prototypes, implementation, motion, validation, and production hardening **Does not authorize:** production homepage implementation before prototype and plan-review gates pass +> This was a pre-build plan and does not describe the current renderer or authorize further implementation. Current source and acceptance authority are `docs/implementation-plan.md`, `docs/homepage-validation-plan.md`, and `docs/roadmap.md`. + ## Current repository stack Verified current stack: diff --git a/docs/homepage-validation-plan.md b/docs/homepage-validation-plan.md index 7e61425..0e7b3ee 100644 --- a/docs/homepage-validation-plan.md +++ b/docs/homepage-validation-plan.md @@ -1,7 +1,7 @@ # ProChat public-site validation plan **Status:** current validation contract for the cinematic public website -**Applies visually to:** `/`, `/evermind`, `/nevermind`, and `/mastermind`. Other canonical routes are regression-only. +**Applies visually to:** `/`, `/evermind`, `/nevermind`, `/mastermind`, `/contact`, and `/docs`. `/privacy` and `/terms` share the static utility shell; their legal body meaning remains outside visual copy changes. Product truth comes from `mind/organizations/prochat/brand/`; implementation state comes from current source and `docs/implementation-plan.md`. Older homepage/page-architecture plans are historical unless explicitly reconciled. @@ -10,7 +10,7 @@ Product truth comes from `mind/organizations/prochat/brand/`; implementation sta - Evermind is free, open-source, human-owned memory; Nevermind is its paid capability/convenience layer; Mastermind is a separate free planning/orchestration product. - ProChat Memory for QA is paused/historical, not a current public product. - Home communicates the product family accurately; each product route explains its own role and CTA destination. -- Product identities on the four cinematic routes match Mind; do not change Contact/Docs copy or navigation in this release. +- Product identities on all active routes match Mind. Contact and Docs use Evermind/Nevermind/Mastermind terminology; legal shell changes must not rewrite legal body copy. - Claims about privacy, security, integrations, pricing, availability, and outcomes match Mind and verified implementation. Privacy/Terms meaning must not be changed by a shell migration. ## Shared cinematic-page checks @@ -23,7 +23,7 @@ For `/`, `/evermind`, `/nevermind`, and `/mastermind` verify: - shared route data changes copy without changing geometry or visual system; - capability display is one translucent glass panel, with background media visibly present through it; - media visibly scrubs with scroll, forward and reverse; adjacent frames blend and renderer handoffs stay continuously painted; -- two stages activate in reading order, without text overlap or jarring chapter jumps; +- the Evermind / Memory, Nevermind / Context, and Mastermind / Execution stages activate in reading order, without text overlap or jarring chapter jumps; - every CTA is usable and remains on one line without clipping. ## Responsive and motion matrix @@ -32,6 +32,10 @@ Check widths `1440`, `1280`, `1024`, `768`, `430`, `390`, and `360` pixels. Revi Under `prefers-reduced-motion: reduce`, verify all stages and links remain available, no scroll scrubbing occurs, media freezes to one stable poster/frame, video and canvas are not visibly duplicated, and layout geometry remains understandable. Include a reduced-motion desktop screenshot. +## Static utility shell + +For `/contact`, `/docs`, `/privacy`, and `/terms`, verify one transparent full-width navigation, no legacy footer or dark capsule, no video/canvas animation, Golos Text display headings, no horizontal overflow, and readable glass surfaces. Verify Contact submission and mobile navigation; verify Docs content remains readable at desktop, laptop, tablet, and mobile widths. Privacy and Terms body copy must remain semantically unchanged. + ## Accessibility, performance, and runtime - Keyboard, focus-visible, accessible names/landmarks, form labels/errors, and target sizes pass. diff --git a/docs/implementation-plan.md b/docs/implementation-plan.md index 8025ae0..b908868 100644 --- a/docs/implementation-plan.md +++ b/docs/implementation-plan.md @@ -1,6 +1,6 @@ # ProChat website implementation plan -Status: cinematic/site quality implementation and release validation in progress. +Status: cinematic renderer, utility shell, and local validation complete; commit/push and production release remain pending. Last reviewed: 2026-09-29. @@ -8,32 +8,37 @@ Last reviewed: 2026-09-29. Canonical public routes: `/`, `/evermind`, `/nevermind`, `/mastermind`, `/docs`, `/contact`, `/privacy`, and `/terms`. Product truth is governed by Mind at `mind/organizations/prochat/brand/`; the current identities are Evermind, Nevermind, and Mastermind. ProChat Memory for QA is paused/historical. -The first four routes use a shared cinematic implementation: `HomeV2` or `CinematicProductFunnel` supplies page data to `CinematicMarketingPage`; the shared page uses `CinematicMarketingShell`, one final cinematic reference stylesheet, and `ScrollVideoBackground`. Route content must not reintroduce the former public-site shell, extra headers, a footer, opaque SaaS cards, or competing route-level overrides. +The first four routes use a shared cinematic implementation: `HomeV2` or `CinematicProductFunnel` supplies page data to `CinematicMarketingPage`; the shared page uses `CinematicMarketingShell`, one final cinematic reference stylesheet, and `ScrollVideoBackground`. The renderer samples a 24fps source into at most 120 cached frames (12fps) at up to 540px width, blends adjacent available frames, draws candidates to an offscreen staging canvas, retains the last good visible frame on failure, and stops its RAF loop when settled. Route content must not reintroduce extra headers, a footer, opaque SaaS cards, or competing route-level overrides. -Contact, Docs, Privacy, and Terms retain their existing route-specific presentation and are outside this cinematic redesign. Keep their established implementation and legal meaning unchanged; use the repository's existing route checks to guard against regressions. +Contact, Docs, Privacy, and Terms use the shared static utility shell: one transparent full-width nav, atmospheric poster treatment, Golos display headings, selective translucent glass, and no footer. Contact form handling and legal body copy are preserved. Docs uses current Evermind/Nevermind/Mastermind terminology and avoids animated video/canvas content behind reading material. ## Active work gates ### A. Renderer and motion +- Root cause reproduced against deployed `c6731140191791e407a2fb6eb27ac96711883e32`: the previous renderer cleared/resized the visible canvas before drawing a candidate and then swallowed draw errors, so a failed candidate could leave that visible canvas transparent. In a production-page browser session, three controlled draw failures took the visible sample alpha sum from 85,680 to 0 while CSS opacity remained 1. This was an injected browser-only failure (not a server mutation); ordinary scroll alone did not reproduce it deterministically. The candidate stages frames offscreen and presents only successful draws; its regression test confirms the last-good pixel checksum is unchanged when a candidate draw fails. +- The old cache capped sampling at 72 frames with `duration * 10` (about 7.2 frames/second for the 10.04-second asset). The current renderer samples up to 120 frames at 12 frames/second while reducing per-frame width from 720px to 540px, keeping the raw cached-pixel budget approximately constant and improving temporal density. It blends neighboring available frames rather than rounding progress to one frame index. - Reproduce slow/fast forward and reverse scroll in a real H.264-capable browser. -- Prove cache and bootstrap handoffs do not expose blank frames; compare frames through blending and stop painting when settled. +- Prove cache and bootstrap handoffs do not expose blank frames; stage candidate frames offscreen, retain the last good frame after draw failures, blend neighboring frames, and stop painting when settled. +- Keep temporal sampling at 12fps (120 frames for the current 10.04-second media) within a roughly constant raw bitmap pixel budget by limiting each frame to 540px width. - Confirm the requested background demonstrably changes with scroll and chapter activation follows reading order. - Under reduced motion, freeze to one stable media/poster layer, disable scrubbing, preserve all content/links, and retain geometry. ### B. Visual and content QA - Check all four cinematic routes at desktop, laptop, tablet, and mobile widths; verify one H1, one main, no footer, no horizontal overflow, CTA wrapping, and consistent 100svh / 80vh / 100svh structure. -- Do not redesign Contact, Docs, Privacy, or Terms in this release. Preserve their current route and legal behavior through existing regression tests. +- Check Contact, Docs, Privacy, and Terms in the shared static utility shell; preserve contact submission behavior and all legal body meaning. - Review current copy against canonical Mind source and prevent stale product identities/claims in active pages and docs. - Capture and manually inspect viewport screenshots after motion settles, including top, transition, Section Two, page end, and reduced-motion desktop. - Prototype LiquidGlass locally and compare quality, CPU/frame cadence, media scrubbing, reduced motion, and initialization cost. Do not add a dependency or ship the effect without measured benefit. -Initial LiquidGlass evaluation: a real Chrome local prototype using one dynamic scroll-canvas background and one cloned context panel ran at approximately 11–15fps (median frame interval 50–66.6ms) compared with the existing renderer's 16.7ms median cadence. The captured overlay also clipped/reflowed the cloned panel. Decision: do not add the dependency to the production scroll path; current CSS glass uses an 11% translucent white surface with 18px backdrop blur and preserves media throughput. This is a measured rejection for the current implementation, not a claim that the library cannot be used on static pages. +LiquidGlass evaluation (2026-09-29, local Chrome 153, 1440×900): the prototype used the real page's scroll-rendered canvas, copied/invalidation only when that canvas repainted, and tested the hero context card and Section Two capability panel independently. Baseline page RAF cadence was 16.62ms average / 16.8ms p95; context-panel prototype was 16.48ms / 16.8ms and capability-panel prototype 16.50ms / 16.8ms. LiquidGlass reported 61fps and 60fps respectively; initialization took 66.0ms and 65.8ms, with 96 changed source frames during each measured scroll sequence and no console errors. This does not reproduce the earlier claimed 11–15fps; that earlier figure is superseded by this instrumented run. Visual inspection rejected adoption: the package added an inset second glass surface/seam to both existing CSS panels and did not improve the composition enough to justify another WebGL context and frame-copy/invalidation path. Keep the existing CSS fallback and add no package dependency. Screenshots: `/tmp/prochat-liquidglass-real-context-measured.png` and `/tmp/prochat-liquidglass-real-capability-measured.png`. + +Local Chrome 153 recorded 89 visible canvas paints in 1.47s (59.99fps), with 87 distinct sampled outputs and a 17.6ms longest paint gap. A four-route run exercised slow and rapid down/up movement plus three additional reversal cycles per route; each route produced over 500 distinct sampled outputs, remained in the 120-frame cache state, had no transparent visible-canvas samples, and logged no browser errors. The strengthened focused Playwright suite passed 10/10 in system Chrome with H.264 enabled. Bundled CI Chromium skips only the H.264-specific fine-scroll case because that binary has no decoder; bootstrap, continuity, and reduced-motion coverage remain active there. ### C. Validation and release -Run the repository-supported env/doc integrity, TypeScript, ESLint, design lint, asset validation, production build, security, and relevant browser evidence. Review a diff-based safety pass; stage exact files only; commit and push the continuation branch without rewriting history. Integrate through the repository's normal `main` workflow. Verify workflow and deployment success, `/api/version` full SHA, all eight public routes, media and browser health. Then verify the authoritative worktree is clean and the protected checkout's branch, HEAD, status, and diff fingerprint are unchanged. +Run the repository-supported env/doc integrity, TypeScript, ESLint, design lint, asset validation, production build, security, and relevant browser evidence. Review a diff-based safety pass; stage exact files only; commit and push the continuation branch without rewriting history. Integrate through the repository's normal `main` workflow. Verify workflow and deployment success, `/api/version` full SHA, all eight public routes, media and browser health. Then verify the authoritative worktree is clean and the protected checkout's branch, HEAD, status, and diff fingerprint are unchanged. Commit/push/deployment gates for this release are still pending. ## Known implementation/build debt @@ -41,7 +46,7 @@ Run the repository-supported env/doc integrity, TypeScript, ESLint, design lint, ## Next performance gate -Measure Lighthouse mobile LCP on `/`, `/evermind`, `/nevermind`, `/mastermind`, `/docs`, and `/contact`. The target remains ≤2.5 seconds. If missed, the next roadmap item is to bring canonical public-route LCP under 2.5 seconds without reducing the cinematic experience. +The 2026-09-29 single-run local Lighthouse diagnostic measured LCP at `/` 2.91s, `/evermind` 2.86s, `/nevermind` 2.86s, `/mastermind` 2.86s, `/docs` 4.05s, and `/contact` 4.21s. All exceed the ≤2.5s target; CLS was 0 and TBT 0ms. This is a diagnostic sample, not production field data. Next roadmap item: bring canonical public-route LCP under 2.5 seconds without reducing the cinematic experience; investigate the utility-route LCP increase separately. ## Completion evidence diff --git a/docs/overview.md b/docs/overview.md index 00f7125..497072b 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -7,8 +7,8 @@ This repository keeps active operating guidance separate from historical migrati Start here for present-day ProChat behavior: - `docs/repo-status.md` — current repository/product/runtime state -- `docs/roadmap.md` — completed public roadmap plus explicitly deferred internal hardening -- `docs/implementation-plan.md` — current implementation/hygiene acceptance criteria +- `docs/roadmap.md` — current release status, completed work, performance follow-up, and explicitly deferred internal hardening +- `docs/implementation-plan.md` — current renderer, utility-shell, validation, and release acceptance criteria - `docs/getting-started.md` — local setup and validation - `docs/development.md` — day-to-day contributor workflow - `docs/deployment.md` — deployment and production verification @@ -36,7 +36,7 @@ The current public site surface is: - `/privacy` - `/terms` -Evermind, Nevermind, and Mastermind are the current public product identities. ProChat Memory for QA is paused/historical. Home and the three product pages share the current cinematic navigation and scroll-driven media. Docs, Contact, and legal pages retain their existing page-specific presentation; they are outside this cinematic redesign scope. +Evermind, Nevermind, and Mastermind are the current public product identities. ProChat Memory for QA is paused/historical. Home and the three product pages share the cinematic navigation and scroll-driven media. Docs, Contact, Privacy, and Terms use the same visual system through a static, reading-friendly utility shell; legal page body text is unchanged. Current publication status is recorded in `docs/repo-status.md` and `docs/roadmap.md`. ## Historical evidence @@ -47,7 +47,7 @@ Historical plans and superseded implementation material belong in: - `docs/platform/**` when explicitly tied to completed historical PXF work - Git history -Documents in those areas may mention retired ProChat OS, Kits, BuildFlow-as-product, Stripe, MailerLite, GitHub entitlement provisioning, older analytics, or older route strategies. They are evidence, not current product/runtime guidance. +Documents in those areas may mention retired ProChat OS, Kits, BuildFlow-as-product, Stripe, MailerLite, GitHub entitlement provisioning, older analytics, or older route strategies. They are evidence, not current product/runtime guidance. Older `docs/homepage-*` specifications are pre-build design evidence; current implementation and QA authority is the shipped source, `docs/homepage-validation-plan.md`, `docs/implementation-plan.md`, and `docs/roadmap.md`. The final post-release hygiene pass additionally archives several retired system documents under: diff --git a/docs/product/HOMEPAGE_MEMORY_FILM_BRIEF.md b/docs/product/HOMEPAGE_MEMORY_FILM_BRIEF.md index f27825a..0ba9278 100644 --- a/docs/product/HOMEPAGE_MEMORY_FILM_BRIEF.md +++ b/docs/product/HOMEPAGE_MEMORY_FILM_BRIEF.md @@ -2,7 +2,7 @@ **Status:** FROZEN OPTIONAL RESEARCH — not active implementation **Decision date:** 2026-07-18 -**Superseded by:** `docs/product/HOMEPAGE_NEXUS_TEMPLATE_ADOPTION.md` +**Historical design lineage:** superseded by the current website documented in `docs/implementation-plan.md` and `docs/roadmap.md` **Phase:** optional future visual experiment only **Purpose:** preserve historical cinematic-memory research; do not use it to direct the current homepage implementation **Strategic authority:** Mind repository diff --git a/docs/product/HOMEPAGE_MEMORY_FILM_PRODUCTION_PACKAGE.md b/docs/product/HOMEPAGE_MEMORY_FILM_PRODUCTION_PACKAGE.md index 471e54f..ffabbf2 100644 --- a/docs/product/HOMEPAGE_MEMORY_FILM_PRODUCTION_PACKAGE.md +++ b/docs/product/HOMEPAGE_MEMORY_FILM_PRODUCTION_PACKAGE.md @@ -2,7 +2,7 @@ **Status:** FROZEN OPTIONAL RESEARCH — not active implementation **Decision date:** 2026-07-18 -**Superseded by:** `docs/product/HOMEPAGE_NEXUS_TEMPLATE_ADOPTION.md` +**Historical design lineage:** superseded by the current website documented in `docs/implementation-plan.md` and `docs/roadmap.md` **Source brief:** `docs/product/HOMEPAGE_MEMORY_FILM_BRIEF.md` **Target:** historical 12-second scroll-controlled concept only; do not execute without a new explicit roadmap decision **Strategic authority:** Mind repository diff --git a/docs/product/HOMEPAGE_NEXUS_TEMPLATE_ADOPTION.md b/docs/product/HOMEPAGE_NEXUS_TEMPLATE_ADOPTION.md index a92993e..9a5a398 100644 --- a/docs/product/HOMEPAGE_NEXUS_TEMPLATE_ADOPTION.md +++ b/docs/product/HOMEPAGE_NEXUS_TEMPLATE_ADOPTION.md @@ -1,11 +1,13 @@ # ProChat Homepage — Nexus Template Adoption -**Status:** ACTIVE IMPLEMENTATION DIRECTION -**Decision date:** 2026-07-18 -**Owner decision:** adopt the supplied Nexus automation landing-page template as the visual and structural implementation source -**Strategic authority:** Mind repository -**Design and execution authority:** ProChat repository -**Supersedes:** active homepage memory-film and scroll-scrub video direction +**Status:** SUPERSEDED HISTORICAL DESIGN DECISION — do not use as current implementation direction +**Decision date:** 2026-07-18 +**Owner decision:** adopt the supplied Nexus automation landing-page template as the visual and structural implementation source +**Strategic authority:** Mind repository +**Design and execution authority:** ProChat repository +**Supersedes:** active homepage memory-film and scroll-scrub video direction at the time; itself superseded by the current cinematic website implementation + +> Current authority: `docs/implementation-plan.md`, `docs/roadmap.md`, `docs/homepage-validation-plan.md`, and the current source. This 2026-07-18 Nexus-template decision predates the current Evermind/Nevermind/Mastermind cinematic experience and its Contact/Docs utility shell. Its no-video/no-frame-sequence rules and old product hierarchy are historical evidence only. ## Decision diff --git a/docs/product/MEMORY_VISUAL_LANGUAGE.md b/docs/product/MEMORY_VISUAL_LANGUAGE.md index d72796e..77d3073 100644 --- a/docs/product/MEMORY_VISUAL_LANGUAGE.md +++ b/docs/product/MEMORY_VISUAL_LANGUAGE.md @@ -1,14 +1,16 @@ # ProChat Memory Visual Language -**Status:** CANONICAL PUBLIC-EXPERIENCE VISUAL PHILOSOPHY -**Decision date:** 2026-07-19 -**Owner approval:** implementation architecture approved -**Strategic authority:** Mind repository -**Visual execution authority:** ProChat repository +**Status:** historical conceptual visual reference — not the current public website design authority +**Decision date:** 2026-07-19 +**Owner approval:** implementation architecture approved +**Strategic authority:** Mind repository +**Visual execution authority:** ProChat repository **Primitive implementation:** `docs/product/MEMORY_ILLUSTRATION_PRIMITIVES.md` ## Purpose +> This July 2026 Memory-specific visual language remains useful as historical product-concept research. It does not define the current site’s visual system or product hierarchy. Follow the current implementation and roadmap in `docs/implementation-plan.md` and `docs/roadmap.md`, and Mind’s current ProChat brand sources for product truth. + This document defines how ProChat Memory is expressed visually across the public website. It is not a component API and it is not a page-layout specification. diff --git a/docs/product/PRODUCT_EXPERIENCE_BRIEF.md b/docs/product/PRODUCT_EXPERIENCE_BRIEF.md index dba6770..39f6589 100644 --- a/docs/product/PRODUCT_EXPERIENCE_BRIEF.md +++ b/docs/product/PRODUCT_EXPERIENCE_BRIEF.md @@ -1,12 +1,14 @@ # ProChat Public Experience Brief -**Status:** active Phase 1 translation brief -**Task:** `PXF-002` -**Strategic authority:** Mind repository -**Execution authority:** ProChat repository -**Next gate:** Nexus-template implementation packet `PXF-003A` -**Active visual authority:** `docs/product/HOMEPAGE_NEXUS_TEMPLATE_ADOPTION.md` -**Active conversion authority:** `docs/product/PUBLIC_CONVERSION_STRATEGY.md` +**Status:** superseded historical translation brief — not current product or website authority +**Task:** `PXF-002` +**Strategic authority:** Mind repository +**Execution authority:** ProChat repository +**Next gate:** Nexus-template implementation packet `PXF-003A` +**Current website implementation authority:** `docs/implementation-plan.md` and `docs/roadmap.md` +**Canonical product authority:** Mind, `organizations/prochat/brand/` + +> This brief preserves the earlier Memory/Memory-for-QA/Workbench strategy and Nexus design phase. Do not use its product hierarchy, route plan, conversion language, or active-direction labels for the current public website. Current ProChat product truth and site implementation are documented in Mind and the active repository roadmap/implementation plan. ## Authority diff --git a/docs/product/PUBLIC_CONVERSION_STRATEGY.md b/docs/product/PUBLIC_CONVERSION_STRATEGY.md index 001f8cd..835cdff 100644 --- a/docs/product/PUBLIC_CONVERSION_STRATEGY.md +++ b/docs/product/PUBLIC_CONVERSION_STRATEGY.md @@ -1,14 +1,16 @@ # ProChat Public Conversion Strategy -**Status:** ACTIVE EXECUTION DIRECTION — MIND RECONCILED 2026-07-19 -**Decision date:** 2026-07-18 -**Owner:** Steve Westhoek -**Strategic authority:** Mind repository -**Execution authority:** ProChat repository +**Status:** superseded historical strategy — do not use for current public copy or conversion decisions +**Decision date:** 2026-07-18 +**Owner:** Steve Westhoek +**Strategic authority:** Mind repository +**Execution authority:** ProChat repository **Applies to:** homepage, product pages, documentation, contribution paths, contact paths, and future public pages ## Authority and reconciliation status +> This strategy predates the founder-confirmed 2026-09-11 Evermind/Nevermind/Mastermind product architecture. Its Memory-for-QA/Workbench products, offers, licenses, routes, and CTA rules are historical and are not current public policy. Mind at `organizations/prochat/brand/` is canonical for strategy; the current website execution state is in `docs/roadmap.md` and `docs/implementation-plan.md`. + This document translates the owner's clarified public-growth and service model into website behavior. Mind reconciliation completed on 2026-07-19. diff --git a/docs/product/PUBLIC_PAGE_ARCHITECTURE.md b/docs/product/PUBLIC_PAGE_ARCHITECTURE.md index c0e8419..bda2cb7 100644 --- a/docs/product/PUBLIC_PAGE_ARCHITECTURE.md +++ b/docs/product/PUBLIC_PAGE_ARCHITECTURE.md @@ -2,7 +2,7 @@ > Historical plan dated 2026-07-19. Its Memory/Memory-for-QA/Workbench hierarchy, `/memory` routes, page architecture, and acceptance criteria are no longer current. For current route/product guidance see `PRODUCT.md`, `docs/overview.md`, `docs/roadmap.md`, and `docs/implementation-plan.md`. Mind at `mind/organizations/prochat/brand/` remains canonical for product truth. -**Status:** CANONICAL PUBLIC-EXPERIENCE ROUTE AND PAGE-PURPOSE CONTRACT +**Status:** superseded historical page-architecture plan **Decision date:** 2026-07-19 **Strategic authority:** Mind repository **Execution authority:** ProChat repository diff --git a/docs/production-lifecycle.md b/docs/production-lifecycle.md index 3c1e87a..006601a 100644 --- a/docs/production-lifecycle.md +++ b/docs/production-lifecycle.md @@ -56,15 +56,15 @@ A successful production closeout requires the `revision` returned by `/api/versi After deployment verify the eight canonical routes at desktop and mobile widths: - `/` -- `/memory` -- `/memory-qa` -- `/workbench` +- `/evermind` +- `/nevermind` +- `/mastermind` - `/docs` - `/contact` - `/privacy` - `/terms` -Also verify intentional compatibility redirects and that retired product bodies remain unavailable. +Also verify intentional compatibility redirects (`/workbench` and `/buildflow` to `/mastermind`) and that retired product bodies remain unavailable. ## Maintenance mode diff --git a/docs/repo-status.md b/docs/repo-status.md index b6aa4d7..cb09663 100644 --- a/docs/repo-status.md +++ b/docs/repo-status.md @@ -1,6 +1,6 @@ # Repository status -Status: current source has a locally validated cinematic implementation; production revision and route health are verified through the normal `main` workflow and `/api/version`. +Status: the cinematic and utility-page implementation passes local validation. Starting production and `origin/main` revision is `c6731140191791e407a2fb6eb27ac96711883e32`; this release is not yet published or live-verified. Last reviewed: 2026-09-29. @@ -12,8 +12,8 @@ Evermind and Nevermind are the connected Infinite Brain product system; Mastermi ## Runtime and visual architecture -- `/`, `/evermind`, `/nevermind`, `/mastermind`: shared cinematic template, scroll-driven media, two chapters, 80vh intentional spacer, one navigation, and no footer. -- `/contact`, `/docs`, `/privacy`, `/terms`: existing route-specific presentation, outside this visual redesign and checked for regressions only. +- `/`, `/evermind`, `/nevermind`, `/mastermind`: shared cinematic template, scroll-driven media, two chapters, 80vh intentional spacer, one navigation, and no footer. The cache is sampled at 12fps (120 frames for the current 10.04s video) with each frame limited to 540px width; candidate rendering uses an offscreen staging canvas to preserve the last good visible frame. +- `/contact`, `/docs`, `/privacy`, `/terms`: shared static utility shell with one transparent navigation and no footer. Contact submission remains functional; legal page body text is unchanged; Docs uses current product names and avoids animated background media. - Production integration: GitHub Actions `.github/workflows/main.yml` on `main`; production revision is checked through `/api/version`. ## Historical or deferred systems @@ -22,7 +22,7 @@ Generated Docs/Nextra, retired checkout/licensing, Stripe runtime, MailerLite, G ## Validated release scope -Renderer reverse-scroll/cache-handoff, responsive/reduced-motion and interaction evidence, measured LiquidGlass evaluation, current copy/documentation reconciliation, production build, browser/security checks, and manual desktop/mobile review are recorded for the cinematic release. Integrate through the normal GitHub `main` workflow and verify the deployed revision/routes before describing a publication as live. The protected dirty checkout `/Users/Office/Repos/prochattools/web/prochat` is preservation-only and must remain byte-for-byte unchanged in its branch, HEAD, status, and tracked diff. +Renderer continuity tests, responsive/reduced-motion and interaction evidence, measured LiquidGlass rejection, production build, 108 repository browser tests, and manual desktop/mobile review are recorded for this release. The strengthened 10-test focused quality suite passes in system Chrome with H.264 enabled. Chrome 153 locally presented 89 tiny-scroll canvas paints in 1.47s (59.99fps), with 87 distinct sampled outputs and a 17.6ms maximum gap; repeated slow/rapid reverse scrolling across all four routes produced no transparent visible-canvas samples or browser errors. The real-page LiquidGlass prototype measured 60–61 package FPS and no page RAF cadence regression, but was rejected on visual grounds because it introduced a visible inset/double-glass seam on both candidate panels without enough benefit; evidence is recorded in `docs/implementation-plan.md`. Local single-run mobile LCP diagnostics: `/` 2.91s, `/evermind` 2.86s, `/nevermind` 2.86s, `/mastermind` 2.86s, `/docs` 4.05s, `/contact` 4.21s; all exceed the 2.5s target. Production merge/deployment and remote source housekeeping remain pending. The protected dirty checkout `/Users/Office/Repos/prochattools/web/prochat` is preservation-only and must remain byte-for-byte unchanged in its branch, HEAD, status, and tracked diff. ## Tracked performance/security notes diff --git a/docs/roadmap.md b/docs/roadmap.md index 97389e6..838ee50 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -1,6 +1,6 @@ # ProChat website roadmap -Status: cinematic implementation locally validated; use the normal `main` workflow and `/api/version` to determine the published revision. Performance and dependency hardening remain separate follow-up goals. +Status: implementation and local release gates pass; current source is based on `main` at `c6731140191791e407a2fb6eb27ac96711883e32`. Production publication of this quality pass is pending the normal `main` release workflow and `/api/version` verification. Last reviewed: 2026-09-29. @@ -8,7 +8,7 @@ Last reviewed: 2026-09-29. The active public routes are `/`, `/evermind`, `/nevermind`, `/mastermind`, `/docs`, `/contact`, `/privacy`, and `/terms`. Evermind and Nevermind are the connected Infinite Brain product system; Mastermind is the separate free planning/orchestration product. ProChat Memory for QA is paused/historical. Mind remains canonical for product and company strategy. -The first four routes share a two-section cinematic page, one full-width navigation, one scroll-driven background renderer, one 80vh spacer, and no footer. Contact, Docs, Privacy, and Terms are regression-checked but not redesigned in this release; preserve their current route presentation and legal meaning. +The first four routes share a two-section cinematic page, one full-width navigation, one scroll-driven background renderer, one 80vh spacer, and no footer. Contact and Docs now use the same visual language through a static, reading-friendly utility shell; Privacy and Terms use that same shell while their legal body text remains unchanged. All four utility pages have one navigation and no footer. ## Current release goal — ProChat cinematic/site quality pass @@ -16,17 +16,18 @@ The release source of truth is `feature/prochat-cinematic-finalization-2026-09`; In scope: -1. Fix and verify smooth reverse/forward scroll, cache/bootstrap frame blending, chapter pacing, and CTA wrapping on the four cinematic product routes. +1. Fix and verify reverse/forward continuity and smooth frame presentation, chapter pacing, and CTA wrapping on the four cinematic product routes. The deployed `c673114…` failure mechanism was reproduced with controlled browser-only draw errors: clearing the visible canvas before candidate draw allowed a failed draw to leave a transparent surface. The candidate stages offscreen and preserves the last good frame; see `docs/implementation-plan.md` for measurements and test evidence. 2. Keep those four routes visually consistent, including Golos display headings, one navigation, translucent capability glass, correct 100svh / 80vh / 100svh geometry, and zero footers. -3. Keep Contact, Docs, Privacy, and Terms outside the visual redesign; retain existing routes and verify their established CI contracts. -4. Verify prefers-reduced-motion, 1440/1280/tablet/mobile layouts, route content, menu interactions, browser errors, and manually inspected cinematic screenshots. -5. Evaluate LiquidGlass with a measured local prototype; do not ship it unless it materially improves the glass treatment without harming media scroll performance, accessibility, or initial rendering. Initial 1440×900 Chrome prototype result: not accepted for this scroll-driven page—the one-panel dynamic-canvas run measured about 11–15fps (50–66.6ms median RAF interval) versus 16.7ms baseline cadence, and the prototype overlay did not preserve the card composition. Keep the current 11% CSS liquid-glass treatment. -6. Audit current public copy against Mind, correct active website guidance, validate, review, commit, push, merge through the normal `main` workflow, then verify the live revision and routes. -7. Preserve the protected checkout and unrelated repositories/worktrees. After confirmed production success only, reconcile Mastermind source continuity, indexes, and safely removable branches/worktrees; do not delete unique or unverified work. +3. Bring Contact and Docs into the shared ProChat visual system with restrained/static backgrounds; migrate only shared chrome on Privacy and Terms, preserving legal meaning. +4. Verify prefers-reduced-motion, 1440/1280/1024/768/430/390/360 layouts, route content, menu and Contact interactions, browser errors, and manually inspected screenshots. +5. LiquidGlass was tested in local Chrome 153 at 1440×900 on both selected surfaces, with the real scroll-rendered page canvas copied and invalidated on each source repaint. Baseline page RAF cadence was 16.62ms average / 16.8ms p95; the context-card and capability-panel prototypes measured 16.48ms / 16.8ms and 16.50ms / 16.8ms respectively. Package-reported rates were 61fps and 60fps; initialization was 66.0ms and 65.8ms; each run handled 96 changed source frames without console errors. The previous 11–15fps estimate was not reproduced and is superseded. Do not adopt the package: screenshots show an inset, doubled-glass seam on both existing CSS panels without a compelling visual gain. Retain the CSS fallback and avoid adding a WebGL context plus frame-copy/invalidation path. Detailed evidence and screenshots are in `docs/implementation-plan.md`. +6. Current local Chrome 153 diagnostics reached the 120-frame cache and presented 89 tiny-scroll canvas paints in 1.47s (59.99fps); 87 sampled outputs were distinct and the longest gap was 17.6ms. Slow and rapid down/up scrolling plus repeated reversals on all four core routes produced over 500 distinct sampled outputs per route, zero transparent visible-canvas samples, and no console errors. The focused browser suite passed 10/10 in system Chrome with H.264 enabled. This is a local desktop diagnostic, not a cross-device field guarantee. +7. Update active implementation docs, validate, review, commit, push, merge through the normal `main` workflow, then verify the live revision and routes. Publication is not complete until that verification passes. +8. Preserve the protected checkout and unrelated repositories/worktrees. After confirmed production success only, reconcile Mastermind source continuity, indexes, and safely removable branches/worktrees; do not delete unique or unverified work. ## Performance follow-up -The canonical mobile LCP target is at most 2.5 seconds. A single-run local production-artifact diagnostic on 2026-09-29 (Lighthouse 12.4, Moto G Power 2022 simulation, 4× CPU, slow 4G; diagnostic mode) measured LCP as follows: `/` 2.83s, `/evermind` 3.19s, `/nevermind` 2.79s, `/mastermind` 2.80s, `/docs` 2.72s, `/contact` 2.99s. All six exceeded target; CLS was 0 and TBT was 0ms. These are local lab measurements, not production field data, and one run per route is directional rather than a stable baseline. The next website goal is: **Bring canonical public-route LCP under 2.5 seconds without reducing cinematic fidelity.** Do not trade away the requested scroll-driven visuals to satisfy the metric. +The canonical mobile LCP target is at most 2.5 seconds. A single-run local production-artifact diagnostic on 2026-09-29 (Lighthouse 12.4, Moto G Power 2022 simulation, 4× CPU, slow 4G; diagnostic mode) measured: `/` 2.91s, `/evermind` 2.86s, `/nevermind` 2.86s, `/mastermind` 2.86s, `/docs` 4.05s, `/contact` 4.21s. All six exceeded target; CLS was 0 and TBT was 0ms. Utility-page LCP needs follow-up investigation. These are local lab measurements, not production field data; one run per route is directional rather than a stable baseline. The next website goal is: **Bring canonical public-route LCP under 2.5 seconds without reducing cinematic fidelity.** Do not trade away the requested scroll-driven visuals to satisfy the metric. ## Tracked build hardening diff --git a/docs/token-architecture.md b/docs/token-architecture.md index eaee8ae..1e68f3b 100644 --- a/docs/token-architecture.md +++ b/docs/token-architecture.md @@ -1,10 +1,12 @@ # ProChat Token Architecture -**Status:** canonical repository-local token governance +**Status:** historical PXF-010 token proposal; not the active route-design authority **Canonical design source:** Mind `wiki/organisations/prochat/brand/global-design-foundation.md`, translated by `brand-spec.md`, operationalized by `DESIGN.md` **Date:** 2026-07-29 **Phase:** PXF-010 — Design-system governance and launch hardening +> This document records an earlier foundation/public/`--pm-*` token proposal. Do not treat its statements about current token completeness, route consumption, or required migration steps as verified current implementation. The active public route contract is documented in `docs/overview.md`, `docs/implementation-plan.md`, and `docs/homepage-validation-plan.md`. The core cinematic routes are styled by `src/components/cinematic/cinematic-reference-final.css`; static utility routes use `src/components/cinematic/cinematic-utility.css`. Verify source before changing shared tokens. + ## Token layers The system uses three hierarchical token layers: diff --git a/docs/website-copy-blueprint.md b/docs/website-copy-blueprint.md index 312011e..a169527 100644 --- a/docs/website-copy-blueprint.md +++ b/docs/website-copy-blueprint.md @@ -1,9 +1,11 @@ # ProChat website copy blueprint -**Status:** active website copy guidance +**Status:** superseded pre-cinematic copy plan; retained as historical design evidence **Owner:** Steve Westhoek **Scope:** homepage, product pages, niche page, contact/waitlist copy, navigation, footer, metadata, and social copy +> This file predates the current Evermind/Nevermind/Mastermind product and website decisions. Do not use its copy examples or hierarchy as current guidance. The current public copy is in the route source, with product truth in Mind; current implementation status and checks are in `docs/roadmap.md`, `docs/implementation-plan.md`, and `docs/homepage-validation-plan.md`. + ## Authority Mind is canonical for ProChat philosophy, product hierarchy, naming, positioning, business stage, growth policy, legal-policy direction, and cross-product roadmap. diff --git a/src/app/(marketing)/components/layout/PublicLegalPage.tsx b/src/app/(marketing)/components/layout/PublicLegalPage.tsx index 256a469..8cf4d55 100644 --- a/src/app/(marketing)/components/layout/PublicLegalPage.tsx +++ b/src/app/(marketing)/components/layout/PublicLegalPage.tsx @@ -1,4 +1,5 @@ import type { ReactNode } from 'react' +import { CinematicMarketingShell } from '@/components/CinematicMarketingShell' import '@/assets/styles/prochat-public-chrome.css' import '@/assets/styles/prochat-public-bodies.css' @@ -19,7 +20,12 @@ export function PublicLegalPage({ summary, }: PublicLegalPageProps) { return ( -
+ +
@@ -38,6 +44,7 @@ export function PublicLegalPage({
{children} -
+ + ) } diff --git a/src/app/(marketing)/contact/ContactPageClient.tsx b/src/app/(marketing)/contact/ContactPageClient.tsx index 0f03999..a5ca144 100644 --- a/src/app/(marketing)/contact/ContactPageClient.tsx +++ b/src/app/(marketing)/contact/ContactPageClient.tsx @@ -7,7 +7,6 @@ import { trackEvent } from '@/utils/analytics' import { CinematicMarketingShell } from '@/components/CinematicMarketingShell' import ContactPageMarkup from './ContactPageMarkup' -import { CinematicMediaPage } from '@/components/cinematic/CinematicMediaPage' type ContactFieldName = | 'name' @@ -34,16 +33,13 @@ const FORM_FIELDS: ContactFieldName[] = [ const CONTACT_SUBMIT_IDLE_HTML = ` - SEND MY BRIEF - - - + SEND MESSAGE ` const CONTACT_SUBMIT_SUBMITTING_HTML = ` - SENDING BRIEF... + SENDING MESSAGE... ` @@ -297,12 +293,11 @@ export default function ContactPageClient({ initialTopic }: ContactPageClientPro return (
- - - +
) diff --git a/src/app/(marketing)/contact/ContactPageMarkup.tsx b/src/app/(marketing)/contact/ContactPageMarkup.tsx index 7d3e5bb..115aa98 100644 --- a/src/app/(marketing)/contact/ContactPageMarkup.tsx +++ b/src/app/(marketing)/contact/ContactPageMarkup.tsx @@ -10,17 +10,14 @@ const TOPIC_CONTEXT = { Evermind: { label: 'Evermind enquiry', helper: 'Describe the memory workflow or local-first question you want to explore.', - signals: ['Memory use case', 'Human ownership', 'Clear next step'], }, Nevermind: { label: 'Nevermind enquiry', helper: 'Describe the context problem or AI-tool workflow you want to make more continuous.', - signals: ['Working context', 'Tool choice', 'Clear next step'], }, Mastermind: { label: 'Mastermind enquiry', helper: 'Describe the intention, project context, or bounded execution workflow you want to clarify.', - signals: ['Project context', 'Execution boundary', 'Clear next step'], }, } as const @@ -30,54 +27,35 @@ export default function ContactPageMarkup({ const topicContext = TOPIC_CONTEXT[initialTopic] return ( -
-
-
-

Contact / direct signal

-

Send the context.
Get the clearest next step.

-

Tell me what you are working on, where the friction is, and what outcome you need. The goal is one useful reply with the right next step.

-
{topicContext.signals.map((signal, index) => 0{index + 1}{signal})}
- Send the brief +
+
+
+

Start a conversation.

+

Tell us what you are working on and what would help. Choose Evermind, Nevermind, or Mastermind if you have a product-specific question, and we will reply with a useful next step.

+
+ ABOUT + {topicContext.label} + {topicContext.helper}
-
-
- - -
-
+
+
- INTAKE / 01 -

Send a message

+ MESSAGE / 01 +

Send a message

OPEN -
-

{topicContext.helper}

- -
+
+

Required fields are marked. A few clear sentences are enough.

+ + -
+
) diff --git a/src/app/docs/layout.tsx b/src/app/docs/layout.tsx index 27609fa..970d7b9 100644 --- a/src/app/docs/layout.tsx +++ b/src/app/docs/layout.tsx @@ -1,5 +1,14 @@ import type { ReactNode } from 'react' +import { CinematicMarketingShell } from '@/components/CinematicMarketingShell' export default function DocsLayout({ children }: { children: ReactNode }) { - return children + return ( + +
{children}
+
+ ) } diff --git a/src/app/docs/page.tsx b/src/app/docs/page.tsx index 0929b75..9ccb327 100644 --- a/src/app/docs/page.tsx +++ b/src/app/docs/page.tsx @@ -1,5 +1,4 @@ import StructuredData from '@/components/StructuredData' -import PublicEditorialHero from '@/components/public/PublicEditorialHero' import { getSEOTags } from '@/libs/seo' import { getDocsSchemas } from '@/libs/structured-data' @@ -28,8 +27,8 @@ export async function generateMetadata() { }, socialImage: { line1: 'ProChat Documentation', - line2: 'Memory + context + execution', - subtitle: 'Three products. One connected direction.', + line2: 'Evermind + Nevermind + Mastermind', + subtitle: 'Product documentation for AI work.', }, canonicalUrlRelative: '/docs', }) @@ -79,24 +78,14 @@ const paths = [ export default function DocsIndexPage() { return ( -
+
- - Three products.
- One connected direction. - - } - description="Explore the product family from human-owned memory to working context and controlled execution. Each product has a distinct role, and the pages keep those boundaries explicit." - primaryAction={{ href: '#repository-docs', label: 'Choose a product' }} - signals={['Evermind', 'Nevermind', 'Mastermind']} - visualTitle="DOCS / PRODUCT FAMILY" - visualCaption="REMEMBER → CONTEXTUALIZE → DIRECT" - /> +
+
+

Product documentation for AI work.

+

{DOCS_DESCRIPTION} Start with the product that matches the work, then use its documentation to understand setup, boundaries, and next steps.

+
diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 90d91d4..c4407d2 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -6,7 +6,6 @@ import UmamiAnalytics from '@/components/UmamiAnalytics' import { brand } from '@/lib/brand' import { getSEOTags } from '@/libs/seo' import { getOrganizationSchema, getWebsiteSchema } from '@/libs/structured-data' -import { Golos_Text, JetBrains_Mono } from 'next/font/google' import localFont from 'next/font/local' import { Viewport } from 'next' import { ReactNode } from 'react' @@ -25,16 +24,18 @@ const fontSans = localFont({ display: 'swap', }) -const fontBrand = Golos_Text({ - subsets: ['latin'], - weight: ['400', '600', '700'], +const fontBrand = localFont({ + src: [ + { path: '../../public/fonts/GolosText-Regular.ttf', weight: '400' }, + { path: '../../public/fonts/GolosText-Bold.ttf', weight: '700' }, + ], variable: '--font-brand', display: 'swap', }) -const fontMono = JetBrains_Mono({ - subsets: ['latin'], - weight: ['400', '700'], +const fontMono = localFont({ + src: '../../public/fonts/JetBrainsMono-Regular.ttf', + weight: '400', variable: '--font-mono', display: 'swap', }) diff --git a/src/components/CinematicMarketingShell.tsx b/src/components/CinematicMarketingShell.tsx index 8c985b5..da37b18 100644 --- a/src/components/CinematicMarketingShell.tsx +++ b/src/components/CinematicMarketingShell.tsx @@ -9,6 +9,7 @@ import { SocialIcon } from '@/components/ui/social-icons' import { trackEvent } from '@/utils/analytics' import './cinematic-marketing-shell.css' import './cinematic/cinematic-reference-final.css' +import './cinematic/cinematic-utility.css' const NAV_ITEMS = [ { href: '/evermind', label: 'Evermind' }, @@ -197,18 +198,20 @@ export function CinematicMarketingShell({ cta, contentOwnsMain = false, cinematicTheme = false, + utilityTheme = false, }: { children: React.ReactNode cta?: CinematicMarketingCta contentOwnsMain?: boolean cinematicTheme?: boolean + utilityTheme?: boolean }) { return ( -
+
) } diff --git a/src/components/cinematic/cinematic-utility.css b/src/components/cinematic/cinematic-utility.css new file mode 100644 index 0000000..e0bc9b0 --- /dev/null +++ b/src/components/cinematic/cinematic-utility.css @@ -0,0 +1,334 @@ +/* Quiet utility-page expression of the shared ProChat cinematic identity. */ +.cm-shell.cm-shell--utility { + --cm-utility-white: 255 255 255; + --cm-utility-ink: 15 34 48; + position: relative; + min-height: 100svh; + overflow-x: clip; + background: oklch(15% 0.012 242); + color: rgb(var(--cm-utility-white)); + font-family: var(--font-sans), system-ui, sans-serif; +} + +.cm-shell.cm-shell--utility > .cm-shell__backdrop { + position: fixed; + z-index: 0; + inset: 0; + background-image: + linear-gradient(180deg, rgb(8 16 24 / 0.56), rgb(8 16 24 / 0.74)), + url('/funnels/cinematic-bootstrap.jpg'); + background-repeat: no-repeat; + background-size: cover, 600% 400%; + background-position: center, 0 0; +} + +.cm-shell.cm-shell--utility > .cm-nav-shell { + position: fixed; + z-index: 50; + inset: 0 0 auto; + width: 100%; + margin: 0; + padding: 0; +} + +.cm-shell.cm-shell--utility .cm-nav { + width: 100%; + min-height: 4.875rem; + padding: 0 3rem; + border: 0; + border-bottom: 1px solid rgb(255 255 255 / 0.15); + border-radius: 0; + background: rgb(20 31 41 / 0.12); + box-shadow: none; + backdrop-filter: blur(8px); +} + +.cm-shell.cm-shell--utility .cm-nav__brand, +.cm-shell.cm-shell--utility .cm-nav__links a, +.cm-shell.cm-shell--utility .cm-nav__contact, +.cm-shell.cm-shell--utility .cm-nav__links a:hover, +.cm-shell.cm-shell--utility .cm-nav__links a[aria-current='page'], +.cm-shell.cm-shell--utility .cm-nav__contact:hover, +.cm-shell.cm-shell--utility .cm-nav__menu-button { + color: rgb(var(--cm-utility-white)); +} + +.cm-shell.cm-shell--utility .cm-nav__cta { + min-height: 2.75rem; + border-color: rgb(255 255 255 / 0.32); + background: rgb(255 255 255 / 0.95); + color: rgb(var(--cm-utility-ink)); + white-space: nowrap; +} + +.cm-shell.cm-shell--utility .cm-nav__menu-button { + border-color: rgb(255 255 255 / 0.28); + background: rgb(255 255 255 / 0.1); +} + +.cm-shell.cm-shell--utility .cm-nav__mobile-panel { + border-color: rgb(255 255 255 / 0.22); + background: rgb(29 43 54 / 0.94); + box-shadow: 0 1.5rem 4rem rgb(0 0 0 / 0.24); + backdrop-filter: blur(18px); +} + +.cm-shell.cm-shell--utility .cm-nav__mobile-panel a { + color: rgb(255 255 255 / 0.9); +} + +.cm-shell.cm-shell--utility > main, +.cm-shell.cm-shell--utility > [data-utility-main] { + position: relative; + z-index: 5; + padding-top: 4.875rem; +} + +.cm-shell.cm-shell--utility :is(h1, h2, h3) { + font-family: var(--font-brand), 'Golos Text', sans-serif; + text-wrap: balance; +} + +.cm-shell.cm-shell--utility .cm-utility-contact, +.cm-shell.cm-shell--utility .cm-utility-docs, +.cm-shell.cm-shell--utility .pc-legal-ledger { + --cm-line: rgb(255 255 255 / 0.18); + --cm-muted: rgb(245 248 251 / 0.78); + color: rgb(255 255 255 / 0.96); +} + +.cm-shell.cm-shell--utility .cm-utility-contact { + width: min(calc(100% - 3rem), 82rem); + display: grid; + grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.2fr); + align-items: start; + gap: clamp(2rem, 7vw, 6rem); + margin-inline: auto; + padding-block: clamp(3.5rem, 8vw, 7rem); +} + +.cm-shell.cm-shell--utility .cm-utility-contact__intro { padding-top: 1.2rem; } +.cm-shell.cm-shell--utility .cm-utility-contact__intro h1 { + max-width: 10ch; + margin: 1rem 0 0; + font-size: clamp(3rem, 6.6vw, 6.8rem); + font-weight: 500; + letter-spacing: -0.055em; + line-height: 0.98; +} +.cm-shell.cm-shell--utility .cm-utility-contact__intro > p { + max-width: 34rem; + margin: 1.35rem 0 0; + color: var(--cm-muted); + font-size: clamp(1rem, 1.3vw, 1.13rem); + line-height: 1.7; +} +.cm-shell.cm-shell--utility .cm-utility-contact__topic { + display: grid; + gap: 0.35rem; + margin-top: 1.8rem; + padding: 1rem 1.1rem; + border: 1px solid rgb(255 255 255 / 0.18); + border-radius: 0.85rem; + background: rgb(255 255 255 / 0.1); + backdrop-filter: blur(12px); +} +.cm-shell.cm-shell--utility .cm-utility-contact__topic span, +.cm-shell.cm-shell--utility .cm-utility-contact__topic small { + color: rgb(255 255 255 / 0.7); + font-size: 0.76rem; +} +.cm-shell.cm-shell--utility .cm-utility-contact__topic strong { font-weight: 600; } +.cm-shell.cm-shell--utility .cm-utility-contact__form { + padding: clamp(1.25rem, 3vw, 2.2rem); + border: 1px solid rgb(255 255 255 / 0.22); + border-radius: 1.2rem; + background: rgb(255 255 255 / 0.12); + box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.17), 0 1.5rem 4rem rgb(9 25 38 / 0.2); + backdrop-filter: blur(18px); +} +.cm-shell.cm-shell--utility .cm-utility-contact__form > p, +.cm-shell.cm-shell--utility .contact-helper-text, +.cm-shell.cm-shell--utility .contact-form-panel .text-muted-foreground { + color: rgb(255 255 255 / 0.76); +} +.cm-shell.cm-shell--utility .contact-form-panel__header { display: flex; align-items: start; justify-content: space-between; gap: 1rem; } +.cm-shell.cm-shell--utility .contact-form-panel__header h2 { margin: 0.4rem 0 0; font-size: clamp(1.8rem, 3vw, 2.5rem); } +.cm-shell.cm-shell--utility .contact-memory-form { display: grid; gap: 1.1rem; margin-top: 1.6rem; } +.cm-shell.cm-shell--utility .contact-memory-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1rem; } +.cm-shell.cm-shell--utility .contact-memory-field { min-width: 0; display: grid; gap: 0.45rem; } +.cm-shell.cm-shell--utility .contact-field, +.cm-shell.cm-shell--utility .contact-textarea { min-height: 2.9rem; padding: 0.72rem 0.8rem; } +.cm-shell.cm-shell--utility .contact-textarea { min-height: 8rem; resize: vertical; } +.cm-shell.cm-shell--utility .contact-form-panel .pc-body-button { + width: 100%; + min-height: 2.9rem; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.65rem; + padding: 0.7rem 1rem; + border: 1px solid rgb(255 255 255 / 0.35); + font: 600 0.82rem/1.2 var(--font-sans), system-ui, sans-serif; + cursor: pointer; +} +.cm-shell.cm-shell--utility .contact-form-panel .pc-body-button:disabled { cursor: wait; opacity: 0.65; } +.cm-shell.cm-shell--utility .contact-field-error { margin: 0; color: rgb(255 210 210); font-size: 0.78rem; } +.cm-shell.cm-shell--utility .contact-status { margin: 0; color: white; } +.cm-shell.cm-shell--utility .contact-form-panel__header h2, +.cm-shell.cm-shell--utility .contact-field-label { color: white; } +.cm-shell.cm-shell--utility .contact-form-panel__header > div > span, +.cm-shell.cm-shell--utility .contact-topic-console span, +.cm-shell.cm-shell--utility .contact-form-panel__header > .contact-form-status-dot { + color: rgb(255 255 255 / 0.72); +} +.cm-shell.cm-shell--utility .contact-topic-console { + border: 1px solid rgb(255 255 255 / 0.18); + border-radius: 0.75rem; + background: rgb(255 255 255 / 0.08); +} +.cm-shell.cm-shell--utility .contact-field, +.cm-shell.cm-shell--utility .contact-textarea { + border-color: rgb(255 255 255 / 0.25); + border-radius: 0.65rem; + background: rgb(13 26 37 / 0.48); + color: white; +} +.cm-shell.cm-shell--utility .contact-field::placeholder, +.cm-shell.cm-shell--utility .contact-textarea::placeholder { color: rgb(255 255 255 / 0.56); } +.cm-shell.cm-shell--utility .contact-field:focus-visible, +.cm-shell.cm-shell--utility .contact-textarea:focus-visible { + border-color: rgb(255 255 255 / 0.75); + outline: 2px solid rgb(255 255 255 / 0.3); + outline-offset: 2px; +} +.cm-shell.cm-shell--utility .contact-form-panel .pc-body-button { + border-radius: 999px; + background: rgb(255 255 255 / 0.96); + color: rgb(var(--cm-utility-ink)); + white-space: nowrap; +} + +.cm-shell.cm-shell--utility .cm-utility-docs { + width: min(calc(100% - 3rem), 82rem); + margin-inline: auto; + padding-block: clamp(3rem, 7vw, 6rem); +} +.cm-shell.cm-shell--utility .cm-utility-docs__hero { + max-width: 54rem; + margin-bottom: clamp(2.5rem, 6vw, 4.5rem); +} +.cm-shell.cm-shell--utility .cm-utility-docs__hero h1 { + margin: 1rem 0 0; + font-size: clamp(3rem, 6.8vw, 6.6rem); + font-weight: 500; + letter-spacing: -0.055em; + line-height: 0.98; +} +.cm-shell.cm-shell--utility .cm-utility-docs__hero p { + max-width: 44rem; + margin: 1.25rem 0 0; + color: var(--cm-muted); + font-size: clamp(1rem, 1.25vw, 1.12rem); + line-height: 1.7; +} +.cm-shell.cm-shell--utility .pc-docs-hub__intro h2 { + max-width: 18ch; + margin: 0.8rem 0 0; + font-size: clamp(2rem, 4vw, 3.4rem); + font-weight: 500; + letter-spacing: -0.04em; +} +.cm-shell.cm-shell--utility .pc-docs-hub__paths { + display: grid; + grid-template-columns: minmax(15rem, 0.65fr) minmax(0, 1.35fr); + align-items: start; + gap: clamp(2rem, 5vw, 4rem); +} +.cm-shell.cm-shell--utility .pc-docs-hub__intro > p, +.cm-shell.cm-shell--utility .pc-docs-hub__card > p, +.cm-shell.cm-shell--utility .pc-docs-hub__boundary > p { + color: var(--cm-muted); + line-height: 1.7; +} +.cm-shell.cm-shell--utility .pc-docs-hub__grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 1rem; + margin-top: 1.8rem; +} +.cm-shell.cm-shell--utility .pc-docs-hub__card { + min-width: 0; + display: flex; + flex-direction: column; + padding: clamp(1.2rem, 2vw, 1.8rem); + border: 1px solid rgb(255 255 255 / 0.2); + border-radius: 1rem; + background: rgb(255 255 255 / 0.1); + box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.13); + backdrop-filter: blur(14px); +} +.cm-shell.cm-shell--utility .pc-docs-hub__card h3 { margin: 0.2rem 0 0; color: white; font-size: 1.45rem; } +.cm-shell.cm-shell--utility .pc-docs-hub__card small, +.cm-shell.cm-shell--utility .pc-docs-hub__card header > span { color: rgb(255 255 255 / 0.72); } +.cm-shell.cm-shell--utility .pc-docs-hub__signals { display: flex; flex-wrap: wrap; gap: 0.45rem; margin: 1.2rem 0; padding: 0; list-style: none; } +.cm-shell.cm-shell--utility .pc-docs-hub__signals li { padding: 0.35rem 0.55rem; border: 1px solid rgb(255 255 255 / 0.18); border-radius: 999px; color: rgb(255 255 255 / 0.82); font-size: 0.72rem; } +.cm-shell.cm-shell--utility .pc-docs-hub__links { display: grid; gap: 0.65rem; } +.cm-shell.cm-shell--utility .pc-docs-hub__links a { display: flex; justify-content: space-between; gap: 0.5rem; color: white; font-size: 0.86rem; font-weight: 600; text-decoration: none; } +.cm-shell.cm-shell--utility .pc-docs-hub__links a:hover { text-decoration: underline; text-underline-offset: 0.2em; } +.cm-shell.cm-shell--utility .pc-docs-hub__boundary { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(14rem, 0.75fr); + gap: 2rem; + margin-top: 3rem; + padding-top: 1.5rem; + border-top: 1px solid rgb(255 255 255 / 0.2); +} +.cm-shell.cm-shell--utility .pc-docs-hub__boundary h2 { max-width: 22ch; margin: 0.8rem 0 0; font-size: 1.2rem; } + +.cm-shell.cm-shell--utility .pc-legal-ledger { padding-bottom: 4rem; } +.cm-shell.cm-shell--utility .pc-legal-ledger__masthead, +.cm-shell.cm-shell--utility .pc-legal-ledger__body { background: transparent; } +.cm-shell.cm-shell--utility .pc-legal-ledger__masthead { padding-block: clamp(2rem, 5vw, 4rem); } +.cm-shell.cm-shell--utility .pc-legal-ledger__masthead-inner, +.cm-shell.cm-shell--utility .pc-legal-ledger__body > div { width: min(calc(100% - 3rem), 78rem); } +.cm-shell.cm-shell--utility .pc-legal-ledger__masthead h1, +.cm-shell.cm-shell--utility .pc-legal-ledger__article h2, +.cm-shell.cm-shell--utility .pc-legal-ledger__article h3 { color: white; } +.cm-shell.cm-shell--utility .pc-legal-ledger__masthead p, +.cm-shell.cm-shell--utility .pc-legal-ledger__article { color: rgb(255 255 255 / 0.84); } +.cm-shell.cm-shell--utility .pc-legal-ledger__register, +.cm-shell.cm-shell--utility .pc-legal-ledger__article aside, +.cm-shell.cm-shell--utility .pc-legal-ledger__article blockquote { + border-color: rgb(255 255 255 / 0.2); + background: rgb(255 255 255 / 0.09); + color: rgb(255 255 255 / 0.84); +} +.cm-shell.cm-shell--utility .pc-legal-ledger a { color: white; } + +@media (max-width: 1100px) { + .cm-shell.cm-shell--utility .pc-docs-hub__paths { grid-template-columns: 1fr; } +} + +@media (max-width: 900px) { + .cm-shell.cm-shell--utility .cm-nav { padding-inline: 2rem; } + .cm-shell.cm-shell--utility .cm-utility-contact { grid-template-columns: 1fr; gap: 2rem; } + .cm-shell.cm-shell--utility .pc-docs-hub__paths { grid-template-columns: 1fr; } + .cm-shell.cm-shell--utility .pc-docs-hub__grid { grid-template-columns: 1fr; } +} + +@media (max-width: 620px) { + .cm-shell.cm-shell--utility .cm-nav { padding-inline: 1rem; } + .cm-shell.cm-shell--utility .cm-utility-contact, + .cm-shell.cm-shell--utility .cm-utility-docs { width: min(calc(100% - 2rem), 82rem); } + .cm-shell.cm-shell--utility .contact-memory-grid { grid-template-columns: 1fr; } + .cm-shell.cm-shell--utility .pc-docs-hub__boundary { grid-template-columns: 1fr; gap: 0.75rem; } + .cm-shell.cm-shell--utility .pc-legal-ledger__masthead-inner, + .cm-shell.cm-shell--utility .pc-legal-ledger__body > div { width: calc(100% - 2rem); } +} + +@media (prefers-reduced-motion: reduce) { + .cm-shell.cm-shell--utility *, + .cm-shell.cm-shell--utility *::before, + .cm-shell.cm-shell--utility *::after { scroll-behavior: auto !important; } +} diff --git a/src/components/funnels/ScrollVideoBackground.tsx b/src/components/funnels/ScrollVideoBackground.tsx index a8ee63e..9253d71 100644 --- a/src/components/funnels/ScrollVideoBackground.tsx +++ b/src/components/funnels/ScrollVideoBackground.tsx @@ -10,8 +10,9 @@ const BOOTSTRAP_FRAME_COUNT = 24 const BOOTSTRAP_COLUMNS = 6 const BOOTSTRAP_ROWS = 4 const FIRST_FRAME_TIME_SECONDS = 0.04 -const MAX_CACHED_FRAMES = 72 -const MAX_CACHED_FRAME_WIDTH = 720 +const MAX_CACHED_FRAMES = 120 +const CACHE_READY_FRAME_COUNT = 48 +const MAX_CACHED_FRAME_WIDTH = 540 type ScrollVideoBackgroundProps = { containerRef?: RefObject @@ -44,6 +45,7 @@ export function ScrollVideoBackground({ containerRef, className = '', onProgress const targetRef = useRef(0) const smoothedRef = useRef(0) const onProgressRef = useRef(onProgress) + const wakeRendererRef = useRef<() => void>(() => {}) const [bootstrapReady, setBootstrapReady] = useState(false) const [videoReady, setVideoReady] = useState(false) const [cacheReady, setCacheReady] = useState(false) @@ -69,6 +71,7 @@ export function ScrollVideoBackground({ containerRef, className = '', onProgress : getProgress(containerRef?.current ?? null) targetRef.current = result.progress onProgressRef.current?.(result.progress, result.isActive) + wakeRendererRef.current() } updateTarget() @@ -173,7 +176,7 @@ export function ScrollVideoBackground({ containerRef, className = '', onProgress }) const duration = source.duration if (!Number.isFinite(duration) || duration <= 0) return - const count = Math.min(MAX_CACHED_FRAMES, Math.max(24, Math.round(duration * 10))) + const count = Math.min(MAX_CACHED_FRAMES, Math.max(24, Math.round(duration * 12))) const width = Math.min(MAX_CACHED_FRAME_WIDTH, source.videoWidth || MAX_CACHED_FRAME_WIDTH) const height = Math.max(1, Math.round(width * ((source.videoHeight || 540) / (source.videoWidth || 960)))) const temp = document.createElement('canvas') @@ -200,7 +203,7 @@ export function ScrollVideoBackground({ containerRef, className = '', onProgress framesRef.current[index]?.close() framesRef.current[index] = frame loadedCount += 1 - if (loadedCount === BOOTSTRAP_FRAME_COUNT) setCacheReady(true) + if (loadedCount === CACHE_READY_FRAME_COUNT) setCacheReady(true) } } @@ -221,6 +224,8 @@ export function ScrollVideoBackground({ containerRef, className = '', onProgress let raf = 0 let previousTime = 0 let forceDraw = true + const stagingCanvas = document.createElement('canvas') + const stagingContext = stagingCanvas.getContext('2d') const drawCover = ( ctx: CanvasRenderingContext2D, source: CanvasImageSource, @@ -263,23 +268,23 @@ export function ScrollVideoBackground({ containerRef, className = '', onProgress smoothedRef.current += (targetRef.current - smoothedRef.current) * (1 - Math.exp(-delta / 88)) const moved = Math.abs(smoothedRef.current - oldProgress) > 0.00001 const canvas = canvasRef.current - const canDrawCanvas = canvas && bootstrapReady + const canDrawCanvas = canvas && bootstrapReady && stagingContext if (canDrawCanvas) { const dpr = Math.min(window.devicePixelRatio || 1, 1.5) const width = Math.round(window.innerWidth * dpr) const height = Math.round(window.innerHeight * dpr) - let resized = false - if (canvas.width !== width || canvas.height !== height) { - canvas.width = width - canvas.height = height - resized = true + const resized = stagingCanvas.width !== width || stagingCanvas.height !== height + if (resized) { + stagingCanvas.width = width + stagingCanvas.height = height } - const ctx = canvas.getContext('2d') - if (ctx && (forceDraw || resized || moved)) { + if (forceDraw || resized || moved) { let drawn = false + const ctx = stagingContext try { + ctx.clearRect(0, 0, width, height) if (cacheReady && frameCountRef.current > 0) { const frames = framesRef.current const position = smoothedRef.current * (frameCountRef.current - 1) @@ -331,28 +336,45 @@ export function ScrollVideoBackground({ containerRef, className = '', onProgress if (upperIndex !== lowerIndex && blend > 0) drawBootstrap(upperIndex, false, blend) drawn = true } - } catch { - // Keep the last successfully painted canvas frame if a source is transiently unavailable. - } + } catch { /* A failed candidate never touches the visible canvas. */ } if (drawn) { - forceDraw = false - if (!canvasPainted) setCanvasPainted(true) + try { + if (canvas.width !== width || canvas.height !== height) { + canvas.width = width + canvas.height = height + } + const visibleContext = canvas.getContext('2d') + if (visibleContext) { + visibleContext.drawImage(stagingCanvas, 0, 0, width, height) + forceDraw = false + if (!canvasPainted) setCanvasPainted(true) + } + } catch { /* Keep the last successfully presented frame. */ } } } } - if (!prefersReducedMotion || !canvasPainted && bootstrapReady) { + raf = 0 + if (Math.abs(targetRef.current - smoothedRef.current) > 0.00001) { raf = requestAnimationFrame(draw) } } - raf = requestAnimationFrame(draw) - return () => cancelAnimationFrame(raf) + const wake = () => { + if (raf) return + raf = requestAnimationFrame(draw) + } + wakeRendererRef.current = wake + wake() + return () => { + wakeRendererRef.current = () => {} + if (raf) cancelAnimationFrame(raf) + } }, [bootstrapReady, cacheReady, canvasPainted, prefersReducedMotion]) const canvasVisible = canvasPainted && !prefersReducedMotion const videoHidden = canvasPainted || prefersReducedMotion const renderState = cacheReady ? 'cache' : canvasPainted ? 'bootstrap' : 'poster' - return <>