
/* ============================================================
   醉舟 ZUI ZHOU — LE BATEAU IVRE · ISSUE 001
   黑白灰 / 杂志 / 线条 / 颗粒 / 留白
   ============================================================ */
:root{
  --ink:#0c0c0d;
  --ink-soft:#1a1a1c;
  --paper:#f0ede6;
  --paper-dim:#e4e0d6;
  --gray:#8a8a8e;
  --gray-dark:#3c3c40;
  --line-light:rgba(240,237,230,.22);
  --line-dark:rgba(12,12,13,.24);
  --seal:#c33d2e;            /* 印章红 · 全站唯一彩色，克制使用 */
  --serif-cn:"Noto Serif SC","Songti SC","SimSun",serif;
  --serif-en:"Cormorant Garamond","Times New Roman",serif;
  --sans-cn:"Noto Sans SC","PingFang SC","Microsoft YaHei",sans-serif;
  --mono:"Space Mono","Courier New",monospace;
  --hand:"Ma Shan Zheng","Kaiti SC","KaiTi",cursive;
  /* Shared phone typography, based on the printed drink archive sheet. */
  --phone-title-font:var(--serif-cn);
  --phone-body-font:var(--serif-cn);
  --phone-label-font:var(--mono);
  --phone-title-size:19px;
  --phone-body-size:12.5px;
  --phone-label-size:9px;
  --ease:cubic-bezier(.22,1,.36,1);
}
*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}
body{
  background:var(--ink);
  color:var(--paper);
  font-family:var(--sans-cn);
  font-weight:300;
  overflow-x:hidden;
  cursor:auto;
}
@media (hover:none),(pointer:coarse){ body{cursor:auto} .cursor,.cursor-ring{display:none!important} }
::selection{background:var(--paper);color:var(--ink)}
img{display:block;max-width:100%}
a{color:inherit;text-decoration:none;cursor:pointer}
@media (pointer:coarse){a{cursor:pointer}}

/* ---------- 颗粒 / 暗角 ---------- */
.grain{
  position:fixed;inset:-60px;z-index:9000;pointer-events:none;
  background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 240 240' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.55'/%3E%3C/svg%3E");
  opacity:.10;mix-blend-mode:overlay;
  animation:grainShift 1.2s steps(6) infinite;
}
@keyframes grainShift{
  0%{transform:translate(0,0)}20%{transform:translate(-24px,14px)}40%{transform:translate(16px,-20px)}
  60%{transform:translate(-10px,-26px)}80%{transform:translate(22px,18px)}100%{transform:translate(0,0)}
}
.vignette{position:fixed;inset:0;z-index:8990;pointer-events:none;
  background:radial-gradient(ellipse at center,transparent 58%,rgba(0,0,0,.42) 130%);}

/* ---------- 光标 ---------- */
.cursor{position:fixed;z-index:9500;width:8px;height:8px;border-radius:50%;
  background:var(--paper);mix-blend-mode:difference;pointer-events:none;
  transform:translate(-50%,-50%);transition:width .25s,height .25s}
.cursor-ring{position:fixed;z-index:9490;width:34px;height:34px;border-radius:50%;
  border:1px solid rgba(240,237,230,.55);pointer-events:none;
  transform:translate(-50%,-50%);transition:width .35s var(--ease),height .35s var(--ease),border-color .3s,opacity .3s}
.cursor-ring.hot{width:64px;height:64px;border-color:rgba(240,237,230,.9)}
.cursor-ring .ring-label{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  font-family:var(--mono);font-size:9px;letter-spacing:.14em;color:var(--paper);opacity:0;transition:opacity .25s;white-space:nowrap}
.cursor-ring.hot .ring-label{opacity:1}
.cursor,.cursor-ring{left:0;top:0;visibility:hidden;will-change:transform}
.cursor.visible,.cursor-ring.visible{visibility:visible}
.cursor,.cursor-ring{display:none!important}
@media(hover:hover) and (pointer:fine){
  body,body *{cursor:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2236%22%20height%3D%2236%22%20viewBox%3D%220%200%2036%2036%22%3E%3Ccircle%20cx%3D%2218%22%20cy%3D%2218%22%20r%3D%2216.5%22%20fill%3D%22none%22%20stroke%3D%22%230c0c0d%22%20stroke-opacity%3D%22.55%22%20stroke-width%3D%222%22%2F%3E%3Ccircle%20cx%3D%2218%22%20cy%3D%2218%22%20r%3D%2216.5%22%20fill%3D%22none%22%20stroke%3D%22%23f0ede6%22%20stroke-opacity%3D%22.75%22%20stroke-width%3D%221%22%2F%3E%3Ccircle%20cx%3D%2218%22%20cy%3D%2218%22%20r%3D%224%22%20fill%3D%22%23f0ede6%22%20stroke%3D%22%230c0c0d%22%20stroke-width%3D%22.75%22%2F%3E%3C%2Fsvg%3E") 18 18, auto!important}
  :is(a,button,[data-cursor],.stop,.cl-row,.arch-row,.drink):hover,
  :is(a,button,[data-cursor],.stop,.cl-row,.arch-row,.drink):hover *{cursor:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2266%22%20height%3D%2266%22%20viewBox%3D%220%200%2066%2066%22%3E%3Ccircle%20cx%3D%2233%22%20cy%3D%2233%22%20r%3D%2231.5%22%20fill%3D%22none%22%20stroke%3D%22%230c0c0d%22%20stroke-opacity%3D%22.55%22%20stroke-width%3D%222%22%2F%3E%3Ccircle%20cx%3D%2233%22%20cy%3D%2233%22%20r%3D%2231.5%22%20fill%3D%22none%22%20stroke%3D%22%23f0ede6%22%20stroke-opacity%3D%22.75%22%20stroke-width%3D%221%22%2F%3E%3Ccircle%20cx%3D%2233%22%20cy%3D%2233%22%20r%3D%224%22%20fill%3D%22%23f0ede6%22%20stroke%3D%22%230c0c0d%22%20stroke-width%3D%22.75%22%2F%3E%3C%2Fsvg%3E") 33 33, auto!important}
}

/* ---------- 载入 ---------- */
#loader{position:fixed;inset:0;z-index:9800;background:var(--ink);
  display:flex;align-items:center;justify-content:center;flex-direction:column;gap:26px;
  transition:transform 1s var(--ease),visibility 1s}
#loader.done{transform:translateY(-100%);visibility:hidden}
/* 标题「醉舟」= 品牌狂草字标（zuititle.png，素材抠墨，不可换字体） */
.loader-char{font-size:clamp(90px,16vw,170px);
  line-height:1;opacity:0;filter:blur(14px);
  animation:charIn 1.6s var(--ease) forwards .15s}
.loader-char img{display:block;height:1em;width:auto}
@keyframes charIn{to{opacity:1;filter:blur(0)}}
.loader-meta{display:flex;flex-direction:column;align-items:center;gap:10px}
.loader-count{font-family:var(--mono);font-size:12px;letter-spacing:.3em;color:var(--gray)}
.loader-bar{width:180px;height:1px;background:rgba(240,237,230,.15);overflow:hidden}
.loader-bar i{display:block;height:100%;width:0;background:var(--paper)}
.loader-tag{font-family:var(--mono);font-size:10px;letter-spacing:.34em;color:var(--gray);text-transform:uppercase}
.loader-tag span+span::before{content:' · '}
.mobile-shortcuts{display:none}

/* ---------- 导航 ---------- */
.nav{position:fixed;top:0;left:0;right:0;z-index:8000;
  display:flex;align-items:center;justify-content:space-between;
  padding:20px clamp(18px,4vw,52px);
  mix-blend-mode:difference;
  opacity:0;transition:opacity .8s ease .2s}
body.loaded .nav{opacity:1}
.nav-logo{display:flex;align-items:center}
.nav-logo .zh img{display:block;height:21px;width:auto}
/* 跳转栏：黑白线条按钮，mix-blend-difference 使白线在亮区自动反相为黑线 */
.nav-links{display:flex;gap:clamp(7px,.9vw,12px)}
.nav-links a{font-family:var(--serif-cn);font-size:12px;letter-spacing:.2em;
  color:#fff;border:1px solid #fff;border-radius:2px;
  padding:7px 10px 7px calc(10px + .2em);
  transition:background .35s var(--ease),color .35s var(--ease)}
.nav-links a:hover{background:#f0ede6;color:#0c0c0d}
.nav-links a:focus-visible{outline:1px solid #fff;outline-offset:3px}
@media(max-width:1280px){.nav-links{gap:6px}.nav-links a{font-size:11px;letter-spacing:.1em;padding:6px 8px 6px calc(8px + .1em)}}
@media(max-width:1080px){.nav-clock{display:none}}
@media(max-width:900px){.nav-links{gap:4px}.nav-links a{font-size:10px;letter-spacing:.06em;padding:5px 6px 5px calc(6px + .06em)}}
.nav-clock{font-family:var(--mono);font-size:10px;letter-spacing:.2em}
/* 底层格：滚动后浮现，让从标题底下穿过的内容先被虚化，不再硬重叠 */
.nav-scrim{position:fixed;top:0;left:0;right:0;height:96px;z-index:7990;pointer-events:none;
  -webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);
  -webkit-mask-image:linear-gradient(180deg,#000 46%,transparent 96%);
  mask-image:linear-gradient(180deg,#000 46%,transparent 96%);
  opacity:0;transition:opacity .6s ease}
body.loaded.scrolled .nav-scrim{opacity:1}
body.nav-themed .nav{background:var(--nav-bg,var(--ink));color:var(--nav-fg,var(--paper));mix-blend-mode:normal;transition:opacity .8s ease .2s,background-color .18s ease,color .18s ease}
body.nav-themed .nav-logo .zh img{filter:brightness(0) invert(1)}
body.nav-light .nav{--nav-bg:var(--paper);--nav-fg:var(--ink)}
body.nav-light .nav-logo .zh img{filter:brightness(0)}
body.nav-themed .nav-links a{position:relative;color:inherit;border-color:currentColor;transition:border-color .18s ease,color .18s ease}
body.nav-themed .nav-links a:hover{background:transparent;color:inherit}
body.nav-themed .nav-links a:focus-visible{outline-color:currentColor}
body.nav-themed .nav-links a::after{content:'';position:absolute;left:6px;right:6px;bottom:2px;height:1px;background:currentColor;opacity:0}
body.nav-themed .nav-links a[aria-current='location']::after,body.nav-themed .nav-links a:hover::after{opacity:1}
body.loaded.nav-themed .nav-scrim{height:var(--workspace-nav);opacity:0;transition:none;-webkit-mask-image:none;mask-image:none}
@media(prefers-reduced-motion:reduce){body.nav-themed .nav{transition:none}}
@media(max-width:760px){.nav-links,.nav-clock{display:none}}

/* ---------- 通用版式 ---------- */
.sec{position:relative}
.wrap{max-width:1280px;margin:0 auto;padding:0 clamp(20px,5vw,64px)}
.kicker{font-family:var(--mono);font-size:10px;letter-spacing:.4em;text-transform:uppercase}
.sec-no{font-family:var(--serif-en);font-style:italic;font-size:clamp(40px,6vw,84px);line-height:1;opacity:.16}
.rule{height:1px;background:currentColor;opacity:.25;transform-origin:left;transform:scaleX(0);transition:transform 1.2s var(--ease)}
.rule.in{transform:scaleX(1)}

/* 入场 */
[data-reveal]{opacity:0;transform:translateY(36px);transition:opacity 1s var(--ease),transform 1s var(--ease)}
[data-reveal].in{opacity:1;transform:none}
[data-reveal="mask"]{opacity:1;transform:none;clip-path:inset(0 0 100% 0);transition:clip-path 1.2s var(--ease)}
[data-reveal="mask"].in{clip-path:inset(0 0 0% 0)}
[data-reveal="line"]{opacity:1;transform:none}

/* ============================================================
   01 · HERO — 夜 / 停靠
   ============================================================ */
#hero{min-height:100vh;display:flex;flex-direction:column;justify-content:space-between;overflow:hidden}
.hero-bg{position:absolute;inset:0;z-index:0;background:var(--ink)}
/* 背景从静图换成无声调酒片：不再跑 heroDrift（视频自己在动），也不压灰度 ——
   grayscale(1) 会把暗部糊成雾，只微微收饱和、提一点对比。 */
.hero-bg video,.hero-bg .hero-poster{position:absolute;inset:0;display:block;width:100%;height:100%;object-fit:cover;object-position:50% 45%;
  filter:saturate(.85) contrast(1.05) brightness(.9)}
.hero-bg video{opacity:0;transition:opacity .3s ease}
.hero-bg video[data-frame-ready]{opacity:1}
@media(prefers-reduced-motion:reduce){.hero-bg video{opacity:0;transition:none}}
/* 微信等封锁自动播放的 webview 保底：视频获准播放前，海报以极缓慢的推近
   保持首屏是活的；视频首帧就绪后不透明盖住海报，动画同时暂停，交接无缝。
   海报与视频首帧同图，推近幅度小，0.3s 叠化里几乎不可察觉。 */
@keyframes heroPosterDrift{from{transform:scale(1) translate(0,0)}to{transform:scale(1.08) translate(-1.2%,-1.6%)}}
.hero-bg .hero-poster{animation:heroPosterDrift 26s ease-in-out infinite alternate;will-change:transform}
.hero-bg:has(video[data-frame-ready]) .hero-poster{animation-play-state:paused}
@media(prefers-reduced-motion:reduce){.hero-bg .hero-poster{animation:none}}
/* 融合：顶栏那一带压到 .45，中段只留 .12–.18（倒酒、摇壶、杯都看得见），
   底部压到 .72 把地址托住。不做整幅灰度、不做中间雾。 */
.hero-bg::after{content:"";position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(12,12,13,.45) 0%,rgba(12,12,13,.18) 24%,
    rgba(12,12,13,.12) 46%,rgba(12,12,13,.42) 74%,rgba(12,12,13,.72) 100%)}
/* 字标是第一视觉主体：竖排书法右起；左侧只剩一行英文地址，沉在字标下沿。
   原来的 kicker / .hero-meta / .hero-bottom（跑马灯 + 滚动提示）已随节点删除。 */
.hero-title{position:relative;z-index:2;display:flex;flex-direction:row-reverse;align-items:flex-end;justify-content:space-between;
  padding:0 clamp(20px,5vw,64px) clamp(40px,9vh,110px);gap:clamp(24px,4vw,64px);margin-top:auto}
.hero-zh{filter:drop-shadow(0 0 60px rgba(0,0,0,.55))}
/* 字标留着，但收小到不挡调酒：桌面 ≈280px 高，仍在右侧 */
.hero-zh img{display:block;height:min(28vh,280px);width:auto}
.hero-addr{padding-bottom:1.5vh;text-align:left;max-width:360px}
.hero-addr .en-rule{width:64px;height:1px;background:var(--seal);margin-bottom:18px}
/* 谷歌地图格式的英文地址：写死，不译、不加邮编、不做成可点导航。
   统一成一句 `28, Jiqing Street, Suzhou`，字距略松（.1em），一行排完不折行。 */
.hero-addr address{font-style:normal;font-family:var(--mono);font-size:12px;line-height:1.9;
  letter-spacing:.1em;color:rgba(240,237,230,.72);max-width:340px}
@media(max-width:760px){
  .hero-title{flex-direction:column;align-items:flex-start}
  /* 手机同一份文件裁切（不做竖版）：窗口取中间那一竖条，正好是手、杯、酒嘴；
     横过来看（视口比 16:9 更扁）时纵向也偏上，别落到空台面上。 */
  .hero-bg video,.hero-bg .hero-poster{object-position:50% 42%}
  .hero-zh img{height:min(18vh,140px)}
  .hero-addr{padding-bottom:0;max-width:100%}
}

/* 06 · 客户档案 — Fiches Clients（原暗礁印样页改造，视觉语言延续） */
#clients{background:var(--paper);color:var(--ink);padding:12px 0 clamp(90px,14vh,150px)}
.painlist{margin-top:32px;position:relative;padding-left:clamp(24px,3vw,42px)}
/* 印样齿孔：一列贯穿整个清单的胶片打孔 */
.painlist::before{content:"";position:absolute;left:5px;top:8px;bottom:8px;width:12px;opacity:.55;
  background-image:radial-gradient(circle at 6px 7px,rgba(12,12,13,.32) 0 2.4px,transparent 2.9px);
  background-size:12px 16px}
.painlist-title{display:flex;align-items:center;gap:18px;margin-bottom:26px}
.painlist-title h4{font-family:var(--serif-cn);font-weight:700;font-size:clamp(16px,1.8vw,20px);letter-spacing:.3em;white-space:nowrap}
.painlist-title .rule{flex:1}
@media(max-width:700px){
  .painlist-title{align-items:baseline;gap:14px}
  .painlist-title h4{flex:1;min-width:0;white-space:normal;line-height:1.5}
  .painlist-title .rule{display:none}
}
/* — 客户档案 · 列表行（原暗礁印样行，视觉语言延续：齿孔列 + 红蜡笔圈） — */
.cl-tools{display:flex;justify-content:space-between;align-items:flex-end;gap:18px;flex-wrap:wrap;margin:4px 0 4px}
.cl-search{display:flex;align-items:baseline;gap:12px;flex:1;min-width:230px;
  border-bottom:1px solid rgba(12,12,13,.55);padding-bottom:7px}
.cl-search .k{font-family:var(--mono);font-size:9px;letter-spacing:.3em;color:var(--gray-dark)}
.cl-search input{flex:1;min-width:0;border:0;background:none;padding:0;
  font-family:var(--serif-cn);font-size:14px;letter-spacing:.06em;color:var(--ink);outline:none}
.cl-search input::placeholder{color:#a09fa4;font-size:13px}
.cl-add{display:inline-flex;align-items:center;gap:9px;border:1.5px solid var(--seal);background:none;
  color:var(--seal);font-family:var(--serif-cn);font-size:12.5px;letter-spacing:.24em;
  padding:9px 18px 9px 20px;cursor:pointer;transition:background .3s,color .3s}
.cl-add i{font-family:var(--serif-en);font-style:normal;font-size:16px;line-height:1;transform:translateY(-.5px)}
.cl-add:hover{background:var(--seal);color:var(--paper)}
.cl-add:focus-visible{outline:2px solid var(--seal);outline-offset:3px}
/* 档案列表：双列名片网格，一屏六位（移动端回落单列） */
#clList{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:clamp(28px,4vw,56px)}
.cl-row{position:relative;display:grid;grid-template-columns:44px minmax(0,1fr);gap:6px 14px;align-items:start;
  width:100%;padding:14px 4px 12px;border:0;border-bottom:1px solid var(--line-dark);
  background:none;color:inherit;font:inherit;text-align:left;cursor:pointer;
  transition:background .3s,padding-left .35s var(--ease)}
.cl-row:hover{background:rgba(12,12,13,.045);padding-left:12px}
.cl-row:focus-visible{outline:2px solid var(--seal);outline-offset:-2px}
.cl-row .no{font-family:var(--serif-en);font-style:italic;font-size:13px;color:#8a8a8e;padding-top:3px}
.cl-name{display:block;font-family:var(--serif-cn);font-weight:900;font-size:clamp(16.5px,1.7vw,20px);
  letter-spacing:.1em;line-height:1.25}
.cl-en{display:block;font-family:var(--mono);font-size:8.5px;letter-spacing:.24em;color:#8a8a8e;margin-top:4px;text-transform:uppercase}
.cl-info{grid-column:1/-1;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:7px 20px;padding-top:2px}
.cl-info dt{font-family:var(--mono);font-size:8.5px;letter-spacing:.28em;color:#8a8a8e;margin-bottom:2px;
  transition:color .3s}
.cl-row:hover .cl-info dt{color:var(--seal)}
.cl-info dd{margin:0;font-family:var(--serif-cn);font-size:12px;letter-spacing:.05em;line-height:1.6;color:#333336}
.cl-info dd.void{color:#a09fa4;letter-spacing:.2em}
@media(max-width:760px){
  #clList{grid-template-columns:1fr}
  .cl-row{grid-template-columns:44px 1fr}
  .cl-tools{align-items:stretch}
}

/* ---------- 幕间 · 暗房带：在两段纸面之间坠一层黑 ---------- */
/* 05 · 幕间暗房 — 打字机（独立成页，现位于酒单与暗礁之间） */
.darkroom{width:100vw;margin-left:calc(50% - 50vw);margin-top:32px;
  background:var(--ink);color:var(--paper);position:relative}
.darkroom-typewriter{display:block;width:100%;height:700px;border:0;background:var(--ink);color-scheme:dark}
/* —— 留言板 · Le Courrier（回看纸卡横排于暗房下方 · v1 布局） —— */
.fb-wall{position:static;width:min(1080px,92vw);margin:20px auto 0;display:flex;flex-direction:column;gap:12px}
.fb-wall-kick{font-family:var(--mono);font-size:8px;letter-spacing:.26em;color:#6e675a}
.fb-wall-list{display:flex;flex-direction:row;gap:16px;overflow-x:auto;padding-bottom:6px}
.fb-card{flex:none;min-width:230px;max-width:260px;background:var(--paper);color:var(--ink);border-radius:3px;padding:14px 16px 11px;box-shadow:0 5px 14px rgba(0,0,0,.45);transform:rotate(var(--t,0deg));display:flex;flex-direction:column;gap:8px}
.fb-card .t{font-family:var(--hand);font-size:15px;line-height:1.5;color:var(--ink);word-break:break-word;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.fb-card .m{font-family:var(--mono);font-size:8px;letter-spacing:.12em;color:var(--gray);margin-top:auto;display:flex;justify-content:space-between;gap:8px}
.fb-empty{font-family:var(--hand);font-size:14px;color:#6e675a;padding:4px 0}
.fb-owner{position:relative;z-index:2;display:block;margin:16px auto 22px;appearance:none;border:0;background:none;color:var(--gray);font-family:var(--mono);font-size:9px;letter-spacing:.26em;cursor:pointer;padding:4px 12px;transition:color .25s}
.fb-owner:hover{color:var(--seal)}
#fbModal .sheet-wrap{width:min(760px,94vw);max-height:86dvh;height:auto}
#fbModal .sheet-card{background:var(--paper);color:var(--ink);font-family:var(--sans-cn);padding:clamp(22px,4vh,40px) clamp(24px,4vw,48px);display:flex;flex-direction:column;transform:none}
#fbModal .sheet-x{width:32px;height:32px;top:-12px;right:-12px;font:20px var(--sans-cn)}
.fbd-head h4 em{font-family:var(--mono);font-style:normal;font-size:11px;letter-spacing:.2em;color:var(--gray);margin-left:12px}
.fb-row{display:grid;grid-template-columns:auto 1fr auto auto;gap:14px;align-items:center;padding:13px 2px;border-bottom:1px dashed rgba(12,12,13,.18)}
.fb-row .no{font-family:var(--mono);font-size:10px;letter-spacing:.1em;color:var(--gray)}
.fb-row .t{font-family:var(--hand);font-size:18px;line-height:1.5;color:var(--ink);word-break:break-word}
.fb-row .d{font-family:var(--mono);font-size:9px;color:var(--gray);white-space:nowrap}
.fb-row .d .st{font-style:normal;letter-spacing:.14em;margin-right:5px}
.fb-row .d .st.pending{color:var(--seal)}
.fb-row .d .st.live{color:var(--gray)}
.fbd-perm{font-family:var(--mono);font-size:9px;letter-spacing:.14em;color:var(--gray);margin:6px 0 0}
.fb-none{font-family:var(--hand);font-size:17px;color:var(--gray);text-align:center;padding:26px 0}
.dk-holes{height:16px;opacity:.65;background-repeat:repeat-x;background-position:center;
  background-image:radial-gradient(circle at 8px 8px,rgba(240,237,230,.34) 0 2.6px,transparent 3.1px);
  background-size:22px 16px}
.dk-body{position:relative;padding:24px clamp(24px,6vw,80px);
  display:flex;flex-direction:column;align-items:center;gap:20px;text-align:center}
.dk-body::before,.dk-body::after{content:"";position:absolute;top:50%;width:15px;height:15px;
  transform:translateY(-50%);opacity:.5;
  background:
    linear-gradient(rgba(240,237,230,.6),rgba(240,237,230,.6)) center/100% 1px no-repeat,
    linear-gradient(rgba(240,237,230,.6),rgba(240,237,230,.6)) center/1px 100% no-repeat,
    radial-gradient(circle at center,transparent 0 4.5px,rgba(240,237,230,.6) 4.5px 5.5px,transparent 6px)}
.dk-body::before{left:clamp(14px,2.4vw,32px)}
.dk-body::after{right:clamp(14px,2.4vw,32px)}
.dk-kicker,.dk-meta{font-family:var(--mono);font-size:9px;letter-spacing:.34em;color:var(--gray);text-transform:uppercase}
.dk-quote{font-family:var(--serif-en);font-style:italic;font-weight:500;
  font-size:clamp(24px,3.6vw,46px);line-height:1.3;max-width:20em}

/* ---------- 客户档案 · 名片行：帧号边缘齿孔 + 红蜡笔圈划（印样语言延续） ---------- */
.sheet-tag{font-family:var(--mono);font-size:9px;letter-spacing:.26em;color:#8a8a8e;white-space:nowrap}
.cl-row{position:relative}
.cl-row .mark{position:absolute;left:52px;top:50%;width:172px;height:56px;
  transform:translateY(-50%) rotate(-2deg);pointer-events:none;opacity:0;transition:opacity .25s ease}
.cl-row:hover .mark{opacity:.92}
/* 触屏点按反馈：与 hover 同款圈划，由 JS 在点按时加 .marked */
.cl-row.marked .mark{opacity:.92}
.cl-row.marked .mark path{stroke-dashoffset:0}
.cl-row .mark path{fill:none;stroke:var(--seal);stroke-width:2.3;stroke-linecap:round;
  stroke-dasharray:100;stroke-dashoffset:100;transition:stroke-dashoffset .7s var(--ease) .04s}
.cl-row:hover .mark path{stroke-dashoffset:0}
.sheet-foot{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;
  font-family:var(--mono);font-size:9px;letter-spacing:.24em;color:#8a8a8e;padding-top:16px}
@media(max-width:700px),(hover:none){
  /* 红蜡笔圈在触屏端改为点按反馈（.marked），不再隐藏 */
  .sheet-tag{display:none}
  .painlist::before{left:2px;width:10px}
}
/* 客户档案 · 检索空态 */
.cl-empty{padding:44px 0 30px;text-align:center;font-family:var(--mono);font-size:10px;
  letter-spacing:.34em;color:#a09fa4}
/* 客户档案 · 整页黑底白字（仅作用于 #clients，不影响卷首同款印样版式） */
#clients{background:var(--ink);color:var(--paper);position:relative;overflow:hidden}
#clients::after{content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(120% 90% at 50% 0%,transparent 58%,rgba(0,0,0,.42))}
#clients .wrap{position:relative;z-index:1}
#clients .painlist::before{background-image:radial-gradient(circle at 6px 7px,rgba(240,237,230,.3) 0 2.4px,transparent 2.9px)}
#clients .cl-search{border-bottom-color:rgba(240,237,230,.45)}
#clients .cl-search .k{color:var(--gray)}
#clients .cl-search input{color:var(--paper)}
#clients .cl-search input::placeholder{color:rgba(240,237,230,.35)}
#clients .cl-add{color:var(--seal)}
#clients .cl-add:hover{color:var(--paper)}
#clients .cl-row{border-bottom-color:rgba(240,237,230,.16)}
#clients .cl-row:hover{background:rgba(240,237,230,.05)}
#clients .cl-name,#clients .painlist-title h4{color:var(--paper)}
#clients .cl-info dd{color:rgba(240,237,230,.82)}
#clients .cl-info dd.void{color:rgba(240,237,230,.38)}
#clients .cl-en,#clients .cl-row .no,#clients .cl-info dt,#clients .sheet-tag,#clients .sheet-foot{color:var(--gray)}
#clients .cl-empty{color:rgba(240,237,230,.45)}
/* 折叠其余档案：醒目开关行（白） */
.cl-foldbtn{appearance:none;width:100%;display:flex;align-items:center;justify-content:center;gap:12px;background:none;
  border:1.5px solid rgba(240,237,230,.65);color:var(--paper);
  font-family:var(--serif-cn);font-size:15px;letter-spacing:.3em;padding:18px 0;margin:22px 0 8px;cursor:pointer;
  transition:background .3s,color .3s;text-align:center}
.cl-foldbtn b{font-family:var(--serif-en);font-weight:400;font-size:19px;line-height:1;transform:translateY(1px)}
.cl-foldbtn span.r{font-family:var(--mono);font-size:9px;letter-spacing:.26em;opacity:.65}
.cl-foldbtn:hover{background:var(--paper);color:var(--ink)}
.cl-foldbtn:focus-visible{outline:2px solid var(--paper);outline-offset:3px}
/* ============================================================
   06 · 预约 — TIME & TIDE 船期海报（本轮纯视觉，无功能）
   ============================================================ */
#booking{background:var(--ink);padding:clamp(90px,14vh,150px) 0;position:relative;overflow:hidden}
#booking::after{content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(120% 90% at 50% 0%,transparent 55%,rgba(0,0,0,.5))}
/* 原来海报上方还有一句居中的「06 · LES RÉSERVATIONS」（.bk-kick），已随节点删除：
   海报现在就是块内第一块。 */
.bk-poster{position:relative;width:min(1080px,92vw);margin:0 auto;background:var(--paper);color:var(--ink);
  padding:clamp(24px,4vw,50px) clamp(16px,4vw,54px) clamp(14px,2.5vw,30px);
  transform:rotate(-.5deg);box-shadow:0 50px 120px rgba(0,0,0,.65)}
.bk-poster::before,.bk-poster::after{content:"";position:absolute;width:96px;height:26px;top:-12px;
  background:rgba(226,220,203,.32);border:1px solid rgba(240,237,230,.14);backdrop-filter:blur(2px)}
.bk-poster::before{left:7%;transform:rotate(-4deg)}
.bk-poster::after{right:7%;transform:rotate(3deg)}
.bk-mast{display:flex;justify-content:space-between;align-items:flex-end;gap:18px;flex-wrap:wrap;
  border-bottom:2px solid var(--ink);padding-bottom:clamp(10px,1.6vw,18px)}
/* 抬头与点单台同档：中文宋体 900 + 斜体英文。原来海报级的 clamp(40px,7.2vw,94px) 单句
   「Time & Tide」会把月历挤下去；下方那句「Les Réservations — wait for the water…」已删。 */
.bk-mast h3{font-family:var(--serif-cn);font-weight:900;font-size:clamp(24px,3.4vw,42px);line-height:1;
  letter-spacing:.1em;color:var(--ink)}
.bk-mast h3 em{font-family:var(--serif-en);font-style:italic;font-weight:500;font-size:.52em;letter-spacing:.04em;
  color:var(--gray-dark);margin-left:14px}
.bk-month{text-align:right;font-family:var(--serif-en);font-style:italic;font-size:clamp(24px,3.2vw,42px);line-height:1}
.bk-month .cn{display:block;font-family:var(--mono);font-style:normal;font-size:9px;letter-spacing:.34em;color:var(--gray-dark);margin-top:8px}
.bk-week{display:grid;grid-template-columns:repeat(7,1fr);padding:clamp(8px,1.4vh,13px) 0 clamp(6px,1.1vh,10px);border-bottom:1px solid rgba(12,12,13,.55)}
.bk-week span{font-family:var(--mono);font-size:clamp(7.5px,1vw,9px);letter-spacing:.3em;color:var(--gray-dark)}
.bk-cal{display:grid;grid-template-columns:repeat(7,minmax(0,1fr))}
.bk-cell{position:relative;min-height:clamp(88px,11.5vh,150px);padding:clamp(5px,.9vh,9px) clamp(6px,.9vw,11px);
  border-right:1px solid rgba(12,12,13,.22);border-bottom:1px solid rgba(12,12,13,.22)}
.bk-cell:nth-child(7n){border-right:none}
.bk-cell .d{font-family:var(--serif-en);font-style:italic;font-size:clamp(13px,1.9vh,17px);color:var(--ink);display:inline-block}
.bk-cell .m{position:absolute;top:clamp(5px,.9vh,9px);right:clamp(6px,.9vw,11px);font-size:10px;color:rgba(12,12,13,.38)}
.bk-cell.void{background:repeating-linear-gradient(45deg,transparent 0 8px,rgba(12,12,13,.045) 8px 9px)}
.bk-vlab{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;gap:12px}
.bk-vlab b{writing-mode:vertical-rl;font-family:var(--serif-cn);font-weight:900;font-size:clamp(13px,2vh,18px);letter-spacing:.32em;color:var(--ink)}
.bk-vlab i{writing-mode:vertical-rl;font-family:var(--mono);font-style:normal;font-size:8px;letter-spacing:.3em;color:var(--gray-dark)}
.bk-cell.past .d{color:rgba(12,12,13,.32);text-decoration:line-through;text-decoration-color:rgba(12,12,13,.35);text-decoration-thickness:1px}
.bk-cell.past .m{opacity:.45}
.bk-note{font-family:var(--hand);font-size:clamp(12px,1.7vh,16px);line-height:1.25;margin-top:clamp(3px,.8vh,7px);color:var(--ink)}
.bk-note.red{color:var(--seal)}
.bk-cell.today::before{content:"";position:absolute;top:0;left:0;width:46px;height:34px;
  border:2px solid var(--seal);border-radius:50%;transform:rotate(-6deg);opacity:.85}
.bk-cell.today .d{font-weight:700}
.bk-cell.full{background:repeating-linear-gradient(-45deg,transparent 0 8px,rgba(195,61,46,.09) 8px 10px)}
.bk-cell.full::after{content:attr(data-mark);position:absolute;right:clamp(6px,.9vw,11px);bottom:clamp(4px,.8vh,8px);
  width:clamp(24px,3.4vh,32px);height:clamp(24px,3.4vh,32px);border:2px solid var(--seal);border-radius:50%;
  display:flex;align-items:center;justify-content:center;font-family:var(--serif-cn);font-weight:900;
  font-size:clamp(10px,1.5vh,13px);color:var(--seal);transform:rotate(12deg);opacity:.85}
.bk-foot{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;
  font-family:var(--mono);font-size:8.5px;letter-spacing:.26em;color:var(--gray-dark);
  padding-top:clamp(8px,1.4vh,12px)}
/* —— 预约功能 · 工具条 —— */
.bk-bar{display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap;padding:clamp(10px,1.8vh,16px) 0 clamp(6px,1.2vh,10px)}
.bk-title-sm{font-family:var(--mono);font-size:10px;letter-spacing:.3em;color:var(--gray-dark)}
.bk-bar-btns{display:flex;gap:8px;flex-wrap:wrap}
.bk-nav{appearance:none;border:1px solid rgba(12,12,13,.4);background:transparent;color:var(--ink);
  font-family:var(--mono);font-size:11px;letter-spacing:.16em;padding:5px 13px;border-radius:999px;cursor:pointer;
  transition:background .25s var(--ease),color .25s var(--ease)}
.bk-nav:hover{background:rgba(12,12,13,.08)}
.bk-nav:focus-visible{outline:2px solid var(--ink);outline-offset:2px}
.bk-add{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.bk-add:hover{background:#2c2c2f}
/* —— 月历格 · 预约缩略条 —— */
.bk-evs{display:flex;flex-direction:column;gap:2px;margin-top:3px;min-width:0}
.bk-ev{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-family:var(--sans-cn);font-size:clamp(9.5px,1.4vh,11.5px);line-height:1.6;padding:0 4px;font-weight:600;letter-spacing:.02em;
  background:var(--cb,rgba(12,12,13,.08));border-left:3px solid var(--c,var(--ink));color:var(--ink)}
.bk-ev i{font-style:normal;font-weight:600;letter-spacing:0;margin-right:4px}
.bk-more{position:absolute;right:clamp(6px,.9vw,11px);bottom:3px;z-index:2;
  font-family:var(--sans-cn);font-size:9px;font-weight:600;letter-spacing:.06em;color:var(--gray-dark);
  background:var(--paper);padding:1px 6px;border-radius:999px;box-shadow:0 0 0 2px var(--paper)}
/* 折叠态：第二条日程向底部渐隐，避免被格线硬切 */
.bk-evs.has-more,.cal-md-evs.has-more{-webkit-mask-image:linear-gradient(180deg,#000 55%,rgba(0,0,0,0) 96%);mask-image:linear-gradient(180deg,#000 55%,rgba(0,0,0,0) 96%)}
/* —— 当日详情 · 时间轴 —— */
.bk-day{margin-top:6px}
.bk-sec .lbl,.bk-tl-lbl{font-family:var(--mono);font-size:9px;letter-spacing:.28em;color:var(--gray-dark);margin:10px 0 8px}
.bk-row{display:grid;grid-template-columns:56px 1fr auto;gap:14px;align-items:center;cursor:pointer;
  border-left:3px solid var(--c,var(--ink));background:var(--cb,rgba(12,12,13,.05));padding:15px 16px;margin-bottom:10px}
.bk-row .t{font-family:var(--mono);font-size:13px;letter-spacing:.06em;color:var(--ink)}
.bk-row .bd{min-width:0}
.bk-row .bd b{display:block;font-family:var(--serif-cn);font-weight:700;font-size:17px;letter-spacing:.06em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bk-row .bd em{display:block;font-style:normal;font-family:var(--sans-cn);font-size:12.5px;color:var(--gray-dark);margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bk-row-x{appearance:none;border:none;background:transparent;color:var(--gray-dark);font-size:17px;line-height:1;cursor:pointer;padding:4px 6px}
.bk-row-x:hover{color:var(--seal)}
.bk-row-x:focus-visible{outline:2px solid var(--ink);outline-offset:2px}
.bk-day-empty{font-family:var(--mono);font-size:10px;letter-spacing:.26em;color:var(--gray-dark);
  padding:20px 0;text-align:center;border:1px dashed rgba(12,12,13,.3)}
.bk-actions{margin:12px 0 4px}
/* —— 新增表单 —— */
.bk-form{border:1px dashed rgba(12,12,13,.35);padding:12px 14px;margin:8px 0 4px;
  display:grid;grid-template-columns:64px 1fr;gap:9px 12px;align-items:center}
/* 表单默认折叠：hidden 属性优先级高于上面的 display:grid，点击「＋ 酒客预约 / ＋ 私人日程」才展开 */
.bk-form[hidden]{display:none}
.bk-frow{display:contents}
.bk-form label{font-family:var(--mono);font-size:9px;letter-spacing:.26em;color:var(--gray-dark)}
.bk-form input,.bk-form select{border:1px solid rgba(12,12,13,.35);background:transparent;
  padding:6px 9px;font-family:var(--sans-cn);font-size:13px;color:var(--ink);min-width:0}
.bk-form input:focus,.bk-form select:focus{outline:2px solid rgba(12,12,13,.5);outline-offset:1px}
/* 双表单模式切换：mode-b = 酒客预约 / mode-p = 私人日程 */
.bk-fmode{grid-column:1/-1;font-family:var(--mono);font-size:9px;letter-spacing:.26em;color:var(--seal)}
.bk-form.mode-p .bk-fmode{color:var(--gray-dark)}
.bk-form .only-b,.bk-form .only-p{display:none}
.bk-form.mode-b .only-b{display:contents}
.bk-form.mode-p .only-p{display:contents}
.bk-save{appearance:none;border:1px solid var(--ink);background:var(--ink);color:var(--paper);
  font-family:var(--mono);font-size:11px;letter-spacing:.16em;padding:7px 16px;border-radius:999px;cursor:pointer;justify-self:start}
.bk-save:hover{background:#2c2c2f}
/* —— 色盘 —— */
.bk-swatches{display:flex;gap:7px;flex-wrap:wrap;align-items:center}
.sw{width:19px;height:19px;border-radius:50%;border:1px solid rgba(12,12,13,.35);cursor:pointer;padding:0;flex:none}
.sw.on{outline:2px solid var(--ink);outline-offset:2px}
.sw:focus-visible{outline:2px solid var(--ink);outline-offset:2px}
.sw-custom{width:34px;height:23px;border:1px dashed rgba(12,12,13,.45);background:transparent;padding:1px;cursor:pointer}
@media(max-width:680px){
  .bk-cell{min-height:46px;padding:4px 5px}
  .bk-cell .m{display:none}
  .bk-vlab i{display:none}
  .bk-row{grid-template-columns:44px 1fr auto;padding:8px 9px}
}
.bk-stamp{position:absolute;right:clamp(14px,3vw,40px);bottom:clamp(48px,8vh,84px);z-index:3;
  width:92px;height:92px;border:2px solid var(--seal);border-radius:50%;display:flex;align-items:center;justify-content:center;
  color:var(--seal);font-family:var(--serif-cn);font-weight:900;font-size:14px;letter-spacing:.18em;text-align:center;line-height:1.6;
  transform:rotate(-11deg);opacity:.8;mix-blend-mode:multiply;pointer-events:none}
@media(max-width:680px){
  .bk-cell{min-height:46px;padding:4px 5px}
  .bk-cell .m{display:none}
  .bk-note{font-size:11px}
  .bk-vlab i{display:none}
  .bk-stamp{width:70px;height:70px;font-size:11px}
}

/* 客户档案 · 名片浮窗（复用酒单规格书 .sheet-* 体系） */
.cl-notes{margin-top:16px;border:1px solid rgba(12,12,13,.35);background:rgba(240,237,230,.5);
  padding:10px 14px}
.cl-notes .lbl{font-family:var(--mono);font-size:8.5px;letter-spacing:.28em;color:var(--gray-dark);margin-bottom:6px}
.cl-notes .area{min-height:52px;outline:none;font-family:var(--hand);
  font-size:16px;line-height:1.8;letter-spacing:.06em;color:var(--ink)}
.cl-notes .area:focus{box-shadow:0 2px 0 var(--seal)}
.cl-notes .area:empty::before{content:"在这儿记点什么——口味、忌口、那天聊到的事…";color:#a09fa4;
  font-family:var(--serif-cn);font-size:12px;letter-spacing:.1em}
/* —— 客户档案 · 消费记录（取代原来的批注编辑区；外壳沿用 .cl-notes 的纸底与描边） —— */
.cl-history .lbl{margin-bottom:8px}
.cl-hstate{font-family:var(--mono);font-size:9px;letter-spacing:.14em;color:var(--seal);line-height:1.9;word-break:break-word}
.cl-hstate:empty{display:none}
.cl-hstate button{appearance:none;border:0;background:none;color:var(--seal);font:inherit;
  text-decoration:underline;cursor:pointer;padding:0 4px}
.cl-hlist{margin-top:4px;max-height:min(214px,26vh);overflow:auto;scrollbar-width:thin;
  scrollbar-color:rgba(12,12,13,.3) transparent}
.cl-hrow{padding:8px 0;border-bottom:1px dashed rgba(12,12,13,.16)}
.cl-hrow:last-child{border-bottom:0}
.cl-htop{display:flex;justify-content:space-between;align-items:baseline;gap:10px}
.cl-htop time{font-family:var(--mono);font-size:10px;letter-spacing:.1em;color:var(--ink)}
.cl-htop b{font-family:var(--mono);font-size:11px;font-weight:400;color:var(--ink);white-space:nowrap}
.cl-hsub{display:flex;gap:10px;margin-top:3px;font-family:var(--mono);font-size:9px;letter-spacing:.12em;color:var(--gray-dark)}
.cl-hitems{margin-top:3px;font-family:var(--serif-cn);font-size:12px;line-height:1.7;letter-spacing:.04em;color:#4a4a4c;word-break:break-word}
.cl-hnone{padding:10px 0;font-family:var(--serif-cn);font-size:12px;line-height:1.8;letter-spacing:.08em;color:#a09fa4}
/* —— 累计消费：钉在标题与状态行之间、滚动列表外面，开档就能看见终身合计 ——
   左边对位 .cl-notes .lbl，右边金额对位 .cl-htop b、次数杯数对位 .cl-hsub，
   下沿借 .cl-hrow 的虚线。不开第二层卡片、不用 --seal、不是按钮。 */
.cl-cumul{display:flex;justify-content:space-between;align-items:baseline;gap:12px;flex-wrap:wrap;
  padding-bottom:8px;border-bottom:1px dashed rgba(12,12,13,.16);margin-bottom:4px}
.cl-cumul:empty{display:none}
.cl-cumlbl{font-family:var(--mono);font-size:8.5px;letter-spacing:.28em;color:var(--gray-dark)}
.cl-cumval{display:flex;align-items:baseline;gap:8px;margin-left:auto;white-space:nowrap;
  font-family:var(--mono);font-size:9px;letter-spacing:.12em;color:var(--gray-dark)}
.cl-cumval b{font-family:var(--mono);font-size:11px;font-weight:400;color:var(--ink)}
.cl-cumval .dot{color:rgba(12,12,13,.28)}
.cl-saverow{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-top:12px;flex-wrap:wrap}
.cl-saverow .hint{font-family:var(--mono);font-size:8.5px;letter-spacing:.26em;color:#a09fa4}
/* 客户名片 · 四字段可编辑（仅作用于 #clModal，不影响酒单规格书） */
#clModal .sheet-spec td{padding:12px 14px}
#clModal .sheet-spec td:last-child{font-size:14px}
/* 客户名片外框对齐酒款档案（copy-fix2 第 5 条）：
   关闭钮原来挂在 .sheet-card 里，卡片 `overflow:auto` 会把 top/right:-15px 探出去的那半颗裁掉，
   宽屏看着像「叉被切」。现在按钮移到 .sheet-wrap 这层（和 .sheet-modal 一样），
   下面只补尺寸护栏：卡片不许宽过视口、表与控件都按内容盒收，免得撑出横向滚动条。 */
#clModal .sheet-wrap{width:min(760px,calc(100vw - 44px));max-width:100%}
#clModal .sheet-card{max-width:100%;overflow-x:hidden}
#clModal .sheet-spec{table-layout:fixed;max-width:100%}
#clModal .sheet-spec td:first-child{width:38%}
#clModal .sheet-spec td{overflow-wrap:anywhere}
#clModal .cl-tags,#clModal .cl-tagpanel,#clModal .cl-hlist,#clModal .cl-saverow{max-width:100%;box-sizing:border-box}
#clModal .spec-in{max-width:100%;box-sizing:border-box;min-width:0}
.spec-in{width:100%;border:0;background:none;padding:0;font-family:var(--serif-cn);
  font-size:14px;letter-spacing:.05em;color:var(--ink);outline:none}
.spec-in:focus{box-shadow:0 1.5px 0 var(--seal)}
select.spec-in{cursor:pointer}
select.spec-in option{font-family:var(--serif-cn)}
input.spec-in[type=datetime-local]{font-family:var(--mono);font-size:12.5px;letter-spacing:.04em}
input.spec-in::placeholder{color:#a09fa4;letter-spacing:.1em}
/* 偏好标签：下拉面板 + 选中章片 */
.cl-tags{position:relative}
.cl-tagview{display:flex;flex-wrap:wrap;gap:6px;align-items:center;min-height:26px;cursor:pointer}
.cl-tagview .ph{color:#a09fa4;letter-spacing:.2em;font-size:12.5px}
.cl-tagview .caret{margin-left:auto;font-family:var(--mono);font-size:10px;color:var(--gray-dark)}
.cl-tagpanel{display:none;position:absolute;left:-6px;top:calc(100% + 8px);z-index:9;
  width:max-content;max-width:min(360px,72vw);background:var(--paper);border:1.5px solid var(--ink);
  box-shadow:0 14px 34px rgba(0,0,0,.18);padding:12px 14px}
.cl-tags.open .cl-tagpanel{display:block}
/* 累计消费钉在偏好字段下方，所以这块不能再用桌面那版下拉定位：absolute 一展开就压在
   「消费记录」标题和累计行上面（窄屏早就是 static）。桌面/平板跟着走同一条，
   展开时把下方内容整体推下去，卡片自己滚，谁也不被盖住。 */
#clModal .cl-tagpanel{position:static;left:auto;top:auto;width:100%;max-width:100%;box-sizing:border-box;
  max-height:min(46vh,320px);overflow-y:auto;margin-top:8px;box-shadow:none}
.cl-tagpanel .grp{font-family:var(--mono);font-size:8.5px;letter-spacing:.28em;color:var(--gray-dark);margin:9px 0 6px}
.cl-tagpanel .grp:first-child{margin-top:0}
.cl-tagpanel .opts{display:flex;flex-wrap:wrap;gap:6px}
.chipwrap{position:relative;display:inline-flex}
.chip-x{position:absolute;top:-7px;right:-7px;width:16px;height:16px;border-radius:50%;padding:0;
  border:1px solid var(--paper);background:var(--ink);color:var(--paper);
  font-family:var(--serif-en);font-size:10px;line-height:1;display:flex;align-items:center;justify-content:center;
  cursor:pointer;opacity:0;transform:scale(.6);transition:all .2s}
.chipwrap:hover .chip-x{opacity:1;transform:scale(1)}
.chip-x:hover{background:var(--seal);border-color:var(--seal)}
.chip-x:focus-visible{opacity:1;transform:scale(1);outline:2px solid var(--seal);outline-offset:2px}
@media(hover:none){.chip-x{opacity:1;transform:scale(1)}}
.newtag{display:flex;gap:6px;margin-top:12px;border-top:1px solid var(--line-dark);padding-top:10px}
.newtag select{border:1px solid rgba(12,12,13,.45);background:none;font-family:var(--mono);
  font-size:10px;padding:5px 4px;color:var(--ink);cursor:pointer}
.newtag input{flex:1;min-width:0;border:1px solid rgba(12,12,13,.45);background:none;
  font-family:var(--serif-cn);font-size:12px;letter-spacing:.06em;padding:5px 8px;color:var(--ink);outline:none}
.newtag input:focus{border-color:var(--seal)}
.newtag input::placeholder{color:#a09fa4;letter-spacing:.1em}
.newtag button{border:1.5px solid var(--seal);background:none;color:var(--seal);width:32px;
  font-family:var(--serif-en);font-size:14px;line-height:1;cursor:pointer;transition:background .2s,color .2s}
.newtag button:hover{background:var(--seal);color:var(--paper)}
.newtag button:focus-visible{outline:2px solid var(--seal);outline-offset:2px}
.tagchip{border:1px solid rgba(12,12,13,.45);background:none;color:var(--ink);font-family:var(--serif-cn);
  font-size:11.5px;letter-spacing:.08em;padding:4px 10px;cursor:pointer;transition:all .2s}
.tagchip:hover{border-color:var(--seal);color:var(--seal)}
.tagchip.on{border-color:var(--seal);background:var(--seal);color:var(--paper)}
.tagchip.on:hover{color:var(--paper)}
.tagchip:focus-visible{outline:2px solid var(--seal);outline-offset:2px}
/* 删除客户档案：一次预警、二次确认 */
.cl-del{border:1.5px solid var(--seal);background:var(--seal);color:var(--paper);
  font-family:var(--mono);font-size:10px;letter-spacing:.3em;padding:8px 18px;cursor:pointer;
  transition:filter .25s,background .25s,color .25s}
.cl-del:hover{filter:brightness(1.08)}
.cl-del:focus-visible{outline:2px solid var(--seal);outline-offset:3px}
.cl-del.arm{background:none;color:var(--seal);animation:clArm .9s var(--ease) infinite alternate}
@keyframes clArm{from{box-shadow:0 0 0 0 rgba(195,61,46,.35)}to{box-shadow:0 0 0 6px rgba(195,61,46,0)}}
/* 客户档案接入统一数据层后新增的三条：既有规则逐条未改。
   提示位仍是原来的 .cl-saverow .hint，只是多一个文本操作按钮（重试 / 重新确认）；
   读取失败时的「重新读取」放在原来的空档案行里，字号与字距沿用该行自身；
   有未确认写入或档案尚未读全时不允许二次确认删除。 */
.cl-saverow .hint button,.cl-empty button{appearance:none;border:0;background:none;color:var(--seal);
  font-family:var(--mono);font-size:8.5px;letter-spacing:.26em;padding:0;margin-left:12px;
  text-decoration:underline;cursor:pointer}
.cl-saverow .hint button:focus-visible,.cl-empty button:focus-visible{outline:2px solid var(--seal);outline-offset:3px}
#clDel:disabled{opacity:.55;cursor:default;animation:none}

/* ============================================================
   03 · 胶片 — 横向卷轴
   ============================================================ */
#gallery{background:var(--ink)}
.gal-sticky{position:sticky;top:0;height:100vh;overflow:hidden;display:flex;flex-direction:column;justify-content:center}
/* 抬头抄点单台的 .od-head：中文宋体 900 + 斜体英文，底下一根细线；右侧只留管理入口。
   原来的 kicker（ISSUE 001 · FILM）、右侧口号 .s、页脚 .gal-foot 已随节点删除。 */
.gal-head{display:flex;justify-content:space-between;align-items:flex-end;gap:18px;flex-wrap:wrap;
  padding:96px clamp(20px,5vw,64px) 12px;color:var(--paper);
  border-bottom:1px solid rgba(240,237,230,.25)}
.gal-t{margin:0;font-family:var(--serif-cn);font-weight:900;font-size:clamp(24px,3.4vw,42px);
  letter-spacing:.1em;line-height:1;color:var(--paper)}
.gal-t em{font-family:var(--serif-en);font-style:italic;font-weight:500;font-size:.52em;letter-spacing:.04em;
  color:rgba(240,237,230,.6);margin-left:14px}
.gal-track{display:flex;align-items:center;gap:clamp(28px,4vw,64px);padding:34px clamp(20px,5vw,64px) 0;will-change:transform}
.frame{position:relative;flex:0 0 auto}
.frame img{height:min(56vh,520px);width:auto;filter:grayscale(1) contrast(1.08) brightness(.92);
  transition:filter .7s ease,transform .7s var(--ease)}
.frame:hover img{filter:grayscale(0) sepia(.28) saturate(.9) contrast(1.02) brightness(1);transform:scale(1.015)}
.frame .tag{position:absolute;top:-22px;left:0;font-family:var(--mono);font-size:9px;letter-spacing:.3em;color:var(--gray)}
.frame .cap{position:absolute;bottom:-30px;left:0;right:0;display:flex;justify-content:space-between;
  font-family:var(--mono);font-size:9px;letter-spacing:.2em;color:rgba(240,237,230,.6)}
.frame-vert img{height:min(62vh,580px)}
@media(max-width:700px),(max-height:640px){
  .gal-head{padding-top:80px;align-items:flex-end}
  .gal-t{font-size:19px;letter-spacing:.26em}
  .frame img{height:min(44vh,400px)}
  .frame-vert img{height:min(52vh,450px)}
}
/* 页脚没了：1px 细线自己贴块底（命中区仍是 28px 高的透明层，见下方覆盖）。 */
.gal-prog{position:absolute;bottom:0;left:clamp(20px,5vw,64px);right:clamp(20px,5vw,64px);height:1px;background:rgba(240,237,230,.14)}
.gal-prog i{display:block;height:100%;background:var(--paper);width:0}

/* ============================================================
   08 · 场景手记 — 航线图
   ============================================================ */
/* ============================================================
   08 · 随手记 · LES BROUILLONS — 半屏纸面便签墙
   ============================================================ */
#notes{background:var(--paper);color:var(--ink);padding:clamp(26px,4.5vh,50px) 0;position:relative;overflow:hidden}
#notes .bgmap{position:absolute;right:-6%;top:8%;width:min(46vw,560px);opacity:.1;filter:grayscale(1) contrast(1.2);pointer-events:none;transform:rotate(3deg);
  -webkit-mask-image:radial-gradient(ellipse 62% 62% at 50% 50%,#000 45%,transparent 78%);
  mask-image:radial-gradient(ellipse 62% 62% at 50% 50%,#000 45%,transparent 78%)}
#notes .wrap{position:relative;z-index:1}
.nt-head{display:flex;justify-content:space-between;align-items:flex-end;gap:18px;flex-wrap:wrap;margin-bottom:clamp(12px,2vh,22px)}
/* 抬头与点单台同档；上面的 kicker 与右侧红字手写句都已随节点删除。 */
.nt-head h3{font-family:var(--serif-cn);font-weight:900;font-size:clamp(24px,3.6vw,44px);letter-spacing:.06em;margin-top:0}
.nt-head h3 em{font-family:var(--serif-en);font-style:italic;font-weight:500;font-size:.5em;letter-spacing:.04em;color:var(--gray);margin-left:14px}
.nt-board{height:min(460px,54svh);display:flex;flex-direction:column;gap:12px}
.nt-input{flex:none;display:flex;gap:10px;border-bottom:1px solid rgba(12,12,13,.25);padding-bottom:12px}
.nt-input input{flex:1;min-width:0;border:1px solid rgba(12,12,13,.32);background:rgba(255,255,255,.55);color:var(--ink);
  font-family:var(--sans-cn);font-size:13px;padding:10px 12px;outline:none}
.nt-input input:focus{border-color:var(--seal)}
.nt-input button{appearance:none;border:1.5px solid var(--seal);background:var(--seal);color:var(--paper);
  font-family:var(--mono);font-size:11px;letter-spacing:.14em;padding:10px 18px;cursor:pointer;transition:opacity .2s;flex:none}
.nt-input button:hover{opacity:.85}
.nt-wall{flex:1;min-height:0;overflow:auto;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;align-content:start;padding:6px 2px 14px}
@media(max-width:680px){.nt-wall{grid-template-columns:1fr}}
.nt-note{position:relative;background:#fbf7ec;border:1px solid rgba(12,12,13,.16);border-radius:3px;
  padding:16px 14px 12px;box-shadow:0 3px 9px rgba(0,0,0,.09);transform:rotate(var(--t,0deg));
  display:flex;flex-direction:column;gap:8px;min-height:66px;cursor:pointer;
  transition:transform .3s var(--ease),opacity .35s,box-shadow .3s;animation:nt-drop .45s var(--ease)}
.nt-note:hover{transform:rotate(var(--t,0deg)) translateY(-2px);box-shadow:0 6px 14px rgba(0,0,0,.12)}
.nt-note::before{content:"";position:absolute;top:-8px;left:50%;transform:translateX(-50%) rotate(-2deg);width:52px;height:15px;
  background:linear-gradient(180deg,rgba(232,228,216,.95),rgba(206,200,186,.8));border-radius:2px;opacity:.95;pointer-events:none}
.nt-note .t{font-family:var(--hand);font-size:clamp(17px,1.6vw,21px);line-height:1.55;color:var(--ink);word-break:break-word;padding-top:4px}
.nt-note .d{font-family:var(--mono);font-size:8.5px;letter-spacing:.2em;color:var(--gray);align-self:flex-end;margin-top:2px}
.nt-note.done .t{text-decoration:line-through;color:var(--gray)}
.nt-note .x{position:absolute;top:8px;right:10px;width:16px;height:16px;line-height:15px;text-align:center;
  font-family:var(--mono);font-size:11px;color:var(--gray);border-radius:50%;
  opacity:0;transition:opacity .25s,color .2s,background .2s;user-select:none}
.nt-note:hover .x,.nt-note.done .x{opacity:1}
.nt-note .x:hover{color:var(--paper);background:var(--seal)}
.nt-note.fall{animation:nt-fall .5s var(--ease) forwards}
@keyframes nt-drop{from{opacity:0;transform:rotate(var(--t,0deg)) translateY(-14px)}to{opacity:1;transform:rotate(var(--t,0deg)) translateY(0)}}
@keyframes nt-fall{0%{opacity:1;transform:rotate(var(--t,0deg)) translateY(0)}
  35%{opacity:1;transform:rotate(calc(var(--t,0deg) + 7deg)) translateY(6px)}
  100%{opacity:0;transform:rotate(calc(var(--t,0deg) + 16deg)) translateY(70px)}}
.nt-empty{font-family:var(--hand);font-size:clamp(18px,1.8vw,24px);color:var(--gray);grid-column:1/-1;text-align:center;padding:28px 0;opacity:.7}
/* 随手记的保存/读取提示：沿用点单台与账本失败提示的同一套设计（小号等宽字 + 红章色 + 文本按钮），
   只多一行版面，不改动便签墙本身；收起时 [hidden] 不占位。 */
.nt-err[hidden]{display:none}
.nt-err{display:flex;align-items:center;gap:10px;flex:none;font-family:var(--mono);font-size:9px;letter-spacing:.14em;color:var(--seal);line-height:1.7}
.nt-err .nt-now{appearance:none;border:0;background:none;color:var(--seal);font-family:var(--mono);font-size:9px;letter-spacing:.16em;cursor:pointer;padding:2px 4px;white-space:nowrap;flex:none}
.nt-err .nt-now:hover{text-decoration:underline}
/* 新增保存未确认期间按钮不可重复提交（与点单台禁用态同一处理） */
#ntAdd:disabled{opacity:.55;cursor:default}

/* ============================================================
   04 · 酒单 — 磨砂玻璃
   ============================================================ */
#menu{background:var(--ink);padding:clamp(70px,9vh,110px) 0;position:relative;overflow:hidden;--carte-fs:clamp(30px,4.6vw,56px)}
#menu .shelfbg{position:absolute;inset:0;opacity:.16;pointer-events:none}
#menu .shelfbg img{width:100%;height:100%;object-fit:cover;filter:grayscale(1) brightness(.65) contrast(1.1)}
#menu .shelfbg::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,rgba(12,12,13,.85),rgba(12,12,13,.35) 45%,rgba(12,12,13,.92))}
/* 抬头抄点单台 / 画廊：左「酒单 La Carte」，右「管理酒单 / GÉRER」，下沿一根细线。
   原来那句居中的「— La Carte · dix-huit embarcations —」已随节点删除（含 .en / .kicker 死样式）。 */
.menu-head{position:relative;z-index:2;width:min(1080px,92vw);margin:0 auto clamp(18px,3vh,34px);
  display:flex;justify-content:space-between;align-items:flex-end;gap:18px;flex-wrap:wrap;
  border-bottom:1px solid rgba(240,237,230,.25);padding-bottom:clamp(10px,1.6vw,18px);color:var(--paper)}
.menu-t{margin:0;font-family:var(--serif-cn);font-weight:900;font-size:clamp(24px,3.4vw,42px);
  letter-spacing:.1em;line-height:1;color:var(--paper)}
.menu-t em{font-family:var(--serif-en);font-style:italic;font-weight:500;font-size:.52em;letter-spacing:.04em;
  color:rgba(240,237,230,.6);margin-left:14px}
.stage{position:relative;z-index:2;display:flex;justify-content:center;perspective:1400px;padding:12px 0 44px}
/* 宽度与预约日历海报（.bk-poster）一致：min(1080px,92vw) */
.glasscard{position:relative;width:min(1080px,92vw);min-height:clamp(460px,64vh,600px);
  margin:0 auto;
  background:linear-gradient(160deg,rgba(14,14,16,.96),rgba(8,8,9,.92));
  backdrop-filter:blur(18px) saturate(.8);-webkit-backdrop-filter:blur(18px);
  border:1px solid rgba(240,237,230,.12);border-radius:6px;
  padding:clamp(20px,3.2vh,34px) clamp(20px,3.2vw,40px);
  transform-style:preserve-3d;box-shadow:0 40px 90px rgba(0,0,0,.55)}
.glasscard .glare{position:absolute;inset:0;border-radius:6px;pointer-events:none;opacity:.3;
  background:radial-gradient(420px circle at var(--gx,30%) var(--gy,20%),rgba(240,237,230,.16),transparent 55%)}
.glasscard .clip{position:absolute;top:-12px;left:34px;width:104px;height:26px;
  background:linear-gradient(180deg,#f4f4f6,#bcbcc0 55%,#eaeaed);border-radius:3px;
  box-shadow:0 4px 10px rgba(0,0,0,.55),inset 0 1px 0 rgba(255,255,255,.75);transform:rotate(-1deg)}
.glasscard button.clip{appearance:none;border:none;padding:0;cursor:pointer;z-index:8;
  transition:filter .25s var(--ease),transform .25s var(--ease)}
.glasscard .clip::before{content:"‹ PREV";position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  font-family:var(--mono);font-weight:700;font-size:11px;letter-spacing:.14em;line-height:1;color:rgba(12,12,13,.72)}
.glasscard .clip-r{left:auto;right:34px;transform:rotate(1deg)}
.glasscard .clip-r::before{content:"NEXT ›"}
.glasscard button.clip:hover{filter:brightness(1.1);transform:rotate(-1deg) translateY(2px)}
.glasscard .clip-r:hover{transform:rotate(1deg) translateY(2px)}
.glasscard button.clip:active{filter:brightness(.9)}
.glasscard .clip:focus-visible{outline:2px solid rgba(240,237,230,.85);outline-offset:3px}
.glasscard{display:grid}
/* Both pages size the same grid track, including the inactive page. */
.glasscard .mc-page{grid-area:1 / 1;min-width:0;opacity:0;visibility:hidden;pointer-events:none}
.glasscard .mc-page.is-active{opacity:1;visibility:visible;pointer-events:auto}
.glasscard .mc-page.is-changing{visibility:visible;pointer-events:none;will-change:opacity,transform}
.glasscard .clip:disabled{opacity:.5}
@media(max-width:620px){.glasscard{width:min(520px,92vw);height:auto;min-height:0;aspect-ratio:auto}}
.glasscard .pg-ind{position:absolute;bottom:12px;right:16px;z-index:4;pointer-events:none;
  font-family:var(--mono);font-size:9px;letter-spacing:.34em;color:rgba(240,237,230,.4)}

.glasscard .mc-head{display:flex;justify-content:space-between;align-items:baseline;border-bottom:1px solid rgba(240,237,230,.3);padding-bottom:12px}
.glasscard .mc-head h4,#menu .sp-page-head h4{font-family:var(--serif-en);font-weight:600;font-size:clamp(20px,2.4vh,27px);letter-spacing:.04em}
.glasscard .mc-head .yr{font-family:var(--mono);font-size:10px;letter-spacing:.26em;color:rgba(240,237,230,.55)}
.glasscard .mc-addr{font-family:var(--mono);font-size:9px;letter-spacing:.18em;color:rgba(240,237,230,.5);margin-top:7px;line-height:1.7}
/* 分类分隔带（一页含两个章节时用） */
.glasscard .mc-div{display:flex;align-items:center;gap:14px;margin:clamp(10px,1.8vh,18px) 0 2px;color:rgba(240,237,230,.5)}
.glasscard .mc-div::before,.glasscard .mc-div::after{content:"";flex:1;height:1px;background:rgba(240,237,230,.18)}
.glasscard .mc-div span{font-family:var(--mono);font-size:9px;letter-spacing:.22em;white-space:nowrap}
/* 末页尾注 */
.glasscard .mc-fin{margin-top:clamp(12px,2.2vh,22px);text-align:center;font-family:var(--serif-en);font-style:italic;
  font-size:12px;letter-spacing:.08em;color:rgba(240,237,230,.42)}
/* 翻页引导标注（内容未完，提示下一栏） */
.glasscard .mc-next{margin-top:clamp(14px,2.6vh,26px);text-align:center;
  font-family:var(--mono);font-size:10px;letter-spacing:.3em;color:rgba(240,237,230,.68)}
.glasscard .mc-next i{font-family:var(--serif-en);font-style:italic;font-size:12px;letter-spacing:.06em;
  color:rgba(240,237,230,.45);margin-left:10px}
.drink{display:grid;grid-template-columns:28px 1fr auto;gap:14px;padding:clamp(10px,1.6vh,15px) 0;border-bottom:1px dashed rgba(240,237,230,.2);transition:padding-left .35s var(--ease);align-items:start}
.drink:last-of-type{border-bottom:none}
.drink:hover{padding-left:10px}
.drink .no{font-family:var(--serif-en);font-style:italic;font-size:16px;color:rgba(240,237,230,.75)}
.drink .cn,.sp-bottle .cn,.sp-categories button{font-family:var(--serif-cn);font-weight:500;font-size:clamp(14px,2vh,16px);letter-spacing:.08em;line-height:1.8}
.drink .cn em{font-family:var(--serif-en);font-style:italic;font-weight:400;font-size:.82em;color:rgba(240,237,230,.6);letter-spacing:.05em;margin-left:8px}
.drink .en,.sp-bottle .en{font-family:var(--sans-cn);font-style:normal;font-weight:300;font-size:clamp(10px,1.4vh,11.5px);color:rgba(240,237,230,.5);margin-top:2px;letter-spacing:.06em;line-height:1.7}
.drink .pr{font-family:var(--mono);font-size:clamp(11px,1.5vh,13px);letter-spacing:.14em;color:rgba(240,237,230,.85);padding-top:.35em}
/* ---------- 酒款档案浮窗 — 印刷规格书风格（米纸 + 红双规线 + 技术线图） ---------- */
.glasscard .drink[data-drink-id]{cursor:pointer}
.glasscard .drink[data-drink-id]:hover .no{color:var(--seal)}
.sheet-modal{position:fixed;inset:0;z-index:8500;display:flex;align-items:center;justify-content:center;
  padding:64px 20px 32px;visibility:hidden;pointer-events:none}
.sheet-modal.open{visibility:visible;pointer-events:auto}
.sheet-scrim{position:absolute;inset:0;background:rgba(8,8,9,.74);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
  opacity:0;transition:opacity .45s var(--ease)}
.sheet-modal.open .sheet-scrim{opacity:1}
.sheet-wrap{position:relative;width:min(760px,94vw);max-height:100%;display:flex}
.sheet-card{position:relative;width:100%;max-height:100%;overflow:auto;
  background:var(--paper);color:var(--ink);border-radius:3px;
  box-shadow:0 60px 140px rgba(0,0,0,.7);
  padding:clamp(22px,3.5vw,40px) clamp(20px,4.5vw,50px) clamp(18px,3vw,30px);
  opacity:0;transform:translateY(30px) rotate(.8deg);
  transition:opacity .5s var(--ease),transform .55s var(--ease)}
.sheet-modal.open .sheet-card{opacity:1;transform:translateY(0) rotate(0)}
.sheet-rule{border-top:2px solid var(--seal);border-bottom:1px solid var(--seal);height:4px;margin-bottom:16px}
.sheet-x{position:absolute;top:-15px;right:-15px;z-index:5;width:46px;height:46px;border-radius:50%;
  border:2px solid var(--paper);background:var(--seal);color:var(--paper);cursor:pointer;
  font-family:var(--serif-en);font-size:19px;line-height:1;display:flex;align-items:center;justify-content:center;
  box-shadow:0 6px 18px rgba(0,0,0,.4);transition:transform .3s var(--ease),filter .25s}
.sheet-x:hover{transform:rotate(90deg) scale(1.08);filter:brightness(1.08)}
.sheet-x:active{transform:rotate(90deg) scale(.96)}
.sheet-x:focus-visible{outline:2px solid var(--paper);outline-offset:3px}
.sheet-tag{display:flex;justify-content:space-between;gap:12px;align-items:baseline;font-family:var(--mono);
  font-size:9px;letter-spacing:.28em;color:var(--seal);margin-bottom:14px}
.sheet-tag .r{color:var(--gray-dark)}
/* 酒款档案抬头：与各块抬头同一套（中文宋体 900 + 斜体英文），颜色仍是红章色。
   表体的 .t 只作用于这张浮窗；客户档案那张仍是原来的等宽小标。 */
#sheetModal .sheet-tag .t{font-family:var(--serif-cn);font-weight:900;font-size:clamp(15px,2vw,19px);
  letter-spacing:.08em;color:var(--seal);line-height:1.2}
#sheetModal .sheet-tag .t em{font-family:var(--serif-en);font-style:italic;font-weight:500;
  font-size:.72em;letter-spacing:.02em;margin-left:10px}
.sheet-head{display:flex;gap:16px;align-items:baseline;flex-wrap:wrap;
  border-bottom:1px solid rgba(12,12,13,.35);padding-bottom:13px}
.sheet-head .no{font-family:var(--serif-en);font-style:italic;font-size:26px;color:var(--seal)}
.sheet-head h5{font-family:var(--serif-cn);font-weight:900;font-size:clamp(19px,3vw,28px);letter-spacing:.08em}
.sheet-head em{font-family:var(--serif-en);font-size:13.5px;color:var(--gray-dark);letter-spacing:.03em}
.sheet-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:clamp(16px,3vw,32px);padding:20px 0 4px}
@media(max-width:680px){.sheet-grid{grid-template-columns:1fr}}
.sheet-photo{margin:0;position:relative;border:1px solid rgba(12,12,13,.4);padding:8px;background:rgba(240,237,230,.55)}
.sheet-photo img{display:block;width:100%;height:min(260px,30vh);object-fit:cover;filter:grayscale(1) contrast(1.12)}
.sheet-photo.nophot img{display:none}
.sheet-photo.nophot::after{content:"暂无实拍 · NO PLATE YET";display:flex;align-items:center;justify-content:center;
  height:min(244px,28vh);border:1px dashed rgba(12,12,13,.35);background:rgba(240,237,230,.35);
  font-family:var(--mono);font-size:9px;letter-spacing:.3em;color:var(--gray-dark)}
.sheet-photo figcaption{display:flex;justify-content:space-between;margin-top:7px;
  font-family:var(--mono);font-size:8px;letter-spacing:.26em;color:var(--gray-dark)}
.sheet-spec{width:100%;border-collapse:collapse;margin-top:0}
.sheet-spec td{border:1px solid rgba(12,12,13,.28);padding:6px 10px}
.sheet-spec td:first-child{font-family:var(--mono);font-size:9px;letter-spacing:.22em;color:var(--gray-dark);width:38%}
.sheet-spec td:last-child{font-family:var(--serif-cn);font-size:12.5px;letter-spacing:.06em}

/* ============================================================
   09 · 尾页
   ============================================================ */
#colophon{background:var(--ink);padding:clamp(90px,14vh,150px) 0 0;position:relative;overflow:hidden}
/* 左栏放宽到 1.6fr：题词框吃满左栏（原来 1.4fr 太窄，字一多就显局促） */
.colo-grid{display:grid;grid-template-columns:1.6fr 1fr;gap:clamp(36px,6vw,90px)}
@media(max-width:860px){.colo-grid{grid-template-columns:1fr}}
.colo-brand{display:flex;align-items:baseline;gap:14px;margin-bottom:clamp(26px,4.6vh,48px)}
.colo-brand .zh img{display:block;height:clamp(34px,4.6vh,46px);width:auto}
/* 题词保留固定的阅读区域；长文在框内滚动，字号由店主单独控制。 */
.colo-type-controls{display:flex;align-items:center;gap:16px;min-height:44px;margin:0 0 12px;
  font:10px var(--mono);letter-spacing:.08em;color:var(--paper)}
.colo-type-setting{display:flex;flex:1;min-width:0;align-items:center;gap:8px}
.colo-type-controls label{white-space:nowrap}
.colo-type-controls input{flex:1;min-width:0;accent-color:var(--seal)}
.colo-type-controls output{min-width:32px;text-align:right;white-space:nowrap}
@media(max-width:680px){
  .colo-type-controls{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
  .colo-type-setting{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:5px}
  .colo-type-controls input{grid-column:1/-1;width:100%;margin:4px 0 0}
}
.colo-reader,.colo-edit{display:block;width:100%;height:clamp(160px,28vh,280px);margin:0;padding:0;box-sizing:border-box;
  -webkit-appearance:none;appearance:none;resize:none;overflow-y:auto;overscroll-behavior:auto;-webkit-overflow-scrolling:touch;
  background:transparent;border:0;border-radius:0;outline:none;box-shadow:none;
  font-family:var(--serif-cn);font-weight:900;font-size:clamp(22px,2.6vw,36px);line-height:1.3;letter-spacing:.01em;
  color:var(--paper);caret-color:var(--seal)}
.colo-left{min-width:0}
.colo-reader{overflow-x:hidden}
.colo-reader-text{display:block;white-space:pre-wrap;overflow-wrap:anywhere}
.colo-reader.is-placeholder{color:rgba(240,237,230,.28)}
.colo-reader[hidden],.colo-edit[hidden]{display:none}
.colo-reader:focus-visible{outline:1px dashed rgba(240,237,230,.28);outline-offset:10px}
.colo-edit::placeholder{color:rgba(240,237,230,.28);opacity:1}
.colo-edit:focus{outline:none}
.colo-edit:focus-visible{outline:1px dashed rgba(240,237,230,.28);outline-offset:10px}
.colo-list{border-top:1px solid var(--line-light)}
.colo-list a{display:flex;justify-content:space-between;align-items:center;gap:14px;padding:clamp(11px,1.8vh,17px) 2px;border-bottom:1px solid var(--line-light);
  font-size:12.5px;letter-spacing:.12em;transition:padding-left .35s var(--ease),background .3s}
.colo-list a:hover{padding-left:14px;background:rgba(240,237,230,.05)}
.colo-list .lab{font-family:var(--mono);font-size:9px;letter-spacing:.3em;color:var(--gray);white-space:nowrap}
.colo-list .val{font-family:var(--serif-cn);font-weight:500;min-width:0;display:inline-flex;align-items:baseline;gap:12px;flex-wrap:nowrap;white-space:nowrap}
/* 索引里的英文：与各块抬头的 `<em>` 同一套（斜体衬线、浅纸色、左边距 10px）。
   抬头上是主字号的 .52em（42px 里的 22px）；索引行只有 12.5px，照 .52em 会掉到 6.5px
   读不出来，这里取 .8em（≈10px），与右侧 .lab 的 9px 同档。 */
.colo-list .val em{font-family:var(--serif-en);font-style:italic;font-weight:500;font-size:.8em;letter-spacing:.02em;color:rgba(240,237,230,.55);margin-left:0}
.colo-list .own{display:inline-block;margin-left:10px;border:1px solid var(--seal);color:var(--seal);font-family:var(--mono);font-size:8px;letter-spacing:.22em;padding:2px 6px;vertical-align:2px}
/* 页脚：一行居中 —— 醉舟 + 地址。原来三句英文（版权 / VISUAL CONCEPT / IMPRIMÉ）已删。 */
.colo-bottom{margin-top:clamp(60px,10vh,110px);border-top:1px solid var(--line-light);
  display:flex;justify-content:center;align-items:baseline;gap:clamp(18px,3vw,44px);flex-wrap:wrap;
  padding:20px clamp(20px,5vw,64px) 26px;font-family:var(--mono);font-size:9px;letter-spacing:.24em;color:var(--gray)}
.colo-bottom .colo-zb{font-family:var(--serif-cn);font-weight:900;font-size:12px;letter-spacing:.22em;color:rgba(240,237,230,.8)}
.colo-bottom .colo-addr{font-family:var(--mono);font-size:9px;letter-spacing:.24em;color:var(--gray);white-space:nowrap}

/* Navigation destinations keep sparse content inside a complete workspace. */
:root{--workspace-nav:76px;--workspace-viewport:100svh}
#notes,#clients,#colophon{height:calc(var(--workspace-viewport) - var(--workspace-nav));min-height:0;scroll-margin-top:var(--workspace-nav);padding:24px 0 max(18px,env(safe-area-inset-bottom));display:flex;flex-direction:column}
#notes>.wrap,#clients>.wrap{width:100%;flex:1;min-height:0;display:flex;flex-direction:column}
#notes .nt-head{flex:none;margin-bottom:16px}
#notes .nt-head h3{font-size:32px;line-height:1.25}
#notes .nt-board{height:auto;flex:1;min-height:0}
#notes .nt-wall,#clients #clList{overscroll-behavior:contain;-webkit-overflow-scrolling:touch;scrollbar-width:thin}
#clients .painlist{margin-top:0;flex:1;min-height:0;display:flex;flex-direction:column}
#clients .painlist-title{flex:none;margin-bottom:16px}
#clients .cl-tools{flex:none;margin-bottom:12px}
#clients #clList{flex:1;min-height:0;overflow:auto;overflow-x:hidden;padding-right:8px}
#clients .cl-row{flex:none}
#clients .cl-name,#clients .cl-info dd{overflow-wrap:anywhere}
#clients .cl-empty{flex:none}
#clients .sheet-foot{flex:none;margin-top:12px}
/* 客户块页脚挂的是 [data-reveal]，入场前有 translateY(36px)。这一块锁成一屏且 overflow:hidden，
   位移把它推到块外，只剩 3px 在裁剪区里 → IntersectionObserver 的 .18 阈值永远到不了，
   于是它恒在块底下方 26px，被裁掉大半（「共 N 位客人」那行）。一屏版式下直接取消位移；
   桌面块高交给内容、不裁，仍走原来的入场动画。 */
@media(max-width:760px){#clients .sheet-foot[data-reveal]{opacity:1;transform:none}}
/* 尾页的「工作区压缩值」只在窄屏生效（和 49 节的一屏一块放一起）；
   桌面由下面的 761+ 段解压回工作区出现之前：大留白、大字、左右两栏。 */
@media(max-width:760px){
  #colophon{padding-bottom:0}
  #colophon>.wrap{width:100%;flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;overscroll-behavior:auto}
  #colophon .colo-grid{grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);gap:32px;align-items:start}
  #colophon .colo-brand{flex-wrap:wrap;margin-bottom:24px}
  #colophon .colo-list a{padding:12px 2px;letter-spacing:0}
  #colophon .colo-list .lab{font-size:8px;letter-spacing:0}
  #colophon .colo-bottom{flex:none;margin-top:16px;padding-top:14px;padding-bottom:max(14px,env(safe-area-inset-bottom));font-size:8px;letter-spacing:0;line-height:1.5}
  .colo-reader,.colo-edit{font-size:clamp(20px,6vw,24px)}
}
/* 桌面（>760）不锁一屏：块高交给内容，滚轮交给页面。
   上面那段把三块锁成「视口 − 顶栏」，内层 .nt-wall / #clList / .wrap 又是滚动容器；
   Chrome 里只要元素是滚动容器，即使 scrollHeight === clientHeight 滚轮也不冒泡，
   于是鼠标落在这三块内容上整页不动（两侧空白能滚是落到了 .wrap 外面）。
   手机一屏一块仍由 49 节（≤760）负责，本段与它不重叠。
   尾页在这里顺带解压：上留白回到 clamp(90px,14vh,150px)，两栏仍是 1.4fr 1fr。 */
@media(min-width:761px){
  #notes,#clients,#colophon{height:auto;min-height:calc(var(--workspace-viewport) - var(--workspace-nav))}
  #notes>.wrap,#clients>.wrap,#colophon>.wrap{overflow:visible;flex:1 0 auto;min-height:0;height:auto}
  #notes .nt-board{height:auto}
  #notes .nt-wall,#clients #clList{overflow:visible;flex:none;height:auto}
  #colophon{padding:clamp(90px,14vh,150px) 0 0}
  #colophon>.wrap{width:100%;box-sizing:border-box}
  #colophon .colo-reader,#colophon .colo-edit{height:clamp(220px,34vh,360px)}
}
/* 桌面也锁一屏，但只在内容装不下时：clients.js 量出超出才加 .cl-screen，
   装得下保持页面滚动（空滚动容器会吃掉滚轮，见上面 895 段的解锁说明）。
   列表滚动条按纸面浅色收细，不露出 Windows 原生粗条。 */
@media(min-width:761px){
  #clients.cl-screen{height:calc(var(--workspace-viewport) - var(--workspace-nav));min-height:0;overflow:hidden}
  #clients.cl-screen>.wrap{overflow:hidden;flex:1;min-height:0;height:auto}
  #clients.cl-screen #clList{flex:1;min-height:0;height:auto;overflow:auto;overflow-x:hidden;padding-right:8px;
    scrollbar-width:thin;scrollbar-color:rgba(12,12,13,.3) transparent}
  #clients.cl-screen #clList::-webkit-scrollbar{width:8px}
  #clients.cl-screen #clList::-webkit-scrollbar-thumb{background:rgba(12,12,13,.24);border-radius:4px}
  #clients.cl-screen #clList::-webkit-scrollbar-track{background:transparent}
  #clients.cl-screen #clList::-webkit-scrollbar-button{display:none;width:0;height:0}
  /* 锁一屏 + overflow:hidden 会把 sheet-foot 的入场位移裁掉（≤760 同款问题），直接取消位移 */
  #clients.cl-screen .sheet-foot[data-reveal]{opacity:1;transform:none}
}
@media(max-width:680px){
  #notes,#clients,#colophon{padding-top:16px}
  #notes .nt-head h3{font-size:24px}
  #clients .painlist-title{gap:10px;flex-wrap:wrap;margin-bottom:10px}
  #clients .sheet-tag{font-size:8px}
  #colophon .colo-grid{grid-template-columns:minmax(0,1fr);gap:20px;align-content:start}
  #colophon .colo-brand{margin-bottom:12px}
  #colophon .colo-list a{padding:9px 2px}
}
@media(max-height:600px) and (min-width:681px){
  #notes,#clients,#colophon{padding-top:14px}
  #colophon .colo-list a{padding:8px 2px}
}

/* ---------- 点单台 · COMMANDES（店主自用 · 全息线框座位图 + 点单面板） ---------- */
#orders{background:var(--ink);padding:clamp(56px,8vh,110px) 0;position:relative;overflow:hidden}
#orders::after{content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(120% 90% at 50% 0%,transparent 55%,rgba(0,0,0,.5))}
/* 原来头顶还有一句「— Le Comptoir · service en salle —」（.od-kick），已随节点删除：
   .od-head 现在就是块内第一行，自己带下沿细线。 */
.od-head{width:min(1080px,92vw);margin:0 auto clamp(18px,3vh,34px);display:flex;justify-content:space-between;align-items:flex-end;gap:18px;flex-wrap:wrap;
  border-bottom:1px solid rgba(240,237,230,.25);padding-bottom:clamp(10px,1.6vw,18px)}
.od-head h3{font-family:var(--serif-cn);font-weight:900;font-size:clamp(24px,3.4vw,42px);letter-spacing:.1em;color:var(--paper);line-height:1}
.od-head h3 em{font-family:var(--serif-en);font-style:italic;font-weight:500;font-size:.52em;letter-spacing:.04em;color:rgba(240,237,230,.6);margin-left:14px}
.od-owner{font-family:var(--mono);font-size:9px;letter-spacing:.26em;color:rgba(240,237,230,.45)}
.od-board{width:min(1080px,92vw);margin:0 auto;position:relative;z-index:1;
  display:grid;grid-template-columns:minmax(0,1.15fr) minmax(300px,.85fr);gap:clamp(20px,3vw,44px);align-items:start}
@media(max-width:860px){.od-board{grid-template-columns:1fr}}
.od-map-wrap{position:relative;border:1px solid rgba(240,237,230,.14);background:rgba(14,14,16,.55);padding:clamp(10px,1.6vw,20px)}
#odMap{display:block;width:100%;height:auto}
.od-legend{display:flex;gap:22px;padding:10px 4px 2px;font-family:var(--mono);font-size:9px;letter-spacing:.24em;color:var(--gray)}
.od-legend i{display:inline-block;width:14px;height:9px;vertical-align:-1px;margin-right:7px}
.od-legend i.free{border:1px dashed rgba(240,237,230,.5)}
.od-legend i.busy{border:1px solid var(--seal);background:rgba(195,61,46,.16)}
/* —— 座位图形（SVG 内元素由 JS 生成，样式集中在此） —— */
.od-floor{fill:none;stroke:rgba(240,237,230,.22);stroke-dasharray:4 6}
.od-zone{fill:none;stroke:rgba(240,237,230,.28);stroke-width:1}
.od-lab{font-family:var(--mono);font-size:10px;letter-spacing:3px;fill:rgba(240,237,230,.4)}
.od-seat{cursor:pointer;outline:none}
.od-seat .shape{fill:none;stroke:rgba(240,237,230,.5);stroke-width:1;stroke-dasharray:3 3;transition:stroke .25s,fill .25s;pointer-events:all}
.od-seat text{font-family:var(--mono);font-size:10px;fill:rgba(240,237,230,.55);letter-spacing:1px}
.od-seat:hover .shape,.od-seat:focus-visible .shape{stroke:rgba(240,237,230,.95);stroke-dasharray:none}
.od-seat.selected .shape{stroke:var(--paper);stroke-dasharray:none;stroke-width:1.6}
.od-seat.selected text{fill:var(--paper)}
.od-seat.busy .shape{stroke:var(--seal);stroke-width:1.6;stroke-dasharray:none;fill:rgba(195,61,46,.14)}
.od-seat.busy text{fill:var(--seal)}
.od-seat .st{font-size:9.5px;fill:var(--seal);letter-spacing:0}
.od-seat .st.idle{fill:rgba(240,237,230,.35)}
/* —— 点单面板（双态：闲置折成小条 / 选中座位展开锁高，展开态保证 iPad 一屏内） —— */
.od-panel{border:1px solid rgba(240,237,230,.16);background:rgba(16,16,18,.88);padding:clamp(16px,2vw,26px);position:sticky;top:90px;
  display:flex;flex-direction:column;overflow:hidden;transition:height .38s var(--ease)}
.od-panel:not(.idle){height:min(56vh,330px)}
.od-panel.picker-open{height:min(calc(100svh - 130px),600px)}
/* 客户候选展开时同样撑开面板：结算条与「结单」不能被挤到面板外面去 */
.od-panel.client-open{height:min(calc(100svh - 150px),560px)}
.od-panel.idle{height:auto}
.od-panel.idle .od-lines,.od-panel.idle .od-picker,.od-panel.idle .od-client,.od-panel.idle .od-foot,.od-panel.idle .od-receipt{display:none}
.od-panel-head{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;border-bottom:1px solid rgba(240,237,230,.22);padding-bottom:12px;flex:none}
.od-panel-head h4{font-family:var(--serif-cn);font-weight:900;font-size:19px;letter-spacing:.08em;color:var(--paper)}
.od-sub{display:block;font-family:var(--mono);font-size:9px;letter-spacing:.2em;color:var(--gray);margin-top:6px}
.od-badge{flex:none;font-family:var(--mono);font-size:10px;letter-spacing:.1em;color:var(--seal);border:1px solid var(--seal);padding:4px 9px;white-space:nowrap}
.od-lines{min-height:60px;flex:1 1 auto;overflow:auto;margin-top:4px}
.od-empty{font-family:var(--mono);font-size:10px;letter-spacing:.22em;color:rgba(240,237,230,.35);text-align:center;padding:20px 0;border:1px dashed rgba(240,237,230,.2);margin-top:14px}
/* —— 保存失败提示：贴在各自操作区域（点单在面板副行下方、账本在表单/操作区），沿用既有字体与色彩，不用结单小票，不抢焦点，不自动消失 —— */
.od-err[hidden],.cp-err[hidden]{display:none}
.od-err{display:flex;align-items:center;gap:10px;margin-top:9px;flex:none;font-family:var(--mono);font-size:9px;letter-spacing:.14em;color:var(--seal);line-height:1.7}
.od-err .od-btn{padding:5px 11px;font-size:9px;border-color:var(--seal);color:var(--seal);white-space:nowrap;flex:none}
.od-err .od-btn:hover{background:var(--seal);color:var(--paper)}
.cp-err{display:flex;align-items:center;gap:8px;flex:none;font-family:var(--mono);font-size:9.5px;letter-spacing:.14em;color:var(--seal);line-height:1.7}
.cp-err .cp-now{font-size:9.5px;white-space:nowrap;flex:none}
.od-line{border-bottom:1px solid rgba(240,237,230,.12);padding:11px 2px 10px}
.od-line-top{display:flex;align-items:baseline;gap:10px}
.od-line-top .qty{display:flex;align-items:center;gap:6px;flex:none}
.od-line-top .qty button{appearance:none;border:1px solid rgba(240,237,230,.3);background:none;color:var(--paper);
  width:20px;height:20px;line-height:1;font-size:13px;cursor:pointer;border-radius:50%}
.od-line-top .qty button:hover{border-color:var(--paper)}
.od-line-top .qty b{font-family:var(--mono);font-size:12px;color:var(--paper);min-width:26px;text-align:center;font-weight:400}
.od-line-top .nm{flex:1;min-width:0;font-family:var(--serif-cn);font-size:14.5px;letter-spacing:.05em;color:var(--paper);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.od-line-top .pr{font-family:var(--mono);font-size:11px;color:rgba(240,237,230,.75)}
.od-line-bot{display:flex;align-items:center;gap:10px;margin-top:7px}
.od-line-bot time{font-family:var(--mono);font-size:9.5px;letter-spacing:.08em;color:var(--gray);flex:none}
.od-line-bot input{flex:1;min-width:0;border:0;border-bottom:1px dashed rgba(240,237,230,.25);background:none;color:rgba(240,237,230,.85);
  font-family:var(--sans-cn);font-size:12px;padding:3px 2px;outline:none}
.od-line-bot input:focus{border-bottom-color:var(--seal)}
.od-line-bot .del{appearance:none;border:0;background:none;color:var(--gray);font-size:15px;line-height:1;cursor:pointer;padding:2px 4px}
.od-line-bot .del:hover{color:var(--seal)}
.od-line-top .qty button:disabled,.od-line-bot .del:disabled,.od-line-bot input:disabled{opacity:.28;cursor:default}
/* —— 酒品选择器 —— */
.od-picker{margin-top:14px;flex:0 1 auto;border:1px dashed transparent;padding:0 12px;max-height:0;overflow:auto;opacity:0;
  scrollbar-width:thin;scrollbar-color:rgba(240,237,230,.3) transparent;
  transition:max-height .42s var(--ease),opacity .3s,padding .3s,border-color .3s}
.od-picker.open{max-height:min(250px,34vh);opacity:1;padding:12px;border-color:rgba(240,237,230,.22)}
.od-pick-div{display:flex;align-items:center;gap:12px;margin:8px 0;color:rgba(240,237,230,.45)}
.od-pick-div::before,.od-pick-div::after{content:"";flex:1;height:1px;background:rgba(240,237,230,.14)}
.od-pick-div span{font-family:var(--mono);font-size:9px;letter-spacing:.22em;white-space:nowrap}
.od-pick-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:7px}
.od-pick{display:flex;justify-content:space-between;align-items:center;gap:8px;appearance:none;border:1px solid rgba(240,237,230,.2);
  background:none;color:var(--paper);font-family:var(--serif-cn);font-size:12.5px;letter-spacing:.04em;padding:8px 10px;cursor:pointer;text-align:left;
  transition:border-color .2s,background .2s}
.od-pick:hover{border-color:var(--seal);background:rgba(195,61,46,.08)}
.od-pick .p{font-family:var(--mono);font-size:10px;color:var(--gray)}
/* —— 底部合计 / 按钮 —— */
/* —— 结单关联客户：可选、可搜索、可清空；锁定期间只读 —— */
.od-client{margin-top:12px;border-top:1px dashed rgba(240,237,230,.18);padding-top:11px;flex:none}
.oc-top{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}
.oc-lbl{font-family:var(--mono);font-size:9px;letter-spacing:.22em;color:var(--gray)}
.oc-pick{appearance:none;border:1px solid rgba(240,237,230,.3);background:none;color:rgba(240,237,230,.7);
  font-family:var(--mono);font-size:10px;letter-spacing:.08em;padding:5px 11px;cursor:pointer;max-width:100%;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transition:border-color .2s,color .2s}
.oc-pick:hover:not(:disabled){border-color:var(--paper);color:var(--paper)}
.oc-pick.has{border-color:var(--seal);color:var(--seal)}
.oc-pick:disabled{opacity:.55;cursor:default}
.oc-panel{margin-top:9px}
.oc-panel[hidden]{display:none}
#odClientQ{width:100%;appearance:none;border:1px solid rgba(240,237,230,.22);background:transparent;color:var(--paper);
  font-family:var(--mono);font-size:11px;letter-spacing:.06em;padding:8px 10px}
#odClientQ::placeholder{color:rgba(240,237,230,.35)}
#odClientQ:focus{outline:none;border-color:rgba(240,237,230,.55)}
.oc-list{margin-top:6px;max-height:min(150px,20vh);overflow:auto;scrollbar-width:thin;
  scrollbar-color:rgba(240,237,230,.3) transparent}
.oc-item{display:flex;align-items:center;gap:8px;width:100%;text-align:left;appearance:none;border:0;
  border-bottom:1px solid rgba(240,237,230,.08);background:none;color:rgba(240,237,230,.75);
  font-family:var(--mono);font-size:11px;letter-spacing:.06em;padding:8px 4px;cursor:pointer}
.oc-item em{font-style:normal;font-size:9px;color:var(--gray);letter-spacing:.14em}
.oc-item:hover{background:rgba(240,237,230,.06);color:var(--paper)}
.oc-item.cur{color:var(--seal)}
.oc-none{font-family:var(--mono);font-size:9.5px;letter-spacing:.14em;color:var(--gray);padding:9px 4px}
.od-foot{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-top:16px;border-top:1px solid rgba(240,237,230,.22);padding-top:14px;flex-wrap:wrap;flex:none}
.od-sum{font-family:var(--mono);font-size:11px;letter-spacing:.1em;color:rgba(240,237,230,.8)}
.od-sum b{color:var(--seal);font-weight:400}
.od-btns{display:flex;gap:10px}
.od-btn{appearance:none;border:1.5px solid var(--paper);background:none;color:var(--paper);font-family:var(--mono);
  font-size:11px;letter-spacing:.18em;padding:9px 18px;cursor:pointer;transition:all .25s var(--ease)}
.od-btn:hover{background:rgba(240,237,230,.1)}
.od-btn.od-settle{border-color:var(--seal);color:var(--seal)}
.od-btn.od-settle:hover,.od-btn.od-settle.arm{background:var(--seal);color:var(--paper)}
/* —— 结单小票 —— */
.od-receipt{margin-top:14px;border:1px solid rgba(195,61,46,.5);background:rgba(195,61,46,.06);padding:12px 14px;
  font-family:var(--mono);font-size:10px;letter-spacing:.08em;color:rgba(240,237,230,.85);line-height:1.9}
.od-receipt .rt{color:var(--seal);letter-spacing:.24em;margin-bottom:4px}
.od-col-l,.od-col-r{min-width:0}
.od-col-r{display:flex;flex-direction:column;gap:14px;align-items:stretch}
/* —— 结单记录（左列 · 地图下方 · 紧凑留档） —— */
.od-log{margin:14px 0 0;position:relative;z-index:1}
.od-log-head{display:flex;justify-content:space-between;align-items:baseline;gap:12px;flex-wrap:wrap;border-bottom:1px solid rgba(240,237,230,.25);padding-bottom:8px}
.od-log-head span:first-child{font-family:var(--mono);font-size:9px;letter-spacing:.3em;color:rgba(240,237,230,.6)}
.od-log-head span:last-child{font-family:var(--mono);font-size:8.5px;letter-spacing:.16em;color:rgba(240,237,230,.35)}
.od-log-row{display:grid;grid-template-columns:88px 1fr 56px 62px auto;gap:8px;align-items:baseline;
  padding:8px 2px;border-bottom:1px solid rgba(240,237,230,.1);font-family:var(--mono);font-size:9.5px;letter-spacing:.04em;color:rgba(240,237,230,.7)}
.od-log-row .seat{color:var(--paper);font-family:var(--serif-cn);font-size:12px;letter-spacing:.06em}
.od-log-row .mix{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:rgba(240,237,230,.55)}
.od-log-row .total{text-align:right;color:rgba(240,237,230,.85)}
.od-log-empty{font-family:var(--mono);font-size:10px;letter-spacing:.2em;color:rgba(240,237,230,.3);padding:14px 2px}
.od-log-more{display:block;width:100%;appearance:none;background:none;border:0;color:var(--gray);font-family:var(--mono);
  font-size:9px;letter-spacing:.22em;padding:9px 2px;cursor:pointer;text-align:left;transition:color .25s}
.od-log-more:hover{color:var(--paper)}
/* 行内删除：先「删除」装填，再「确认删除？」才真的删 */
.od-log-del{appearance:none;background:none;border:1px solid rgba(240,237,230,.22);border-radius:2px;
  color:rgba(240,237,230,.45);font-family:var(--mono);font-size:8.5px;letter-spacing:.08em;
  padding:2px 6px;line-height:1.5;align-self:center;cursor:pointer;transition:color .2s,border-color .2s,background .2s}
.od-log-del:hover{color:var(--paper);border-color:rgba(240,237,230,.5)}
.od-log-del.arm{color:#fff;background:var(--seal);border-color:var(--seal)}
.od-log-del[disabled]{opacity:.4;cursor:default}
/* —— 在座订单总览（右列 · 面板下方 · 每桌一卡） —— */
.od-live{border:1px solid rgba(195,61,46,.4);background:rgba(195,61,46,.05);padding:12px 14px}
.od-live-head{display:flex;justify-content:space-between;align-items:baseline;gap:10px;border-bottom:1px solid rgba(195,61,46,.3);padding-bottom:8px}
.od-live-head span:first-child{font-family:var(--mono);font-size:9px;letter-spacing:.28em;color:var(--seal)}
.od-live-head span:last-child{font-family:var(--mono);font-size:8.5px;letter-spacing:.14em;color:var(--gray)}
/* 常显约 3 卡；面板展开时让位收窄至约 2 卡，超出内部滚动 */
/* 深色细滚动条：Windows「始终显示滚动条」下原生样式会带 ▲▼ 按钮，与暗色面板格格不入 */
.od-live-list{height:176px;overflow:auto;transition:height .38s var(--ease);
  scrollbar-width:thin;scrollbar-color:rgba(240,237,230,.26) transparent}
.od-live-list::-webkit-scrollbar{width:8px;height:8px}
.od-live-list::-webkit-scrollbar-thumb{background:rgba(240,237,230,.2);border-radius:4px}
.od-live-list::-webkit-scrollbar-thumb:hover{background:rgba(240,237,230,.36)}
.od-live-list::-webkit-scrollbar-track{background:transparent}
.od-live-list::-webkit-scrollbar-button{display:none;width:0;height:0}
.od-panel:not(.idle)~.od-live .od-live-list{height:118px}
.od-live-empty{font-family:var(--mono);font-size:10px;letter-spacing:.2em;color:rgba(240,237,230,.3);padding:18px 0;text-align:center}
.od-live-card{display:block;width:100%;appearance:none;background:none;border:0;border-bottom:1px solid rgba(240,237,230,.1);
  color:inherit;font:inherit;text-align:left;padding:10px 4px;cursor:pointer;transition:background .25s}
.od-live-card:hover{background:rgba(240,237,230,.05)}
.od-live-card.cur{background:rgba(240,237,230,.07);outline:1px solid rgba(240,237,230,.25);outline-offset:-1px}
.lc-line1{display:flex;gap:8px;align-items:baseline}
.lc-seat{font-family:var(--mono);font-size:10px;color:var(--seal);letter-spacing:.1em;flex:none}
.lc-main{flex:1;min-width:0;font-family:var(--serif-cn);font-size:12.5px;letter-spacing:.04em;color:var(--paper);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lc-line2{display:flex;gap:8px;margin-top:4px;font-family:var(--sans-cn);font-size:11px;align-items:baseline}
.lc-note{color:var(--seal);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lc-meta{font-family:var(--mono);font-size:9px;letter-spacing:.06em;color:var(--gray);flex:none;white-space:nowrap}
@media(max-width:700px){.od-log-row{grid-template-columns:90px 1fr 64px auto}.od-log-row .mix{display:none}.od-panel{position:static}}


/* —— 账本 · LES COMPTES（纸面档案语言 · 与 Archives 同系 · 整页锁死一屏，超出内部滑动） —— */
#comptes{background:var(--paper);color:var(--ink);padding:clamp(56px,7.5vh,88px) 0 clamp(36px,4.5vh,64px);position:relative}
.cp-head{width:min(1080px,92vw);margin:0 auto clamp(10px,1.6vh,18px);display:flex;justify-content:space-between;align-items:flex-end;gap:18px;flex-wrap:wrap;
  border-bottom:1px solid rgba(12,12,13,.3);padding-bottom:clamp(8px,1.4vw,16px)}
.cp-head h3{font-family:var(--serif-cn);font-weight:900;font-size:clamp(24px,3.4vw,42px);letter-spacing:.1em;color:var(--ink);line-height:1}
.cp-head h3 em{font-family:var(--serif-en);font-style:italic;font-weight:500;font-size:.52em;letter-spacing:.04em;color:var(--gray);margin-left:14px}
.cp-kickin{display:block;font-family:var(--mono);font-size:9px;letter-spacing:.3em;color:var(--gray);margin-top:10px;font-weight:400}
.cp-owner{font-family:var(--mono);font-size:9px;letter-spacing:.26em;color:var(--gray)}
.cp-board{width:min(1080px,92vw);margin:0 auto;display:flex;flex-direction:column;gap:clamp(10px,1.6vh,16px);
  height:min(700px,calc(100svh - clamp(180px,23vh,260px)));min-height:520px}
.cp-top{flex:none;display:flex;flex-direction:column;gap:10px}
.cp-month{display:flex;align-items:center;gap:12px}
.cp-month b{font-family:var(--mono);font-size:12px;letter-spacing:.2em;color:var(--ink);min-width:200px;text-align:center}
.cp-nav{appearance:none;border:1px solid rgba(12,12,13,.4);background:none;color:var(--ink);width:26px;height:26px;line-height:1;
  font-size:14px;cursor:pointer;border-radius:50%;transition:border-color .2s,background .2s;flex:none}
.cp-nav:hover:not(:disabled){border-color:var(--ink);background:rgba(12,12,13,.06)}
.cp-nav:disabled{opacity:.25;cursor:default}
.cp-now{appearance:none;border:0;background:none;color:var(--seal);font-family:var(--mono);font-size:10px;letter-spacing:.18em;cursor:pointer;padding:2px 4px}
.cp-now:hover{text-decoration:underline}
.cp-cards{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
.cp-card{border:1px solid var(--ink);padding:clamp(9px,1.3vw,15px) clamp(12px,1.6vw,18px);display:flex;flex-direction:column;gap:4px}
.cp-card .cp-lab{font-family:var(--mono);font-size:8.5px;letter-spacing:.24em;color:var(--gray)}
.cp-card b{font-family:var(--mono);font-size:clamp(17px,2vw,22px);font-weight:400;color:var(--ink)}
.cp-card .cp-sub{font-family:var(--mono);font-size:9px;letter-spacing:.12em;color:var(--gray)}
.cp-card.solde{border-color:var(--seal)}
.cp-card.solde b{color:var(--seal)}
.cp-card.solde .cp-lab{color:var(--seal)}
.cp-actions{display:flex;justify-content:space-between;align-items:center;gap:12px}
.cp-addbtn{appearance:none;border:1.5px solid var(--ink);background:var(--ink);color:var(--paper);font-family:var(--mono);
  font-size:11px;letter-spacing:.18em;padding:8px 16px;cursor:pointer;transition:background .25s,border-color .25s}
.cp-addbtn:hover{background:var(--seal);border-color:var(--seal)}
.cp-csv{appearance:none;border:0;background:none;color:var(--gray);font-family:var(--mono);font-size:10px;letter-spacing:.18em;cursor:pointer;padding:4px 2px}
.cp-csv:hover{color:var(--ink)}
/* 记一笔表单（折叠滑出 · 展开时压缩流水区，页面高度不变） */
.cp-form{display:grid;grid-template-columns:auto 110px 150px 150px minmax(0,1fr) auto;gap:16px;align-items:end;flex:none;
  border:1px dashed rgba(12,12,13,.4);padding:0 12px;max-height:0;opacity:0;overflow:hidden;
  transition:max-height .4s var(--ease),opacity .3s,padding .3s}
.cp-form.open{max-height:260px;opacity:1;padding:12px}
.cp-form label{display:flex;flex-direction:column;gap:4px;font-family:var(--mono);font-size:9px;letter-spacing:.18em;color:var(--gray);min-width:0}
.cp-form input,.cp-form select{border:1px solid rgba(12,12,13,.35);background:rgba(255,255,255,.55);color:var(--ink);
  font-family:var(--sans-cn);font-size:12.5px;padding:7px 8px;outline:none;min-width:0;width:100%}
.cp-form input:focus,.cp-form select:focus{border-color:var(--seal)}
.cp-form input[type="date"]{-webkit-appearance:none;appearance:none} /* iOS 原生日期控件不遵守列宽，去原生外观让它真正服从列宽 */
.cp-form>label:nth-child(5) input{max-width:340px} /* 备注：全端封顶，单行留白给按钮区 */
.cp-fswitch{display:flex;border:1px solid rgba(12,12,13,.4)}
.cp-fswitch button{appearance:none;border:0;background:none;color:var(--gray);font-family:var(--mono);font-size:10px;letter-spacing:.14em;padding:9px 12px;cursor:pointer}
.cp-fswitch button[aria-pressed="true"]{background:var(--ink);color:var(--paper)}
.cp-fbtns{display:flex;gap:8px}
.cp-fbtns button{appearance:none;font-family:var(--mono);font-size:10px;letter-spacing:.14em;padding:9px 14px;cursor:pointer}
#cpSave{border:1.5px solid var(--seal);background:var(--seal);color:var(--paper);transition:opacity .2s}
#cpSave:hover{opacity:.85}
#cpCancel{border:1px solid rgba(12,12,13,.4);background:none;color:var(--ink)}
#cpCancel:hover{background:rgba(12,12,13,.06)}
/* 流水区 · 双列一屏四天（最新在左上 Z 字排；当天卡实线，其余虚线） */
.cp-journal{flex:1 1 auto;min-height:0;display:flex;flex-direction:column}
.cp-zonehead{display:flex;justify-content:space-between;align-items:baseline;gap:12px;flex:none;border-bottom:1px solid rgba(12,12,13,.3);padding-bottom:6px}
.cp-zonehead span{font-family:var(--mono);font-size:8.5px;letter-spacing:.24em;color:var(--gray)}
.cp-zonehead span:first-child{color:var(--ink)}
.cp-days{flex:1;min-height:0;overflow:auto;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;
  padding:12px 2px 20px;align-content:start;align-items:stretch;
  -webkit-mask-image:linear-gradient(180deg,#000 84%,transparent);mask-image:linear-gradient(180deg,#000 84%,transparent)}
.cp-day{border:1px dashed rgba(12,12,13,.45);padding:10px 12px 8px;display:flex;flex-direction:column;gap:6px;min-width:0}
.cp-day.today{border:1.5px solid var(--ink)}
.cp-day header{display:flex;justify-content:space-between;align-items:baseline;gap:10px;border-bottom:1px solid rgba(12,12,13,.2);padding-bottom:5px;flex:none}
.cp-day header b{font-family:var(--serif-cn);font-size:13.5px;letter-spacing:.06em;font-weight:900;color:var(--ink)}
.cp-day header span{font-family:var(--mono);font-size:9px;letter-spacing:.1em;color:var(--gray);white-space:nowrap}
/* 自动入账行多了一行结单钟点 / 客户 / 杯数：可视高度同步放宽，避免第二笔被截半行 */
.cp-evs{overflow:auto;min-height:0;max-height:104px}
.cp-ev{display:grid;grid-template-columns:1fr auto auto auto;gap:8px;align-items:baseline;padding:5px 0;border-bottom:1px dashed rgba(12,12,13,.14)}
.cp-ev:last-child{border-bottom:0}
.cp-ev .cp-main{font-family:var(--sans-cn);font-size:12px;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.cp-ev .cp-main.mute{color:var(--gray)}
.cp-ev .cp-tag{font-family:var(--mono);font-size:8.5px;letter-spacing:.12em;color:var(--gray);border:1px solid rgba(12,12,13,.25);padding:1px 5px;white-space:nowrap;flex:none}
.cp-ev .cp-tag.auto{color:var(--ink);border-color:rgba(12,12,13,.5)}
.cp-amt{font-family:var(--mono);font-size:11.5px;white-space:nowrap;text-align:right}
.cp-amt.in{color:var(--ink)}
.cp-amt.out{color:var(--seal)}
.cp-ops{display:flex;gap:5px}
/* —— 自动入账行：首行座位与「结单」，次行结单钟点 / 客户 / 杯数（不重排旧版式） —— */
.cp-ev.linkable{cursor:pointer}
.cp-ev.linkable:hover .l1,.cp-ev.open .l1{color:var(--seal)}
.cp-ev.open{background:rgba(12,12,13,.03)}
.cp-main.two,.cpd-main.two{display:flex;flex-direction:column;gap:2px;min-width:0;white-space:normal}
.cp-main.two .l1,.cpd-main.two .l1{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cp-main.two .l2,.cpd-main.two .l2{font-family:var(--mono);font-size:8.5px;letter-spacing:.08em;color:var(--gray);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cp-break{grid-column:1/-1;border-left:2px solid rgba(12,12,13,.35);margin:2px 0 6px 2px;padding:4px 0 6px 10px}
.cp-break-row{display:flex;align-items:baseline;gap:8px;font-family:var(--mono);font-size:10px;color:var(--ink);padding:1px 0;letter-spacing:.04em}
.cp-break-row span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cp-break-row em{font-style:normal;color:var(--gray);font-size:9px;white-space:nowrap}
.cp-break-row b{font-weight:400;white-space:nowrap}
.cp-break-foot{margin-top:3px;font-family:var(--mono);font-size:9px;letter-spacing:.1em;color:var(--gray)}
.cp-break-hint{font-family:var(--mono);font-size:9.5px;letter-spacing:.12em;color:var(--gray)}
.cp-ops button{appearance:none;border:1px solid var(--seal);background:none;color:var(--seal);font-family:var(--mono);
  font-size:9px;letter-spacing:.08em;padding:1px 6px;cursor:pointer;transition:background .2s,color .2s;white-space:nowrap}
.cp-ops button:hover,.cp-ops button.arm{background:var(--seal);color:var(--paper)}
.cp-empty{font-family:var(--mono);font-size:10px;letter-spacing:.22em;color:var(--gray);border:1px dashed rgba(12,12,13,.3);
  padding:22px;text-align:center;grid-column:1/-1}
/* 历史月份 · 同款双列 2×2（当月卡实线，其余虚线；点击整卡跳月） */
.cp-months{flex:none;display:flex;flex-direction:column}
.cp-mgrid{height:clamp(120px,15vh,150px);overflow:auto;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;
  padding:12px 2px 20px;align-content:start;
  -webkit-mask-image:linear-gradient(180deg,#000 82%,transparent);mask-image:linear-gradient(180deg,#000 82%,transparent)}
.cp-m{appearance:none;border:1px dashed rgba(12,12,13,.45);background:none;text-align:left;padding:10px 14px;cursor:pointer;
  display:flex;flex-direction:column;gap:3px;transition:border-color .2s;min-width:0}
.cp-m:hover{border-color:var(--ink)}
.cp-m.cur{border:1.5px solid var(--ink)}
.cp-m.view:not(.cur){box-shadow:inset 0 0 0 1px var(--seal)}
.cp-m b{font-family:var(--serif-cn);font-weight:900;font-size:14px;letter-spacing:.06em;color:var(--ink)}
.cp-m .cp-mnet{font-family:var(--mono);font-size:13px;color:var(--seal)}
.cp-m .cp-mline{font-family:var(--mono);font-size:9px;letter-spacing:.1em;color:var(--gray);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cp-board :focus-visible{outline:2px solid var(--seal);outline-offset:2px}
.cp-day{cursor:pointer}
.cp-day.pulse{animation:cp-pulse .5s var(--ease)}
@keyframes cp-pulse{0%{box-shadow:inset 0 0 0 0 rgba(195,61,46,0)}30%{box-shadow:inset 0 0 0 3px var(--seal);background:rgba(195,61,46,.07)}100%{box-shadow:inset 0 0 0 0 rgba(195,61,46,0);background:transparent}}
/* —— 账本 · 当日全屏（点流水日卡进入 · 大字可操作） —— */
#cpModal .sheet-wrap{width:min(1240px,96vw);height:min(820px,92dvh)}
#cpModal .sheet-card{padding:clamp(22px,4vh,44px) clamp(24px,4vw,56px);display:flex;flex-direction:column;background:var(--paper);color:var(--ink);border-radius:8px;overflow:hidden;font-family:var(--sans-cn);transform:none}
#cpModal .sheet-x{width:32px;height:32px;top:-12px;right:-12px;font:20px var(--sans-cn)}
.cpd-head{flex:none;display:flex;justify-content:space-between;align-items:flex-end;gap:18px;flex-wrap:wrap;border-bottom:2px solid var(--ink);padding-bottom:clamp(12px,2vh,20px)}
.cpd-kick{font-family:var(--mono);font-size:9px;letter-spacing:.3em;color:var(--gray)}
.cpd-head h4{font-family:var(--serif-cn);font-weight:900;font-size:clamp(26px,4vw,44px);letter-spacing:.06em;margin-top:8px}
.cpd-sum{display:flex;gap:clamp(16px,2.4vw,30px);font-family:var(--mono);font-size:9.5px;letter-spacing:.16em;color:var(--gray);flex-wrap:wrap}
.cpd-sum b{display:block;font-family:var(--mono);font-size:clamp(15px,1.9vw,21px);margin-top:5px;color:var(--ink);letter-spacing:.02em}
.cpd-sum b.out{color:var(--seal)}
.cpd-list{flex:1;min-height:0;overflow:auto;padding:6px 2px}
.cpd-row{display:grid;grid-template-columns:1fr auto auto auto;gap:14px;align-items:center;padding:clamp(12px,1.8vh,18px) 2px;border-bottom:1px dashed rgba(12,12,13,.18)}
.cpd-row.mute{display:block;text-align:center;font-family:var(--hand);font-size:19px;color:var(--gray);padding:34px 0;border:0}
.cpd-main{font-family:var(--sans-cn);font-size:clamp(14px,1.6vw,17px);color:var(--ink);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cpd-row .cp-tag{font-family:var(--mono);font-size:9px;letter-spacing:.14em;border:1px solid rgba(12,12,13,.3);padding:3px 7px;white-space:nowrap;color:var(--gray)}
.cpd-row .cp-tag.auto{color:var(--ink);border-color:rgba(12,12,13,.5)}
.cpd-amt{font-family:var(--mono);font-size:clamp(13px,1.5vw,16px);white-space:nowrap;text-align:right}
.cpd-amt.in{color:var(--ink)}
.cpd-amt.out{color:var(--seal)}
.cpd-ops{display:flex;gap:6px}
.cpd-ops button{appearance:none;border:1px solid var(--seal);background:none;color:var(--seal);font-family:var(--mono);font-size:10px;letter-spacing:.1em;padding:5px 10px;cursor:pointer;transition:background .2s,color .2s;min-width:38px}
.cpd-ops button:hover{background:var(--seal);color:var(--paper)}
.cpd-ops button.arm{background:var(--seal);color:var(--paper)}
.cpd-foot{flex:none;display:flex;justify-content:space-between;align-items:center;gap:12px;border-top:1px solid rgba(12,12,13,.3);padding-top:clamp(10px,1.6vh,16px);margin-top:4px}
.cpd-foot button{appearance:none;border:1.5px solid var(--ink);background:var(--ink);color:var(--paper);font-family:var(--mono);font-size:11px;letter-spacing:.16em;padding:9px 18px;cursor:pointer;transition:background .25s,border-color .25s}
.cpd-foot button:hover{background:var(--seal);border-color:var(--seal)}
.cpd-foot .cpd-note{font-family:var(--mono);font-size:9px;letter-spacing:.2em;color:var(--gray)}
.cpd-form{flex:none}
/* iPad 全尺寸（横竖屏）：保持单行，固定列收窄给备注留位（日期/备注缩窄，间距均匀） */
@media(max-width:1280px) and (min-width:761px){
  .cp-form{grid-template-columns:auto 100px 150px 110px minmax(0,1fr) auto;gap:14px}
  .cp-form>label:nth-child(5) input{max-width:280px}
}
@media(max-width:760px){
  .cp-board{height:auto;min-height:0}
  .cp-cards{grid-template-columns:1fr 1fr}
  .cp-card.solde{grid-column:1/-1}
  .cp-days{max-height:460px;grid-template-columns:1fr}
  .cp-mgrid{max-height:300px;grid-template-columns:1fr;height:auto}
  .cp-form{grid-template-columns:1fr 1fr}
  .cp-fbtns{grid-column:1/-1}
  .cp-month b{min-width:0}
}
@media(prefers-reduced-motion:reduce){.cp-form{transition:none!important}}

#bkModal{padding:50px 20px 24px}
#bkModal .sheet-wrap{width:min(1240px,96vw);height:min(820px,90dvh)}
#bkModal .sheet-card{padding:0;display:flex;flex-direction:column;background:#fafafa;border-radius:8px;overflow:hidden;transform:none;font-family:var(--sans-cn)}
#bkModal *{letter-spacing:0}
#bkModal .sheet-x{width:32px;height:32px;top:-12px;right:-12px;font:20px var(--sans-cn)}
.cal-toolbar{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:24px 26px 16px;border-bottom:1px solid #e5e5e5}
.cal-brand{font-size:11px;color:#777}
#bkDTitle{font:600 26px/1.3 var(--sans-cn);margin-top:5px;color:#292929}
.cal-modes{display:flex;padding:3px;background:#ececee;border-radius:6px}
#bkModal button{font-family:var(--sans-cn)}
.cal-modes button,.cal-nav button{border:0;background:transparent;color:#555;font-size:13px;padding:6px 14px;border-radius:4px}
.cal-modes button[aria-pressed=true]{background:#fff;color:#111;box-shadow:0 1px 4px #0001}
.cal-nav{display:flex;align-items:center;border:1px solid #ddd;border-radius:5px;background:#fff}
.cal-nav button:first-child,.cal-nav button:last-child{font-size:23px;line-height:18px;padding:6px 10px}
.cal-subbar{display:flex;align-items:center;gap:18px;padding:10px 26px;color:#777;font-size:12px;border-bottom:1px solid #e3e3e3}
.cal-create{display:flex;gap:12px;margin-left:auto}
.cal-create button{border:0;background:none;color:var(--seal);font-size:12px;padding:7px 0}
.cal-surface{flex:1;min-height:0;overflow:auto;scrollbar-gutter:stable;background:#fff;overscroll-behavior:contain}
.cal-grid{min-width:700px;--days:7}
.cal-grid.is-day{min-width:0}
.cal-grid-head,.cal-all{display:grid;grid-template-columns:54px repeat(var(--days),minmax(0,1fr))}
.cal-grid-head{position:sticky;top:0;z-index:4;background:#fafafaf5;border-bottom:1px solid #ddd}
.cal-day-head{background:none;border:0;border-left:1px solid #eee;padding:9px 4px;color:#666;display:flex;align-items:center;justify-content:center;gap:8px;font-size:12px}
.cal-day-head b{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;font-size:20px;font-weight:500;border-radius:50%}
.cal-day-head.today b{background:var(--seal);color:white}
.cal-day-head.selected:not(.today){background:#eeeff1}
.cal-corner{font-size:10px;color:#999;align-self:center;text-align:center}
.cal-all{position:sticky;top:49px;z-index:3;border-bottom:1px solid #ddd;min-height:40px;max-height:130px;overflow:auto;background:#fbfbfc}
.cal-all-col{border-left:1px solid #eee;padding:4px;min-width:0}
.cal-all-event{display:block;width:100%;padding:5px 6px;margin-bottom:3px;border:0;border-left:3px solid var(--event);background:var(--tint);text-align:left;color:#333;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:3px}
.cal-timeline{display:grid;grid-template-columns:54px repeat(var(--days),minmax(0,1fr));height:1524px}
.cal-hours{position:relative;background:#fafafa}
.cal-hours span{position:absolute;right:8px;font-size:10px;color:#999;transform:translateY(-50%)}
.cal-hours span:first-child{transform:none}
.cal-column{position:relative;border-left:1px solid #e8e8e8;background:repeating-linear-gradient(to bottom,#e7e7e7 0 1px,transparent 1px 30px,#f3f3f3 30px 31px,transparent 31px 60px);min-width:0}
.cal-column.today{background-color:#fffdfa}
.cal-arrival{position:absolute;height:88px;padding:5px 6px 16px;border:0;border-top:3px solid var(--event);border-radius:4px 4px 0 0;background:linear-gradient(to bottom,var(--tint) 0%,var(--tint) 48%,transparent 100%);text-align:left;overflow:hidden;color:#242424;z-index:2;min-width:0}
.cal-arrival time{display:block;font-size:10px;color:var(--event);line-height:15px}
.cal-arrival strong{display:block;font-size:12px;line-height:18px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cal-arrival small{display:block;font-size:10px;line-height:15px;color:#666;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cal-arrival:focus-visible,.cal-all-event:focus-visible{outline:2px solid var(--event);outline-offset:1px}
.cal-now{position:absolute;left:0;right:0;height:1px;background:#dc4b42;pointer-events:none;z-index:3}
.cal-now::before{content:'';position:absolute;left:-4px;top:-3px;width:7px;height:7px;border-radius:50%;background:#dc4b42}
.cal-month-week,.cal-month-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr))}
.cal-month-week{position:sticky;top:0;z-index:4;background:#fafafa;border-bottom:1px solid #ddd;text-align:center;font-size:11px;color:#888;padding:12px 0}
.cal-month-day{min-height:110px;border-right:1px solid #eee;border-bottom:1px solid #eee;padding:7px;min-width:0}
.cal-month-day.outside{background:#f8f8f8;color:#aaa}
.cal-month-date{border:0;background:none;font-size:13px;width:28px;height:28px;margin-bottom:5px;border-radius:50%}
.cal-month-day.today .cal-month-date{background:var(--seal);color:white}
#bkModal .bk-form{position:absolute;right:18px;top:105px;width:min(360px,calc(100% - 36px));z-index:10;background:#fff;border:1px solid #ddd;box-shadow:0 12px 45px #0003;border-radius:8px;padding:24px 18px 18px;grid-template-columns:68px 1fr;gap:13px 10px;max-height:calc(100% - 120px);overflow:auto}
#bkModal .bk-form label{font:12px var(--sans-cn);color:#666}
#bkModal .bk-form input,#bkModal .bk-form select{background:#fafafa;border:1px solid #ddd;border-radius:4px;padding:8px}
#bkModal .bk-fmode{font:600 15px var(--sans-cn);padding-right:18px;margin-bottom:6px}
.cal-form-close{position:absolute;right:9px;top:8px;background:none;border:0;color:#888;font-size:22px}
.cal-form-actions{display:flex;align-items:center;gap:15px}
#calDelete{background:none;border:0;color:var(--seal);font-size:12px}
.cal-save-status:empty{display:none}
.cal-save-status{font-size:12px;color:var(--seal);padding:8px 24px}
/* 预约日历的保存/读取提示沿用这一行，只多一个文本操作按钮（重试 / 重新确认 / 重新读取）；
   保存未确认或日程尚未读全时，提交按钮不可重复提交。收起时 :empty 不占位。 */
.cal-save-status button{appearance:none;border:0;background:none;color:var(--seal);font-size:12px;padding:0;margin-left:10px;text-decoration:underline;cursor:pointer}
#bkSave:disabled,#calDelete:disabled{opacity:.55;cursor:default}
@media(max-width:700px){
 #bkModal{padding:14px 8px}#bkModal .sheet-wrap{width:100%;height:94dvh}#bkModal .sheet-x{top:8px;right:8px;width:28px;height:28px;z-index:12}
 .cal-toolbar{padding:18px 42px 12px 16px;gap:10px;flex-wrap:wrap}.cal-toolbar>div:first-child{width:100%}#bkDTitle{font-size:22px}
 .cal-subbar{padding:8px 16px;gap:8px;flex-wrap:wrap}.cal-create{gap:10px}.cal-create button{font-size:11px}
 #bkDCount{display:none}.cal-nav{margin-left:auto}.cal-modes button{padding:5px 12px}
 .cal-month-day{padding:3px;min-height:96px}.cal-month-day .cal-all-event{font-size:9px;padding:3px}
 #bkModal .bk-form{top:165px;max-height:calc(100% - 180px)}
}
/* Official holiday labels and date selection before opening the calendar. */
.bk-cell{transition:background .16s ease,box-shadow .16s ease}
.bk-cell.selected{background:rgba(195,61,46,.10);box-shadow:inset 0 0 0 2px var(--seal)}
.bk-cell.selected .d{color:var(--seal);text-decoration:none;font-weight:700}
.bk-cell:focus-visible{outline:2px solid var(--seal);outline-offset:-3px}
.holiday-label{display:flex;align-items:center;gap:3px;min-width:0;font:9px/1.5 var(--sans-cn);color:#727272;letter-spacing:0;margin:2px 0}
.holiday-label i{display:inline-flex;align-items:center;justify-content:center;flex:none;width:13px;height:13px;border:1px solid #9996;border-radius:2px;background:#3333330a;color:#606060;font-style:normal;font-size:8px;line-height:1}
.holiday-label>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.holiday-label.workday{color:#7a7a7a}.holiday-label.workday i{background:transparent;color:#777;border-color:#aaa6}
#bkModal .cal-day-head{height:70px;display:grid;grid-template-columns:auto auto;grid-template-rows:30px 18px;gap:0 8px;align-content:center}
#bkModal .cal-day-head .holiday-label{grid-column:1/-1;justify-content:center;margin:0}
#bkModal .cal-all{top:70px}
#bkModal .cal-day-head.selected{background:#f9ece9;box-shadow:inset 0 -3px 0 var(--seal)}
#bkModal .cal-day-head.selected:not(.today) b{background:#c33d2e;color:white}
#bkModal .cal-month-day.selected{box-shadow:inset 0 0 0 2px var(--seal);background:#fff5f2}
#bkModal .sheet-card{transition:opacity .28s ease,transform .28s ease;transform:translateY(12px)}
#bkModal.open .sheet-card{transform:translateY(0)}
@media(max-width:700px){.bk-cell .holiday-label{font-size:9px;gap:2px;flex-wrap:wrap}.bk-cell .holiday-label i{width:12px;height:12px;font-size:8px}}
@media(prefers-reduced-motion:reduce){.bk-cell,#bkModal .sheet-card,#bkModal .sheet-scrim{transition:none!important}}
.bk-cell{min-width:0;overflow:hidden;height:clamp(88px,11.5vh,150px)}
.bk-evs{overflow:hidden}.bk-ev{font-size:10px;line-height:18px;height:18px;min-width:0;font-weight:500}
.cal-month-day{position:relative;height:clamp(88px,11.5vh,150px);overflow:hidden}
.cal-month-day .cal-month-date.more{position:absolute;right:5px;bottom:2px;z-index:2;width:auto;height:auto;margin:0;
  font-size:10px;color:#888;background:#fff;padding:1px 7px;border-radius:999px;box-shadow:0 0 0 3px #fff}
.cal-md-evs{display:block;overflow:hidden}
.cal-month-day .cal-all-event{height:22px;line-height:16px;padding:3px 4px}
.cal-arrival.is-duration{background:var(--tint);border-left:3px solid var(--event);border-top:0;border-bottom:1px solid var(--event);border-radius:3px;padding-bottom:2px}
.cal-arrival.is-short{padding:1px 4px;display:flex;gap:4px;align-items:center}
.cal-arrival.is-short time{flex:none;font-size:9px}.cal-arrival.is-short strong{font-size:10px}.cal-arrival.is-short small{display:none}
#bkModal .bk-form .end-fields{display:none}
#bkModal .bk-form.mode-p .end-fields{display:contents}
#bkModal .bk-form textarea{font:13px/1.5 var(--sans-cn);min-width:0;width:100%;min-height:70px;resize:vertical;max-height:160px;border:1px solid #ddd;border-radius:4px;padding:8px;background:#fafafa}
@media(max-width:700px){.bk-cell{height:110px}.bk-ev{font-size:9px}.cal-month-day{height:110px}}
/* Compact poster: the calendar receives the remaining viewport height. */
#booking{padding:70px 0 20px;scroll-margin-top:0}
.bk-poster{width:min(1080px,96vw);height:min(900px,calc(100svh - 114px));min-height:480px;padding:32px 28px 12px;display:flex;flex-direction:column;transform:none}
.bk-mast{flex:none;gap:12px;flex-wrap:nowrap;padding-bottom:8px}
.bk-month{font-size:28px;flex:none}.bk-month .cn{margin-top:4px}
.bk-bar{flex:none;padding:8px 0 6px;gap:6px}
.bk-bar-btns{gap:6px}.bk-nav{font-size:10px;padding:4px 10px;letter-spacing:0}
.bk-week{flex:none;padding:6px 0;line-height:12px}
.bk-cal{flex:1;min-height:0;grid-template-rows:repeat(var(--weeks,5),minmax(0,1fr))}
.bk-cell{height:auto;min-height:0;padding:4px 5px;display:flex;flex-direction:column;gap:2px}
.bk-date-head{display:flex;align-items:center;gap:5px;height:20px;flex:none;min-width:0;overflow:hidden}
.bk-cell .d{font-size:14px;line-height:20px;flex:none}
.bk-cell .m{display:none}
.bk-date-head .holiday-label{margin:0;font-size:9px;flex-wrap:nowrap;gap:2px}
.bk-date-head .holiday-label i{width:11px;height:11px;font-size:8px}
.bk-cell.today::before{width:26px;height:23px;top:2px;left:1px;border-width:1px}
.bk-evs{margin:0;gap:2px;flex:none}
.bk-ev{height:15px;line-height:15px;font-size:10px;padding:0 3px;border-left-width:2px;flex:none;letter-spacing:0}
.bk-evs.has-more,.cal-md-evs.has-more{mask-image:none;-webkit-mask-image:none}
.bk-more{position:static;display:block;align-self:flex-start;line-height:12px;height:12px;font-size:9px;font-weight:400;letter-spacing:0;background:none;padding:0;border-radius:0;box-shadow:none;color:#777}
.bk-foot{flex:none;padding-top:8px;gap:6px;font-size:8px;line-height:12px;letter-spacing:0}
#bkModal .cal-month-day .more{position:static;width:auto;height:auto;min-height:0;background:none;box-shadow:none;border:0;border-radius:0;padding:0;font:10px/14px var(--sans-cn);color:#777}
@media(max-width:700px){
 .bk-poster{padding:22px 10px 12px;min-height:560px}.bk-mast h3{font-size:25px}.bk-month{font-size:22px}
 .bk-bar-btns{gap:4px}.bk-nav{font-size:9px;padding:4px 6px}.bk-title-sm{font-size:9px;letter-spacing:0}.bk-foot>span:not(:first-child){display:none}
 .bk-cell{padding:3px 2px}.bk-date-head{gap:2px}.bk-date-head .holiday-label{font-size:8px}.bk-ev{font-size:9px}.bk-date-head .holiday-label>span{max-width:30px}
}
/* Keep the writing surface and receipts together inside tablet viewports. */
#darkroom{width:100%;margin-left:0;scroll-margin-top:64px;display:grid;grid-template-columns:minmax(0,1fr) 250px;grid-template-rows:16px minmax(0,1fr) 16px;column-gap:24px;height:min(820px,calc(100svh - 84px));min-height:620px;padding:0 24px;box-sizing:border-box}
#darkroom>.dk-holes{grid-column:1/-1}
#darkroom .darkroom-typewriter{grid-column:1;grid-row:2;width:100%;height:100%;min-width:0;min-height:0}
#darkroom .fb-wall{grid-column:2;grid-row:2;width:100%;min-width:0;min-height:0;margin:0;padding:32px 0 14px;display:flex;flex-direction:column;gap:16px;opacity:1;transform:none}
#darkroom .fb-wall-kick{font-size:9px;letter-spacing:0;line-height:1.6;color:#9c978d}
#darkroom .fb-wall-list{flex:1;min-height:0;display:flex;flex-direction:column;gap:16px;overflow-y:auto;overflow-x:hidden;padding:5px 6px 12px;scrollbar-width:thin;scrollbar-color:#555 transparent;overscroll-behavior:contain}
#darkroom .fb-card{width:100%;min-width:0;max-width:none;box-sizing:border-box;padding:14px 13px 11px;flex:none}
#darkroom .fb-card .t{-webkit-line-clamp:5;font-size:16px}
#darkroom .fb-owner{margin:0;align-self:stretch;flex:none;width:100%;min-height:46px;padding:11px 8px;border:1px solid #8a6d3f;border-radius:4px;background:#8a6d3f26;color:#d9c9a4;font-size:12px;letter-spacing:.14em;transition:background .25s,color .25s}
#darkroom .fb-owner:hover{background:#8a6d3f45;color:#f2e4c2}
#darkroom .fb-owner:focus-visible{outline:2px solid var(--paper);outline-offset:3px}
@media(min-width:740px) and (max-width:900px){#darkroom{grid-template-columns:minmax(0,1fr) 210px;column-gap:16px;padding:0 14px}}
@media(max-width:739px){
 #darkroom{height:auto;min-height:0;grid-template-columns:minmax(0,1fr);grid-template-rows:16px 620px 220px 16px;padding:0 12px;gap:0}
 #darkroom .darkroom-typewriter{grid-column:1;grid-row:2}
 #darkroom .fb-wall{grid-column:1;grid-row:3;padding:8px 0;gap:8px}
 #darkroom .fb-wall-list{flex-direction:row;overflow-x:auto;overflow-y:hidden;gap:12px}
 #darkroom .fb-card{width:220px}.fb-card .t{-webkit-line-clamp:3}
}
#darkroom{grid-template-columns:minmax(0,1fr) 144px;column-gap:16px}
#darkroom .fb-wall-list{gap:10px;flex:0 1 auto}
#darkroom .fb-owner{margin-top:auto}
#fbSubmit{flex:none;width:100%;min-height:44px;border:1px solid #bdb29c66;border-radius:4px;background:#eee6d714;color:#e5dcc8;font:13px/22px var(--sans-cn);padding:10px 6px}
#fbSubmit:hover{background:#eee6d724}
#fbSubmit:focus-visible{outline:2px solid var(--paper);outline-offset:3px}
#darkroom .fb-card{height:90px;padding:10px;border:0;text-align:left}
#darkroom .fb-card .t{font-size:14px;line-height:1.45;-webkit-line-clamp:2}
#darkroom .fb-card .m{font-size:8px;letter-spacing:0}
#darkroom .fb-card .m>span:last-child{display:none}
#darkroom .fb-card:focus-visible{outline:2px solid var(--paper);outline-offset:3px}
.fb-reader{position:fixed;inset:0;margin:auto;width:min(460px,calc(100vw - 40px));max-height:80dvh;padding:32px;border:1px solid #9a978c;border-radius:6px;background:var(--paper);color:var(--ink);box-shadow:0 20px 80px #0008}
.fb-reader::backdrop{background:#080809b3}
.fb-reader header{display:flex;align-items:center;justify-content:space-between;gap:16px;font:11px var(--mono);color:#777}
.fb-reader button{border:0;background:none;font:24px/1 var(--sans-cn);padding:8px;color:#555}
.fb-reader p{font:22px/1.8 var(--hand);white-space:pre-wrap;overflow-wrap:anywhere;margin:20px 0}
@media(min-width:740px) and (max-width:900px){#darkroom{grid-template-columns:minmax(0,1fr) 132px;column-gap:12px}}
@media(max-width:739px){#darkroom{grid-template-columns:minmax(0,1fr);grid-template-rows:16px 620px 230px 16px}#darkroom .fb-card{width:144px}#darkroom .fb-wall-list{min-height:106px}#fbSubmit{width:144px;align-self:flex-end}#darkroom .fb-owner{width:144px;align-self:flex-end;font-size:11px}}


/* ---------- 酒单管理入口（酒单区角落的小字入口，非真实鉴权） ---------- */
.menu-head .menu-admin{appearance:none;background:none;
  border:1px solid rgba(240,237,230,.32);color:rgba(240,237,230,.66);font-family:var(--mono);font-size:9px;
  letter-spacing:.18em;padding:7px 12px;cursor:pointer;transition:color .3s var(--ease),border-color .3s var(--ease)}
.menu-head .menu-admin:hover{color:rgba(240,237,230,.95);border-color:rgba(240,237,230,.7)}
.menu-head .menu-admin:focus-visible{outline:2px solid rgba(240,237,230,.8);outline-offset:2px}

/* ---------- 酒单管理浮窗 — 纸面表格，沿用档案浮窗的版式语言 ---------- */
#maModal .sheet-wrap{width:min(1080px,96vw);height:min(760px,92dvh)}
/* --ma-gutter：滚动条让位。纸面右内边距之外再留这一档，滚动条与滑块都落在这里，
   内容（表头横线、表单控件、页脚横线）统一收在同一条右缘上。 */
.ma-card{width:100%;max-height:100%;display:flex;flex-direction:column;background:var(--paper);color:var(--ink);
  --ma-gutter:16px;
  border-radius:8px;overflow:hidden;padding:clamp(16px,3vh,30px) clamp(16px,3vw,36px);font-family:var(--sans-cn);transform:none}
.ma-head{flex:none;display:flex;justify-content:space-between;align-items:flex-end;gap:16px;flex-wrap:wrap;
  margin-right:calc(var(--ma-gutter,16px) + var(--ma-sb,0px));
  border-bottom:2px solid var(--ink);padding-bottom:clamp(8px,1.4vh,14px)}
.ma-kick{font-family:var(--mono);font-size:9px;letter-spacing:.28em;color:var(--gray)}
.ma-head h4{font-family:var(--serif-cn);font-weight:900;font-size:clamp(19px,2.4vw,28px);letter-spacing:.06em;margin-top:5px}
.ma-sum{display:flex;gap:16px;font-family:var(--mono);font-size:9px;letter-spacing:.14em;color:var(--gray);flex-wrap:wrap}
.ma-sum b{font-size:15px;color:var(--ink);margin:0 2px;letter-spacing:.02em}
.ma-body{flex:1;min-height:0;display:grid;grid-template-columns:minmax(210px,290px) minmax(0,1fr);
  grid-template-rows:minmax(0,1fr);
  gap:clamp(12px,2vw,26px);padding:clamp(10px,2vh,18px) 0;overflow:hidden}
.ma-side{display:flex;flex-direction:column;min-height:0;border-right:1px dashed rgba(12,12,13,.18);
  padding-right:clamp(8px,1.4vw,16px)}
.ma-side-head{flex:none;display:flex;justify-content:space-between;align-items:center;gap:10px;
  font-family:var(--mono);font-size:9px;letter-spacing:.18em;color:var(--gray);
  padding-bottom:8px;border-bottom:1px solid rgba(12,12,13,.14)}
.ma-side-head button{appearance:none;border:1px solid var(--ink);background:var(--ink);color:var(--paper);
  font-family:var(--mono);font-size:9.5px;letter-spacing:.12em;padding:6px 10px;cursor:pointer}
.ma-side-head button:disabled{opacity:.5;cursor:default}
/* 右侧留出滚动条的地盘：不留则行尾（价格、停用标签）会压在滑块上 */
.ma-list{flex:1;min-height:0;overflow:auto;padding:2px 12px 8px 2px}
.ma-group-head{display:flex;justify-content:space-between;font-family:var(--mono);font-size:9px;
  letter-spacing:.2em;color:var(--gray);margin:14px 2px 6px}
.ma-group-head i{font-style:normal}
.ma-row{display:grid;grid-template-columns:36px minmax(0,1fr) auto auto;gap:8px;align-items:baseline;width:100%;
  appearance:none;background:none;border:0;border-bottom:1px dotted rgba(12,12,13,.16);padding:9px 2px;
  text-align:left;cursor:pointer;color:var(--ink);font-family:inherit}
.ma-row:hover{background:rgba(12,12,13,.045)}
.ma-row.sel{background:rgba(195,61,46,.08)}
.ma-row .no{font-family:var(--mono);font-size:10px;color:var(--gray);letter-spacing:.08em}
.ma-row .nm{font-size:13px;letter-spacing:.04em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ma-row .pr{font-family:var(--mono);font-size:11px}
.ma-row .tag{font-family:var(--mono);font-size:8.5px;letter-spacing:.12em;color:var(--seal);
  border:1px solid rgba(195,61,46,.45);padding:1px 5px;white-space:nowrap}
.ma-row.off{opacity:.62}
.ma-row.off .nm{text-decoration:line-through;text-decoration-color:rgba(12,12,13,.35)}
/* 分类下拉旁的新建入口：与下拉同一行，不额外占表单高度 */
.ma-cat-row{display:flex;gap:6px;align-items:center}
.ma-cat-row select{flex:1;min-width:0}
.ma-cat-row button{flex:none;appearance:none;border:1px dashed rgba(12,12,13,.4);background:none;color:var(--ink);
  font-family:var(--mono);font-size:9px;letter-spacing:.1em;padding:7px 8px;cursor:pointer}
.ma-cat-row button:hover:not(:disabled){background:rgba(12,12,13,.05)}
.ma-cat-row button:disabled{opacity:.45;cursor:default}
/* 新分类命名行：建好即选中，取消不留痕 */
.ma-cat-new{display:flex;gap:6px;align-items:center;grid-column:1/-1}
.ma-cat-new[hidden]{display:none}
.ma-cat-new input{flex:1;min-width:0}
.ma-cat-new button{flex:none;appearance:none;border:1px solid var(--ink);background:none;color:var(--ink);
  font-family:var(--mono);font-size:9px;letter-spacing:.1em;padding:7px 10px;cursor:pointer}
.ma-cat-new button:disabled{opacity:.45;cursor:default}
/* 列表一行 = 酒款按钮 + 两个调序按钮（并列，不嵌套） */
/* 行本身就是唯一的把手：点按看详情，按住 400ms 抬起后拖动换位。
   touch-action 只放开纵向——轻扫仍然滚列表；长按成功后才由行为层拦滚动。
   拖动时插到哪一行，那一行的上沿就压一道印章红。 */
.ma-row{position:relative;touch-action:pan-y;-webkit-user-drag:none}
.ma-row.lift{background:rgba(12,12,13,.075);box-shadow:0 6px 16px rgba(12,12,13,.16);
  outline:1px solid rgba(12,12,13,.28);outline-offset:-1px;z-index:2}
.ma-row.drop::before{content:"";position:absolute;left:0;right:0;top:-1px;height:2px;background:var(--seal)}
.ma-list.ma-dragging{cursor:grabbing;user-select:none;-webkit-user-select:none}
.ma-list.ma-dragging .ma-row{cursor:grabbing}
.ma-list.ma-dragging .ma-row:hover{background:none}
.ma-none{font-family:var(--mono);font-size:9.5px;letter-spacing:.14em;color:var(--gray);padding:8px 2px}
/* 操作行随宽度换行、高度不是常数，实测高度由行为层写进 --ma-bar-h（桌面 ≈50px，
   窄屏折两行 ≈90px）。滚动区按它预留位置：末行被聚焦时浏览器不会把字段滚到操作行底下。 */
/* 右侧让位用 --ma-gutter：原来只有 4px，输入框右缘几乎贴着滑块，整块内容看上去往右顶。
   scrollbar-gutter 让滚动条的位置常驻，表单变长变短时右缘不会跳。 */
.ma-main{min-width:0;min-height:0;overflow:auto;padding-right:var(--ma-gutter,16px);
  scrollbar-gutter:stable;
  scroll-padding-bottom:calc(var(--ma-bar-h, 0px) + 14px)}
.ma-hint{font-family:var(--hand);font-size:18px;line-height:1.8;color:var(--gray);padding:18px 0}
.ma-hint[hidden]{display:none}
.ma-form{display:flex;flex-direction:column;gap:clamp(9px,1.4vh,14px)}
.ma-form[hidden]{display:none}
.ma-fields{display:flex;flex-direction:column;gap:inherit;min-height:0}
.ma-form-head{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;
  border-bottom:1px solid rgba(12,12,13,.18);padding-bottom:8px}
.ma-form-head b{display:block;font-family:var(--serif-cn);font-weight:900;font-size:clamp(15px,1.9vw,21px);letter-spacing:.05em}
.ma-form-head span{display:block;font-family:var(--mono);font-size:9px;letter-spacing:.14em;color:var(--gray);margin-top:4px}
.ma-retire{flex:none;appearance:none;border:1px solid rgba(195,61,46,.55);background:none;color:var(--seal);
  font-family:var(--mono);font-size:9.5px;letter-spacing:.12em;padding:7px 12px;cursor:pointer;white-space:nowrap}
.ma-retire.on{border-color:rgba(12,12,13,.45);color:var(--ink)}
.ma-retire[hidden]{display:none}
.ma-retire:disabled{opacity:.5;cursor:default}
.ma-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:9px 12px}
.ma-grid label{display:flex;flex-direction:column;gap:4px;font-family:var(--mono);font-size:9px;
  letter-spacing:.14em;color:var(--gray);min-width:0}
.ma-grid label.wide{grid-column:1 / -1}
.ma-grid input,.ma-grid select,.ma-spec-row input{border:1px solid rgba(12,12,13,.3);background:rgba(255,255,255,.6);
  color:var(--ink);font-family:var(--sans-cn);font-size:13px;padding:8px 9px;min-width:0;width:100%}
.ma-grid input:focus,.ma-grid select:focus,.ma-spec-row input:focus{border-color:var(--seal);outline:none}
.ma-grid input:disabled,.ma-grid select:disabled,.ma-spec-row input:disabled{background:rgba(12,12,13,.05);
  color:rgba(12,12,13,.5);cursor:not-allowed}
.ma-spec{display:flex;flex-direction:column;gap:6px}
.ma-spec-k{font-family:var(--mono);font-size:9px;letter-spacing:.14em;color:var(--gray)}
.ma-spec-rows{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px 14px}
.ma-spec-row{display:grid;grid-template-columns:84px minmax(0,1fr);gap:8px;align-items:center;min-width:0}
.ma-spec-row span{font-family:var(--mono);font-size:9px;letter-spacing:.1em;color:var(--gray);white-space:nowrap}
.ma-spec-num{position:relative;min-width:0}
.ma-spec-num input{padding:8px 46px 8px 20px;text-align:center}
.ma-spec-num i{position:absolute;top:50%;transform:translateY(-50%);font-style:normal;
  font-family:var(--mono);font-size:9.5px;letter-spacing:.04em;color:var(--gray);pointer-events:none}
.ma-abv-pre{left:9px}
.ma-abv-suf{right:9px}
.ma-photo{flex:none;min-height:18px}
.ma-plate{display:flex;gap:10px;align-items:center;margin:0}
.ma-plate img{width:58px;height:58px;object-fit:cover;border:1px solid rgba(12,12,13,.22)}
.ma-plate figcaption{font-family:var(--mono);font-size:9px;letter-spacing:.12em;color:var(--gray)}
.ma-nophot{font-family:var(--mono);font-size:9px;letter-spacing:.12em;color:var(--gray)}
.ma-photo-bar{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px}
.ma-photo-bar button{appearance:none;background:none;border:1px solid rgba(12,12,13,.4);color:var(--ink);font-family:var(--mono);font-size:9.5px;letter-spacing:.12em;padding:6px 10px;cursor:pointer}
.ma-photo-bar button:disabled{opacity:.5;cursor:default}
/* ---------- 宽屏（≥900，含 iPad 横屏）：实拍图升为左栏主角 ----------
   「档案文案」栏已删。版式改为双列：左列 = 实拍图大预览 + 选图/清除；
   右列 = 基本信息（两列输入）→ 配料 → 规格表；确认条与警示条通栏。
   单款酒的全部编辑内容与「保存 / 取消」落在一屏内，不再靠滚动硬塞。 */
@media (min-width:900px){
  .ma-fields{display:grid;grid-template-columns:minmax(250px,330px) minmax(0,1fr);
    grid-template-areas:"photo head" "photo fields" "photo spec" "confirm confirm" "alert alert";
    gap:12px 24px;align-items:start}
  .ma-form-head{grid-area:head}
  .ma-grid{grid-area:fields;grid-template-columns:repeat(2,minmax(0,1fr))}
  .ma-grid label.wide{grid-column:1 / -1}
  .ma-spec{grid-area:spec}
  .ma-confirm{grid-area:confirm}
  .ma-alert{grid-area:alert}
  .ma-photo{grid-area:photo;align-self:stretch;display:flex;flex-direction:column;gap:8px}
  .ma-plate{flex:1;display:flex;flex-direction:column;justify-content:center;gap:10px;margin:0;
    border:1px solid rgba(12,12,13,.22);background:rgba(255,255,255,.55);padding:14px;min-height:260px}
  .ma-plate img{width:100%;height:auto;max-height:min(36vh,320px);object-fit:contain}
  .ma-plate figcaption{text-align:center}
  .ma-nophot{flex:1;display:flex;align-items:center;justify-content:center;text-align:center;line-height:2;
    min-height:260px;border:1px dashed rgba(12,12,13,.3);background:rgba(255,255,255,.4);padding:14px}
  .ma-photo-bar{margin-top:0}
  .ma-photo-bar button{padding:8px 12px}
}

.ma-confirm,.ma-alert{display:flex;gap:10px;align-items:center;flex-wrap:wrap;padding:9px 12px;
  border:1px solid rgba(195,61,46,.4);background:rgba(195,61,46,.06);
  font-family:var(--mono);font-size:9.5px;letter-spacing:.08em;color:var(--seal);line-height:1.7}
.ma-confirm[hidden],.ma-alert[hidden]{display:none}
.ma-confirm button,.ma-alert button{appearance:none;border:1px solid rgba(195,61,46,.55);background:none;
  color:var(--seal);font-family:var(--mono);font-size:9.5px;letter-spacing:.1em;padding:6px 10px;
  cursor:pointer;white-space:nowrap}
/* 动作行贴在滚动区底边：表单再长（长文案、多行规格表）也不必滚到最底才够得到「保存」 */
.ma-actions{display:flex;gap:10px;align-items:center;flex-wrap:wrap;
  position:sticky;bottom:0;z-index:3;background:var(--paper);
  border-top:1px dashed rgba(12,12,13,.18);padding:10px 0 2px}
.ma-actions button[type="submit"]{appearance:none;background:var(--ink);color:var(--paper);border:1px solid var(--ink);
  font-family:var(--mono);font-size:10px;letter-spacing:.16em;padding:10px 20px;cursor:pointer}
.ma-actions button[type="submit"]:disabled{opacity:.55;cursor:default}
.ma-actions #maCancel{appearance:none;background:none;border:1px solid rgba(12,12,13,.4);color:var(--ink);
  font-family:var(--mono);font-size:10px;letter-spacing:.16em;padding:10px 16px;cursor:pointer}
.ma-actions #maCancel:disabled{opacity:.5;cursor:default}
.ma-status{font-family:var(--mono);font-size:9.5px;letter-spacing:.1em;color:var(--gray)}
.ma-status.ok{color:var(--ink)}
.ma-status.err{color:var(--seal)}
.ma-foot{flex:none;display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;
  margin-right:calc(var(--ma-gutter,16px) + var(--ma-sb,0px));
  border-top:1px solid rgba(12,12,13,.16);padding-top:10px}
.ma-note{font-family:var(--mono);font-size:8.5px;letter-spacing:.1em;color:var(--gray)}
.ma-sync{display:flex;gap:10px;align-items:center;font-family:var(--mono);font-size:9px;
  letter-spacing:.08em;color:var(--seal);line-height:1.6}
.ma-sync[hidden]{display:none}
.ma-sync button{appearance:none;border:1px solid rgba(195,61,46,.55);background:none;color:var(--seal);
  font-family:var(--mono);font-size:9.5px;letter-spacing:.1em;padding:6px 10px;cursor:pointer;white-space:nowrap}
@media(max-width:900px){
  #maModal .sheet-wrap{width:min(680px,96vw);height:min(92dvh,920px)}
  /* 窄屏改为自然堆叠：整块内容由 .ma-body 统一滚动，表单不会被列表挤成 0 高，
     动作行 sticky 到可见底边，竖屏也能直接按到「保存」 */
  .ma-body{display:block;grid-template-columns:none;grid-template-rows:none;overflow:auto;padding-top:10px;
    scrollbar-gutter:stable;
    scroll-padding-bottom:calc(var(--ma-bar-h, 0px) + 14px)}
  /* 窄屏由 .ma-body 滚动，右侧同样要给滚动条让位（原来是 0，控件贴到滑块上） */
  .ma-main{overflow:visible}
  .ma-card{--ma-gutter:14px}
  .ma-side{border-right:0;border-bottom:1px dashed rgba(12,12,13,.18);padding-right:0;padding-bottom:10px;max-height:38%}
  .ma-list{max-height:32%}
  .ma-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .ma-spec-rows{grid-template-columns:1fr}
  .ma-head h4{font-size:clamp(18px,3.4vw,24px)}
}
@media(max-width:520px){
  .ma-grid{grid-template-columns:1fr}
  .ma-card{padding:14px 14px 12px}
  #maModal .sheet-wrap{height:94dvh;width:96vw}
}

/* ---------- 画廊：管理入口、进度条命中区、放大层 ---------- */
.gal-head-side{display:flex;align-items:baseline;gap:18px}
.gal-admin{appearance:none;background:none;border:1px solid rgba(240,237,230,.32);color:rgba(240,237,230,.66);
  font-family:var(--mono);font-size:9px;letter-spacing:.18em;padding:7px 12px;cursor:pointer;white-space:nowrap;
  transition:color .3s var(--ease),border-color .3s var(--ease)}
.gal-admin:hover{color:rgba(240,237,230,.95);border-color:rgba(240,237,230,.7)}
.gal-admin:focus-visible{outline:2px solid rgba(240,237,230,.8);outline-offset:2px}
@media(max-width:900px){
  /* 窄屏：入口折到标题下面一行，标题不再被右侧挤成两行。 */
  .gal-head{flex-wrap:wrap;row-gap:10px}
  .gal-head-side{width:100%;flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}
}
/* 外观仍是 1px 细线；命中区高 28px、完全透明，只接受按住，不跳转也不拖拽。页脚删掉后贴块底。 */
.gal-prog{position:absolute;bottom:0;left:clamp(20px,5vw,64px);right:clamp(20px,5vw,64px);height:28px;
  background:none;touch-action:none}
.gal-prog::before{content:'';position:absolute;left:0;right:0;top:50%;height:1px;transform:translateY(-50%);
  background:rgba(240,237,230,.14)}
.gal-prog i{position:absolute;left:0;top:50%;transform:translateY(-50%);display:block;height:1px;
  background:var(--paper);width:0}
.gal-miss{display:block;width:min(300px,60vw);height:min(56vh,520px);border:1px dashed rgba(240,237,230,.22);
  background:rgba(240,237,230,.05)}
@media(max-width:700px),(max-height:640px){.gal-miss{height:min(44vh,400px)}}

.gal-light{position:fixed;inset:0;z-index:8400;display:flex;align-items:center;justify-content:center;
  opacity:0;visibility:hidden;pointer-events:none;transition:opacity .3s ease}
.gal-light.open{opacity:1;visibility:visible;pointer-events:auto}
.gal-light-scrim{position:absolute;inset:0;background:rgba(6,6,7,.94)}
.gal-light-fig{position:relative;z-index:2;margin:0;display:flex;flex-direction:column;align-items:center;
  gap:12px;max-width:min(1200px,92vw);max-height:92vh}
.gal-light-fig img{max-width:100%;max-height:72vh;width:auto;height:auto;object-fit:contain;
  filter:none;box-shadow:0 18px 60px rgba(0,0,0,.55)}
.gal-light-fig figcaption{min-width:min(420px,80vw);color:var(--paper);font-family:var(--mono)}
.gal-light-k{font-size:9px;letter-spacing:.3em;color:var(--gray)}
.gal-light-cap{display:flex;justify-content:space-between;gap:24px;font-size:9.5px;letter-spacing:.2em;
  margin-top:8px;color:rgba(240,237,230,.78)}
.gal-light-meta{margin-top:6px;font-size:9px;letter-spacing:.26em;color:var(--gray);text-align:right}
.gal-light-x{position:absolute;top:22px;right:26px;z-index:3;width:44px;height:44px;border-radius:50%;
  border:1px solid rgba(240,237,230,.4);background:rgba(12,12,13,.5);color:var(--paper);
  font:22px/1 var(--sans-cn);cursor:pointer}
.gal-light-nav{position:absolute;top:50%;transform:translateY(-50%);z-index:3;width:44px;height:64px;
  border:0;background:none;color:rgba(240,237,230,.62);font:30px/1 var(--sans-cn);cursor:pointer}
.gal-light-nav.prev{left:14px}
.gal-light-nav.next{right:14px}
.gal-light-x:hover,.gal-light-nav:hover{color:var(--paper);border-color:rgba(240,237,230,.8)}
.gal-light-x:focus-visible,.gal-light-nav:focus-visible{outline:2px solid var(--paper);outline-offset:3px}
@media(prefers-reduced-motion:reduce){.gal-light{transition:none}}

/* ---------- 胶片管理浮窗：沿用酒单管理的纸面版式 ---------- */
/* vh 在前是旧 iPadOS（<15.4 不认 dvh）的回退；新版浏览器用 dvh。 */
#gaModal .sheet-wrap{width:min(1080px,96vw);height:min(760px,92vh);height:min(760px,92dvh)}
#gaModal .ga-card{transform:none}
.ga-order{display:flex;gap:6px;align-items:center;flex-wrap:wrap}
.ga-order button{appearance:none;border:1px solid rgba(12,12,13,.4);background:none;color:var(--ink);
  font-family:var(--mono);font-size:12px;line-height:1;padding:7px 10px;cursor:pointer}
.ga-order button:disabled{opacity:.4;cursor:default}
.ga-order button[hidden]{display:none}
.ga-view-note{font-family:var(--serif-cn);font-size:15px;line-height:1.8;color:rgba(12,12,13,.72);margin:8px 0 0}
.ga-view .ga-plate img{width:auto;height:min(28vh,220px);max-width:100%;object-fit:contain}
.ga-row{grid-template-columns:26px 40px minmax(0,1fr);align-items:center}
.ga-no{font-family:var(--mono);font-size:9px;letter-spacing:.1em;color:var(--gray)}
.ga-thumb{display:block;width:36px;height:36px;object-fit:cover;border:1px solid rgba(12,12,13,.22);
  background:rgba(12,12,13,.06)}
/* 显示区域预览：窗口比例 = 图片自身比例，里面那张图按 zoom/x/y 摆放，
   和保存时真正裁出来的区域逐像素一致。 */
.ga-stage{position:relative;height:clamp(170px,28vh,260px);overflow:hidden;touch-action:none;
  width:min(100%,calc(clamp(170px,28vh,260px) * var(--ga-ar,1.5)));
  background:#0c0c0d;border:1px solid rgba(12,12,13,.22);cursor:grab}
.ga-stage::after{content:'';position:absolute;inset:0;border:1px solid rgba(240,237,230,.14);
  pointer-events:none}
.ga-stage img{position:absolute;max-width:none;max-height:none;object-fit:cover;
  pointer-events:none;user-select:none;-webkit-user-drag:none}
.ga-crop-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:8px;
  font-family:var(--mono);font-size:9px;letter-spacing:.1em;color:var(--gray)}
.ga-crop-bar[hidden]{display:none}
.ga-crop-hint{letter-spacing:.08em}
.ga-crop-zoom{display:flex;align-items:center;gap:6px;white-space:nowrap}
.ga-crop-zoom input[type="range"]{width:104px;accent-color:var(--seal);cursor:pointer}
.ga-crop-zoom input[type="range"]:disabled{cursor:default;opacity:.5}
.ga-crop-bar button{appearance:none;background:none;border:1px solid rgba(12,12,13,.4);color:var(--ink);
  font-family:var(--mono);font-size:9.5px;letter-spacing:.1em;padding:5px 10px;cursor:pointer}
.ga-crop-bar button:disabled{opacity:.45;cursor:default}
.ga-photo-note{font-family:var(--mono);font-size:9px;letter-spacing:.1em;color:var(--gray);
  margin-left:auto;align-self:center}
.ma-photo-bar .ga-photo-note{margin-left:8px}
.ga-plate img{width:64px;height:64px}
.ga-restore{appearance:none;background:none;border:1px solid rgba(12,12,13,.4);color:var(--ink);
  font-family:var(--mono);font-size:9.5px;letter-spacing:.12em;padding:7px 12px;cursor:pointer;white-space:nowrap}
.ga-restore:hover{border-color:var(--seal);color:var(--seal)}
.ga-restore:disabled{opacity:.5;cursor:default}
#gaModal .ma-actions #gaSave{appearance:none;background:var(--ink);color:var(--paper);
  border:1px solid var(--ink);font-family:var(--mono);font-size:10px;letter-spacing:.16em;padding:10px 20px;cursor:pointer}
#gaModal .ma-actions #gaSave:disabled{opacity:.55;cursor:default}
#gaModal .ma-actions #gaCancel,#gaModal .ma-actions #gaDel{appearance:none;background:none;
  border:1px solid rgba(12,12,13,.4);color:var(--ink);font-family:var(--mono);font-size:10px;
  letter-spacing:.16em;padding:10px 16px;cursor:pointer}
#gaModal .ma-actions #gaDel{border-color:rgba(195,61,46,.55);color:var(--seal)}
#gaModal .ma-actions #gaSave[hidden],
#gaModal .ma-actions #gaCancel[hidden],#gaModal .ma-actions #gaDel[hidden]{display:none}
#gaModal .ma-actions #gaCancel:disabled,#gaModal .ma-actions #gaDel:disabled{opacity:.5;cursor:default}
/* 操作行一律走普通流：iPad 横屏（宽 >900 走桌面双列）时 .ma-main 是嵌套滚动区，
   sticky 在 iOS Safari 上不生效，按钮会落在可视区之外。画廊表单本身不长，
   排在表单末尾即可，与竖屏表现一致。 */
#gaModal .ma-actions{position:static;padding-top:14px}
@media(max-width:900px){
  #gaModal .sheet-wrap{width:min(680px,96vw);height:min(92vh,920px);height:min(92dvh,920px)}
  .ga-row{grid-template-columns:24px 38px minmax(0,1fr)}
  /* 窄屏整块由 .ma-body 滚动，sticky 会浮在表单中间盖住输入框；
     操作行回到表单末尾，滚到它就能按到。 */
  #gaModal .ma-actions{position:static;padding-top:14px}
}
@media(max-width:520px){
  #gaModal .sheet-wrap{height:94vh;height:94dvh;width:96vw}
  /* 标题与「保存/取消/↑↓」各占一行，避免标题被按钮挤成两行 */
  #gaModal .ma-form-head{flex-direction:column;align-items:stretch;gap:10px}
  #gaModal .ga-order{justify-content:flex-start;flex-wrap:nowrap}
}

/* ============================================================
   49 · 手机一屏一块（≤760px）
   窄屏里导航点到的每一块都锁成「可视视口 − 顶栏」高：标题、工具条钉在块顶，
   主列表在块内滚，页面级竖滑只负责换块。大于 760px（含 iPad 横屏与桌面）
   仍是原来的长卷排版，本段一条都不生效。
   高度用 --workspace-viewport（JS 同步 innerHeight，等价 dvh）减 --workspace-nav
   （JS 量顶部导航实际高度），不是写死 100vh。
   ============================================================ */

/* 窄屏目录入口：桌面导航条在 ≤760px 是隐藏的，这是唯一入口 */
.nav-menu-btn,.mnav{display:none}

@media(max-width:760px){
  /* ---- 顶栏：字标 + 目录，高度仍按 44px 触摸目标 ---- */
  .nav{padding:10px 16px}
  .nav-logo .zh img{height:18px}
  .nav-menu-btn{display:inline-flex;align-items:center;gap:9px;height:44px;padding:0 13px;
    appearance:none;border:1px solid currentColor;border-radius:2px;background:transparent;color:inherit;
    font-family:var(--serif-cn);font-size:12px;letter-spacing:.22em;cursor:pointer;flex:none}
  .nav-menu-btn i{font-style:normal;font-size:13px;line-height:1;opacity:.85}
  .nav-menu-btn:focus-visible{outline:2px solid currentColor;outline-offset:3px}
  body.mnav-open{overflow:hidden}

  /* ---- 目录浮层：叠在页面之上，一屏列完十块 ---- */
  .mnav{display:block;position:fixed;inset:0;z-index:8600}
  .mnav[hidden]{display:none}
  .mnav-scrim{position:absolute;inset:0;background:rgba(6,6,7,.86);
    -webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px)}
  .mnav-sheet{position:absolute;inset:0;display:flex;flex-direction:column;
    background:var(--ink);color:var(--paper);
    padding:max(10px,env(safe-area-inset-top)) 18px max(10px,env(safe-area-inset-bottom))}
  .mnav-head{flex:none;display:flex;align-items:center;justify-content:space-between;gap:12px;
    border-bottom:1px solid var(--line-light);padding-bottom:8px}
  .mnav-head>span{font-family:var(--mono);font-size:9px;letter-spacing:.32em;color:var(--gray)}
  .mnav-head button{appearance:none;border:0;background:none;color:var(--paper);
    width:44px;height:44px;font-size:26px;line-height:1;cursor:pointer}
  .mnav-head button:focus-visible{outline:2px solid var(--paper);outline-offset:-2px}
  .mnav-list{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;
    display:flex;flex-direction:column;justify-content:center;-webkit-overflow-scrolling:touch}
  .mnav-list a{display:grid;grid-template-columns:32px 1fr auto;align-items:center;gap:12px;
    min-height:48px;padding:2px 2px;border-bottom:1px solid rgba(240,237,230,.12);color:var(--paper)}
  .mnav-list a:last-child{border-bottom:0}
  .mnav-list a .no{font-family:var(--mono);font-size:9px;letter-spacing:.2em;color:var(--seal)}
  .mnav-list a .zh{font-family:var(--serif-cn);font-weight:700;font-size:19px;letter-spacing:.22em}
  .mnav-list a .fr{font-family:var(--mono);font-size:8px;letter-spacing:.24em;color:var(--gray);text-align:right}
  .mnav-list a:active,.mnav-list a:focus-visible{background:rgba(240,237,230,.1)}
  .mnav-list a:focus-visible{outline:2px solid var(--paper);outline-offset:-2px}

  /* ---- 十块共用：锁高、块内滚、跳转留出顶栏 ---- */
  #gallery,#menu,#darkroom,#orders,#booking,#notes,#clients,#comptes,#colophon{
    height:calc(var(--workspace-viewport) - var(--workspace-nav));
    min-height:0;overflow:hidden;
    scroll-margin-top:var(--workspace-nav)}
  /* 卷首是页首的一块，顶部导航本来就压在它身上：按整屏算，否则下一块会露 64px */
  #hero{height:var(--workspace-viewport);min-height:0;overflow:hidden;scroll-margin-top:0}

  /* ---- 01 卷首：大字标在上、地址沉底，整块占一屏 ---- */
  #hero{padding:0;justify-content:space-between}
  .hero-title{flex:1;min-height:0;flex-direction:column;align-items:flex-start;justify-content:space-between;
    gap:14px;padding:calc(var(--workspace-nav) + 10px) 16px calc(18px + env(safe-area-inset-bottom))}
  .hero-zh img{height:min(18vh,140px)}
  .hero-addr{max-width:100%;padding-bottom:0}
  .hero-addr .en-rule{width:38px;margin-bottom:10px}
  .hero-addr address{font-size:10.5px;line-height:1.75;letter-spacing:.08em;max-width:320px}

  /* ---- 02 画廊：横向胶片仍在横滑，整块只占一屏 ---- */
  #gallery{display:flex;flex-direction:column;padding-top:10px;padding-bottom:24px}
  .gal-sticky{position:static;height:100%;justify-content:flex-start;display:flex;flex-direction:column}
  /* 抬头与点单台同口径：23px 宋体 900 + .5em 斜体英文，底下一根细线 */
  .gal-head{padding:8px 16px 7px;align-items:flex-end;gap:4px}
  .gal-t{font-size:23px;letter-spacing:.1em}
  .gal-t em{font-size:.5em;margin-left:8px}
  .gal-admin{font-size:8px;padding:5px 8px}
  .gal-track{flex:1;min-height:0;align-items:center;padding:6px 16px 0;gap:18px}
  .frame img{height:min(44vh,400px)}
  .frame-vert img{height:min(48vh,440px)}
  .frame .tag{top:-15px;font-size:7.5px;letter-spacing:.2em}
  .frame .cap{bottom:-20px;font-size:7.5px;letter-spacing:.12em}
  .gal-prog{bottom:0;left:16px;right:16px}

  /* ---- 03 酒单：一屏一张卡，翻页仍用 NEXT / PREV ---- */
  #menu{display:flex;flex-direction:column;padding:8px 0 max(8px,env(safe-area-inset-bottom))}
  /* 抬头与点单台 / 画廊同口径：23px 宋体 900 + .5em 斜体英文，底下一根细线 */
  #menu .menu-head{flex:none;width:auto;margin:0 12px 6px;padding:0 0 7px;gap:4px;align-items:flex-end}
  #menu .menu-t{font-size:23px}
  #menu .menu-t em{font-size:.5em;margin-left:8px}
  #menu .menu-head .menu-admin{font-size:8px;letter-spacing:.12em;padding:5px 9px}
  #menu .stage{flex:1;min-height:0;padding:18px 0 10px;align-items:stretch}
  #menu .glasscard{width:min(560px,94vw);height:100%;min-height:0;padding:15px 15px 20px;
    grid-template-rows:minmax(0,1fr)}
  #menu .glasscard .mc-page{min-height:0;overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;
    -webkit-overflow-scrolling:touch;scrollbar-width:thin}
  #menu .mc-head{padding-bottom:8px}
  #menu .mc-head h4,#menu .sp-page-head h4{font-size:18px}
  #menu .mc-head .yr{font-size:8px;letter-spacing:.16em}
  #menu .mc-addr{font-size:8px;margin-top:4px}
  #menu .drink{padding:8px 0;grid-template-columns:22px 1fr auto;gap:10px;min-height:44px}
  #menu .drink .no{font-size:14px}
  #menu .drink .cn,#menu .sp-bottle .cn,#menu .sp-categories button{font-size:13px;line-height:1.6}
  #menu .drink .cn em{font-size:.78em;margin-left:6px}
  #menu .drink .en,#menu .sp-bottle .en{font-size:9px;line-height:1.5;margin-top:1px}
  #menu .drink .pr{font-size:11px;padding-top:.2em}
  #menu .mc-next{margin-top:10px;font-size:9px;letter-spacing:.2em}
  #menu .mc-next i{font-size:10px;margin-left:6px}
  #menu .mc-fin{margin-top:10px;font-size:11px}
  #menu .glasscard .clip{width:84px;height:24px;top:-11px;left:14px}
  #menu .glasscard .clip-r{left:auto;right:14px}
  #menu .glasscard .clip::before{font-size:9px;letter-spacing:.1em}

  /* ---- 04 留言板：打字机在上、收录条在下，两段同屏；收录条横滑 ---- */
  #darkroom{grid-template-columns:minmax(0,1fr);grid-template-rows:6px minmax(0,1fr) 240px 6px;
    padding:0 12px;column-gap:0;row-gap:0;height:calc(var(--workspace-viewport) - var(--workspace-nav))}
  #darkroom .dk-holes{height:6px}
  #darkroom .darkroom-typewriter{height:100%;min-height:0}
  #darkroom .fb-wall{padding:6px 0 4px;gap:6px}
  #darkroom .fb-wall-kick{font-size:8px;line-height:1.4;letter-spacing:.1em}
  #darkroom .fb-wall-list{flex:1;min-height:0;flex-direction:row;overflow-x:auto;overflow-y:hidden;gap:10px}
  #darkroom .fb-card{width:140px;height:84px}
  #darkroom .fb-card .t{font-size:13px;line-height:1.4}
  #fbSubmit{width:140px;min-height:44px;align-self:flex-end}
  #darkroom .fb-owner{width:140px;min-height:44px;align-self:flex-end;font-size:11px}

  /* ---- 05 点单：座位图与流水在上，操作面板在下，整块内部滑动 ---- */
  #orders{display:flex;flex-direction:column;padding:8px 0 max(8px,env(safe-area-inset-bottom))}
  #orders .od-head{flex:none;width:auto;margin:0 12px 6px;padding:0 0 7px;gap:4px;align-items:flex-end}
  #orders .od-head h3{font-size:23px}
  #orders .od-head h3 em{font-size:.5em;margin-left:8px}
  #orders .od-owner{font-size:7px;letter-spacing:.14em}
  #orders .od-board{flex:1;min-height:0;width:auto;margin:0 12px;gap:12px;
    overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}
  #orders .od-map-wrap{padding:8px}
  #orders .od-legend{font-size:8px;padding:6px 2px 0;gap:14px}
  #orders .od-log-head{font-size:8px;letter-spacing:.14em}
  #orders .od-panel{padding:14px;position:static}
  #orders .od-panel.picker-open{height:min(calc(var(--workspace-viewport) - 260px),480px)}
  #orders .od-panel.client-open{height:min(calc(var(--workspace-viewport) - 280px),460px)}
  #orders .od-btn{min-height:44px}
  #orders .od-live-head{font-size:8px}
  #orders .od-sum{font-size:11px}

  /* ---- 06 预约：海报与月历同屏，格高按剩余高度均分 ---- */
  #booking{display:flex;flex-direction:column;padding:10px 0 max(8px,env(safe-area-inset-bottom))}
  #booking .bk-poster{flex:1;min-height:0;height:auto;width:calc(100% - 16px);padding:18px 8px 6px}
  /* 窄屏海报几乎满宽，胶带原来的 7% 内缩正好压在居中的块编号上；改贴两端。 */
  #booking .bk-poster::before,#booking .bk-poster::after{width:64px;height:20px;top:-11px}
  #booking .bk-poster::before{left:0}
  #booking .bk-poster::after{right:0}
  #booking .bk-mast{padding-bottom:5px;gap:8px}
  #booking .bk-mast h3{font-size:25px}
  #booking .bk-mast h3 em{font-size:.5em;margin-left:8px}
  #booking .bk-month{font-size:17px}
  #booking .bk-month .cn{font-size:7.5px;letter-spacing:.2em;margin-top:2px}
  #booking .bk-bar{padding:5px 0 3px;gap:4px}
  #booking .bk-title-sm{font-size:8px;letter-spacing:.1em}
  #booking .bk-nav{font-size:9px;padding:5px 8px;min-height:32px}
  #booking .bk-week{padding:4px 0;line-height:11px}
  #booking .bk-week span{font-size:7px;letter-spacing:.14em}
  #booking .bk-cal{flex:1;min-height:0;grid-template-rows:repeat(var(--weeks,5),minmax(0,1fr))}
  #booking .bk-cell{height:auto;min-height:0;padding:2px 3px;gap:1px}
  #booking .bk-date-head{height:16px}
  #booking .bk-cell .d{font-size:12px;line-height:16px}
  #booking .bk-ev{height:13px;line-height:13px;font-size:8px;padding:0 2px}
  #booking .bk-more{height:10px;line-height:10px;font-size:8px}
  #booking .bk-foot{padding-top:4px;font-size:7px;line-height:10px;letter-spacing:.1em}
  #booking .bk-foot>span:not(:first-child){display:none}

  /* ---- 07 随手记 / 08 档案 / 10 尾页：沿用样板，只收顶栏留白与触控尺寸 ---- */
  #notes,#clients,#colophon{padding-top:10px;padding-bottom:max(10px,env(safe-area-inset-bottom))}
  #notes .nt-head{margin-bottom:10px}
  #notes .nt-head h3{font-size:22px}
  #notes .nt-input input{min-height:44px;font-size:13px}
  #notes .nt-input button{min-height:44px}
  #clients .cl-tools{gap:8px}
  #clients .cl-search input{min-height:44px}
  #clients .cl-add{min-height:44px}
  #colophon .colo-edit{font-size:22px}
  #colophon .colo-list a{min-height:44px}

  /* ---- 09 账本：抬头钉住、账目区在块内滚 ---- */
  #comptes{display:flex;flex-direction:column;padding:8px 0 max(8px,env(safe-area-inset-bottom))}
  #comptes .cp-head{flex:none;width:auto;margin:0 12px 6px;padding-bottom:6px;gap:4px}
  #comptes .cp-head h3{font-size:23px}
  #comptes .cp-kickin{margin-top:3px;font-size:7px;letter-spacing:.2em}
  #comptes .cp-owner{font-size:7px;letter-spacing:.12em}
  #comptes .cp-board{flex:1;min-height:0;height:auto;width:auto;margin:0 12px;gap:7px}
  #comptes .cp-month{gap:8px}
  #comptes .cp-month b{font-size:11px;letter-spacing:.12em}
  #comptes .cp-nav{width:30px;height:30px}
  #comptes .cp-cards{gap:6px}
  #comptes .cp-card{padding:6px 8px;gap:2px}
  #comptes .cp-card .cp-lab{font-size:6.8px;letter-spacing:.14em}
  #comptes .cp-card b{font-size:14px}
  #comptes .cp-card .cp-sub{font-size:7px;letter-spacing:.04em}
  #comptes .cp-actions{gap:6px}
  #comptes .cp-addbtn{min-height:40px;font-size:10px;padding:8px 12px}
  #comptes .cp-csv{font-size:9px;min-height:40px}
  #comptes .cp-form.open{max-height:290px}
  #comptes .cp-fbtns button{min-height:44px;flex:1}
  #comptes .cp-zonehead span{font-size:7px;letter-spacing:.12em}
  #comptes .cp-zonehead span:last-child{display:none}
  #comptes .cp-days{padding:8px 2px 12px;max-height:none}
  #comptes .cp-mgrid{height:auto;max-height:112px;padding:8px 2px 10px;gap:8px}
  #comptes .cp-day{padding:7px 8px 5px}

  /* 酒单管理：窄屏把左侧列表给足高度（一屏看得见七八行才好拖），行按 48px 触摸高度 */
  #maModal .ma-side{max-height:56%}
  #maModal .ma-list{max-height:none}
  #maModal .ma-row{min-height:48px;padding-top:6px;padding-bottom:6px}

  /* ---- 浮窗层：仍叠在这一屏之上，但要能完整打开、滚动、点到保存 / 关闭 ---- */  .sheet-modal{padding:8px 8px max(8px,env(safe-area-inset-bottom))}
  .sheet-wrap{max-height:100%}
  #fbModal .sheet-wrap,#cpModal .sheet-wrap,#bkModal .sheet-wrap,#maModal .sheet-wrap,#gaModal .sheet-wrap{
    width:100%;height:min(100%,calc(var(--workspace-viewport) - 16px));max-height:none}
  #fbModal .sheet-wrap{height:auto;max-height:calc(var(--workspace-viewport) - 16px)}
  #maModal,#gaModal,#bkModal,#cpModal,#fbModal{padding:8px 8px max(8px,env(safe-area-inset-bottom))}
  .sheet-x{top:6px;right:6px}
}

/* ============================================================
   50 · 手机可读性与输入（窄屏 / 粗指针）
   只改字号、文案断点、动作行层次、偏好面板的定位方式；
   颜色、间距、装饰、桌面分栏与一屏一块规则一条不动。
   ============================================================ */

/* ---- 50.1 空态文案跟断点：酒单管理 / 画廊管理 ≤900 已上下叠，说「上方」 ---- */
.ma-hint .side-t{display:none}
@media(max-width:900px){
  .ma-hint .side-l{display:none}
  .ma-hint .side-t{display:inline}
}

/* ---- 50.2 可聚焦控件 ≥16px：iOS 只对计算字号 <16px 的轴内控件强制放大 ----
   不碰 maximum-scale / user-scalable（那是拿无障碍换安静）。
   选择器用一串 :not() 抬到最高优先级，免得几十处 .xxx input{font-size:13px} 各写一遍；
   非输入内容的字号（标题、酒名、正文）不在选择范围内。 */
/* 站点里有大量 `#clModal .spec-in{12.5px}`、`#notes .nt-input input{13px}` 这种按 id 写死的字号，
   类选择器压不住，只能在这一条上用 !important —— 否则「≥16px」只是纸面规则。
   作用域限死在窄屏 / 粗指针，桌面字号一条不变。 */
@media (max-width:760px),(pointer:coarse){
  input:not([type=range]):not([type=hidden]):not([type=checkbox]):not([type=radio]):not([type=file]):not([type=button]):not([type=submit]):not([type=reset]):not([type=color]):not([type=image]),
  /* 尾页的展示字号可低至 10px，聚焦时单独抬至 16px，避免 iOS 自动放大页面。 */
  textarea:not(#coloLine),
  select,
  [contenteditable="true"]{font-size:16px!important}
  #colophon .colo-edit:focus{font-size:max(16px,var(--colo-display-size,22px))!important}
}

/* ---- 50.3 酒单管理：字段区自己滚，动作行退出 sticky 钉在底边 ----
   原来是 .ma-body 整块滚、动作行 sticky 盖在字段上，配料行会从按钮底下露出来。
   现在滚动层与按钮层分开：滚的是字段，按钮不在滚动层里。 */
@media(max-width:900px){
  #maModal .ma-body{display:flex;flex-direction:column;overflow:hidden;padding-top:10px}
  #maModal .ma-main{display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden;padding-right:0}
  #maModal .ma-form{display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden}
  /* 上面这条按 id 写，会压过 .ma-form[hidden]{display:none}：没选酒款时表单会从底部露一条边 */
  #maModal .ma-form[hidden]{display:none}
  #maModal .ma-fields{flex:1;min-height:0;overflow:auto;padding-right:var(--ma-gutter,14px);
    scrollbar-gutter:stable;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}
  #maModal .ma-actions{position:static;flex:none;z-index:auto;border-top:1px solid rgba(12,12,13,.22);
    padding:10px 0 max(8px,env(safe-area-inset-bottom))}
  /* 动作行已不在滚动层里，原来给它预留的 scroll-padding 就是假预留，去掉 */
  #maModal .ma-body{scroll-padding-bottom:0}
}

/* ---- 50.4 客户偏好面板：窄屏不再脱离档案卡往下弹 ----
   原来是 position:absolute + width:max-content，从 PREFS 格子里溢出去盖住消费记录、
   底边被卡片裁掉，还撑出 83px 横向滚动。窄屏改成卡内展开、自己滚。 */
@media(max-width:760px){
  /* 表格默认按内容撑宽：面板里 15 个标签章片一挤，整张表就把卡片顶出 77px 横向滚动。
     窄屏改成固定布局，第一列 40%，第二列吃剩下的宽度，面板 100% 就夹在卡片里了。 */
  #clModal .sheet-spec{table-layout:fixed}
  #clModal .sheet-spec td:first-child{width:40%}
  #clModal .cl-tags{max-width:100%}
  /* 名片在窄屏收窄一档后，那行等宽小标（左「FICHE CLIENT · 客户档案」+ 右「ZUI ZHOU · BOOK №2」）
     一行放不下：右半要么被卡片裁掉，要么钻到关闭钮底下。收一档字号、右侧让出叉的宽度。 */
  .sheet-modal .sheet-tag{flex-wrap:wrap;white-space:normal;row-gap:2px;
    font-size:7px;letter-spacing:.12em;padding-right:36px}
  #clModal .cl-tagpanel{position:static;left:auto;top:auto;width:100%;max-width:100%;box-sizing:border-box;
    max-height:min(46vh,320px);overflow-y:auto;margin-top:8px;padding:10px 12px;
    box-shadow:none;-webkit-overflow-scrolling:touch}
  #clModal .cl-tags.open .cl-tagpanel{display:block}
}

/* Persistent title feedback stays close to its editable field. */
.colo-save-status{margin-top:10px;font-size:12px;color:var(--paper);line-height:1.6}
.colo-save-status[hidden],.colo-save-status button[hidden]{display:none}
.colo-save-status button{margin-left:12px;padding:3px 9px;border:1px solid currentColor;background:transparent;color:inherit;font:inherit;cursor:pointer}

/* ============================================================
   51 · iPad 横屏一屏化（触屏 + 横屏 + 高度 ≤1100）
   与 ≤760px 的手机块互斥；桌面（pointer:fine）不受影响。
   ============================================================ */
@media (pointer:coarse) and (orientation:landscape) and (min-width:761px) and (max-height:1100px){
  /* ---- 酒单：整页（内容、边框、页码）落在一屏内 ----
     竖向留白全部收紧：段落上下 padding、抬头下边距、条目行距。
     卡片高度封顶（70vh），内容万一仍放不下在页内滚——
     边框与页码永远完整可见，不再被屏幕底边截断。 */
  #menu{padding:64px 0 14px}
  #menu .menu-head{margin-bottom:8px;padding-bottom:8px}
  #menu .stage{padding:6px 0 4px}
  #menu .glasscard{min-height:0;height:min(70vh,660px);padding:14px 22px 24px;
    grid-template-rows:minmax(0,1fr)}
  #menu .glasscard .mc-page{min-height:0;overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin}
  #menu .mc-head{padding-bottom:8px}
  #menu .drink{padding:6px 0;gap:12px}
  #menu .drink .cn,#menu .sp-bottle .cn,#menu .sp-categories button{line-height:1.5}
  #menu .glasscard .pg-ind{bottom:7px;right:14px}

  /* ---- 画廊：抬头贴住导航，展示区在剩余空间里垂直居中 ----
     原来抬头自身 96px 上留白 + 整列垂直居中叠加，画廊整体偏下；
     改为抬头紧跟导航，胶片轨吃满剩余高度并居中，进度条贴底。 */
  .gal-sticky{justify-content:flex-start}
  .gal-head{padding-top:72px;padding-bottom:10px}
  .gal-track{flex:1;min-height:0;padding-top:12px}

  /* ---- 账本：触屏横屏下统计卡与操作行再收一档，给流水/历史区让高度 ---- */
  #comptes .cp-card{padding:6px 10px;gap:2px}
  #comptes .cp-card b{font-size:15px}
  #comptes .cp-addbtn{min-height:38px;padding:6px 12px}
  #comptes .cp-form.open{max-height:240px}
}

/* Menu editor: shared header, compact fields and a dedicated photo column.
   Keep these scoped to the menu sheet; gallery management shares base classes. */
@media (min-width:901px) and (min-height:650px){
  #maModal{padding:24px 16px}
  #maModal .sheet-wrap{width:min(1280px,96vw);height:min(940px,94dvh)}
  #maModal .ma-card{padding:18px 22px;--ma-gutter:0px}
  #maModal .ma-head,#maModal .ma-foot{margin-right:0}
  #maModal .ma-head{padding-bottom:10px}
  #maModal .ma-body{grid-template-columns:clamp(160px,18vw,230px) minmax(0,1fr);gap:18px;padding:12px 0}
  #maModal .ma-main{display:flex;flex-direction:column;overflow:auto;padding:0;scrollbar-gutter:auto}
  #maModal .ma-form{flex:1;min-height:0;gap:10px}
  #maModal .ma-fields{display:grid;flex:none;grid-template-columns:minmax(0,1fr) clamp(190px,22vw,300px);
    grid-template-areas:"head head" "fields photo" "spec photo";
    gap:10px 18px;align-content:start;align-items:start}
  #maModal .ma-confirm,#maModal .ma-alert{grid-area:auto;grid-column:1 / -1}
  #maModal .ma-form-head{padding-bottom:8px;align-items:center}
  #maModal .ma-grid{gap:8px 12px}
  :is(#maModal,#saModal) .ma-grid label.wide{grid-column:auto}
  :is(#maModal,#saModal) .ma-grid input,:is(#maModal,#saModal) .ma-grid select,#maModal .ma-spec-row input{height:42px;font-size:16px;padding-top:6px;padding-bottom:6px}
  #maModal .ma-spec-rows{gap:8px 12px}
  #maModal .ma-spec-row{grid-template-columns:minmax(0,1fr);gap:4px}
  #maModal .ma-spec-row span{font-size:9px;letter-spacing:.04em}
  #maModal .ma-photo{min-height:0;gap:10px}
  #maModal #maPhoto{flex:1;min-height:0;display:flex}
  #maModal .ma-plate{width:100%;min-height:0;padding:8px;gap:8px}
  #maModal .ma-plate img{width:100%;height:0;min-height:180px;flex:1;max-height:none;object-fit:contain}
  #maModal .ma-nophot{width:100%;min-height:180px}
  #maModal .ma-photo-bar{display:grid;grid-template-columns:1fr 1fr;gap:8px}
  :is(#maModal,#saModal) .ma-photo-bar button{padding:8px 4px;min-height:44px;letter-spacing:0}
  #maModal .ma-actions{position:static;margin-top:auto;flex:none;padding-top:10px}
  #maModal .ma-actions button,#maModal .ma-cat-row button,#maModal .ma-retire{min-height:44px}
  #maModal .ma-foot{padding-top:8px}
}

/* Both message actions form a monochrome group at the bottom of the rail. */
#darkroom #fbSubmit,#darkroom #fbOwner{width:100%;min-height:48px;flex:none;margin:0;
  padding:10px 8px;border:1px solid rgba(255,255,255,.4);border-radius:4px;
  background:rgba(255,255,255,.06);color:#eee;font:12px/22px var(--sans-cn);letter-spacing:.08em;
  cursor:pointer;transition:background .2s,color .2s}
#darkroom #fbSubmit{margin-top:auto}
#darkroom #fbSubmit:hover,#darkroom #fbOwner:hover{background:#eee;color:#111}
#darkroom #fbSubmit:focus-visible,#darkroom #fbOwner:focus-visible{outline:2px solid #fff;outline-offset:3px}
@media(max-width:760px){
  #darkroom #fbSubmit,#darkroom #fbOwner{width:144px;min-height:44px;align-self:flex-end;padding:6px}
}

/* A decorative photo layer: monochrome and faint, independent of text opacity. */
#colophon .colo-background{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  object-position:center 55%;filter:grayscale(1);opacity:.16;pointer-events:none;user-select:none}
#colophon>.wrap,#colophon>.colo-bottom{position:relative;z-index:1}
#colophon{filter:grayscale(1);background:#0c0c0c;color:#ededed;--paper:#ededed;--gray:#8a8a8a}

#clModal .sheet-head h5{flex:1;min-width:120px}
#clModal .cl-name-input{width:100%;min-height:44px;border:0;border-bottom:1px dashed rgba(12,12,13,.3);
  border-radius:0;background:transparent;color:inherit;font:inherit;font-size:clamp(22px,3.2vw,32px)!important;outline-offset:4px}
.cp-link-client{border:1px solid currentColor;background:transparent;color:inherit;font:11px var(--sans-cn);padding:7px 10px;min-height:36px;cursor:pointer;white-space:nowrap}
.cp-ev .cp-link-client{grid-column:1 / -1;justify-self:end;margin-top:4px}
.cpd-row .cp-link-client{grid-column:1 / -1;justify-self:end}
#lcModal{z-index:8900}
#lcModal .sheet-wrap{width:min(560px,92vw)}
#lcModal .lc-card{display:flex;flex-direction:column;gap:16px;background:var(--paper);color:var(--ink);padding:30px;transform:none}
#lcModal h4{font:700 26px var(--serif-cn)}
#lcModal label{display:flex;flex-direction:column;gap:8px;font-size:13px}
#lcModal input,#lcModal select{width:100%;min-height:44px;padding:8px;border:1px solid #999;background:#fff;color:#111;font:16px var(--sans-cn)}
#lcModal button:not(.sheet-x){min-height:44px;padding:8px 14px;border:1px solid #777;background:transparent;color:inherit;cursor:pointer}
#lcModal button:disabled{opacity:.45;cursor:default}
#lcModal #lcSave{background:#111;color:#fff}
#lcModal #lcError{color:var(--seal);font-size:13px;line-height:1.7}
#lcModal #lcCreate{border-top:1px solid #bbb;padding-top:16px}
#lcModal #lcCreate button{margin-top:12px}
#lcModal .lc-actions{display:flex;gap:12px;justify-content:flex-end}
#lcModal [hidden]{display:none!important}

/* Center labels and values within their own columns, including Safari selects. */
#maModal .ma-card,#maModal input,#maModal select,#maModal button,#maModal .ma-row{text-align:center}
/* 基酒弹窗的筛选下拉与酒单同款：文字居中（iOS Safari 不支持 text-align-last 时回落系统默认靠左） */
:is(#maModal,#saModal) select{text-align-last:center}
#maModal .ma-head>div:first-child,#maModal .ma-form-head>div:first-child{flex:1;min-width:0}
/* 只有标题 span 撑满，按钮容器（.ma-side-actions）保持自然宽度贴右——
   之前 >span 一刀切把两个 span 都拉成 1fr，排序/新增被顶到行中央。 */
#maModal .ma-side-head>span:first-child{flex:1}
#maModal .ma-group-head>span{flex:1}
#maModal .ma-sum,#maModal .ma-actions,#maModal .ma-foot,
#maModal .ma-confirm,#maModal .ma-alert{justify-content:center}
#maModal .ma-spec-k{display:block;text-align:center}

/* Film editing uses the available width, rather than stacking a large empty
   photo box above the fields. The action row remains outside the form. */
@media(min-width:901px) and (min-height:650px){
  #gaModal{padding:24px 16px}
  #gaModal .sheet-wrap{width:min(1280px,96vw);height:min(940px,94dvh)}
  #gaModal .ma-card{padding:18px 22px;--ma-gutter:0px}
  #gaModal .ma-head,#gaModal .ma-foot{margin-right:0}
  #gaModal .ma-head{padding-bottom:10px}
  #gaModal .ma-body{grid-template-columns:clamp(180px,21vw,270px) minmax(0,1fr);gap:18px;padding:12px 0}
  #gaModal .ma-main{display:flex;flex-direction:column;gap:10px;padding:0;overflow:auto;scrollbar-gutter:auto}
  #gaModal .ma-form{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);
    grid-template-areas:"head head" "photo fields";gap:12px 18px;align-items:start;flex:none}
  #gaModal .ma-form[hidden]{display:none}
  #gaModal .ma-form-head{align-items:center;min-width:0}
  #gaModal .ma-form-head>div:first-child{min-width:0;overflow-wrap:anywhere}
  #gaModal .ma-photo{min-width:0;min-height:0;gap:10px}
  #gaModal #gaPhoto{display:flex;justify-content:center;min-width:0}
  #gaModal .ga-plate{width:100%;min-height:0;padding:8px;gap:8px}
  #gaModal .ga-plate img{width:100%;height:clamp(180px,29vh,300px);max-height:none;object-fit:contain}
  #gaModal .ma-nophot{width:100%;min-height:clamp(180px,29vh,300px)}
  #gaModal .ga-stage{height:auto;aspect-ratio:var(--ga-ar,1.5);
    width:min(100%,calc(clamp(180px,29vh,300px) * var(--ga-ar,1.5)))}
  #gaModal .ma-grid{grid-template-columns:minmax(0,1fr);gap:18px}
  #gaModal .ma-grid input{height:44px;font-size:16px}
  #gaModal .ma-photo-bar{margin:0;align-items:center;gap:8px}
  #gaModal .ga-photo-note{flex:1;min-width:0;margin:0;line-height:1.5}
  #gaModal .ga-crop-bar{margin:0;gap:8px}
  #gaModal .ga-crop-hint{flex-basis:100%}
  #gaModal .ma-photo-bar button,#gaModal .ga-order button,#gaModal .ga-crop-bar button,
  #gaModal .ma-actions button,#gaModal .ga-restore{min-height:44px}
  #gaModal .ga-order button{min-width:44px}
  #gaModal .ma-actions{flex:none;margin-top:auto;padding-top:10px}
  #gaModal .ma-foot{padding-top:8px}
}

/* Each landscape destination occupies exactly the canvas below the measured
   navigation. Content is centered within it instead of exposing the next page. */
@media (min-width:761px) and (orientation:landscape){
  #menu,#orders,#booking{height:calc(var(--workspace-viewport) - var(--workspace-nav));
    min-height:0;scroll-margin-top:var(--workspace-nav);padding:18px 0;
    display:flex;flex-direction:column;justify-content:center}
  #menu .menu-head{flex:none;margin-bottom:16px;padding-bottom:10px}
  #menu .stage{min-height:0;flex:1;padding:10px 0 0;max-height:720px}
  #menu .glasscard{height:100%;min-height:0;padding:14px 22px 28px;grid-template-rows:minmax(0,1fr)}
  #menu .mc-page{min-height:0;overflow-y:auto;overscroll-behavior:contain}
  #menu .drink{padding:6px 0}
  #menu .mc-head{padding-bottom:8px}
  #orders .od-head{flex:none;margin-bottom:18px;padding-bottom:10px}
  #orders .od-board{min-height:0;max-height:calc(100% - 70px);align-items:stretch}
  #orders .od-col-l,#orders .od-col-r{min-height:0;overflow:auto;overscroll-behavior:contain}
  #orders .od-map-wrap{padding:12px}
  #orders #odMap{max-height:calc((var(--workspace-viewport) - var(--workspace-nav)) * .52)}
  #orders .od-panel{position:relative;top:auto;flex:none}
  #booking .bk-poster{height:100%;max-height:900px;min-height:0;margin:0 auto;padding:20px 28px 12px}

  /* 账本与前三页同一画布：高度锁死为视口减导航，超出部分在流水区/历史区内部滚动。
     之前横屏一屏列表漏掉了 #comptes，内容直接把段落撑出屏幕底边（最后一行被裁）。 */
  #comptes{height:calc(var(--workspace-viewport) - var(--workspace-nav));min-height:0;
    scroll-margin-top:var(--workspace-nav);padding:12px 0;display:flex;flex-direction:column;justify-content:center}
  #comptes .cp-head{flex:none;margin-bottom:8px;padding-bottom:8px}
  #comptes .cp-board{flex:1;min-height:0;height:auto;gap:clamp(8px,1.2vh,14px)}
  #comptes .cp-days{max-height:none}
  #comptes .cp-mgrid{height:auto;max-height:clamp(110px,14vh,150px)}
}

/* Portrait tablets have their own canvas and editor layout. Keep this separate
   from the accepted landscape layouts and from the phone breakpoint. */
@media (min-width:761px) and (max-width:1100px) and (orientation:portrait){
  #darkroom,#orders,#comptes{height:calc(var(--workspace-viewport) - var(--workspace-nav));
    min-height:0;scroll-margin-top:var(--workspace-nav);overflow:hidden}

  #maModal{padding:24px 16px}
  #maModal .sheet-wrap{width:96vw;height:calc(var(--workspace-viewport) - 48px);max-height:100%}
  #maModal .ma-card{padding:18px 20px;--ma-gutter:0px}
  #maModal .ma-head,#maModal .ma-foot{margin-right:0}
  #maModal .ma-head{padding-bottom:10px;gap:10px}
  #maModal .ma-body{display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:clamp(180px,20vh,240px) minmax(0,1fr);
    gap:12px;padding:12px 0;overflow:hidden}
  #maModal .ma-side{max-height:none;min-height:0;padding:0 0 10px;border-right:0;border-bottom:1px dashed #bbb}
  #maModal .ma-list{max-height:none;overflow:auto;padding:2px 4px 4px}
  #maModal .ma-row{min-height:44px;padding:8px 4px}
  #maModal .ma-main{display:flex;flex-direction:column;min-height:0;overflow:hidden;padding:0;scrollbar-gutter:auto}
  #maModal .ma-form{display:flex;flex-direction:column;flex:1;min-height:0;gap:10px;overflow:hidden}
  #maModal .ma-form[hidden]{display:none}
  #maModal .ma-fields{display:grid;flex:1;min-height:0;overflow:auto;padding:0 4px;
    grid-template-columns:minmax(0,1fr) minmax(180px,.5fr);grid-template-areas:"head head" "fields photo" "spec photo";
    gap:10px 14px;align-content:start;align-items:start;scrollbar-gutter:auto;overscroll-behavior:contain}
  #maModal .ma-form-head{grid-area:head;align-items:center}
  #maModal .ma-grid{grid-area:fields;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 10px}
  :is(#maModal,#saModal) .ma-grid label.wide{grid-column:1 / -1}
  :is(#maModal,#saModal) .ma-grid input,:is(#maModal,#saModal) .ma-grid select,#maModal .ma-spec-row input{height:44px;font-size:16px}
  #maModal .ma-spec{grid-area:spec}
  #maModal .ma-spec-rows{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 10px}
  #maModal .ma-spec-row{grid-template-columns:minmax(0,1fr);gap:4px}
  #maModal .ma-spec-row span{letter-spacing:0}
  #maModal .ma-photo{grid-area:photo;display:flex;flex-direction:column;gap:8px;align-self:start;min-width:0}
  #maModal .ma-plate{display:flex;flex-direction:column;min-height:0;gap:8px;padding:8px;margin:0;border:1px solid #bbb}
  #maModal .ma-plate img{width:100%;height:240px;max-height:none;object-fit:contain}
  #maModal .ma-nophot{display:block;min-height:200px;text-align:center}
  #maModal .ma-photo-bar{display:grid;grid-template-columns:1fr;gap:8px;margin:0}
  :is(#maModal,#saModal) .ma-photo-bar button,#maModal .ma-cat-row button,#maModal .ma-retire{min-height:44px;letter-spacing:0}
  #maModal .ma-confirm,#maModal .ma-alert{grid-area:auto;grid-column:1/-1}
  #maModal .ma-actions{position:static;flex:none;margin:0;padding:10px 0 0}
  #maModal .ma-actions button{min-height:44px}
  #maModal .ma-foot{padding-top:8px}

  #darkroom{padding:8px 20px;grid-template-columns:minmax(0,1fr);grid-template-rows:16px minmax(0,1fr) 170px 16px;gap:10px}
  #darkroom .darkroom-typewriter{grid-column:1;grid-row:2}
  #darkroom .fb-wall{grid-column:1;grid-row:3;display:grid;grid-template-columns:minmax(0,1fr) 190px;
    grid-template-rows:auto 1fr 1fr;grid-template-areas:"kick submit" "cards submit" "cards owner";gap:8px 18px;padding:0}
  #darkroom .fb-wall-kick{grid-area:kick;font-size:9px}
  #darkroom .fb-wall-list{grid-area:cards;flex-direction:row;overflow:auto;padding:4px;gap:12px}
  #darkroom .fb-card{width:180px;height:100%;max-height:120px;min-height:90px;flex:none}
  #darkroom #fbSubmit{grid-area:submit;align-self:end;margin:0}
  #darkroom #fbOwner{grid-area:owner;align-self:start;margin:0}
  #darkroom #fbSubmit,#darkroom #fbOwner{width:100%;white-space:nowrap;letter-spacing:0}

  #orders{padding:18px 0;display:flex;flex-direction:column;gap:14px}
  #orders .od-head{flex:none;margin-bottom:0;padding-bottom:10px}
  #orders .od-board{flex:1;min-height:0;grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1fr);gap:14px}
  #orders .od-board{overflow:hidden}
  #orders .od-col-l{display:flex;flex-direction:column;min-height:0}
  #orders .od-map-wrap{padding:10px}
  #orders #odMap{height:clamp(210px,27vh,360px);width:100%}
  #orders .od-log{max-height:100px;overflow:auto;flex:none;margin-top:10px}
  #orders .od-col-r{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);grid-template-rows:minmax(0,1fr);gap:14px;min-height:0;height:100%;overflow:auto;align-items:start}
  #orders .od-panel{position:static;min-height:0;max-height:100%;padding:16px}
  #orders .od-panel:not(.idle){height:100%}
  #orders .od-panel.picker-open .od-picker{min-height:0;flex:1;max-height:none;overflow:auto}
  #orders .od-panel.picker-open .od-lines{min-height:44px;max-height:80px;flex:0 1 auto}
  #orders .od-foot{flex:none}
  #orders .od-live{display:flex;flex-direction:column;min-height:0;max-height:100%;padding:12px}
  #orders .od-live-list{height:auto;max-height:250px;min-height:90px;overflow:auto}
  #orders .od-live-head span:first-child{letter-spacing:.08em}

  #comptes{padding:18px 0;display:flex;flex-direction:column}
  #comptes .cp-head{flex:none;margin-bottom:16px;padding-bottom:10px}
  #comptes .cp-board{height:auto;flex:1;min-height:0;gap:14px}
  #comptes .cp-top{flex:none}
  #comptes .cp-form{grid-template-columns:auto 1fr 1fr;gap:12px}
  #comptes .cp-form.open{max-height:300px}
  #comptes .cp-form input,#comptes .cp-form select{min-height:44px;font-size:16px}
  #comptes .cp-days{grid-template-columns:minmax(0,1fr);max-height:none;mask-image:none;-webkit-mask-image:none;overscroll-behavior:contain}
  #comptes .cp-evs{max-height:none;overflow:visible;flex:none}
  #comptes .cp-day{align-self:start}
  #comptes .cp-ev{padding:10px 0;row-gap:8px}
  #comptes .cp-link-client,#comptes .cp-ops button{min-height:44px}
  #comptes .cp-months{flex:none}
  #comptes .cp-mgrid{max-height:110px;overflow:auto;mask-image:none;-webkit-mask-image:none;overscroll-behavior:contain}
  #comptes .cp-zonehead span{letter-spacing:.06em}
}

/* Ledger history: bounded previews on the page, full calendars in a separate sheet. */
#cpMonthLab{appearance:none;border:0;border-bottom:1px dashed currentColor;background:none;color:inherit;font:12px var(--mono);letter-spacing:.12em;padding:8px;cursor:pointer;min-height:40px}
.cp-month{flex-wrap:wrap;gap:8px}
#cpYearView,#cpCalendar,.cp-pager button,.cp-day-nav button{border:1px solid currentColor;background:transparent;color:inherit;font:11px var(--sans-cn);padding:7px 10px;min-height:36px;cursor:pointer}
.cp-pager{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
.cp-pager button:disabled,.cp-day-nav button:disabled{opacity:.35;cursor:default}
.cp-zonehead{flex-wrap:wrap;row-gap:6px}
#comptes .cp-days{grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:repeat(2,minmax(0,1fr));gap:10px;mask-image:none;-webkit-mask-image:none;padding:10px 2px}
#comptes .cp-day{min-height:0;align-self:stretch}
#comptes .cp-evs{flex:1;min-height:0;max-height:none;overflow:auto;overscroll-behavior:contain;scrollbar-width:thin}
#comptes .cp-mgrid{height:100px;max-height:none;mask-image:none;-webkit-mask-image:none;padding:8px 2px;grid-template-columns:repeat(2,minmax(0,1fr))}
.cp-day-nav{display:flex;gap:10px;flex-wrap:wrap;align-items:center;flex:none;padding:10px 0}
.cp-day-nav input{min-height:40px;min-width:0;background:transparent;border:1px solid #aaa;padding:6px;color:inherit;font:16px var(--sans-cn)}
#lhModal{z-index:8700;padding:26px 18px}
#lhModal .sheet-wrap{width:min(1050px,95vw);height:min(850px,calc(100dvh - 64px))}
#lhModal .lh-card{display:flex;flex-direction:column;gap:16px;overflow:hidden;transform:none;background:var(--paper);color:var(--ink);padding:28px}
#lhModal header{display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap;flex:none}
#lhModal h4{font:900 clamp(22px,3vw,32px) var(--serif-cn)}
.lh-tabs,.lh-controls{display:flex;gap:10px;flex-wrap:wrap;align-items:center;flex:none}
#lhModal button{cursor:pointer}
#lhModal button:disabled{opacity:.4;cursor:default}
#lhModal button:not(.sheet-x){border:1px solid #999;background:transparent;color:inherit;min-height:44px;padding:8px 12px;font:13px var(--sans-cn)}
#lhModal .lh-tabs button[aria-pressed=true]{background:var(--ink);color:var(--paper)}
#lhModal label{display:flex;align-items:center;gap:8px;font-size:12px}
#lhModal input{min-height:44px;max-width:180px;min-width:0;border:1px solid #999;padding:8px;background:#fff;color:var(--ink);font:16px var(--sans-cn)}
#lhModal [hidden]{display:none!important}
#lhSummary{font:13px/1.7 var(--sans-cn);flex:none}
.lh-content{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain}
.lh-years{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;align-content:start}
#lhModal .lh-years button{display:flex;flex-direction:column;text-align:left;gap:10px;min-height:115px}
#lhModal .lh-years b{font:900 22px var(--serif-cn)}
#lhModal .lh-years span{font-size:12px;line-height:1.8}
.lh-calendar{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:5px;align-content:start}
.lh-week{text-align:center;padding:6px;font-size:12px}
#lhModal .lh-calendar button{display:flex;flex-direction:column;align-items:flex-start;gap:4px;min-height:94px;padding:8px 5px;font-size:11px;overflow-wrap:anywhere;text-align:left}
#lhModal .lh-calendar button.today{border:2px solid var(--seal)}
#lhModal .lh-calendar b{font-size:16px}
@media(max-width:760px){
  #comptes .cp-days{grid-template-columns:1fr;grid-template-rows:none;grid-auto-rows:180px}
  #comptes .cp-month{gap:5px}
  #cpMonthLab{font-size:11px;letter-spacing:0}
  .cp-pager button{font-size:10px;padding:5px 7px}
  #lhModal{padding:14px 10px}
  #lhModal .sheet-wrap{height:calc(100dvh - 40px)}
  #lhModal .lh-card{padding:18px 12px;gap:12px}
  .lh-years{grid-template-columns:repeat(2,minmax(0,1fr))}
  #lhModal .lh-calendar button{min-height:86px;font-size:9px;padding:6px 2px}
  .lh-controls{gap:6px}
  #lhModal input{max-width:155px}
  .cp-day-nav{gap:6px}
}

/* Phone opening and quick navigation; tablet navigation keeps its existing bar. */
@media(max-width:760px){
  #loader{padding:calc(env(safe-area-inset-top) + 24px) 24px calc(env(safe-area-inset-bottom) + 24px);gap:24px}
  #loader .loader-char{font-size:104px}
  #loader .loader-meta{width:min(100%,300px);gap:12px}
  #loader .loader-bar{width:min(180px,70%)}
  #loader .loader-count{padding-left:.3em}
  #loader .loader-tag{width:100%;display:flex;flex-direction:column;gap:7px;text-align:center;font-size:9px;letter-spacing:.15em;line-height:1.7}
  #loader .loader-tag span{display:block;white-space:nowrap}
  #loader .loader-tag span+span::before{content:none}
  .nav{padding:calc(env(safe-area-inset-top) + 4px) max(12px,env(safe-area-inset-right)) 4px max(12px,env(safe-area-inset-left));gap:10px}
  .nav-logo{flex:none}
  .nav-logo .zh img{height:17px}
  .mobile-shortcuts{display:flex;align-items:center;justify-content:flex-end;gap:5px;min-width:0}
  .mobile-shortcuts a,.mobile-shortcuts .nav-menu-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;
    flex:none;min-width:40px;height:44px;margin:0;padding:0 7px;border:0;border-radius:0;background:transparent;color:inherit;
    white-space:nowrap;font:11px var(--serif-cn);letter-spacing:0;text-decoration:none;cursor:pointer}
  .mobile-shortcuts a::before,.mobile-shortcuts .nav-menu-btn::before{content:'';position:absolute;inset:6px 0;border:1px solid currentColor;border-radius:2px;opacity:.7;pointer-events:none}
  .mobile-shortcuts a[aria-current=location]::after{content:'';position:absolute;left:7px;right:7px;bottom:10px;height:1px;background:currentColor}
  .mobile-shortcuts .nav-menu-btn[aria-expanded=true]::before{background:currentColor;opacity:.12}
  .mobile-shortcuts a:focus-visible,.mobile-shortcuts .nav-menu-btn:focus-visible{outline:2px solid currentColor;outline-offset:1px}
}
@media(max-width:360px){
  .nav{gap:6px;padding-right:8px;padding-left:8px}
  .mobile-shortcuts{gap:3px}
  .mobile-shortcuts a,.mobile-shortcuts .nav-menu-btn{min-width:36px;padding:0 5px;font-size:10px}
}

@media(max-width:760px){
  /* Fill the gallery canvas with images, keeping just the caption/tag gutters. */
  #gallery .gal-head{flex-wrap:nowrap;align-items:center;padding:8px 16px 10px;gap:10px}
  #gallery .gal-head-side{width:auto;flex:none;gap:0}
  #gallery .gal-track{align-items:stretch;padding:24px 16px 32px}
  #gallery .frame{height:100%;display:flex;align-items:center}
  #gallery .frame img{height:100%;max-height:none;width:auto;max-width:none;object-fit:contain}
  #gallery .frame .tag{top:-16px}
  #gallery .frame .cap{bottom:-20px}

  /* Larger film cards support horizontal touch scrolling, alongside a flexible preview. */
  #gaModal{padding:14px 8px max(28px,env(safe-area-inset-bottom))}
  #gaModal .sheet-wrap{height:calc(var(--workspace-viewport) - 56px - env(safe-area-inset-bottom));width:100%;max-height:100%}
  #gaModal .ma-card{padding:14px 12px 10px;--ma-gutter:0px}
  #gaModal .sheet-x{width:32px;height:32px;top:7px;right:7px;font-size:20px}
  #gaModal .ma-head{margin:0;padding:0 34px 8px 0;gap:6px;align-items:center;flex-wrap:nowrap}
  #gaModal .ma-kick{font-size:7px;letter-spacing:.06em}
  #gaModal .ma-head h4{font-size:20px;margin-top:4px}
  #gaModal .ma-sum{gap:6px;letter-spacing:0;white-space:nowrap;font-size:8px}
  #gaModal .ma-sum b{font-size:12px}
  #gaModal .ma-body{display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:clamp(140px,20vh,175px) minmax(0,1fr);gap:10px;padding:8px 0;overflow:hidden}
  #gaModal .ma-side{max-height:none;min-height:0;border-right:0;padding:0 0 6px;border-bottom:1px dashed #bbb}
  #gaModal .ma-side-head{padding-bottom:4px;font-size:8px}
  #gaModal .ma-side-head button{min-height:32px}
  #gaModal .ma-list{display:flex;flex-direction:row;max-height:none;min-height:0;overflow-x:auto;overflow-y:hidden;padding:6px 0;gap:8px;overscroll-behavior:contain;touch-action:pan-x;scroll-snap-type:x proximity;-webkit-overflow-scrolling:touch}
  #gaModal .ga-row{flex:0 0 170px;min-height:84px;display:grid;grid-template-columns:18px 44px minmax(0,1fr);gap:6px;padding:8px;border:1px solid #ccc;align-items:center;touch-action:pan-x;scroll-snap-align:start}
  #gaModal .ga-thumb{width:44px;height:64px}
  #gaModal .ga-row .nm{font-size:11px;white-space:normal;line-height:1.5;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
  #gaModal .ma-main{display:flex;flex-direction:column;min-height:0;overflow:auto;padding:0;gap:8px;scrollbar-gutter:auto}
  #gaModal .ma-form{display:grid;grid-template-columns:minmax(0,.9fr) minmax(0,1.1fr);grid-template-areas:'head head' 'photo fields';grid-template-rows:auto minmax(0,1fr);gap:8px 10px;flex:1;min-height:0}
  #gaModal .ma-form[hidden]{display:none}
  #gaModal .ma-form-head{grid-area:head;flex-direction:row;align-items:center;gap:8px;padding-bottom:6px}
  #gaModal .ma-form-head>div:first-child{min-width:0;flex:1}
  #gaModal .ma-form-head b{font-size:13px;letter-spacing:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  #gaModal .ma-form-head span{font-size:8px;letter-spacing:0}
  #gaModal .ga-order{gap:6px}
  #gaModal .ga-order button{width:36px;height:40px;padding:4px}
  #gaModal .ma-photo{grid-area:photo;min-width:0;display:flex;flex-direction:column;gap:6px}
  #gaModal #gaPhoto{display:flex;justify-content:center;min-width:0;flex:1;min-height:0}
  #gaModal .ga-plate{display:flex;flex-direction:column;gap:4px;min-height:0;padding:5px;margin:0;width:100%;border:1px solid #bbb}
  #gaModal .ga-plate img{width:100%;height:0;min-height:90px;flex:1;max-height:none;object-fit:contain}
  #gaModal .ga-plate figcaption{font-size:7px;letter-spacing:0}
  #gaModal .ma-nophot{min-height:100px;font-size:9px;line-height:1.6}
  #gaModal .ma-photo-bar{margin:0;gap:4px;display:flex;flex-direction:column;align-items:stretch}
  #gaModal .ma-photo-bar button{min-height:40px;padding:5px;font-size:10px}
  #gaModal .ga-photo-note{margin:0;font-size:8px;letter-spacing:0;line-height:1.5;align-self:stretch}
  #gaModal .ga-stage{height:auto;max-height:100%;aspect-ratio:var(--ga-ar,1.5);width:min(100%,calc(clamp(100px,16vh,145px) * var(--ga-ar,1.5)));align-self:center}
  #gaModal .ga-crop-bar{margin:0;gap:4px;font-size:8px;letter-spacing:0}
  #gaModal .ga-crop-hint{flex-basis:100%;font-size:8px}
  #gaModal .ga-crop-zoom{width:100%}
  #gaModal .ga-crop-zoom input{width:100%;min-width:0;height:32px}
  #gaModal .ga-crop-bar button{min-height:32px;padding:4px 8px}
  #gaModal .ma-grid{grid-area:fields;grid-template-columns:minmax(0,1fr);gap:12px;align-content:start}
  #gaModal .ma-grid label{font-size:8px;letter-spacing:0;gap:4px}
  #gaModal .ma-grid input{height:44px;padding:6px;font-size:16px}
  #gaModal .ma-actions{position:static;flex:none;margin-top:0;padding:8px 0 0;gap:6px}
  #gaModal .ma-actions #gaSave,#gaModal .ma-actions #gaCancel,#gaModal .ma-actions #gaDel{min-height:40px;padding:7px 12px;letter-spacing:0}
  #gaModal .ma-status{font-size:9px;letter-spacing:0;line-height:1.5}
  #gaModal .ma-confirm,#gaModal .ma-alert{flex:none;padding:6px;font-size:10px;gap:6px}
  #gaModal .ma-foot{margin:0;padding-top:8px;gap:6px;flex-wrap:nowrap;align-items:center}
  #gaModal .ma-note{font-size:7px;line-height:1.6;letter-spacing:0;flex:1;min-width:0}
  #gaModal .ga-restore{font-size:9px;letter-spacing:0;min-height:40px;padding:6px 8px}
}

@media(max-width:760px){
  /* A consistent card sits in the center of the canvas below the heading. */
  #menu .stage{flex:1;min-height:0;padding:20px 0;align-items:center}
  #menu .glasscard{height:min(650px,calc(var(--workspace-viewport) - var(--workspace-nav) - 115px));min-height:0;max-height:none;padding-bottom:32px}
  #menu .glasscard .mc-page{display:none;max-height:none;overflow:auto}
  #menu .glasscard .mc-page.is-active,#menu .glasscard .mc-page.is-changing{display:flex;flex-direction:column}
  #menu .mc-head,#menu .mc-addr,#menu .mc-next,#menu .mc-fin{flex:none}
  #menu .drink{flex:1;align-content:center}
  #menu .drink{padding:clamp(9px,1.4vh,13px) 0}

  #maModal{padding:14px 8px max(28px,env(safe-area-inset-bottom))}
  #maModal .sheet-wrap{height:calc(var(--workspace-viewport) - 56px - env(safe-area-inset-bottom));width:100%;max-height:100%}
  #maModal .ma-card{padding:14px 12px 10px;--ma-gutter:0px}
  #maModal .sheet-x{width:32px;height:32px;top:7px;right:7px;font-size:20px}
  #maModal .ma-head{margin:0;padding:0 34px 8px 0;gap:6px;flex-wrap:nowrap;align-items:center}
  #maModal .ma-kick{display:block;font-size:7px;letter-spacing:.02em;line-height:1.6}
  :is(#maModal,#saModal) .ma-head h4{font-size:19px;margin-top:4px;letter-spacing:0}
  #maModal .ma-sum{gap:4px;font-size:7px;letter-spacing:0;flex-wrap:wrap;max-width:100px}
  #maModal .ma-sum b{font-size:11px}
  #maModal .ma-body{display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:clamp(125px,17vh,150px) minmax(0,1fr);gap:8px;padding:8px 0;overflow:hidden}
  #maModal .ma-side{max-height:none;min-height:0;border-right:0;padding:0 0 6px;border-bottom:1px dashed #bbb}
  #maModal .ma-side-head{padding-bottom:4px;font-size:8px}
  #maModal .ma-side-head button{min-height:32px}
  #maModal .ma-list{display:flex;flex-direction:row;max-height:none;min-height:0;overflow-x:auto;overflow-y:hidden;padding:6px 0;gap:8px;overscroll-behavior:contain;touch-action:pan-x;scroll-snap-type:x proximity;-webkit-overflow-scrolling:touch}
  #maModal .ma-group{display:contents}
  #maModal .ma-group-head{display:flex;flex-direction:column;justify-content:center;flex:0 0 52px;gap:6px;margin:0;font-size:8px;letter-spacing:0;border-right:1px dashed #bbb}
  #maModal .ma-group-head>span{flex:none;overflow-wrap:anywhere}
  #maModal .ma-row{flex:0 0 138px;min-height:72px;display:grid;grid-template-columns:22px minmax(0,1fr);gap:4px;padding:6px;border:1px solid #ccc;align-content:center;align-items:center;touch-action:pan-x;scroll-snap-align:start}
  #maModal .ma-row .no{grid-row:1/3;font-size:9px}
  :is(#maModal,#saModal) .ma-row .nm{grid-column:2;font-size:12px;line-height:1.5;letter-spacing:0;white-space:normal}
  #maModal .ma-row .pr{grid-column:2;font-size:11px}
  #maModal .ma-row .tag{grid-column:1/-1;font-size:8px}
  #maModal .ma-row.drop::before{top:0;bottom:0;left:0;width:2px;height:auto}
  #maModal .ma-main{padding:0;overflow:hidden;scrollbar-gutter:auto;min-height:0}
  #maModal .ma-form{gap:6px;min-height:0}
  #maModal .ma-fields{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,.9fr);grid-template-areas:'head head' 'fields fields' 'spec photo';gap:6px 10px;align-content:start;align-items:start;padding:0 2px;scrollbar-gutter:auto}
  #maModal .ma-form-head{grid-area:head;align-items:center;padding-bottom:6px;gap:6px}
  :is(#maModal,#saModal) .ma-form-head b{font-size:14px;letter-spacing:0}
  :is(#maModal,#saModal) .ma-form-head span{font-size:8px;letter-spacing:0}
  #maModal .ma-retire{padding:5px 8px;font-size:9px;letter-spacing:0;min-height:36px}
  #maModal .ma-grid{grid-area:fields;grid-template-columns:repeat(2,minmax(0,1fr));gap:5px 8px}
  :is(#maModal,#saModal) .ma-grid label{font-size:7.5px;letter-spacing:0;gap:2px}
  :is(#maModal,#saModal) .ma-grid label.wide{grid-column:auto}
  :is(#maModal,#saModal) .ma-grid input,:is(#maModal,#saModal) .ma-grid select,#maModal .ma-spec-row input{height:34px;padding:4px;font-size:16px}
  #maModal .ma-cat-row{gap:3px}
  #maModal .ma-cat-row button{font-size:8px;padding:3px;letter-spacing:0;min-height:36px}
  #maModal .ma-spec{grid-area:spec;gap:4px}
  #maModal .ma-spec-k{display:none}
  #maModal .ma-spec-rows{grid-template-columns:minmax(0,1fr);gap:3px}
  #maModal .ma-spec-row{grid-template-columns:minmax(0,1fr);gap:2px}
  #maModal .ma-spec-row span{font-size:7.5px;letter-spacing:0}
  #maModal .ma-spec-num input{padding-left:18px;padding-right:42px}
  #maModal .ma-photo{grid-area:photo;min-width:0;display:flex;flex-direction:column;gap:6px}
  #maModal .ma-plate{display:flex;flex-direction:column;gap:4px;padding:5px;margin:0;border:1px solid #bbb}
  #maModal .ma-plate img{width:100%;height:128px;object-fit:contain}
  #maModal .ma-plate figcaption{font-size:7px;letter-spacing:0}
  #maModal .ma-nophot{display:block;min-height:130px;line-height:1.6;font-size:9px;text-align:center}
  #maModal .ma-photo-bar{display:flex;gap:5px;margin:0}
  :is(#maModal,#saModal) .ma-photo-bar button{min-height:36px;flex:1;padding:4px 2px;font-size:8px;letter-spacing:0}
  #maModal .ma-confirm,#maModal .ma-alert{grid-area:auto;grid-column:1/-1;font-size:10px;padding:6px;gap:6px}
  #maModal .ma-actions{margin:0;padding:7px 0 0;gap:8px;min-height:44px;flex:none}
  #maModal .ma-actions button[type=submit],#maModal .ma-actions #maCancel{min-height:36px;padding:5px 16px;font-size:10px}
  #maModal .ma-status{font-size:9px;letter-spacing:0}
  #maModal .ma-foot{margin:0;padding-top:7px;font-size:7px}
  #maModal .ma-note{font-size:7px;letter-spacing:0;line-height:1.6}
}

.ma-label-short{display:none}
/* Phone menu editor: quiet type, readable labels and a compact selection rail. */
@media(max-width:760px){
  #maModal .ma-label-full{display:none}
  #maModal .ma-label-short{display:inline}
  #maModal .ma-head{text-align:left;align-items:flex-end}
  #maModal .ma-sum{max-width:110px;justify-content:flex-end;color:#62605c}
  #maModal .ma-body{grid-template-rows:100px minmax(0,1fr)}
  #maModal .ma-side-head{font:var(--phone-label-size) var(--phone-label-font);color:var(--gray-dark)}
  #maModal .ma-side-head>span{text-align:left}
  #maModal .ma-list{gap:8px;padding:4px 0 6px}
  #maModal .ma-group-head{flex-basis:38px;font-size:8px;color:#706b64}
  #maModal .ma-row{flex-basis:140px;min-height:53px;padding:6px 9px;gap:4px 6px;
    grid-template-columns:1fr auto;grid-template-rows:auto 1fr;align-content:start;text-align:left;
    border-color:rgba(40,35,30,.18);background:rgba(255,255,255,.18)}
  #maModal .ma-row.sel{border-color:rgba(151,62,49,.55);background:rgba(151,62,49,.06)}
  #maModal .ma-row .no{grid-column:1;grid-row:1;justify-self:start;font-size:9px;line-height:1.3}
  #maModal .ma-row .pr{grid-column:2;grid-row:1;justify-self:end;font-size:10px;line-height:1.3}
  :is(#maModal,#saModal) .ma-row .nm{grid-column:1/-1;grid-row:2;text-align:left;font:var(--phone-body-size)/1.4 var(--phone-body-font);
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
  #maModal .ma-row .tag{grid-row:3}
  #maModal .ma-fields{gap:6px 12px;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr)}
  #maModal .ma-form-head{text-align:left}
  :is(#maModal,#saModal) .ma-head h4,:is(#maModal,#saModal) .ma-form-head b{font-family:var(--phone-title-font);font-size:var(--phone-title-size);font-weight:900;letter-spacing:.06em}
  :is(#maModal,#saModal) .ma-form-head span{font-size:9px;color:#706b64}
  #maModal .ma-grid{gap:4px 10px}
  :is(#maModal,#saModal) .ma-grid label,#maModal .ma-spec-row>.ma-field-label{font:var(--phone-label-size)/1.3 var(--phone-label-font);color:var(--gray-dark);text-align:left;letter-spacing:.06em;gap:2px}
  :is(#maModal,#saModal) .ma-grid label.wide{grid-column:1/-1}
  :is(#maModal,#saModal) .ma-grid input,:is(#maModal,#saModal) .ma-grid select,#maModal .ma-spec-row input{
    height:30px;padding:4px 7px;font-family:var(--phone-body-font);font-size:var(--phone-body-size)!important;font-weight:400;letter-spacing:.06em;color:var(--gray-dark);
    border-color:rgba(40,35,30,.3);background:rgba(255,255,255,.48);border-radius:2px}
  #maModal #maIngZh,#maModal #maIngEn,#maModal #maEnglish,#maModal .ma-spec-row input{text-align:left}
  #maModal .ma-spec-num input{text-align:center;padding-left:18px;padding-right:42px}
  /* Preserve the archive's reading size; editing stays at Safari's 16px focus size. */
  :is(#maModal,#saModal) .ma-grid input:focus,:is(#maModal,#saModal) .ma-grid select:focus,#maModal .ma-spec-row input:focus{font-size:16px!important;letter-spacing:0}
  #maModal .ma-spec-rows{gap:4px}
  #maModal .ma-spec-row{gap:2px}
  #maModal .ma-spec-row .ma-label-short{font:inherit;letter-spacing:0}
  #maModal .ma-cat-row{gap:5px}
  #maModal .ma-cat-row select{flex:1;min-width:0;text-align:left;text-align-last:left;padding-right:0}
  #maModal .ma-cat-row button{flex:0 0 30px;min-height:30px;font-size:17px;border:1px solid rgba(40,35,30,.3);border-radius:2px}
  #maModal .ma-plate img{height:112px}
  #maModal .ma-photo-bar{gap:5px}
  :is(#maModal,#saModal) .ma-photo-bar button{font:11px var(--phone-body-font);min-height:36px}
  #maModal .ma-actions button[type=submit],#maModal .ma-actions #maCancel{font-family:var(--phone-body-font);font-size:var(--phone-body-size);min-height:38px}
}

@media(max-width:760px) and (max-height:800px){
  #maModal .ma-body{grid-template-rows:96px minmax(0,1fr)}
  #maModal .ma-row{min-height:53px}
  #maModal .ma-spec-rows{grid-template-columns:repeat(2,minmax(0,1fr));gap:5px}
  #maModal .ma-plate img{height:74px}
  #maModal .ma-nophot{min-height:76px}
}
@media(max-width:760px) and (max-height:740px){
  #maModal .ma-body{grid-template-rows:95px minmax(0,1fr);gap:6px}
  #maModal .ma-list{padding:3px 0}
  #maModal .ma-side-head button{min-height:28px;padding:4px 10px}
  #maModal .ma-row{min-height:54px;padding:6px 9px;gap:3px}
  #maModal .ma-fields{gap:5px 8px}
  #maModal .ma-grid{gap:4px 8px}
  :is(#maModal,#saModal) .ma-grid label,#maModal .ma-spec-row{gap:2px}
  #maModal .ma-form-head{padding-bottom:4px}
  #maModal .ma-plate img{height:54px}
}
@media(max-width:360px){
  #maModal .ma-head{display:block;padding-right:32px}
  #maModal .ma-kick{white-space:nowrap;font-size:6px}
  :is(#maModal,#saModal) .ma-head h4{white-space:nowrap;font-size:18px}
  #maModal .ma-sum{max-width:none;flex-wrap:nowrap;justify-content:flex-start;margin-top:4px}
  #maModal .ma-form-head{flex-direction:row}
}
@media(max-width:360px) and (max-height:740px){
  #maModal .ma-plate img{height:40px}
}

/* Keep every filmstrip card inside its scrollport, including its bottom border. */
@media(max-width:760px){
  #maModal .ma-side-head{padding-bottom:3px}
  #maModal .ma-side-head button{min-height:28px;padding:4px 10px}
  #maModal .ma-list{align-items:stretch;padding-top:3px;padding-bottom:5px}
  #maModal .ma-row{height:100%;min-height:0;grid-template-rows:auto minmax(0,1fr);overflow:hidden}
  :is(#maModal,#saModal) .ma-row .nm{align-self:center}
  #maModal .ma-group-head{flex-basis:66px;align-items:center;gap:4px;padding:0 7px;text-align:center}
  #maModal .ma-group-head>span{width:100%;overflow-wrap:break-word;line-height:1.4}
  #maModal .ma-group-en,#maModal .ma-group-cn{display:block;white-space:nowrap}
  #maModal .ma-group-head i{font-style:normal;line-height:1.2}
  #maModal .ma-cat-row{gap:8px}
  #maModal .ma-cat-row select{
    appearance:none;-webkit-appearance:none;padding-right:26px;
    background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='14' viewBox='0 0 10 14'%3E%3Cpath d='m2 5 3-3 3 3M2 9l3 3 3-3' fill='none' stroke='%233c3c40' stroke-width='1.3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
    background-repeat:no-repeat;background-position:right 8px center;background-size:10px 14px}
}

/* Private correspondence: the paper fills the canvas; no public receipt rail. */
#darkroom.private-mailbox{height:calc(var(--workspace-viewport) - var(--workspace-nav));min-height:0;max-height:1100px;
  display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:12px minmax(0,1fr) auto 12px;
  gap:10px;padding:0 24px;overflow:hidden;scroll-margin-top:var(--workspace-nav)}
#darkroom.private-mailbox>.dk-holes:first-child{grid-column:1;grid-row:1}
#darkroom.private-mailbox>.dk-holes:last-child{grid-column:1;grid-row:4}
#darkroom.private-mailbox .darkroom-typewriter{grid-column:1;grid-row:2;width:100%;height:100%;min-height:0;justify-self:center}
/* 按钮行收进打字机的视觉列（其内部 .app max-width:1040px 居中），右缘对纸面右缘，
   不再贴到屏幕最右边；窄屏 100% 时表现与原来一致。 */
#darkroom.private-mailbox .fb-actions{grid-column:1;grid-row:3;display:flex;justify-content:flex-end;gap:12px;padding:0 0 2px;
  width:min(1040px,100%);justify-self:center}
#darkroom.private-mailbox #fbSubmit,#darkroom.private-mailbox #fbOwner{width:170px;margin:0;min-height:46px;align-self:auto;font:13px/1.6 var(--serif-cn);letter-spacing:.06em}
#fbModal{padding:24px 20px}
#fbModal .sheet-wrap{width:min(1120px,96vw);height:min(800px,calc(var(--workspace-viewport) - 60px));max-height:100%}
#fbModal .fbd-card{height:100%;max-height:100%;overflow:hidden;transform:none;padding:28px 32px;gap:14px;display:flex;flex-direction:column;
  background:var(--paper);color:var(--ink);font-family:var(--serif-cn)}
#fbModal .fbd-head{flex:none;border-bottom:2px solid var(--ink);padding-bottom:16px;margin:0}
#fbModal .fbd-kick{font:10px var(--mono);letter-spacing:.16em;color:var(--gray-dark)}
#fbModal .fbd-title{display:flex;align-items:baseline;gap:20px;margin:10px 0}
#fbModal .fbd-head h4{font:900 28px/1.4 var(--serif-cn);letter-spacing:.08em;margin:0}
#fbModal #fbCount{font:11px var(--mono);color:var(--gray-dark)}
#fbModal .fbd-head p{font:12px/1.6 var(--serif-cn);color:var(--gray-dark);margin:0}
#fbModal .fbd-toolbar{display:flex;justify-content:space-between;align-items:center;gap:12px;flex:none}
#fbModal .fbd-tabs{display:flex;gap:8px}
#fbModal button:not(.sheet-x){appearance:none;border:1px solid #999;background:transparent;color:var(--ink);padding:8px 16px;min-height:44px;font:13px/1.5 var(--serif-cn);cursor:pointer}
#fbModal .fbd-tabs button[aria-pressed=true]{background:var(--ink);color:var(--paper);border-color:var(--ink)}
#fbModal button:disabled{opacity:.45;cursor:default}
#fbModal button:focus-visible{outline:2px solid var(--seal);outline-offset:2px}
#fbModal #fbNotice{flex:none;font:12px/1.7 var(--serif-cn);color:var(--gray-dark);overflow-wrap:anywhere}
#fbModal #fbNotice:empty{display:none}
#fbModal .fbd-inbox{flex:1;min-height:0;display:grid;grid-template-columns:minmax(230px,.85fr) minmax(0,1.4fr);gap:24px;overflow:hidden}
#fbModal #fbList{min-height:0;overflow:auto;overscroll-behavior:contain;padding:2px 8px 4px 2px;border-right:1px dashed #aaa;scrollbar-width:thin}
#fbModal .fbd-letter{display:flex;flex-direction:column;width:100%;gap:10px;text-align:left;border:0!important;border-bottom:1px solid #bbb!important;padding:14px 12px!important}
#fbModal .fbd-letter.selected{background:rgba(195,61,46,.06);box-shadow:inset 2px 0 var(--seal)}
#fbModal .fbd-letter-meta{display:flex;justify-content:space-between;width:100%;font:10px var(--mono);color:var(--gray-dark)}
#fbModal .fbd-letter-text{font:15px/1.7 var(--serif-cn);overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow-wrap:anywhere}
#fbModal time{font:10px/1.5 var(--mono);color:var(--gray-dark)}
#fbModal #fbDetail{display:flex;flex-direction:column;min-height:0;overflow:auto;overscroll-behavior:contain;padding:18px 20px;border:1px solid #aaa;background:rgba(255,255,255,.2)}
#fbModal #fbDetail header{display:flex;justify-content:space-between;flex-wrap:wrap;gap:10px;padding-bottom:14px;border-bottom:1px solid #bbb;font:12px var(--mono)}
#fbModal .fbd-body{white-space:pre-wrap;overflow-wrap:anywhere;font:17px/2 var(--serif-cn);margin:22px 0}
#fbModal .fbd-detail-foot{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-top:auto;padding-top:16px;border-top:1px solid #bbb;font:11px/1.6 var(--mono);color:var(--gray-dark)}
#fbModal .fbd-detail-foot button{border-color:var(--seal);color:var(--seal)}
#fbModal .fbd-empty,#fbModal .fbd-detail-empty{font:13px/1.9 var(--serif-cn);color:var(--gray-dark);padding:20px 12px}
#fbModal .fbd-detail-empty{margin:auto;text-align:center}
#fbModal .fbd-detail-empty b{font:900 20px var(--serif-cn)}
#fbModal .fbd-detail-empty p{margin-top:14px}
@media(min-width:761px) and (orientation:portrait){
  #fbModal .sheet-wrap{height:min(1000px,calc(var(--workspace-viewport) - 72px))}
  #fbModal .fbd-card{padding:30px 24px}
  #fbModal .fbd-inbox{grid-template-columns:minmax(200px,.9fr) minmax(0,1.2fr);gap:18px}
  #fbModal #fbDetail{padding:18px 16px}
}
/* Compact phone paper and actions, with breathing room above the bottom safe area. */
@media(max-width:760px){
  #darkroom.private-mailbox{padding:0 16px max(48px,calc(env(safe-area-inset-bottom) + 20px));gap:6px;
    grid-template-rows:8px minmax(0,1fr) auto 8px}
  #darkroom.private-mailbox .fb-actions{gap:9px;padding:0}
  #darkroom.private-mailbox #fbSubmit,#darkroom.private-mailbox #fbOwner{
    width:auto;min-width:0;min-height:36px;padding:6px 10px;font-size:11px;line-height:1.6;letter-spacing:.02em;white-space:nowrap}
  #fbModal{padding:18px 10px}
  #fbModal .fbd-card{padding:24px 14px 16px;gap:12px}
  #fbModal .fbd-head h4{font-size:22px}
  #fbModal .fbd-title{gap:10px;flex-wrap:wrap}
  #fbModal .fbd-inbox{grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(100px,.8fr) minmax(0,1fr);gap:12px}
  #fbModal #fbList{border-right:0;border-bottom:1px dashed #aaa}
}

/* Phone ordering: bounded work areas, with history opened separately. */
#odLogToggle{display:none}
#odLogDialog{display:none}
#odLogDialog[open]{display:flex;flex-direction:column;gap:16px;position:fixed;inset:0;margin:auto;
  width:min(560px,calc(100vw - 28px));max-height:calc(var(--workspace-viewport) - 80px);
  padding:22px 18px;background:var(--paper);color:var(--ink);border:1px solid #888;box-shadow:0 24px 90px #0009}
#odLogDialog::backdrop{background:rgba(0,0,0,.75);backdrop-filter:blur(5px)}
#odLogDialog>header{display:flex;justify-content:space-between;align-items:center;border-bottom:2px solid var(--ink);padding-bottom:12px;gap:20px;flex:none}
#odLogDialog header span{font:9px var(--mono);letter-spacing:.14em;color:var(--gray-dark)}
#odLogDialog h4{font:900 var(--phone-title-size)/1.5 var(--phone-title-font);margin-top:5px}
#odLogClose{width:36px;min-height:40px;border:1px solid #888;background:none;color:inherit;font:24px var(--serif-cn);cursor:pointer}
#odLogDialogBody{min-height:0;overflow:auto;overscroll-behavior:contain}
#odLogDialog .od-log-head{gap:6px;border-color:#aaa;padding-bottom:10px}
#odLogDialog .od-log-head span{color:var(--gray-dark);font-size:9px;letter-spacing:0}
#odLogDialog .od-log-head>span:first-child{display:none}
#odLogDialog .od-log-row{grid-template-columns:105px 1fr auto auto;font:11px/1.8 var(--mono);padding:12px 0;border-color:#bbb;gap:8px}
#odLogDialog .od-log-row .seat,#odLogDialog .od-log-row .total{color:var(--ink)}
#odLogDialog .od-log-row .mix{display:none}
#odLogDialog .od-log-del{color:var(--gray-dark);border-color:#bbb;font-size:10px;padding:4px 10px}
#odLogDialog .od-log-del:hover{color:var(--ink);border-color:#888}
#odLogDialog .od-log-empty{font:var(--phone-body-size)/1.8 var(--phone-body-font);color:var(--gray-dark);letter-spacing:0}
#odLogDialog .od-log-more{min-height:44px;color:var(--ink);letter-spacing:0;border-bottom:1px solid #bbb}
#odLogError{font:12px/1.7 var(--serif-cn);color:var(--seal)}
@media(max-width:760px){
  #orders{padding:8px 0 max(20px,env(safe-area-inset-bottom));gap:0;overflow-anchor:none}
  #orders .od-head{margin-bottom:8px;gap:6px}
  #orders [data-reveal]{opacity:1;transform:none;transition:none}
  #orders .od-owner{font-size:6px;letter-spacing:0}
  #orders .od-board{display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto auto auto;
    grid-template-areas:'map' 'panel' 'live' 'log';align-content:start;align-items:stretch;gap:8px;overflow:hidden;max-height:none}
  #orders .od-col-l,#orders .od-col-r{display:contents}
  #orders .od-map-wrap{grid-area:map;padding:6px;min-height:0}
  #orders #odMap{height:clamp(112px,17vh,150px);max-height:none}
  #orders .od-seat-hit{pointer-events:all}
  #orders .od-seat text{font-size:14px;letter-spacing:0}
  #orders .od-seat .st{font-size:11px}
  #orders .od-lab{font-size:11px;letter-spacing:1px}
  #orders .od-legend{font-size:8px;letter-spacing:.08em;padding:4px 2px 0;gap:14px}
  #orders .od-panel,#orders .od-panel:not(.idle),#orders .od-panel.picker-open,#orders .od-panel.client-open{
    grid-area:panel;position:static;height:auto;min-height:0;max-height:100%;padding:10px 12px;transition:none;overflow:hidden}
  #orders .od-panel-head{padding-bottom:7px;gap:8px;align-items:center}
  #orders .od-panel-head h4{font:900 var(--phone-title-size)/1.4 var(--phone-title-font);letter-spacing:.04em}
  #orders .od-sub{font:var(--phone-label-size)/1.5 var(--phone-label-font);letter-spacing:0;margin-top:3px}
  #orders .od-badge{font-size:9px;letter-spacing:0;padding:4px 6px}
  #orders .od-panel.idle .od-panel-head{border-bottom:0;padding-bottom:0}
  #orders .od-panel.empty-seat .od-lines{display:none}
  #orders .od-panel.empty-seat .od-sum{display:none}
  #orders .od-panel.empty-seat .od-foot{justify-content:flex-end}
  #orders.has-order .od-board,#orders:has(.od-panel.picker-open) .od-board,#orders:has(.od-panel.client-open) .od-board{
    grid-template-rows:auto minmax(0,1fr) clamp(80px,14vh,120px) 36px;align-content:stretch}
  #orders.has-order .od-panel,#orders .od-panel.picker-open,#orders .od-panel.client-open{height:100%}
  #orders .od-lines{flex:1;min-height:44px;max-height:none;margin-top:4px;overflow:auto;overscroll-behavior:contain}
  #orders .od-line{padding:7px 0}
  #orders .od-line-top{gap:6px;align-items:center}
  #orders .od-line-top .nm{font:var(--phone-body-size)/1.5 var(--phone-body-font);letter-spacing:0}
  #orders .od-line-top .pr{font-size:10px}
  #orders .od-line-top .qty{gap:4px}
  #orders .od-line-top .qty button{width:30px;height:32px;line-height:1}
  #orders .od-line-top .qty b{min-width:20px;font-size:11px}
  #orders .od-line-bot{gap:7px;margin-top:4px}
  #orders .od-line-bot input{min-height:30px;font-family:var(--phone-body-font);font-size:var(--phone-body-size)!important;letter-spacing:0}
  #orders .od-line-bot input:focus{font-size:16px!important}
  #orders .od-line-bot .del{min-width:30px;min-height:30px}
  #orders .od-picker{flex:0 0 0;min-height:0;max-height:0;margin:0;padding:0;border-width:0;transition:none}
  #orders .od-picker.open{flex:1;min-height:60px;max-height:none;margin-top:6px;padding:6px;border-width:1px;overscroll-behavior:contain}
  #orders .od-panel.picker-open .od-lines,#orders .od-panel.client-open .od-lines{flex:0 1 auto;min-height:0;max-height:56px}
  #orders .od-pick-grid{gap:6px}
  #orders .od-pick{padding:8px 6px;min-height:38px;font:var(--phone-body-size)/1.5 var(--phone-body-font);letter-spacing:0}
  #orders .od-pick .p{font-size:9px}
  #orders .od-pick-div{margin:7px 0;gap:6px}
  #orders .od-pick-div span{font-size:8px;letter-spacing:0}
  #orders .od-client{margin-top:5px;padding-top:5px;min-height:0}
  #orders .oc-lbl{font-size:8px;letter-spacing:0}
  #orders .oc-pick{min-height:30px;padding:4px 8px;font:11px/1.5 var(--phone-body-font);letter-spacing:0;max-width:70%}
  #orders .od-panel.client-open .od-client{flex:1;display:flex;flex-direction:column}
  #orders .od-panel.client-open .oc-panel{flex:1;min-height:0;display:flex;flex-direction:column;margin-top:5px}
  #orders #odClientQ{flex:none;min-height:32px;padding:5px 7px}
  #orders .oc-list{flex:1;min-height:0;max-height:none;overscroll-behavior:contain}
  #orders .oc-item{min-height:36px;font:var(--phone-body-size)/1.5 var(--phone-body-font);letter-spacing:0}
  #orders .od-foot{flex:none;flex-wrap:nowrap;gap:8px;margin-top:7px;padding-top:7px}
  #orders .od-sum{font-size:10px;letter-spacing:0;white-space:nowrap}
  #orders .od-btns{gap:7px}
  #orders .od-btn{min-height:36px;padding:6px 10px;font:var(--phone-body-size)/1.5 var(--phone-body-font);letter-spacing:0}
  #orders .od-err{flex:none;max-height:64px;overflow:auto;font-size:9px;letter-spacing:0;gap:6px;margin-top:6px}
  #orders .od-err .od-btn{padding:4px 7px;min-height:32px;font-size:10px}
  #orders .od-live{grid-area:live;display:flex;flex-direction:column;min-height:0;max-height:140px;padding:8px 10px;overflow:hidden}
  #orders .od-live-head{padding-bottom:5px;gap:6px;flex:none}
  #orders .od-live-head span:first-child{font-size:8px;letter-spacing:.08em}
  #orders .od-live-head span:last-child{font-size:8px;letter-spacing:0}
  #orders .od-live-list{height:auto;min-height:0;max-height:100px;flex:1;overflow:auto;overscroll-behavior:contain;transition:none}
  #orders .od-live-empty{padding:10px 0;font-size:9px;letter-spacing:.1em}
  #orders .od-live-card{padding:8px 4px}
  #orders .lc-main{font:var(--phone-body-size)/1.5 var(--phone-body-font);letter-spacing:0}
  #orders .lc-seat{font-size:11px}
  #orders .lc-meta{font-size:8px;letter-spacing:0}
  #orders .od-log{grid-area:log;margin:0;min-height:0}
  #orders .od-log>#odLogContent{display:none}
  #orders #odLogToggle{display:flex;justify-content:space-between;align-items:center;width:100%;min-height:36px;padding:6px 10px;
    appearance:none;border:1px solid rgba(240,237,230,.22);background:transparent;color:var(--paper);font:11px/1.5 var(--phone-body-font);cursor:pointer}
  #orders #odLogSummary{font:9px var(--mono);color:var(--gray)}
}
@media(max-width:760px) and (max-height:740px){
  #orders #odMap{height:106px}
  #orders .od-map-wrap{padding:4px}
  #orders .od-panel-head{padding-bottom:5px}
  #orders .od-panel{padding:8px 10px}
  #orders .od-sub{font-size:8px}
  #orders.has-order .od-board,#orders:has(.od-panel.picker-open) .od-board,#orders:has(.od-panel.client-open) .od-board{
    grid-template-rows:auto minmax(0,1fr) 78px 36px}
  #orders .od-panel.picker-open .od-lines,#orders .od-panel.client-open .od-lines{max-height:42px}
}

/* Keep the month sheet and its footer above the phone's bottom safe area. */
@media(max-width:760px){
  #booking{padding:14px 0 max(44px,calc(env(safe-area-inset-bottom) + 20px))}
  #booking .bk-poster{height:100%;max-height:100%;min-height:0;flex:1;
    padding:16px 8px 10px;opacity:1;transform:none;transition:none}
  #booking .bk-mast,#booking .bk-bar,#booking .bk-week,#booking .bk-foot{flex:none}
  #booking .bk-cal{min-height:0;overflow:hidden}
  #booking .bk-foot{padding-top:6px;line-height:12px;letter-spacing:0}
}

/* Calendar time axis stays visible during horizontal week navigation. */
#bkModal{--cal-head-height:70px}
#bkModal .cal-grid-head{height:var(--cal-head-height);z-index:9}
#bkModal .cal-day-head{height:100%;min-height:0}
#bkModal .cal-grid-head>.cal-corner{position:sticky;left:0;z-index:2;background:#fafafa;align-self:stretch}
#bkModal .cal-all{top:var(--cal-head-height);overflow:visible;max-height:none;z-index:8}
#bkModal .cal-all>.cal-corner{position:sticky;left:0;z-index:2;background:#fbfbfc;align-self:stretch;display:grid;place-items:center}
#bkModal .cal-all-col{max-height:88px;overflow:auto;overscroll-behavior:contain}
#bkModal .cal-hours{position:sticky;left:0;z-index:6;background:#fafafa;box-shadow:1px 0 #e8e8e8}
#bkModal .cal-month-date:not(.more)::after{content:'';position:absolute;inset:0;z-index:1;cursor:pointer}
#bkModal .cal-month-day .cal-all-event,#bkModal .cal-month-day .more{position:relative;z-index:2}
#bkModal .cal-month-day .cal-all-event{cursor:pointer}

@media(max-width:760px){
  #bkModal{padding:18px 8px max(38px,calc(env(safe-area-inset-bottom) + 16px));--cal-head-height:56px}
  #bkModal .sheet-wrap{width:100%;height:min(760px,calc(var(--workspace-viewport) - 96px - env(safe-area-inset-bottom)));max-height:100%}
  #bkModal .sheet-card{height:100%;min-height:0;max-height:100%;overflow:hidden;border-radius:6px}
  #bkModal .sheet-x{top:8px;right:8px;width:30px;height:30px}
  #bkModal .cal-toolbar{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;padding:14px 42px 10px 14px;flex:none}
  #bkModal .cal-toolbar>div:first-child{grid-column:1/-1;width:auto}
  #bkModal .cal-brand{font:var(--phone-label-size) var(--phone-label-font)}
  #bkModal #bkDTitle{font:900 var(--phone-title-size)/1.4 var(--phone-title-font);margin-top:3px}
  #bkModal .cal-modes{justify-self:start;padding:2px}
  #bkModal .cal-modes button{min-height:30px;padding:4px 10px;font:12px var(--phone-body-font)}
  #bkModal .cal-nav{margin-left:0;min-height:34px}
  #bkModal .cal-nav button{min-height:30px;font:12px var(--phone-body-font);padding:4px 9px}
  #bkModal .cal-nav button:first-child,#bkModal .cal-nav button:last-child{font-size:20px;padding:4px 9px}
  #bkModal .cal-subbar{flex:none;padding:6px 12px;gap:6px;flex-wrap:wrap}
  #bkModal #calRange{font:10px/1.5 var(--phone-body-font)}
  #bkModal #bkDCount{display:none}
  #bkModal .cal-create{margin-left:auto;gap:9px}
  #bkModal .cal-create button{font:11px var(--phone-body-font);min-height:30px;padding:4px 0}
  #bkModal .cal-surface{scrollbar-gutter:auto;min-height:0;flex:1}
  #bkModal .cal-grid-head{height:var(--cal-head-height)}
  #bkModal .cal-day-head{height:100%;padding:4px 2px;grid-template-rows:24px 14px;gap:0 3px;font-size:10px}
  #bkModal .cal-day-head b{width:24px;height:24px;font:18px var(--serif-en)}
  #bkModal .cal-day-head .holiday-label{font-size:8px}
  #bkModal .cal-hours span{font-size:10px;color:#555}
  #bkModal .cal-corner{color:#555}
  #bkModal .cal-all-col{max-height:66px}
  #bkModal .cal-surface.is-month{display:flex;flex-direction:column;overflow:hidden}
  #bkModal .cal-month-week{flex:none;height:28px;padding:5px 0;font:10px/18px var(--phone-body-font)}
  #bkModal .cal-month-grid{flex:1;min-height:0;grid-template-rows:repeat(var(--month-weeks,6),minmax(0,1fr))}
  #bkModal .cal-month-day{height:auto;min-height:0;padding:3px 2px;overflow:hidden}
  #bkModal .cal-month-date{width:23px;height:24px;margin:0 0 2px;font:13px var(--serif-en);color:var(--ink)}
  #bkModal .cal-month-day.today .cal-month-date:not(.more){color:white}
  #bkModal .cal-month-day .holiday-label{font-size:7px;margin:0;gap:1px;white-space:nowrap;overflow:hidden}
  #bkModal .cal-month-day .holiday-label i{width:10px;height:10px;font-size:7px;flex:none}
  #bkModal .cal-month-day .holiday-label>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  #bkModal .cal-md-evs{max-height:38px;padding-top:2px}
  #bkModal .cal-md-evs.has-more{max-height:20px}
  #bkModal .cal-month-day .cal-all-event{height:17px;padding:1px 2px;margin-bottom:2px;font-size:8px;line-height:15px;border-left-width:2px}
  #bkModal .cal-month-day .more{font-size:9px;min-height:15px;line-height:15px}
  #bkModal .bk-form{left:10px;right:10px;top:108px;bottom:10px;width:auto;max-height:calc(100% - 118px);
    padding:18px 12px 12px;grid-template-columns:52px minmax(0,1fr);gap:8px;border-radius:4px;overscroll-behavior:contain}
  #bkModal .bk-form label{font:11px var(--phone-label-font)}
  #bkModal .bk-form input,#bkModal .bk-form select{min-width:0;min-height:34px;padding:5px 7px}
  #bkModal .bk-form textarea{min-height:60px;max-height:100px;padding:5px 7px}
  #bkModal .bk-fmode{font:900 15px var(--phone-title-font);padding-right:30px}
  #bkModal .cal-form-close{width:32px;min-height:32px;top:4px;right:5px}
  #bkModal .cal-form-actions{position:sticky;bottom:0;min-height:40px;background:#fff;z-index:2;gap:10px;flex-wrap:wrap}
  #bkModal .bk-save{min-height:36px;padding:6px 10px;font:12px var(--phone-body-font)}
  #bkModal .cal-save-status{flex:none;max-height:72px;overflow:auto;padding:6px 12px;font-size:11px}
}

/* Linked visits use a compact display while retaining the native date picker. */
#clModal .cl-visit-field{position:relative;min-width:0;min-height:34px;display:flex;align-items:center}
#clModal #clVisitShown{display:block;max-width:100%;white-space:normal;overflow-wrap:anywhere;font:14px/1.5 var(--mono);color:var(--ink)}
#clModal #clVisit{position:absolute;inset:0;width:100%;max-width:100%;min-width:0;height:100%;margin:0;opacity:0;cursor:pointer;box-sizing:border-box}
#clModal .cl-visit-field:focus-within{outline:1px solid var(--seal);outline-offset:3px}
@media(max-width:760px){
  #clModal .sheet-spec{table-layout:fixed;width:100%}
  #clModal .sheet-spec td:first-child{width:34%}
  #clModal .sheet-spec td{min-width:0;padding:10px 12px}
  #clModal #clVisitShown{font:12px/1.6 var(--phone-body-font);letter-spacing:0}
  #clModal .sheet-spec .spec-in{min-width:0;max-width:100%;box-sizing:border-box}
  #comptes{padding:18px 0 max(40px,calc(env(safe-area-inset-bottom) + 20px));justify-content:flex-start}
  #comptes .cp-head{margin-bottom:10px;padding-bottom:8px;opacity:1;transform:none;transition:none}
  #comptes .cp-board{display:flex;flex-direction:column;flex:1;min-height:0;gap:10px;opacity:1;transform:none;transition:none}
  #comptes .cp-top{flex:none;gap:8px}
  #comptes .cp-month{row-gap:6px}
  #comptes .cp-card{padding:7px 9px;gap:3px}
  #comptes .cp-card.solde{display:grid;grid-template-columns:1fr auto;align-items:center}
  #comptes .cp-card.solde .cp-sub{grid-column:1/-1}
  #comptes .cp-actions{margin:0}
  #comptes .cp-journal{flex:1;min-height:0}
  #comptes .cp-zonehead{align-items:center;gap:6px;padding-bottom:5px}
  #comptes .cp-pager{gap:5px}
  #comptes .cp-pager button{min-height:32px;padding:5px 7px;font:10px var(--phone-body-font)}
  #comptes .cp-days{grid-template-columns:minmax(0,1fr);grid-template-rows:none;grid-auto-rows:max-content;align-content:start;
    overflow:auto;overscroll-behavior:contain;padding:9px 2px 12px;gap:9px;scrollbar-width:thin}
  #comptes .cp-day{height:auto;min-height:90px;align-self:start;flex-shrink:0;padding:9px}
  #comptes .cp-evs{flex:none;min-height:0;max-height:none;overflow:visible}
  #comptes .cp-ev{padding:8px 0;gap:5px;row-gap:6px}
  #comptes .cp-link-client{min-height:34px;padding:5px 8px;font:11px var(--phone-body-font);margin-top:0}
  #comptes .cp-ops button{min-height:30px;padding:4px 6px}
  #comptes .cp-months{flex:none}
  #comptes .cp-mgrid{height:86px;min-height:86px;max-height:86px;padding:7px 2px 2px;overflow:visible;gap:8px}
  #comptes .cp-m{min-width:0;padding:9px}
}
@media(max-width:760px) and (max-height:740px){
  #comptes{padding-top:12px;padding-bottom:max(32px,calc(env(safe-area-inset-bottom) + 16px))}
  #comptes .cp-board{gap:7px}
  #comptes .cp-head{margin-bottom:6px}
  #comptes .cp-cards{grid-template-columns:repeat(3,minmax(0,1fr))}
  #comptes .cp-card.solde{grid-column:auto;display:flex;align-items:flex-start}
  #comptes .cp-card .cp-lab{font-size:6px;letter-spacing:0}
  #comptes .cp-mgrid{height:76px;min-height:76px;max-height:76px}
}


/* Tablet menu: distribute the current page's rows through the available card. */
@media(min-width:761px) and (max-width:1400px){
  #menu{height:calc(var(--workspace-viewport) - var(--workspace-nav));min-height:0;scroll-margin-top:var(--workspace-nav);
    display:flex;flex-direction:column;justify-content:flex-start;padding:22px 0 max(28px,calc(env(safe-area-inset-bottom) + 16px))}
  #menu .menu-head{flex:none;margin-bottom:14px;padding-bottom:10px}
  #menu .stage{flex:1;min-height:0;max-height:none;padding:12px 0 0;align-items:stretch}
  #menu .glasscard{height:100%;min-height:0;padding:20px 26px 34px;grid-template-rows:minmax(0,1fr)}
  #menu .glasscard .mc-page{display:none;min-height:0;overflow:auto;overscroll-behavior:contain}
  #menu .glasscard .mc-page.is-active,#menu .glasscard .mc-page.is-changing{display:flex;flex-direction:column}
  #menu .mc-head,#menu .mc-addr,#menu .mc-next,#menu .mc-fin{flex:none}
  #menu .drink{flex:1 0 auto;align-content:center;padding:clamp(9px,1.4vh,18px) 0}
  #menu .mc-next,#menu .mc-fin{margin-top:12px}
}
@media(min-width:761px) and (max-width:1100px) and (orientation:portrait){
  #gallery{height:calc(var(--workspace-viewport) - var(--workspace-nav));min-height:0;scroll-margin-top:var(--workspace-nav);
    display:flex;flex-direction:column;padding:22px 0 max(30px,calc(env(safe-area-inset-bottom) + 16px))}
  #gallery .gal-sticky{position:relative;top:auto;height:100%;min-height:0;justify-content:flex-start}
  #gallery .gal-head{flex:none;flex-wrap:nowrap;align-items:center;padding:0 5vw 14px;gap:14px}
  #gallery .gal-head-side{width:auto;flex:none}
  #gallery .gal-track{flex:1;min-height:0;align-items:stretch;padding:36px 5vw 52px}
  #gallery .frame{height:100%;display:flex;align-items:center}
  #gallery .frame img{height:100%;width:auto;max-width:none;max-height:none;object-fit:contain}
  #gallery .frame .tag{top:-22px}
  #gallery .frame .cap{bottom:-28px}
  #gallery .gal-prog{bottom:0;left:5vw;right:5vw}
  #clients{height:calc(var(--workspace-viewport) - var(--workspace-nav));min-height:0;padding:24px 0 max(30px,calc(env(safe-area-inset-bottom) + 16px));overflow:hidden}
  #clients>.wrap{height:100%;flex:1;min-height:0;overflow:hidden}
  #clients .painlist{min-height:0;flex:1}
  #clients #clList{flex:1;min-height:0;overflow:auto;grid-template-rows:repeat(var(--cl-rows,3),minmax(170px,1fr));gap:12px 30px;align-content:stretch}
  #clients #clList.has-fold{grid-template-rows:repeat(var(--cl-rows,3),minmax(170px,1fr)) 48px}
  #clients .cl-row{align-content:center;padding:16px 4px}
  #clients .cl-info{row-gap:12px;padding-top:8px}
  #clients .cl-foldbtn{grid-column:1/-1;min-height:44px;margin:0;padding:8px 12px}
  #clients .sheet-foot{margin-top:14px}
  #clients .painlist-title[data-reveal],#clients .cl-tools[data-reveal],#clients .sheet-foot[data-reveal]{opacity:1;transform:none}
}

/* Ledger archives use the same paper, hairlines and calendar rhythm as bookings. */
#lhModal .sheet-wrap{overflow:visible}
#lhModal .sheet-x{top:8px;right:8px;width:32px;height:32px;font-size:20px;z-index:12}
#lhModal .lh-card{padding:26px 24px 16px;gap:12px;border-radius:3px;font-family:var(--serif-cn);box-shadow:0 35px 100px #0007}
#lhModal .lh-card::before,#lhModal .lh-card::after{content:'';position:absolute;top:-8px;width:68px;height:18px;background:#c9c2ae66;border:1px solid #ddd4;pointer-events:none}
#lhModal .lh-card::before{left:7%;transform:rotate(-4deg)}
#lhModal .lh-card::after{right:10%;transform:rotate(3deg)}
#lhModal header{display:flex;flex-direction:column;align-items:stretch;flex-wrap:nowrap;gap:10px;padding-bottom:0;border-bottom:2px solid var(--ink)}
#lhModal .lh-heading{display:flex;justify-content:space-between;align-items:flex-end;gap:12px;padding-right:35px}
#lhModal h4{font:900 clamp(24px,3.4vw,36px)/1.2 var(--serif-cn);letter-spacing:.06em}
#lhModal h4 em{font:italic 500 .5em var(--serif-en);letter-spacing:.04em;color:var(--gray-dark);margin-left:10px}
#lhModal .lh-period{text-align:right;flex:none;display:flex;flex-direction:column;gap:5px}
#lhModal #lhPeriodEn{font:italic 24px/1 var(--serif-en)}
#lhModal #lhPeriod{font:9px/1.4 var(--mono);letter-spacing:.08em;color:var(--gray-dark)}
#lhModal .lh-tabs{gap:16px}
#lhModal .lh-tabs button{border:0;border-bottom:2px solid transparent;background:none;color:var(--gray-dark);font:12px var(--serif-cn);padding:6px 0 8px;min-height:30px;margin-bottom:-2px}
#lhModal .lh-tabs button[aria-pressed=true]{background:none;color:var(--ink);border-bottom-color:var(--seal)}
#lhModal .lh-controls{justify-content:space-between;gap:6px}
#lhModal .lh-date-tools{display:flex;align-items:center;gap:6px;min-width:0}
#lhModal .lh-date-tools label>span{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
#lhModal .lh-controls button{min-height:32px;border:1px solid #8889;border-radius:18px;padding:5px 10px;font:11px var(--serif-cn);letter-spacing:.02em;background:transparent}
#lhModal #lhPrev,#lhModal #lhNext{width:32px;min-width:32px;height:32px;padding:0;font:20px var(--serif-en)}
#lhModal input{appearance:none;background:transparent;border:0;border-bottom:1px dashed #999;border-radius:0;min-height:32px;padding:4px 0;font:12px var(--mono);letter-spacing:0;max-width:144px;width:144px;min-width:0;color:var(--ink)}
#lhModal #lhYear{width:65px}
#lhModal #lhOpenMonth{border:0;border-radius:0;padding:4px 0;border-bottom:1px solid #999}
#lhModal .lh-summary{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;flex:none;margin:0;padding:0 0 10px;border-bottom:1px solid #9997}
#lhModal .lh-summary>div{display:flex;flex-direction:column;gap:5px;min-width:0}
#lhModal .lh-summary span{font:9px var(--mono);letter-spacing:.12em;color:var(--gray-dark)}
#lhModal .lh-summary b{font:400 14px var(--mono);letter-spacing:0;overflow-wrap:anywhere}
#lhModal .lh-summary b.out{color:var(--seal)}
#lhModal .lh-content{min-height:0;scrollbar-width:thin}
#lhModal .lh-years{grid-template-columns:repeat(3,minmax(0,1fr));grid-template-rows:repeat(4,minmax(0,1fr));gap:10px 20px;align-content:stretch}
#lhModal .lh-years button{border:0;border-bottom:1px solid #9997;border-radius:0;min-height:0;padding:5px 0 7px;gap:5px;display:grid;grid-template-rows:auto minmax(0,1fr) auto;align-content:stretch;background:transparent;overflow:hidden}
#lhModal .lh-years button.current>b{color:var(--seal)}
#lhModal .lh-years button>b{font:italic 600 22px/1 var(--serif-en);letter-spacing:0}
#lhModal .lh-years button>b em{font:400 10px var(--serif-cn);margin-left:3px}
#lhModal .lh-mini{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));grid-auto-rows:minmax(11px,1fr);gap:0;min-height:0;text-align:center}
#lhModal .lh-mini i{font:400 12px/1.3 var(--serif-en);display:grid;place-items:center;font-style:normal;min-width:0;position:relative}
#lhModal .lh-mini i.weekday{font:8px var(--mono);color:var(--gray-dark)}
#lhModal .lh-mini i.recorded{color:var(--seal);font-weight:700}
#lhModal .lh-mini i.today::after{content:'';position:absolute;width:16px;height:16px;border:1px solid var(--seal);border-radius:50%;left:50%;top:50%;transform:translate(-50%,-50%)}
#lhModal .lh-years .lh-mini-total{font:9px/1.4 var(--mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--gray-dark)}
#lhModal .lh-calendar{gap:0;grid-template-columns:repeat(7,minmax(0,1fr));grid-template-rows:25px repeat(var(--lh-weeks,6),minmax(0,1fr));align-content:stretch;overflow:hidden}
#lhModal .lh-week{text-align:left;padding:3px 5px 7px;border-bottom:1px solid #777;font:8px var(--mono);letter-spacing:.08em;color:var(--gray-dark)}
#lhModal .lh-calendar button,#lhModal .lh-pad{border:0;border-right:1px solid #9997;border-bottom:1px solid #9997;border-radius:0;min-height:0;min-width:0;padding:7px 5px;gap:5px;background:transparent;overflow:hidden;position:relative}
#lhModal .lh-calendar>:nth-child(7n){border-right:0}
#lhModal .lh-calendar button.today{border:0;border-right:1px solid #9997;border-bottom:1px solid #9997;background:transparent}
#lhModal .lh-calendar b,#lhModal .lh-pad i{font:italic 400 19px/1.2 var(--serif-en);display:grid;place-items:center;width:23px;height:25px;flex:none;position:relative;letter-spacing:0}
#lhModal .lh-calendar button.today b::after{content:'';position:absolute;inset:0;border:1px solid var(--seal);border-radius:50%;transform:rotate(-8deg)}
#lhModal .lh-pad{color:#9997;background:repeating-linear-gradient(45deg,transparent 0 8px,#00000006 8px 9px)}
#lhModal .lh-calendar span:not(.lh-week),#lhModal .lh-calendar small{font:9px/1.5 var(--mono);letter-spacing:0}
#lhModal .lh-calendar .lh-day-expense{color:var(--seal)}
#lhModal .lh-calendar small{color:var(--gray-dark)}
#lhModal .lh-foot{flex:none;border-top:1px solid #9997;padding-top:7px;font:9px/1.5 var(--mono);letter-spacing:.05em;color:var(--gray-dark)}
@media(max-width:760px){
  #lhModal{padding:20px 8px max(34px,calc(env(safe-area-inset-bottom) + 16px))}
  #lhModal .sheet-wrap{width:100%;height:calc(var(--workspace-viewport) - 76px - env(safe-area-inset-bottom));max-height:100%}
  #lhModal .lh-card{padding:22px 12px 12px;gap:9px}
  #lhModal .sheet-x{width:28px;height:28px;top:7px;right:7px}
  #lhModal h4{font-size:23px;white-space:nowrap}
  #lhModal #lhPeriodEn{font-size:20px}
  #lhModal #lhPeriod{font-size:8px;letter-spacing:0}
  #lhModal .lh-heading{padding-right:26px;gap:6px}
  #lhModal .lh-tabs button{font-size:11px;padding-bottom:6px}
  #lhModal input{font-size:11px;max-width:118px;width:118px}
  #lhModal input:focus{font-size:16px}
  #lhModal .lh-controls{row-gap:5px}
  #lhModal .lh-controls button{font-size:10px;min-height:30px;padding:4px 8px}
  #lhModal #lhPrev,#lhModal #lhNext{width:28px;min-width:28px;height:30px}
  #lhModal #lhOpenMonth{font-size:9px;margin-left:auto}
  #lhModal .lh-summary{gap:8px;padding-bottom:8px}
  #lhModal .lh-summary span{font-size:8px}
  #lhModal .lh-summary b{font-size:12px}
  #lhModal .lh-years{gap:8px 12px}
  #lhModal .lh-years button{gap:4px;padding:3px 0 5px}
  #lhModal .lh-years button>b{font-size:20px}
  #lhModal .lh-mini{grid-auto-rows:minmax(10px,1fr)}
  #lhModal .lh-mini i{font-size:10px}
  #lhModal .lh-mini i.weekday{font-size:7px}
  #lhModal .lh-years .lh-mini-total{font-size:8px}
  #lhModal .lh-week{font-size:7px;letter-spacing:0;padding:4px 3px}
  #lhModal .lh-calendar button,#lhModal .lh-pad{padding:5px 3px;gap:4px}
  #lhModal .lh-calendar b,#lhModal .lh-pad i{font-size:16px;width:20px;height:23px}
  #lhModal .lh-calendar span:not(.lh-week),#lhModal .lh-calendar small{font-size:8px;line-height:1.5}
  #lhModal .lh-foot{font-size:8px}
}
#lhModal .lh-years{grid-template-rows:repeat(4,minmax(136px,1fr))}
@media(max-width:760px){#lhModal .lh-years{grid-template-rows:repeat(4,minmax(120px,1fr))}}

/* Keep all amounts reachable on short screens and six-week months. */
#lhModal .lh-calendar{grid-template-rows:25px repeat(var(--lh-weeks,6),minmax(86px,1fr));overflow:auto}
#lhModal .lh-week{position:sticky;top:0;z-index:2;background:var(--paper)}
#lhModal button{-webkit-tap-highlight-color:transparent}


/* Annual overview prioritises monthly finances; day grids belong to month view. */
#lhModal .lh-years button{grid-template-rows:auto minmax(0,1fr) auto;gap:8px;padding:6px 0 8px}
#lhModal .lh-year-values{display:flex;flex-direction:column;justify-content:center;gap:6px;min-width:0}
#lhModal .lh-year-values>span{display:flex;justify-content:space-between;align-items:baseline;gap:5px;font:11px/1.5 var(--mono);min-width:0}
#lhModal .lh-year-values em{font:9px var(--mono);font-style:normal;color:var(--gray-dark);flex:none}
#lhModal .lh-year-values strong{font-weight:400;min-width:0;overflow-wrap:anywhere;text-align:right}
#lhModal .lh-year-values strong.out{color:var(--seal)}
#lhModal .lh-years .lh-month-count{font:9px/1.5 var(--mono);color:var(--gray-dark)}
@media(max-width:760px){
  #lhModal .lh-years{grid-template-rows:repeat(4,minmax(120px,1fr))}
  #lhModal .lh-year-values{gap:5px}
  #lhModal .lh-year-values>span{font-size:9px;gap:3px}
  #lhModal .lh-year-values em{font-size:8px}
  #lhModal .lh-years .lh-month-count{font-size:8px}
  #cpModal{padding:20px 8px max(38px,calc(env(safe-area-inset-bottom) + 18px))}
  #cpModal .sheet-wrap{width:100%;height:calc(var(--workspace-viewport) - 96px - env(safe-area-inset-bottom));max-height:100%}
  #cpModal .sheet-card{height:100%;min-height:0;max-height:100%;padding:22px 16px 14px}
  #cpModal .sheet-x{top:7px;right:7px;width:28px;height:28px;font-size:20px}
  #cpModal .cpd-head{gap:12px;padding-bottom:12px}
  #cpModal .cpd-head>div:first-child{width:100%;padding-right:22px}
  #cpModal .cpd-kick{font-size:7px;letter-spacing:.16em}
  #cpModal .cpd-head h4{font:900 var(--phone-title-size)/1.5 var(--phone-title-font);letter-spacing:.04em;margin-top:6px}
  #cpModal .cpd-sum{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;font-size:8px;letter-spacing:.08em}
  #cpModal .cpd-sum b{font-size:14px;margin-top:4px}
  #cpModal .cp-day-nav{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px;padding:10px 0;align-items:center;flex-shrink:0}
  #cpModal .cp-day-nav button{grid-row:2;min-width:0;min-height:38px;font:12px var(--phone-body-font);padding:5px 7px;white-space:nowrap}
  #cpModal .cp-day-nav input{grid-row:1;grid-column:1/-1;display:block;width:100%;max-width:100%;min-width:0;min-height:38px;font-size:16px;padding:4px;box-sizing:border-box}
  #cpModal .cp-day-nav input:focus{font-size:16px}
  #cpModal .cpd-list{min-height:0;overscroll-behavior:contain}
  #cpModal .cpd-row{padding:12px 0;gap:8px;row-gap:8px}
  #cpModal .cpd-main{font-size:var(--phone-body-size)}
  #cpModal .cpd-amt{font-size:12px}
  #cpModal .cpd-foot{gap:10px;padding-top:10px}
  #cpModal .cpd-foot button{flex:0 0 auto;min-width:88px;min-height:38px;white-space:nowrap;word-break:keep-all;letter-spacing:.06em;font-size:11px;padding:7px 12px}
  #cpModal .cpd-note{flex:1;min-width:0;font-size:8px;line-height:1.6;letter-spacing:.03em}
  #cpModal .cp-form.open{max-height:min(270px,40vh);overflow:auto;overscroll-behavior:contain}
}
@media(max-width:760px){
  #lhModal .lh-years{grid-template-rows:repeat(4,minmax(128px,1fr))}
  #lhModal .lh-year-values>span{font-size:11px}
  #lhModal .lh-year-values em,#lhModal .lh-years .lh-month-count{font-size:9px}
}

/* Opening entry switches the phone board to one scroll flow, including history. */
@media(max-width:760px){
  #comptes:has(#cpForm.open){height:calc(var(--ledger-entry-viewport,var(--workspace-viewport)) - var(--workspace-nav));padding-bottom:max(20px,calc(env(safe-area-inset-bottom) + 12px))}
  #comptes:has(#cpForm.open) .cp-board{overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;scroll-padding:12px 0}
  #comptes #cpForm.open{max-height:none;height:auto;overflow:visible;transition:none;padding:12px}
  #comptes:has(#cpForm.open) .cp-top,#comptes:has(#cpForm.open) .cp-journal,#comptes:has(#cpForm.open) .cp-months{flex:none;min-height:auto}
  #comptes:has(#cpForm.open) .cp-days{flex:none;min-height:0;height:auto;overflow:visible;max-height:none}
  #comptes:has(#cpForm.open) .cp-zonehead{flex:none;min-height:38px}
  #comptes:has(#cpForm.open) .cp-months{padding-bottom:10px}
  #comptes:has(#cpForm.open) .cp-mgrid{flex:none}
}

/* —— 客户版（?g=1）：管理入口兜底隐藏。行为层已裁剪（behaviors/index.ts），
   这里保证即使 DOM 存在也点不到、看不见。 —— */
[data-audience="guest"] #menuAdminBtn,
[data-audience="guest"] #galAdminBtn{display:none!important}
.gal-load-error{font:12px/1.8 var(--serif-cn);color:var(--paper);padding:24px 0}
.gal-load-error button{margin-left:12px;border:1px solid #aaa;background:transparent;color:inherit;padding:7px 12px;font:inherit;cursor:pointer}
html[data-audience=guest] #coloLine{cursor:default}

/* Guest navigation stays fully visible; the menu accent is guest-only. */
html[data-audience=guest] .nav{mix-blend-mode:normal}
html[data-audience=guest] .nav .nav-links a[href="#menu"],
html[data-audience=guest] .nav .mobile-shortcuts a[href="#menu"]{color:var(--seal);border-color:var(--seal)}
@media(max-width:760px){
  html[data-audience=guest] .mobile-shortcuts{gap:5px}
  html[data-audience=guest] .mobile-shortcuts a{min-width:38px;padding:0 6px}
}
@media(max-width:360px){
  html[data-audience=guest] .nav{gap:5px}
  html[data-audience=guest] .mobile-shortcuts{gap:3px}
  html[data-audience=guest] .mobile-shortcuts a{min-width:34px;padding:0 4px;font-size:10px}
}
html[data-audience=guest] .nav .nav-links a[href="#menu"],
html[data-audience=guest] .nav .mobile-shortcuts a[href="#menu"]{color:#df6654;border-color:#df6654;font-weight:700}

/* Desktop wheel scrolling continues into the page at inner-list boundaries. */
@media (min-width:761px){
  #menu .glasscard .mc-page,
  #orders .od-col-l,#orders .od-col-r,
  #orders .od-lines,#orders .od-picker.open,
  #orders .oc-list,#orders .od-live-list{overscroll-behavior-y:auto}
}

/* Keep editor rows at content height when confirmation adds another row.
   The fields pane scrolls instead of shrinking the photo row under its buttons. */
#maModal .ma-fields{grid-auto-rows:max-content}
#maModal .ma-photo{min-height:min-content}
#maModal .ma-photo-bar{flex-shrink:0}
#maModal .ma-confirm,#maModal .ma-alert{align-self:start}

/* Once the guest video is ready, reveal it without another long exit delay. */
html[data-audience="guest"] #loader{transition-duration:.35s}

/* Touch devices (phones AND iPads) keep page sections steady as browser chrome
   expands/retracts. Modal sheets retain the live root viewport for keyboard
   accommodation. Desktop (pointer:fine) stays on the live viewport. */
@media(pointer:coarse){
  #hero,#gallery,#menu,#darkroom,#orders,#booking,#notes,#clients,#comptes,#colophon{
    --workspace-viewport:var(--page-viewport,100svh);
  }
}

/* —— 点单台：滚动容器隐藏滚动条（滚轮/触摸/拖拽照常滚）。
   桌面端双列之间的灰杆非常抢戏，内部小面板的细杆同理。 —— */
#orders .od-col-l,#orders .od-col-r,
#orders .od-log,#orders .oc-list,#orders .od-live-list{scrollbar-width:none}
#orders .od-col-l::-webkit-scrollbar,#orders .od-col-r::-webkit-scrollbar,
#orders .od-log::-webkit-scrollbar,#orders .oc-list::-webkit-scrollbar,
#orders .od-live-list::-webkit-scrollbar{display:none}

/* Phone opening flows into the gallery; its height follows the framed film. */
@media(max-width:760px){
  #hero{--hero-film-width:min(100%,calc(var(--workspace-viewport) * .496));
    display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto;
    height:auto;min-height:0;gap:14px;padding:calc(var(--workspace-nav) + 12px) 16px 0;background:var(--ink)}
  #hero .hero-title{display:contents}
  #hero .hero-zh{grid-row:1;grid-column:1;justify-self:center;align-self:end;position:relative;
    display:flex;justify-content:flex-end;width:var(--hero-film-width);padding:0 14px 14px;margin:0;z-index:2;pointer-events:none;
    filter:drop-shadow(0 2px 8px rgba(0,0,0,.75))}
  /* Match the tablet wordmark's roughly 28% share of the film height. */
  #hero .hero-zh img{height:clamp(88px,30vw,148px);width:auto}
  #hero .hero-bg{position:relative;inset:auto;grid-row:1;grid-column:1;justify-self:center;align-self:start;
    width:var(--hero-film-width);height:auto;max-height:none;aspect-ratio:4/5;overflow:hidden}
  #hero .hero-bg video,#hero .hero-bg .hero-poster{object-position:50% 50%;filter:saturate(.95) contrast(1.02)}
  #hero .hero-bg .hero-poster{animation:none;will-change:auto}
  #hero .hero-bg::after{background:linear-gradient(180deg,rgba(12,12,13,.08),transparent 25%,transparent 75%,rgba(12,12,13,.15))}
  /* The translated reveal starts outside the auto-height hero's clipping edge,
     so IntersectionObserver cannot reveal it on a fresh phone load. */
  #hero .hero-addr{grid-row:2;align-self:start;position:relative;z-index:2;padding:0;
    opacity:1;transform:none;transition:none}
  #hero .hero-addr .en-rule{margin-bottom:7px}
  #hero .hero-addr address{font-size:11px;color:rgba(240,237,230,.8)}

  /* Fixed card width keeps landscape photographs from becoming long panoramas. */
  #gallery{height:auto;min-height:0;padding:24px 0 16px}
  #gallery .gal-sticky{position:relative;top:auto;flex:none;height:auto;min-height:0;padding-bottom:16px;justify-content:flex-start}
  #gallery .gal-track{flex:none;height:auto;min-height:0;align-items:center;gap:18px;padding:30px 16px 44px;
    touch-action:pan-y pinch-zoom;user-select:none;-webkit-user-select:none}
  #gallery .frame{flex:0 0 82vw;width:82vw;min-width:0;height:min(102.5vw,calc(var(--workspace-viewport) * .56));display:block}
  #gallery .frame img,#gallery .frame .gal-miss{display:block;width:100%;height:100%;max-width:none;max-height:none;min-height:0;
    object-fit:cover;object-position:var(--phone-photo-focus,50% 50%);border-radius:0;filter:saturate(.9) contrast(1.02);transform:none}
  #gallery .frame:hover img{transform:none;filter:saturate(.9) contrast(1.02)}
  #gallery .frame .tag{top:-19px;max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
  #gallery .frame .cap{bottom:-25px;line-height:1.5;letter-spacing:.08em}
  #gallery .frame .cap>span{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
  #gallery [data-photo-key="vision01"]{--phone-photo-focus:50% 60%}
  #gallery [data-photo-key="vision02"]{--phone-photo-focus:58% 55%}
  #gallery [data-photo-key="vision03"]{--phone-photo-focus:66% 50%}
  #gallery [data-photo-key="vision04"]{--phone-photo-focus:50% 50%}
  #gallery [data-photo-key="vision05"]{--phone-photo-focus:50% 50%}
  #gallery [data-photo-key="vision06"]{--phone-photo-focus:62% 50%}
  #gallery [data-photo-key="vision07"]{--phone-photo-focus:60% 50%}
  #gallery [data-photo-key="vision08"]{--phone-photo-focus:50% 50%}
  #gallery [data-photo-key="vision09"]{--phone-photo-focus:50% 50%}
  #gallery [data-photo-key="vision10"]{--phone-photo-focus:58% 50%}
  #gallery .gal-prog{touch-action:pan-y pinch-zoom}
}

/* ============================================================
   56 · 管理弹窗两态布局（≤760px，浏览 / 编辑）
   原来手机端把酒款列表压成顶部一条横滑卡（一屏只见三款），找酒很费劲，
   而编辑区在没选中时是一大片空白——空间分配反了。现在分两态：
     浏览（#maModal 无 data-editing）：列表回到竖向大区占满主体，
       一屏 8~10 行；编辑区整块退场。
     编辑（#maModal[data-editing="1"]，由 menuAdmin 行为按表单 hidden 翻转）：
       列表整块折叠，表单满屏，标题行给「换一款」送回大列表。
   长按拖动换位仍发生在浏览态大列表里（拖动轴因此恒为纵向）。
   桌面与 iPad 的双栏布局一条不碰。
   ============================================================ */
#maModal #maBack{display:none}
@media(max-width:760px){
  /* 2468 起的横滑布局把 .ma-body 定成两行 grid（列表行 95~150px）。两态布局下
     可见的永远是那一个大区，单行 1fr 即可：浏览态剩列表、编辑态剩表单。 */
  #maModal .ma-body{grid-template-rows:minmax(0,1fr)}
  #maModal .ma-side{min-height:0;border-bottom:1px dashed rgba(12,12,13,.18);padding:0 0 6px}
  /* touch-action:pan-y 是滚动 bug 的根因修复：2472 行的横滑卡时代给列表钉了
     pan-x（竖向手势被整条吞掉，列表看得见滚不动），这里必须显式放开纵向；
     scroll-snap 同理一并退场。 */
  #maModal .ma-list{display:block;overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch;touch-action:pan-y;scroll-snap-type:none;padding:2px 4px 4px}
  /* 行回归桌面端的单行结构（编号 | 名称 | 价格 | 标签）：
     横滑卡时代的 height:100% / 两行卡 / pan-x 在竖列表里全是反作用。 */
  #maModal .ma-list .ma-row{flex:none;width:100%;height:auto;min-height:48px;grid-template-columns:36px minmax(0,1fr) auto auto;
    gap:8px;align-items:center;border:0;border-bottom:1px solid rgba(12,12,13,.1);padding:6px 4px;
    touch-action:pan-y;scroll-snap-align:none}
  #maModal .ma-list .ma-row .no{grid-column:1;grid-row:1;justify-self:start;text-align:left;font-size:10px}
  #maModal .ma-list .ma-row .nm{grid-column:2;grid-row:1;text-align:left;font-size:13px;line-height:1.5;letter-spacing:.04em;white-space:nowrap}
  #maModal .ma-list .ma-row .pr{grid-column:3;grid-row:1;font-size:11px}
  #maModal .ma-list .ma-row .tag{grid-column:4;grid-row:1;font-size:8px}
  /* 分组头退掉横滑卡时代的竖窄栏（2474 / 2599：66px 竖排居中、右侧虚线），
     回到横向一行：SIGNATURE 特调 …… 6。放在这两条之后，同特异性后者胜。 */
  #maModal .ma-group-head{flex-direction:row;flex:none;justify-content:space-between;align-items:baseline;
    gap:8px;margin:12px 2px 4px;padding:2px 4px;border-right:0;text-align:left;
    font-size:9px;letter-spacing:.18em}
  #maModal .ma-group-head>span{width:auto}
  #maModal .ma-group-en,#maModal .ma-group-cn{display:inline;white-space:normal}
  #maModal .ma-main{display:none}
  #maModal .ma-side::after{content:'点一下编辑 · 换位用「排序」箭头';display:block;flex:none;padding:6px 2px 0;
    font-family:var(--mono);font-size:8.5px;letter-spacing:.1em;color:var(--gray)}
  #maModal[data-editing="1"] .ma-side{display:none}
  #maModal[data-editing="1"] .ma-main{display:flex}
  #maModal[data-editing="1"] #maBack{display:inline-block;appearance:none;flex:none;border:1px solid rgba(12,12,13,.4);
    background:none;color:var(--ink);font-family:var(--mono);font-size:9.5px;letter-spacing:.1em;padding:7px 10px;
    cursor:pointer;white-space:nowrap;min-height:32px}
}

/* ============================================================
   57 · 管理列表：分类筛选 + 英文名副行 + 箭头排序（酒单 / 基酒共用）
   长按拖动换位在手机上不直观，两边统一改成「排序」开关：按下列表进入
   排序态，每行行尾出现 ↑ / ↓，点一下即换位（酒单走同一分类内 moveDrink，
   基酒在 doc.items 里与同分类相邻款对调）。排序态的行是 div 不是 button
   —— button 里不能嵌 button，行本身在排序态也不再响应点选。
   ============================================================ */
.ma-side-actions{display:flex;flex:none;align-items:center;gap:6px}
.ma-filter{flex:none;display:flex;padding:6px 0 2px}
.ma-filter select{flex:1;min-width:0;width:0;border:1px solid rgba(12,12,13,.3);background:rgba(255,255,255,.6);
  color:var(--ink);font:13px var(--sans-cn);padding:7px 8px}
/* 英文名落在中文名下面一行（酒单管理列表） */
.ma-row .nm .en{display:block;font-style:normal;font-family:var(--mono);font-size:9px;letter-spacing:.06em;
  color:var(--gray);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 排序态：行变 div，行尾一对箭头 */
.ma-row.sorting{cursor:default}
.ma-row.sorting:hover{background:rgba(12,12,13,.03)}
.ma-row .mv{display:flex;flex:none;align-items:center;gap:4px}
.ma-row .mv .ma-move{appearance:none;flex:none;width:30px;min-width:30px;min-height:30px;padding:0;
  border:1px solid rgba(12,12,13,.4);background:none;color:var(--ink);font:13px/1 var(--mono);
  cursor:pointer;display:grid;place-items:center}
.ma-row .mv .ma-move:disabled{opacity:.35;cursor:default}
/* 酒单行加第五列给箭头（桌面基准与两态手机块都是四列 no|nm|pr|tag） */
#maModal .ma-row.sorting{grid-template-columns:36px minmax(0,1fr) auto auto auto}
/* 基酒行是 no|nm|mv 三列（分组头接管分类信息后行内不再有副行） */
#saModal .ma-row.sorting{grid-template-columns:25px minmax(0,1fr) auto}
#saModal .ma-row.sorting .mv{grid-column:3;grid-row:1}
@media(max-width:760px){
  .ma-row .mv .ma-move{width:34px;min-width:34px;min-height:34px}
  #saModal .ma-side-actions button{min-height:32px;padding:6px 9px}
}
/* 酒单管理列表翻页器（与基酒 sa-list-pager 同款：◀ n/m ▶，到边界按钮变灰） */
#maModal .ma-list-pager{display:flex;flex:none;align-items:center;gap:6px;border-top:1px solid rgba(12,12,13,.14);
  padding:8px 2px 0;justify-content:space-between}
#maModal .ma-list-pager button{appearance:none;flex:none;min-height:28px;min-width:30px;font:10px var(--mono);
  color:var(--ink);padding:4px 8px;cursor:pointer;background:none;border:1px solid rgba(12,12,13,.4)}
#maModal .ma-list-pager button:disabled{opacity:.45;cursor:default}
#maModal .ma-list-pager span{font:9px var(--mono);letter-spacing:.1em;color:var(--gray)}

/* ============================================================
   58 号块 · 客户端尾页一屏平衡（≤760）：
   客户版索引只有四行、也没有字号/速度控件，旧布局内容偏短，
   列表和页脚之间空一大块。让题词区吃掉多余高度、索引贴住页脚，
   行距略放宽。店主版不受益（内容本来就满）。
   ============================================================ */
@media(max-width:760px){
  html[data-audience=guest] #colophon>.wrap{display:flex;flex-direction:column}
  html[data-audience=guest] #colophon .colo-grid{flex:1;min-height:0;display:flex;flex-direction:column;align-items:stretch}
  html[data-audience=guest] #colophon .colo-left{flex:1;min-height:0;display:flex;flex-direction:column}
  html[data-audience=guest] #colophon .colo-reader{flex:1;min-height:160px;height:auto}
  html[data-audience=guest] #colophon .colo-list{margin-top:10px}
  html[data-audience=guest] #colophon .colo-list a{padding:14px 2px}
}
/* Both directories share the printed glass menu; the spirit archive has no ordering fields. */
#menu .menu-admin-buttons{display:flex;flex-wrap:wrap;gap:8px}
#menu .menu-section-tabs{position:relative;z-index:3;width:min(1080px,92vw);margin:0 auto 12px;display:flex;gap:8px;padding-right:108px;flex:none;min-height:36px;pointer-events:none}
#menu .menu-section-tabs>button,#menu .sp-toolbar-pager{pointer-events:auto}
#menu .menu-section-tabs>button{background:rgba(12,12,13,.75);border:1px solid rgba(240,237,230,.25);color:rgba(240,237,230,.6);padding:6px 18px;font:18px var(--serif-en);cursor:pointer}
#menu .menu-section-tabs>button[aria-pressed=true]{border-color:var(--paper);color:var(--paper)}
#menu .sp-toolbar-pager{position:absolute;right:0;top:0}
#menu .sp-toolbar-pager .sp-pager{gap:12px;color:var(--paper)}
#menu .sp-toolbar-pager .sp-pager>span{display:none}
#menu .sp-toolbar-pager button{width:42px;height:36px;min-height:36px;padding:0;border:0;border-radius:2px;background:linear-gradient(180deg,#f4f4f6,#bcbcc0 55%,#eaeaed);color:#28282b;font-size:13px;cursor:pointer}
.sp-page-number{font:9px var(--mono);letter-spacing:.34em;color:rgba(240,237,230,.4);white-space:nowrap}
#menu .menu-classic-panel{position:relative;z-index:2;min-height:0}
#menu .menu-classic-panel[hidden],#menu .menu-spirits-panel[hidden]{display:none!important}
#menu .menu-classic-panel .stage{padding-top:0}
#menu .glasscard .clip{top:-48px;left:auto;right:54px;width:42px;height:36px;transform:none;border-radius:2px}
#menu .glasscard .clip-r{right:0;left:auto;transform:none}
#menu .glasscard .clip::before{content:'◀';font-size:13px;letter-spacing:0}
#menu .glasscard .clip-r::before{content:'▶'}
#menu .glasscard .clip:hover{transform:none}
#menu .menu-spirits-panel{position:relative;z-index:2;width:min(1080px,92vw);margin:0 auto;min-height:0}
.spirits-catalog{display:grid;grid-template-columns:150px minmax(0,1fr);gap:24px;padding:24px;border:1px solid rgba(240,237,230,.15);border-radius:6px;background:linear-gradient(160deg,rgba(14,14,16,.96),rgba(8,8,9,.92));color:var(--paper);min-height:460px}
.sp-categories{display:flex;flex-direction:column;gap:8px;align-items:stretch}
.sp-categories button{display:flex;align-items:center;justify-content:space-between;gap:8px;text-align:left;min-height:44px;background:none;border:1px solid transparent;border-bottom-color:rgba(240,237,230,.15);color:rgba(240,237,230,.65);padding:9px 10px;cursor:pointer}
.sp-categories button[aria-pressed=true]{color:var(--paper);border-color:rgba(240,237,230,.6)}
.sp-categories small{font:9px var(--mono);opacity:.65}
.sp-public-page{min-width:0}
.sp-page-head{display:flex;justify-content:space-between;align-items:center;gap:12px;border-bottom:1px solid rgba(240,237,230,.3);padding-bottom:12px}
.sp-page-head h4{margin:0}
.sp-pager{display:flex;align-items:center;justify-content:flex-end;gap:10px;flex:none}
.sp-pager span{font:11px var(--mono);white-space:nowrap;opacity:.65}
.sp-pager button{min-width:38px;min-height:36px;background:none;border:1px solid currentColor;color:inherit;cursor:pointer}
.sp-count{font:9px/1.7 var(--mono);letter-spacing:.18em;color:rgba(240,237,230,.5);margin:7px 0 10px}
.sp-bottle{display:grid;grid-template-columns:64px minmax(0,1fr) 12px;gap:16px;align-items:center;width:100%;padding:14px 0;text-align:left;background:none;border:0;border-bottom:1px dashed rgba(240,237,230,.2);color:inherit;cursor:pointer}
.sp-bottle-copy{display:flex;min-width:0;flex-direction:column;gap:0}
.sp-bottle-copy strong{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sp-bottle-copy>.en{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;white-space:pre-line;overflow-wrap:anywhere}
.sp-image{display:flex;align-items:center;justify-content:center;width:64px;height:80px;background:rgba(127,127,127,.08);overflow:hidden;flex:none}
.sp-image img{display:block;width:100%;height:100%;object-fit:contain}
.sp-image>span{font:9px/1.8 var(--mono);opacity:.5;padding:6px;text-align:center}
.sp-empty{padding:60px 12px;text-align:center;opacity:.5;font:16px var(--serif-cn)}
.sp-overlay{position:fixed;inset:0;z-index:8550;background:rgba(0,0,0,.78);backdrop-filter:blur(5px);display:flex;align-items:center;justify-content:center;padding:20px;overscroll-behavior:contain}
.sp-modal{background:#eeece4;color:#1b1917;width:min(1080px,100%);max-height:calc(100dvh - 40px);overflow:auto;border-radius:6px;padding:24px;box-shadow:0 20px 100px #0008;font:14px/1.7 var(--serif-cn);overscroll-behavior:contain;scrollbar-width:thin}
.sp-modal-head{position:sticky;top:-24px;z-index:5;background:#eeece4;display:flex;align-items:center;justify-content:space-between;gap:20px;border-bottom:2px solid #201e1b;padding:10px 0 12px;margin-bottom:18px}
.sp-modal-head h4{font:900 26px var(--serif-cn);margin:0;overflow-wrap:anywhere}
.sp-modal button{cursor:pointer;min-height:36px;padding:6px 12px;background:transparent;border:1px solid #918d84;color:inherit;font:inherit;line-height:1.3}
.sp-modal .sp-close{flex:none;font:30px/1 var(--serif-en);width:40px;height:40px;padding:0;border-radius:50%;background:#a93020;border:2px solid #eee;color:#eee}
.sp-modal input,.sp-modal textarea,.sp-modal select{box-sizing:border-box;display:block;max-width:100%;min-width:0;width:100%;background:#ffffff55;border:1px solid #aaa69f;border-radius:0;color:inherit;padding:9px;font:16px/1.5 var(--serif-cn)}
.sp-modal [hidden]{display:none!important}
.sp-modal button:disabled,.sp-pager button:disabled{opacity:.35;cursor:default}
.sp-modal :focus-visible,.spirits-catalog :focus-visible,#menu .menu-section-tabs :focus-visible{outline:2px solid #b33a2a;outline-offset:3px}
.sp-detail{width:min(620px,100%)}
.sp-detail .sp-image-large{width:100%;height:260px;background:rgba(0,0,0,.03)}
.sp-detail-category{opacity:.6;font:12px var(--mono);margin:20px 0 10px}
.sp-full-info{white-space:pre-wrap;overflow-wrap:anywhere;line-height:1.9}
.sp-admin-tools{display:grid;grid-template-columns:minmax(160px,1fr) minmax(110px,160px) auto auto auto;gap:8px;align-items:stretch}
.sp-admin-status{margin:10px 0;min-height:24px;overflow-wrap:anywhere;color:#8b3025}
.sp-admin-body{display:grid;grid-template-columns:260px minmax(0,1fr);gap:24px}
.sp-admin-list{min-width:0}
.sp-admin-list>p{font-size:12px;opacity:.65;margin:0 0 10px}
.sp-admin-list>button{display:flex;flex-direction:column;width:100%;text-align:left;border-bottom:0;gap:3px;padding:10px}
.sp-admin-list>button:last-of-type{border-bottom:1px solid #918d84}
.sp-admin-list>button[aria-pressed=true]{background:#ded9cd;border-left:3px solid #aa3525}
.sp-admin-list strong{font-size:15px;overflow-wrap:anywhere}
.sp-admin-list small{font-size:11px;opacity:.55}
.sp-admin-list .sp-pager{margin:14px 0;justify-content:space-between}
.sp-edit-form{min-width:0;align-self:start}
.sp-edit-form fieldset{border:0;display:grid;gap:14px;min-width:0;padding:0;margin:0}
.sp-edit-form label{display:grid;gap:4px}
.sp-edit-photo{display:flex;align-items:center;flex-wrap:wrap;gap:10px}
.sp-edit-photo .sp-image{width:100px;height:125px}
.sp-edit-actions{display:flex;flex-wrap:wrap;gap:10px;border-top:1px solid #aaa69f;padding-top:16px;margin-top:18px}
.sp-edit-actions>button:first-child{background:#191718;color:#eeece4;padding:9px 32px}
.sp-edit-hint{opacity:.55;padding:40px 20px;text-align:center}
.sp-category-editor>p{opacity:.6;font-size:12px}
.sp-category-editor>form{display:flex;gap:10px;margin:16px 0}
.sp-category-editor>form>input{flex:1}
.sp-category-editor>form>button{flex:none}
.sp-category-edit{display:flex;align-items:center;gap:8px;border-bottom:1px solid #bbb6ac;padding:10px 0}
.sp-category-edit>span,.sp-category-edit>input{flex:1;min-width:0;overflow-wrap:anywhere}
.sp-category-edit button{flex:none}
@media(max-width:1400px){
  #menu .menu-classic-panel{display:flex;flex-direction:column;flex:1;min-height:0}
  #menu .menu-classic-panel .stage{padding:0;align-items:stretch;flex:1;min-height:0}
  #menu .menu-classic-panel .glasscard{height:100%;min-height:0}
  #menu .menu-spirits-panel{flex:1;overflow-y:auto;overscroll-behavior-y:auto;padding-bottom:12px}
  .spirits-catalog{min-height:0}
  .sp-admin-tools{grid-template-columns:minmax(0,1fr) minmax(100px,140px);}
  .sp-admin-tools>input{grid-column:1 / -1}
  .sp-admin-body{grid-template-columns:220px minmax(0,1fr)}
}
/* A tablet page owns only the space below the navigation, heading and tabs.
   The list measures this remaining height to choose a readable page capacity. */
@media(min-width:761px) and (max-width:1400px){
  #menu .menu-spirits-panel{display:flex;flex-direction:column;overflow:hidden;padding-bottom:0}
  #menu .spirits-catalog{flex:1;height:100%;min-height:0;grid-template-rows:minmax(0,1fr);padding:20px 26px 24px;overflow:hidden}
  #menu .sp-public-page{min-height:0;display:grid;grid-template-rows:auto auto minmax(0,1fr)}
  #menu .sp-page-head{padding-bottom:12px}
  #menu .sp-bottle-list{min-height:0;display:grid;grid-auto-rows:minmax(0,1fr);overflow:hidden}
  #menu .sp-bottle{min-height:0;grid-template-columns:54px minmax(0,1fr) 12px;padding:8px 0;gap:14px;overflow:hidden}
  #menu .sp-bottle .sp-image{width:54px;height:64px;max-height:100%}
  #menu .sp-categories{min-height:0;overflow-y:auto;scrollbar-width:thin}
  #menu .sp-categories button{flex:none}
}
@media(max-width:760px){
  #menu .menu-head{width:92vw;margin-left:auto;margin-right:auto;gap:10px;align-items:center;flex-wrap:nowrap}
  #menu .menu-head .menu-admin{font-size:11px;padding:7px 9px;letter-spacing:0}
  #menu .menu-admin-buttons{gap:5px;flex-wrap:nowrap}
  #menu .menu-t em{font-size:12px;margin-left:6px}
  #menu .menu-section-tabs>button{font-size:16px;padding:6px 14px}
  #menu .menu-classic-panel .glasscard{width:92vw}
  .spirits-catalog{display:flex;flex-direction:column;gap:14px;padding:14px}
  .sp-categories{flex-direction:row;overflow-x:auto;gap:6px;padding:0 0 8px;scrollbar-width:thin}
  .sp-categories button{flex:none;white-space:nowrap;padding:7px 10px}
  .sp-bottle{grid-template-columns:54px minmax(0,1fr) 10px;gap:10px;padding:12px 0}
  .sp-bottle .sp-image{width:54px;height:68px}
  .sp-count{font-size:8px;margin-top:4px}
  .sp-overlay{padding:12px 8px max(12px,env(safe-area-inset-bottom))}
  .sp-modal{padding:16px 12px;max-height:calc(100dvh - 24px - env(safe-area-inset-bottom))}
  .sp-modal-head{top:-16px;margin-bottom:12px}.sp-modal-head h4{font-size:23px}
  .sp-admin-body{display:flex;flex-direction:column;gap:18px}
  .sp-admin-list{max-height:220px;overflow:auto;border-bottom:1px solid #aaa69f}
  .sp-admin-list .sp-pager{position:sticky;bottom:0;background:#eeece4;padding:8px 0;margin:0}
  .sp-admin-tools{grid-template-columns:1fr 1fr;gap:6px}
  .sp-admin-tools>input{grid-column:1 / -1}
  .sp-admin-tools>button:last-child{grid-column:1 / -1}
  .sp-category-edit{flex-wrap:wrap;gap:6px}.sp-category-edit>span,.sp-category-edit>input{flex-basis:100%}
}
/* The spirit editor shares MenuAdmin's paper, type hierarchy and controls. */
#saModal{z-index:8550;padding:20px}
#saModal .sheet-wrap{width:min(1080px,96vw);height:min(760px,92dvh);max-height:100%}
#saModal .sa-card{height:100%;min-height:0;--ma-gutter:0px}
#saModal .ma-head,#saModal .ma-foot{margin-right:0}
#saModal .sa-body{display:grid;grid-template-columns:minmax(170px,230px) minmax(0,1fr);grid-template-rows:minmax(0,1fr);overflow:hidden}
#saModal .sa-side{max-height:none;min-width:0;border-right:1px dashed rgba(12,12,13,.18);border-bottom:0;padding:0 12px 0 0}
#saModal .sa-filter{display:flex;flex:none;align-items:center;gap:6px;padding:8px 0}
#saModal .sa-filter select{flex:1;min-width:0;width:0}
#saModal .sa-filter select,#saModal .sa-category-new input,#saModal .sa-category-row input{border:1px solid rgba(12,12,13,.3);background:rgba(255,255,255,.6);color:var(--ink);font:13px var(--sans-cn);padding:7px 8px;min-width:0}
#saModal .sa-button,#saModal .sa-filter button,#saModal .sa-category-row button{appearance:none;flex:none;background:none;border:1px solid rgba(12,12,13,.4);color:var(--ink);font:9.5px var(--mono);letter-spacing:.1em;padding:7px 10px;cursor:pointer;white-space:nowrap;width:auto}
#saModal button:disabled{opacity:.45;cursor:default}
#saModal .sa-list{max-height:none;scrollbar-width:thin;padding-right:6px}
#saModal .ma-row{grid-template-columns:25px minmax(0,1fr);gap:4px 8px;align-items:center}
#saModal .ma-row .nm{font-weight:400}
#saModal .sa-list-pager{flex:none;border-top:1px solid rgba(12,12,13,.14);padding-top:8px;justify-content:space-between}
#saModal .sa-list-pager button{min-height:28px;min-width:30px;font:10px var(--mono);color:var(--ink);padding:4px 8px;cursor:pointer}
#saModal .sa-list-pager span{font:9px var(--mono);letter-spacing:.1em;color:var(--gray)}
#saModal .sa-main{padding-right:0;overflow:hidden;display:flex;flex-direction:column;min-height:0}
#saModal .sa-form{height:100%;flex:1;min-height:0;overflow:hidden}
#saModal .sa-fields{flex:1;min-height:0;display:grid;grid-template-columns:minmax(0,1fr) minmax(150px,240px);grid-template-rows:auto minmax(0,1fr);grid-template-areas:'head head' 'fields photo';gap:12px 18px;align-items:stretch;overflow:hidden}
#saModal .ma-form-head{grid-area:head;min-width:0;flex:none}
#saModal .ma-form-head>div{min-width:0}
#saModal .ma-form-head b{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#saModal .sa-grid{grid-area:fields;border:0;margin:0;padding:0;min-width:0;min-height:0;grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:auto minmax(0,1fr);align-content:stretch}
#saModal .sa-grid label{min-height:0}
#saModal .sa-category-field{display:grid;grid-template-columns:minmax(0,1fr) 102px;gap:10px;align-items:end;min-width:0}
#saModal .sa-category-field label{min-width:0}
#saModal .sa-category-field select{width:100%;height:42px;border-radius:999px;text-align:center;text-align-last:center}
#saModal .sa-new-category{appearance:none;height:42px;padding:7px 10px;border:1px solid var(--ink);border-radius:999px;background:var(--ink);color:var(--paper);font:10px var(--mono);white-space:nowrap;cursor:pointer}
#saModal .sa-grid label.sa-info{grid-column:1/-1}
#saModal .sa-info{min-height:0;display:flex;flex-direction:column}
#saModal .sa-info textarea{flex:1;min-height:0;width:100%;resize:none;overflow:auto;border:1px solid rgba(12,12,13,.3);background:rgba(255,255,255,.6);color:var(--ink);font:13px/1.7 var(--sans-cn);padding:8px 9px;scrollbar-width:thin}
#saModal .sa-info textarea:focus{outline:none;border-color:var(--seal)}
#saModal .sa-photo{grid-area:photo;min-height:0;display:flex;flex-direction:column;align-self:stretch;gap:8px}
#saModal .sa-photo-frame{flex:1;min-height:0;display:flex;align-items:center;justify-content:center;border:1px solid rgba(12,12,13,.3);padding:8px;background:rgba(255,255,255,.2)}
#saModal .sa-photo .sp-image{width:100%;height:100%;min-height:0;background:none}
#saModal .sa-photo .sp-image img{object-fit:contain}
#saModal .sa-photo .sp-image>span{font:9px var(--mono);color:var(--gray)}
#saModal .ma-photo-bar{flex:none;display:flex;gap:8px;flex-wrap:nowrap;margin-top:0}
#saModal .ma-photo-bar button{flex:1;min-width:0;padding:8px 6px;white-space:nowrap}
#saModal .sa-actions{position:static;flex:none;justify-content:center}
#saModal .sa-cancel{appearance:none;background:none;border:1px solid rgba(12,12,13,.4);color:var(--ink);font:10px var(--mono);letter-spacing:.16em;padding:10px 16px;cursor:pointer}
#saModal .ma-confirm{flex:none}
#saModal .ma-foot{flex-wrap:nowrap;min-height:24px;gap:10px}
#saModal .ma-status{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#saModal .sa-category-editor{display:flex;flex:1;min-height:0;flex-direction:column;gap:12px;overflow:hidden}
#saModal .sa-category-new{flex:none}
#saModal .sa-category-list{flex:1;min-height:0;overflow:auto;scrollbar-width:thin}
#saModal .sa-category-row{display:flex;align-items:center;gap:6px;padding:9px 0;border-bottom:1px dotted rgba(12,12,13,.16)}
#saModal .sa-category-row>span,#saModal .sa-category-row>input{flex:1;min-width:0;font-size:13px}
#saModal .sa-category-row small{font:9px var(--mono);color:var(--gray)}
#saModal [hidden]{display:none!important}
/* All red circular modal close buttons use one centered, legible × glyph. */
button.sheet-x{display:grid;place-items:center;padding:0;text-align:center;font-family:Arial,sans-serif!important;font-size:24px!important;line-height:1!important}
@media(min-width:901px) and (min-height:650px){
  #saModal{padding:24px 16px}
  #saModal .sheet-wrap{width:min(1280px,96vw);height:min(940px,94dvh)}
  #saModal .sa-card{padding:18px 22px}
  #saModal .ma-head{padding-bottom:10px}
  #saModal .sa-body{grid-template-columns:clamp(160px,18vw,230px) minmax(0,1fr);gap:18px;padding:12px 0}
  #saModal .sa-info textarea{font-size:16px}
}
@media(min-width:640px) and (max-width:900px){
  #saModal .sheet-wrap{width:min(680px,96vw);height:min(92dvh,920px)}
  #saModal .sa-body{grid-template-columns:160px minmax(0,1fr);gap:12px}
  #saModal .sa-fields{grid-template-columns:minmax(0,1fr) 140px;gap:10px 12px}
  #saModal .sa-grid{grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto minmax(0,1fr)}
}
@media(min-width:761px) and (max-width:1100px) and (orientation:portrait){
  #saModal{padding:24px 16px}
  #saModal .sheet-wrap{width:96vw;height:calc(var(--workspace-viewport) - 48px)}
  #saModal .sa-card{padding:18px 20px}
  #saModal .sa-fields{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1fr) minmax(0,1fr);grid-template-areas:'head' 'fields' 'photo';gap:12px}
  #saModal .sa-grid{grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:auto minmax(0,1fr)}
  #saModal .sa-photo{min-height:0}
  #saModal .sa-info textarea{font-size:16px}
}
@media(max-width:639px){
  #saModal{padding:12px 8px max(16px,env(safe-area-inset-bottom))}
  #saModal .sheet-wrap{width:100%;height:calc(100dvh - 36px - env(safe-area-inset-bottom))}
  #saModal .sa-card{padding:14px 12px 10px}
  #saModal .sheet-x{top:6px;right:6px;width:30px;height:30px;font-size:20px}
  #saModal .ma-head{padding-right:30px;gap:6px}
  #saModal .ma-kick{font-size:7px;letter-spacing:.12em}
  #saModal .ma-head h4{font-size:19px}
  #saModal .ma-sum{gap:12px;font-size:8px}
  #saModal .ma-sum b{font-size:12px}
  #saModal .sa-body{display:flex;flex-direction:column;gap:10px;padding:10px 0}
  #saModal .sa-side{flex:0 0 168px;border-right:0;border-bottom:1px dashed rgba(12,12,13,.18);padding-right:0;padding-bottom:6px}
  #saModal .ma-side-head{padding-bottom:4px}
  #saModal .sa-filter{padding:4px 0}
  #saModal .sa-list{display:flex;gap:6px;overflow-x:auto;overflow-y:hidden;padding:0 0 4px}
  #saModal .ma-row{flex:0 0 138px;border:1px solid rgba(12,12,13,.18);padding:6px;min-height:46px}
  #saModal .sa-list-pager{padding-top:4px;border:0}
  #saModal .sa-main{flex:1}
  #saModal .sa-fields{grid-template-columns:minmax(0,1fr) 100px;gap:8px;overflow:auto;scrollbar-width:thin}
  #saModal .sa-grid{grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto minmax(70px,1fr)}
  #saModal .sa-category-field{grid-template-columns:minmax(0,1fr) 70px;gap:4px}
  #saModal .sa-category-field select,#saModal .sa-new-category{height:36px}
  #saModal .sa-new-category{padding:5px 6px;font-size:9px}
  #saModal .ma-grid label{font-family:var(--phone-label-font);font-size:var(--phone-label-size);font-weight:400;letter-spacing:.06em}
  #saModal .sa-info textarea{font-family:var(--phone-body-font);font-size:var(--phone-body-size)!important;font-weight:400;letter-spacing:.06em}
  #saModal .sa-info textarea:focus{font-size:16px!important;letter-spacing:0}
  #saModal .ma-photo-bar{flex-direction:column;gap:5px}
  #saModal .ma-photo-bar button{padding:6px 3px}
  #saModal .sa-actions button{font-family:var(--phone-body-font);font-size:var(--phone-body-size);min-height:38px}
  #saModal .ma-retire{font-size:9px;padding:6px 8px}
  #saModal .ma-foot{padding-top:6px}
  #saModal .ma-note{font-size:7px;white-space:nowrap}
  #saModal .ma-status{font-size:8px}
  #saModal .sa-category-row{flex-wrap:wrap}
  #saModal .sa-category-row>span,#saModal .sa-category-row>input{flex-basis:100%}
}
/* 手机宽度的档案卡：frozen.css 的手机块把两行裁剪的酒名钉到 grid-row:2 并垂直居中，
   但 auto 行轨道按「不换行的一行」估高，且 -webkit-box 的高度测量不可靠——
   35px 的名字在 17px 的轨道里居中，向上冒进「编号+分类」行造成文字重叠。
   基酒侧栏（168px 定高横滑条）放不下两行卡：这里让酒名回到「编号右侧一行
   省略」、分类落到下一行，各占独立网格单元，轨道测量与视觉都稳定。 */
@media(max-width:760px){
  #saModal .ma-row .nm{grid-column:2;grid-row:auto;display:block;-webkit-line-clamp:unset;max-height:none;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;align-self:center}
}
/* ============================================================
   手机端两态布局（与 frozen.css 的 #maModal 同一套，≤760px）：
     浏览（.sa-card 无 data-editing="1"）：竖向大列表占满主体，
       168px 横滑条与翻页器退役；编辑区只留加载 / 报错，空提示退场。
     编辑（.sa-card[data-editing="1"]，随 draft / categoryMode 翻转）：
       列表整块折叠，表单满屏，标题行给「换一款」送回大列表。
   桌面与 iPad 双栏一条不碰。
   ============================================================ */
#saModal .sa-back{display:none}
@media(max-width:760px){
  #saModal .sa-side{flex:1 1 auto;min-height:0;border-bottom:1px dashed rgba(12,12,13,.18);padding-bottom:6px}
  #saModal .sa-list{display:block;overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:2px 0 4px}
  #saModal .sa-list .ma-row{flex:none;width:100%;border:0;border-bottom:1px solid rgba(12,12,13,.1);padding:10px 2px;min-height:48px}
  /* 翻页器保留：竖向大列表一次也只渲染 12 款，超过就得能翻页 */
  #saModal .sa-card:not([data-editing="1"]) .ma-hint{display:none}
  #saModal .sa-card:not([data-editing="1"]) .sa-main{flex:0 0 auto}
  #saModal .sa-card[data-editing="1"] .sa-side{display:none}
  #saModal .sa-card[data-editing="1"] .sa-body{gap:0}
  #saModal .sa-back{display:inline-block;appearance:none;border:1px solid rgba(12,12,13,.4);background:none;
    color:var(--ink);font:9.5px var(--mono);letter-spacing:.1em;padding:7px 10px;cursor:pointer;
    white-space:nowrap;min-height:32px}
  /* 编辑态表单与 iPad 竖版同构：字段在上、图片整幅落到底部。
     三行按比例分配剩余高度（字段 1.2 : 图片 1），整表一屏放下不滚动；
     旧的两列布局把图片钉在 100px 窄列里纵向拉满，成了细长条。 */
  #saModal .sa-card[data-editing="1"] .sa-fields{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1.2fr) minmax(0,1fr);grid-template-areas:'head' 'fields' 'photo';gap:10px;overflow:hidden}
  #saModal .sa-card[data-editing="1"] .sa-photo{gap:6px;min-height:0}
  #saModal .sa-card[data-editing="1"] .sa-photo-frame{flex:1;min-height:0}
  #saModal .sa-card[data-editing="1"] .sa-info textarea{min-height:0}
  #saModal .sa-card[data-editing="1"] .ma-photo-bar{flex-direction:row}
}
