0 external requests, 0 dependencies, 0 build steps
769 kB loaded, 685 of it generated pixel art
+0.1% total height against the reference site
What it is
The marketing site of an AI agent platform, complete: a pixel-art hero with its stack of live notifications, a customer bar, an orchestration board, four guide chapters as book covers, four product blocks, a sky-blue section with three tabs, an animated word search and a footer. One page, one HTML file.
The subject of this template is the interface mock-up. The eight product screens it shows — the department wheel, the launch kanban, the agent conversation, the email preview, the campaign report, the analytics dashboard, the task queue, the department row — are all HTML and CSS. There is not a single screenshot in the folder. That is what makes them editable: changing a figure in the campaign report means changing a <dd>.
The design follows that of a commercial site, of which only the structure has been kept. All the code was rewritten: the original shipped a Next.js React bundle, 147 kB of compiled Tailwind, three third-party analytics scripts, and inline styles on every animated block — which a strict security policy blocks outright.
What you change first
The colours — twelve lines
Right at the top of assets/css/style.css:
--accent: #2b3fc4; /* fills a surface: buttons, chips, the stroke */
--accent-deep: #1e2c8f; /* writes on a light surface, and hovers */
--accent-soft: #dfe3fb; /* tints a chip, never text */
--surface: #f5f5f2; /* the page */
--sky: #0756d0; /* the blue the illustrations are painted in */
One thing to grasp before touching anything else: there are three indigos, not one. The solid accent carries white at 8.04:1; the deep one writes on the page at 10.61:1. Over the pixel-art sky you write in white (6.46:1) and never in a lightened accent, which would not reach 3:1 there. Change one, change all three.
The name
Search for “Solvane” in index.html. No CSS class carries the brand name: a find-and-replace can't break anything.
The word search
The grid of letters and its eleven strokes are produced by _mesures/grille-mots.py, from a fixed seed. Change the list of trades at the top, run it, paste back the HTML and the grid-area rules it prints.
The twelve effects, and how they're built
The reference site writes all of its animations in CSS — 36 @keyframes, no animation-timeline. They were therefore read out of its stylesheet to the millisecond rather than estimated by eye.
| Effect | Where | How |
|---|---|---|
| Scroll reveal | 26 blocks | IntersectionObserver, firing 15% up from the bottom of the screen |
| Notification stack | hero | a 520 ms spring, 140 ms apart, in a 300 px perspective |
| Readability veil | hero | a single gradient, horizontal on desktop, vertical on mobile |
| Logo loop | customer bar | 20 s linear, a cloned row, below 767 px only |
| Answer being written | orchestration board | three ghost blocks rising 6 px, at 0 / 400 / 800 ms |
| Packets on the wires | orchestration board | stroke-dasharray: 4 96 on pathLength="100" |
| Chart lines drawing | analytics | dashoffset 100 → 0 in 1.4 s, three lines 160 ms apart |
| Book stack | guide | two ::before / ::after sheets, lifted on hover |
| Tabs | sky section | native radios, read from the ancestor with :has(); the script only adds the 7 s rotation |
| Word search stroke | industries | a rounded <rect> with pathLength="1000", drawn in 1020 ms |
| Letters lighting up | industries | they follow the pen, 800 ms spread across the word |
| Menu opening | mobile | clip-path: circle(0% → 180% at 100% 0), 520 ms |
What you should know
- No external requests. Measured at 390, 1440 and 2560 px: every request is local. The original loaded three analytics domains.
- Scroll reveals can't hide the content. The hidden state only exists once the JavaScript has run. Checked by disabling it: 15 headings out of 15 stay visible, the three tab panels follow each other down the page, the eleven word-search strokes are drawn.
-
Zero inline styles, zero inline scripts. The template honours the site's strict security policy — the very one the original's
style="--notif-rotate-y:-12deg"breaks. The_headersfile carries the policy and the bench serves it, so the page is measured exactly as it ships. - Every pixel-art illustration is generated, and therefore free of rights. None of the original's images survive.
- Accessibility: skip link, menu state announced, decorations hidden from screen readers, one visible focus ring drawn outside the box, animations switched off if the system asks — delays included.
- Responsive checked at 390, 1440 and 2560 px, on load and after scrolling all the way down, with no horizontal overflow.
What isn't perfect
Better said here than left for you to find out.
- The hero no longer moves. The original played a 280 kB looping video there. Measured frame by frame, it changed 4.56% of its pixels — a breeze in the grass. It is replaced by a still image at the same framing; what gives the hero its life is the notification stack arriving card by card.
- Below 992 px the mock-ups scroll instead of overflowing. The cards that float above them on a wide screen return to the flow and stack underneath. That accounts for most of the height difference on mobile: 4,856 px against the original's 3,684, which simply hides part of them.
- The “Download full guide” button is gone. It served a 12.5 MB PDF. It now points down to the four chapters.
- The hero notifications say something invented. The original's are injected by its React bundle and do not exist in the served HTML: there was nothing to read.
- The secondary pages — pricing, resources, four guide pages, careers — became anchors of the single page. No link leads to a 404.
Take it, open it, break it.
Solvane is free. The full library — the other templates and the components — comes with the subscription, alongside the course.
Immediate access · No commitment · Cancel in one click