:root{
  --pane:#1b2428;
  --frame:#131a1d;
  --deep:#0c1113;
  --mist:#e4eae9;
  --bright:#f5f9f8;
  --rain:#84969a;
  --lamp:#e6a86a;
  --line:rgba(228,234,233,.14);
  --line-soft:rgba(228,234,233,.07);
  --gothic:"Hiragino Sans","Hiragino Kaku Gothic ProN","Noto Sans JP","Yu Gothic",system-ui,sans-serif;
  --mincho:"Hiragino Mincho ProN","Yu Mincho","YuMincho","Noto Serif JP",serif;
}
*{box-sizing:border-box;margin:0;padding:0;-webkit-tap-highlight-color:transparent}
html,body{height:100%}
body{background:var(--frame);color:var(--mist);font-family:var(--gothic);font-size:14px;line-height:1.7;
  -webkit-font-smoothing:antialiased;overflow:hidden;overscroll-behavior:none}
#app{height:100dvh;display:grid;grid-template-rows:auto minmax(90px,1fr) auto}

header{display:flex;align-items:baseline;gap:16px;flex-wrap:wrap;padding:15px 18px 12px;
  background:var(--deep);border-bottom:1px solid rgba(230,168,106,.30)}
h1{font-family:var(--mincho);font-weight:400;font-size:22px;letter-spacing:.24em;line-height:1;color:var(--bright)}
h1 em{font-style:normal;color:var(--lamp)}
header p{font-size:10.5px;letter-spacing:.16em;color:var(--rain);line-height:1}

#stage{position:relative;min-height:0;display:flex;align-items:center;justify-content:center;min-height:0;padding:16px;
  background:radial-gradient(120% 90% at 50% 0%,#222d32 0%,var(--pane) 55%,#141b1e 100%)}
canvas{display:block;max-width:100%;max-height:100%;box-shadow:0 0 0 1px var(--line)}
#cv{cursor:crosshair;display:none;touch-action:none}
#cv.ready{display:block}
#drop{position:absolute;inset:16px;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:10px;border:1px dashed var(--line);color:var(--rain);text-align:center;padding:24px;cursor:pointer}
#drop.hide{display:none}
#drop strong{display:block;font-family:var(--mincho);font-size:16px;font-weight:400;letter-spacing:.16em;color:var(--mist)}
/* text-wrap:balance で各行の長さを揃える。最終行に「ん。」だけ残るのを防ぐ。
   非対応ブラウザでは従来どおり折り返すだけで、崩れない。 */
#drop span{font-size:11px;letter-spacing:.08em;max-width:27em;text-wrap:balance}
#drop.over{border-color:var(--lamp);color:var(--lamp)}
#hint{position:absolute;left:0;right:0;bottom:20px;text-align:center;font-size:10.5px;letter-spacing:.12em;
  color:var(--mist);pointer-events:none;opacity:0;transition:opacity .45s;text-shadow:0 1px 8px rgba(0,0,0,.85)}
#hint.show{opacity:.9}
/* ブラシの実寸を示す輪。表示専用なので操作は一切受けない。
   輪の直径＝拭き取り半径×2、内側の薄い塗り＝ブラシの濃さ。 */
#ring{position:absolute;left:0;top:0;z-index:4;border-radius:50%;pointer-events:none;
  transform:translate(-50%,-50%);opacity:0;transition:opacity .2s;
  border:1px solid rgba(245,249,248,.92);
  box-shadow:0 0 0 1px rgba(0,0,0,.5), inset 0 0 0 1px rgba(0,0,0,.38)}
#ring.on{opacity:1}
@media(prefers-reduced-motion:reduce){#ring{transition:none}}

/* 書き出し中の演出。ガラスが曇っていくように覆い、終わると晴れる。
   書き出しの計算中は画面が止まるので、止まった状態でも成立する絵にしてある。 */
#busy{position:absolute;inset:16px;z-index:6;display:flex;align-items:center;justify-content:center;
  pointer-events:none;opacity:0;transition:opacity .35s ease;
  -webkit-backdrop-filter:blur(7px) saturate(.85);backdrop-filter:blur(7px) saturate(.85);
  background:radial-gradient(120% 90% at 50% 45%,rgba(228,234,233,.16) 0%,rgba(228,234,233,.09) 45%,rgba(12,17,19,.30) 100%)}
#busy[hidden]{display:none}
/* 出るときは即座に（この直後に計算で画面が止まるため）、晴れるときはゆっくり */
#busy.on{opacity:1;transition:none}
#busy span{font-family:var(--mincho);font-size:13px;letter-spacing:.28em;color:var(--bright);
  text-shadow:0 1px 10px rgba(0,0,0,.7);animation:busyBreath 2.2s ease-in-out infinite}
@keyframes busyBreath{0%,100%{opacity:.62}50%{opacity:1}}
@media(prefers-reduced-motion:reduce){#busy{transition:none}#busy span{animation:none}}

#rec{position:absolute;top:24px;left:24px;display:none;align-items:center;gap:7px;font-size:10.5px;
  letter-spacing:.12em;color:var(--bright);text-shadow:0 1px 8px rgba(0,0,0,.85)}
#rec.on{display:flex}
#rec i{width:8px;height:8px;border-radius:50%;background:#e4584a;animation:blink 1s steps(2) infinite}
@keyframes blink{50%{opacity:.25}}

#panel{border-top:1px solid var(--line);background:var(--frame);max-height:52dvh;min-height:0;
  overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;touch-action:pan-y;
  padding-bottom:calc(14px + env(safe-area-inset-bottom))}
.grp{padding:13px 16px;border-bottom:1px solid var(--line-soft)}
.grp:last-child{border-bottom:0}
.eyebrow{font-size:9.5px;letter-spacing:.24em;color:var(--rain);margin-bottom:10px;
  display:flex;justify-content:space-between;align-items:center;gap:10px}
.eyebrow .now{color:var(--lamp);letter-spacing:.12em;font-size:10px}

#glass{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:9px}
.gl{width:100%;background:none;border:0;padding:0;cursor:pointer;color:var(--rain)}
.gl canvas{display:block;width:100%;height:auto;aspect-ratio:1/1;background:#0d1214;touch-action:pan-y;pointer-events:none;
  box-shadow:0 0 0 1px var(--line);transition:box-shadow .15s}
.gl b{display:block;font-weight:400;font-size:10.5px;letter-spacing:.08em;margin-top:6px;transition:color .15s}
.gl[aria-pressed="true"] canvas{box-shadow:0 0 0 2px var(--lamp)}
.gl[aria-pressed="true"] b{color:var(--lamp)}
.gl:focus-visible canvas{box-shadow:0 0 0 2px var(--bright)}

.row{display:grid;grid-template-columns:1fr auto;align-items:center;gap:6px;margin-bottom:8px}
.row:last-child{margin-bottom:0}
.row.off{opacity:.38}
.row.off input{cursor:default}
.row label{font-size:11.5px;letter-spacing:.06em;color:var(--mist)}
.row .val{font-size:11px;color:var(--lamp);font-variant-numeric:tabular-nums}
.row input[type=range]{grid-column:1/-1;-webkit-appearance:none;appearance:none;width:100%;height:16px;background:none;cursor:pointer}
input[type=range]::-webkit-slider-runnable-track{height:1px;background:var(--line)}
input[type=range]::-moz-range-track{height:1px;background:var(--line)}
input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:12px;height:12px;border-radius:50%;background:var(--mist);margin-top:-5.5px;border:0}
input[type=range]::-moz-range-thumb{width:12px;height:12px;border-radius:50%;background:var(--mist);border:0}
input[type=range]:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 3px rgba(230,168,106,.55)}

.seg{display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin-bottom:9px}
.seg > span{font-size:11px;color:var(--rain);letter-spacing:.08em;min-width:3.2em}
.seg button{font:inherit;font-size:11px;letter-spacing:.08em;padding:5px 12px;background:none;
  color:var(--rain);border:1px solid var(--line);cursor:pointer;transition:.15s}
.seg button:hover{color:var(--mist);border-color:var(--mist)}
.seg button[aria-pressed="true"]{color:var(--deep);background:var(--lamp);border-color:var(--lamp)}
.seg button:focus-visible{outline:2px solid var(--lamp);outline-offset:2px}

.btn{font:inherit;font-size:11.5px;letter-spacing:.1em;padding:9px 15px;background:none;color:var(--mist);
  border:1px solid var(--line);cursor:pointer;transition:.15s}
.btn:hover:not(:disabled){border-color:var(--mist)}
.btn.key{border-color:var(--lamp);color:var(--lamp)}
.btn.key:hover:not(:disabled){background:var(--lamp);color:var(--deep)}
.btn.mini{padding:4px 10px;font-size:10.5px;letter-spacing:.08em}
.btn:disabled{opacity:.3;cursor:default}
.btn:focus-visible{outline:2px solid var(--lamp);outline-offset:2px}
.acts{display:flex;gap:8px;flex-wrap:wrap}
.note{font-size:10.5px;color:var(--rain);letter-spacing:.04em;margin-top:9px}
.flinks{display:flex;gap:6px 14px;flex-wrap:wrap;font-size:10.5px;letter-spacing:.06em}
.flinks a{color:var(--rain);text-decoration:none;transition:color .15s}
.flinks a:hover{color:var(--mist);text-decoration:underline}
.hidden{display:none !important}
#tint{display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin-bottom:10px}
#tint > span{font-size:11px;color:var(--rain);letter-spacing:.08em;min-width:3.2em}
.sw{width:27px;height:27px;padding:0;border:1px solid var(--line);cursor:pointer;background:none;transition:.15s}
.sw[aria-pressed="true"]{box-shadow:0 0 0 2px var(--lamp);border-color:transparent}
.sw:focus-visible{outline:2px solid var(--bright);outline-offset:2px}
.sw.none{position:relative;background:none}
.sw.none::after{content:'';position:absolute;inset:-1px;
  background:linear-gradient(to top right,transparent 46%,var(--rain) 46%,var(--rain) 54%,transparent 54%)}
#tintfree{-webkit-appearance:none;appearance:none;width:27px;height:27px;padding:0;
  border:1px solid var(--line);background:none;cursor:pointer}
#tintfree::-webkit-color-swatch-wrapper{padding:2px}
#tintfree::-webkit-color-swatch{border:0}
.eyebrow .grp-act{display:flex;gap:8px;align-items:center}

[hidden]{display:none !important}
#saveModal{position:fixed;inset:0;z-index:90;background:rgba(12,17,19,.80);
  overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;
  display:flex;align-items:flex-start;justify-content:center;
  padding:calc(16px + env(safe-area-inset-top)) 16px calc(16px + env(safe-area-inset-bottom))}
.sm-card{background:var(--frame);box-shadow:0 0 0 1px var(--line);width:min(560px,100%);
  display:flex;flex-direction:column;padding:14px 16px 16px;
  max-height:calc(100dvh - 32px - env(safe-area-inset-top) - env(safe-area-inset-bottom));
  opacity:0;transform:translateY(10px);transition:opacity .3s ease,transform .3s ease}
#saveModal.open .sm-card{opacity:1;transform:none}
@media(prefers-reduced-motion:reduce){.sm-card{transition:none}}
.sm-head{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-bottom:12px;flex-shrink:0}
.sm-head span{font-family:var(--mincho);font-size:15px;letter-spacing:.18em;color:var(--bright)}
.sm-preview{flex:1 1 auto;min-height:0;overflow:hidden;display:flex;align-items:center;justify-content:center;
  background:var(--deep);box-shadow:0 0 0 1px var(--line-soft)}
.sm-preview img,.sm-preview video{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain;display:block}
.sm-note{font-size:11px;color:var(--rain);letter-spacing:.05em;line-height:1.8;margin-top:10px;flex-shrink:0}
.sm-acts{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px;flex-shrink:0}

#err{position:fixed;left:0;right:0;bottom:0;z-index:99;padding:10px 14px;background:#3a1f1f;color:#ffd9c2;
  font-size:11px;line-height:1.6;border-top:1px solid #8a4a3a;white-space:pre-wrap;word-break:break-all;
  max-height:34dvh;overflow:auto;font-family:ui-monospace,monospace}

@media (min-width:860px){
  #app{grid-template-rows:auto minmax(0,1fr);grid-template-columns:minmax(0,1fr) 348px}
  header{grid-column:1/-1}
  #stage{grid-column:1;padding:26px}
  #panel{grid-column:2;grid-row:2;max-height:none;border-top:0;border-left:1px solid var(--line)}
}
