/* The IFAH host: the building. Since 5 Oct it speaks the Player's language (the object pass): a neutral ground,
   Archivo for what is said, one uppercase label in Plex Mono, blue for authored structure, and no rust (rust is what
   sounds, and the building plays nothing). The mark, the way in and the way out; the room, an empty disc waiting for
   a copy; the shelf, the device's Collection, drawn as the Player draws its own; a refusal said in words. Each
   instrument brings its own room, and the host stays quiet around it. Local fonts only; this Player works offline. */
@font-face{font-family:Plex;src:url('fonts/plex-mono.woff2') format('woff2');font-display:swap;font-weight:400}
@font-face{font-family:PlexSans;src:url('fonts/plex-sans.woff2') format('woff2');font-display:swap;font-weight:400 600}
@font-face{font-family:Newsreader;src:url('fonts/newsreader.woff2') format('woff2');font-display:swap;font-weight:400 500}
@font-face{font-family:Archivo;src:url('fonts/archivo.woff2') format('woff2');font-weight:100 900;font-stretch:62% 125%;font-display:swap}
:root{--paper:#F4F4F2;--sheet:#FFFFFF;--ink:#0E0F11;--ink2:#3B3E44;--muted:#5A5E66;--line:#0E0F11;--hair:#CFCFC9;
  --blue:#1F3BE2;--now:var(--blue);
  --register:Plex,ui-monospace,SFMono-Regular,Menlo,monospace;--machine:Archivo,'Helvetica Neue',Arial,system-ui,sans-serif;--work:Newsreader,Georgia,serif;
  --display:Archivo,'Arial Narrow',sans-serif;--settle:cubic-bezier(.22,.7,.12,1);--bar:calc(52px + env(safe-area-inset-top));
  color-scheme:light;background:var(--paper);color:var(--ink);font-family:var(--machine);-webkit-font-smoothing:antialiased}
*{box-sizing:border-box}
html,body{overflow-x:hidden}
body{margin:0;min-height:100dvh;background:var(--paper)}
button,label{font:inherit;color:inherit}
/* one uppercase label, as in the Player */
.host-channel,.host-object,.host-action,.host-hint,.host-verifying,.host-language,.shelf-register,.object-foot,.pocket-turn,.host-error-title,.host-error-code,
.device-kind,.device-count,.device-toggle,.device-remove,.device-field,.device-name small,.pending-mark,.cartel-copy,.cartel-run,
.verso-kind,.verso-fields dt,.verso-signed{font-family:var(--register);font-size:11px;font-weight:400;letter-spacing:.12em;text-transform:uppercase}

/* ---- The corridor: the mark, the way in, the way out ---- */
.host-bar{position:relative;z-index:5;display:flex;align-items:center;gap:12px;height:var(--bar);padding:env(safe-area-inset-top) max(10px,env(safe-area-inset-right)) 0 max(16px,env(safe-area-inset-left));
  background:var(--paper);border-bottom:1px solid transparent;transition:border-color .4s var(--settle)}
body[data-lifecycle=loaded] .host-bar{border-bottom-color:var(--hair)}
.host-mark{display:block;flex:none;width:46px;height:auto}
/* The Rehearsal Player says so, once, beside the mark: what opens here is never a real copy. */
.host-channel{flex:none;min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:var(--ink2)}
.host-channel[hidden]{display:none}
@media(max-width:519px){body[data-lifecycle=loaded] .host-channel,body[data-outcome] .host-channel{display:none}}
.host-object{flex:1;min-width:0;visibility:hidden;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink2)}
.host-actions{display:flex;align-items:center;gap:0;margin-left:auto}
.host-action{position:relative;display:inline-flex;white-space:nowrap;align-items:center;gap:7px;min-height:44px;padding:0 8px;border:0;border-radius:0;background:none;color:var(--ink);cursor:pointer}
.host-action>span:first-child{padding-bottom:2px;border-bottom:1px solid transparent;transition:border-color .2s var(--settle)}
.host-action:hover>span:first-child,.host-action:focus-within>span:first-child{border-bottom-color:currentColor}
.host-action:focus-visible,.open-file:focus-within{outline:2px solid var(--ink);outline-offset:2px}
.host-action[hidden]{display:none}
.host-close span[aria-hidden]{font:300 17px/1 var(--machine);letter-spacing:0;margin-top:-2px}
.open-file input{position:absolute;inset:0;width:1px;height:1px;opacity:0;pointer-events:none}
/* While nothing is held, the way in stands in the room itself. */
body[data-lifecycle=empty] .open-file{position:absolute;right:0;top:0;width:1px;height:1px;min-height:0;padding:0;overflow:hidden;clip-path:inset(50%);opacity:0;pointer-events:none}
/* A new object on its way in: a thin line under the corridor. */
body[data-verifying=true][data-lifecycle=loaded] .host-bar:after{content:'';position:absolute;left:0;right:0;bottom:-1px;height:1px;background:var(--blue);transform-origin:0 50%;animation:verify-line 1.1s var(--settle) infinite}
@keyframes verify-line{from{transform:scaleX(0)}to{transform:scaleX(1);opacity:0}}
@media(min-width:640px){body[data-lifecycle=loaded] .host-object{visibility:visible}}

/* ---- The empty room: one object (an empty disc, dotted: a place for a copy), one line, one action ---- */
.host-empty{display:none;position:relative;min-height:calc(100dvh - var(--bar));justify-items:center;align-content:center;gap:30px;padding:24px 16px calc(40px + env(safe-area-inset-bottom))}
body[data-lifecycle=empty] .host-empty{display:grid}
.host-room{position:relative;display:block;width:min(60vw,232px);height:auto;overflow:visible;cursor:pointer}
.host-room-wall{fill:none;stroke:var(--blue);stroke-width:1.5;stroke-linecap:round;stroke-dasharray:.0001 .0125;transition:stroke .4s var(--settle)}
.host-room-hole{fill:var(--paper);stroke:rgba(17,17,19,.22);stroke-width:1}
.host-room-now{fill:var(--blue);transform-box:fill-box;transform-origin:50% 50%}
.host-empty-words{position:relative;display:flex;flex-direction:column;align-items:center;gap:14px;width:min(80vw,300px);text-align:center}
.host-ready{margin:0;font:400 18px/1.3 var(--machine);color:var(--ink);text-wrap:balance}
.host-open{display:inline-flex;align-items:center;justify-content:center;min-height:44px;padding:0 22px;border-radius:22px;background:var(--ink);color:var(--paper);
  font:500 14px/1 var(--machine);cursor:pointer;transition:transform .25s var(--settle)}
.host-open:hover{transform:translateY(-1px)}
.host-hint{margin:0;color:var(--muted)}
.host-verifying{display:none;margin:0;color:var(--ink)}
/* Receiving: a file is held over the Player. The disc closes around it. */
body[data-receiving=true] .host-room-wall{stroke-dasharray:none}
body[data-receiving=true] .host-room-now{animation:now-pulse 1.2s ease-in-out infinite}
/* Arriving: a copy of the holder's is being made. The empty disc waits for it; its dot is alive. */
body[data-arriving=true] .host-room-now{animation:now-pulse 1.6s ease-in-out infinite}
body[data-arriving=true] .host-open,body[data-arriving=true] .host-hint{display:none}
/* Verifying: the disc draws itself whole while the object is checked. */
body[data-verifying=true] .host-room-wall{stroke-dasharray:1;stroke-dashoffset:1;animation:wall-draw 1.4s var(--settle) infinite alternate}
body[data-verifying=true] .host-open,body[data-verifying=true] .host-hint,body[data-verifying=true] .host-language{display:none}
.host-language{display:flex;align-items:center;gap:8px;margin-top:4px;color:var(--muted)}
.host-language button{font:inherit;letter-spacing:inherit;text-transform:inherit;color:inherit;background:none;border:0;padding:10px 2px;cursor:pointer}
.host-language button[aria-pressed=true]{color:var(--ink);text-decoration:underline;text-underline-offset:4px}
body[data-verifying=true] .host-verifying{display:block}
@keyframes wall-draw{to{stroke-dashoffset:0}}
@keyframes now-pulse{50%{transform:scale(1.6);opacity:.6}}

/* ---- The shelf: the device's Collection, as the Player draws its own. Each copy is one row and one touch: its cover
   on a disc (a small centre hole, its rim the parts as it last showed them: heard and open in fine marks, waiting
   dotted in blue), its name, its maker, where it stands and the day it came; its copy number large on the right. ---- */
.host-shelf{display:none;width:min(100%,560px)}
body[data-shelf=true] .host-empty{align-content:start;gap:22px;padding-top:18px}
body[data-shelf=true] .host-room{display:none}
body[data-shelf=true] .host-shelf{display:block}
body[data-shelf=true] .host-empty-words{width:min(100%,560px);flex-direction:row;flex-wrap:wrap;justify-content:flex-start;gap:8px 18px;text-align:left}
body[data-shelf=true] .host-ready{display:none}
.shelf-register{margin:0;padding-bottom:10px;border-bottom:1px solid var(--hair);color:var(--ink2)}
.shelf{display:block;margin:0;padding:0;list-style:none}
.pocket{min-width:0;border-bottom:1px solid var(--hair);animation:card-in .5s var(--settle) backwards;animation-delay:calc(var(--i,0) * 60ms)}
@keyframes card-in{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
.object-card{display:grid;grid-template-columns:64px minmax(0,1fr) auto;gap:14px;align-items:center;width:100%;padding:13px 0;border:0;background:none;color:var(--ink);text-align:left;cursor:pointer}
.object-card:focus-visible{outline:2px solid var(--ink);outline-offset:3px}
.object-figure{position:relative;display:block;width:64px;height:64px;border-radius:50%}
.object-figure img,.object-plain{position:absolute;inset:11%;width:78%;height:78%;border-radius:50%;object-fit:cover;box-shadow:0 0 0 1px var(--hair)}
.object-plain{display:block;background:none}
.object-hole{position:absolute;left:50%;top:50%;width:9%;aspect-ratio:1;transform:translate(-50%,-50%);border-radius:50%;background:var(--paper);box-shadow:0 0 0 1px rgba(17,17,19,.2)}
.object-rim{position:absolute;inset:0;width:100%;height:100%;overflow:visible;pointer-events:none}
.object-rim path{fill:none;stroke:var(--ink);stroke-width:.8;stroke-linecap:round;opacity:.4}
.object-rim path.heard{opacity:.62}
.object-rim .wait circle{fill:var(--blue);opacity:.55}
.object-card:hover .object-figure img{box-shadow:0 0 0 1px var(--ink2)}
.object-figure[data-gift]{display:grid;place-items:center}
.object-letter{width:78%;height:auto;overflow:visible}
.object-letter rect{fill:var(--sheet);stroke:var(--ink);stroke-width:1.2}
.object-letter path{fill:none;stroke:var(--ink);stroke-width:1.2}
.object-letter .seal{fill:var(--sheet);stroke:var(--ink);stroke-width:1.4}
.object-letter .seal-dot{fill:var(--ink)}
.object-figure[data-gift=available] .seal{stroke:var(--blue);stroke-dasharray:50 7}
.object-figure[data-gift=available] .seal-dot{fill:var(--blue)}
.object-figure[data-gift=opened] .object-letter path{opacity:.35}
.object-figure[data-gift=opened] .seal{stroke-dasharray:4 5;opacity:.6}
.object-text{display:flex;flex-direction:column;gap:2px;min-width:0}
.pocket-title{font:500 15px/1.2 var(--machine);overflow-wrap:anywhere}
.pocket-maker{font-size:12.5px;line-height:1.35;color:var(--ink2)}
.pocket-maker:empty{display:none}
.pocket-state{font-size:12.5px;line-height:1.35;color:var(--ink)}
.pocket[data-complete=true] .pocket-state{font-weight:500}
.object-foot{display:flex;align-items:center;gap:8px;margin-top:4px;color:var(--muted);font-size:10px}
.object-foot span:first-child{white-space:nowrap}
.object-foot .seal-code{height:6px;width:auto;max-width:40%;flex:none;fill:currentColor;opacity:.8}
.object-foot .seal-code .f{fill:currentColor}
.object-band{display:flex;flex-direction:column;align-items:flex-end;align-self:start;padding-top:2px}
.object-no{display:flex;flex-direction:column;align-items:flex-end;line-height:1}
.object-no b{font:300 22px/1 var(--display);font-stretch:125%;letter-spacing:.01em;font-variant-numeric:tabular-nums}
.object-no small{margin-top:4px;font-size:10.5px;color:var(--ink2);white-space:nowrap}
.pocket-label{display:flex;padding:0 0 12px 78px}

/* ---- The instrument's room ---- */
#instrument{display:none;position:relative}
body[data-lifecycle=loaded] #instrument{display:block;height:calc(100dvh - var(--bar));overflow:auto;animation:room-in .5s var(--settle) both}
@keyframes room-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
#instrument iframe{display:block;width:100%;height:100%;min-height:0!important;border:0}

/* ---- A refusal, said in words; the room behind it stays as it was ---- */
.host-error{position:fixed;z-index:20;top:calc(var(--bar) + 10px);left:50%;transform:translateX(-50%);display:grid;grid-template-columns:2px 1fr auto;gap:0 14px;
  width:min(calc(100% - 24px),520px);padding:14px 10px 14px 0;background:var(--sheet);border:1px solid var(--hair);border-radius:4px;box-shadow:0 18px 40px -18px rgba(17,17,19,.35);
  animation:error-in .42s var(--settle) both}
.host-error[hidden]{display:none}
.host-error-mark{background:var(--ink);border-radius:0 2px 2px 0}
.host-error-words{min-width:0}
.host-error-words p{margin:0}
.host-error-title{color:var(--ink)}
#error-reason{margin-top:6px!important;font:400 16px/1.35 var(--machine);color:var(--ink)}
#error-kept{margin-top:6px!important;font:13px/1.4 var(--machine);color:var(--ink2)}
.host-error-code{margin-top:8px!important;font-size:10px;color:var(--muted)}
.host-error-dismiss{align-self:start;width:36px;height:36px;border:0;background:none;font:300 20px/1 var(--machine);cursor:pointer;color:var(--ink2)}
@keyframes error-in{from{opacity:0;transform:translate(-50%,-6px)}to{opacity:1;transform:translate(-50%,0)}}

@media(prefers-reduced-motion:reduce){
  .pocket{animation:none}.object-card{transition:none}
  body[data-lifecycle=loaded] #instrument,.host-error,.host-bar:after{animation:none}
  body[data-verifying=true] .host-room-wall,body[data-receiving=true] .host-room-now,body[data-arriving=true] .host-room-now{animation:none}
}

/* ---- Ownership. A held copy carries its holder: "Yours since", the artist's proof, and its certificate, which unfolds
   under its row: the label for what is stated, Archivo for the facts, the serif only for the holder's name (a
   signature), closed by the copy's own seal. A copy held by someone else stands behind glass with its label. A copy
   waiting for its key keeps the room's dotted disc around it. This device is one line on the home. ---- */
.object-turn{display:block}
.object-verso{display:none;flex-direction:column;min-width:0;margin:0 0 12px 78px;padding:14px 16px 12px;border-radius:6px;background:var(--sheet);color:var(--ink);cursor:pointer;
  box-shadow:0 0 0 1px var(--hair),inset 0 0 0 6px var(--sheet),inset 0 0 0 7px rgba(31,59,226,.26)}
.object-turn[data-turned=true]>.object-verso{display:flex;animation:verso-in .45s var(--settle) both}
@keyframes verso-in{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
.verso-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;padding:3px 3px 8px;border-bottom:1px solid var(--hair)}
.verso-kind{color:var(--ink2)}
.verso-no{font:300 20px/.9 var(--display);font-stretch:125%;letter-spacing:.01em}
.verso-title{margin:10px 3px 10px;font:500 16px/1.15 var(--machine)}
.verso-fields{display:grid;gap:6px;margin:0 3px}
.verso-fields div{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:baseline;gap:10px;padding-bottom:6px;border-bottom:1px dotted rgba(17,17,19,.3)}
.verso-fields dt{font-size:10px;color:var(--muted)}
.verso-fields dd{margin:0;text-align:right;font:400 13px/1.2 var(--machine);overflow-wrap:anywhere}
.verso-fields dd.verso-holder{font:italic 400 17px/1 var(--work);letter-spacing:-.005em}
.verso-seal{display:flex;flex-direction:column;gap:6px;margin-top:auto;padding:12px 3px 0}
.object-verso .cipher{display:block;width:100%;height:auto;overflow:visible;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:round;opacity:.5}
.object-verso .cipher *{vector-effect:non-scaling-stroke}
.object-verso .cipher .f{fill:currentColor;stroke:none}
.object-verso .cipher-box{opacity:.35}
.verso-signed{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:10px;color:var(--ink2)}
.verso-signed .seal-code{height:6px;width:auto;max-width:50%;fill:currentColor}
.pocket-turn{align-self:flex-start;padding:6px 0 3px;border:0;border-bottom:1px solid currentColor;background:none;color:var(--ink);cursor:pointer}
.pocket-turn::after{content:' +'}
.pocket-turn[aria-pressed=true]::after{content:' \2212'}
.pocket[data-mine] .object-foot span:first-child{color:var(--ink)}
.pocket[data-mine=proof] .object-no b{font-stretch:100%}

/* A copy held by someone else: its public face behind glass, and its label. */
.host-outcome[hidden]{display:none}
body[data-outcome] #host-empty,body[data-outcome] #instrument{display:none}
.host-outcome{display:grid;place-items:center;min-height:calc(100dvh - var(--bar));padding:30px 16px calc(44px + env(safe-area-inset-bottom))}
.glass-room,.pending-room{display:flex;flex-direction:column;align-items:center;width:min(100%,360px);animation:glass-in .8s var(--settle) both}
.glass-room{gap:34px}
@keyframes glass-in{from{opacity:0;transform:translateY(10px) scale(.985)}to{opacity:1;transform:none}}
.vitrine{position:relative;width:min(72vw,292px);margin:0;padding:15px;border-radius:5px;background:linear-gradient(180deg,#fbfbfa,#ececea);
  box-shadow:inset 0 1px 0 #fff,0 0 0 1px var(--hair),0 44px 50px -36px rgba(17,17,19,.5)}
.vitrine::after{content:'';position:absolute;left:10%;right:10%;bottom:-30px;height:16px;border-radius:50%;background:radial-gradient(closest-side,rgba(17,17,19,.16),transparent)}
.vitrine-pane{display:block;aspect-ratio:1;overflow:hidden;border-radius:50%;background:#e4e4e1}
.vitrine-pane img{display:block;width:100%;height:100%;object-fit:cover;filter:saturate(.8) brightness(.97)}
.vitrine-plain{display:grid;place-items:center;height:100%;padding:16px;font:500 19px/1.15 var(--machine);text-align:center;color:var(--ink2)}
.vitrine-glass{position:absolute;inset:7px;border-radius:3px;pointer-events:none;
  background:linear-gradient(118deg,transparent 0 30%,#ffffff66 37%,#ffffff1a 44%,transparent 51%),linear-gradient(118deg,transparent 0 56%,#ffffff33 59%,transparent 64%),linear-gradient(180deg,#ffffff26,transparent 30%);
  box-shadow:inset 0 0 0 1px #ffffffb3,inset 0 0 0 2px #0000000d,inset 0 0 26px #ffffff2e;animation:glass-sheen 1.6s .3s var(--settle) both}
@keyframes glass-sheen{from{background-position:-120px 0,-120px 0,0 0;opacity:.2}to{background-position:0 0,0 0,0 0;opacity:1}}
.cartel{width:min(72vw,292px);padding:13px 14px 13px 15px;border-left:2px solid var(--ink);background:var(--sheet);box-shadow:0 1px 0 var(--hair),0 10px 18px -16px rgba(17,17,19,.3)}
.cartel-title{margin:0;font:400 22px/1 var(--display);font-stretch:125%;text-transform:uppercase;letter-spacing:.02em}
.cartel-artist{margin:6px 0 11px;font:400 15px/1.2 var(--machine);color:var(--ink2)}
.cartel-copy,.cartel-run{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin:0;font-size:10px}
.cartel-copy{padding-top:8px;border-top:1px solid var(--hair)}
.cartel-private{color:var(--muted)}
.cartel-words{margin:11px 0 0;font:400 16px/1.35 var(--work);color:var(--ink)}
.cartel-run{margin-top:12px;padding-top:9px;border-top:1px dotted rgba(17,17,19,.3)}

/* A copy waiting for its key on this device: the object, quietly, inside the room's dotted disc. */
.pending-room{gap:26px;text-align:center}
.pending-object{width:min(54vw,212px);aspect-ratio:1;margin:0;overflow:hidden;border-radius:50%;background:#e4e4e1;outline:1.5px dotted var(--blue);outline-offset:12px}
.pending-object img{display:block;width:100%;height:100%;object-fit:cover;filter:grayscale(.6) contrast(.92) brightness(1.05);opacity:.78}
.pending-words{display:flex;flex-direction:column;align-items:center;gap:12px}
.pending-mark{margin:0;color:var(--ink2)}
.pending-said{margin:0;max-width:280px;font:400 17px/1.35 var(--machine);text-wrap:balance}
.pending-act,.device-act{display:inline-flex;align-items:center;justify-content:center;min-height:44px;padding:0 20px;border:0;border-radius:22px;background:var(--ink);color:var(--paper);
  font:500 14px/1 var(--machine);letter-spacing:0;text-transform:none;cursor:pointer;transition:transform .25s var(--settle),opacity .25s}
.pending-act:disabled,.device-act:disabled{opacity:.55;cursor:default}

/* This device: one line on the home, opening in place. */
.host-device:empty{display:none}
.host-device{width:min(100%,560px)}
body:not([data-shelf=true]) .host-device{position:absolute;z-index:1;top:18px;left:50%;width:min(calc(100% - 32px),560px);transform:translateX(-50%)}
/* Pairing takes the whole home while it is open; the empty room returns when it settles. */
body:not([data-shelf=true]) .host-empty:has(.device[data-open=true]) :is(.host-room,.host-empty-words){display:none}
body:not([data-shelf=true]) .host-empty:has(.device[data-open=true]){align-content:start}
.device{padding-bottom:11px;border-bottom:1px solid var(--hair)}
.device-head{display:flex;align-items:center;gap:12px}
.device-kind{flex:none;color:var(--ink2)}
.device-summary{display:flex;flex:1;flex-direction:column;gap:3px;min-width:0}
.device-holder{font:italic 400 17px/1.05 var(--work)}
.device-count{font-size:10px;color:var(--muted)}
.device-lead{font:400 14px/1.3 var(--machine);color:var(--ink2)}
.device-toggle,.device-remove{flex:none;min-height:36px;padding:0 4px;border:0;border-bottom:1px solid transparent;border-radius:0;background:none;color:var(--ink);cursor:pointer}
.device-toggle:hover,.device-remove:hover,.device[data-open=true] .device-toggle{border-bottom-color:currentColor}
.device-body:empty{display:none}
.device-body{padding:16px 0 4px;animation:device-open .45s var(--settle) both}
@keyframes device-open{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}
.device-form{display:flex;flex-direction:column;align-items:flex-start;gap:14px}
.device-field{display:flex;flex-direction:column;gap:7px;width:100%;color:var(--muted)}
.device-field input{width:100%;padding:6px 0 7px;border:0;border-bottom:1px solid var(--ink);border-radius:0;background:transparent;outline:none;
  font:400 18px/1.2 var(--machine);letter-spacing:0;text-transform:none;color:var(--ink)}
.device-field input:focus{border-bottom-width:2px;padding-bottom:6px}
.device-field input::placeholder{color:rgba(17,17,19,.3)}
.device-field input.device-code{width:9.2em;font:500 26px/1 var(--register);letter-spacing:.5em;
  background:repeating-linear-gradient(90deg,transparent 0 .9em,var(--paper) .9em 1.5em) bottom/100% 2px no-repeat;border-bottom-color:transparent}
.device-note{margin:0;font:400 15px/1.35 var(--machine);color:var(--ink)}
.device-arriving{margin-top:14px;color:var(--ink2)}
/* The contract's way out, which the pilot's build sets at the foot of the building: one quiet label, in the
   page's language, on the home only (an open copy has the whole height). */
.paid-panel{padding:20px 16px calc(22px + env(safe-area-inset-bottom));text-align:center;font-family:var(--register);font-size:11px;font-weight:400;letter-spacing:.12em;text-transform:uppercase}
.paid-panel a{display:inline-block;min-height:44px;padding:14px 4px 0;color:var(--muted);text-decoration:none}
.paid-panel a span{border-bottom:1px solid var(--hair);padding-bottom:3px}
.paid-panel [lang]{display:none}
html[lang=en] .paid-panel [lang=en],html[lang=fr] .paid-panel [lang=fr]{display:inline}
body:not([data-lifecycle=empty]) .paid-panel{display:none}
.device-hint{font:400 12.5px/1.3 var(--machine);letter-spacing:0;text-transform:none;color:var(--muted)}
.device-done::before{content:'';display:inline-block;width:7px;height:7px;margin:0 9px 1px 0;border-radius:50%;background:var(--ink)}
.device-problem{margin:0 0 6px;font:400 15px/1.35 var(--machine);color:var(--ink)}
.device-list{display:flex;flex-direction:column;margin:0;padding:0;list-style:none}
.device-list li{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:11px 0;border-top:1px solid var(--hair)}
.device-name{display:flex;flex-direction:column;gap:4px}
.device-name b{font:500 14px/1.1 var(--machine)}
.device-name small{font-size:10px;color:var(--muted)}
.device-list li[data-current=true] small{color:var(--ink)}
@media(prefers-reduced-motion:reduce){
  .object-turn[data-turned=true]>.object-verso,.glass-room,.pending-room,.vitrine-glass,.device-body{animation:none}
}
