/* Brand spine. New breakpoints end in .98px; legacy ones only where overriding legacy. Text >=12px. */

/* Base */
[lang=ja]{font-family:var(--font-ja);}
html.reduced-motion{scroll-behavior:auto}
html.sheet-open{overflow:hidden}
/* Classic scrollbars (Windows): keep the gutter while the premiere or the sheet sets overflow:hidden, so the viewport width never jumps. */
html{scrollbar-gutter:stable}
.film:focus{outline:none}
.icon-sprite{position:absolute;width:0;height:0;overflow:hidden}
.i{display:inline-block;width:1em;height:1em;flex:none;vertical-align:-.14em;overflow:visible;transition:transform var(--d-1) var(--ease-std)}
.i-laurel{display:inline-block;width:22px;height:24px;flex:none}
:is(.site-header.spine,.spine-sheet) :is(a,button):focus-visible{outline:2px solid var(--focus);outline-offset:4px}
:is(.spine-menu,.sheet-close,.sheet-motion){background:none;padding:0;letter-spacing:inherit}
html:is(:not(.js),.static-fallback) :is(.site-header.spine,.spine-sheet,.studio-bridge) [data-inquiry]{display:none}
.skip-link{z-index:var(--z-skip);border-radius:var(--r-1);font:600 14px/1.3 var(--font-sans);}
.skip-link span{margin-top:2px;font-weight:400}
html.premiere-playing .skip-link{display:none}

/* Header */
.site-header.spine{z-index:var(--z-header);height:var(--header-h);padding:0 max(var(--header-pad),env(safe-area-inset-right)) 0 max(var(--header-pad),env(safe-area-inset-left));gap:clamp(12px,1.6vw,28px);background:transparent;border-bottom:1px solid transparent;transition:opacity var(--d-3) var(--ease-std),background-color var(--d-2) var(--ease-std),border-color var(--d-2) var(--ease-std)}
html .site-header.spine{backdrop-filter:none;-webkit-backdrop-filter:none}
.site-header.spine::before{content:"";position:absolute;inset:0 0 auto;z-index:-1;height:calc(var(--header-h) + 68px);background:linear-gradient(#05070ab8,#05070a00);pointer-events:none;transition:opacity var(--d-3) var(--ease-std)}
html[data-spine=members] .site-header.spine::before{background:linear-gradient(#05070acc,#05070a00)}
html:is(:not(.js),.reduced-motion,.static-fallback,[data-spine=page]) .site-header.spine{background:rgba(8,11,16,.94);border-bottom-color:var(--line-1);pointer-events:auto}
html:is(:not(.js),.reduced-motion,.static-fallback,[data-spine=page]) .site-header.spine::before{opacity:0}
html[data-spine=dive] .site-header.spine,html[data-spine=dive] .site-header.spine>*{pointer-events:none}
html[data-spine=dive] .site-header.spine{opacity:0;transition:opacity 120ms linear}
html.experience-on:not(.past-film) :is(.site-header.spine,.site-header.spine>*,.spine-act>*){touch-action:pan-x pinch-zoom}
/* Motion off: every header state lands at once (important: the state rules below outweigh a universal selector). */
html.reduced-motion .site-header.spine *{transition:none!important}

.site-header.spine .brand{flex:none;gap:12px;min-height:44px;font-size:13px;font-weight:600;letter-spacing:.16em;transition:opacity var(--d-1) var(--ease-std)}
.site-header.spine .brand svg{width:28px;height:23px}
.site-header.spine .brand-word{transition:opacity var(--d-3) var(--ease-std)}
.site-header.spine .spine-readout{display:none;align-items:baseline;gap:10px;min-width:0;margin-left:clamp(24px,3vw,56px);font:400 12px/1 var(--font-mono);letter-spacing:.14em;text-transform:uppercase;white-space:nowrap;color:var(--text-3);transition:opacity var(--d-3) var(--ease-std)}
.readout-name{min-width:0;overflow:hidden;text-overflow:ellipsis;color:var(--text-1)}
.readout-kind{min-width:4ch}.readout-kind:empty{visibility:hidden}
@media (min-width:1200px){html.js .site-header.spine .spine-readout{display:flex}}
html:is(.reduced-motion,.static-fallback) .site-header.spine .spine-readout{display:none}
.site-header.spine .spine-nav{position:relative;gap:clamp(20px,2.2vw,36px);margin-left:auto;transition:opacity var(--d-3) var(--ease-std)}
.site-header.spine .spine-nav a{display:inline-flex;align-items:center;min-height:44px;font:500 14px/1 var(--font-sans);letter-spacing:.01em;white-space:nowrap;opacity:.86;transition:opacity var(--d-1) var(--ease-std)}
/* [aria-current=page]: the page link on /music (the homepage marks sections with true). */
.site-header.spine .spine-nav a:is(:hover,[aria-current=true],[aria-current=page],.is-film-active){opacity:1}
/* Press (text and nav links): the brand and the nav links dim, over the hover and current states above. */
.site-header.spine :is(.brand,.spine-nav a):active{opacity:.72}
.spine-cursor{position:absolute;left:0;bottom:8px;width:100px;height:1px;background:var(--text-1);transform-origin:0 50%;transform:translateX(var(--cx,0px)) scaleX(var(--cs,0));opacity:var(--co,0);transition:transform 450ms var(--ease-expo),opacity var(--d-2) var(--ease-std);pointer-events:none}
/* Skip film and Start a project share one slot sized to the wider of the two, so the swap at the film's end never moves the nav.
   The slot itself never hit-tests; only the shown control does. */
.site-header.spine .spine-act{display:grid;flex:none;pointer-events:none}
.site-header.spine .spine-act>*{grid-area:1/1;justify-self:end;pointer-events:auto}
.site-header.spine .spine-skip{display:inline-flex;flex:none;align-items:center;gap:10px;min-height:44px;padding:0 16px;border:1px solid var(--line-3);border-radius:var(--r-pill);font:500 13px/1 var(--font-sans);letter-spacing:.01em;white-space:nowrap;transition:border-color var(--d-1) var(--ease-std),background-color var(--d-1) var(--ease-std),opacity var(--d-3) var(--ease-std) var(--d-1),translate var(--d-3) var(--ease-expo) var(--d-1),visibility 0s,scale var(--d-0) var(--ease-std)}
@media (hover:hover) and (pointer:fine){.site-header.spine .spine-skip:hover{border-color:var(--text-1);background:rgba(243,241,233,.06)}.site-header.spine .spine-skip:hover .i{transform:translateY(2px)}}
html:is([data-spine=page],.past-film) .site-header.spine .spine-skip{opacity:0;visibility:hidden;pointer-events:none;translate:0 4px;transition:border-color var(--d-1) var(--ease-std),background-color var(--d-1) var(--ease-std),opacity var(--d-2) var(--ease-std),translate var(--d-2) var(--ease-std),visibility 0s linear var(--d-2),scale var(--d-0) var(--ease-std)}
.site-header.spine .spine-cta{display:inline-flex;flex:none;align-items:center;gap:10px;min-height:44px;padding:0 18px;border-radius:var(--r-1);background:var(--text-1);color:var(--stage);font:600 13px/1 var(--font-sans);letter-spacing:.01em;white-space:nowrap;opacity:0;visibility:hidden;pointer-events:none;translate:0 4px;transition:background-color var(--d-1) var(--ease-std),opacity var(--d-2) var(--ease-std),translate var(--d-2) var(--ease-std),visibility 0s linear var(--d-2),scale var(--d-0) var(--ease-std)}
@media (hover:hover) and (pointer:fine){.site-header.spine .spine-cta:hover{background:#fff}.site-header.spine .spine-cta:hover .i{transform:translate(2px,-2px)}}
html.js:is([data-spine=page],.past-film,.to-music-black):not(.static-fallback) .site-header.spine .spine-cta{opacity:1;visibility:inherit;pointer-events:auto;translate:none;transition:background-color var(--d-1) var(--ease-std),opacity var(--d-3) var(--ease-std) var(--d-1),translate var(--d-3) var(--ease-expo) var(--d-1),visibility 0s,scale var(--d-0) var(--ease-std)}
/* Dive and Cut: the slot's own auto must not outlive the header's none (same weight as the shown CTA, so it comes after it). */
html.js:is([data-spine=dive],.is-cutting) .site-header.spine .spine-act>:is(.spine-skip,.spine-cta){pointer-events:none}
.site-header.spine #motion{flex:none;min-height:44px;padding-left:18px;font-size:12px;transition:opacity var(--d-3) var(--ease-std),color var(--d-1) var(--ease-std)}
.site-header.spine #motion:hover{color:var(--text-1)}
/* Press: the toggle's own opacity follows the film phases, so the press dims what it holds (dot and label).
   Opacity, not scale, so the Motion toggle still answers a press while motion is reduced. */
.site-header.spine #motion>*{transition:opacity var(--d-1) var(--ease-std)}
.site-header.spine #motion:active>*{opacity:.72}
@media (min-width:900px) and (max-width:900px){.site-header.spine #motion span{display:inline}}
html:is(:not(.js),.static-fallback) .site-header.spine #motion{display:none}
.site-header.spine .spine-menu{display:none;flex:none;grid-template-columns:auto 20px;align-items:center;align-content:center;column-gap:12px;row-gap:6px;min-width:44px;min-height:44px;color:var(--text-1);font:500 14px/1 var(--font-sans);letter-spacing:.01em;transition:opacity var(--d-1) var(--ease-std)}
.spine-menu-label{grid-row:1/3}
.spine-menu i{grid-column:2;width:20px;height:1px;background:currentColor;transform-origin:100% 50%;transition:transform var(--d-2) var(--ease-expo)}
.spine-menu i:last-child{transform:scaleX(.6)}
@media (hover:hover){.spine-menu:hover i:last-child{transform:none}}
/* Press state for the header, sheet, film, premiere and bridge controls: touch has no hover and universe.css removes the tap highlight.
   Small, so a swipe that starts on an in-film control (inertial-scroll.js, 5px) barely shows it. The sheet's X presses like the
   Menu it turns back into (opacity, so the fold starts from the Menu lines' own size). */
:is(.spine-menu,.sheet-close,.sheet-mail,.sheet-motion,.opening-award,.chapter-rail a,.loading-notice :is(button,a),.premiere-top>a,.premiere-actions a,.premiere-next,.premiere-exit,.premiere-native-controls button,.bridge-actions :is(a,button),.bridge-disciplines>a):active{opacity:.72}

/* Film phases */
html[data-spine=portal] .site-header.spine :is(.spine-nav,.spine-readout),html[data-spine=portal] .site-header.spine #motion{opacity:.62}
html[data-spine=portal] .site-header.spine .brand-word{opacity:.35}
html[data-spine=members] .site-header.spine :is(.spine-nav,.spine-readout),html[data-spine=members] .site-header.spine #motion{opacity:.72}
html:is([data-spine=portal],[data-spine=members]) .site-header.spine:is(:hover,:focus-within) :is(.spine-nav,.spine-readout,.brand-word),html:is([data-spine=portal],[data-spine=members]) .site-header.spine:is(:hover,:focus-within) #motion{opacity:1}
/* Premiere: mark only; clicks pass to the exit */
html.premiere-playing .site-header.spine{background:transparent;border-bottom-color:transparent;pointer-events:none}
html.premiere-playing .site-header.spine::before{opacity:0}
html.premiere-playing .site-header.spine>:not(.brand){visibility:hidden}
html.premiere-playing .site-header.spine .brand-word{display:none}
html.premiere-playing:not(.experience-on) .site-header.spine .brand{visibility:hidden}
html.premiere-playing .premiere-screen-top{min-height:var(--header-h);padding-top:0;padding-bottom:0;padding-left:calc(var(--header-pad) + 56px);padding-right:var(--header-pad)}
/* Leaving through the MUSIC cut (portal-choice.js): the header crosses the seam on /music's first-frame shape.
   to-music at the click, to-music-black once the black is opaque. No bottom rule: the cut's hairline is the only line. */
html.to-music .site-header.spine{background:rgba(8,11,16,.94)}
html.to-music .site-header.spine::before{opacity:0}
html.to-music .site-header.spine :is(.spine-readout,#motion,.spine-skip){opacity:0;visibility:hidden;transition:opacity var(--d-2) var(--ease-std),visibility 0s linear var(--d-2)}
html.to-music .site-header.spine :is(.spine-nav,.brand-word){opacity:1}
html.to-music-black .site-header.spine :is(.spine-readout,#motion,.spine-skip){display:none}
/* The CTA joins within the black (navigation follows ~.34s later), not on the slower film-end cross. */
html.js.to-music-black:not(.static-fallback) .site-header.spine .spine-cta{transition:background-color var(--d-1) var(--ease-std),opacity var(--d-1) var(--ease-std),translate var(--d-1) var(--ease-std),visibility 0s,scale var(--d-0) var(--ease-std)}

/* Widths */
@media (max-width:899.98px){
.site-header.spine .brand{margin-right:auto}
html.js .site-header.spine :is(.spine-nav,.spine-readout){display:none}
html.js .site-header.spine #motion{display:none}
html.js .site-header.spine .spine-menu{display:grid}
html:not(.js) .site-header.spine{flex-wrap:wrap;height:auto;row-gap:0;padding-top:12px;padding-bottom:4px}
html:not(.js) .site-header.spine .spine-nav{order:9;flex:1 0 100%;gap:24px;margin-left:0;overflow-x:auto;scrollbar-width:none}
}
/* 600-899px: a compact readout beside the brand, as on desktop; the slot takes the push. */
@media (min-width:600px) and (max-width:899.98px){
html.js:not(.reduced-motion):not(.static-fallback) .site-header.spine .spine-readout{display:flex;margin-left:16px}
html.js:not(.reduced-motion):not(.static-fallback) .site-header.spine .brand{margin-right:0}
html.js:not(.reduced-motion):not(.static-fallback) .site-header.spine .spine-act{margin-left:auto}
.site-header.spine .readout-kind{display:none}
.site-header.spine .readout-name{max-width:22ch}
}
@media (max-width:599.98px){
.site-header.spine .cta-tail{display:none}
.site-header.spine .brand{gap:10px;font-size:12px;letter-spacing:.12em}
.site-header.spine .brand svg{width:24px;height:20px}
.site-header.spine .spine-menu{grid-template-columns:20px;column-gap:0;justify-content:center;width:44px}
.site-header.spine .spine-menu i{grid-column:1}
.site-header.spine .spine-menu-label{position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
}
@media (max-width:374.98px){.site-header.spine .brand-word{font-size:12px;letter-spacing:.1em}.site-header.spine .spine-skip{padding:0 14px}.site-header.spine .spine-cta{display:none}}
/* <360px: mark only beside Skip and Menu */
@media (max-width:359.98px){.site-header.spine .brand-word{display:none}}

/* The decorative reel/progress line was removed at the owner's request. */
html.experience-on .film-progress{display:none}
/* After the film the chapter chrome never shows, whatever alpha the engine last wrote inline (a Skip before the reunion is ready leaves it at 1). */
html.experience-on:is([data-spine=page],.past-film) :is(.chapter-rail,.film-bottom,.loading-notice){opacity:0!important;visibility:hidden!important}
.site-header.spine[data-page-light=ivory]{--page-light:var(--text-1)}
.site-header.spine[data-page-light=earth]{--page-light:var(--earth)}
.site-header.spine[data-page-light=gold]{--page-light:var(--gold)}
.site-header.spine[data-page-light=trio]{--page-light:var(--text-warm)}
.site-header.spine[data-page-light=moon]{--page-light:var(--moon)}
.site-header.spine[data-page-light=sun]{--page-light:var(--sun)}
.site-header.spine[data-page-light=house]{--page-light:var(--text-warm)}

/* Sheet */
.spine-sheet{position:fixed;inset:0;width:100%;height:100%;max-width:none;max-height:none;margin:0;padding:0 env(safe-area-inset-right) max(24px,env(safe-area-inset-bottom)) env(safe-area-inset-left);border:0;background:var(--stage);color:var(--text-1);overflow-y:auto;overscroll-behavior:contain}
.spine-sheet::backdrop{background:transparent;backdrop-filter:none}
.sheet-head{position:sticky;top:0;z-index:1;display:flex;align-items:center;justify-content:space-between;gap:16px;height:var(--header-h);padding:0 var(--header-pad);background:var(--stage)}
.sheet-brand{display:flex;align-items:center;gap:10px;font:600 12px/1 var(--font-sans);letter-spacing:.12em;white-space:nowrap;}
.sheet-brand .i-mark{display:block;width:24px;height:20px;flex:none}
.sheet-brand [lang=ja]{margin-left:2px;font-size:13px;font-weight:400;letter-spacing:.06em;color:var(--text-3)}
.sheet-close{--xa:-4px;--xb:3px;position:relative;display:grid;place-items:center;flex:none;width:44px;height:44px;color:var(--text-1);transition:opacity var(--d-1) var(--ease-std)}
/* The header Menu's two lines, crossed: same weight, same seat (sheet-head matches the header's height and padding).
   --xa/--xb are the Menu lines' rest offsets; from 600px the Menu label pushes its lines to the button's right edge, and the X follows. */
.sheet-close i{position:absolute;left:12px;top:50%;width:20px;height:1px;background:currentColor}
.sheet-close i:first-child{rotate:45deg}.sheet-close i:last-child{rotate:-45deg}
.sheet-now{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 12px;margin:8px var(--header-pad) 0;font:400 12px/1.5 var(--font-mono);letter-spacing:.14em;text-transform:uppercase;color:var(--text-3);}
.sheet-now-name{color:var(--text-1)}
/* The overflow fade starts just past the last chip's focus ring (4px offset + 2px), so at the scroll end nothing is dimmed. */
.sheet-film{display:flex;gap:8px;overflow-x:auto;padding:12px var(--header-pad) 20px;scrollbar-width:none;mask-image:linear-gradient(90deg,#000 calc(100% - var(--header-pad) + 6px),transparent)}
.sheet-film::-webkit-scrollbar{display:none}
.sheet-film a{display:inline-flex;flex:none;align-items:center;min-height:44px;padding:0 16px;border:1px solid var(--line-2);border-radius:var(--r-pill);font:500 14px/1 var(--font-sans);white-space:nowrap;transition:border-color var(--d-1) var(--ease-std),background-color var(--d-1) var(--ease-std)}
.sheet-film a:is(:hover,:active){border-color:var(--line-3);background:var(--stage-2)}
.sheet-nav{border-bottom:1px solid var(--line-1)}
.sheet-nav a{display:grid;grid-template-columns:32px 1fr auto;column-gap:12px;align-items:baseline;min-height:64px;padding:14px var(--header-pad);border-top:1px solid var(--line-1);transition:background-color var(--d-1) var(--ease-std)}
.sheet-nav a:is(:hover,:active){background:var(--stage-2)}
.sheet-n{font:400 12px/1 var(--font-mono);letter-spacing:.06em;white-space:nowrap;color:var(--text-3);}
.sheet-name{font:300 32px/1.1 var(--font-sans);letter-spacing:-.03em;color:var(--text-1);}
.sheet-nav [lang=ja]{justify-self:end;font-size:13px;letter-spacing:.06em;color:var(--text-3)}
.sheet-sub .sheet-name{padding-left:16px;font-size:24px}
.sheet-nav a:is([aria-current=true],[aria-current=page]) .sheet-n::before{content:"";display:inline-block;width:6px;height:6px;margin-right:8px;vertical-align:.1em;background:var(--text-1);transform:rotate(45deg)}
.sheet-foot{display:grid;gap:12px;padding:24px var(--header-pad) 0}
.spine-sheet .sheet-cta{display:flex;align-items:center;justify-content:center;gap:14px;width:100%;min-height:52px;padding:0 28px;border-radius:var(--r-1);background:var(--text-1);color:var(--stage);font:600 15px/1 var(--font-sans);transition:background-color var(--d-1) var(--ease-std),scale var(--d-0) var(--ease-std)}
@media (hover:hover) and (pointer:fine){.spine-sheet .sheet-cta:hover{background:#fff}.spine-sheet .sheet-cta:hover .i{transform:translate(2px,-2px)}}
.spine-sheet .sheet-cta:active{background:var(--text-2)}
.sheet-mail,.sheet-motion{display:flex;align-items:center;gap:12px;min-height:44px;font:500 15px/1.2 var(--font-sans);color:var(--text-2);transition:opacity var(--d-1) var(--ease-std);}
.sheet-motion i{width:7px;height:7px;border:1px solid currentColor;border-radius:50%;background:currentColor}
.sheet-motion[aria-pressed=true] i{background:none}
html.static-fallback .sheet-motion{display:none}
@media (min-width:600px){.sheet-brand{gap:12px;font-size:13px;letter-spacing:.16em}.sheet-brand .i-mark{width:28px;height:23px}.sheet-close{--xa:-6px;--xb:4px}.sheet-close i{left:auto;right:0}}
/* The sheet unfolds down from the header line and folds back into it; the Menu's two lines turn into the X and back.
   Keyframes fill backwards only: Chrome starts no exit transition on a property a filling animation still holds.
   The foot (CTA, mail, Motion) is the last row, so the clip edge never crosses a solid CTA ahead of the rows. */
@keyframes sheet-in{from{clip-path:inset(0 0 calc(100% - var(--header-h)) 0)}}
@keyframes row-in{from{opacity:0;transform:translateY(12px)}}
.fx .spine-sheet[open]{clip-path:inset(0 0 0 0)}
.fx .spine-sheet[open] :is(.sheet-nav a,.sheet-foot){animation:row-in 450ms var(--ease-expo) backwards;animation-delay:calc(120ms + var(--n,0) * var(--st-row))}
.sheet-nav a:nth-child(2){--n:1}.sheet-nav a:nth-child(3){--n:2}.sheet-nav a:nth-child(4){--n:3}.sheet-nav a:nth-child(5){--n:4}.sheet-nav a:nth-child(6){--n:5}.sheet-nav a:nth-child(7){--n:6}.sheet-nav a:nth-child(8){--n:7}.sheet-foot{--n:8}
@keyframes x-a{from{rotate:0deg;translate:0 var(--xa)}}
@keyframes x-b{from{rotate:0deg;scale:.6 1;translate:4px var(--xb)}}
.fx .spine-sheet[open] .sheet-close i:first-child{animation:x-a var(--d-3) var(--ease-expo) backwards}
.fx .spine-sheet[open] .sheet-close i:last-child{animation:x-b var(--d-3) var(--ease-expo) backwards}
@supports not (overlay:auto){.fx .spine-sheet[open]{animation:sheet-in var(--d-3) var(--ease-wipe) backwards}}
/* Entry and exit are transitions on the same clip, so reopening mid-fold (or closing mid-unfold) carries on from where the edge is.
   Behind @supports: without overlay, a delayed display would paint the closed dialog outside the top layer.
   The exiting sheet never hit-tests, so wheel and clicks reach the page at once. The Cut closes it on the spot, straight into the veil. */
@supports (overlay:auto){
@starting-style{.fx .spine-sheet[open]{clip-path:inset(0 0 calc(100% - var(--header-h)) 0)}}
.fx .spine-sheet{transition:clip-path var(--d-2) var(--ease-wipe),overlay var(--d-2) allow-discrete,display var(--d-2) allow-discrete}
.fx .spine-sheet[open]{transition:clip-path var(--d-3) var(--ease-wipe),overlay var(--d-3) allow-discrete,display var(--d-3) allow-discrete}
.fx .spine-sheet:not([open]){clip-path:inset(0 0 calc(100% - var(--header-h)) 0)}
.fx .spine-sheet:not([open]),.fx .spine-sheet:not([open])::backdrop{pointer-events:none}
.fx .spine-sheet:not([open]) :is(.sheet-nav a,.sheet-foot){opacity:0;transition:opacity var(--d-1) var(--ease-std)}
.fx .spine-sheet .sheet-close i{transition:rotate var(--d-2) var(--ease-expo),translate var(--d-2) var(--ease-expo),scale var(--d-2) var(--ease-expo)}
.fx .spine-sheet:not([open]) .sheet-close i:first-child{rotate:0deg;translate:0 var(--xa)}
.fx .spine-sheet:not([open]) .sheet-close i:last-child{rotate:0deg;scale:.6 1;translate:4px var(--xb)}
}
html.is-cutting .spine-sheet{transition:none}

/* The Cut */
.cut-veil{position:fixed;inset:0;z-index:var(--z-cut);display:grid;place-content:center;background:var(--stage-film);opacity:0;visibility:hidden;pointer-events:none;touch-action:none;transition:opacity 420ms var(--ease-expo),visibility 0s linear 420ms}
html.is-cutting .cut-veil{opacity:1;visibility:visible;pointer-events:auto;transition:none}
html.is-cutting .site-header.spine>*{pointer-events:none}
/* The slate is opaque on the veil's first frame, draws its page hairline, and leaves with the veil. */
.cut-slate{display:grid;justify-items:center;gap:10px;padding:0 var(--gutter);text-align:center;opacity:0;transform:translateY(6px);transition:opacity 420ms var(--ease-expo),transform 420ms var(--ease-expo)}
html.is-cutting .cut-slate{opacity:1;transform:none;transition:none}
.cut-slate .slate-rule{width:clamp(48px,8vw,120px);transform:scaleX(0);transition:transform 420ms var(--ease-expo)}
html.is-cutting .cut-slate .slate-rule{transform:scaleX(1);transition:transform var(--d-4) var(--ease-expo)}
.cut-label{font:400 12px/1 var(--font-mono);letter-spacing:.2em;text-transform:uppercase;color:var(--text-3);}
.cut-name{font:300 28px/1.1 var(--font-sans);letter-spacing:-.03em;color:var(--text-1);}

/* In film */
.experience-on .opening-copy{top:clamp(88px,18svh,24%)}
.scene-copy .eyebrow{font-size:12px}
.scene-copy .opening-kicker{flex-wrap:wrap;gap:6px 16px;font-size:12px;letter-spacing:.18em}
.origin-cue>span{font-size:12px;letter-spacing:.14em;line-height:1.5}
.cue-touch{display:none}
@media (pointer:coarse){.cue-fine{display:none}.cue-touch{display:inline}}
@media (max-width:700px){.origin-cue>span{letter-spacing:.1em}}
/* Opening poster: black until boot.js marks it loaded (or failed), never a half-painted frame.
   Over the videos until the film decodes (.ready), then one crossfade out: the videos themselves never transition (the forward/reverse pair swaps .is-active).
   It appears at once whenever it shows (first paint, and a replay that drops .ready), so it never dips through black; only the hand-over fades. */
html.js.experience-on .cosmos .scene-poster:not(.is-loaded){opacity:0}
.experience-on .media-layer.cosmos .scene-poster{z-index:1;pointer-events:none}
.experience-on .media-layer.cosmos.ready .scene-poster{opacity:0;visibility:hidden;transition:opacity var(--d-2) var(--ease-std),visibility 0s linear var(--d-2)}

/* Rest hint: the portal prompt's mono line between two hairlines. It dissolves in 300ms after landing and out within 180ms of any input. */
.chapter-pause-hint{display:flex;gap:14px;align-items:center;padding:0;border:0;border-radius:0;background:none;font:400 12px/1.5 var(--font-mono);letter-spacing:.16em;text-transform:uppercase;color:var(--text-3);text-shadow:0 1px 8px rgba(0,0,0,.6);opacity:0;visibility:hidden;transform:translate(-50%,6px);transition:opacity var(--d-1) var(--ease-std),transform var(--d-1) var(--ease-std),visibility 0s linear var(--d-1)}
.chapter-pause-hint::before,.chapter-pause-hint::after{content:"";flex:none;width:40px;height:1px;background:var(--line-2)}
.chapter-pause-hint[data-state=on]{opacity:1;visibility:visible;transform:translate(-50%,0);transition:opacity var(--d-3) var(--ease-std) var(--d-2),transform var(--d-3) var(--ease-expo) var(--d-2),visibility 0s}
/* No hint at the award-film stop, at any width: held in the off state rather than display:none, so it never pops. */
html[data-spine=premiere] .chapter-pause-hint{opacity:0;visibility:hidden;transform:translate(-50%,6px);transition:opacity var(--d-1) var(--ease-std),transform var(--d-1) var(--ease-std),visibility 0s linear var(--d-1)}
html:not(.experience-on) .chapter-pause-hint{display:none}
html.reduced-motion .chapter-pause-hint{transition:none}
.hint-label::after{content:" · "}
@media (min-width:701px) and (max-width:899.98px){.film-stage:has(>.chapter-pause-hint[data-state=on]) .scene-caption{opacity:0}}
.experience-on .chapter-rail{gap:0;right:max(2.8vw,env(safe-area-inset-right))}
@media (min-width:601px) and (max-height:540px){.experience-on .chapter-rail{top:50%;transform:translateY(-50%)}}
.chapter-rail a{min-width:44px;min-height:44px;justify-content:flex-end;padding:0 5px;transition:opacity var(--d-1) var(--ease-std)}
.chapter-rail span{right:34px;font:500 12px/1 var(--font-sans);letter-spacing:.12em;white-space:nowrap}
.scene-caption{font-size:12px}
.loading-notice{font-size:13px}
/* Retry button and studio link inside the fault notice: 44px targets styled as text links instead of the UA button face. */
.loading-notice :is(button,a){display:inline-flex;align-items:center;min-height:44px;padding:0 4px;border:0;background:none;color:var(--text-1);font:inherit;text-decoration:underline;text-underline-offset:3px;transition:opacity var(--d-1) var(--ease-std)}
/* In the film the notice is a scene line, not a card: hairline + mono, no percentage. A wait fades in only if it outlasts 600ms (the animation restarts on every reveal); a fault shows at once. */
.experience-on .loading-notice{max-width:calc(100% - 2 * var(--gutter));padding:0;border:0;background:none;font:400 12px/1.5 var(--font-mono);letter-spacing:.16em;text-transform:uppercase;color:var(--text-3);text-shadow:0 1px 8px rgba(0,0,0,.6)}
/* The hairline sits on the first line (baseline, lifted to the middle of the mono capitals), also when a fault wraps on a phone. */
.experience-on .loading-notice:not([hidden]){display:flex;gap:12px;align-items:baseline}
.experience-on .loading-notice::before{content:"";position:relative;top:-.35em;flex:0 0 40px;height:1px;background:var(--line-2)}
.experience-on .loading-notice [lang=ja]{letter-spacing:.12em;text-transform:none}
.experience-on .loading-notice button{letter-spacing:inherit;text-transform:inherit;text-shadow:inherit}
.experience-on .loading-notice[data-kind=wait]{pointer-events:none;animation:notice-in var(--d-3) var(--ease-std) 600ms both}
@keyframes notice-in{from{opacity:0}}
.constellation-title .eyebrow{font-size:12px}
@media (max-width:600px){
.hint-label{display:none}
.chapter-pause-hint{bottom:max(20px,env(safe-area-inset-bottom));white-space:nowrap;max-width:none}
.experience-on .chapter-rail{display:none}
.portal p{font-size:13px}
.constellation-title .jp{font-size:13px}
}

.member-copy .member-kicker{font-size:clamp(12px,.75vw,13px)}
.member-copy .member-caption .jp{font-size:clamp(13px,.8vw,15px)}
.member-copy .scene-link{min-height:44px;font-size:12px}
.member-copy .scene-link strong{font-size:13px}
.member-copy .scene-link .i{font-size:14px}
.member-copy .scene-link:hover .i{transform:translateY(2px)}
.member-origin{font:500 12px/1.4 var(--font-sans);letter-spacing:.08em;color:rgba(225,223,218,.82);white-space:nowrap}
@media (max-width:900px){.member-footer{flex-wrap:wrap;row-gap:4px}}
@media (max-width:600px){.member-copy .member-kicker{font-size:12px}.member-copy .member-caption .jp{font-size:13px}}
/* Landscape phones (<=430px tall): clear the 64px header and the Enter cue. */
@media (min-width:601px) and (max-height:430px){
.experience-on .opening-copy{top:calc(var(--header-h) + 8px)}
.experience-on .opening-copy h1{font-size:40px}
.experience-on .scene-copy.member-copy{bottom:72px}
.member-copy .member-kicker{margin-bottom:10px}
.scene-copy.member-copy .member-name{font-size:min(9vw,15svh);margin-bottom:8px}
.member-copy .member-caption .jp{display:none}
.member-footer{margin-top:12px;padding-top:6px}
}
/* Member posters: reduced and static fallback only */
html.js:not(.reduced-motion):not(.static-fallback) :is(.haruka-copy,.luna-copy,.sol-copy){background-image:none}

.premiere-award{font-size:clamp(12px,.85vw,16px)}
.premiere-meta{font-size:clamp(12px,.8vw,14px)}
.premiere-top>a{display:inline-flex;gap:10px;align-items:center;min-height:44px;transition:opacity var(--d-1) var(--ease-std)}
.premiere-top>a:hover .i,.premiere-actions a:hover .i{transform:translateY(2px)}
.premiere-actions .i{width:1em;height:1em}
.premiere-player-hint{font-size:12px}
/* The screen lives inside the hero: opened mid-dissolve, it must not inherit the hero's partial alpha */
.experience-on .brand-introduction.is-watching{opacity:1!important;visibility:visible!important}
/* The Motion toggle gets the same cut as the OS setting (premiere.css) */
.reduced-motion :is(.premiere-screen,.premiere-top,.premiere-content,.premiere-bottom,.premiere-backdrop img){transition:none}
@media (min-width:601px){.premiere-bottom p{font-size:15px;line-height:1.6;max-width:34em}.premiere-bottom p strong{font-size:12px;letter-spacing:.16em}.premiere-bottom [lang=ja]{display:block;margin-top:4px;font-size:14px;color:var(--text-3)}}
@media (min-width:601px) and (max-width:900px){.premiere-bottom p{max-width:300px}.premiere-bottom [lang=ja]{display:none}}
@media (min-width:601px) and (max-height:560px){.premiere-bottom p{font-size:12px}.premiere-bottom [lang=ja]{display:none}.premiere-award,.premiere-meta,.premiere-studio{font-size:12px}.premiere-actions a{font-size:12px}}
@media (max-width:600px){
.premiere-studio{font-size:12px}
.premiere-top{flex-wrap:wrap;row-gap:2px}
.premiere-top>*{white-space:nowrap}
.premiere-top>a{font-size:13px}
.premiere-award{font-size:13px}
.premiere-meta{font-size:12px}
.premiere-synopsis{font-size:14px}
.premiere-actions a{font-size:14px}
.premiere-bottom{justify-content:flex-end}
.premiere-bottom p{display:none}
.premiere-bottom .premiere-next{font-size:12px}
.premiere-bottom .premiere-next strong{font-size:20px}
.premiere-screen-top,.premiere-exit,.premiere-native-controls{font-size:12px}
}
@media (max-width:600px) and (max-height:700px){.premiere-synopsis{display:none}}

/* Bridge (prefixed over legacy) */
.studio-bridge .bridge-description{font-size:clamp(14px,1.05vw,17px)}
.studio-bridge .bridge-ja{margin-top:15px;font:400 14px/1.8 var(--font-ja);color:var(--text-3)}
.studio-bridge .bridge-actions :is(a,button){display:inline-flex;gap:14px;align-items:center;min-height:44px;padding:0;background:none;border:0;border-bottom:1px solid #a7b6c050;font:500 13px/1 var(--font-sans);color:var(--text-1);transition:border-color var(--d-1) var(--ease-std),opacity var(--d-1) var(--ease-std)}
.studio-bridge .bridge-actions :is(a,button):hover{border-bottom-color:var(--text-1)}
.studio-bridge .bridge-actions a:hover .i{transform:translateY(2px)}
/* The bridge's Start a project stays an underline link: the header's CTA is the frame's one solid button. Its arrow moves on fine-pointer hover only (a tap's sticky hover must not outlive the dialog). */
@media (hover:hover) and (pointer:fine){.studio-bridge .bridge-actions button:hover .i{transform:translate(2px,-2px)}}
.studio-bridge .bridge-actions button:focus-visible .i{transform:translate(2px,-2px)}
.studio-bridge .bridge-disciplines{display:flex;flex-wrap:wrap;align-items:center;gap:0 28px;font-size:13px}
.studio-bridge .bridge-disciplines>a{display:inline-flex;gap:8px;align-items:center;min-height:44px;font:500 13px/1 var(--font-sans);letter-spacing:0;color:var(--text-2);transition:color var(--d-1) var(--ease-std),opacity var(--d-1) var(--ease-std)}
.studio-bridge .bridge-disciplines>a:hover{color:var(--text-1)}
.studio-bridge .bridge-disciplines>a span{margin:0;font:400 12px/1 var(--font-mono);color:var(--text-3)}
.studio-bridge .bridge-disciplines>.bridge-continue{margin-left:auto;color:var(--text-1)}
.studio-bridge .bridge-disciplines>.bridge-continue:hover .i{transform:translateY(2px)}
@media (max-height:680px) and (min-width:651px){.studio-bridge .bridge-ja{display:none}}
@media (max-height:720px) and (max-width:650px){.studio-bridge .bridge-ja{display:none}}
@media (max-width:650px){
.studio-bridge .bridge-slate .slate-ja{flex-basis:100%;padding-left:calc(clamp(48px,8vw,120px) + 14px)}
.studio-bridge .bridge-disciplines>a:not(.bridge-continue){display:none}
.studio-bridge .bridge-disciplines>a.bridge-continue{display:inline-flex}
}

/* Static CELEA reveal (reduced, no-JS) */
.project-caption .eyebrow{font-size:12px}
.project-caption .jp,.project-caption .text-link{font-size:12px}
.project-caption .text-link{transition:opacity var(--d-1) var(--ease-std)}
.project-caption .text-link:active{opacity:.72}
/* World lights (2026-10-28): each world after the film names its light (data-light, written to the header as data-page-light);
   the header hairline, the nav cursor and the readout kind take it. Without a light they keep the house values. */
.site-header.spine[data-page-light=signal]{--page-light:#ff4a4f}
.site-header.spine[data-page-light=blueprint]{--page-light:var(--earth)}
html.past-film .site-header.spine:not([data-page-light=""]){border-bottom-color:color-mix(in srgb,var(--page-light,var(--line-1)) 45%,var(--line-1))}
.site-header.spine .spine-cursor{background:var(--page-light,var(--text-1))}
.site-header.spine .readout-kind{color:var(--page-light,var(--text-3))}
.sheet-name[lang=ko]{font:400 22px/1.25 var(--font-ko);letter-spacing:-.02em;word-break:keep-all}
