:root{--canvas: #eef1f6;--canvas-deep: #dde3ec;--surface: #ffffff;--surface-sunk: #f2f4f7;--line: #e3e7ee;--line-strong: #cdd4df;--ink: #10151c;--ink-2: #495768;--ink-3: #8794a5;--accent: #1a63d8;--in: #0a8f5b;--in-bg: #e6f6ee;--out: #b26a00;--out-bg: #fdf1de;--danger: #c0392e;--warn: #b3781a;--wash-accent: 42%;--wash-in: 36%;--wash-warm: 28%;--shadow-1: 0 1px 2px rgb(16 21 28 / .05);--shadow-2: 0 2px 4px rgb(16 21 28 / .04), 0 18px 44px -12px rgb(16 21 28 / .16);--r-sm: 8px;--r-md: 14px;--r-lg: 22px;--r-xl: 30px;--u: 8px;--ease: cubic-bezier(.22,.61,.36,1);color-scheme:light}*{box-sizing:border-box}[hidden]{display:none!important}html,body{height:100%}body{margin:0;background:var(--canvas);color:var(--ink);font-family:Inter var,Inter,Segoe UI Variable Display,Segoe UI,system-ui,-apple-system,Helvetica Neue,sans-serif;font-feature-settings:"cv11","ss01";-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;overflow:hidden}body:before{content:"";position:fixed;inset:0;z-index:0;pointer-events:none;background:radial-gradient(125vw 85vh at 4% -16%,color-mix(in oklab,var(--accent) var(--wash-accent),transparent),transparent 66%),radial-gradient(110vw 78vh at 106% 114%,color-mix(in oklab,var(--in) var(--wash-in),transparent),transparent 64%),radial-gradient(95vw 55vh at 78% 104%,color-mix(in oklab,var(--out) var(--wash-warm),transparent),transparent 58%),linear-gradient(var(--canvas),var(--canvas-deep))}body:after{content:"";position:fixed;inset:0;z-index:0;pointer-events:none;background:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%201440%20900'%20preserveAspectRatio='xMidYMid%20slice'%20role='presentation'%3e%3c!--%20Backdrop%20for%20the%20kiosk%20board%20—%20architecture,%20not%20illustration.%20Read%20the%20philosophy%20before%20changing%20this:%20hue%20is%20rationed%20to%20connection%20state%20and%20crossing%20direction,%20and%20nothing%20on%20this%20surface%20decorates.%20So%20the%20backdrop%20is%20monochrome%20ink%20at%20roughly%2010%25%20and%20built%20from%20two%20ideas%20the%20board%20already%20stands%20for:%20·%20a%20hairline%20field,%20the%20grain%20of%20a%20drawing%20under%20the%20composition%20·%20arcs%20opening%20from%20the%20floor%20line%20—%20the%20threshold,%20the%20thing%20being%20crossed%20It%20exists%20mostly%20to%20give%20the%20glass%20something%20to%20refract.%20A%20blurred%20surface%20over%20flat%20colour%20reads%20as%20flat%20colour;%20over%20structure%20it%20reads%20as%20glass.%20The%20CSS%20masks%20it%20away%20from%20the%20centre%20so%20the%20card%20always%20lands%20on%20quiet.%20--%3e%3cdefs%3e%3cpattern%20id='field'%20width='120'%20height='120'%20patternUnits='userSpaceOnUse'%3e%3cpath%20d='M120%200H0v120'%20fill='none'%20stroke='%2310151c'%20stroke-opacity='.10'%20stroke-width='1'/%3e%3c/pattern%3e%3c/defs%3e%3crect%20width='1440'%20height='900'%20fill='url(%23field)'/%3e%3cg%20fill='none'%20stroke='%2310151c'%20stroke-opacity='.115'%3e%3ccircle%20cx='720'%20cy='936'%20r='300'/%3e%3ccircle%20cx='720'%20cy='936'%20r='470'/%3e%3ccircle%20cx='720'%20cy='936'%20r='660'/%3e%3ccircle%20cx='720'%20cy='936'%20r='870'/%3e%3c/g%3e%3c!--%20The%20floor%20line%20the%20arcs%20open%20from.%20Slightly%20stronger,%20because%20it%20is%20the%20one%20horizontal.%20--%3e%3cpath%20d='M0%20936h1440'%20fill='none'%20stroke='%2310151c'%20stroke-opacity='.16'%20stroke-width='1'/%3e%3c/svg%3e") center / cover no-repeat;-webkit-mask-image:radial-gradient(105vw 88vh at 50% 46%,transparent 6%,#000 62%);mask-image:radial-gradient(105vw 88vh at 50% 46%,transparent 6%,#000 62%)}#app{position:relative;z-index:1;height:100vh;display:grid;grid-template-rows:auto 1fr}#app:has(>.notice){grid-template-rows:1fr;place-items:center}.topbar{position:relative;display:flex;align-items:center;justify-content:space-between;gap:calc(var(--u) * 2);padding:calc(var(--u) * 2.25) clamp(20px,3.2vw,48px);border-bottom:1px solid color-mix(in oklab,var(--line) 80%,transparent);background:color-mix(in oklab,#ffffff96 80%,transparent);backdrop-filter:blur(26px) saturate(1.3);-webkit-backdrop-filter:blur(26px) saturate(1.3);box-shadow:inset 0 1px #ffffff8c,0 1px 24px -14px #10151c80}.brand{display:flex;align-items:center;gap:calc(var(--u) * 1.75);min-width:0}.brand-mark{width:44px;height:44px;border-radius:12px;flex:none;display:grid;place-items:center;overflow:hidden;background:linear-gradient(145deg,var(--accent),color-mix(in oklab,var(--accent) 55%,var(--in)));box-shadow:0 2px 10px -2px color-mix(in oklab,var(--accent) 55%,transparent)}.brand-mark svg{width:22px;height:22px}.brand-mark[data-logo=true]{background:var(--surface-sunk);border:1px solid var(--line);box-shadow:var(--shadow-1)}.brand-mark img{width:100%;height:100%;object-fit:contain;display:block}.brand-text{display:grid;line-height:1.15;min-width:0}.brand-name,.brand-where,.brand-address{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.brand-name{font-size:clamp(13px,1.05vw,15px);font-weight:620;letter-spacing:.14em;text-transform:uppercase;color:var(--ink)}.brand-where,.brand-address{font-size:clamp(10px,.8vw,11.5px);font-weight:560;letter-spacing:.13em;text-transform:uppercase;margin-top:3px}.brand-where{color:var(--ink-2)}.brand-address{color:var(--ink-3)}.topbar-right{display:flex;align-items:center;gap:calc(var(--u) * 2.5);flex:none}.bar-clock{font-size:clamp(13px,1.1vw,16px);font-weight:560;font-variant-numeric:tabular-nums;letter-spacing:.02em;color:var(--ink-2)}.status{display:flex;align-items:center;gap:9px;padding:7px 13px 7px 11px;border:1px solid var(--line);border-radius:999px;background:var(--surface-sunk);font-size:11px;font-weight:620;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-2);white-space:nowrap}.status-dot{width:7px;height:7px;border-radius:50%;background:var(--ink-3);position:relative}.status[data-state=connected] .status-dot{background:var(--in)}.status[data-state=connected] .status-dot:after{content:"";position:absolute;inset:-4px;border-radius:50%;background:var(--in);opacity:.28;animation:pulse 2.4s var(--ease) infinite}.status[data-state=reconnecting] .status-dot{background:var(--warn)}.status[data-state=disconnected] .status-dot{background:var(--danger)}@keyframes pulse{0%,to{transform:scale(.6);opacity:.3}50%{transform:scale(1.25);opacity:0}}.stage{display:grid;place-items:center;padding:clamp(20px,3vw,44px);min-height:0}.idle{display:grid;justify-items:center;gap:calc(var(--u) * 1.5);text-align:center;animation:fade-in .6s var(--ease)}.idle-clock{font-size:clamp(90px,16vw,260px);font-weight:250;line-height:.88;letter-spacing:-.045em;font-variant-numeric:tabular-nums;color:var(--ink);display:flex;align-items:baseline;gap:.12em}.idle-clock .mer{font-size:.2em;font-weight:560;letter-spacing:.16em;color:var(--ink-3);align-self:center;padding-bottom:.35em}.idle-date{font-size:clamp(14px,1.5vw,21px);font-weight:500;letter-spacing:.32em;text-transform:uppercase;color:var(--ink-2);margin-top:calc(var(--u) * .5)}.idle-rule{width:46px;height:1px;background:var(--line-strong);margin:calc(var(--u) * 3) 0}.idle-hint{font-size:clamp(12px,1.05vw,14px);font-weight:500;letter-spacing:.2em;text-transform:uppercase;color:var(--ink-3)}.punch{width:min(1180px,100%);display:grid;grid-template-columns:clamp(190px,22vw,300px) 1fr;gap:clamp(28px,4vw,64px);align-items:center;padding:clamp(28px,3.6vw,52px);background:color-mix(in oklab,#ffffff96 80%,transparent);backdrop-filter:blur(26px) saturate(1.3);-webkit-backdrop-filter:blur(26px) saturate(1.3);border:1px solid color-mix(in oklab,var(--line) 85%,transparent);border-radius:var(--r-xl);box-shadow:inset 0 1px #fff9,var(--shadow-2);animation:resolve .62s var(--ease) both}@keyframes resolve{0%{opacity:0;transform:translateY(14px) scale(.988)}to{opacity:1;transform:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.punch-photo{aspect-ratio:1;width:100%;border-radius:var(--r-lg);overflow:hidden;position:relative;background:var(--surface-sunk);border:1px solid var(--line);display:grid;place-items:center;box-shadow:var(--shadow-1)}.punch-photo img{width:100%;height:100%;object-fit:cover;display:block}.punch-photo .initials{font-size:clamp(48px,6vw,82px);font-weight:300;letter-spacing:.02em;color:var(--ink-3);background:linear-gradient(150deg,color-mix(in oklab,var(--accent) 12%,transparent),transparent 70%);width:100%;height:100%;display:grid;place-items:center}.punch-body{display:grid;gap:0;min-width:0}.greeting{font-size:clamp(13px,1.15vw,16px);font-weight:560;letter-spacing:.2em;text-transform:uppercase;color:var(--accent);margin-bottom:calc(var(--u) * 1.25)}.punch-name{margin:0;font-size:clamp(38px,5.4vw,82px);font-weight:600;line-height:1.02;letter-spacing:-.028em;overflow-wrap:break-word}.punch-position{margin:calc(var(--u) * 1.5) 0 0;font-size:clamp(13px,1.25vw,17px);font-weight:520;letter-spacing:.17em;text-transform:uppercase;color:var(--ink-2)}.punch-mark{display:flex;align-items:center;flex-wrap:wrap;gap:clamp(14px,1.8vw,26px);margin-top:clamp(20px,2.6vw,34px)}.slot-badge{display:inline-flex;align-items:center;gap:9px;padding:9px 16px 9px 13px;border-radius:999px;font-size:clamp(12px,1.05vw,14px);font-weight:680;letter-spacing:.15em;text-transform:uppercase;background:var(--in-bg);color:var(--in);border:1px solid color-mix(in oklab,var(--in) 28%,transparent);white-space:nowrap}.slot-badge[data-dir=out]{background:var(--out-bg);color:var(--out);border-color:color-mix(in oklab,var(--out) 30%,transparent)}.slot-badge svg{width:14px;height:14px}.punch-time{font-size:clamp(34px,4.6vw,66px);font-weight:300;letter-spacing:-.028em;line-height:1;font-variant-numeric:tabular-nums;color:var(--ink);display:flex;align-items:baseline;gap:.16em}.punch-time .mer{font-size:.34em;font-weight:600;letter-spacing:.12em;color:var(--ink-3)}.punch-facts{margin:clamp(22px,2.8vw,34px) 0 0;padding-top:clamp(18px,2.2vw,26px);border-top:1px solid var(--line);display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:clamp(16px,2.4vw,40px)}.fact{display:grid;gap:7px;min-width:0}.fact-label{font-size:10.5px;font-weight:660;letter-spacing:.17em;text-transform:uppercase;color:var(--ink-3)}.fact-value{margin:0;font-size:clamp(15px,1.45vw,20px);font-weight:560;letter-spacing:-.005em;font-variant-numeric:tabular-nums;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.punch-note{margin:calc(var(--u) * 2.25) 0 0;display:grid;grid-template-columns:auto 1fr;gap:clamp(12px,1.4vw,18px);align-items:start;padding:clamp(13px,1.5vw,18px) clamp(15px,1.7vw,20px);border-radius:var(--r-md);border:1px solid var(--line);background:var(--surface-sunk);--note-tone: var(--out)}.punch-note[data-tone=error]{--note-tone: var(--danger);border-color:color-mix(in oklab,var(--danger) 26%,var(--line));background:color-mix(in oklab,var(--danger) 6%,var(--surface-sunk))}.punch-note-icon{width:clamp(30px,2.9vw,40px);aspect-ratio:1;border-radius:var(--r-sm);display:grid;place-items:center;background:color-mix(in oklab,var(--note-tone) 12%,transparent);border:1px solid color-mix(in oklab,var(--note-tone) 28%,transparent);color:var(--note-tone)}.punch-note-icon svg{width:60%;height:60%;display:block}.punch-note-body{display:grid;gap:0;min-width:0;align-self:center}.punch-note-title{font-size:clamp(15px,1.4vw,19px);font-weight:660;line-height:1.25;letter-spacing:-.005em;color:var(--note-tone);overflow-wrap:break-word}.punch-note-title:not([hidden])+.punch-note-lines{margin-top:4px}.punch-note-lines{display:grid;gap:5px}.punch-note-text{margin:0;color:var(--ink-2);font-size:clamp(13px,1.15vw,15px);line-height:1.5;overflow-wrap:anywhere}.notice{width:min(560px,100%);display:grid;gap:calc(var(--u) * 1.5);padding:clamp(30px,4vw,46px);background:var(--surface);border:1px solid var(--line);border-radius:var(--r-xl);box-shadow:var(--shadow-2);animation:resolve .5s var(--ease) both}.notice-icon{width:42px;height:42px;border-radius:12px;display:grid;place-items:center;background:var(--out-bg);color:var(--out);border:1px solid color-mix(in oklab,var(--out) 26%,transparent);margin-bottom:calc(var(--u) * .5)}.notice-title{margin:0;font-size:24px;font-weight:620;letter-spacing:-.018em}.notice-body{margin:0;color:var(--ink-2);line-height:1.6;font-size:15px}.notice-example{display:block;padding:13px 15px;border-radius:var(--r-md);background:var(--surface-sunk);border:1px solid var(--line);font-family:ui-monospace,Cascadia Mono,SF Mono,Consolas,monospace;font-size:13px;color:var(--accent);overflow-wrap:anywhere;line-height:1.5}.notice-hint{margin:0;font-size:13px;color:var(--ink-3);line-height:1.55}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@media(prefers-reduced-transparency:reduce){.topbar,.punch{background:var(--surface);backdrop-filter:none;-webkit-backdrop-filter:none}body:after{display:none}}@media(max-width:820px){.punch{grid-template-columns:1fr;justify-items:center;text-align:center}.punch-photo{width:min(220px,60vw)}.punch-mark{justify-content:center}.punch-facts{grid-template-columns:repeat(2,1fr);text-align:left}.brand-address{display:none}}@media(max-width:560px){.bar-clock{display:none}}
