From f3892354035dee62c8c7a8176e8e18766b0a809a Mon Sep 17 00:00:00 2001 From: Roberto Cano <3525807+robercano@users.noreply.github.com> Date: Wed, 22 Jul 2026 21:12:23 +0200 Subject: [PATCH 1/2] feat(website): spec-and-graph one-page redesign for redeploy.thesolidchain.com MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the marketing site's Hero/Benefits/Features content with the approved "spec ⇄ graph" design: sticky topbar, hero, a spec-JSON/dependency-graph split pane, a 4-stage pipeline, a Studio band (using the real studio-canvas.png screenshot), a packages grid, and a footer with the family strip. Copy stays data-driven in content.ts; a small SpecCode tokenizer syntax-highlights the example spec instead of hand-authored markup. Also preps the module for GitHub Pages: public/CNAME pins the custom domain and vite.config.ts sets base: './' so the static build works from a custom-domain Pages root. --- apps/website/index.html | 8 +- apps/website/public/CNAME | 1 + apps/website/src/App.tsx | 24 +- .../website/src/assets/studio-deploy-flow.png | Bin 67104 -> 0 bytes apps/website/src/assets/studio-inspector.png | Bin 47962 -> 0 bytes apps/website/src/assets/studio-templates.png | Bin 32489 -> 0 bytes apps/website/src/components/Benefits.tsx | 24 - .../src/components/DependencyGraph.tsx | 78 +++ apps/website/src/components/Features.tsx | 49 -- apps/website/src/components/Footer.tsx | 30 +- apps/website/src/components/Hero.tsx | 17 +- apps/website/src/components/Packages.tsx | 20 + apps/website/src/components/Pipeline.tsx | 29 + apps/website/src/components/RichText.tsx | 28 + apps/website/src/components/SpecCode.tsx | 69 +++ .../src/components/SpecGraphSection.tsx | 33 ++ apps/website/src/components/Studio.tsx | 25 + apps/website/src/components/Topbar.tsx | 30 + apps/website/src/content.ts | 262 ++++++--- apps/website/src/styles.css | 530 ++++++++++++------ apps/website/test/App.test.tsx | 95 ++-- apps/website/test/Benefits.test.tsx | 62 -- apps/website/test/Packages.test.tsx | 32 ++ apps/website/test/SpecCode.test.tsx | 48 ++ apps/website/test/content.test.ts | 106 +++- apps/website/vite.config.ts | 4 + 26 files changed, 1093 insertions(+), 511 deletions(-) create mode 100644 apps/website/public/CNAME delete mode 100644 apps/website/src/assets/studio-deploy-flow.png delete mode 100644 apps/website/src/assets/studio-inspector.png delete mode 100644 apps/website/src/assets/studio-templates.png delete mode 100644 apps/website/src/components/Benefits.tsx create mode 100644 apps/website/src/components/DependencyGraph.tsx delete mode 100644 apps/website/src/components/Features.tsx create mode 100644 apps/website/src/components/Packages.tsx create mode 100644 apps/website/src/components/Pipeline.tsx create mode 100644 apps/website/src/components/RichText.tsx create mode 100644 apps/website/src/components/SpecCode.tsx create mode 100644 apps/website/src/components/SpecGraphSection.tsx create mode 100644 apps/website/src/components/Studio.tsx create mode 100644 apps/website/src/components/Topbar.tsx delete mode 100644 apps/website/test/Benefits.test.tsx create mode 100644 apps/website/test/Packages.test.tsx create mode 100644 apps/website/test/SpecCode.test.tsx diff --git a/apps/website/index.html b/apps/website/index.html index 343fa2a..ae7902e 100644 --- a/apps/website/index.html +++ b/apps/website/index.html @@ -3,10 +3,14 @@ - reDeploy — declarative, idempotent, resumable smart-contract deployments + reDeploy · The Solid Chain + diff --git a/apps/website/public/CNAME b/apps/website/public/CNAME new file mode 100644 index 0000000..caa6af5 --- /dev/null +++ b/apps/website/public/CNAME @@ -0,0 +1 @@ +redeploy.thesolidchain.com diff --git a/apps/website/src/App.tsx b/apps/website/src/App.tsx index 648b5eb..05079dc 100644 --- a/apps/website/src/App.tsx +++ b/apps/website/src/App.tsx @@ -1,17 +1,25 @@ import Hero from "./components/Hero.js"; -import Benefits from "./components/Benefits.js"; -import Features from "./components/Features.js"; import Footer from "./components/Footer.js"; +import Packages from "./components/Packages.js"; +import Pipeline from "./components/Pipeline.js"; +import SpecGraphSection from "./components/SpecGraphSection.js"; +import Studio from "./components/Studio.js"; +import Topbar from "./components/Topbar.js"; export default function App() { return (
-
- - - -
-
); } diff --git a/apps/website/src/assets/studio-deploy-flow.png b/apps/website/src/assets/studio-deploy-flow.png deleted file mode 100644 index 4fdd2ac40c18cbafbdbbe52a07be50977569bd79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67104 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 z 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≈?)%xY~~H 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

xVi*qBuIj+Henu9C@=|Y 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 -

-

Why teams use reDeploy

-

- For smart-contract teams deploying multi-contract systems across chains who need reproducible, - resumable, verifiable deployments — and a visual way to wire and inspect them. -

-
    - {BENEFITS.map((benefit) => ( -
  • -

    {benefit.title}

    -

    {benefit.description}

    - {benefit.packageName} -
  • - ))} -
-
- - ); -} diff --git a/apps/website/src/components/DependencyGraph.tsx b/apps/website/src/components/DependencyGraph.tsx new file mode 100644 index 0000000..ce61e12 --- /dev/null +++ b/apps/website/src/components/DependencyGraph.tsx @@ -0,0 +1,78 @@ +import { GRAPH_PANE } from "../content.js"; + +/** The dependency graph the example spec (SPEC_JSON) compiles to. */ +export default function DependencyGraph() { + return ( + + + + + + + + + + {/* edges */} + + + + {/* nodes */} + + + + Token + + + 0x9f1a…c44e ✓ + + + + Registry + + + 0x27b3…08d1 ✓ + + + + Vault ^^ + + + CREATE · pending + + {/* legend */} + + {GRAPH_PANE.legendTop} + + + {GRAPH_PANE.legendBottom} + + + + ); +} diff --git a/apps/website/src/components/Features.tsx b/apps/website/src/components/Features.tsx deleted file mode 100644 index 6edcc77..0000000 --- a/apps/website/src/components/Features.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { FEATURES } from "../content.js"; -import studioCanvas from "../assets/studio-canvas.png"; -import studioInspector from "../assets/studio-inspector.png"; -import studioTemplates from "../assets/studio-templates.png"; -import studioDeployFlow from "../assets/studio-deploy-flow.png"; - -// Real Studio screenshots (captured from the running @redeploy/studio app), -// keyed by feature.id. See apps/website/src/assets/ for the source PNGs. -const SCREENSHOTS: Record = { - canvas: studioCanvas, - inspector: studioInspector, - templates: studioTemplates, - "deploy-flow": studioDeployFlow, -}; - -export default function Features() { - return ( -
-

Studio, at a glance

-

- The visual studio (@redeploy/studio) authors and inspects your deployment graph. The screenshots - below are real captures of the running app. -

-
    - {FEATURES.map((feature) => ( -
  • -
    -

    {feature.title}

    -

    {feature.description}

    -
    -
    -
    - {feature.screenshotCaption} -
    -
    {feature.screenshotCaption}
    -
    -
  • - ))} -
-
- ); -} diff --git a/apps/website/src/components/Footer.tsx b/apps/website/src/components/Footer.tsx index 906d69e..95d0a64 100644 --- a/apps/website/src/components/Footer.tsx +++ b/apps/website/src/components/Footer.tsx @@ -1,24 +1,20 @@ -import { FOOTER_LINKS } from "../content.js"; - -const currentYear = new Date().getFullYear(); +import { FOOTER } from "../content.js"; export default function Footer() { return ( -
- -

- © {currentYear} reDeploy. Built on{" "} - - Hardhat Ignition - - . -

+
); } diff --git a/apps/website/src/components/Hero.tsx b/apps/website/src/components/Hero.tsx index ea84f23..3bbac31 100644 --- a/apps/website/src/components/Hero.tsx +++ b/apps/website/src/components/Hero.tsx @@ -1,16 +1,15 @@ import { HERO } from "../content.js"; +import RichText from "./RichText.js"; export default function Hero() { return ( -
-

{HERO.eyebrow}

-

- {HERO.headline} +
+

+

-

{HERO.subhead}

- - {HERO.ctaLabel} - -

+

+ +

+ ); } diff --git a/apps/website/src/components/Packages.tsx b/apps/website/src/components/Packages.tsx new file mode 100644 index 0000000..9c00a82 --- /dev/null +++ b/apps/website/src/components/Packages.tsx @@ -0,0 +1,20 @@ +import { PACKAGES, PACKAGES_HEADING } from "../content.js"; + +export default function Packages() { + return ( +
+
+ {PACKAGES_HEADING.label} + {PACKAGES_HEADING.rest} +
+
+ {PACKAGES.map((pkg) => ( +
+
{pkg.name}
+
{pkg.description}
+
+ ))} +
+
+ ); +} diff --git a/apps/website/src/components/Pipeline.tsx b/apps/website/src/components/Pipeline.tsx new file mode 100644 index 0000000..13b1bf8 --- /dev/null +++ b/apps/website/src/components/Pipeline.tsx @@ -0,0 +1,29 @@ +import { PIPELINE_HEADING, PIPELINE_NOTE, PIPELINE_STAGES } from "../content.js"; +import RichText from "./RichText.js"; + +export default function Pipeline() { + return ( +
+
+ {PIPELINE_HEADING.label} + {PIPELINE_HEADING.rest} +
+
+ {PIPELINE_STAGES.map((stage) => ( +
+ {stage.num} +

+ +

+

+ +

+
+ ))} +
+

+ +

+
+ ); +} diff --git a/apps/website/src/components/RichText.tsx b/apps/website/src/components/RichText.tsx new file mode 100644 index 0000000..300d526 --- /dev/null +++ b/apps/website/src/components/RichText.tsx @@ -0,0 +1,28 @@ +import { Fragment } from "react"; +import type { RichSegment } from "../content.js"; + +/** Renders an array of RichSegment as inline nodes: code/em/b elements or a lime ``. */ +export default function RichText({ segments }: { segments: RichSegment[] }) { + return ( + <> + {segments.map((seg, i) => { + switch (seg.as) { + case "code": + return {seg.text}; + case "em": + return {seg.text}; + case "b": + return {seg.text}; + case "hl": + return ( + + {seg.text} + + ); + default: + return {seg.text}; + } + })} + + ); +} diff --git a/apps/website/src/components/SpecCode.tsx b/apps/website/src/components/SpecCode.tsx new file mode 100644 index 0000000..66b08d7 --- /dev/null +++ b/apps/website/src/components/SpecCode.tsx @@ -0,0 +1,69 @@ +// Lightweight syntax highlighter for the tiny spec-JSON dialect shown in the +// hero split pane. Rather than hand-authoring a tree of colored s (easy +// to typo and hard to keep in sync with content.ts), we tokenize the raw +// SPEC_JSON text at render time and color it the same way the approved design +// does: keys dim, plain string values ink, {"ref": …} lime, {"param"/"read": …} +// amber, and JSON punctuation a muted grey. Everything else (whitespace, +// newlines, indentation) is left uncolored. + +type TokenClass = "k" | "s" | "ref" | "par" | "pun"; + +interface Token { + text: string; + cls?: TokenClass; +} + +const TOKEN_RE = /\{"ref":\s*"[^"]*"\}|\{"(?:param|read)":\s*"[^"]*"\}|"[^"]*"|[{}[\]:,]/g; + +export function tokenizeSpec(source: string): Token[] { + const tokens: Token[] = []; + let lastIndex = 0; + + for (const match of source.matchAll(TOKEN_RE)) { + const text = match[0]; + const index = match.index ?? 0; + + if (index > lastIndex) { + tokens.push({ text: source.slice(lastIndex, index) }); + } + + let cls: TokenClass; + if (text.startsWith('{"ref"')) { + cls = "ref"; + } else if (text.startsWith('{"param"') || text.startsWith('{"read"')) { + cls = "par"; + } else if (text.startsWith('"')) { + const after = source.slice(index + text.length); + cls = /^\s*:/.test(after) ? "k" : "s"; + } else { + cls = "pun"; + } + + tokens.push({ text, cls }); + lastIndex = index + text.length; + } + + if (lastIndex < source.length) { + tokens.push({ text: source.slice(lastIndex) }); + } + + return tokens; +} + +export default function SpecCode({ source }: { source: string }) { + const tokens = tokenizeSpec(source); + + return ( +
+ {tokens.map((token, i) => + token.cls ? ( + + {token.text} + + ) : ( + {token.text} + ), + )} +
+ ); +} diff --git a/apps/website/src/components/SpecGraphSection.tsx b/apps/website/src/components/SpecGraphSection.tsx new file mode 100644 index 0000000..b0254d0 --- /dev/null +++ b/apps/website/src/components/SpecGraphSection.tsx @@ -0,0 +1,33 @@ +import { GRAPH_PANE, SPEC_JSON, SPEC_PANE, SPLIT_CAPTION } from "../content.js"; +import DependencyGraph from "./DependencyGraph.js"; +import RichText from "./RichText.js"; +import SpecCode from "./SpecCode.js"; + +/** Split panel: the spec you write (left) ⇄ the dependency graph it compiles to (right). */ +export default function SpecGraphSection() { + return ( + <> +
+
+
+ {SPEC_PANE.command} + {SPEC_PANE.note} +
+ +
+
+
+ {GRAPH_PANE.command} + {GRAPH_PANE.note} +
+
+ +
+
+
+

+ +

+ + ); +} diff --git a/apps/website/src/components/Studio.tsx b/apps/website/src/components/Studio.tsx new file mode 100644 index 0000000..558fc9a --- /dev/null +++ b/apps/website/src/components/Studio.tsx @@ -0,0 +1,25 @@ +import studioCanvas from "../assets/studio-canvas.png"; +import { STUDIO_SECTION } from "../content.js"; +import RichText from "./RichText.js"; + +export default function Studio() { + return ( +
+ +
+ {STUDIO_SECTION.screenshotAlt} +
+
+ ); +} diff --git a/apps/website/src/components/Topbar.tsx b/apps/website/src/components/Topbar.tsx new file mode 100644 index 0000000..bc65eae --- /dev/null +++ b/apps/website/src/components/Topbar.tsx @@ -0,0 +1,30 @@ +import { NAV_LINKS } from "../content.js"; + +export default function Topbar() { + return ( +
+ + + reDeploy + {" "} + ^^ + +
+ ); +} diff --git a/apps/website/src/content.ts b/apps/website/src/content.ts index 2327f48..aaead59 100644 --- a/apps/website/src/content.ts +++ b/apps/website/src/content.ts @@ -1,119 +1,195 @@ -// Marketing copy for the reDeploy site. +// Marketing copy & structured content for the reDeploy site (spec ⇄ graph redesign). // -// Source of truth: repo-root CLAUDE.md ("What this project is" + package -// descriptions under "Key directories"). Keep this file in sync with that — +// Source of truth for narrative claims: repo-root CLAUDE.md ("What this project is" + +// package descriptions under "Key directories"). Keep this file in sync with that — // do not claim anything reDeploy does not do today. export const REPO_URL = "https://github.com/robercano/reDeploy"; -// Placeholder — no docs site exists yet. Swap for a real URL once published. -export const DOCS_URL = "https://github.com/robercano/reDeploy#readme"; +// No public Studio instance yet — link to the source instead of a live deploy. +export const STUDIO_URL = "https://github.com/robercano/reDeploy/tree/main/apps/studio"; + +/** + * A run of rich text. Plain by default; `as` wraps it in an inline element: + * "code" -> , "em" -> , "b" -> , "hl" -> a lime-highlighted . + */ +export interface RichSegment { + text: string; + as?: "code" | "em" | "b" | "hl"; +} + +export interface NavLink { + label: string; + href: string; +} + +export const NAV_LINKS: NavLink[] = [ + { label: "pipeline", href: "#pipeline" }, + { label: "studio", href: "#studio" }, + { label: "packages", href: "#packages" }, + { label: "github", href: REPO_URL }, +]; export const HERO = { - eyebrow: "Built on Hardhat Ignition", - headline: "Declarative, idempotent, resumable smart-contract deployments.", - subhead: - "reDeploy lets smart-contract teams declaratively define multi-contract deployments — constructor " + - "args, inter-contract links, ordering — deploy them idempotently and resumably, apply resumable " + - "post-deployment configuration, verify source and on-chain state, and read deployment state from " + - "external systems. A visual studio authors and inspects it all.", - ctaLabel: "View on GitHub", - ctaHref: REPO_URL, + headline: [{ text: "One spec. One graph. " }, { text: "One truth.", as: "hl" }] as RichSegment[], + subhead: [ + { + text: "Declare your multi-contract system — args, links, ordering — and reDeploy keeps chain and spec in agreement: ", + }, + { text: "idempotent deploys", as: "b" }, + { text: ", " }, + { text: "resumable configuration", as: "b" }, + { text: ", " }, + { text: "verified state", as: "b" }, + { text: ". Built on Hardhat Ignition." }, + ] as RichSegment[], +}; + +export const SPEC_PANE = { + command: "cat protocol.spec.json", + note: "what you write", +}; + +export const GRAPH_PANE = { + command: "redeploy simulate", + note: "what it means", + svgLabel: "Dependency graph: Token and Registry feed Vault; config steps wire Registry to Vault", + legendTop: "— ref arg - - after · · · config wire", + legendBottom: "2 deployed · 1 planned · 2 config steps pending", }; -export interface Benefit { +// The example spec rendered (and syntax-highlighted) in the left-hand pane. Kept as +// plain text — SpecCode.tsx tokenizes it for display rather than hand-authoring spans. +export const SPEC_JSON = `{ + "contracts": [ + { "id": "Token", "args": ["Solid", "SLD"] }, + { "id": "Registry" }, + { "id": "Vault", + "args": [{"ref": "Token"}, {"param": "feeBps"}], + "after": ["Registry"] } + ], + "config": [ + { "wire": "Registry.register", "with": {"ref": "Vault"} }, + { "grantRole": "KEEPER", "on": "Vault", + "to": {"read": "Registry.opsAddress"} } + ] +}`; + +export const SPLIT_CAPTION: RichSegment[] = [ + { text: "the spec compiles to a dependency graph; the graph deploys in order; " }, + { text: "re-running changes only what's missing.", as: "hl" }, +]; + +export interface SectionHeading { + label: string; + rest: string; +} + +export const PIPELINE_HEADING: SectionHeading = { + label: "THE PIPELINE", + rest: " — one bar through every link, like the mark says", +}; + +export const PACKAGES_HEADING: SectionHeading = { + label: "PACKAGES", + rest: " — take only what you need", +}; + +export interface PipelineStage { id: string; - packageName: string; - title: string; - description: string; + num: string; + title: RichSegment[]; + description: RichSegment[]; } -export const BENEFITS: Benefit[] = [ +export const PIPELINE_STAGES: PipelineStage[] = [ { - id: "idempotent-resumable", - packageName: "@redeploy/core", - title: "Idempotent, resumable deployments", - description: - "A contract that's already deployed is never re-deployed. Journal-based resume means an " + - "interrupted multi-contract deployment picks up exactly where it left off.", + id: "deploy", + num: "01 deploy", + title: [{ text: "Deploy " }, { text: "^^", as: "hl" }], + description: [ + { text: "Topologically ordered from your " }, + { text: "ref", as: "code" }, + { text: "s and " }, + { text: "after", as: "code" }, + { text: "s. Idempotent by journal: deployed contracts are skipped, interrupted runs resume." }, + ], }, { - id: "resumable-config", - packageName: "@redeploy/config", - title: "Resumable post-deployment configuration", - description: - "Declarative configuration steps applied after deployment, with config-state idempotency — " + - "partial configuration runs resume cleanly instead of re-running steps that already succeeded.", + id: "configure", + num: "02 configure", + title: [{ text: "Configure" }], + description: [ + { text: "Roles, wiring, setters as declarative steps — " }, + { text: "set", as: "code" }, + { text: ", " }, + { text: "grantRole", as: "code" }, + { text: ", " }, + { text: "wire", as: "code" }, + { text: " — journaled and resumable, with args " }, + { text: "read", as: "code" }, + { text: " live from deployed contracts." }, + ], }, { - id: "verification", - packageName: "@redeploy/verify", - title: "Source and on-chain verification", - description: - "Verify contract source and bytecode via Etherscan/Sourcify, and assert that live on-chain " + - "configuration actually matches your declared spec.", + id: "verify", + num: "03 verify", + title: [{ text: "Verify" }], + description: [ + { text: "Source on Etherscan & Sourcify, then the rarer half: assert the " }, + { text: "live configuration", as: "em" }, + { text: " still matches the spec. Drift is a diff, not an incident." }, + ], }, { - id: "typed-reader", - packageName: "@redeploy/reader", - title: "Typed read-only access for external systems", - description: - "A read-only library exposing deployment and configuration state through a typed API, so other " + - "systems can query what's deployed and how it's configured without touching the deploy path.", - }, - { - id: "visual-studio", - packageName: "@redeploy/studio", - title: "Visual Studio", - description: - "Drag-and-drop authoring of the connection and configuration graph, emitting spec files, plus a " + - "live deployment inspector — all in one visual tool.", + id: "read", + num: "04 read", + title: [{ text: "Read" }], + description: [ + { + text: "A typed, read-only view of deployment + config state, with snapshots — one truth for frontends, subgraphs and ops.", + }, + ], }, ]; -export interface Feature { - id: string; - title: string; +export const PIPELINE_NOTE: RichSegment[] = [ + { text: "every stage is re-runnable at any time — " }, + { text: "the pipeline converges on the spec instead of executing scripts.", as: "hl" }, +]; + +export const STUDIO_SECTION = { + title: [{ text: "Or skip the JSON. " }, { text: "Draw it.", as: "hl" }] as RichSegment[], + body: "The reDeploy Studio is a drag-and-drop canvas over the same engine: author contracts and config visually, simulate the plan, deploy for real, and inspect any live deployment — it emits the exact spec files you'd write by hand, so the visual and the textual never fork.", + ctaPrimary: { label: "launch studio ^^", href: STUDIO_URL }, + ctaSecondary: { label: "view on github", href: REPO_URL }, + screenshotAlt: "reDeploy Studio canvas — drag-and-drop contract graph authoring", +}; + +export interface Package { + name: string; description: string; - screenshotCaption: string; } -export const FEATURES: Feature[] = [ - { - id: "canvas", - title: "Graph authoring canvas", - description: - "Drag contracts onto a canvas, wire constructor arguments and inter-contract links, and let " + - "reDeploy resolve dependency ordering. The graph is the spec — Studio emits spec files directly " + - "from what you draw.", - screenshotCaption: "Studio canvas — drag-and-drop contract graph authoring", - }, - { - id: "inspector", - title: "Deployment inspector", - description: - "Load an existing deployment and inspect its live contract graph and configuration state, powered " + - "by the same typed reader API available to external systems.", - screenshotCaption: "Deployment inspector — live contract graph and state", - }, - { - id: "templates", - title: "Template gallery", - description: - "Start from a built-in or saved template instead of an empty canvas — reusable starting points for " + - "common multi-contract topologies.", - screenshotCaption: "Template gallery — start from a reusable deployment template", - }, - { - id: "deploy-flow", - title: "Simulate, then deploy", - description: - "Review a deployment plan and simulate it before executing, so you see what would happen before it " + - "happens on chain.", - screenshotCaption: "Deploy flow — simulate a plan before executing it", - }, +export const PACKAGES: Package[] = [ + { name: "@redeploy/core", description: "spec → Ignition module · ordering · idempotent deploys" }, + { name: "@redeploy/config", description: "resumable post-deploy configuration steps" }, + { name: "@redeploy/verify", description: "source verification + on-chain drift detection" }, + { name: "@redeploy/reader", description: "typed read-only state API + snapshots" }, + { name: "@redeploy/studio", description: "visual authoring & inspection" }, ]; -export const FOOTER_LINKS = [ - { label: "GitHub", href: REPO_URL }, - { label: "Docs", href: DOCS_URL }, -]; +export interface FamilyLink { + label: string; + href?: string; + current?: boolean; +} + +export const FOOTER = { + promptUser: "roberto@thesolidchain:~$", + promptRest: "a product of The Solid Chain", + family: [ + { label: "reCode ", href: "#" }, + { label: "reDeploy ^^", current: true }, + { label: "reDeFi <=>", href: "#" }, + ] as FamilyLink[], +}; diff --git a/apps/website/src/styles.css b/apps/website/src/styles.css index f006059..e23ee86 100644 --- a/apps/website/src/styles.css +++ b/apps/website/src/styles.css @@ -1,20 +1,14 @@ :root { - color-scheme: light dark; - --color-bg: #0b0f19; - --color-bg-alt: #121828; - --color-fg: #e7ebf3; - --color-fg-muted: #9aa5b8; - --color-accent: #6ea8fe; - --color-border: #232b40; - --max-width: 72rem; - font-family: - system-ui, - -apple-system, - "Segoe UI", - Roboto, - Helvetica, - Arial, - sans-serif; + --bg: #0d0a05; + --panel: #121008; + --edge: #292112; + --ink: #e4dac2; + --dim: #8a7b5c; + --accent: #f5a524; + --lime: #d6ff7a; + --ok: #3fb950; + --hi: #f7eed9; + --mono: ui-monospace, "Cascadia Code", "JetBrains Mono", Menlo, Consolas, monospace; } * { @@ -23,256 +17,420 @@ body { margin: 0; - background: var(--color-bg); - color: var(--color-fg); - line-height: 1.5; + color: var(--ink); + font-family: var(--mono); + font-size: 13.5px; + line-height: 1.65; + background: + repeating-linear-gradient(0deg, rgba(245, 165, 36, 0.015) 0 1px, transparent 1px 3px), + var(--bg); } .page { - display: flex; - flex-direction: column; min-height: 100vh; } -main { - flex: 1; +.wrap { + max-width: 1080px; + margin: 0 auto; + padding: 0 18px; } -section { - max-width: var(--max-width); - margin: 0 auto; - padding: 4rem 1.5rem; +.hl { + color: var(--lime); } -h1, -h2, -h3 { - line-height: 1.15; +/* topbar */ +.topbar { + display: flex; + align-items: center; + gap: 14px; + padding: 12px 18px; + border-bottom: 1px solid var(--edge); + background: var(--panel); + position: sticky; + top: 0; + z-index: 5; + font-size: 12px; } -/* Hero */ -.hero { - text-align: center; - padding-top: 6rem; - padding-bottom: 5rem; +.topbar .mark { + width: 30px; + height: 30px; } -.hero__eyebrow { - text-transform: uppercase; - letter-spacing: 0.08em; - font-size: 0.85rem; - color: var(--color-accent); +.topbar b { + color: var(--hi); font-weight: 600; - margin: 0 0 1rem; } -.hero__headline { - font-size: clamp(2rem, 5vw, 3.25rem); - margin: 0 0 1.5rem; +.topbar b .re { + color: var(--dim); + font-weight: 500; } -.hero__subhead { - font-size: 1.15rem; - color: var(--color-fg-muted); - max-width: 46rem; - margin: 0 auto 2.5rem; +.topbar nav { + margin-left: auto; + display: flex; + gap: 16px; } -.hero__cta { - display: inline-block; - background: var(--color-accent); - color: #0b0f19; - font-weight: 600; +.topbar a { + color: var(--dim); text-decoration: none; - padding: 0.85rem 2rem; - border-radius: 0.5rem; } -.hero__cta:hover, -.hero__cta:focus-visible { - opacity: 0.9; +.topbar a:hover, +.topbar a:focus-visible { + color: var(--accent); + outline: none; } -/* Section shared */ -.section-lede { - color: var(--color-fg-muted); - max-width: 46rem; - margin: 0 0 2.5rem; +/* hero */ +.heroText { + text-align: center; + padding: 52px 0 8px; } -/* Benefits */ -.benefits { - background: var(--color-bg-alt); - max-width: none; - padding: 0; +h1 { + font-family: "Space Grotesk", var(--mono); + font-size: clamp(30px, 5vw, 44px); + margin: 0; + color: var(--hi); + letter-spacing: -0.015em; } -/* Inner content wrapper mirrors the plain `section` box (same max-width + - padding) so the heading/lede/grid line up with hero and features, while - `.benefits` itself stays full-bleed for the background band. */ -.benefits__inner { - max-width: var(--max-width); - margin: 0 auto; - padding: 4rem 1.5rem; +.heroText p { + color: var(--dim); + max-width: 64ch; + margin: 12px auto 0; } -.benefits__list { - list-style: none; - margin: 0; - padding: 0; +.heroText p b { + color: var(--ink); +} + +.split { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 0; + margin: 34px 0 10px; + background: var(--panel); + border: 1px solid var(--edge); + border-radius: 8px; + overflow: hidden; +} + +@media (max-width: 860px) { + .split { + grid-template-columns: 1fr; + } +} + +.pane { + min-width: 0; +} + +.pane + .pane { + border-left: 1px solid var(--edge); +} + +@media (max-width: 860px) { + .pane + .pane { + border-left: 0; + border-top: 1px solid var(--edge); + } +} + +.pane .head { display: flex; - flex-wrap: wrap; - justify-content: center; - gap: 1.5rem; + justify-content: space-between; + gap: 10px; + padding: 9px 16px; + border-bottom: 1px solid var(--edge); + font-size: 12px; + color: var(--dim); } -.benefits__item { - flex: 1 1 16rem; - max-width: 21rem; - border: 1px solid var(--color-border); - border-radius: 0.75rem; - padding: 1.5rem; +.pane .head .cmd { + color: var(--accent); } -.benefits__item h3 { - margin: 0 0 0.5rem; - font-size: 1.1rem; +.pane .head .cmd::before { + content: "$ "; + color: var(--dim); } -.benefits__item p { - color: var(--color-fg-muted); - margin: 0 0 0.75rem; +.code { + padding: 16px 18px; + font-size: 12.5px; + line-height: 1.75; + overflow-x: auto; + white-space: pre; } -.benefits__package { - font-size: 0.8rem; - color: var(--color-accent); - background: rgba(110, 168, 254, 0.1); - padding: 0.2rem 0.5rem; - border-radius: 0.35rem; +.code .k { + color: var(--dim); +} /* keys */ +.code .s { + color: var(--ink); +} /* strings */ +.code .ref { + color: var(--lime); +} /* refs */ +.code .par { + color: var(--accent); +} /* params/exprs */ +.code .pun { + color: #5a4f38; } -/* Features */ -.features__list { - list-style: none; - margin: 0; - padding: 0; +.graphPane { display: flex; - flex-direction: column; - gap: 3rem; + align-items: center; + justify-content: center; + padding: 14px; } -.features__item { +.caption { + text-align: center; + color: var(--dim); + font-size: 12px; + margin: 10px 0 54px; +} + +/* pipeline: the bar through the links */ +.mh { + color: var(--dim); + font-size: 12px; + letter-spacing: 0.22em; + text-transform: uppercase; + margin: 0 0 18px; +} + +.mh::before { + content: "$ "; + color: var(--accent); + letter-spacing: 0; + text-transform: none; +} + +.mh b { + color: var(--hi); + letter-spacing: 0.22em; +} + +.pipe { + position: relative; display: grid; - grid-template-columns: 1fr 1fr; - gap: 2rem; - align-items: center; + grid-template-columns: repeat(4, 1fr); + gap: 14px; + margin-bottom: 8px; } -.features__item:nth-child(even) .features__text { - order: 2; +@media (max-width: 860px) { + .pipe { + grid-template-columns: 1fr 1fr; + } } -.features__text h3 { - margin: 0 0 0.75rem; - font-size: 1.3rem; +@media (max-width: 520px) { + .pipe { + grid-template-columns: 1fr; + } } -.features__text p { - color: var(--color-fg-muted); - margin: 0; +.pipe::before { + content: ""; + position: absolute; + left: 2%; + right: 2%; + top: 34px; + height: 3px; + background: var(--accent); + opacity: 0.55; } -/* Feature screenshot (real Studio capture) */ -.feature-screenshot { - margin: 0; +@media (max-width: 860px) { + .pipe::before { + display: none; + } } -.feature-screenshot__box { - aspect-ratio: 16 / 10; - border: 1px solid var(--color-border); - border-radius: 0.75rem; - overflow: hidden; - background: var(--color-bg-alt); +.stage { + position: relative; + background: var(--panel); + border: 1px solid var(--edge); + border-radius: 8px; + padding: 16px; } -.feature-screenshot__box img { - display: block; - width: 100%; - height: 100%; - object-fit: cover; - object-position: top; +.stage .num { + position: absolute; + top: -11px; + left: 14px; + background: var(--bg); + border: 1px solid var(--accent); + color: var(--accent); + border-radius: 12px; + font-size: 10.5px; + padding: 1px 10px; } -.feature-screenshot__caption { - margin-top: 0.75rem; - font-size: 0.85rem; - color: var(--color-fg-muted); - text-align: center; +.stage h3 { + margin: 12px 0 6px; + font-size: 14px; + color: var(--hi); + font-family: "Space Grotesk", var(--mono); } -/* Footer */ -.footer { - border-top: 1px solid var(--color-border); - padding: 2rem 1.5rem; - max-width: var(--max-width); - margin: 0 auto; - display: flex; - flex-direction: column; +.stage p { + margin: 0; + font-size: 12.3px; + color: var(--ink); +} + +.stage p code { + color: var(--lime); + background: rgba(214, 255, 122, 0.06); + padding: 0 4px; + border-radius: 3px; + font-size: 11.5px; +} + +.pipeNote { + color: var(--dim); + font-size: 12px; + margin: 10px 0 54px; +} + +/* studio band */ +.studio { + display: grid; + grid-template-columns: 1.1fr 1fr; + gap: 24px; align-items: center; - gap: 1rem; - text-align: center; + background: var(--panel); + border: 1px solid var(--edge); + border-radius: 8px; + padding: 22px; + margin-bottom: 54px; } -.footer__links { - display: flex; - gap: 1.5rem; +@media (max-width: 860px) { + .studio { + grid-template-columns: 1fr; + } } -.footer__links a { - color: var(--color-fg); +.studio h2 { + font-family: "Space Grotesk", var(--mono); + margin: 0 0 8px; + font-size: 22px; + color: var(--hi); +} + +.studio p { + margin: 0 0 14px; + font-size: 13px; +} + +.btn { + display: inline-block; + padding: 10px 20px; + border: 1px solid var(--lime); + border-radius: 5px; + background: rgba(214, 255, 122, 0.07); + color: var(--lime); + font-weight: 700; text-decoration: none; + font-size: 13px; + margin-right: 10px; } -.footer__links a:hover, -.footer__links a:focus-visible { - color: var(--color-accent); +.btn:hover, +.btn:focus-visible { + background: var(--lime); + color: #141804; + outline: none; } -.footer__attribution { - color: var(--color-fg-muted); - font-size: 0.85rem; - margin: 0; +.btn.amber { + border-color: var(--accent); + background: rgba(245, 165, 36, 0.07); + color: var(--accent); } -.footer__attribution a { - color: var(--color-fg-muted); +.btn.amber:hover, +.btn.amber:focus-visible { + background: var(--accent); + color: #140f04; } -/* Responsive */ -@media (max-width: 48rem) { - section { - padding: 3rem 1.25rem; - } +.shot { + border: 1px solid var(--edge); + border-radius: 6px; + overflow: hidden; +} - .hero { - padding-top: 4rem; - } +.shot img { + display: block; + width: 100%; + height: auto; +} - .benefits__inner { - padding: 3rem 1.25rem; - } +/* packages */ +.pkgs { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 12px; + margin-bottom: 54px; +} - .benefits__item { - flex-basis: 100%; - max-width: none; - } +.pkg { + background: var(--panel); + border: 1px solid var(--edge); + border-radius: 6px; + padding: 14px; +} - .features__item { - grid-template-columns: 1fr; - } +.pkg .n { + color: var(--lime); + font-weight: 600; + font-size: 12.5px; +} - .features__item:nth-child(even) .features__text { - order: initial; - } +.pkg .d { + color: var(--dim); + font-size: 11.8px; + margin-top: 4px; +} + +/* footer */ +footer { + border-top: 1px solid var(--edge); + padding: 14px 0 40px; + font-size: 11px; + color: var(--dim); + display: flex; + justify-content: space-between; + gap: 14px; + flex-wrap: wrap; +} + +footer .prompt { + color: var(--accent); +} + +footer .fam a { + color: var(--dim); + text-decoration: none; +} + +footer .fam a:hover { + color: var(--ink); +} + +footer .fam .cur { + color: var(--lime); } diff --git a/apps/website/test/App.test.tsx b/apps/website/test/App.test.tsx index d629ed9..f3ada95 100644 --- a/apps/website/test/App.test.tsx +++ b/apps/website/test/App.test.tsx @@ -1,66 +1,83 @@ -import { render, screen } from "@testing-library/react"; +import { render, screen, within } from "@testing-library/react"; import App from "../src/App.js"; -import { HERO, BENEFITS, FEATURES, REPO_URL } from "../src/content.js"; +import { GRAPH_PANE, NAV_LINKS, PACKAGES, PIPELINE_STAGES, REPO_URL, STUDIO_SECTION, STUDIO_URL } from "../src/content.js"; describe("App", () => { - it("renders the hero pitch and primary CTA", () => { + it("renders a sticky topbar with the four nav anchors", () => { render(); - expect(screen.getByRole("heading", { level: 1, name: HERO.headline })).toBeInTheDocument(); + for (const link of NAV_LINKS) { + const anchor = screen.getByRole("link", { name: link.label }); + expect(anchor).toHaveAttribute("href", link.href); + } + }); + + it("renders the hero headline and subhead", () => { + render(); - const cta = screen.getByRole("link", { name: HERO.ctaLabel }); - expect(cta).toHaveAttribute("href", REPO_URL); + expect(screen.getByRole("heading", { level: 1, name: /One spec\. One graph\. One truth\./ })).toBeInTheDocument(); + expect(screen.getByText(/Built on Hardhat Ignition\./)).toBeInTheDocument(); }); - it("lists all five reDeploy packages as benefits", () => { + it("renders the spec pane with the example contracts and the dependency graph", () => { render(); - for (const benefit of BENEFITS) { - expect(screen.getByText(benefit.packageName)).toBeInTheDocument(); + expect(screen.getByText("cat protocol.spec.json")).toBeInTheDocument(); + for (const value of ["Token", "Registry", "Vault", "feeBps", "KEEPER"]) { + expect(screen.getAllByText(new RegExp(value)).length).toBeGreaterThan(0); } - expect(BENEFITS.map((b) => b.packageName)).toEqual([ - "@redeploy/core", - "@redeploy/config", - "@redeploy/verify", - "@redeploy/reader", - "@redeploy/studio", - ]); + expect(screen.getByRole("img", { name: GRAPH_PANE.svgLabel })).toBeInTheDocument(); }); - it("renders a real Studio screenshot for every feature, with a matching caption", () => { + it("renders all four pipeline stages, in order, with inline code terms", () => { render(); - const images = screen.getAllByRole("img"); - expect(images.length).toBe(FEATURES.length); + const pipeline = document.getElementById("pipeline"); + expect(pipeline).not.toBeNull(); + const stages = within(pipeline as HTMLElement).getAllByRole("heading", { level: 3 }); + expect(stages.map((h) => h.textContent?.trim())).toEqual(["Deploy ^^", "Configure", "Verify", "Read"]); + expect(PIPELINE_STAGES).toHaveLength(4); - const srcStemById: Record = { - canvas: "studio-canvas", - inspector: "studio-inspector", - templates: "studio-templates", - "deploy-flow": "studio-deploy-flow", - }; + expect(within(pipeline as HTMLElement).getByText("ref")).toBeInTheDocument(); + expect(within(pipeline as HTMLElement).getByText("grantRole")).toBeInTheDocument(); + }); + + it("renders the Studio band with a real screenshot and the two real CTAs", () => { + render(); - for (const feature of FEATURES) { - const img = screen.getByAltText(feature.screenshotCaption) as HTMLImageElement; - expect(screen.getByText(feature.screenshotCaption)).toBeInTheDocument(); + const img = screen.getByAltText(STUDIO_SECTION.screenshotAlt) as HTMLImageElement; + expect(img.getAttribute("src")).toContain("studio-canvas"); - const src = img.getAttribute("src"); - expect(src).toBeTruthy(); - expect(src).toContain(srcStemById[feature.id]); - } + const launch = screen.getByRole("link", { name: STUDIO_SECTION.ctaPrimary.label }); + expect(launch).toHaveAttribute("href", STUDIO_URL); - const srcs = images.map((img) => img.getAttribute("src")); - expect(new Set(srcs).size).toBe(FEATURES.length); + const github = screen.getByRole("link", { name: STUDIO_SECTION.ctaSecondary.label }); + expect(github).toHaveAttribute("href", REPO_URL); }); - it("links to the GitHub repo in the footer", () => { + it("lists all five reDeploy packages, none dropped or duplicated", () => { render(); - const githubLinks = screen.getAllByRole("link", { name: "GitHub" }); - expect(githubLinks.length).toBeGreaterThan(0); - for (const link of githubLinks) { - expect(link).toHaveAttribute("href", REPO_URL); + for (const pkg of PACKAGES) { + expect(screen.getByText(pkg.name)).toBeInTheDocument(); } + expect(PACKAGES).toHaveLength(5); + }); + + it("renders the footer prompt line and family strip with reDeploy as current", () => { + render(); + + expect(screen.getByText("roberto@thesolidchain:~$")).toBeInTheDocument(); + expect(screen.getByText("reDeploy ^^")).toBeInTheDocument(); + expect(screen.getByRole("link", { name: "reCode " })).toHaveAttribute("href", "#"); + expect(screen.getByRole("link", { name: "reDeFi <=>" })).toHaveAttribute("href", "#"); + }); + + it("links to the real GitHub repo from the topbar", () => { + render(); + + const githubLink = screen.getByRole("link", { name: "github" }); + expect(githubLink).toHaveAttribute("href", REPO_URL); }); }); diff --git a/apps/website/test/Benefits.test.tsx b/apps/website/test/Benefits.test.tsx deleted file mode 100644 index d7e2bc8..0000000 --- a/apps/website/test/Benefits.test.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { render, screen } from "@testing-library/react"; -import Benefits from "../src/components/Benefits.js"; -import { BENEFITS } from "../src/content.js"; - -describe("Benefits", () => { - it("labels the section with the heading via aria-labelledby", () => { - render(); - - const heading = screen.getByRole("heading", { level: 2, name: "Why teams use reDeploy" }); - expect(heading).toHaveAttribute("id", "benefits-heading"); - - const section = heading.closest("section"); - expect(section).toHaveAttribute("aria-labelledby", "benefits-heading"); - }); - - it("wraps the heading, lede, and card list in a single alignment container", () => { - render(); - - const heading = screen.getByRole("heading", { level: 2, name: "Why teams use reDeploy" }); - const list = screen.getByRole("list"); - - // Regression guard for #132: heading and list must share one common - // parent (the `.benefits__inner` wrapper) so they get identical - // horizontal alignment instead of each being centered independently. - const headingWrapper = heading.parentElement; - expect(headingWrapper).toHaveClass("benefits__inner"); - expect(headingWrapper).toContainElement(list); - }); - - it("renders all five benefit cards, none dropped or duplicated", () => { - render(); - - const list = screen.getByRole("list"); - const items = list.querySelectorAll(":scope > .benefits__item"); - expect(items).toHaveLength(5); - expect(items).toHaveLength(BENEFITS.length); - - for (const benefit of BENEFITS) { - expect(screen.getByRole("heading", { level: 3, name: benefit.title })).toBeInTheDocument(); - expect(screen.getByText(benefit.packageName)).toBeInTheDocument(); - } - }); - - it("uses a wrapping flex layout for the card list so an uneven last row centers instead of stretching", () => { - // jsdom doesn't compute real layout, but we can assert the structural - // choice that guards against the 4-on-top + 1-orphan grid regression: - // every card is a direct
  • of the same - //
      , with no per-item inline width hacks that - // would fight the CSS wrap/centering behavior. - render(); - - const list = screen.getByRole("list"); - expect(list).toHaveClass("benefits__list"); - - const items = list.querySelectorAll(":scope > li"); - expect(items).toHaveLength(5); - for (const item of items) { - expect(item).toHaveClass("benefits__item"); - expect(item.getAttribute("style")).toBeNull(); - } - }); -}); diff --git a/apps/website/test/Packages.test.tsx b/apps/website/test/Packages.test.tsx new file mode 100644 index 0000000..268bf31 --- /dev/null +++ b/apps/website/test/Packages.test.tsx @@ -0,0 +1,32 @@ +import { render, screen } from "@testing-library/react"; +import Packages from "../src/components/Packages.js"; +import { PACKAGES, PACKAGES_HEADING } from "../src/content.js"; + +describe("Packages", () => { + it("labels the section with the micro-heading", () => { + render(); + + expect(screen.getByText(PACKAGES_HEADING.label)).toBeInTheDocument(); + const section = screen.getByText(PACKAGES_HEADING.label).closest("section"); + expect(section).toHaveAttribute("id", "packages"); + }); + + it("renders all five package cards, none dropped or duplicated", () => { + render(); + + expect(PACKAGES).toHaveLength(5); + for (const pkg of PACKAGES) { + expect(screen.getByText(pkg.name)).toBeInTheDocument(); + expect(screen.getByText(pkg.description)).toBeInTheDocument(); + } + }); + + it("wraps every card in a .pkg element inside a single .pkgs grid", () => { + render(); + + const grid = document.querySelector(".pkgs"); + expect(grid).not.toBeNull(); + const cards = grid?.querySelectorAll(":scope > .pkg"); + expect(cards).toHaveLength(PACKAGES.length); + }); +}); diff --git a/apps/website/test/SpecCode.test.tsx b/apps/website/test/SpecCode.test.tsx new file mode 100644 index 0000000..f5e2684 --- /dev/null +++ b/apps/website/test/SpecCode.test.tsx @@ -0,0 +1,48 @@ +import { render } from "@testing-library/react"; +import SpecCode, { tokenizeSpec } from "../src/components/SpecCode.js"; +import { SPEC_JSON } from "../src/content.js"; + +describe("tokenizeSpec", () => { + it("reassembles to the exact source text", () => { + const tokens = tokenizeSpec(SPEC_JSON); + expect(tokens.map((t) => t.text).join("")).toBe(SPEC_JSON); + }); + + it("classes {\"ref\": ...} objects as ref and {\"param\"/\"read\": ...} objects as par", () => { + const tokens = tokenizeSpec(SPEC_JSON); + const refTokens = tokens.filter((t) => t.cls === "ref"); + const parTokens = tokens.filter((t) => t.cls === "par"); + + expect(refTokens.map((t) => t.text)).toEqual(['{"ref": "Token"}', '{"ref": "Vault"}']); + expect(parTokens.map((t) => t.text)).toEqual(['{"param": "feeBps"}', '{"read": "Registry.opsAddress"}']); + }); + + it("classes object keys as k and plain string values as s", () => { + const tokens = tokenizeSpec(SPEC_JSON); + const keys = tokens.filter((t) => t.cls === "k").map((t) => t.text); + const strings = tokens.filter((t) => t.cls === "s").map((t) => t.text); + + expect(keys).toEqual( + expect.arrayContaining(['"contracts"', '"id"', '"args"', '"after"', '"config"', '"wire"', '"with"', '"grantRole"', '"on"', '"to"']), + ); + expect(strings).toEqual(expect.arrayContaining(['"Token"', '"Registry"', '"Vault"', '"KEEPER"'])); + }); + + it("classes JSON punctuation as pun and leaves whitespace unclassed", () => { + const tokens = tokenizeSpec('{"a": 1}\n '); + expect(tokens.filter((t) => t.cls === "pun").map((t) => t.text)).toEqual(["{", ":", "}"]); + expect(tokens.some((t) => !t.cls && /\s/.test(t.text))).toBe(true); + }); +}); + +describe("SpecCode", () => { + it("renders the tokenized source inside a .code block", () => { + const { container } = render(); + + const code = container.querySelector(".code"); + expect(code).not.toBeNull(); + expect(code?.textContent).toBe(SPEC_JSON); + expect(code?.querySelectorAll(".ref")).toHaveLength(2); + expect(code?.querySelectorAll(".par")).toHaveLength(2); + }); +}); diff --git a/apps/website/test/content.test.ts b/apps/website/test/content.test.ts index 0c28a1b..9c32e74 100644 --- a/apps/website/test/content.test.ts +++ b/apps/website/test/content.test.ts @@ -1,32 +1,94 @@ -import { BENEFITS, FEATURES, FOOTER_LINKS, REPO_URL } from "../src/content.js"; +import { + FOOTER, + GRAPH_PANE, + HERO, + NAV_LINKS, + PACKAGES, + PIPELINE_HEADING, + PIPELINE_NOTE, + PIPELINE_STAGES, + REPO_URL, + SPEC_JSON, + SPEC_PANE, + SPLIT_CAPTION, + STUDIO_SECTION, + STUDIO_URL, + type RichSegment, +} from "../src/content.js"; + +function flatten(segments: RichSegment[]): string { + return segments.map((s) => s.text).join(""); +} describe("content", () => { - it("has non-empty copy for every benefit", () => { - expect(BENEFITS.length).toBe(5); - for (const benefit of BENEFITS) { - expect(benefit.title.length).toBeGreaterThan(0); - expect(benefit.description.length).toBeGreaterThan(0); - expect(benefit.packageName.startsWith("@redeploy/")).toBe(true); - } + it("points every real link at the actual repo / studio source", () => { + expect(REPO_URL).toBe("https://github.com/robercano/reDeploy"); + expect(STUDIO_URL).toBe("https://github.com/robercano/reDeploy/tree/main/apps/studio"); + + const github = NAV_LINKS.find((l) => l.label === "github"); + expect(github?.href).toBe(REPO_URL); + + expect(STUDIO_SECTION.ctaPrimary.href).toBe(STUDIO_URL); + expect(STUDIO_SECTION.ctaSecondary.href).toBe(REPO_URL); }); - it("has non-empty copy and a screenshot caption for every feature", () => { - expect(FEATURES.length).toBeGreaterThan(0); - for (const feature of FEATURES) { - expect(feature.title.length).toBeGreaterThan(0); - expect(feature.description.length).toBeGreaterThan(0); - expect(feature.screenshotCaption.length).toBeGreaterThan(0); - } + it("has the four topbar nav anchors, in order", () => { + expect(NAV_LINKS.map((l) => l.label)).toEqual(["pipeline", "studio", "packages", "github"]); + expect(NAV_LINKS.find((l) => l.label === "pipeline")?.href).toBe("#pipeline"); + expect(NAV_LINKS.find((l) => l.label === "studio")?.href).toBe("#studio"); + expect(NAV_LINKS.find((l) => l.label === "packages")?.href).toBe("#packages"); + }); - expect(FEATURES.map((f) => f.id)).toEqual(["canvas", "inspector", "templates", "deploy-flow"]); + it("has a non-empty hero headline and subhead", () => { + expect(flatten(HERO.headline)).toContain("One truth."); + expect(flatten(HERO.subhead).length).toBeGreaterThan(0); + expect(HERO.subhead.some((s) => s.as === "b")).toBe(true); + }); - const captions = FEATURES.map((f) => f.screenshotCaption); - expect(new Set(captions).size).toBe(captions.length); + it("has a well-formed example spec that parses as JSON", () => { + expect(() => JSON.parse(SPEC_JSON)).not.toThrow(); + const parsed = JSON.parse(SPEC_JSON); + expect(parsed.contracts.map((c: { id: string }) => c.id)).toEqual(["Token", "Registry", "Vault"]); + expect(parsed.config).toHaveLength(2); }); - it("points footer links at the real GitHub repo", () => { - const github = FOOTER_LINKS.find((link) => link.label === "GitHub"); - expect(github?.href).toBe(REPO_URL); - expect(REPO_URL).toBe("https://github.com/robercano/reDeploy"); + it("labels the spec/graph panes", () => { + expect(SPEC_PANE.command).toBe("cat protocol.spec.json"); + expect(GRAPH_PANE.command).toBe("redeploy simulate"); + expect(GRAPH_PANE.svgLabel.length).toBeGreaterThan(0); + }); + + it("has a non-empty split caption", () => { + expect(flatten(SPLIT_CAPTION).length).toBeGreaterThan(0); + }); + + it("has all four pipeline stages, in order, each with a title and description", () => { + expect(PIPELINE_STAGES.map((s) => s.id)).toEqual(["deploy", "configure", "verify", "read"]); + for (const stage of PIPELINE_STAGES) { + expect(flatten(stage.title).length).toBeGreaterThan(0); + expect(flatten(stage.description).length).toBeGreaterThan(0); + } + expect(PIPELINE_HEADING.label).toBe("THE PIPELINE"); + expect(flatten(PIPELINE_NOTE).length).toBeGreaterThan(0); + }); + + it("lists all five reDeploy packages, none dropped or duplicated", () => { + expect(PACKAGES.map((p) => p.name)).toEqual([ + "@redeploy/core", + "@redeploy/config", + "@redeploy/verify", + "@redeploy/reader", + "@redeploy/studio", + ]); + for (const pkg of PACKAGES) { + expect(pkg.description.length).toBeGreaterThan(0); + } + }); + + it("has a footer prompt line and a three-entry family strip with exactly one current item", () => { + expect(FOOTER.promptUser).toBe("roberto@thesolidchain:~$"); + expect(FOOTER.family).toHaveLength(3); + expect(FOOTER.family.filter((f) => f.current)).toHaveLength(1); + expect(FOOTER.family.find((f) => f.current)?.label).toBe("reDeploy ^^"); }); }); diff --git a/apps/website/vite.config.ts b/apps/website/vite.config.ts index 0ff82b5..417129d 100644 --- a/apps/website/vite.config.ts +++ b/apps/website/vite.config.ts @@ -8,6 +8,10 @@ import react from "@vitejs/plugin-react"; export default defineConfig({ plugins: [react()], + // Relative asset paths so the static build works unmodified when served + // from a custom domain root on GitHub Pages (see public/CNAME). + base: "./", + server: { port: 5180, strictPort: true }, preview: { port: 5180, strictPort: true }, From f8a5f3190435541e003de1e37d28e0eb7ebe66c3 Mon Sep 17 00:00:00 2001 From: Roberto Cano <3525807+robercano@users.noreply.github.com> Date: Thu, 23 Jul 2026 07:12:59 +0200 Subject: [PATCH 2/2] =?UTF-8?q?chore(website):=20drop=20GitHub-Pages=20CNA?= =?UTF-8?q?ME=20file=20=E2=80=94=20site=20deploys=20via=20Cloudflare=20Pag?= =?UTF-8?q?es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- apps/website/public/CNAME | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/website/public/CNAME diff --git a/apps/website/public/CNAME b/apps/website/public/CNAME deleted file mode 100644 index caa6af5..0000000 --- a/apps/website/public/CNAME +++ /dev/null @@ -1 +0,0 @@ -redeploy.thesolidchain.com