From 058e510c65e292b33767cb8926762f6a1f7a9fa0 Mon Sep 17 00:00:00 2001 From: Ryan Moore Date: Sun, 26 Jul 2026 22:16:48 -0300 Subject: [PATCH 01/10] feat(hero): Direction C agentic loop ring + headline originality fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a visible Plan→Act→Observe loop ring (r=90) inside the innermost orbit to close the "orchestration but no loop" gap in the hero graphic. The ring rotates very slowly (45 s/rev) via GSAP so its arrowhead sweeps through the three static waypoint labels, showing which phase the orchestrator is currently in. A loop packet orbits at 12 s/lap — more deliberate than cable packets. A faint counter- rotating depth ring (r=76, 62 s/rev) adds dimensionality. All motion is behind prefers-reduced-motion: the static ring + labels remain a complete composition. Hero headline originality: swap Hanken Grotesk for Syne (self-hosted variable font, latin subset, 34 KB) on .hero__title only — distinctive geometric grotesque at 780–800 weight reads "precise engineer", not SaaS template. The 'AI agent systems' moves from accent-hi blue to pure white + brand-blue ruled underline: a technical annotation marker, not a generative gradient. Build: npm run build → 9 pages, 0 errors, 2.11 s. Co-Authored-By: Claude Sonnet 4.6 --- public/fonts/syne-variable-latin.woff2 | Bin 0 -> 34608 bytes src/components/Schematic.astro | 165 ++++++++++++++++++++----- src/layouts/Base.astro | 3 + src/styles/global.css | 83 ++++++++++++- 4 files changed, 217 insertions(+), 34 deletions(-) create mode 100644 public/fonts/syne-variable-latin.woff2 diff --git a/public/fonts/syne-variable-latin.woff2 b/public/fonts/syne-variable-latin.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e311600b11d12da9aa07b9ea731a7f89e5b9c2b9 GIT binary patch literal 34608 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 = { @@ -31,14 +40,15 @@ const C = { x: 600, y: 300 }; const R_sun = 64; // cables meet the sun's body here const ORBIT = { inner: { rx: 300, ry: 118 }, outer: { rx: 480, ry: 172 } }; -// Services that orbit the product. `logo` -> a GLYPHS key. Each sits on a tilted -// elliptical orbit at angle `deg` (0°=right, 90°=front/bottom); `s` is the depth scale -// (front-of-orbit nodes read larger/brighter/nearer). `bow` curves its cable. Asymmetric -// on purpose — a loose constellation, not a clock face. -// `dir` is which way this service's data packets travel: most feed 'in' to the product, -// but the services the hero outcomes name as destinations — bookings out to the calendar, -// orders out to the books, texts out via Twilio — flow 'out', so the diagram shows the -// two-way conversation the lede promises ("so they finally talk to each other"). +// Loop ring geometry (Direction C, July 2026): +// r=90 sits in the clear zone between the gear body (r=64) and the inner orbit (ry=118). +// Gap of 15° at 12 o'clock; arrowhead at the end reads "about to return to start." +// Arc: 345° CW from 7.5° right-of-top to 7.5° left-of-top. +// Start: std angle -82.5° → (611.7, 210.8). End: std angle -97.5° → (588.3, 210.8). +const LOOP_R = 90; +const LOOP_ARC = `M 611.7,210.8 A ${LOOP_R},${LOOP_R} 0 1 1 588.3,210.8`; + +// Services that orbit the product. const sources = [ { name: 'HubSpot', logo: 'hubspot', orbit: 'outer', deg: 145, s: 1.12, bow: 20, dir: 'in' }, { name: 'Stripe', logo: 'stripe', orbit: 'outer', deg: 35, s: 1.05, bow: -18, dir: 'in' }, @@ -57,7 +67,6 @@ type Node = (typeof sources)[number]; function geom(n: Node) { const o = ORBIT[n.orbit as 'inner' | 'outer']; const t = (n.deg * Math.PI) / 180; - // the anchor sits exactly ON the orbit ellipse — the planet's true position const ax = C.x + o.rx * Math.cos(t); const ay = C.y + o.ry * Math.sin(t); const s = n.s; @@ -68,8 +77,6 @@ function geom(n: Node) { const padL = 16 * s, gap = 11 * s, padR = 18 * s; const textW = n.name.length * font * 0.6; const w = padL + markerW + gap + textW + padR; - // the label card hangs just OUTSIDE its anchor (radially away from the sun), so the - // glowing anchor node stays visible on the orbit line with the card attached to it const vx = ax - C.x, vy = ay - C.y; const vl = Math.hypot(vx, vy) || 1; const ux = vx / vl, uy = vy / vl; @@ -78,21 +85,17 @@ function geom(n: Node) { const cy = ay + uy * off; const x = cx - w / 2; const y = cy - h / 2; - // nearer nodes read brighter; further ones recede into the field const depth = +(0.55 + 0.45 * ((s - S_MIN) / (S_MAX - S_MIN))).toFixed(3); const labelX = x + padL + markerW + gap; return { ...n, ax, ay, cx, cy, s, font, h, w, x, y, markerW, padL, gap, depth, hasLogo, labelX }; } const N = sources.map(geom); -// each cable runs from the planet's orbit anchor inward to the sun's body, gently -// bowed so the constellation reads as cables rather than rigid spokes. -// packets travel anchor -> sun for dir:'in' cables, sun -> anchor for dir:'out'. function cable(n: ReturnType) { const dx = C.x - n.ax, dy = C.y - n.ay; const dist = Math.hypot(dx, dy) || 1; const ux = dx / dist, uy = dy / dist; - const sx = n.ax + ux * 9, sy = n.ay + uy * 9; // leave the anchor dot crisp + const sx = n.ax + ux * 9, sy = n.ay + uy * 9; const ex = C.x - ux * R_sun, ey = C.y - uy * R_sun; const mx = (sx + ex) / 2, my = (sy + ey) / 2; const px = -(ey - sy), py = ex - sx; @@ -102,8 +105,6 @@ function cable(n: ReturnType) { return `M${r(sx)},${r(sy)} Q${r(qx)},${r(qy)} ${r(ex)},${r(ey)}`; } -// the sun's rays — hand-varied angle / length / width / opacity so the corona reads -// as a radiant star, not a uniform gear. R_ray is where rays begin (just off the body). const R_ray = 72; const rays = [ { ang: 5, len: 34, w: 4, o: 0.80 }, @@ -124,9 +125,6 @@ const rays = [ { ang: 338, len: 26, w: 3, o: 0.40 }, ]; -// One source of truth per cable — base line, drawn-in current line, and the GSAP packet -// all reference the same id/d. The path always runs service -> sun; `dir` tells the -// packet which way to ride it. const cables = N.map((n, i) => ({ id: `cbl-${i}`, d: cable(n), dir: n.dir })); const orbits = [ORBIT.inner, ORBIT.outer]; --- @@ -135,7 +133,7 @@ const orbits = [ORBIT.inner, ORBIT.outer]; class="schematic" viewBox="0 64 1200 488" role="img" - aria-label="A solar-system diagram: a glowing core represents the client's website and app at the centre, with the services Ryan integrates (HubSpot, Stripe, Drupal, Twilio, Shopify, WordPress, QuickBooks, Google Calendar, Workiz and Jobber) orbiting it and exchanging data along glowing cables." + aria-label="An orchestration diagram: a glowing core represents the client's website and app at the centre; an agentic loop ring around the core shows the Plan, Act, Observe cycle; the services Ryan integrates (HubSpot, Stripe, Drupal, Twilio, Shopify, WordPress, QuickBooks, Google Calendar, Workiz and Jobber) orbit it and exchange data along glowing cables." > @@ -147,13 +145,23 @@ const orbits = [ORBIT.inner, ORBIT.outer]; - + + + + + + + + + + @@ -166,6 +174,10 @@ const orbits = [ORBIT.inner, ORBIT.outer]; + + + + @@ -175,6 +187,43 @@ const orbits = [ORBIT.inner, ORBIT.outer]; {orbits.map((o) => )} + + + + + + + + + + + + + + + + + + {cables.map((c) => )} @@ -184,12 +233,16 @@ const orbits = [ORBIT.inner, ORBIT.outer]; {cables.map((c) => )} - + + + + {N.map((s) => )} - + {N.map((s) => ( @@ -250,8 +303,9 @@ const orbits = [ORBIT.inner, ORBIT.outer]; diff --git a/src/layouts/Base.astro b/src/layouts/Base.astro index ffc4d8b..c491546 100644 --- a/src/layouts/Base.astro +++ b/src/layouts/Base.astro @@ -57,6 +57,9 @@ const year = new Date().getFullYear(); // build-time: site is fully static diff --git a/src/layouts/Base.astro b/src/layouts/Base.astro index c491546..b6dbc6c 100644 --- a/src/layouts/Base.astro +++ b/src/layouts/Base.astro @@ -57,9 +57,9 @@ const year = new Date().getFullYear(); // build-time: site is fully static