Files
hermes-agent/optional-skills/web-development/scrollcraft/references/template.html
T
Teknium 56cc2bd814 feat(skills): scrollcraft — premium scroll-driven landing pages (port of nateherkai/scroll-craft, 1.2k★ MIT)
Optional skill: scroll-as-timeline landing pages on a deterministic
CSS/JS engine, with interview → page grammar → signature move workflow
and screenshot-based scroll verification. Engine and scripts vendored
verbatim; asset generation re-anchored on image_generate with the
upstream kie.ai flow kept as an optional path.
2026-09-13 21:11:25 -07:00

139 lines
6.3 KiB
HTML

<!doctype html>
<!--
scrollcraft skeleton.
Start here, then delete what you do not need and write your own markup for
what you keep. This is a starting point, not a layout: a page that keeps this
structure verbatim will look like every other page that kept it verbatim,
which is the failure this skill exists to avoid.
The act order below is one score (scrub > pin > flow > scrub > pan > pin).
Score YOUR journey per SKILL.md Step 2 and rearrange accordingly. The rules
that do carry over: four or more device families, never the same one twice in
a row, at most two scrub acts, and the closing act is the last element on the
page.
-->
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>BRAND · the one-line promise</title>
<meta name="description" content="One sentence a search result would show.">
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><rect width='32' height='32' rx='7' fill='%230A0807'/></svg>">
<link rel="stylesheet" href="scrollcraft.css">
<style>
/* The whole rebrand: six colours and two faces. Everything else in
scrollcraft.css derives from these. */
:root {
--sc-canvas: #08090b;
--sc-surface: #101217;
--sc-ink: #f4f2ef;
--sc-ink-soft: #9a9ba1;
--sc-accent: #d8ff3e;
--sc-accent-ink: #08090b;
--sc-font-display: "Archivo", system-ui, sans-serif;
--sc-font-text: "Geist", system-ui, sans-serif;
}
/* Your page's own classes go here. Do not restyle .sc-stage, .sc-copy or any
[data-sc-*] selector: those are the mechanism. */
</style>
</head>
<body>
<span data-sc-progress></span>
<div class="sc-grain" aria-hidden="true"></div>
<header class="site-bar"><!-- mark + ONE cta label, used everywhere --></header>
<main id="top">
<!-- 1 · RECOGNITION: scrub -->
<section data-sc-act="scrub" data-sc-span="2.6" data-sc-dwell="0.34" data-sc-drift="#08090b">
<div data-sc-stage>
<img class="sc-stage__poster" src="assets/01-poster.webp" alt="">
<video data-sc-scrub data-sc-src="assets/01.mp4"
data-sc-src-mobile="assets/01-m.mp4" muted playsinline></video>
<div class="sc-scrim sc-scrim--lead" aria-hidden="true"></div>
<!-- third value 0 = greet: on screen the instant the page lands -->
<div class="sc-copy sc-copy--lead" data-sc-cue="0 0.78 0">
<h1 class="sc-display sc-display--xl" data-sc-kinetic="lines">The promise, in under nine words.</h1>
<p class="sc-body">One plain sentence. Twenty words at the outside.</p>
</div>
</div>
</section>
<!-- 2 · TENSION: pin. Overlap the windows ~15% so there is never a gap. -->
<section data-sc-act="pin" data-sc-span="3.4" data-sc-drift="#101217">
<div data-sc-stage class="argument">
<p data-sc-cue="0 0.32 0">The situation they recognise.</p>
<p data-sc-cue="0.26 0.60">What it actually costs them.</p>
<p data-sc-cue="0.54 0.88">Why it keeps happening.</p>
<p data-sc-cue="0.82">The line that turns it.</p>
</div>
</section>
<!-- 3 · TURN: flow + reveal -->
<section class="sc-section" data-sc-act="flow" data-sc-drift="#0b0c0f">
<div class="sc-wrap split">
<div class="sc-stack" data-sc-in data-sc-stagger="70">
<h2 class="sc-display sc-display--lg">What changes.</h2>
<p class="sc-body">Two short paragraphs. This is the only act that reads like a document, which is exactly why it belongs here.</p>
</div>
<figure data-sc-reveal="left" data-sc-reveal-at="0.18 0.62">
<img src="assets/03.webp" width="1920" height="1080" alt="Describe the image, not the brand.">
</figure>
</div>
</section>
<!-- 4 · SUBSTANCE: scrub. The second and LAST clip. -->
<section data-sc-act="scrub" data-sc-span="2.2" data-sc-dwell="0.28" data-sc-drift="#0e0f13">
<div data-sc-stage>
<img class="sc-stage__poster" src="assets/04-poster.webp" alt="">
<video data-sc-scrub data-sc-src="assets/04.mp4"
data-sc-src-mobile="assets/04-m.mp4" muted playsinline></video>
<div class="sc-scrim sc-scrim--trail" aria-hidden="true"></div>
<div class="sc-copy sc-copy--trail" data-sc-cue="0.14 0.86">
<h2 class="sc-display sc-display--lg" data-sc-kinetic="lines">The proof, in one line.</h2>
</div>
</div>
</section>
<!-- 5 · RANGE: pan. Span ≈ one viewport-height per item, plus one. -->
<section data-sc-act="pan" data-sc-span="3.2" data-sc-drift="#0a0b0d">
<div data-sc-stage>
<div class="rail" data-sc-pan="0.06">
<div class="rail__lead sc-stack">
<h2 class="sc-display sc-display--md">The set.</h2>
<p class="sc-body">One line on how to choose.</p>
</div>
<article class="item"><div data-sc-tilt="6"><img src="assets/item-1.webp" alt=""></div><h3>One</h3><p>…</p></article>
<article class="item"><div data-sc-tilt="6"><img src="assets/item-2.webp" alt=""></div><h3>Two</h3><p>…</p></article>
<article class="item"><div data-sc-tilt="6"><img src="assets/item-3.webp" alt=""></div><h3>Three</h3><p>…</p></article>
</div>
</div>
</section>
<!-- 6 · COMMITMENT: pin + pointer. LAST element on the page, short span,
one-value cues so nothing fades out before the page ends, footer inside
the stage so there is no dead tail after the CTA. -->
<section id="join" data-sc-act="pin" data-sc-span="1.15" data-sc-drift="#08090b">
<div data-sc-stage class="close" data-sc-spotlight>
<div class="close__inner">
<h2 class="sc-display sc-display--lg" data-sc-cue="0.06" data-sc-kinetic="lines">The last thing you want them to feel.</h2>
<!-- magnet and cue both write transform, and the magnet writes it every
frame. data-sc-rise="0" makes the cue's rise a no-op so the
entrance is not silently lost to the race. Opens early so a
keyboard user cannot land on it at opacity 0. -->
<a class="cta" href="#" data-sc-magnet="0.26" data-sc-cue="0.06" data-sc-rise="0">Same label as the nav</a>
</div>
<footer class="foot"><!-- mark + the small print --></footer>
</div>
</section>
</main>
<script src="scrollcraft.js"></script>
<script>ScrollCraft.mount(document.body);</script>
</body>
</html>