diff --git a/apps/www/src/app.css b/apps/www/src/app.css index 0c0c31aa6..9377acaaa 100644 --- a/apps/www/src/app.css +++ b/apps/www/src/app.css @@ -1,39 +1,29 @@ -/* Powermove website. Structure and rhythm follow a Tailark "Dusk" landing; - color, type, radii, and motion come from the editor's shared tokens. */ +/* Powermove website. A dusk-to-paper gradient carries the hero, product cards + rise out of it onto warm paper, and every column hangs off one 960px measure. + Colour, radii, and motion otherwise come from the editor's shared tokens. */ /* ---- base ---- */ -html{line-height:1.5;-webkit-text-size-adjust:100%;scroll-behavior:auto;scroll-padding-top:96px} +html{line-height:1.5;-webkit-text-size-adjust:100%;scroll-behavior:auto;scroll-padding-top:32px} html.overflow-hidden{overflow:hidden} body{margin:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale} -img,svg{display:block} +img,svg,video{display:block} img{max-width:100%;height:auto} -h1,h2,h3,p,figure,ul,pre{margin:0} -ul{padding:0;list-style:none} +h1,h2,h3,p,figure,ul,ol,pre{margin:0} +ul,ol{padding:0;list-style:none} a{color:inherit;text-decoration:none} button{font:inherit;color:inherit;background:none;border:0;padding:0;cursor:pointer} a,button{touch-action:manipulation;-webkit-tap-highlight-color:transparent} -:root{font-family:var(--font-geist-sans),Geist,sans-serif;font-synthesis:none;background:var(--bg-window);color:var(--tx);font-kerning:normal} +:root{--paper:#FAF8F5;--bg-window:var(--paper);--col:1040px;font-family:var(--font-geist-sans),Geist,sans-serif;font-synthesis:none;background:var(--paper);color:var(--tx);font-kerning:normal} ::selection{background:var(--accent-dim);color:var(--accent-tx)} a:focus-visible,button:focus-visible{outline:0;box-shadow:var(--focus-ring);border-radius:var(--r-sm)} -.inline{display:inline;vertical-align:-2px;margin-right:2px} - -/* ---- layout ---- */ -main{overflow:clip;text-align:center} -.wrap{max-width:1280px;margin-inline:auto;padding-inline:24px} -section{padding-block:64px} -@media(min-width:768px){section{padding-block:80px}} - -/* ---- type ---- */ -h1,h2{font-weight:500;letter-spacing:-.03em;line-height:1.1;text-wrap:balance;margin-inline:auto} -h1{font-size:clamp(34px,5vw,56px);max-width:15ch} -h2{font-size:clamp(30px,3.6vw,44px);max-width:28ch} -.section-heading{margin-inline:auto;text-align:center} -.muted,h2{color:var(--tx-2)} -h1 .muted{color:var(--tx-3)} -.strong,h2 .strong{color:var(--tx)} -.lede{margin-top:24px;max-width:38ch;font-size:clamp(16px,1.3vw,19px);line-height:1.55;color:var(--tx-2);text-wrap:pretty} -.lead{font-size:17px;line-height:1.5;color:var(--tx-2);text-wrap:pretty;max-width:34ch} -.lead .strong{font-weight:500} +.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0} +.tabular{font-variant-numeric:tabular-nums} +main{overflow:clip} +.wrap{max-width:var(--col);margin-inline:auto;padding-inline:24px} +@media(max-width:640px){.wrap{padding-inline:16px}} +.muted{color:var(--tx-3)} +.lead{font-size:17px;line-height:1.5;color:var(--tx-2);text-wrap:pretty} +.lead .strong{color:var(--tx);font-weight:500} /* ---- buttons ---- */ /* The raised background is a gradient, which can't be transitioned, so hover lifts it with an overlay that fades in. */ @@ -48,65 +38,161 @@ h1 .muted{color:var(--tx-3)} .cta{display:flex;flex-wrap:wrap;gap:10px;margin-top:32px} .cta.center{justify-content:center} -/* ---- header ---- */ -.site-header{position:fixed;inset:0 0 auto;z-index:50;padding:8px 8px 0} -.site-header nav{max-width:1280px;margin-inline:auto;padding-inline:16px} -.bar{position:relative;display:flex;align-items:center;justify-content:center;gap:40px;padding-block:12px} -.logo{display:inline-flex;align-items:center;gap:10px;font-size:15px;font-weight:500;letter-spacing:-.02em} +/* Small solid pills: white on the gradient, ink on paper, frosted for the secondary. */ +.pill{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:36px;padding:0 14px;border-radius:8px;font-size:15px;font-weight:500;letter-spacing:-.01em;white-space:nowrap;transition:background var(--dur-3),color var(--dur-3),scale var(--dur-2) var(--ease)} +.pill:active{scale:.98} +.pill.light{background:#fff;color:#16110E} +.pill.light:hover{background:rgb(255 255 255 / .86)} +.pill.glass{background:rgb(255 255 255 / .13);color:#fff;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)} +.pill.glass:hover{background:rgb(255 255 255 / .2)} +.pill.dark{background:#16110E;color:#fff} -.links{display:flex;justify-content:center;gap:28px;font-size:var(--fs-md)} -.links a{color:var(--tx-2);transition:color var(--dur-1)} -.links a:hover{color:var(--tx)} -.actions{display:flex;align-items:center;gap:8px} +/* ---- header ---- */ +.site-header{position:absolute;inset:0 0 auto;z-index:50;color:var(--tx)} +.bar{display:flex;align-items:center;justify-content:space-between;max-width:var(--col);height:96px;margin-inline:auto;padding-inline:24px} +.mark{display:grid;place-items:center;width:32px;height:32px;margin-left:-5px;border-radius:var(--r-sm)} +.mark span{width:24px;height:20px;background:currentColor;-webkit-mask:url(/powermove-logo.svg) center/contain no-repeat;mask:url(/powermove-logo.svg) center/contain no-repeat} +.links{display:flex;align-items:center;gap:20px;font-size:15px;letter-spacing:-.01em} +.links a{transition:color var(--dur-3),opacity var(--dur-3)} +.links a.quiet{color:var(--tx-3)} +.links a:hover,.links a.quiet:hover{color:var(--tx)} +.site-header[data-on-dark]{color:#fff} +.site-header[data-on-dark] .links a.quiet{color:rgb(255 255 255 / .58)} +.site-header[data-on-dark] .links a:hover{color:#fff} .menu{position:relative;display:none;width:36px;height:36px;margin-right:-8px} -.menu .lines{position:absolute;inset:0;margin:auto;display:flex;flex-direction:column;justify-content:center;gap:6px;width:18px;height:18px;transition:transform var(--dur-2) var(--ease),opacity var(--dur-2)} -.menu .lines i{display:block;height:2px;border-radius:1px;background:var(--tx)} -.menu .close{position:absolute;inset:0;margin:auto;opacity:0;transform:rotate(-90deg) scale(.6);transition:transform var(--dur-2) var(--ease),opacity var(--dur-2)} +.menu .lines{position:absolute;inset:0;margin:auto;display:flex;flex-direction:column;justify-content:center;gap:6px;width:18px;height:18px;transition:transform var(--dur-3) var(--ease),opacity var(--dur-3)} +.menu .lines i{display:block;height:1.5px;border-radius:1px;background:currentColor} +.menu .close{position:absolute;inset:0;margin:auto;opacity:0;transform:rotate(-90deg) scale(.6);transition:transform var(--dur-3) var(--ease),opacity var(--dur-3)} .site-header[data-state=active] .menu .lines{opacity:0;transform:rotate(90deg) scale(.6)} .site-header[data-state=active] .menu .close{opacity:1;transform:none} .sheet{display:none} -.header-fade{position:fixed;inset:0 0 auto;z-index:40;height:88px;pointer-events:none;background:color-mix(in srgb,var(--bg-window) 60%,transparent);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);mask-image:linear-gradient(to bottom,#000 30%,transparent)} -@media(max-width:1023px){ - .links,.actions{display:none} - .menu{display:block;position:absolute;right:0} - .site-header[data-state=active]{inset:0;background:var(--bg-window);overflow:auto} - .site-header[data-state=active] .sheet{display:block;padding:24px 0 40px} - .sheet ul a{display:block;padding:12px 0;font-size:26px;font-weight:500;letter-spacing:-.02em;text-align:center} - .sheet-actions{display:flex;flex-direction:column;gap:10px;margin:32px auto 0;max-width:320px} - .sheet-actions .button{min-height:44px;font-size:14px} +@media(max-width:767px){ + .bar{height:72px;padding-inline:16px} + .links{display:none} + .menu{display:block} + .site-header[data-state=active]{position:fixed;inset:0;background:var(--paper);color:var(--tx);overflow:auto} + .site-header[data-state=active] .sheet{display:block;padding:24px 16px 40px} + .sheet ul a{display:block;padding:10px 0;font-size:28px;font-weight:500;letter-spacing:-.03em} + .sheet .pill{width:100%;height:44px;margin-top:28px} } -/* ---- hero ---- */ -.hero{padding-top:124px;padding-bottom:0} -@media(min-width:1024px){.hero{padding-top:160px}} -.eyebrow{display:flex;align-items:center;justify-content:center;gap:8px;width:fit-content;margin:0 auto 28px;font-size:var(--fs-md);font-weight:500;color:var(--tx);transition:color var(--dur-1)} -.eyebrow .muted{font-weight:400;color:var(--tx-3);transition:color var(--dur-1)} -.eyebrow:hover .muted{color:var(--tx-2)} -.button .muted{color:var(--tx-3);font-weight:400} -.button.primary .muted{color:var(--on-accent);opacity:.7;font-weight:400} -.eyebrow-sep{width:1px;height:12px;background:var(--line-strong)} -.hero-art{position:relative;width:min(100%,840px);height:clamp(72px,8vw,104px);margin-inline:auto;overflow:hidden} -.hero-vector{position:absolute;inset:0;width:100%;height:100%;overflow:visible} -@media(max-width:600px){.hero-art{height:72px}} -.hero-intro{display:flex;flex-direction:column;align-items:center;text-align:center;margin-top:20px} -.hero-intro .lede{margin-top:0;max-width:44ch} -.hero-intro .cta{margin-top:28px} -.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0} -.stage{margin:56px auto 0;max-width:1280px;padding-inline:8px} -@media(min-width:768px){.stage{margin-top:72px}} -.stage .editor-screenshot{width:100%;aspect-ratio:16/9;object-fit:contain;filter:drop-shadow(0 18px 40px rgb(0 0 0 / .25))} -.logo-cloud{padding:56px 24px 0;text-align:center} -.logo-cloud-caption{font-size:var(--fs-sm);letter-spacing:.02em;color:var(--tx-3)} -.logo-cloud-row{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:20px 56px;margin-top:22px;color:var(--tx-3)} -.brand{display:inline-flex;flex-direction:column;align-items:center;gap:12px;cursor:default;user-select:none;transition:color var(--dur-2)} -.brand:hover{color:var(--tx)} -.brand svg{flex-shrink:0} -.brand-name{display:flex;flex-direction:column;align-items:center;line-height:1.1;font-size:17px;font-weight:500;letter-spacing:-.02em;color:var(--tx-2)} -.brand:hover .brand-name{color:var(--tx)} -.brand-by{font-size:var(--fs-xs);font-weight:400;letter-spacing:0;color:var(--tx-4);margin-top:3px} -.brand-slot{display:grid;place-items:center;width:26px;height:26px;border-radius:50%;border:1px dashed var(--line-strong);color:var(--tx-4)} -.brand-soon .brand-name{color:var(--tx-3)} -.brand-soon:hover,.brand-soon:hover .brand-name{color:var(--tx-2)} +/* ---- top: the stage ---- + Powermove's near-black with the brand orange rising as a glow behind the + editor window, the way a lit canvas spills onto a dark room. The headline + is the app's own composition, played by its own player. */ +.top{position:relative;isolation:isolate;padding-bottom:1px} +/* Built only from two tokens: the dark theme's #0C0A09 and the light theme's --accent + #F0580A, mixed in oklab. No hand-picked reds, so every in-between is our own orange + cooling into our own black. The stops ease in so the warmth gathers behind the window. */ +.top-glow{--ink-0:#0C0A09;--ember:#F0580A;position:absolute;inset:0 0 auto;z-index:-1;height:calc(100% - min(24vw,280px));background: + radial-gradient(60% 30% at 50% 82%,color-mix(in oklab,var(--ember) 40%,transparent),transparent 70%), + linear-gradient(in oklab,var(--ink-0) 0%,color-mix(in oklab,var(--ember) 6%,var(--ink-0)) 20%,color-mix(in oklab,var(--ember) 16%,var(--ink-0)) 38%,color-mix(in oklab,var(--ember) 34%,var(--ink-0)) 54%,color-mix(in oklab,var(--ember) 62%,var(--ink-0)) 67%,var(--ember) 78%,color-mix(in oklab,var(--ember) 55%,var(--paper)) 86%,color-mix(in oklab,var(--ember) 14%,var(--paper)) 94%,var(--paper) 100%)} +.hero{position:relative;padding:clamp(140px,19vh,200px) 0 0;text-align:center;color:#F5F5F4} +.hero-art,.hero-cta,.stage-window{animation:hero-in .8s cubic-bezier(.16,1,.3,1) both} +.hero-cta{animation-delay:90ms} +.stage-window{animation-delay:180ms} +@keyframes hero-in{from{opacity:0;filter:blur(10px);transform:translateY(16px)}to{opacity:1;filter:none;transform:none}} + +.hero-art{--w:min(calc(100% - 32px),980px);display:flex;flex-direction:column;align-items:center} +.artboard{position:relative;display:block;width:var(--w);aspect-ratio:1520/240;cursor:default} +.artboard:focus-visible{box-shadow:none;outline:0} +.artboard:focus-visible .hero-vector{opacity:.8} +.hero-vector{position:absolute;inset:0;width:100%;height:100%;overflow:visible;pointer-events:none} +/* At rest the type spans x 343–1600, so the line is inset to the words, not the crop. */ +.scrubber{position:relative;width:calc(var(--w) * .83);height:28px;margin-top:14px;outline:0;touch-action:none;user-select:none;-webkit-user-select:none;container-type:inline-size} +.scrub-track{position:absolute;inset-inline:0;top:50%;height:1px;background:rgb(255 255 255 / .12)} +.scrub-track::after{content:'';position:absolute;inset:0;background:rgb(255 255 255 / .38);transform-origin:left;scale:var(--p) 1} +.scrub-cut{position:absolute;top:calc(50% - 2px);left:calc(var(--t) * 100%);width:1px;height:5px;background:rgb(255 255 255 / .28)} +.scrub-head{position:absolute;top:calc(50% - 6px);left:0;width:2px;height:12px;margin-left:-1px;border-radius:1px;background:var(--accent);box-shadow:0 0 10px rgb(255 107 26 / .7);translate:calc(var(--p) * 100cqw) 0;transition:scale var(--dur-3) var(--ease)} +.scrub-time{position:absolute;bottom:calc(100% + 7px);left:50%;translate:-50% 3px;font-family:var(--font-geist-mono);font-size:11px;line-height:1;letter-spacing:.02em;color:rgb(255 255 255 / .55);white-space:nowrap;opacity:0;transition:opacity var(--dur-3),translate var(--dur-3) var(--ease)} +.scrubber:hover .scrub-time,.scrubber:focus-visible .scrub-time,.hero-art[data-scrubbing] .scrub-time,.hero-art[data-paused] .scrub-time{opacity:1;translate:-50% 0} +.scrubber:hover .scrub-head,.hero-art[data-scrubbing] .scrub-head{scale:1 1.35} +.scrubber:focus-visible .scrub-track{background:rgb(255 255 255 / .3)} +.hero-cta{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;margin-top:36px} + +/* The editor window, cropped to its own bounds so it sits on the stage like a real one. + Its corners are the capture's; the radius only shapes the shadow to match (18px at 1782px). */ +.stage-window{max-width:var(--col);margin:clamp(64px,9vh,96px) auto 0;padding-inline:24px;container-type:inline-size} +@media(max-width:640px){.stage-window{padding-inline:12px}} +.stage-window img{width:100%;height:auto;border-radius:calc(100cqw * 18 / 1782);box-shadow:0 0 0 1px rgb(0 0 0 / .35),0 40px 80px -24px rgb(40 10 0 / .55),0 0 140px -30px rgb(255 107 26 / .45)} +.pill-count{opacity:.6;font-weight:400} + +/* ---- rows: copy beside each product graphic, on paper ---- */ +.rows{display:grid;gap:clamp(72px,9vw,112px);max-width:var(--col);margin:clamp(104px,12vw,152px) auto 0;padding-inline:24px} +@media(max-width:640px){.rows{padding-inline:16px}} +.rows-title{max-width:30ch;font-size:clamp(26px,3vw,36px);font-weight:500;line-height:1.15;letter-spacing:-.03em;color:var(--tx-3);text-wrap:balance} +.rows-title .strong{color:var(--tx)} +.row{display:grid;gap:24px;scroll-margin-top:32px} +@media(min-width:900px){.row{grid-template-columns:minmax(0,4fr) minmax(0,8fr);gap:48px;align-items:start}} +.row-copy{display:grid;gap:10px} +@media(min-width:900px){.row-copy{position:sticky;top:48px;padding-top:4px}} +.row-copy h3{font-size:var(--fs-md);font-weight:500;color:var(--tx-3)} +.row-copy p{max-width:34ch;font-size:17px;line-height:1.5;letter-spacing:-.011em;color:var(--tx-3);text-wrap:pretty} +.row-copy .strong{color:var(--tx)} +.row-media{overflow:hidden;border-radius:16px;background:#fff;box-shadow:0 0 0 1px rgb(28 18 12 / .06),0 24px 48px -28px rgb(28 18 12 / .2)} +.row-media>img{width:100%;height:auto} +.kernel-body{padding:48px 32px 56px;background:#F6F4F1} +@media(max-width:640px){.kernel-body{padding:32px 16px 40px}} +.kernel-body .slab{background:#fff;box-shadow:0 0 0 1px rgb(28 18 12 / .06),0 1px 2px rgb(28 18 12 / .04)} +.kernel-body .slab.kernel{background:#fff;box-shadow:0 0 0 1px rgb(28 18 12 / .08),0 12px 24px -12px rgb(28 18 12 / .2)} +.kernel-body .slab.kernel .slab-name{color:var(--tx)} +.kernel-body .slab.yours{background:transparent;box-shadow:none} + +/* Stack of slabs seen head-on: the kernel is the widest plate, each layer above is a little narrower, + and the top one is an outlined slot rather than a filled plate, because it's the reader's to fill. + Slabs settle in from the kernel up when the section arrives. */ +.stack{display:flex;flex-direction:column;align-items:center;gap:6px;max-width:520px;margin-inline:auto;width:100%} +.slab{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;box-sizing:border-box;padding:16px 20px;border-radius:var(--r-md);background:var(--bg-panel);box-shadow:var(--ctl-edge);font-size:var(--fs-md);opacity:0;transition:transform .3s cubic-bezier(.22,1,.36,1),box-shadow .3s} +.slab{width:calc(100% - var(--i) * 7%)} +.stack[data-in] .slab{animation:slab-in .55s cubic-bezier(.22,1,.36,1) both;animation-delay:calc((4 - var(--i)) * 70ms)} +@keyframes slab-in{from{opacity:0;translate:0 10px}to{opacity:1;translate:0 0}} +.slab-name{font-weight:500;color:var(--tx);text-wrap:balance} +.slab-note{color:var(--tx-3);font-size:var(--fs-sm);text-align:center;text-wrap:balance} +.slab.yours{background:transparent;box-shadow:none;outline:1px dashed color-mix(in srgb,var(--accent) 60%,transparent);outline-offset:-1px} +.slab.yours .slab-name{color:var(--accent)} +.slab.yours .slab-note{color:var(--tx-2)} +.slab.kernel{background:var(--bg-panel-2);box-shadow:var(--ctl-edge),0 10px 24px -8px rgb(0 0 0 / .6)} +.slab.kernel .slab-name{color:var(--tx-2)} +@media(hover:hover){ + .slab:hover{transform:translateY(-2px)} + .slab.yours:hover{outline-style:solid} +} +@media(prefers-reduced-motion:reduce){ + .slab,.stack[data-in] .slab{opacity:1;animation:none;transition:none} + .slab:hover{transform:none} +} + +/* ---- footer ---- + The hero in reverse: paper warms through our orange and settles into + near-black, so the page ends on the stage it opened on. Type stays at the + header's scale; the only display moment on the page is the headline. */ +:root{--ink-0:#0C0A09;--ember:#F0580A} +.site-footer{position:relative;isolation:isolate;margin-top:clamp(64px,8vw,112px);padding-top:340px;color:#F5F5F4;overflow:hidden} +.foot-dusk{position:absolute;inset:0;z-index:-1;background:linear-gradient(in oklab, + var(--paper) 0px,color-mix(in oklab,var(--ember) 8%,var(--paper)) 70px,color-mix(in oklab,var(--ember) 30%,var(--paper)) 150px,color-mix(in oklab,var(--ember) 70%,var(--paper)) 215px,var(--ember) 260px, + color-mix(in oklab,var(--ember) 62%,var(--ink-0)) 325px,color-mix(in oklab,var(--ember) 34%,var(--ink-0)) 400px,color-mix(in oklab,var(--ember) 16%,var(--ink-0)) 485px, + color-mix(in oklab,var(--ember) 6%,var(--ink-0)) 580px,var(--ink-0) 690px)} +.foot-inner{display:grid;gap:56px;max-width:var(--col);margin-inline:auto;padding:0 24px 32px} +@media(min-width:900px){.foot-inner{grid-template-columns:minmax(0,5fr) minmax(0,6fr);gap:64px}} +@media(max-width:640px){.foot-inner{padding-inline:16px}} +.foot-mark{display:inline-grid;place-items:center;width:32px;height:32px;margin:-5px 0 0 -5px;border-radius:var(--r-sm);color:#fff} +.foot-mark span{width:24px;height:20px;background:currentColor;-webkit-mask:url(/powermove-logo.svg) center/contain no-repeat;mask:url(/powermove-logo.svg) center/contain no-repeat} +.foot-line{margin-top:18px;max-width:30ch;font-size:15px;line-height:1.5;letter-spacing:-.01em;color:rgb(255 255 255 / .62);text-wrap:pretty} +.foot-cta{display:flex;flex-wrap:wrap;gap:8px;margin-top:24px} +.foot-nav{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:36px 24px} +@media(min-width:640px){.foot-nav{grid-template-columns:repeat(3,minmax(0,1fr))}} +.foot-nav h2{font-size:13px;font-weight:500;line-height:1;letter-spacing:0;color:rgb(255 255 255 / .38)} +.foot-nav ul{display:grid;gap:2px;margin-top:12px} +/* 28px rows, so each link is an honest hit target rather than just its glyphs. */ +.foot-nav a{display:inline-flex;align-items:center;min-height:28px;font-size:14px;letter-spacing:-.005em;color:rgb(255 255 255 / .72);transition:color var(--dur-2)} +.foot-nav a:hover{color:#fff} +.ext{margin-left:3px;font-size:.85em;color:rgb(255 255 255 / .3);transition:color var(--dur-2),translate var(--dur-3) var(--ease)} +.foot-nav a:hover .ext{color:rgb(255 255 255 / .6);translate:1px -1px} +.foot-base{grid-column:1/-1;display:flex;flex-wrap:wrap;justify-content:space-between;gap:8px 16px;margin-top:40px;padding-top:20px;border-top:1px solid rgb(255 255 255 / .08);font-size:12px;line-height:1;color:rgb(255 255 255 / .36)} +.foot-meta{display:flex;gap:16px} +.foot-base a{transition:color var(--dur-2)} +.foot-base a:hover{color:rgb(255 255 255 / .8)} +.site-footer a:focus-visible{box-shadow:0 0 0 2px var(--ink-0),0 0 0 4px rgb(255 255 255 / .7)} /* ---- showcase (pinned; scroll progress picks the step, the rail dot arcs to it, the card follows) ---- */ .showcase{height:360vh;padding:0} @@ -217,73 +303,4 @@ h1 .muted{color:var(--tx-3)} .lc-ring{animation:none} } -/* ---- features: centered marketing copy with native app previews ---- */ -.features{padding-top:clamp(112px,10vw,160px)} -.features>.wrap{max-width:none;padding-inline:0} -.features .section-heading{padding-inline:24px} -.feature-layout{margin:64px auto 0} -.blocks{display:flex;flex-direction:column;gap:72px;min-width:0} -@media(max-width:1023px){.blocks{padding-inline:16px}} -@media(min-width:768px){.blocks{gap:112px}} -.block{display:grid;justify-items:center;gap:32px;scroll-margin-top:112px;min-width:0;width:100%;margin-inline:auto} -.copy{display:flex;flex-direction:column;align-items:center;gap:24px;width:100%;max-width:760px;box-sizing:border-box} -.block .copy{padding-inline:24px} -.copy h3{margin-bottom:16px;font-size:var(--fs-md);font-weight:500;color:var(--tx-3)} -.copy .lead{margin-inline:auto;max-width:42ch} -@media(min-width:768px){.copy .lead{font-size:21px;line-height:1.45}} -@media(min-width:1024px){.copy .lead{font-size:23px}} -.points{width:min(calc(100% - 48px),520px);color:var(--tx-2);font-size:var(--fs-md)} -.points li{display:flex;align-items:center;justify-content:center;gap:12px;padding-block:8px} -.points li svg{flex-shrink:0;color:var(--tx-3)} -.panel{position:relative;display:flex;aspect-ratio:1;overflow:hidden;padding:12px;border-radius:var(--r-xl);border:1px solid var(--line);background:color-mix(in srgb,var(--tx) 2%,transparent)} -.hero-vector-type{font-family:var(--font-geist-sans),Geist,sans-serif;font-size:128px;font-weight:400;font-variation-settings:'wght' 398.334;letter-spacing:-4px} - -/* ---- principles (headline + list beside a layer stack) ---- */ -.principles-layout{max-width:820px} - -.principle-list{margin-top:48px;color:var(--tx-2);font-size:15px;line-height:1.55;text-wrap:pretty} -.principle-list li{display:flex;gap:14px;padding-block:16px;border-top:1px solid var(--line)} -.principle-list li:last-child{border-bottom:1px solid var(--line)} -.principle-list svg{flex-shrink:0;margin-top:3px;color:var(--tx-3)} -.principle-list .strong{font-weight:500} -/* Stack of slabs seen head-on: the kernel is the widest plate, each layer above is a little narrower, - and the top one is an outlined slot rather than a filled plate, because it's the reader's to fill. - Slabs settle in from the kernel up when the section arrives. */ -.stack{display:flex;flex-direction:column;align-items:center;gap:6px;max-width:520px;margin-inline:auto;width:100%} -.slab{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;box-sizing:border-box;padding:16px 20px;border-radius:var(--r-md);background:var(--bg-panel);box-shadow:var(--ctl-edge);font-size:var(--fs-md);opacity:0;transition:transform .3s cubic-bezier(.22,1,.36,1),box-shadow .3s} -.slab{width:calc(100% - var(--i) * 7%)} -.stack[data-in] .slab{animation:slab-in .55s cubic-bezier(.22,1,.36,1) both;animation-delay:calc((4 - var(--i)) * 70ms)} -@keyframes slab-in{from{opacity:0;translate:0 10px}to{opacity:1;translate:0 0}} -.slab-name{font-weight:500;color:var(--tx);text-wrap:balance} -.slab-note{color:var(--tx-3);font-size:var(--fs-sm);text-align:center;text-wrap:balance} -.slab.yours{background:transparent;box-shadow:none;outline:1px dashed color-mix(in srgb,var(--accent) 60%,transparent);outline-offset:-1px} -.slab.yours .slab-name{color:var(--accent)} -.slab.yours .slab-note{color:var(--tx-2)} -.slab.kernel{background:var(--bg-panel-2);box-shadow:var(--ctl-edge),0 10px 24px -8px rgb(0 0 0 / .6)} -.slab.kernel .slab-name{color:var(--tx-2)} -@media(hover:hover){ - .slab:hover{transform:translateY(-2px)} - .slab.yours:hover{outline-style:solid} -} -@media(prefers-reduced-motion:reduce){ - .slab,.stack[data-in] .slab{opacity:1;animation:none;transition:none} - .slab:hover{transform:none} -} - -/* ---- final ---- */ -.final .wrap{text-align:center} -.final-note{margin:16px auto 0;max-width:40ch;font-size:var(--fs-md);color:var(--tx-3);text-wrap:pretty} -.final h2{margin-inline:auto;font-size:clamp(36px,5vw,64px);font-weight:500;color:var(--tx)} - -/* ---- footer ---- */ -footer{padding:96px 0 48px} -.foot{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:40px 24px;max-width:640px;justify-items:center;text-align:center;font-size:var(--fs-md)} -.foot .logo{grid-column:1/-1;justify-content:center} -.foot-title{display:block;font-weight:500} -.foot ul{margin-top:14px;display:grid;gap:12px;color:var(--tx-2)} -.foot ul a{transition:color var(--dur-1)} -.foot ul a:hover{color:var(--tx)} -.foot-copy{grid-column:1/-1;margin-top:24px;color:var(--tx-3);font-size:var(--fs-sm)} - @media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*::before,*::after{transition:none!important;animation:none!important}} -@media(max-width:639px){.manifest pre{padding:12px;font-size:11px}.handoff{transform:translateY(-14%)}.toggle{left:8%;bottom:6%}} diff --git a/apps/www/src/app.html b/apps/www/src/app.html index c81209657..69a3d7453 100644 --- a/apps/www/src/app.html +++ b/apps/www/src/app.html @@ -1,10 +1,12 @@ - + + + %sveltekit.head% diff --git a/apps/www/src/lib/AppPreview.svelte b/apps/www/src/lib/AppPreview.svelte index f4a9f2763..d2d6ccbf8 100644 --- a/apps/www/src/lib/AppPreview.svelte +++ b/apps/www/src/lib/AppPreview.svelte @@ -1,12 +1,12 @@ -