From c46baeb310a6457402276e547154d2b3d050f339 Mon Sep 17 00:00:00 2001 From: Amp Date: Tue, 15 Sep 2026 04:33:05 +0000 Subject: [PATCH] Solutions vignettes: curved wires, calmer app-builder replay, fade-in result chip - Company agent: the three wires are one SVG fanning out of the agent's vertical center in curves to each system chip; rows are equal height so the endpoints sit on chip centers at any width. Wires wipe in. - Agent app builder: the prompt bubble and app frame no longer reset on hover (the blink read as a flash); only steps, stat tiles, and rows replay. - "Refund issued" chip fades in instead of scaling from its left edge. Amp-Thread-ID: https://ampcode.com/threads/T-01a0a1bf-48c6-77f8-b65d-0b681d9f18a9 Co-authored-by: Nicholas Kissel --- .../sections/SolutionsSection.module.css | 44 ++++--------- .../marketing/sections/SolutionsSection.tsx | 63 ++++++++++++------- 2 files changed, 53 insertions(+), 54 deletions(-) diff --git a/src/components/marketing/sections/SolutionsSection.module.css b/src/components/marketing/sections/SolutionsSection.module.css index a51a012..1c79d2b 100644 --- a/src/components/marketing/sections/SolutionsSection.module.css +++ b/src/components/marketing/sections/SolutionsSection.module.css @@ -21,20 +21,18 @@ animation: blink 900ms steps(2, end) infinite; } - /* App builder: prompt lands, steps tick through, the app rises and its rows fill in. */ - .card:hover .prompt, - .card:focus-visible .prompt { - animation: type-in 260ms ease-out both; - } + /* App builder: the prompt and the app frame stay put; steps tick through, + then the app's tiles and rows fill in. Only small text elements reset, + so the replay reads as data loading rather than the card blinking. */ .card:hover .step, .card:focus-visible .step { animation: type-in 220ms ease-out both; animation-delay: calc(var(--i, 0) * 280ms + 320ms); } - .card:hover .panel, - .card:focus-visible .panel { - animation: rise 420ms cubic-bezier(0.2, 0.8, 0.2, 1) both; - animation-delay: 1200ms; + .card:hover .stat, + .card:focus-visible .stat { + animation: type-in 240ms ease-out both; + animation-delay: calc(var(--i, 0) * 120ms + 1200ms); } .card:hover .row, .card:focus-visible .row { @@ -64,8 +62,9 @@ } .card:hover .wire, .card:focus-visible .wire { - transform-origin: left center; - animation: grow 450ms cubic-bezier(0.2, 0.8, 0.2, 1) both; + /* Left-to-right wipe rather than a dash draw: the paths are stretched + non-uniformly by preserveAspectRatio="none", which breaks dash maths. */ + animation: wipe 450ms cubic-bezier(0.2, 0.8, 0.2, 1) both; animation-delay: calc(var(--i, 0) * 260ms + 500ms); } .card:hover .system, @@ -75,8 +74,7 @@ } .card:hover .resultChip, .card:focus-visible .resultChip { - transform-origin: left center; - animation: pop 320ms cubic-bezier(0.2, 0.8, 0.2, 1) both; + animation: type-in 320ms ease-out both; animation-delay: 1800ms; } .card:hover .connectedDot, @@ -259,24 +257,8 @@ } } -@keyframes rise { - from { - opacity: 0; - transform: translateY(8px); - } - to { - opacity: 1; - transform: none; - } -} - -@keyframes grow { - from { - transform: scaleX(0); - } - to { - transform: scaleX(1); - } +.wire { + stroke-width: 1; } @keyframes connect { diff --git a/src/components/marketing/sections/SolutionsSection.tsx b/src/components/marketing/sections/SolutionsSection.tsx index efe31af..e0ef04b 100644 --- a/src/components/marketing/sections/SolutionsSection.tsx +++ b/src/components/marketing/sections/SolutionsSection.tsx @@ -117,9 +117,7 @@ const AppBuilderVignette = () => {
-
+
Build a CRM for my roofing business with a quotes pipeline.
    @@ -137,9 +135,7 @@ const AppBuilderVignette = () => { Release v3 · live for 2 users

-
+
Quotes @@ -155,10 +151,11 @@ const AppBuilderVignette = () => { ["New", "6"], ["Sent", "3"], ["Won", "9"], - ].map(([stage, count]) => ( + ].map(([stage, count], i) => (
{stage} {count} @@ -211,28 +208,48 @@ const CompanyAgentVignette = () => ( Helpdesk · 2m
- {/* Wire and system share a grid row so each wire ends at its chip at any width. */} -
+ {/* One SVG spans the three system rows; rows are equal height (chip + + margin, no row gap) so its 1/6, 1/2, 5/6 endpoints sit on the chip + centers at any width. Wires fan out from the agent's vertical center. */} +
Agent
Support triage
+ {/* Out of flow so the SVG's square viewBox never contributes height to the rows. */} +
+ +
{["Postgres", "Orders API", "Helpdesk"].map((system, i) => ( - - + + {system} + ))}