/* openwiz.dev v2: navy, black and brass. The landing page only; /changelog keeps style.css.
 * Motion: every element's resting style is the final frame (no JavaScript, reduced motion, after the intro).
 * landing.js sets [data-play] on the stage to run the ~10 s intro once; the intro is CSS animations with
 * fill none/backwards, so it ends exactly on the resting style. Ambient loops run only with motion allowed. */
:root{color-scheme:dark;--ground:#07090f;--ink:#f2f2f0;--grey:#9aa0ab;--grey2:#b9bec7;--brass:#e8a849;--brass-hi:#f3c06e;--on-brass:#16110a;--navy:#12204a;--navy2:#2b4a8f;--panel:#0d1119;--line:#232a38;--edge:#3a4458;--m:100px}
*{box-sizing:border-box}
html{scroll-behavior:smooth}
body{margin:0;background:var(--ground);color:var(--ink);font:400 17px/1.55 var(--ow-font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;overflow-x:clip}
h1,h2,p,ol{margin:0}
a{color:inherit;text-decoration:none}
:is(a,button):focus-visible{outline:2px solid var(--brass);outline-offset:3px;border-radius:8px}
.wrap{width:min(100% - 2 * var(--m),1240px);margin-inline:auto}
.skip{position:fixed;top:-100px;left:16px;z-index:30;padding:8px 12px;border-radius:8px;background:var(--ink);color:var(--ground);font-weight:600}
.skip:focus{top:12px}
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
code,.v{font-family:var(--ow-font-mono)}

/* Header and footer */
.top{position:relative;z-index:5;display:flex;align-items:center;height:76px;border-bottom:1px solid rgb(242 242 240 / 14%)}
.brand{display:inline-flex;align-items:center;gap:10px;min-height:44px;font:650 21px/1 var(--ow-font-sans);letter-spacing:-.02em}
.mark{display:grid;place-items:center;width:26px;height:26px;color:var(--brass)}
.mark svg{width:18px;height:18px}
.top nav,.foot-site div{margin-left:auto;margin-right:-12px;display:flex;gap:4px;font:450 17px/1 var(--ow-font-sans);color:var(--grey2)}
:is(.top nav,.foot-site div) a{display:inline-flex;align-items:center;min-height:44px;padding:0 12px;border-radius:8px}
:is(.top nav,.foot-site div) a:hover{color:var(--ink)}
.foot-site{display:flex;align-items:center;margin-top:120px;padding:24px 0 48px;border-top:1px solid rgb(242 242 240 / 14%)}

/* Hero: copy and the two calls to action on the left, the animation on the right (phone: below it). */
.hero{display:grid;grid-template-columns:510px minmax(0,1fr);grid-template-areas:"copy stage" "ctas stage";grid-template-rows:auto 1fr;column-gap:24px;padding:96px 0 40px;min-height:820px}
.copy{grid-area:copy;position:relative;z-index:2}
h1{font:700 78px/.98 var(--ow-font-sans);letter-spacing:-.045em}
.sub{margin-top:28px;font:400 24px/1.45 var(--ow-font-sans);letter-spacing:-.012em;color:var(--grey2)}
.ctas{grid-area:ctas;position:relative;z-index:2;margin-top:40px;max-width:440px}
.buttons{display:flex;flex-wrap:wrap;gap:12px}
.btn{display:inline-flex;align-items:center;justify-content:center;gap:10px;min-height:52px;padding:0 20px;border-radius:12px;font:600 17px/1 var(--ow-font-sans);letter-spacing:-.01em;white-space:nowrap}
.btn svg{width:17px;height:17px;flex:none}
.star{background:var(--brass);color:var(--on-brass);box-shadow:0 0 0 1px rgb(255 214 140 / 30%) inset,0 8px 28px -12px rgb(232 168 73 / 60%)}
.star svg{fill:currentColor}
.star:hover{background:var(--brass-hi)}
.install:disabled{opacity:1}
.install{border:0;background:rgb(242 242 240 / 6%);color:var(--grey2);box-shadow:inset 0 0 0 1px var(--edge);cursor:not-allowed}
.install svg{fill:none;stroke:currentColor;stroke-width:1.4}
.install-note{margin-top:18px;font-size:15px;line-height:1.5;color:var(--grey)}
.prompt{margin-top:10px;padding:12px 14px;border-radius:10px;background:var(--panel);box-shadow:inset 0 0 0 1px var(--line);font-size:14px;line-height:1.4;color:var(--grey2);overflow-wrap:anywhere}
.live{display:flex;align-items:center;gap:10px;margin-top:22px;font-size:16px;color:var(--grey2)}
.live i{width:9px;height:9px;border-radius:50%;background:var(--brass);box-shadow:0 0 10px rgb(232 168 73 / 70%)}

/* The stage: a camera over the citadel, a bay inside it, and the product window. */
.stage{grid-area:stage;position:relative;margin:0;min-width:0;
  --A:1.45;           /* view aspect */
  --cw:1.35;--cl:0;--cy0:-.05; /* citadel width and left (fractions of the view width), and how far it sits below the view (fraction of its height) */
  --bx:.4317;--by:.706;--bw:.08; /* the lit bay window's centre and width, as fractions of the citadel picture */
  --D:.98;--cx:.55;--cy:.47;     /* zoomed in: the bay's width and centre, as fractions of the view */
  --S:calc(var(--D) / (var(--bw) * var(--cw)));
  --ch:calc(var(--cw) * .5625 * var(--A));
  --px:calc(var(--cl) + var(--cw) * var(--bx));
  --py:calc(1 - var(--ch) + var(--ch) * (var(--by) + var(--cy0)));
  --tx:calc((var(--cx) - var(--S) * var(--px)) * 100%);
  --ty:calc((var(--cy) - var(--S) * var(--py)) * 100%)}
.view{position:absolute;top:-150px;left:-140px;width:calc(100% + var(--m) + 140px);aspect-ratio:var(--A);overflow:hidden;
  --fade:linear-gradient(transparent,#000 14%,#000 72%,transparent 92%),linear-gradient(90deg,transparent,#000 10%);-webkit-mask:var(--fade);-webkit-mask-composite:source-in;mask:var(--fade);mask-composite:intersect}
.cam{position:absolute;inset:0;transform-origin:0 0}
.cam>svg,.cam>img{position:absolute;display:block}
.sky{inset:0;width:100%;height:100%}
.moon{width:9%;height:auto;left:30%;top:12%;opacity:.9}
.city{position:absolute;left:calc(var(--cl) * 100%);bottom:0;width:calc(var(--cw) * 100%);aspect-ratio:16/9;translate:0 calc(var(--cy0) * 100%)}
.city>img,.city>svg{position:absolute;inset:0;width:100%;height:100%;display:block}
.city>:is(.citadel,.lights,.lines){-webkit-mask:linear-gradient(#000 70%,transparent 83%);mask:linear-gradient(#000 70%,transparent 83%)}
.lines{fill:none;stroke:var(--brass);stroke-width:3;stroke-linecap:round;opacity:.75}
.lines path{stroke-dasharray:1 0}
.lines .dot{fill:var(--brass-hi);stroke:none}
.bay{position:absolute;left:calc((var(--bx) - var(--bw) / 2) * 100%);top:calc(var(--by) * 100%);width:calc(var(--bw) * 100%);aspect-ratio:1.6;translate:0 -50%;opacity:0;overflow:hidden;border-radius:2%}
.bay>*{position:absolute}
.bay .hall{inset:0;width:100%;height:100%}
.bay .belt{left:4%;right:15%;top:76.4%;height:1.2%;background:repeating-linear-gradient(90deg,rgb(232 168 73 / 0%) 0 6px,rgb(232 168 73 / 35%) 6px 8px);background-size:14px 100%}
.bay .who{bottom:22.2%;width:15.8%;aspect-ratio:220/296}
.bay .who img,.floor .who img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;object-position:bottom;opacity:0}
.bay .who .f0,.floor .who .f0{opacity:1}
.bay .b1{left:5%}.bay .b2{left:29%}.bay .r1{left:53%}
.bay .item{left:70%;bottom:22.8%;width:11%;aspect-ratio:210/190}
.bay .item img,.floor .g img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;object-position:bottom;opacity:0}
.bay .item .i3,.floor .g .i3{opacity:1}
.bay .seal{left:72%;top:44%;width:7%;opacity:0}
.bay .gate-glow{left:84%;top:55%;width:12%;height:27%;border-radius:50% 50% 0 0;background:radial-gradient(closest-side,rgb(243 192 110 / 55%),transparent);opacity:.35}
.bay .app{left:72%;top:22%;width:22%;opacity:0}

/* The product window */
.win{position:absolute;left:-12px;top:330px;width:430px;border-radius:16px;background:rgb(10 13 20 / 92%);box-shadow:inset 0 0 0 1px rgb(242 242 240 / 16%),0 24px 60px -20px #000;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}
.bar{display:flex;align-items:center;gap:12px;height:46px;padding:0 18px;border-bottom:1px solid var(--line);font:650 16px/1 var(--ow-font-sans)}
.dots{display:flex;gap:6px}.dots i{width:9px;height:9px;border-radius:50%;background:#2c3342}
.panes{position:relative;height:332px}
.pane{position:absolute;inset:0;padding:18px 20px}
.p-idea,.p-grill{opacity:0}
.lbl{font:500 13px/1 var(--ow-font-sans);letter-spacing:.04em;text-transform:uppercase;color:var(--grey)}
.field{display:flex;align-items:center;gap:2px;margin-top:14px;min-height:54px;padding:0 10px 0 14px;border-radius:10px;background:#121722;box-shadow:inset 0 0 0 1px var(--edge);font-size:16px;color:var(--ink)}
.caret{width:2px;height:20px;background:var(--brass);margin-left:1px}
.send{display:grid;place-items:center;margin-left:auto;width:32px;height:32px;border-radius:8px;background:var(--brass);color:var(--on-brass)}
.send svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.p-grill .lbl{margin-bottom:14px}
.q,.a{width:fit-content;max-width:85%;padding:7px 12px;border-radius:12px;font-size:15px;line-height:1.35}
.q{background:#151b28;color:var(--ink);border-bottom-left-radius:4px}
.a{margin:6px 0 10px auto;background:rgb(232 168 73 / 14%);color:#f6dcae;box-shadow:inset 0 0 0 1px rgb(232 168 73 / 30%);border-bottom-right-radius:4px}
.title{font:600 17px/1.3 var(--ow-font-sans);letter-spacing:-.01em}
.meta{display:flex;align-items:center;justify-content:space-between;margin-top:8px;font-size:14px;color:var(--grey)}
.plan{width:120px;height:28px}
.plan path{fill:none;stroke:#3a4560;stroke-width:1.2}
.plan .n{fill:var(--brass)}
.plan .n0{fill:#3a4560}
.tix{list-style:none;padding:0;margin-top:10px}
.tix li{display:flex;align-items:center;justify-content:space-between;height:38px;border-top:1px solid var(--line);font-size:15px}
.st{display:grid;justify-items:end;font-size:13px}
.s{grid-area:1/1;display:inline-flex;align-items:center;gap:6px;opacity:0;color:var(--grey)}
.s::before{content:"";width:10px;height:10px;border-radius:50%;box-sizing:border-box}
.wait::before{border:1.5px dashed #5b6477}
.build::before{border:2px solid var(--navy2);border-top-color:var(--brass)}
.rev{color:var(--grey2)}.rev::before{border:2px solid var(--grey2);background:radial-gradient(circle,var(--grey2) 30%,transparent 34%)}
.done{opacity:1;color:#f6dcae}.done::before{background:var(--brass) url(data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20viewBox=%270%200%2010%2010%27%3E%3Cpath%20d=%27m2.5%205.2%201.7%201.7%203.4-3.8%27%20fill=%27none%27%20stroke=%27%2316110a%27%20stroke-width=%271.5%27/%3E%3C/svg%3E) center/100%}
.foot{position:relative;display:flex;align-items:center;justify-content:space-between;margin-top:6px;padding-top:12px;border-top:1px solid var(--line);font-size:14px;color:var(--grey)}
.count{display:grid}.k{grid-area:1/1;opacity:0}.k5{opacity:1}
.approve,.approved{grid-area:1/1;display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 14px;border-radius:999px;font:600 14px/1 var(--ow-font-sans)}
.foot>.approve,.foot>.approved{position:absolute;right:0;bottom:-6px}
.approve{background:var(--brass);color:var(--on-brass);opacity:0}
.approved{box-shadow:inset 0 0 0 1px rgb(232 168 73 / 55%);color:#f6dcae}
.approved svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:1.8}
.tap{position:absolute;right:38px;bottom:2px;width:22px;height:22px;border-radius:50%;border:2px solid var(--brass-hi);opacity:0;pointer-events:none}
.replay{margin-left:auto;display:inline-flex;align-items:center;gap:6px;min-height:36px;padding:0 12px;border:0;border-radius:999px;background:rgb(10 13 20 / 80%);box-shadow:inset 0 0 0 1px var(--edge);color:var(--grey2);font:500 14px/1 var(--ow-font-sans);cursor:pointer}
.replay[hidden],html:not(.js) .replay{display:none}
.replay:hover{color:var(--ink);box-shadow:inset 0 0 0 1px var(--brass)}
.replay svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round}
.stage figcaption{position:absolute;left:-12px;top:722px;width:430px;display:flex;align-items:center;gap:10px;font-size:14px;color:var(--grey)}
.tag{width:8px;height:8px;border-radius:2px;box-shadow:inset 0 0 0 1.5px var(--grey)}

/* The factory at work */
.works{margin-top:72px}
h2{font:700 52px/1.05 var(--ow-font-sans);letter-spacing:-.035em}
.floor{position:relative;margin-top:32px;aspect-ratio:2400/820;border-radius:18px;overflow:hidden;box-shadow:inset 0 0 0 1px rgb(43 74 143 / 55%);background:var(--panel);
  --belt:74.7%}
.floor-in{position:absolute;inset:0}
.floor-in>*{position:absolute}
.floor .hall{inset:0;width:100%;height:100%;display:block}
.floor .belt{left:11%;right:13%;top:var(--belt);height:1.2%;background:repeating-linear-gradient(90deg,transparent 0 10px,rgb(232 168 73 / 30%) 10px 12px)}
.floor .who{bottom:calc(100% - var(--belt) - .4%);width:9%;aspect-ratio:220/296}
.floor .w1{left:13%}.floor .w2{left:23%}.floor .w3{left:40%}.floor .w4{left:49%}.floor .w5{left:57%}.floor .w6{left:65.5%}
.floor .goods{inset:0}
.floor .g{position:absolute;bottom:calc(100% - var(--belt) - .3%);width:7%;aspect-ratio:210/190}
.floor .g1{left:32%}.floor .g2{left:75%}
.floor .g1 .i3{opacity:0}.floor .g1 .i2{opacity:1}
.floor .decider{left:45.5%;top:13.5%;width:8%}
.floor .card{left:4.5%;top:55%;width:5.5%}
.floor .out{left:87%;top:42%;width:9%}
.caption{margin-top:18px;font-size:17px;color:var(--grey2)}
.caption a{display:inline-flex;align-items:center;min-height:44px;border-radius:6px}
.caption a:hover{color:var(--ink);text-decoration:underline;text-decoration-color:var(--brass);text-underline-offset:5px}
.caption span{color:var(--grey);padding:0 10px}

/* Changelog teaser */
.log{margin-top:64px;padding-top:56px;border-top:1px solid rgb(242 242 240 / 14%)}
.log h2{font-size:40px}
.rail{list-style:none;padding:0;margin-top:28px}
.rail li{position:relative;display:grid;grid-template-columns:120px 1fr;gap:24px;padding:10px 0 10px 40px;font-size:18px;color:var(--grey2)}
.rail li::before{content:"";position:absolute;left:4px;top:19px;width:11px;height:11px;border-radius:50%;background:var(--ink)}
.rail li:first-child::before{background:var(--brass);box-shadow:0 0 0 4px rgb(232 168 73 / 20%)}
.rail li::after{content:"";position:absolute;left:9px;top:30px;bottom:-19px;width:1.5px;background:rgb(242 242 240 / 35%)}
.rail li:last-child::after{display:none}
.rail .v{font-weight:600;font-size:18px;color:var(--ink)}
.more{display:inline-flex;align-items:center;gap:8px;min-height:44px;margin-top:18px;font-weight:500;color:var(--ink);text-decoration:underline;text-decoration-color:var(--brass);text-underline-offset:6px}
.more span{transition:transform .18s}
.more:hover span{transform:translateX(3px)}

/* ---------- The intro (runs once per [data-play]) ---------- */
@keyframes off{0%,100%{opacity:0}}
@keyframes on{0%,100%{opacity:1}}
@keyframes enter{0%{opacity:0;transform:translateY(6px)}100%{opacity:1;transform:none}}
@keyframes pane{0%{opacity:0;transform:translateY(6px)}10%,88%{opacity:1;transform:none}100%{opacity:0;transform:translateY(-4px)}}
@keyframes pop{0%{opacity:0;transform:scale(.6)}60%{opacity:1;transform:scale(1.12)}100%{opacity:1;transform:none}}
@keyframes blink{50%{opacity:0}}
@keyframes zoom{0%{transform:translate(var(--tx),var(--ty)) scale(var(--S))}100%{transform:none}}
@keyframes draw{0%{stroke-dasharray:0 1}100%{stroke-dasharray:1 0}}
@keyframes ride{0%{left:-6%;opacity:0}5%{opacity:1}10.3%,31%{left:19%}41.4%,62%{left:43%}70.7%,87.9%{left:70%;opacity:1}100%{left:86%;opacity:0}}
@keyframes tapring{0%{opacity:0;transform:scale(.4)}30%{opacity:1}100%{opacity:0;transform:scale(2.2)}}
@keyframes appout{0%{opacity:0;transform:translateY(20%) scale(.5)}35%{opacity:1}100%{opacity:1;transform:translate(-6%,-16%) scale(1.05)}}
@keyframes glow{0%,100%{opacity:.35}40%{opacity:1}}
@keyframes beltmove{to{background-position:-140px 0}}
@keyframes ff{0%,49.9%{opacity:1}50%,100%{opacity:0}}
@keyframes fs{0%,49.9%{opacity:0}50%,100%{opacity:1}}

.js .stage[data-play] .bay{animation:bayhold 9s linear}
@keyframes bayhold{0%,90%{opacity:1}100%{opacity:0}}
.js .stage[data-play] .cam{animation:zoom 1.7s cubic-bezier(.65,0,.25,1) 7.9s backwards}
.js .stage[data-play] .lines path{animation:draw 1.2s ease-out 8.6s backwards}
.js .stage[data-play] .lines .dot{animation:off 9.4s}
.js .stage[data-play] .win{animation:enter .4s ease-out .1s backwards}
.js .stage[data-play] .p-idea{animation:pane 1.75s linear .1s}
.js .stage[data-play] .typed .ch{animation:off calc(.3s + var(--i) * .026s)}
.js .stage[data-play] .caret{animation:blink .5s steps(1) 4}
.js .stage[data-play] .send{animation:pop .3s 1.25s backwards}
.js .stage[data-play] .p-grill{animation:pane 2.1s linear 1.75s}
.js .stage[data-play] .p-grill>*{animation:enter .25s ease-out backwards}
.js .stage[data-play] .p-grill .lbl{animation-delay:1.85s}
.js .stage[data-play] .q1{animation-delay:2s}.js .stage[data-play] .a1{animation-delay:2.35s}
.js .stage[data-play] .q2{animation-delay:2.65s}.js .stage[data-play] .a2{animation-delay:2.95s}
.js .stage[data-play] .q3{animation-delay:3.2s}.js .stage[data-play] .a3{animation-delay:3.5s}
.js .stage[data-play] .p-spec{animation:enter .35s ease-out 3.85s backwards}
.js .stage[data-play] .tix li{animation:enter .25s ease-out backwards}
.js .stage[data-play] .t1{animation-delay:4.05s}.js .stage[data-play] .t2{animation-delay:4.12s}.js .stage[data-play] .t3{animation-delay:4.19s}.js .stage[data-play] .t4{animation-delay:4.26s}.js .stage[data-play] .t5{animation-delay:4.33s}
.js .stage[data-play] .plan path{stroke-dasharray:1 0;animation:draw .6s 4.1s backwards}
/* Ticket states: wait [a,b), build [b,c), review [c,d), merged from d. */
.js .stage[data-play] .s{animation:on var(--l) linear var(--s0)}
.js .stage[data-play] .s.done{animation:off var(--s0),pop .35s var(--s0)}
.t1{--b:5.1s;--c:5.7s;--d:6.0s}.t2{--b:5.25s;--c:6.1s;--d:6.6s}.t3{--b:5.4s;--c:6.3s;--d:6.9s}.t4{--b:5.9s;--c:6.8s;--d:7.2s}.t5{--b:6.2s;--c:7.0s;--d:7.45s}
.tix .wait{--s0:4.05s;--l:calc(var(--b) - 4.05s)}
.tix .build{--s0:var(--b);--l:calc(var(--c) - var(--b))}
.tix .rev{--s0:var(--c);--l:calc(var(--d) - var(--c))}
.tix .done{--s0:var(--d)}
.js .stage[data-play] .plan .n{animation:dim var(--d) steps(1)}
.n1{--d:6.0s}.n2{--d:6.6s}.n3{--d:6.9s}.n4{--d:7.2s}.n5{--d:7.45s}
@keyframes dim{0%,100%{fill:#3a4560}}
.js .stage[data-play] .k{animation:on var(--l) linear var(--s0)}
.js .stage[data-play] .k5{animation:off 7.45s}
.k0{--s0:3.85s;--l:2.15s}.k1{--s0:6.0s;--l:.6s}.k2{--s0:6.6s;--l:.3s}.k3{--s0:6.9s;--l:.3s}.k4{--s0:7.2s;--l:.25s}
.js .stage[data-play] .approve{animation:on .65s 4.3s}
.js .stage[data-play] .tap{animation:tapring .45s ease-out 4.6s}
.js .stage[data-play] .approved{animation:off 4.95s,pop .3s 4.95s}
/* The bay: builders, the item, the reviewer, the seal and the app. */
.js .stage[data-play] .bay .belt{animation:beltmove 1s linear 5s 3}
.js .stage[data-play] .bay .item{animation:ride 2.9s ease-in-out 4.9s backwards}
.js .stage[data-play] .bay .item .i1{animation:on 1.1s 4.9s}
.js .stage[data-play] .bay .item .i2{animation:on .7s 6s}
.js .stage[data-play] .bay .item .i3{animation:off 6.7s}
.js .stage[data-play] .b1 .f0{animation:off .6s linear 5.2s}
.js .stage[data-play] .b1 .f1{animation:ff .3s 5.2s 2}
.js .stage[data-play] .b1 .f2{animation:fs .3s 5.2s 2}
.js .stage[data-play] .b2 .f0{animation:off .6s linear 6.1s}
.js .stage[data-play] .b2 .f1{animation:ff .3s 6.1s 2}
.js .stage[data-play] .b2 .f2{animation:fs .3s 6.1s 2}
.js .stage[data-play] .r1 .f0{animation:off .5s 6.95s}
.js .stage[data-play] .r1 .f1{animation:on .2s 6.95s}
.js .stage[data-play] .r1 .f2{animation:on .3s 7.15s}
.js .stage[data-play] .bay .seal{animation:pop .3s 7.2s,on .25s 7.5s}
.js .stage[data-play] .gate-glow{animation:glow 1.2s 7.5s}
.js .stage[data-play] .bay .app{animation:appout 1.3s ease-out 7.6s}
.js .stage[data-play] .replay{opacity:0;pointer-events:none}

/* Ambient (rest) motion: slow, small, only with motion allowed and only while on screen. */
@keyframes twinkle{50%{opacity:.25}}
@keyframes flicker{0%,100%{opacity:1}45%{opacity:.82}60%{opacity:.95}}
@keyframes crawl{to{stroke-dashoffset:-80}}
@keyframes travel{from{offset-distance:0%}to{offset-distance:100%}}
@keyframes bob{50%{transform:translateY(-3%)}}
@keyframes cardin{0%{transform:translateY(-120%) rotate(-8deg);opacity:0}20%{opacity:1}40%,100%{transform:none;opacity:1}}
@keyframes goods{0%{left:9%;opacity:0}4%{opacity:1}30%,44%{left:32%}70%,80%{left:75%}96%{left:85%;opacity:1}100%{left:88%;opacity:0}}
@keyframes ship{0%,60%{opacity:0;transform:translateY(10%) scale(.7)}75%{opacity:1;transform:none}95%{opacity:1}100%{opacity:0;transform:translate(10%,-6%)}}
@media (prefers-reduced-motion:no-preference){
  .js .tw{animation:twinkle 3.2s ease-in-out infinite}
  .js .lights{animation:flicker 5s ease-in-out infinite}
  .js .lines .dot{animation:travel var(--t,9s) linear infinite;animation-delay:var(--dl,0s)}
  .js .stage[data-play] .lines .dot{animation:off 9.4s,travel var(--t,9s) linear var(--dl,0s) infinite}
  .js .floor .belt{animation:beltmove 3s linear infinite}
  .js .floor .g{animation:goods 6s linear infinite}
  .js .floor .g2{animation-delay:-3s}
  .js .floor .g1 .i1,.js .floor .g2 .i1{animation:gi1 6s steps(1) infinite}
  .js .floor .g1 .i2,.js .floor .g2 .i2{animation:gi2 6s steps(1) infinite}
  .js .floor .g1 .i3,.js .floor .g2 .i3{animation:gi3 6s steps(1) infinite}
  .js .floor .g2 img{animation-delay:-3s !important}
  .js .floor .who .f0{animation:ff .8s infinite}
  .js .floor .who .f1{animation:fs .8s infinite}
  .js .floor .w2 img,.js .floor .w4 img{animation-duration:.6s}
  .js .floor .w6 img{animation-duration:3s}
  .js .floor .w5{animation:bob 2.4s ease-in-out infinite}
  .js .floor .card{animation:cardin 3s ease-out infinite}
  .js .floor .out{animation:ship 3s ease-out infinite}
  .floor.offscreen *,.stage:not([data-play]) .view.offscreen *{animation-play-state:paused !important}
}
@keyframes gi1{0%{opacity:1}30%{opacity:0}}
@keyframes gi2{0%{opacity:0}30%{opacity:1}60%{opacity:0}}
@keyframes gi3{0%{opacity:0}60%{opacity:1}}
@media (prefers-reduced-motion:reduce){.replay{display:none}}

/* ---------- Phone ---------- */
@media (max-width:960px){
  :root{--m:20px}
  .top{height:64px}
  .brand{font-size:19px}
  .top nav{font-size:16px}
  .top nav a{padding:0 10px}
  .hero{grid-template-columns:minmax(0,1fr);grid-template-areas:"copy" "stage" "ctas";grid-template-rows:none;padding:36px 0 0;min-height:0}
  h1{font-size:46px;max-width:11ch}
  .sub{margin-top:16px;font-size:18px}
  .stage{margin-top:8px;--A:.95;--cw:2;--cl:-.45;--cy0:.02;--D:1.3;--cx:.5;--cy:.45}
  .view{position:relative;top:auto;left:calc(-1 * var(--m));width:calc(100% + 2 * var(--m));-webkit-mask:linear-gradient(transparent,#000 12%,#000 70%,transparent);mask:linear-gradient(transparent,#000 10%,#000 82%,transparent)}
  .win{position:relative;left:0;top:auto;width:100%;margin-top:-40px}
  .panes{height:322px}
  .pane{padding:16px}
  .tix li{font-size:14.5px}
  .stage figcaption{position:static;width:auto;margin-top:12px}
  .ctas{margin-top:28px;max-width:none}
  .btn{flex:1 1 100%}
  .works{margin-top:88px}
  h2{font-size:36px;max-width:11ch}
  .floor{margin-inline:calc(-1 * var(--m));border-radius:0;aspect-ratio:900/820;box-shadow:none}
  .floor-in{inset:0 auto 0 -69.3%;width:266.67%}
  .caption{display:grid;gap:0;margin-top:14px;font-size:16px}
  .caption span{display:none}
  .log{margin-top:72px;padding-top:40px}
  .log h2{font-size:32px}
  .rail li{grid-template-columns:1fr;gap:2px;padding:8px 0 12px 32px;font-size:16px}
  .rail li::before{top:15px}
  .rail li::after{top:28px}
  .foot-site{margin-top:80px}
}

/* Lift the moving parts off the engraved ground: a faint brass rim on the work, a little light on the crew. */
:is(.bay .item,.floor .g) img{filter:brightness(1.35) drop-shadow(0 0 5px rgb(232 168 73 / 45%))}
:is(.bay,.floor) .who img{filter:brightness(1.18)}
