:root{
  --bg:#f5f5f7;--card:#fff;--ink:#1d1d1f;--sub:#636366;--line:#e3e3e8;--hair:#d2d2d7;   /* --sub は #6e6e73 だと薄い灰色の札の上で 4.46:1 */
  --accent:#0a66d8;--accent-soft:#e8f1fc;--ok-line:#0a66d8;--pend:#c2410c;--pend-soft:#fff3e8;
  --ng:#d70015;--ng-soft:#fdecee;--good:#17702f;--good-soft:#e9f6ec;--warn:#945000;--warn-soft:#fff6e5;   /* OK の札 3.96:1・注意の札 4.35:1 だった */
  --wall:#2b2f36;--light:#f5b400;
  --r:12px;--font:-apple-system,BlinkMacSystemFont,"Hiragino Sans","Yu Gothic UI","Meiryo",sans-serif;
}
*{box-sizing:border-box}
html,body{height:100%}
body{margin:0;background:var(--bg);color:var(--ink);font:14px/1.5 var(--font);-webkit-font-smoothing:antialiased;display:flex;flex-direction:column}
button,input,select,textarea{font:inherit;color:inherit}
button{cursor:pointer;border:1px solid var(--hair);background:var(--card);border-radius:8px;padding:6px 12px;line-height:1.3}
@media (hover:hover){button:hover{background:#f0f0f3}}   /* 指の端末では押した後もホバーの色が残っていた */
html{-webkit-tap-highlight-color:transparent}
button{transition:transform .08s ease,background-color .15s ease,box-shadow .15s ease}
button:not(:disabled):active{transform:scale(.97)}
button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{outline:3px solid #9cc3f5;outline-offset:1px}
button.primary{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:600}
@media (hover:hover){button.primary:hover{background:#0858bb}}
button.primary:not(:disabled):active{background:#0750a8}
button.danger{color:var(--ng);border-color:transparent;background:none}
@media (hover:hover){button.danger:hover{background:var(--ng-soft)}}
button.link{border:0;background:none;color:var(--accent);padding:4px 0}
button:disabled{opacity:.5;cursor:default}
input,select,textarea{border:1px solid var(--hair);border-radius:8px;padding:8px 10px;background:#fff;width:100%}
textarea{resize:vertical}
kbd{font:11px var(--font);border:1px solid currentColor;border-radius:4px;padding:0 4px;opacity:.6;margin-left:4px}
.muted{color:var(--sub)}.small{font-size:12px}
h2{font-size:15px;margin:0}h3{font-size:13px;margin:18px 0 6px;color:var(--sub);font-weight:600}
h2,h3,button,.chip,.insp-title,.brand strong,.tag,.badge{font-feature-settings:"palt"}
.num,.count,.dims,.kv dd,.chk .num{font-variant-numeric:tabular-nums}
[hidden]{display:none!important}

/* ---------- header ---------- */
.top{position:relative;z-index:20;display:flex;align-items:center;gap:16px;padding:10px 16px;background:rgba(255,255,255,.85);backdrop-filter:saturate(180%) blur(12px);border-bottom:1px solid var(--line);flex:none}
.brand{display:flex;align-items:baseline;gap:12px;min-width:0;flex:1}
.brand strong{font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.status{font-size:12px;color:var(--sub);white-space:nowrap}
.status.bad{color:var(--ng)}
.status{transition:opacity .4s ease}.status.fade{opacity:0}
.tabs{display:flex;background:#e8e8ed;border-radius:9px;padding:2px}
.tabs button{border:0;background:none;border-radius:7px;padding:5px 18px;font-weight:500;color:var(--sub)}
.tabs button[aria-selected=true]{background:#fff;color:var(--ink);box-shadow:0 1px 3px rgba(0,0,0,.12)}
.tab-ic{display:none}
.fsbtn{display:none}
.psec > summary{list-style:none;cursor:pointer}
.psec > summary::-webkit-details-marker{display:none}
.psec > summary h3{display:inline-flex;align-items:baseline;gap:6px;flex-wrap:wrap}
.psec > summary h3::before{content:'▸';color:var(--sub);font-size:11px;transition:transform .15s}
.psec[open] > summary h3::before{transform:rotate(90deg)}
.psec .count{font-weight:600}

/* ---------- 言葉で直す ---------- */
.nlbar{padding:10px 12px 0;flex:none}
.nlbar form{display:flex;gap:8px;align-items:center;background:var(--card);border:1px solid var(--line);border-radius:12px;padding:6px 6px 6px 12px;box-shadow:0 1px 2px rgba(0,0,0,.04)}
.nlbar input{border:0;padding:6px 4px;font-size:14px;min-width:0;flex:1}
.nlbar button{white-space:nowrap;flex:none}.nlbar input:focus-visible{outline:none}
.nlbar form:focus-within{border-color:#9cc3f5;box-shadow:0 0 0 3px #e3eefc}
.nl-icon{color:var(--accent);font-size:15px}
.nlresult{margin-top:8px;background:var(--card);border:1px solid var(--line);border-radius:12px;padding:12px 14px;display:flex;flex-direction:column;gap:8px;font-size:13px}
.nlresult.preview{border-color:var(--accent);box-shadow:0 0 0 3px #e3eefc}
.nlresult .q{color:var(--warn)}.nlresult .err{color:var(--ng)}
.nlresult ul{margin:0;padding-left:18px;line-height:1.7}
.nlresult .warn{color:var(--warn)}
.nlresult .ng{color:var(--ng);font-weight:600}
.nlresult .row2{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.spinner{display:inline-block;width:14px;height:14px;border:2px solid #cfe0f7;border-top-color:var(--accent);border-radius:50%;animation:spin 1s linear infinite;vertical-align:-2px;margin-right:6px}
@keyframes spin{to{transform:rotate(360deg)}}
body.previewing .stage{outline:3px solid #9cc3f5;outline-offset:-3px}

/* ---------- layout ---------- */
.view{flex:1;min-height:0;display:grid;grid-template-columns:minmax(0,1fr) 380px;gap:12px;padding:12px}
.stage{background:var(--card);border-radius:var(--r);border:1px solid #ececf0;box-shadow:0 1px 2px rgba(0,0,0,.03),0 6px 20px rgba(0,0,0,.035);display:flex;flex-direction:column;min-height:0;overflow:hidden}
.stage-bar{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:8px 12px;border-bottom:1px solid var(--line);flex-wrap:wrap}
.legend{display:flex;gap:14px;align-items:center;flex-wrap:wrap;font-size:12px}
.legend span{display:inline-flex;align-items:center;gap:5px}
.sw{display:inline-block;width:18px;height:0;border-top:2.5px solid}
.sw-wall{border-top-width:6px;border-color:var(--wall)}.sw-prov{border-top-width:6px;border-color:#b7bcc6}
.sw-light{width:10px;height:10px;border:0;border-radius:50%;background:var(--light)}
.zoom{display:flex;gap:4px}.zoom button{padding:4px 10px;min-width:34px}
.chip{border-radius:999px;padding:3px 12px;font-size:12px}
.chip[aria-pressed=true]{background:var(--light);border-color:var(--light);color:#3b2a00;font-weight:600}
.map{flex:1;min-height:0;width:100%;display:block;touch-action:none;user-select:none;background:#fbfbfd}
.map-foot{margin:0;padding:6px 12px 8px;font-size:11.5px;border-top:1px solid var(--line)}
/* 配置画面の「3Dを並べる」：図面の下半分に3D。図面で動かした家具がその場で3Dでも動く */
.pbody{flex:1;min-height:0;min-width:0;display:flex;flex-direction:column}
.pbody.sbs{flex-direction:row}
.pbody > .map{flex:var(--pa,1) 1 0;min-width:0}
.p3dslot{flex:var(--pb,1) 1 0;min-height:0;min-width:0;display:flex}
/* 境目：ドラッグで図面と3Dの割合を変える。縦並びなら上下、横並びなら左右に動かす */
.psplit{flex:none;height:10px;cursor:row-resize;background:var(--line);position:relative;touch-action:none}
.psplit::after{content:"";position:absolute;left:50%;top:50%;width:36px;height:4px;margin:-2px 0 0 -18px;border-radius:2px;background:var(--hair)}
.pbody.sbs .psplit{height:auto;width:10px;cursor:col-resize}
.pbody.sbs .psplit::after{width:4px;height:36px;margin:-18px 0 0 -2px}
.psplit:hover,.psplit.drag{background:#cfe0f7}
body.noside #planView{grid-template-columns:minmax(0,1fr)}
body.noside #pside{display:none}
.p3dslot .m3d{flex:1}
/* 3D の「歩いて見る」：右下に矢印ボタン（スマホ用・PC ではキー操作が主）、左上に操作の案内 */
.walkpad{position:absolute;right:14px;bottom:14px;display:grid;grid-template-columns:repeat(3,44px);grid-template-rows:44px 44px;gap:6px;z-index:3}
.walkpad button{border-radius:10px;background:rgba(255,255,255,.88);border:1px solid var(--hair);font-size:16px;padding:0;touch-action:none;user-select:none}
.walkpad button[data-k=f]{grid-column:2;grid-row:1}.walkpad button[data-k=l]{grid-column:1;grid-row:2}
.walkpad button[data-k=b]{grid-column:2;grid-row:2}.walkpad button[data-k=r]{grid-column:3;grid-row:2}
.walkpad .walktip{position:absolute;right:0;bottom:104px;width:max-content;max-width:60vw;font-size:12px;background:rgba(29,29,31,.72);color:#fff;padding:5px 10px;border-radius:8px}
.p3dslot .lab3d{display:none}   /* 名前は上の図面に出ているので、小さい3Dでは重なる名前を隠す */
.side{background:var(--card);border-radius:var(--r);border:1px solid #ececf0;box-shadow:0 1px 2px rgba(0,0,0,.03),0 6px 20px rgba(0,0,0,.035);overflow:auto;min-height:0;padding:14px}
.side-head{display:flex;flex-direction:column;gap:8px;position:sticky;top:-14px;background:var(--card);padding:0 0 8px;margin-top:-2px;z-index:2}
.count{font-weight:400;color:var(--sub);font-size:13px}

/* ---------- 採寸 map ---------- */
#plan-img{opacity:.55}
body.panning .map{cursor:grab}

/* ---------- lists ---------- */
.list{display:flex;flex-direction:column}

/* ---------- inspector ---------- */
.inspector{display:flex;flex-direction:column;gap:12px}
.inspector label{display:flex;flex-direction:column;gap:5px;font-size:12px;font-weight:600;color:var(--sub)}
.inspector label small{font-weight:400}
.insp-head{display:flex;align-items:center;gap:10px}
.insp-title{font-weight:700;font-size:15px}
.big .cm-wrap{display:flex;align-items:baseline;gap:6px}
.big input{font-size:30px;font-weight:700;padding:6px 10px;color:var(--ink);font-variant-numeric:tabular-nums}
.big .cm-wrap span{font-size:16px;color:var(--ink)}
.seg{display:flex;background:#e8e8ed;border-radius:9px;padding:2px;align-self:flex-start}
.seg button{border:0;background:none;border-radius:7px;padding:5px 16px}
.seg button[aria-pressed=true]{background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.12);font-weight:600}

/* ---------- 配置 ---------- */
.floor{fill:#fff}.floor.wetf{fill:#f4f5f7}
.grid line{stroke:#eef0f3}
.wall{fill:var(--wall)}.wall.prov{fill:url(#hatch);stroke:#b7bcc6;stroke-width:1}
.fix{fill:#e9ebef;stroke:#c5c9d1;stroke-width:1}
.glass{fill:#bcdcff;stroke:#6aa7e8;stroke-width:1.5}
.roomlab{font:600 15px var(--font);fill:#9aa0aa;letter-spacing:.05em;pointer-events:none}
.zone rect{fill:rgba(120,126,138,.07);stroke:#a3a9b3;stroke-dasharray:4 3;stroke-width:1}
.zone text{font:11px var(--font);fill:#8a909a;pointer-events:none}
.furn{cursor:grab}
.furn rect.body{stroke-width:1.5}
.furn .front{stroke:rgba(29,29,31,.7);stroke-width:4;stroke-linecap:round}
.furn .front-tri{fill:rgba(29,29,31,.75)}
.furn.st-purchased rect.body{fill:#dff0e4;stroke:#2f8a4a}
.furn.st-decided rect.body{fill:#e3edfb;stroke:#2f6fc0}
.furn.st-candidate rect.body{fill:#fbf3e8;stroke:#c9965a;stroke-width:1.2;stroke-dasharray:5 3}
.furn.st-owned rect.body{fill:#ececf1;stroke:#7d828c}
.flab{pointer-events:none}
.flab text{font-family:var(--font);fill:#1d1d1f;text-anchor:middle;dominant-baseline:central;paint-order:stroke;stroke:rgba(255,255,255,.85);stroke-width:3px;stroke-linejoin:round}
.flab text.dim{fill:#6e6e73}
.furn.sel rect.body{stroke:#1d1d1f;stroke-width:3;stroke-dasharray:none}   /* 図の紙は暗い表示でも明るいので固定の濃い色（--ink だとほぼ白で枠が消えた・2026-09-29） */
/* 選んだ枠は図の倍率に関わらず画面で 3px（スマホの全体表示は図が 0.4 倍で枠が 1.2px になり、並んだベッドのどちらを選んだか分からなかった・2026-10-02 ux-strict） */
.furn.sel rect.body{stroke-width:3px;vector-effect:non-scaling-stroke}
.furn.hl rect.body{stroke:var(--ng);stroke-width:3}
.furn.clash rect.body{stroke:var(--ng);stroke-width:3;fill:#fde2e5}
.furn.dragging{cursor:grabbing;opacity:.9}
.wall-clash{margin:6px 0 0;padding:6px 10px;border-radius:8px;background:var(--ng-soft);color:var(--ng);font-weight:600}
.insp-note{margin:6px 0 0;display:flex;align-items:center;gap:8px}.insp-note .badge{font-size:12px}
.light circle.bulb{fill:var(--light);stroke:#fff;stroke-width:2}
.light circle.glow{fill:rgba(245,180,0,.16)}
.light text{font:600 11px var(--font);fill:#7a5a00;pointer-events:none;paint-order:stroke;stroke:#fff;stroke-width:3px}
.light .rays{stroke:var(--light);stroke-width:2.5;stroke-linecap:round}
/* 言葉で直すのプレビュー：動く家具は青い枠、元の位置は点線の影、元→新は矢印、外す家具は影に ×（図の紙は明るいので固定の色） */
.furn.nlchg rect.body{stroke:#0a58c2;stroke-width:3.5;stroke-dasharray:none}
.nlghost rect{fill:rgba(10,88,194,.06);stroke:#0a58c2;stroke-width:2;stroke-dasharray:6 4}
.nlghost.gone path{stroke:#b3261e;stroke-width:2.5}.nlghost.gone rect{stroke:#b3261e;fill:rgba(179,38,30,.06)}
.nlarrow{stroke:#0a58c2;stroke-width:3;stroke-linecap:round}.nlhead{fill:#0a58c2}
#pnlights{pointer-events:none}#pnlights *{vector-effect:non-scaling-stroke}.nlring{fill:none;stroke:#0a58c2;stroke-width:3}
.nlghostl,.nlghostl circle{fill:none;stroke:#0a58c2;stroke-width:2;stroke-dasharray:5 3}
.nlghostl.gone circle{stroke:#b3261e}.nlghostl.gone path{fill:none;stroke:#b3261e;stroke-width:3;stroke-linecap:round;stroke-dasharray:none}
.nlmarks{pointer-events:none}.nlmarks rect,.nlmarks path,.nlmarks line{vector-effect:non-scaling-stroke}
.light{cursor:grab}.light.sel circle.bulb{stroke:#1d1d1f;stroke-width:3}
.light circle.hit{fill:transparent}
/* 「家具を動かす／照明を動かす」：触れない方は掴めないようにする（重なっていても迷わない） */
body:not([data-edit=light]) #plights{pointer-events:none}
body:not([data-edit=light]):not(.lightmode) #plights{opacity:.45}   /* 照明の印が家具の名前・寸法に重なって読みにくかった（2026-09-27 もっと洗練） */
#plights{transition:opacity .15s ease}
body[data-edit=light] #pfurn,body[data-edit=light] #pflab{pointer-events:none;opacity:.4}
body[data-edit=light] .light circle.bulb{r:9}
.lrow{display:grid;grid-template-columns:auto 1fr auto;gap:8px;align-items:center;padding:6px 8px;border-radius:8px;border:0;background:none;text-align:left;width:100%}
.lrow:hover,.lrow.on{background:var(--accent-soft)}
.lrow i{width:10px;height:10px;border-radius:50%;background:var(--light)}
.lrow small{color:var(--sub)}
body.lightmode #pmap{cursor:crosshair}
.hlrect{fill:rgba(215,0,21,.10);stroke:var(--ng);stroke-width:2;stroke-dasharray:5 3;pointer-events:none}
.hlrect.ok{fill:rgba(31,138,59,.10);stroke:var(--good)}
.gapline{stroke:var(--ng);stroke-width:2}.gapline.ok{stroke:var(--good)}
.gaptext{font:700 13px var(--font);fill:var(--ng);paint-order:stroke;stroke:#fff;stroke-width:4px;text-anchor:middle;dominant-baseline:central}
.gaptext.ok{fill:var(--good)}

.chk{display:grid;grid-template-columns:auto 1fr auto;gap:10px;align-items:center;padding:8px;border-radius:8px;width:100%;text-align:left;background:none;border:0}
.chk:hover,.chk.on{background:#f2f2f5}
.badge{font-size:11px;font-weight:700;border-radius:6px;padding:2px 7px;white-space:nowrap}
.badge.ok{background:var(--good-soft);color:var(--good)}.badge.ng{background:var(--ng-soft);color:var(--ng)}
.badge.caution{background:var(--warn-soft);color:var(--warn)}.badge.unknown{background:#f0f0f3;color:var(--sub)}
.chk .lbl{min-width:0}.chk .lbl b{font-weight:500;display:block}.chk .lbl span{font-size:11.5px;color:var(--sub)}
.chk .num{font-variant-numeric:tabular-nums;font-weight:700}
.chk .num.ng{color:var(--ng)}
.chkwrap{display:flex;align-items:center;gap:2px}.chkwrap .chk{flex:1;min-width:0}
.chkx{flex:none;width:28px;height:28px;border:0;border-radius:6px;background:none;color:var(--sub);font-size:16px;cursor:pointer}.chkx:hover{background:var(--ng-soft);color:var(--ng)}
.groupbox{display:flex;flex-direction:column;gap:6px;align-items:flex-start;background:#f4f7fc;border:1px solid #dbe6f5;border-radius:8px;padding:8px 10px;font-size:12.5px}
.unpl{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:6px 8px}
.unpl span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.error{background:var(--ng-soft);color:var(--ng);border-radius:8px;padding:10px;font-size:12px;white-space:pre-wrap;margin-bottom:8px}
.kv{display:grid;grid-template-columns:auto 1fr;gap:4px 12px;font-size:13px}
.kv dt{color:var(--sub)}.kv dd{margin:0;font-variant-numeric:tabular-nums}
.xy{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.btns{display:flex;gap:8px;flex-wrap:wrap}

/* ---------- 3D ---------- */
.m3d{flex:1;min-height:0;position:relative;overflow:hidden;background:#f3f4f7}
.m3d canvas{display:block}
.labels3d{position:absolute;inset:0;pointer-events:none}
.lab3d{font:600 11px var(--font);background:rgba(255,255,255,.88);border:1px solid var(--hair);border-radius:6px;padding:1px 6px;white-space:nowrap;color:var(--ink)}
.lab3d.na{border-color:var(--pend);color:var(--pend)}
.lab3d.light{background:#fff6d6;border-color:#f0c64a;color:#7a5a00;font-size:10px}
@media (prefers-reduced-motion:no-preference){
  .view:not([hidden]){animation:viewIn .18s ease-out}
  #toast:not([hidden]){animation:toastIn .2s ease-out}
  .psec[open] > .list{animation:viewIn .15s ease-out}
}
/* 画面の出だしは透明度だけ（位置は動かさない）。4px 下から出すと、切り替えてすぐのドラッグ中に図がずれて
   家具が 3cm ずれて置かれた（E2E「xだけが変わりyは残る」で見つかった・2026-09-27） */
@keyframes viewIn{from{opacity:0}to{opacity:1}}
@keyframes toastIn{from{opacity:0;transform:translate(-50%,8px)}to{opacity:1;transform:translate(-50%,0)}}
.m3d-msg{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;margin:0;padding:20px;text-align:center}
.stage-bar .seg button{padding:3px 12px;font-size:12px}
.notes3d{padding-left:18px;line-height:1.7;margin:0}

/* ---------- 家具 ---------- */
#furnView{grid-template-columns:1fr;overflow:auto}
.furn-wrap{max-width:1180px;width:100%;margin:0 auto;display:flex;flex-direction:column;gap:14px}
.add-card{background:var(--card);border:1px solid #ececf0;box-shadow:0 1px 2px rgba(0,0,0,.03),0 6px 20px rgba(0,0,0,.035);border-radius:var(--r);padding:16px;display:flex;flex-direction:column;gap:10px}
.add-row{display:flex;gap:8px;align-items:center}.add-row.wrap{flex-wrap:wrap;margin-top:8px}
.add-row.wrap input{flex:1 1 220px}
.add-row input{flex:1}.add-row button{white-space:nowrap}
.add-row.small label{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--sub)}
.add-row.small select{width:auto;padding:4px 8px}
summary{cursor:pointer;color:var(--accent);font-size:13px}
.fgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(270px,1fr));gap:12px}
.fcard{background:var(--card);border:1px solid #ececf0;box-shadow:0 1px 2px rgba(0,0,0,.03),0 6px 20px rgba(0,0,0,.035);border-radius:var(--r);overflow:hidden;display:flex;flex-direction:column;align-self:start}   /* 行の一番背の高いカードに揃えると、下に大きな空白ができた（2026-09-27 UX の点検） */
.fcard .img{height:130px;background:#f2f2f5;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:center;color:#b0b3ba;font-size:12px}
.fcard .img img{max-width:100%;max-height:100%;object-fit:contain;mix-blend-mode:multiply}   /* 白地の商品写真が灰色の帯の中で白い四角に見えた */
.fcard .body{padding:12px;display:flex;flex-direction:column;gap:8px;flex:1}
.fcard .ttl{font-weight:600;line-height:1.35}
.fcard .ttl small{display:block;font-weight:400;color:var(--sub);font-size:11.5px}
.dims{font-size:18px;font-weight:700;font-variant-numeric:tabular-nums}
.dims .na{color:var(--pend);font-size:13px;font-weight:600}
.dims small{font-size:11px;color:var(--sub);font-weight:400}
.tags{display:flex;gap:6px;flex-wrap:wrap}
/* 未確定の中身（スマホでも読めるよう札の下に文で出す） */
.unres{margin:0;padding-left:18px;font-size:12px;line-height:1.5;color:var(--sub)}
.tag{font-size:11px;border-radius:6px;padding:2px 7px;background:#f0f0f3;color:var(--sub)}
.tag.purchased{background:#dff0e4;color:#1f6b35}.tag.decided{background:#e3edfb;color:#1f5aa8}
.tag.candidate{background:#fbf1e3;color:#955a0e}.tag.owned{background:#ececf1;color:#555}
.fcard .foot{display:flex;gap:8px;align-items:flex-end;justify-content:space-between;margin-top:auto}
.fcard .foot > span:first-child{display:flex;flex-direction:column;gap:2px}
.fcard .foot .btns{flex-wrap:nowrap}
#amsg:empty{display:none}
.ffilter{display:flex;gap:6px;flex-wrap:wrap}
.ffilter[hidden]{display:none}
.ffilter .chip{flex:none}.ffilter .chip small{color:var(--sub);font-variant-numeric:tabular-nums}
.ffilter .chip[aria-pressed=true]{background:var(--ink);color:#fff;border-color:var(--ink)}
.ffilter .chip[aria-pressed=true] small{color:rgba(255,255,255,.75)}
a.ext,.fcard a{color:var(--accent);text-decoration:none}a.ext:hover{text-decoration:underline}
.fcard .edit{display:grid;grid-template-columns:repeat(3,1fr);gap:6px}
.fcard .edit label{font-size:11px;color:var(--sub);display:flex;flex-direction:column;gap:3px}
.fcard .edit input,.fcard .edit select{padding:5px 7px}
.fcard .edit .full{grid-column:1/-1}

/* 商品を探す */
.fcard.unlinked .img{color:var(--pend)}
.finder{display:flex;flex-direction:column;gap:8px;border-top:1px solid var(--line);padding-top:8px}
.cands{display:flex;flex-direction:column;gap:6px;max-height:420px;overflow:auto}
.cand{display:grid;grid-template-columns:56px 1fr;gap:8px;align-items:center;padding:6px;border:1px solid var(--line);border-radius:8px}
.cand.sure{border-color:var(--good);background:var(--good-soft)}
.cand img{width:56px;height:56px;object-fit:contain;background:#fff;border-radius:6px}
.cand .cinfo{display:flex;flex-direction:column;gap:2px;min-width:0}
.cand .cinfo b{font-size:12.5px;font-weight:600}
.cand .store{display:inline-block;font-size:10.5px;font-weight:600;background:#f0f0f3;color:var(--sub);border-radius:4px;padding:0 5px;margin-right:5px}
.cand .btns{grid-column:1/-1;justify-content:flex-end;align-items:center}
#toast.bad{background:#b3261e}   /* 失敗は赤で長めに（6秒） */
#toast{position:fixed;left:50%;bottom:22px;transform:translateX(-50%);width:max-content;max-width:calc(100vw - 32px);box-sizing:border-box;background:#1d1d1f;color:#fff;padding:10px 18px;border-radius:10px;font-size:13px;z-index:20;box-shadow:0 8px 30px rgba(0,0,0,.2);pointer-events:none}   /* 幅は left:50% のせいで画面の半分に縮み、短い文も「しまし／た」と折れていた → 中身の幅・画面幅−32px まで（2026-09-30 edge-cases）。知らせは文字だけ。下のボタン（家具の「編集」など）を塞がず、そのまま押せるように（2026-09-30 regression） */

/* ---------- mobile ---------- */
@media (max-width:860px){
  body{display:block;height:auto}
  .top{position:sticky;top:0;z-index:10;flex-wrap:wrap;padding:8px 12px;row-gap:6px}   /* 物件名とタブの間が 16px 空いて間延びしていた（2026-09-27 UX の点検） */
  .brand{flex-basis:100%}
  .tabs{flex:1}.tabs button{flex:1;padding:6px 0}
  .view{display:flex;flex-direction:column;padding:8px;gap:8px}
  .stage{height:62vh;flex:none}
  #planView .stage{height:auto}
  #planView .map{flex:none;aspect-ratio:var(--par,1.2)}   /* --par は間取りの縦横から app.js の sizePlanMap が決める */
  .p3dslot{flex:none;height:55vh}
  .psplit{display:none!important}
  .side{overflow:visible}
  .side-head{top:var(--headH,50px);transition:top .2s ease}
  body.hidehead .side-head{top:0}
  .legend > span:not(.seg){display:none}   /* 色見本は隠すが、切り替えボタン（家具/照明・壁の高さ）は残す */
  /* 2026-09-27 UX の点検：スマホでは操作の列が3行あり図が小さかった。拡大・全体のボタンは図の右下に重ね、
     判定を隠す（判定は図の下にあるので要らない）は出さない */
  .stage{position:relative}
  .stage-bar > .zoom{position:absolute;right:10px;bottom:10px;z-index:4;background:rgba(255,255,255,.92);border-radius:12px;padding:4px;box-shadow:0 2px 10px rgba(0,0,0,.14)}
  #pside-toggle{display:none}
  /* ---- 2026-09-27 本人「UXを最大化させたい。特にスマホで」 ---- */
  /* タブは画面の下（親指の届く所）に、絵と字で。iPhone の下の端（ホームバー）の分をあける */
  .top{backdrop-filter:none;-webkit-backdrop-filter:none;background:#fff;padding-top:max(8px,env(safe-area-inset-top))}
  .tabs{position:fixed;left:0;right:0;bottom:0;z-index:30;background:#fff;border-radius:0;border-top:1px solid var(--line);
        padding:4px 6px calc(4px + env(safe-area-inset-bottom));box-shadow:0 -4px 16px rgba(0,0,0,.06)}
  .tabs button{display:flex;flex-direction:column;align-items:center;gap:2px;min-height:52px;font-size:11px;padding:4px 0;color:#8a8a8f}
  .tabs button[aria-selected=true]{background:none;box-shadow:none;color:var(--accent);font-weight:600}
  .tab-ic{display:block;width:24px;height:24px}
  body{padding-bottom:calc(66px + env(safe-area-inset-bottom))}
  /* 帯が出ている間は帯の高さ分も下をあける。ページが短いと一番下まで送っても図が見えたままで帯が消えず、
     詳しい欄の「↺ 90°回転」「配置から外す」を覆って押せなかった（2026-09-27 mobile の回・#220） */
  body:has(#ppeek){padding-bottom:calc(78px + var(--peek-h,0px) + env(safe-area-inset-bottom))}
  #toast{bottom:calc(78px + env(safe-area-inset-bottom))}
  /* 帯が見えている間はトーストを帯の上に。「判定を足す」「↶ 戻す」の知らせが帯の ↺ 90°・◀・1cm に 3 秒重なり押せなかった（#224） */
  body:has(#ppeek:not([hidden])) #toast{bottom:calc(78px + var(--peek-h,0px) + env(safe-area-inset-bottom))}
  /* position も固定に。後ろにある .m3dpeek（3D の中の札・absolute）に負けて、帯がページと一緒に流れていた（ページを送ると
     図や3Dの上に浮き、3Dの上を縦になぞってもページが送れなかった・2026-09-27 スマホのUXを完全に最大化） */
  #ppeek.ppeek{position:fixed;bottom:calc(70px + env(safe-area-inset-bottom));z-index:20}   /* 後ろにある .ppeek の決まりに負けて、下のタブの裏に隠れていた */
  /* z-index も .m3dpeek の 3 に負けていて、図の右下の拡大の列（4）が帯の1段目（↶・詳しく・×）の上にかぶり押せなかった（2026-09-28 mobile の回） */
  /* 全画面：図・3D を画面いっぱいに（下のタブと言葉で直すは隠す） */
  .fsbtn{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;font-size:17px}
  .stage-bar > .zoom button{min-width:40px;padding:0 10px}
  #addUrl h2{display:flex;align-items:center;justify-content:space-between;cursor:pointer;margin:0}
  #addUrl h2::after{content:'▾';color:var(--sub);font-size:13px;font-weight:400}
  #addUrl.mcollapse h2::before{content:'＋ '}
  #addUrl.mcollapse h2::after{content:'開く ▸'}
  #addUrl.mcollapse h2{justify-content:flex-start;gap:4px}#addUrl.mcollapse h2::after{margin-left:auto}   /* 「＋」と「家具を追加」が離れて、見出しが真ん中に浮いていた */
  #addUrl.mcollapse > :not(h2){display:none}
  /* 畳んだ時に押せるのが見出しの字（高さ 22px）だけで、枠の余白を押しても開かなかった。見出しを 44px にして、その分枠の上下の余白を詰める（2026-09-30 mobile の手の確認） */
  #addUrl h2{min-height:44px}
  #addUrl.mcollapse{padding-top:6px;padding-bottom:6px}
  /* 送って見せる時（編集を開く・入力欄へ移る）に、下のタブの裏まで送って「削除」などが半分隠れていた。下のタブの分を空けて止める（2026-09-30 mobile の手の確認） */
  html{scroll-padding-bottom:calc(var(--tabsH,62px) + 12px)}
  /* 上も同じ。図を少し送った所で線を押すと、長さの欄（図の上端に出る）の「線 22 の長さ」と入力欄が見出しの裏に隠れたまま
     入力欄へ移っていた（2026-09-30 visual-e2e・章 after）。見出しの分を空けて、隠れていれば見える所まで送る */
  html{scroll-padding-top:calc(var(--headH,62px) + 8px)}
  body.fs{overflow:hidden}
  body.fs .tabs,body.fs .nlbar,body.fs .top{display:none}
  body.fs[data-fs=plan] #planView .stage,body.fs[data-fs=rooms] #roomsView .stage,body.fs[data-fs=model] #modelView .stage{
        position:fixed;inset:0;z-index:40;height:100dvh;border-radius:0;border:0;padding-top:env(safe-area-inset-top)}
  body.fs[data-fs=plan] #planView .map{flex:1;aspect-ratio:auto;min-height:0}
  body.fs[data-fs=rooms] #roomsView .rmapwrap{flex:1;height:auto!important}
  body.fs .m3d{flex:1}
  body.fs #ppeek.ppeek{bottom:calc(10px + env(safe-area-inset-bottom));z-index:50}
  /* 間取りの全画面で線を消すと「取り消す」の帯が右下の「✕ 閉じる」にかぶり、閉じるつもりで押すと消した線が生き返った
     （2026-09-30 data-drift・章 rooms）。全画面の間は帯を「✕ 閉じる」の上に出す */
  body.fs[data-fs=rooms] .undobar{bottom:calc(76px + env(safe-area-inset-bottom))}
  /* 3D は右下に「歩いて見る」の矢印が出るので、全体・真上は右上に。歩いている間は隠す（指の操作テストで矢印が押せなかった） */
  #modelView .stage-bar{position:relative}
  #modelView .stage-bar > .zoom{bottom:auto;top:calc(100% + 10px)}   /* 操作の列のすぐ下＝3Dの右上 */
  /* 縦向きでも 3D は見出しと下のタブの間いっぱいに（62vh では 3D が画面の約半分で、下に「家具をタップ」だけの欄と空白が
     約 150px 残っていた・2026-09-30 ux-strict）。選んだ家具の札の「詳しく ↓」で下の欄へ行ける */
  #modelView .stage{height:calc(100dvh - var(--headH,62px) - var(--tabsH,53px) - 16px)}
  .stage:has(.walking) > .stage-bar > .zoom{display:none}
  body:has(.walking) #ppeek{display:none}
  /* 帯は半透明（.94）だったので、後ろの拡大の列「− 全体 ＋」が帯の名前の横に透けて見えていた（2026-09-28 mobile・WebKit の撮影）。スマホでは不透明に */
  #ppeek.m3dpeek{background:#fff}
  .map-foot{display:none}
  /* ---- 2026-09-27 本人「全部修正した上で、再度厳しく評価して」（厳しい評価 findings #213〜#218） ---- */
  /* 図の上を1本指で縦になぞるとページが送れる（前は touch-action:none で、図が横幅いっぱいのためページを送れなかった）。
     選んだ家具を押した時だけ、JS（touchstart）でページ送りを止めて家具を動かす。全画面の間は1本指で図を動かす */
  #pmap{touch-action:pan-y}
  body.fs #pmap{touch-action:none}
  /* 「↶ 戻す」は操作の列の先頭に（右の外にあって見えなかった） */
  .stage-bar > .legend > #undoPlace,.stage-bar > .legend > #undo3d{order:-2}
  .stage-bar > .legend > #m3dWalk{order:-1}   /* 3D の「歩いて見る」は列の右の外にあった */
  /* 言葉で直すの欄は畳んで、見出しの「✦ 言葉で直す」で開く */
  body:not(.nlopen) #nlbar{display:none}
  body[data-view=plan] #nlOpen,body[data-view=model] #nlOpen{display:inline-flex;align-items:center;flex:none;margin-left:auto;color:var(--accent);font-weight:600}
  body.nlopen #nlOpen{background:var(--accent-soft);border-color:transparent}
  /* タップの的は 44pt 以上（Apple の基準。ほとんどのボタンが 34px だった） */
  .chip,.stage-bar .seg button,.projbtn,.zoom button,.btns button,.add-row button,button.primary,.lrow,.fcard button,.ffilter .chip,
  .nlbar button,.rlines .rlrow,.chkx,.cand button,.lprod button,.inspector button,.side-head button,.notice,.unpl .chip{min-height:44px}
  .zoom button,.chkx,.chip,.fcard .v3btn{min-width:44px}
  .fcard .v3btn{min-height:44px}
  input:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=file]),select{min-height:44px}
  .nlbar input{min-height:40px}
  input[type=range]{height:44px}
  summary{padding-block:12px}
  .fcard .foot a,a.ext,.inspector a{display:inline-flex;align-items:center;min-height:44px}
  #ppeek .pk-arrow{min-width:44px;min-height:44px}
  #ppeek .pk-step{min-width:64px;margin-left:auto}
  /* 文字は 12px 以上（下のタブの字 11px・札 11px・件数 10px だった）・下のタブの字を濃く（3.4:1 だった） */
  .tag,.badge,.chk .lbl span,.fcard .ttl small,.tabs button,.lrow small,.cand .store,kbd{font-size:12px}
  small{font-size:12px!important}
  .tabs button{color:#636366}
  /* キーボードが本当に出ている間だけ、下のタブと帯を隠す（iPhone ではキーボードの上に乗って入力欄が狭くなる）。
     押しただけで隠すと、キーボードが出る前に消えて押せず、セレクトでも出たり消えたりした（2026-09-28 本人）→ JS の kbopen で */
  body.kbopen :is(.tabs,#ppeek){display:none}
  /* ---- 2026-09-27 本人「スマホのUXを完全に最大化させたい」 ---- */
  /* 見出しは下へ送ると隠す（上へ戻すと出る） */
  /* transform で隠すと、中にある下のタブ（position:fixed）の基準が見出しになり、タブも一緒に上へ消えた。top で隠す */
  .top{transition:top .22s ease}
  body.hidehead .top{top:calc(-1 * var(--headH,50px) - 1px)}
  /* 帯（家具・照明を選んだ時）：上の段＝名前・詳しく・×、下の段＝↺ 90°・◀▲▼▶・1cm/10cm */
  #ppeek.ppeek{flex-direction:column;align-items:stretch;gap:6px;padding:8px}
  #ppeek .pk-row{display:flex;gap:6px;align-items:center;min-width:0}
  #ppeek .pk-row > :not(.pk-t){flex:none;white-space:nowrap}   /* 「↺ 90°」が2行に折れていた */
  #ppeek .pk-arrow{min-width:44px;min-height:40px;padding:0;font-size:15px;touch-action:none;user-select:none;-webkit-user-select:none}
  #ppeek .pk-step{margin-left:auto;flex:none}
  #ppeek .pk-step button{padding:6px 10px;font-size:12.5px;min-height:34px}
  #ppeek[hidden]{display:none}
  /* 下のタブ：選んでいる画面の絵に、うすい丸い背景 */
  .tab-ic{box-sizing:content-box;padding:3px 16px;border-radius:16px;transition:background-color .15s ease}
  .tabs button[aria-selected=true] .tab-ic{background:var(--accent-soft)}
  /* スマホを横にした時、ノッチのある側の端をあける */
  .view{padding-left:max(8px,env(safe-area-inset-left));padding-right:max(8px,env(safe-area-inset-right))}
  .xyd summary{font-size:12.5px}
  .xyd .xy{margin-top:8px}
  /* 家具の一覧を絞るボタンは1行で横に送る */
  .ffilter{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;margin:0 -8px;padding:0 8px}
  .ffilter::-webkit-scrollbar{display:none}
  /* ---- 2026-09-27 本人「もっと洗練させたい」 ---- */
  /* 操作の列が2行になり図が下へ押されていた。1行にして、はみ出す分は指で横に送る（右の端はぼかして続きがあると分かるように） */
  .stage-bar > .legend{flex-wrap:nowrap;overflow-x:auto;gap:8px;margin:0 -12px;padding:2px 12px;scrollbar-width:none}
  /* 2026-09-28 右端のぼかしは、続きがある時だけ（.more は app.js が付ける）。全部見えている時も 3D ボタンの右が薄れていた */
  .stage-bar > .legend.more{-webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 28px),transparent);mask-image:linear-gradient(90deg,#000 calc(100% - 28px),transparent)}
  .stage-bar > .legend::-webkit-scrollbar{display:none}
  .stage-bar > .legend > *{flex:none}
  @media (max-width:389px){.stage-bar > .legend{gap:5px;padding-right:6px}}   /* 2026-09-28 幅 375 で「3D」が右で切れていた */
  /* 間取りは操作の列に何も残らない（拡大ボタンは図に重ねた）ので、空の列を出さない */
  #roomsView .stage-bar{padding:0;border:0}
  /* 以下 2026-09-26 スマホで新規物件を作った時の直し */
  /* 見出し：状態の文が長いと物件名が0幅に潰れて「▾」だけになった。物件名を優先し、状態の文は末尾を省く */
  .brand{min-width:0;align-items:center}   /* 字の下端でそろえると物件名のボタンが「言葉で直す」より 9px 下がり、見出しが 9px 高かった（2026-10-01 ux-strict・findings #438） */
  .projbtn{flex:none;max-width:58%}.brand .projbtn{align-items:center}.projbtn strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}
  .brand .status{min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis}
  /* 2026-09-28 厳しい評価：上の直しで状態の欄が物件名と「言葉で直す」に挟まれて 28px しか無く、「✓ 保存しました」も
     ドラッグ中の位置（x 1.23 m ・ y 3.45 m）も2文字しか見えなかった。スマホでは見出しのすぐ下に小さな札として重ねる
     （列の場所を取らない・指は下の物へ通す・消える時は今までどおり .fade で薄くなる） */
  .brand .status{position:absolute;top:calc(100% + 2px);right:0;flex:none;max-width:calc(100vw - 24px);overflow:visible;white-space:normal;
        text-overflow:clip;background:var(--card);color:var(--ink);border:1px solid var(--hair);border-radius:10px;padding:4px 10px;
        line-height:1.35;box-shadow:0 4px 14px rgba(0,0,0,.12);pointer-events:none;z-index:25}
  .brand .status:empty,.brand .status.quiet{display:none}
  /* 2026-09-28 厳しい評価（findings #232）：家具モードでは照明は薄く押せないのに、番号（L02 など）の字が家具の名前・寸法に重なって
     読みにくかった。スマホの家具モードでは番号を出さない（照明モードにすると出る・選んだ照明は下の欄と帯に番号が出る） */
  body:not([data-edit=light]):not(.lightmode) #plights .light text{display:none}
  .brand .status.bad{color:var(--ng);border-color:var(--ng)}
  /* 配置の下の3D：図面と3D（どちらも指で操作する面）で画面がほぼ埋まり、ページを指で送れる所が端の数ピクセルしか無かった。
     3Dは低くし、縦のスワイプはページのスクロールに回す（横のスワイプで回す・2本指で寄る） */
  .p3dslot{height:40vh}
  .p3dslot canvas{touch-action:pan-y!important}
  #roomsView .rmodes{flex-wrap:wrap}#roomsView .rmodes button{padding:6px 8px;font-size:12.5px}
  /* 図の枠は 58vh。外枠（.stage）を 62vh のままにすると、上の操作ボタンの分だけ図の下が切れていた（2026-09-26 Safari 相当で発見） */
  #roomsView .stage{height:auto}#roomsView .rmapwrap{flex:none;height:58vh}
  /* 判定を押して図へ送る時、図の上が固定の見出しの下に隠れていた */
  .map{scroll-margin-top:calc(var(--headH,50px) + 8px)}
  /* 指で押すボタンは高さ 34px 以上（22〜24px で押しにくかった）。
     上の画面のタブ（30px）と「保存」「直す」「URLから取り込む」など操作の列のボタン（32px）が漏れていた（2026-09-27 mobile の回） */
  .chip,.stage-bar .seg button,.projbtn,.zoom button,.tabs button,.btns button,.add-row button,button.primary,.lrow{min-height:34px}
  /* 判定を外す「×」は 28px 角だった。押し間違えで判定が外れないよう、隣の判定の行とは離したまま大きくする */
  .chkx{width:36px;height:36px}
  .stage-bar .seg button{padding:6px 12px}
  .fcard .v3btn{min-height:34px;min-width:44px}
  /* iPhone の Safari は、文字が 16px 未満の入力欄を押すたびに画面を拡大する（戻すのに2本指が要る）。スマホ幅では 16px に */
  input:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=file]),select,textarea{font-size:16px!important}
  /* ボタンの2回タップで画面が拡大しないように */
  button,.chip,a{touch-action:manipulation}
}
.m3d.walking .lab3d{display:none}   /* 歩いている時は、壁越しに透けて見える名前を隠す */
.lprod{display:flex;flex-direction:column;gap:6px;padding:8px 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
/* ---------- 物件の切り替え（見出しの物件名） ---------- */
.projbtn{border:0;background:none;padding:2px 6px;display:inline-flex;gap:4px;align-items:baseline;min-width:0;border-radius:6px}
.projbtn:hover{background:#ececf0}
.brand{position:relative}
.projmenu{position:absolute;top:100%;left:0;margin-top:6px;z-index:30;background:var(--card);border:1px solid var(--line);border-radius:12px;box-shadow:0 10px 30px rgba(0,0,0,.14);padding:10px;width:min(360px,90vw);display:flex;flex-direction:column;gap:8px}
.projlist{display:flex;flex-direction:column;gap:2px}
.projlist button{display:flex;justify-content:space-between;gap:8px;border:0;background:none;text-align:left;padding:8px;border-radius:8px}
.projlist button:hover,.projlist button.on{background:var(--accent-soft)}
.projnew{display:flex;gap:6px;align-items:flex-end;border-top:1px solid var(--line);padding-top:8px}
.projnew label{flex:1;font-size:12px;color:var(--sub);display:flex;flex-direction:column;gap:4px}
/* ---------- 間取り ---------- */
.sw-door{border-top:3px dashed #1f8a3b}.sw-win{border-top:4px solid #58a6e6}
/* 間取りの図の中身は g.rmapall にまとめ、決まりもそこに付ける（#rmap に付けると、線を引く時の拡大鏡（<use>）の中で効かず、隠している説明文が大きく映った） */
.rmapall text{font-family:var(--font);font-weight:600;fill:#1d1d1f;paint-order:stroke;stroke:#fff;stroke-linejoin:round}.rmapall text.dim{font-weight:400;fill:#6e6e73}
.furn rect.hit{fill:transparent;stroke:none}
.furn:focus-visible rect.body{stroke:#0a66d8;stroke-width:4}
.furn:focus{outline:none}
.pbody{position:relative}
.pempty{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;background:rgba(251,251,253,.92);font-size:15px;z-index:2}
/* 3列目はまとめた数「×4」。2列だと次の行の左に落ち、別のお知らせに見えた（2026-10-02 docs・findings #476） */
.notice{display:grid;grid-template-columns:auto 1fr auto;gap:8px;align-items:start;padding:6px 8px;border-radius:8px;border:0;background:none;text-align:left;width:100%;font-size:12.5px}
.notice:hover{background:var(--accent-soft)}
.notice .badge{white-space:nowrap}
.lab3d.ovl{visibility:hidden}   /* 他の名前と重なる名前は隠す（選んだ家具の名前は残る） */
/* ---------- 間取り：壁なし・下敷き・部屋のドラッグ ---------- */
.sw-open{border-top:3px dashed #9aa0a6}
#rmap.moving-img{cursor:grab}#rmap.cal{cursor:crosshair}
.rmapall .calpt{fill:#e5484d;stroke:#fff;stroke-width:3}
.ruls{border:1px solid var(--line);border-radius:10px;padding:8px 10px;margin:8px 0}
.ruls summary{cursor:pointer;font-size:13px;font-weight:600}
.ruls-body{display:flex;flex-direction:column;gap:8px;margin-top:8px}
.ruls-body input[type=range]{padding:0}
.adopt{background:#fff6e5;border:1px solid #f0c64a;border-radius:8px;padding:8px;font-size:12px;display:flex;flex-direction:column;gap:6px}
.adopt .btns{justify-content:flex-start}
#aqres{border-top:1px solid var(--line);padding-top:8px}
/* スマホ横向きなど背の低い画面：見出しとタブを1行にして図を広く（findings #42） */
@media (max-height:500px) and (orientation:landscape){
  .top{padding:4px 10px;flex-wrap:nowrap;gap:8px}
  .brand{flex-basis:auto}
  .tabs button{padding:3px 10px}
  .nlbar{padding:4px 8px 0}.nlbar form{padding:2px 2px 2px 8px}.nlbar input{padding:3px 4px}
  .stage-bar{padding:4px 8px}
  .map-foot{display:none}
  .stage{height:calc(100vh - 90px)}
  /* 図は「見出しが隠れた時に、操作の列＋図がタブの上にちょうど収まる」高さ（下へ少し送ると見出しが隠れる） */
  #planView .map{aspect-ratio:auto;height:calc(100dvh - 112px)}
  #modelView .stage{height:calc(100dvh - 58px)}
  /* 拡大ボタンは図の右上に（右下だと帯と下のタブの裏に隠れた） */
  #planView .stage-bar{position:relative}
  #planView .stage-bar > .zoom{bottom:auto;top:calc(100% + 8px)}
  .side-head{top:var(--headH,44px)}
  /* 2026-09-27 本人「スマホのUXを完全に最大化させたい」：横向きでは下のタブと2段の帯で画面の下半分が埋まり、図がほとんど見えなかった。
     タブは絵と字を横に並べて低く、帯は1行に */
  .tabs button{flex-direction:row;gap:6px;min-height:38px;font-size:12px}
  .tab-ic{width:20px;height:20px;padding:2px 10px}
  body{padding-bottom:calc(50px + env(safe-area-inset-bottom))}
  body:has(#ppeek){padding-bottom:calc(60px + var(--peek-h,0px) + env(safe-area-inset-bottom))}
  .tabs{padding-left:max(6px,env(safe-area-inset-left));padding-right:max(6px,env(safe-area-inset-right))}
  #ppeek.ppeek{flex-direction:row;align-items:center;gap:10px;padding:6px 8px;bottom:calc(52px + env(safe-area-inset-bottom));
        left:max(8px,env(safe-area-inset-left));right:max(8px,env(safe-area-inset-right))}
  #ppeek .pk-row:first-child{flex:1;min-width:0}
  #ppeek .pk-arrow{min-height:36px}
  #toast{bottom:calc(60px + env(safe-area-inset-bottom))}
  body:has(#ppeek:not([hidden])) #toast{bottom:calc(60px + var(--peek-h,0px) + env(safe-area-inset-bottom))}
}
.tag.ai{background:#eef4ff;color:#2b4c9b}.tag.ai.run{background:#fff6d6;color:#7a5a00}.tag.ai.err{background:#fdecec;color:#b8342a}
/* ボタンが4つに増えたので、下段は折り返して並べる（縦に潰れていた・2026-09-25） */
.fcard .foot{flex-wrap:wrap}
.fcard .foot{flex-direction:column;align-items:stretch;gap:10px}
.fcard .foot > span:first-child{flex-direction:row;align-items:baseline;gap:10px}
.fcard .foot .btns{flex-wrap:wrap;justify-content:flex-start}
.fcard .foot .btns > .primary{flex-basis:100%}   /* 配置する は下に幅いっぱい（右寄せで折り返すとカードごとに段がばらばらだった） */
.fcard .foot .btns button{white-space:nowrap}
button.armed,button.armed:hover,button.danger.armed{background:var(--ng,#b8342a);color:#fff;border-color:transparent}
/* 家具カードの3D（1点だけ・ゆっくり回る） */
.fcard .img{position:relative}
.fcard .img.v3on{height:230px;background:#e9e6df}
.fcard .img .fprev{position:absolute;inset:0}
.fcard .img .fprev canvas{display:block}
.fcard .img .fprev .lab3d{display:none}
.v3btn{position:absolute;top:6px;right:6px;z-index:2;border-radius:999px;padding:2px 10px;font-size:12px;background:rgba(255,255,255,.92);color:var(--ink)}   /* 灰色の地の色を引き継いで 2.1:1 だった */
#nlOpen{display:none}
/* 間取りで指で線を引く間の拡大鏡（指で線の端が隠れて、前の線の端に合わせられなかった） */
.loupe{position:absolute;left:0;top:0;width:112px;height:112px;border-radius:50%;overflow:hidden;border:3px solid #fff;
  box-shadow:0 4px 18px rgba(0,0,0,.28);background:#fbfbfd;pointer-events:none;z-index:6}
.loupe svg{width:100%;height:100%;display:block}
.loupe::before,.loupe::after{content:'';position:absolute;background:#e5484d;left:50%;top:50%}
.loupe::before{width:18px;height:2px;transform:translate(-50%,-50%)}.loupe::after{width:2px;height:18px;transform:translate(-50%,-50%)}
.v3btn.on{background:var(--light);border-color:var(--light);color:#3b2a00;font-weight:600}

.swatch{display:inline-block;width:12px;height:12px;border-radius:3px;border:1px solid rgba(0,0,0,.2);vertical-align:-1px;margin-right:5px}
.swatch.nlsw{width:18px;height:18px;vertical-align:-4px;margin:0 2px}   /* 言葉で直すのプレビューの色見本（2026-10-02 nl-quality） */
#rmsg.dirty{color:var(--warn);font-weight:600}
#rmsg:empty{display:none}
.walkpad .walktip.bump{background:rgba(178,94,0,.9)}
/* ---------- 間取り：図の上で線・部屋・ドア窓を描く（2026-09-26） ---------- */
.rmapwrap{position:relative;flex:1;min-height:0;display:flex}.rmapwrap>#rmap{flex:1}
.rguide{padding:6px 12px;color:var(--sub);border-bottom:1px solid var(--line);display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.rguide .chip[aria-pressed=true]{background:var(--accent);border-color:var(--accent);color:#fff}
/* 長さの欄は拡大の列（z-index 4）より上・拡大鏡（6）より下：幅 320 で「やめる」に拡大の「−」がかぶっていた */
.rask{position:absolute;left:8px;right:8px;top:8px;z-index:5;padding:10px 12px;background:#f4f7fc;border:1px solid #cfe0f7;border-radius:10px;box-shadow:0 6px 18px rgba(0,0,0,.12);display:flex;flex-direction:column;gap:8px}
.rask-row{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.rask-row input:not([type=checkbox]){width:9em}.rask .cm-wrap{display:flex;align-items:center;gap:4px}
.rask .chips{display:flex;flex-wrap:wrap;gap:6px}
.rpick{position:absolute;inset:18px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;border:2px dashed #9cc3f5;border-radius:14px;background:rgba(244,247,252,.94);cursor:pointer;text-align:center;padding:16px;color:var(--accent);font-size:16px}
.rpick input{position:absolute;inset:0;opacity:0;cursor:pointer}
#rmap[data-mode=line],#rmap[data-mode=room],#rmap[data-mode=open]{cursor:crosshair}
.rmapall .rline .ln{stroke:#0a66d8;vector-effect:none;stroke-linecap:round}.rmapall .rline .end{fill:#0a66d8}
.rmapall .rline .hit{stroke:transparent}.rmapall .rline.pend .ln{stroke:#c2410c;stroke-dasharray:6 4}.rmapall .rline.pend .end{fill:#c2410c}
.rmapall .rline.off .ln{stroke:#e8830c}.rmapall .rline.on .ln{stroke:#e5484d}
#rmap[data-mode=line] .rline{cursor:pointer}#rmap:not([data-mode=line]) .rline{pointer-events:none}
.rmapall .rdraft{fill:rgba(10,102,216,.08);stroke:#0a66d8;stroke-dasharray:8 5}.rmapall line.rdraft{fill:none}
.rmapall line.rdraft.door{stroke:#1f8a3b}.rmapall line.rdraft.window{stroke:#58a6e6}.rmapall line.rdraft.open{stroke:#9aa0a6}
.rmapall .draftlab{fill:#0a66d8;font-weight:700;text-anchor:middle}
.sw-line{border-top:2.5px solid #0a66d8}
.rlrow .lbl b{font-weight:500}
.rask.bottom{top:auto;bottom:8px}
/* 配置の図面：間取り図の画像・梁・ドアの開く範囲（2026-09-26） */
#pbase .beam{fill:rgba(140,98,57,.10);stroke:#8c6239;stroke-width:2;stroke-dasharray:7 4;vector-effect:non-scaling-stroke}
#pbase .beamlab{font:600 11px var(--font);fill:#6b4a2b;text-anchor:middle;dominant-baseline:central;paint-order:stroke;stroke:#fff;stroke-width:3px}
#pbase .doorarc{fill:rgba(31,138,59,.06);stroke:#1f8a3b;stroke-width:1.5;stroke-dasharray:4 3;vector-effect:non-scaling-stroke}
#pbase .doorleaf{fill:#1f8a3b}
#pbase .wall.column{fill:#5b6068}
/* 壁の窪み（線から読んだ物・見るだけ） */
/* 間取り：線の一覧（番号・長さ・備考・作った時に何として読んだか）と番号の札 */
.rlines{display:flex;flex-direction:column;gap:4px}
.rlines .rlrow{display:grid;grid-template-columns:2.4em 6.2em 1fr auto auto;gap:4px 8px;align-items:center;width:100%;text-align:left;padding:8px 10px;border:1px solid var(--line);border-radius:8px;background:var(--card);min-height:40px}
.rlines .rlrow.on{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}
.rlno{font-weight:700;color:#fff;background:#0a66d8;border-radius:999px;text-align:center;font-size:12px;line-height:20px;min-width:20px;padding:0 4px;justify-self:start}
.rlcm{font-weight:700;font-variant-numeric:tabular-nums}.rlcm.pend{color:#c2410c}.rlcm.off{color:#b25e00}
.rlnote{overflow-wrap:anywhere;font-size:13px}
.rgen{margin:6px 0 10px}.rgen .dirty{color:var(--pend);font-weight:700}.rgen ul{margin:4px 0 0;padding-left:1.2em}
.rask textarea{width:100%;font:inherit;font-size:16px;padding:6px 8px;border:1px solid var(--line);border-radius:8px;box-sizing:border-box;resize:vertical}
/* 図の線：番号の札（丸）と、カーソルを乗せた時・選んだ時だけの長さ・備考 */
.rmapall .rline .nob{fill:#0a66d8;stroke:#fff;stroke-width:1.5;vector-effect:non-scaling-stroke}
.rmapall .rline .not{fill:#fff;font-weight:700;text-anchor:middle;dominant-baseline:central;stroke:none;pointer-events:none}
.rmapall .rline.pend .nob{fill:#c2410c}.rmapall .rline.off .nob{fill:#e8830c}.rmapall .rline.on .nob,.rmapall .rline.hl .nob{fill:#e5484d}
.rmapall .rline .tip{display:none;fill:#1d1d1f;font-weight:700;text-anchor:middle;dominant-baseline:auto;stroke:#fff;pointer-events:none}
.rmapall .rline.hover .tip,.rmapall .rline.hl .tip{display:inline}   /* 乗っている時だけ（選んだ線にも出し続けていた） */
/* 指の端末はマウスが乗る事が無いので、押して選んだ線（.on）に長さを出す（findings #178） */
@media (pointer: coarse){.rmapall .rline.on .tip{display:inline}}
.ppeek{position:fixed;left:8px;right:8px;bottom:calc(8px + env(safe-area-inset-bottom,0px));z-index:20}
.notes3dbox summary{cursor:pointer;font-weight:600;font-size:13px;color:var(--sub);margin:4px 0}
.notes3dbox[open] summary{margin-bottom:6px}
/* 2026-09-29 仮の高さの窓がある時、欄を勝手に開いて文を並べていた。畳んだまま見出しに ⚠ の札で知らせる */
.notes3dbox .warnmark{display:inline-flex;align-items:center;gap:3px;margin-left:6px;padding:1px 8px;border-radius:999px;background:var(--warn-soft);color:var(--warn);font-weight:700}
@media (max-width:600px){
  /* 3D の操作の列は横に送らず2段に折り返す（図の高さを取り合わない画面なので・findings #252） */
  #modelView .stage-bar > .legend{flex-wrap:wrap;overflow-x:visible;row-gap:8px}
  #modelView .stage-bar > .legend.more{-webkit-mask-image:none;mask-image:none}
}
/* スマホの3Dで押した家具の名前と寸法（findings #126） */
.m3dpeek{position:absolute;left:8px;right:8px;bottom:8px;display:flex;gap:6px;align-items:center;padding:6px 8px;background:rgba(255,255,255,.94);border-radius:10px;box-shadow:0 2px 10px rgba(0,0,0,.15);font-size:13px;z-index:3}
.m3dpeek .pk-t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.chknote{margin:6px 2px 0}
.rmapall .rline.hl .ln{stroke:#e5484d}
.spacer{flex:1}   /* ボタンの並びで右へ寄せる空き（家具・照明の欄） */

/* ---------- 暗い表示（2026-09-27 厳しい評価：暗いモードの端末でも真っ白だった）。図と商品写真の帯は紙として明るいまま ---------- */
@media (prefers-color-scheme: dark){
  :root{color-scheme:dark;--bg:#000;--card:#1c1c1e;--ink:#f5f5f7;--sub:#aeaeb2;--line:#38383a;--hair:#48484a;
    --accent:#4da3ff;--accent-soft:rgba(10,132,255,.18);--ng:#ff6961;--ng-soft:rgba(255,69,58,.16);--good:#4cd964;--good-soft:rgba(48,209,88,.16);
    --warn:#ffb340;--warn-soft:rgba(255,159,10,.16);--pend:#ffa94d;--pend-soft:rgba(255,159,10,.14);
    --chip-bg:#3a3a3c}   /* 詳しい欄の札（寸法・向き）が明るい地に白い字（1.1:1）だった・2026-09-29 */
  input,select,textarea{background:#2c2c2e}
  button{background:#2c2c2e}
  @media (hover:hover){button:hover{background:#3a3a3c}}
  button.primary{background:#0b63ce;border-color:#0b63ce}   /* 白い字に 4.5:1（#0a84ff だと 3.6:1） */
  .seg{background:#2c2c2e}.seg button{background:none;color:var(--ink)}   /* 選んでいない側の字が背景と同じ色（1.1:1）だった */
  .fcard .img{color:#636366}.fcard.unlinked .img{color:#a64500}   /* 写真の帯は明るいままなので、字は暗い色 */
  button.danger,button.link{background:none}
  .top{background:rgba(28,28,30,.88)}
  .tabs{background:#2c2c2e}
  .tabs button[aria-selected=true],.seg button[aria-pressed=true]{background:#48484a;color:var(--ink)}
  .stage,.side,.add-card,.fcard{border-color:#2c2c2e;box-shadow:none}
  .chk:hover,.chk.on{background:#2c2c2e}
  .tag,.badge.unknown,.cand .store{background:#3a3a3c;color:#d1d1d6}
  .tag.purchased{background:#1d3a26;color:#8ee5a1}.tag.decided{background:#1b2f4d;color:#a5c8ff}
  .tag.candidate{background:#3d2c10;color:#ffc56b}.tag.owned{background:#3a3a3c;color:#d1d1d6}
  .tag.ai{background:#1b2f4d;color:#a5c8ff}.tag.ai.run{background:#3d2c10;color:#ffc56b}.tag.ai.err{background:#4a1d1a;color:#ff9f97}
  .groupbox{background:#1b2633;border-color:#2c3e55}
  .adopt{background:#3d2c10;border-color:#7a5a1a}
  .projbtn:hover{background:#2c2c2e}
  #toast{background:#3a3a3c}
  .m3dpeek,.walkpad button,.v3btn{background:rgba(44,44,46,.94);color:var(--ink)}
  .lab3d{background:rgba(28,28,30,.86);color:var(--ink)}
  .pempty{background:rgba(28,28,30,.92)}
  .ffilter .chip[aria-pressed=true]{background:var(--ink);color:#000;border-color:var(--ink)}
  .ffilter .chip[aria-pressed=true] small{color:rgba(0,0,0,.7)}
  .nlresult.preview{box-shadow:0 0 0 3px rgba(10,132,255,.25)}
  .nlbar form:focus-within{box-shadow:0 0 0 3px rgba(10,132,255,.25)}
  .rlrow:hover,.rlrow.on{background:#2c2c2e}
  .rask{background:#1c1c1e;border-color:#48484a;box-shadow:0 6px 18px rgba(0,0,0,.5)}   /* 明るい地のままだと「線 7 の長さ」が白地に白（1.01:1）だった */
  @media (max-width:860px){
    .top{background:#1c1c1e}
    .tabs{background:#1c1c1e}   /* 半透明だと 3D の説明の字がタブの絵の後ろに透けて見えた */
    .tabs button{color:#aeaeb2}
    .tabs button[aria-selected=true]{background:none;color:var(--accent)}
    .stage-bar > .zoom{background:rgba(44,44,46,.92)}
    #ppeek.m3dpeek{background:#2c2c2e}
  }
}

/* ---------- スマホの的の大きさ（最後に置く：前にある 34px・40px の決まりに負けないように。2026-09-27 厳しい評価 findings #218） ---------- */
@media (max-width:860px){
  .mhide{display:none!important}   /* .legend span{display:inline-flex} に負けていた */
  .stage-bar > .zoom button{min-width:44px}
  input[type=file]{min-height:44px}
  .chip,.stage-bar .seg button,.projbtn,.zoom button,.btns button,.add-row button,button.primary,.lrow,.fcard button,.fcard .v3btn,.ffilter .chip,
  .nlbar button,.rlines .rlrow,.chkx,.cand button,.lprod button,.inspector button,.side-head button,.notice,.unpl .chip,.tabs button,.rask button,
  .ruls button,.psec summary,#plightlist .lrow{min-height:44px}
  .zoom button,.chkx,.chip,.fcard .v3btn,.stage-bar .seg button{min-width:44px}
  input:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=file]),select,.rask input{min-height:44px}
  .nlbar input{min-height:40px}
  #ppeek .pk-arrow{min-width:44px;min-height:44px}
  .stage-bar .seg button{padding:6px 14px}
  /* 「↶」だけのボタンは字が小さく、何のボタンか分かりにくかった */
  #undoPlace,#undo3d,#redoPlace,#redo3d,#ppeek [aria-label="1つ前に戻す"]{font-size:21px;line-height:1}
}

/* ---------- スマホの配置：図を画面いっぱいに・下から引き上げるシート（2026-09-28 本人「それやっちゃって」） ---------- */
.sheet-handle{display:none}
@media (max-width:860px){
  :root{--sheetPeek:88px}
  body[data-view=plan],body[data-view=plan]:has(#ppeek){height:100dvh;overflow:hidden;display:flex;flex-direction:column;padding-bottom:var(--tabsH,62px)}
  body[data-view=plan] > #planView{flex:1;min-height:0;padding-bottom:calc(var(--sheetPeek) + 6px)}
  body[data-view=plan] #planView .stage{flex:1;min-height:0;height:auto}
  body[data-view=plan] #planView .pbody{flex:1;min-height:0;display:flex;flex-direction:column}
  body[data-view=plan] #planView .map{flex:1;min-height:120px;height:auto;aspect-ratio:auto;touch-action:none}   /* 1本指で図を動かす（ページ送りは無い） */
  body[data-view=plan] #planView .p3dslot{flex:none;height:38%}
  body[data-view=plan] #pside{position:fixed;left:0;right:0;bottom:var(--tabsH,62px);z-index:25;height:var(--sheetPeek);overflow:hidden;
    border-radius:16px 16px 0 0;border:0;border-top:1px solid var(--line);padding:0 14px 16px;box-shadow:0 -6px 24px rgba(0,0,0,.12);transition:height .25s ease;overscroll-behavior:contain}
  body[data-view=plan][data-sheet=half] #pside{height:55dvh;overflow-y:auto}
  body[data-view=plan][data-sheet=full] #pside{height:calc(100dvh - var(--tabsH,62px) - var(--headH,50px) - 8px);overflow-y:auto}
  body[data-view=plan] #pside.dragging{transition:none;overflow:hidden}
  .sheet-handle{display:flex;position:sticky;top:0;z-index:3;width:calc(100% + 28px);margin:0 -14px;height:44px;min-height:44px!important;
    align-items:center;justify-content:center;border:0;border-radius:16px 16px 0 0;background:var(--card);padding:0;touch-action:none;cursor:grab}
  .sheet-handle > span:first-child{display:block;width:40px;height:5px;border-radius:3px;background:#c7c7cc}   /* 札（.hsum の中の span）には効かせない */
  body[data-view=plan] #pside .side-head{top:44px}
  body[data-view=plan] #pside .insp-head{position:sticky;top:44px;background:var(--card);z-index:2}
  /* 閉じている時は見出しだけ。次の行の上半分がタブの際で切れて見えていた（2026-09-28 厳しい評価）。引いている間は見せる */
  body[data-view=plan][data-sheet=peek] #pside:not(.dragging) :is(#pdefault > :not(.side-head),#pinspector > :not(.insp-head)){visibility:hidden}
  /* 帯（家具・照明を選んだ時）はシートの見出しの上に重ねる。シートを開いている間は隠す */
  #ppeek.ppeek{bottom:calc(var(--tabsH,62px) + 4px);z-index:28}
  body[data-sheet=half] #ppeek.ppeek,body[data-sheet=full] #ppeek.ppeek{display:none}
  body[data-view=plan]:has(#ppeek:not([hidden])) #planView .stage-bar > .zoom{bottom:calc(10px + var(--peek-h,110px) - var(--sheetPeek) - 2px)}
  body[data-view=plan] #toast{bottom:calc(var(--tabsH,62px) + var(--sheetPeek) + 10px)}
  body[data-view=plan]:has(#ppeek:not([hidden])) #toast{bottom:calc(var(--tabsH,62px) + var(--peek-h,110px) + 12px)}
  body.fs #pside{display:none}
  /* 全画面で家具・照明を選ぶと、帯（下 10px）が右下の「✕ 閉じる」を覆い、選ぶのをやめるまで全画面を出られなかった
     （上の決まりはシートのつまみの分を引くので、シートの無い全画面では帯の裏に入る・2026-10-01 docs・findings #452）。帯のすぐ上に出す */
  body.fs[data-fs=plan]:has(#ppeek:not([hidden])) #planView .stage-bar > .zoom{bottom:calc(var(--peek-h,110px) + 18px + env(safe-area-inset-bottom))}
  /* 全画面の枠（z-index 40）が知らせ（20）の上にかぶり、全画面の間は「⚠ 他の線と 30% 合いません」も赤い保存の失敗も見えず、
     全画面を出た後に遅れて出ていた（2026-10-02 mobile の手の確認・findings #481）。枠より上に出し、右下の「✕ 閉じる」・帯・取り消すの帯の上に置く */
  body.fs #toast{z-index:60;bottom:calc(76px + env(safe-area-inset-bottom))}
  body.fs:has(#ppeek:not([hidden])) #toast{bottom:calc(var(--peek-h,110px) + 70px + env(safe-area-inset-bottom))}
  body.fs[data-fs=rooms]:has(.undobar) #toast{bottom:calc(128px + env(safe-area-inset-bottom))}
}
@media (max-width:860px) and (max-height:500px) and (orientation:landscape){
  :root{--sheetPeek:52px}
  body[data-view=plan] #planView .map{height:auto}
  /* 横向きの配置は図の高さが 146px しかなかった（findings #306・#438）。図の上の余白と操作の列の上下を詰める（的は 44px のまま） */
  #planView.view{padding-top:2px}
  #planView .stage-bar{padding-block:2px}
  /* 3D も見出しと下のタブの間に収める（開いた時に 3D の下 65px がタブの裏に隠れ、家具の名前の札がタブにかかっていた・2026-09-29 mobile） */
  #modelView .stage{height:calc(100dvh - var(--headH,62px) - var(--tabsH,53px) - 16px)}
  /* 案内「そのまま指で動かせます」が帯のすぐ上＝高さ 165px の図の下の真ん中に出て、図の約 1/4（ベッドなど）を覆っていた（findings #471）。
     横向きでは帯の左端の名前の上に重ねる（名前は読む物で、2.8 秒で戻る。押す物の ↶・詳しく・◀▶ は右側なのでかからない） */
  body[data-view=plan]:has(#ppeek:not([hidden])) #toast.hint{left:max(14px,env(safe-area-inset-left));transform:none;animation:none;max-width:36vw;z-index:29;
        bottom:calc(var(--tabsH,62px) + 4px + (var(--peek-h,56px) - 40px) / 2)}
}

/* 確かめの箱（図の入れ替えなど・2026-09-28） */
.askbox{position:fixed;inset:0;z-index:60;background:rgba(0,0,0,.35);display:flex;align-items:center;justify-content:center;padding:16px}
.askbox-in{background:var(--card);color:var(--ink);border-radius:14px;padding:18px;max-width:420px;box-shadow:0 12px 40px rgba(0,0,0,.25)}
.askbox-in p{margin:0 0 14px;line-height:1.6}
.askbox .btns button{min-height:44px;min-width:88px}
button.danger-fill{background:var(--ng);border-color:var(--ng);color:#fff;font-weight:600}
#rundo{margin:8px 0}

/* ---------- 文字に頼らない見た目（2026-09-28 本人「説明の文章が長い…」「全部アイコンとか形とか色とか線とかデザインで直感的に」） ----------
   ・押す物には線のアイコン（.ic）。文字は短く添える
   ・状態は色だけでなく形でも：購入済み ●・決定 ◆・持参 ■・候補 ○・配置済み ✓・確認 ⚠
   ・説明は ⓘ（.info）を押した時だけ */
.ic{width:1.15em;height:1.15em;flex:none;vertical-align:-.2em;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;pointer-events:none}
button:has(> .ic),a:has(> .ic),.chip:has(> .ic){display:inline-flex;align-items:center;justify-content:center;gap:.4em}
summary > .ic{margin-right:.35em}
/* 状態の札：色と形 */
.tag.purchased::before{content:"● "}.tag.decided::before{content:"◆ "}.tag.owned::before{content:"■ "}.tag.candidate::before{content:"○ "}
.tag.placed{background:var(--good-soft);color:var(--good);font-weight:600}
.tag.price{background:none;color:var(--ink);font-weight:600;padding-left:2px}
button.tag.ask{border:1px solid var(--warn);background:var(--warn-soft);color:var(--warn);font-weight:700;cursor:pointer;min-height:0;padding:2px 8px}
.fcard .ttl small{display:inline;margin-left:6px}
.fcard .edit .adopt,.fcard .edit .unres{margin:0}
.fcard .edit .manual{border:1px dashed var(--line);border-radius:10px;padding:6px 10px}
.fcard .edit .manual[open]{border-style:solid}
.fcard .edit .manual summary{font-size:12.5px;color:var(--sub)}
.fcard .edit .manual summary::before{content:"✎ "}
.fcard .edit .manual-body{display:grid;grid-template-columns:repeat(3,1fr);gap:6px;margin-top:8px}
.fcard .edit .manual-body label{font-size:11px;color:var(--sub);display:flex;flex-direction:column;gap:3px}
.fcard .edit .emore{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.fcard .edit .emore:empty{display:none}
.fcard .edit .emore a.ext{display:inline-flex;align-items:center;gap:.3em;padding:6px 4px}
/* ⓘ：説明は押した時だけ */
.infowrap{display:block;margin:4px 0}
.info{display:inline-flex;align-items:center;justify-content:center;border:0;background:none;padding:0;width:32px;height:32px;min-height:0;cursor:pointer;color:var(--sub)}
.info > span{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;border:1.5px solid currentColor;font:italic 700 13px/1 Georgia,serif}
.info[aria-expanded=true]{color:var(--accent)}
.infotext{display:block;font-size:12px;color:var(--sub);line-height:1.55;padding:2px 2px 6px}
/* 間取り：なぞる動きの小さな絵（線を1本引くと消える） */
.rguide{display:flex;align-items:center;gap:10px;font-weight:600;color:var(--ink)}
.rguide[hidden]{display:none!important}
.gpic{position:relative;flex:none;width:44px;height:14px}
.gpic b{position:absolute;left:4px;top:6px;height:3px;width:0;border-radius:2px;background:var(--accent);animation:gdraw 2.4s ease-in-out infinite}
.gpic i{position:absolute;left:0;top:1px;width:12px;height:12px;border-radius:50%;background:var(--accent);opacity:.35;animation:gdot 2.4s ease-in-out infinite}
@keyframes gdraw{0%,15%{width:0}70%,100%{width:36px}}
@keyframes gdot{0%,15%{left:0}70%,100%{left:34px}}
@media (prefers-reduced-motion:reduce){.gpic b,.gpic i{animation:none}.gpic b{width:36px}.gpic i{left:34px}}
.rpick-ic svg{width:44px;height:44px;fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}
/* 作った結果：✓ の丸 */
.gendone{display:flex;align-items:center;flex-wrap:wrap;gap:2px}
.okdot{display:inline-flex;width:22px;height:22px;border-radius:50%;background:var(--good);color:#fff;align-items:center;justify-content:center;margin-right:6px}
.okdot .ic{width:14px;height:14px;stroke-width:2.6}
details.unsure > summary{color:var(--warn);font-weight:600}
/* 図の下の操作のこつ：キーの形 */
.map-foot{display:flex;flex-wrap:wrap;gap:4px 14px;align-items:center}
.map-foot .kb{display:inline-flex;align-items:center;gap:4px;white-space:nowrap}
.map-foot kbd,.insp kbd{font:11px/1 system-ui;border:1px solid var(--line);border-bottom-width:2px;border-radius:4px;padding:2px 5px;background:var(--card);color:var(--ink)}
.grid1{display:inline-block;width:12px;height:12px;border:1px solid #9aa0aa;background:linear-gradient(#9aa0aa,#9aa0aa) center/1px 100% no-repeat,linear-gradient(#9aa0aa,#9aa0aa) center/100% 1px no-repeat}
/* 搬入：1行は印と名前。押すと理由 */
details.acc > summary{list-style:none;cursor:pointer;color:var(--ink)}
details.acc > summary::-webkit-details-marker{display:none}
details.acc .chev{margin-left:auto;color:var(--sub);font-size:18px;transition:transform .15s}
details.acc[open] .chev{transform:rotate(90deg)}
details.acc > p{margin:0 0 8px 12px;line-height:1.55}
details.acc > .accgo{margin:0 0 10px 12px;min-height:44px}
/* 搬入の決め手：開口の枠と箱の断面の図（文は ⓘ の中・2026-10-02 ux-strict #449） */
details.acc > .accfigrow{display:flex;align-items:center;gap:10px;margin:0 0 8px 12px}
.accfig{display:block;flex:none;overflow:visible}
.accgate{font-weight:700}.accgate.ng{color:var(--ng)}.accgate.caution{color:var(--warn)}.accgate.ok{color:var(--good)}
/* お知らせの印：⚠ と i を丸に */
.notice .badge{min-width:24px;text-align:center}
/* 3D：タップを促す丸 */
.tapme{display:flex;align-items:center;gap:10px}
.tapdot{width:14px;height:14px;border-radius:50%;background:var(--accent);opacity:.5;box-shadow:0 0 0 0 var(--accent);animation:tapdot 1.8s ease-out infinite}
@keyframes tapdot{0%{box-shadow:0 0 0 0 rgba(10,102,216,.45)}100%{box-shadow:0 0 0 12px rgba(10,102,216,0)}}
@media (prefers-reduced-motion:reduce){.tapdot{animation:none}}
@media (max-width:860px){
  .info{width:44px;height:44px}
  .fcard .edit .manual summary{min-height:44px;display:flex;align-items:center}
  button.tag.ask{min-height:44px}
  .map-foot{display:none}   /* スマホはキー・ホイールが無い */
}
/* 編集を開いている間は、カードの下のボタン（編集・配置する）を隠す（編集欄に 保存・閉じる がある） */
.fcard:has(form.edit:not([hidden])) .foot{display:none}
.side-head .infowrap{display:inline;margin:0}
.side-head .infowrap .info{vertical-align:middle}
.side-head .infotext{font-weight:400}
/* 札の並び：「⚠ 確認」（指で押せる高さ）に合わせてほかの札が縦に伸びないように */
.fcard .tags{align-items:center}
/* 長い文の行：1文目だけ・押すと全文（clipLine） */
.clip{cursor:pointer}
.clip[aria-expanded=false]::after{content:" ›";color:var(--accent);font-weight:700}
@media (max-width:860px){.clip{padding:10px 0;min-height:44px;box-sizing:border-box}}

/* ---------- 2026-09-28 simple3：詳しい欄（家具・照明）の見出しに 回す・外す・✕ を常に。中身は札で（本人「すぐに閉じれない・中身が見づらい」） ---------- */
.insp-head{display:flex;align-items:center;gap:8px;min-height:48px}
.insp-head .insp-title{flex:1;min-width:0;font-weight:700;font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.insp-acts{display:flex;gap:4px;flex:none}
.iconbtn{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;min-height:0;padding:0;border-radius:12px}
.iconbtn .ic{width:20px;height:20px}
.iconbtn.danger{color:var(--ng)}
/* :hover も並べる：指で押した後に残る hover（button.danger:hover の薄いピンク）が勝ち、「削除？」の白い字が 1.14:1 で読めなかった（2026-09-29 regression） */
.iconbtn.armed,.iconbtn.armed:hover{width:auto;padding:0 10px;font-size:12px;background:var(--ng);border-color:var(--ng);color:#fff}
.insp-facts{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.insp-facts .fact{display:inline-flex;align-items:center;gap:5px;font-size:13px;background:var(--chip-bg,#f2f2f5);border-radius:8px;padding:4px 9px;font-variant-numeric:tabular-nums}
.insp-facts .fact.muted{color:var(--sub)}
.insp-facts .tag{font-size:12px;padding:4px 9px;border-radius:8px}
.facearrow{display:inline-block;font-size:10px;color:var(--accent);line-height:1}
.inspector .xyd{border-top:1px solid var(--line);padding-top:4px}
.inspector .xyd > summary{font-weight:600}
@media (max-width:860px){
  .iconbtn{width:44px;height:44px}
  body[data-view=plan] #pside .insp-head{position:sticky;top:44px;background:var(--card);z-index:3;margin:0 -14px;padding:2px 14px;border-bottom:1px solid var(--line)}
}
/* 歩いて見る：進めない時は矢印ボタンが赤く揺れる（文字は出さない） */
@keyframes walkbump{0%,100%{transform:translateX(0)}20%{transform:translateX(-6px)}40%{transform:translateX(6px)}60%{transform:translateX(-4px)}80%{transform:translateX(4px)}}
.walkpad.bump button{border-color:var(--ng);background:rgba(255,59,48,.18)}
.walkpad.bump{animation:walkbump .4s ease}
@media (prefers-reduced-motion:reduce){.walkpad.bump{animation:none}}
.walkpad .walktip{display:none}
/* ↷ 進む：押せない時は薄く */
#redoPlace:disabled,#redo3d:disabled{opacity:.35}
/* 全画面ボタンだけになった列は、PC でも右上に小さく出す */
@media (min-width:861px){.fsbtn{display:none}}
@media (max-width:860px){.stage-bar > .legend > #redoPlace,.stage-bar > .legend > #redo3d{order:-2}}   /* PC で「進む」が列の先頭に出ていた */
.monly{display:none!important}   /* .legend span に負けないように */
@media (max-width:860px){.monly{display:inline!important}}
/* スマホ：戻す・進むは 44pt の丸いアイコンだけ（↷ を足して列が 390 幅に収まらなかった） */
@media (max-width:860px){#undoPlace,#redoPlace,#undo3d,#redo3d{width:44px;min-width:44px;padding:0}}

/* ---------- 2026-09-29：同じ商品は「✓ 追加済み」・足したら分かる・家具の削除 ---------- */
.cand.added{background:var(--good-soft);border-radius:10px}
button.added{background:var(--good-soft);border-color:var(--good);color:var(--good);font-weight:700;opacity:1;cursor:default}
button.added .ic{stroke-width:2.6}
.dupmsg{display:inline-flex;align-items:center;gap:4px;color:var(--good)}
@keyframes justadded{0%{box-shadow:0 0 0 0 rgba(23,112,47,.55)}70%{box-shadow:0 0 0 12px rgba(23,112,47,0)}100%{box-shadow:0 0 0 0 rgba(23,112,47,0)}}
.fcard.justadded{outline:2px solid var(--good);animation:justadded 1.4s ease-out 3}
/* 置いた家具が図で小さい時の輪（指の大きさ 56px・3回脈打って消える・2026-10-01 dogfood） */
@keyframes pping{0%{transform:translate(-50%,-50%) scale(1.6);opacity:0}25%{opacity:1}100%{transform:translate(-50%,-50%) scale(1);opacity:.9}}
.pping{position:fixed;z-index:30;width:56px;height:56px;border:3px solid var(--good);border-radius:50%;pointer-events:none;box-shadow:0 0 0 2px rgba(255,255,255,.8);transform:translate(-50%,-50%);animation:pping 1s ease-out 3}
.fcard.justadded .ttl::before{content:"NEW";display:inline-block;margin-right:6px;font-size:11px;font-weight:700;color:#fff;background:var(--good);border-radius:5px;padding:1px 6px;vertical-align:1px}
@media (prefers-reduced-motion:reduce){.fcard.justadded{animation:none}}
.fcard.linked{outline:2px solid var(--good);animation:justadded 1.4s ease-out 2}
@media (prefers-reduced-motion:reduce){.fcard.linked{animation:none}}
.fcard .edit .fdel{margin-left:auto;color:var(--ng)}
.undobar{position:fixed;left:50%;transform:translateX(-50%);bottom:24px;width:min(560px,calc(100vw - 24px));z-index:60;display:flex;align-items:center;gap:10px;margin:0;padding:8px 12px;border-radius:12px;background:#1d1d1f;color:#fff;box-shadow:0 6px 20px rgba(0,0,0,.18)}
.undobar > span{flex:1;min-width:0;font-size:14px}
.undobar .chip{background:#fff;color:#1d1d1f;border-color:#fff;font-weight:700}
@media (max-width:860px){.undobar{bottom:calc(var(--tabsH,62px) + 12px)}}   /* 送った先で消しても見える（下のタブのすぐ上） */
/* 2回押しの2回目（もう一度押すと削除）は赤地に白い字。削除ボタンの赤い字（.fcard .edit .fdel など）が勝って、赤地に赤い字＝ただの赤い四角になっていた（2026-09-29 本人） */
button.armed,button.armed:hover{color:#fff!important;background:#d70015!important;border-color:#d70015!important}   /* 暗い表示の明るい赤（#ff6961）だと白い字が 2.7:1 だった */
button.armed .ic{stroke:#fff}

/* ---------- 2026-09-29 配置の判定の欄（本人「メニューに被ったりしてる・中身も非常に見づらい」） ---------- */
/* 見出しの件数：✓7・✕1・i 1 の札 */
#pcount{display:inline-flex;gap:6px;align-items:center;vertical-align:middle;margin-left:4px}
.sc{display:inline-flex;align-items:center;gap:3px;font-size:13px;font-weight:700;border-radius:999px;padding:2px 9px;font-variant-numeric:tabular-nums}
.sc .ic{width:14px;height:14px;stroke-width:2.6}
.sc.ok{background:var(--good-soft);color:var(--good)}.sc.ng{background:var(--ng-soft);color:var(--ng)}.sc.note{background:#eef0f4;color:var(--sub)}.sc.warn{background:var(--ng-soft);color:var(--ng)}
/* 判定の1行：丸・名前・目盛り・数 */
.chk.v2{grid-template-columns:28px 1fr auto;gap:10px;padding:10px 8px;border-radius:12px}
.chk.v2 .chkmark{display:inline-flex;width:26px;height:26px;border-radius:50%;align-items:center;justify-content:center;color:#fff;background:var(--good)}
.chk.v2.ng .chkmark{background:var(--ng)}
.chk.v2 .chkmark .ic{width:15px;height:15px;stroke-width:2.8}
.chk.v2 .lbl b{font-weight:600;font-size:14px;line-height:1.35;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.chk.v2 .lbl .arrow{color:var(--sub);font-weight:400}
/* 判定の2つの名前をそれぞれ縮める（片方が長いと相手が「T…」だけになった・2026-10-02 dogfood） */
.chk.v2 .lbl b.pair{display:flex;min-width:0}
.chk.v2 .lbl b.pair .nm{font-size:inherit;color:inherit;flex:0 1 auto;min-width:2.5em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.chk.v2 .lbl b.pair .arrow{flex:none;white-space:pre}
.chk.v2 .gauge{position:relative;display:block;height:6px;margin-top:6px;border-radius:3px;background:#e9e9ee;overflow:visible}
.chk.v2 .gauge .fill{position:absolute;left:0;top:0;bottom:0;border-radius:3px;background:var(--good)}
.chk.v2.ng .gauge .fill{background:var(--ng)}
.chk.v2 .gauge .need{position:absolute;top:-3px;bottom:-3px;width:2px;margin-left:-1px;background:var(--ink);border-radius:1px}
.chk.v2 .num{display:flex;flex-direction:column;align-items:flex-end;line-height:1.1;min-width:56px}
.chk.v2 .num b{font-size:18px;font-weight:700;color:var(--good)}
.chk.v2.ng .num b{color:var(--ng)}
.chk.v2 .num small{font-size:12px;color:var(--sub);font-weight:500}
.chk.v2 .num em{font-style:normal;font-size:11.5px;color:var(--ng);font-weight:700;margin-top:2px;white-space:nowrap}
.chk.v2.ng{background:var(--ng-soft)}
.chkx .ic{width:18px;height:18px}
.chkx{color:var(--sub)}
.chkx.armed{width:auto!important;padding:0 10px;font-size:12px;border-radius:10px}
/* 欄（お知らせ・未配置・照明・搬入）：間を詰めて、見出しに件数 */
#pdefault{display:flex;flex-direction:column;gap:2px}
#pdefault .psec{border-top:1px solid var(--line);margin:0}
#pdefault .psec > summary{padding:4px 0;min-height:44px;display:flex;align-items:center}
#pdefault .psec > summary h3{margin:0;font-size:14px;color:var(--ink)}
#pdefault .psec > .list{padding-bottom:6px}
#pdefault #pchecks{margin-bottom:8px}
/* 送った時：見出しの下で行が切れて見えないよう、見出しに境目と影 */
body[data-view=plan] #pside .side-head{background:var(--card);z-index:3;box-shadow:0 8px 8px -8px rgba(0,0,0,.18);padding-bottom:6px;margin-bottom:2px}
body[data-view=plan] #pside .side-head h2{display:flex;align-items:center;flex-wrap:wrap;gap:4px;margin:0}
/* つまみ：横向きでは件数もつまみの横に（閉じたシートは つまみしか見えない） */
.sheet-handle .hsum{display:none}
@media (max-width:860px){
  body[data-view=plan][data-sheet=half] #pside{height:var(--sheetHalf,55dvh)}
  body[data-view=plan][data-sheet=full] #pside{height:var(--sheetFull,calc(100dvh - var(--tabsH,62px) - var(--headH,50px) - 8px))}
  /* 家具・照明を選んで帯が出ている間は、閉じたシートを隠す（帯の下からシートの見出しの切れ端がはみ出していた） */
  body[data-view=plan][data-sheet=peek]:has(#ppeek:not([hidden])) #pside{visibility:hidden}
}
@media (max-width:860px) and (max-height:500px) and (orientation:landscape){
  .sheet-handle{gap:12px}
  .sheet-handle .hsum{display:inline-flex;align-items:center;gap:6px;font-style:normal;font-size:13px;color:var(--ink)}
  .sheet-handle span{flex:none}
  /* 半分・全部の時は下の見出しに同じ「判定 ✓7 i1」が見えるので、つまみ横の要約は出さない（2回並んでいた・findings #321） */
  body:is([data-sheet=half],[data-sheet=full]) .sheet-handle .hsum{display:none}
  /* 半分の時は高さが約 120px しかなく、つまみと「判定」の見出しだけで埋まり、判定の行が1つも見えなかった（2026-09-30 16:16 ux-strict）。
     判定の欄を出している半分の時だけ、要約をつまみの横に出して下の見出しを隠す（1回だけ並ぶのは同じ・全部の時は見出しに戻す） */
  body[data-view=plan][data-sheet=half]:has(#pdefault:not([hidden])) .sheet-handle .hsum{display:inline-flex}
  body[data-view=plan][data-sheet=half] #pdefault > .side-head{display:none}
  /* 閉じた時は要約がつまみ横にあるのに、下の見出しがタブの上に 7px 出ていた。判定 0 件の物件では見出しが低く、
     「判定 …」の字の上半分が切れて見えた（2026-10-02 04:16 ux-strict）。引いている間は見せる */
  body[data-view=plan][data-sheet=peek] #pside:not(.dragging) #pdefault > .side-head{visibility:hidden}
}
@media (prefers-color-scheme:dark){
  :root:not([data-theme=light]) .chk.v2 .gauge{background:#3a3a3c}
  :root:not([data-theme=light]) .sc.note{background:#2c2c2e}
}
/* 判定の丸は濃い緑・濃い赤に固定（暗い表示の明るい緑・赤の上では白い印が見えにくかった） */
.chk.v2 .chkmark{background:#17702f}
.chk.v2.ng .chkmark{background:#d70015}
/* 目視の巡回 t2（2026-09-29）：
   ・詳しい欄が半分の時は、知らせを欄のすぐ上（図の上）に出す（欄の中身にかぶっていた。上端に出すと戻すボタンにかぶる）。全部の時は下のメニューのすぐ上
   ・家具の編集の見出し（名前・状態・部屋・個数）11px と向きの ▼ 10px を 12px に・PC のキー案内も 12px
   ・物件の一覧の行 34px・折りたたみの見出し 43px・「ページ ↗」幅 43px を 44px 以上に */
@media (max-width:860px){
  body[data-view=plan][data-sheet=half] #toast,
  body[data-view=plan][data-sheet=half]:has(#ppeek:not([hidden])) #toast{bottom:calc(var(--tabsH,62px) + var(--sheetHalf,55dvh) + 10px)}
  body[data-view=plan][data-sheet=full] #toast,
  body[data-view=plan][data-sheet=full]:has(#ppeek:not([hidden])) #toast{bottom:calc(var(--tabsH,62px) + var(--sheetFull,calc(100dvh - var(--tabsH,62px) - var(--headH,50px) - 8px)) - 42px)}
  /* ↑ 全部の時は、知らせをシートの上端のつまみの行（44px・押す物でも読む物でもない）に重ねる。下のメニューのすぐ上だと
     一覧の行（「L05 ペンダント 寝室」など）に 2.8 秒かぶっていた（2026-10-02 ux-strict・findings #461）。知らせは押すのを通すのでつまみはそのまま引ける */
  body[data-view=plan]:is([data-sheet=half],[data-sheet=full]) #toast{z-index:40}   /* 詳しい欄（z-index 25）の後ろに隠れて、知らせが見えていなかった（帯の時は帯より奥のまま＝帯のボタンにかぶらない） */
  summary{padding-block:13px}
  a.ext{min-width:44px;justify-content:center}
}
.fcard .edit label,.fcard .edit .manual-body label{font-size:12px}
.facearrow{font-size:12px}
.map-foot{font-size:12px}
.map-foot kbd,.insp kbd{font-size:12px}
/* PC も字は 12px 以上に（スマホだけ 12px にしていた。札・値段・件数・部屋の凡例が 10〜11px だった） */
.tag,.badge,.chk .lbl span,.fcard .ttl small,.lrow small,.cand .store,kbd,.dims small,.chk.v2 .num em{font-size:12px}
small{font-size:12px!important}
.fcard.justadded .ttl::before{font-size:12px}
.projlist button{min-height:44px;align-items:center}
/* 間取り図の入れ替え：ブラウザそのままの「ファイルの選択」ではなく、絵つきのボタンに（2026-09-29 全機能を手で触った回） */
.filebtn{position:relative;align-self:flex-start;display:inline-flex;align-items:center;gap:6px;min-height:44px;padding:0 14px;border:1px solid var(--line);border-radius:10px;background:var(--card);color:var(--accent);font-weight:600;font-size:14px;cursor:pointer}
.filebtn input{position:absolute;inset:0;width:100%;opacity:0;cursor:pointer}
/* 言葉で直すの聞き返し：選択肢を押せるボタンで縦に（2026-09-29 全機能を手で触った回） */
.nlopts{display:flex;flex-direction:column;gap:6px;margin:8px 0}
.nlopts .chip{display:flex;align-items:flex-start;gap:8px;text-align:left;min-height:44px;padding:10px 12px;border-radius:12px;white-space:normal;line-height:1.4}
.nlopts .chip b{flex:none;display:inline-grid;place-items:center;width:22px;height:22px;border-radius:50%;background:var(--accent);color:#fff;font-size:12px}
/* 部屋が無い物件の3D：案内を真ん中に、操作の列（歩く・名前・一周・壁）と「家具をタップ」は隠す（2026-09-29 全機能の回） */
.m3d-empty{position:absolute;inset:0;z-index:3;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;background:var(--bg,#f2f2f5)}
.m3d-empty p{margin:0;font-size:15px}
body.m3d-none #m3dWalk,body.m3d-none #m3dLabels,body.m3d-none #m3dSpin,body.m3d-none #modelView .seg,body.m3d-none #m3dinfo .tapme{display:none}
#rgenBtn.idle{opacity:.45}
#roomsView .zoom:has(> .fsbtn[hidden]){display:none}   /* 全画面を隠した後に丸い台だけ残っていた */
/* 外から開いて合言葉がまだ無い時の入口（2026-10-02） */
.gate{position:fixed;inset:0;z-index:100;display:grid;place-items:center;padding:16px;background:var(--bg)}
.gate-card{display:flex;flex-direction:column;align-items:center;gap:12px;width:min(360px,100%);padding:24px;border-radius:16px;background:var(--card);box-shadow:0 8px 30px rgba(0,0,0,.08)}
.gate-card .ic{width:32px;height:32px;color:var(--accent)}
.gate-card b{font-size:17px}
.gate-card input{width:100%;min-height:48px;font-size:16px;padding:0 14px;border:1px solid var(--line);border-radius:12px;background:var(--card);color:var(--ink)}
.gate-card button{width:100%;min-height:48px;font-size:16px;border-radius:12px}
