/* 本番用のレイアウト調整。
 * プロトタイプは1枚のHTMLの中にスマホの枠（.phone / .screen / タブ）を描いてデモしていた。
 * 本番ではページそのものがスマホの画面になるため、その枠のぶんだけをここで置き換える。
 * app.css（プロトタイプからの移植）は書き換えず、差分だけをこのファイルに置く。
 */
html, body { height: 100%; }

body {
  background: var(--stage);
  /* ページ自体はスクロールさせない。スクロールするのは中の .scroll だけ。
     これが無いと、iOSでツールバーの高さぶんだけページ全体がずれ、
     上部のバーが隠れ、下の合計バーが画面の外に出る。 */
  overflow: hidden;
  overscroll-behavior: none;
}

/* プロトタイプの .screen に相当する箱。
   【iOS対策】高さを 100dvh で指定すると、ツールバーの出入りで画面の高さが変わり、
   ページ全体が動いてしまう。位置を固定して、常に見えている範囲いっぱいに収める。 */
.app-shell {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  margin-inline: auto;
  max-width: 440px;
  background: var(--bg);
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

/* 中身がはみ出しても、押し出されずに縮む（下の合計バーを守る） */
.app-shell > #app { flex: 1 1 auto; min-height: 0; }
.app-shell > #footer { flex: 0 0 auto; }

@media (max-width: 480px) {
  .app-shell { max-width: none; }
}

/* 全ページ共通の上部バー（スタメニのロゴ）。
   端末のセーフエリア（画面上部の切り欠き）はここで吸収する。 */
.appbar {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  /* 左端は見出し（.apphead / .staffhead の padding 18px）に合わせる */
  padding: calc(10px + env(safe-area-inset-top)) 18px 6px;
  background: var(--bg);
}
.appbar-logo {
  height: 20px;
  width: auto;
  display: block;
  flex: 0 0 auto;
}

/* ロゴの横に並べる画面名。見出し（h2）と同じ書体で、少し小さくする。 */
.appbar-title {
  font-family: "Zen Old Mincho", "Hiragino Mincho ProN", "Yu Mincho", YuMincho, serif;
  font-size: 1rem;
  font-weight: 700;
  letter-spacing: .05em;
  color: var(--ink);
  margin: 0 0 0 10px;
  padding-left: 10px;
  border-left: 1px solid var(--line);
  line-height: 1.2;
}

/* 上部の余白: プロトタイプはノッチを避けるため 42px 空けていた。
   本番では上のバーがその役目を持つので、見出し側は詰める。 */
.apphead, .backrow, .staffhead { padding-top: 10px; }

/* 動作確認ページ（開発用・本番では出さない） */
.status-wrap { padding: 24px 18px 40px; }
.status-wrap h1 { font-family: "Zen Old Mincho", "Hiragino Mincho ProN", "Yu Mincho", YuMincho, serif; font-size: 1.3rem; margin-bottom: 4px; }
.status-wrap table { width: 100%; border-collapse: collapse; margin: 10px 0 18px; background: var(--card); border-radius: var(--r-md); overflow: hidden; }
.status-wrap th, .status-wrap td { padding: 8px 12px; border-bottom: 1px solid var(--line); font-size: .82rem; text-align: left; }
.status-wrap td:last-child, .status-wrap th:last-child { text-align: right; font-variant-numeric: tabular-nums; }
.status-wrap tr:last-child th, .status-wrap tr:last-child td { border-bottom: 0; }
.status-wrap code { background: #EFEDE7; padding: 2px 6px; border-radius: 6px; font-size: .78rem; word-break: break-all; }
.status-wrap .ok { color: var(--green); font-weight: 700; }
.status-wrap .ng { color: var(--danger); font-weight: 700; }

/* 変更履歴の折りたたみ（<details>）を、プロトタイプの「詳しく見る」ボタンと同じ見た目にする */
summary.morebtn { list-style: none; cursor: pointer; }
summary.morebtn::-webkit-details-marker { display: none; }
details[open] > summary.morebtn .arr { transform: rotate(180deg); }

/* 通知メッセージ（トースト）。
   プロトタイプではスマホの枠（.screen）の中に置かれていたため position:absolute だったが、
   本番では枠がないため画面の外（ページ末尾）に飛んでしまう。画面に固定する。 */
.toast { position: fixed; }

/* ここから: プロトタイプが <button> や <img> を前提にしている指定を、
   本番で使っている要素にも当てるための追記。
   本番では画面遷移が必要な箇所をリンク（<a>）にしており、
   QRコードは外部ライブラリの <img> ではなくサーバ側で作る <svg> にしているため。
   app.css（プロトタイプからの移植）は書き換えず、差分だけをここに置く。 */

/* 管理画面のタブ（.subnav） — 選択中に下線が出る */
.subnav a {
  flex: 1; border: 0; background: transparent; font-family: inherit; font-size: .82rem;
  color: var(--muted); padding: 8px 0 11px; cursor: pointer; position: relative;
  transition: .15s; text-align: center; text-decoration: none;
}
.subnav a.on { color: var(--ink); font-weight: 700; }
.subnav a.on::after {
  content: ""; position: absolute; left: 22%; right: 22%; bottom: -1px; height: 2.5px;
  background: var(--ink); border-radius: 2px;
}

/* 期間・表示・並び順の切り替え（.seg） — 選択中が白い丸ボタンになる */
.seg a {
  border: 0; background: transparent; font-family: inherit; font-size: .72rem;
  padding: 8px 12px; border-radius: 999px; color: var(--ink2); cursor: pointer;
  transition: .15s; white-space: nowrap; text-decoration: none;
}
.seg a.on { background: #fff; font-weight: 700; color: var(--ink); box-shadow: 0 1px 3px rgba(30,25,15,.1); }

/* お客様ご案内の並びボタン */
.invbtns a { white-space: nowrap; display: inline-block; }

/* QRコードはサーバ側で作る <svg>。プロトタイプの <img> 向け指定と同じ大きさに揃える */
.qrbox svg { width: 80px !important; height: 80px !important; display: block; }
.qrbig svg { width: 196px !important; height: 196px !important; display: block; }
.stamp svg[width="48"] { display: block; }

/* ログイン画面のパスワード欄（プロトタイプにはない項目） */
.fld input[type=password] {
  width: 100%; border: 1px solid var(--line); border-radius: 10px; padding: 9px 11px;
  font-family: inherit; font-size: 1rem; background: #FBFAF7; color: var(--ink);
}

/* 並べ替えできる列見出しの点線は、中のリンクでも消さない */
.ptable th.sortable a { text-decoration: inherit; }

/* 一覧を固定枠に収めてスクロールさせる（スタッフ画面の .ordersbox と同じ考え方）。
   件数が増えても画面が延々と伸びず、下にある操作にたどり着ける。 */
.listbox { max-height: 402px; margin: 0 0 8px; }

/* 一覧の中に置く小さめのQR */
.qrbox.sm { width: 56px; height: 56px; padding: 3px; }
.qrbox.sm svg { width: 50px !important; height: 50px !important; }

/* 上部固定の中に置く入口リンク（MBJコンソールのサロン管理）。
   統計の絞り込みより上に置き、スクロールしても消えないようにする。 */
.fixtop .adm-item.topentry {
  margin: 0 12px 8px;
  text-decoration: none;
  color: inherit;
  padding: 8px 10px;
}

/* 一覧の検索窓（プロトタイプに無い運営画面用）。入力欄の見た目は .fld input に合わせる。 */
.srchbar {
  display: flex; align-items: center; gap: 7px;
  margin: 0 12px 8px; padding: 8px 12px;
  background: #FBFAF7; border: 1px solid var(--line); border-radius: 999px;
}
.srchbar .ic { color: var(--muted); display: flex; flex: 0 0 auto; }
.srchbar input[type=text] {
  flex: 1; border: 0; background: transparent; outline: none;
  font-family: inherit; font-size: .85rem; color: var(--ink); min-width: 0;
}
.srchbar .clr {
  flex: 0 0 auto; text-decoration: none; color: var(--muted);
  font-size: .8rem;
  /* 指で押せる大きさにする（文字1つぶんだと隣の入力欄に当たる） */
  min-width: 34px; height: 34px; margin: -6px -8px -6px 0;
  display: flex; align-items: center; justify-content: center;
}

/* 要対応（オーナーやログインIDが未設定）を示すチップ */
.chip.alert { background: #F6E9E6; color: var(--danger); }

/* 絞り込みの結果が0件のときの案内 */
.emptybox {
  background: var(--card); border-radius: var(--r-lg);
  margin: 0 12px 6px; padding: 22px 14px;
  text-align: center; font-size: .8rem; color: var(--muted);
}
.emptybox a { display: block; margin-top: 6px; color: var(--accent); font-weight: 700; }

/* 【1-1】ブラウザ内蔵の [hidden]{display:none} は、作者のCSS（.qty{display:flex} など）に
   必ず負ける。そのため hidden 属性で出し入れしている箇所が「常に表示」になっていた。
   未選択の品目に数量ボタンが出て、押すと数字だけ増えて合計が動かない状態だったため、
   内蔵の指定を !important で取り戻す。 */
[hidden] { display: none !important; }

/* 【1-2】通知メッセージは1行固定（app.css の white-space:nowrap）だと、
   30文字を超える案内が画面の外にはみ出して読めなくなる。折り返す。 */
.toast {
  white-space: normal;
  max-width: min(calc(100% - 32px), 340px);
  text-align: center;
  line-height: 1.55;
}

/* 【5-5】固定枠の中でスクロールが止まって「画面が固まった」と感じないよう、
   外側にもスクロールを伝える（.scrollbox 単体で使うときの contain は残す）。 */
.fixscroll .scrollbox { overscroll-behavior: auto; }

/* 【5-5】絞り込みと並び替えが増えて横にはみ出すため、折り返す。 */
.pfrow { flex-wrap: wrap; row-gap: 6px; }

/* 【2-2】取り消されたオーダーの控え。確定の丸チェックと取り違えないよう色で分ける。 */
.okmark.voidmark { color: var(--danger); background: #F6E9E6; }

/* 「？」で開閉する案内を、1つの画面に複数置けるようにする。
   app.css の指定（.helptoggle:checked~.adminnote）は「以降すべて」を開いてしまうため、
   隣り合うものだけを開くように上書きする。 */
.helptoggle:checked ~ .adminnote { display: none; }
.helptoggle:checked + * + .adminnote { display: block; }
.helptoggle:checked + * .helpbtn {
  background: var(--ink); border-color: var(--ink); border-style: solid; color: #fff;
}

/* 見出しの横に置く小さい「？」 */
.helpbtn.sm { width: 22px; height: 22px; font-size: .68rem; border-width: 1px; }
.cat-label .helpbtn.sm { letter-spacing: 0; }

/* 「？」だけを置く行（追加ボタンのない画面用） */
.helprow { display: flex; align-items: center; gap: 8px; margin: 6px 12px 8px; }
.helprow .t { font-size: .72rem; color: var(--muted); font-weight: 700; letter-spacing: .1em; }

/* 控えの注記（税務書類ではない旨・要件§4-7）。
   合計金額のすぐ下に置く。脚注のままでは、控えを保存する前に目に入らなかった。 */
.taxnote {
  margin: 6px 12px 2px;
  font-size: .7rem;
  line-height: 1.6;
  color: var(--muted);
  text-align: center;
}

/* ───────── 読みやすさ（コントラスト）─────────
   プロトタイプの配色のうち、小さい文字で使うと薄すぎるものだけを本番用に少し濃くする。
   目安はWCAG AAの4.5:1（本文）。app.css（プロトタイプの写し）は書き換えない。

   実測（背景 #F3F1EC / カード #FFF）:
     --faint  #8B867C … 3.21 / 3.62 → 不足。0.7remの注記に使っている
     --accent #8A6D3B … 4.30 / 4.85 → 地色の上でわずかに不足
     --marbb  #2E7CC3 … 3.89 / 4.39 → marbbのワードマーク・チップの文字で不足 */
:root {
  --faint: #726D5E;    /* 4.58 / 5.17 */
  --accent: #816535;   /* 4.84 / 5.46 */
}

/* marbbの青は商品ブランドの色なので、面（チップ・タグの背景）はそのまま使い、
   文字として置くときだけ濃い方を使う。 */
:root { --marbb-text: #2668A5; }   /* 白文字 5.82 / 地色の上 5.16 */

.mword { color: var(--marbb-text); }
.chip.marbb { background: var(--marbb-text); box-shadow: 0 1px 5px rgba(38,104,165,.3); }
.mtag { background: var(--marbb-text); box-shadow: 0 1px 4px rgba(38,104,165,.3); }

/* ───────── キーボード操作・読み上げソフト ─────────
   プロトタイプは指で触る前提だったので、キーボードで使うときの手当てを本番で足す。 */

/* 押せるものは、キーボードで選んだときにはっきり分かるようにする
   （app.css の :focus-visible は控えめなので、面のあるものは影も付ける） */
.cta:focus-visible, .linebtn:focus-visible, .iconbtn:focus-visible,
.invre:focus-visible, .invshow:focus-visible, .spcta:focus-visible,
.seg a:focus-visible, .subnav a:focus-visible, .helpbtn:focus-visible {
  outline: 2.5px solid var(--ink);
  outline-offset: 2px;
  box-shadow: 0 0 0 4px rgba(33, 31, 27, .12);
}

/* 読み上げソフト用の見出し。画面には出さないが、要素の意味を伝える */
.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
}

/* キーボードで「本文へ移動」できるようにする（先頭のロゴやバーを毎回たどらずに済む） */
.skiplink {
  position: absolute; left: 8px; top: -48px; z-index: 200;
  background: var(--ink); color: #fff; padding: 8px 14px; border-radius: 999px;
  font-size: .78rem; text-decoration: none; transition: top .15s;
}
.skiplink:focus { top: 8px; }

/* 指で押す部分は44px角を目安にする（Appleのヒューマンインターフェースガイドライン） */
.iconbtn { min-width: 36px; min-height: 36px; }

/* 上部バーにサロンのロゴと店名を並べる（お客様画面）。
   ロゴ・サロンロゴ・店名で3行使っていたのを1行にまとめる。 */
.appbar-store {
  display: flex;
  align-items: center;
  gap: 7px;
  margin-left: 10px;
  padding-left: 10px;
  border-left: 1px solid var(--line);
  min-width: 0;
}
.appbar-storename {
  font-family: "Zen Old Mincho", "Hiragino Mincho ProN", "Yu Mincho", YuMincho, serif;
  font-size: .95rem;
  font-weight: 700;
  letter-spacing: .04em;
  color: var(--ink);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* ── メニューのプレビュー（2026年8月20日追加）─────────────
 * サロン管理画面のメニューで「＋ メニューを追加」と半分ずつ並べる。
 * 追加は点線（作る操作）、プレビューは実線（見る操作）で区別する。
 */
.addrow .addbtn,.addrow .prevbtn{flex:1 1 0}
.prevbtn{
  flex:1 1 0;width:auto;margin:0;min-width:0;border:1.5px solid var(--ink);background:transparent;
  border-radius:var(--r-md);padding:11px;font-family:inherit;font-size:.8rem;font-weight:700;color:var(--ink);
  cursor:pointer;display:block;text-align:center;text-decoration:none;box-sizing:border-box;
}
.prevbtn:active{transform:scale(.985);filter:brightness(.92)}

/* プレビュー中であることを、お客様の画面の上に置いて知らせる */
.previewbar{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 12px 8px;padding:8px 11px;
  background:var(--accent-soft);border:1px solid #E5D9C0;border-radius:var(--r-md);
}
.previewbar .pvtag{
  flex:0 0 auto;background:var(--ink);color:#fff;font-size:.66rem;font-weight:700;
  letter-spacing:.08em;padding:3px 9px;border-radius:999px;
}
.previewbar .pvtext{flex:1;min-width:0;font-size:.7rem;line-height:1.6;color:var(--ink2)}
.previewbar .pvback{
  flex:0 0 auto;font-size:.7rem;font-weight:700;color:var(--accent);
  text-decoration:none;border-bottom:1px solid currentColor;
}

/* ══ 実績画面（2026年8月20日 作り直し）══════════════════════
 * 見る範囲（期間・対象）を上に固定し、数字は「主役ひとつ＋その内訳」に整理する。
 * 並び替えは、並ぶものの見出しに置く（操作と対象を離さない）。
 * 色は意味に対応させる。真鍮＝通常の実績、青＝marbb、1位だけ濃く。
 */

/* 期間と表示の切り替え。表示はページの見せ方なので、右端に小さく置く */
.pfrow .segview{margin-left:auto}

/* 見出しに置く並び替え */
.seg.segmini{flex:0 0 auto;padding:3px}
.seg.segmini a{font-size:.7rem;padding:8px 12px;border-radius:999px}

/* ── 主要な数字 ───────────────────────────── */
.kpi{background:var(--card);border-radius:var(--r-lg);margin:0 12px 8px;padding:13px 14px 14px}
.kpi-head{display:flex;align-items:center;gap:4px;flex-wrap:wrap;font-size:.72rem;color:var(--muted)}
.kpi-head .kh-scope{display:inline-flex;align-items:center;gap:4px;font-weight:700;color:var(--ink);font-size:.78rem}
.kpi-head .kh-period::before,.kpi-head .kh-note::before{content:"・";margin-right:2px;color:var(--faint)}
.kpi-head .kh-rank{
  margin-left:auto;margin-inline-start:auto;background:var(--accent-soft);color:var(--accent);border:1px solid #E5D9C0;
  border-radius:999px;padding:2px 9px;font-size:.7rem;font-weight:700;white-space:nowrap;
}
.kpi-head .kh-rank b{font-size:.86rem;font-variant-numeric:tabular-nums}

.kpi-main{display:flex;align-items:flex-end;justify-content:space-between;gap:14px;margin-top:10px}
.kpi-main .km{display:flex;flex-direction:column;gap:2px;min-width:0}
.kpi-main .kk{font-size:.7rem;color:var(--muted);letter-spacing:.02em}
.kpi-main .kv{font-weight:700;line-height:1.15;font-variant-numeric:tabular-nums;letter-spacing:.01em}
.kpi-main .km-1 .kv{font-size:1.72rem}
.kpi-main .km-2{text-align:right}
/* ひとつ前の期間との比べ（2026年8月20日）。増減は色だけでなく符号でも示す */
.kpi-main .kcmp{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 8px;margin-top:4px;font-size:.7rem;color:var(--muted);line-height:1.5}
.kpi-main .kcmp .cmpval{font-weight:700;color:var(--muted);font-variant-numeric:tabular-nums}
.kpi-main .kcmp.up .cmpval{color:var(--green)}
.kpi-main .kcmp.down .cmpval{color:var(--danger)}
.kpi-main .km-2 .kv{font-size:1.02rem}

.kpi-sub{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));column-gap:8px;row-gap:2px;margin-top:12px;border-top:1px solid var(--line);padding-top:11px}
/* 読み上げは「名前→値→分母」の順のまま、見た目だけ値を上に置く（4枠とも同じ組み方） */
.kpi-sub .ks{
  display:grid;grid-template-areas:"v" "k" "d";justify-items:center;align-content:start;
  row-gap:2px;text-align:center;padding:0 2px;
}
.kpi-sub .ks .v{grid-area:v;font-size:1rem;font-weight:700;font-variant-numeric:tabular-nums;line-height:1.2}
.kpi-sub .ks .k{grid-area:k;font-size:.66rem;color:var(--muted);line-height:1.35;word-break:auto-phrase;overflow-wrap:anywhere}
.kpi-sub .ks .den{grid-area:d;font-size:.66rem;color:var(--muted);font-variant-numeric:tabular-nums}
.kpi-sub .ks .v small{font-size:.66rem;font-weight:400;color:var(--muted);margin-left:2px;letter-spacing:0}

/* ── ランキング ───────────────────────────── */
.rankcard{background:var(--card);border-radius:var(--r-lg);margin:0 12px 8px;padding:12px 14px 10px}
.rank-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:10px}
.rank-head .rh-title{font-size:.82rem;font-weight:700;letter-spacing:.02em}
.rank-head .rh-meta{font-size:.68rem;color:var(--muted);min-width:0;flex:1}
.rankcard .rankfoot{margin:8px 0 0;font-size:.66rem;color:var(--faint);line-height:1.6}

.rrow{
  display:grid;grid-template-columns:20px minmax(0,1fr) 92px;grid-template-areas:"rk name val" ". bar share";
  column-gap:8px;row-gap:5px;align-items:center;padding:8px 0;border-bottom:1px solid var(--line);
  text-decoration:none;color:inherit;
}
.rrow:last-of-type{border-bottom:0}
.rrow .rk{
  grid-area:rk;width:20px;height:20px;border-radius:50%;background:var(--accent-soft);color:var(--muted);
  display:flex;align-items:center;justify-content:center;font-size:.66rem;font-weight:700;font-variant-numeric:tabular-nums;
}
.rrow .rk.top{background:var(--accent);color:#fff}
.rrow .rname{
  grid-area:name;font-size:.78rem;font-weight:700;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.rrow .rcat{font-size:.66rem;font-weight:400;color:var(--muted);margin-left:6px}
.rrow .rval{grid-area:val;font-size:.74rem;font-weight:400;color:var(--muted);white-space:nowrap;text-align:right;font-variant-numeric:tabular-nums}
.rrow .rval b{font-weight:700;color:var(--ink)}
.rrow .rbar{grid-area:bar;display:block;height:9px;background:var(--bg);border-radius:4px;overflow:hidden}
.rrow .rfill{display:block;height:100%;background:var(--accent);border-radius:0 4px 4px 0;min-width:6px;transition:width .3s}
.rrow .rfill.marbb{background:var(--marbb)}
.rrow .rshare{grid-area:share;font-size:.66rem;color:var(--muted);text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
.rrow.off .rfill{background:#8B8574}
a.rrow .rname::after{content:"›";color:var(--faint);font-weight:400;margin-left:6px}
a.rrow:active{filter:brightness(.97)}
/* 選んでいる相手の行は、地色を敷いて所在をはっきりさせる */
.rrow.on{background:var(--accent-soft);border-radius:10px;margin-inline:-8px;padding-inline:8px;border-bottom-color:transparent;box-shadow:inset 3px 0 0 var(--accent)}

/* ── 書き出し ─────────────────────────────── */
.exportcard{background:var(--card);border-radius:var(--r-lg);margin:0 12px 8px;padding:2px 14px}
.exprow{display:flex;align-items:center;gap:11px;padding:11px 0;border-bottom:1px solid var(--line);text-decoration:none;color:inherit}
.exprow:last-child{border-bottom:0}
.exprow .exi{
  flex:0 0 auto;width:34px;height:34px;border-radius:10px;background:var(--accent-soft);color:var(--accent);
  display:flex;align-items:center;justify-content:center;
}
.exprow .exmid{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}
.exprow .exname{font-size:.78rem;font-weight:700;line-height:1.45}
.exprow .exmeta{font-size:.68rem;color:var(--muted);line-height:1.45}
.exprow:active{filter:brightness(.97)}

/* ── 確定ファネル ───────────────────────────
 * 段ごとに数えている単位が違う（読み取りは回数、確定は件数）ので、
 * 棒グラフにすると「漏斗」に見えて誤読を招く。数字の並びで見せる。
 */
.funnel{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:4px;margin-top:4px}
.funnel .fstep{display:grid;grid-template-areas:"v" "k";justify-items:center;row-gap:2px;background:#FAF8F3;border-radius:10px;padding:8px 2px}
.funnel .fv{grid-area:v;font-size:.95rem;font-weight:700;font-variant-numeric:tabular-nums;line-height:1.2}
.funnel .fk{grid-area:k;font-size:.66rem;color:var(--muted);text-align:center;line-height:1.35}

@media (max-width:360px){
  /* 320pxでは受付コードが1文字まで潰れるので、2行に折り返す */
  .histrow{flex-wrap:wrap;row-gap:2px;align-items:baseline}
  .histrow .hd{order:1}
  .histrow .hw{order:2;flex:0 0 auto;overflow:visible}
  .histrow .hp{order:3;margin-left:auto}
  .histrow .hs{order:4;flex:1 1 100%;white-space:normal}
  .kpi-sub{grid-template-columns:repeat(2,1fr);row-gap:10px}
  .kpi-main .km-1 .kv{font-size:1.5rem}
}

/* 表の見出しセル（2026年8月20日）。合計行は見出しセルにしたので、見た目を本文にそろえる */
.ptable tr.tot th[scope="row"]{
  font-size:.8rem;color:var(--ink);font-weight:700;text-align:left;letter-spacing:normal;
  border-top:1.5px solid var(--ink);border-bottom:0;padding:7px 3px;
}
/* 並び替えの押せる面を、見出しセルの高さいっぱいに広げる */
.ptable th.sortable a{display:block;padding:7px 3px;margin:-7px -3px}
/* スクロールする一覧は、キーボードでも動かせるようにしている（tabindex="0"）。その印を出す */
.scrollbox:focus-visible{outline:2.5px solid var(--ink);outline-offset:2px;border-radius:12px}

/* ── カテゴリの管理（2026年8月20日追加）───────────────
 * 標準はチップで一覧するだけ、サロンの追加分は1件ずつカードで操作する。
 */
.catchips{display:flex;flex-wrap:wrap;gap:6px}
.catchip{
  display:inline-flex;align-items:center;gap:5px;background:#FAF8F3;border:1px solid var(--line);
  border-radius:999px;padding:5px 12px;font-size:.74rem;color:var(--ink2);
}
.catchip b{font-size:.7rem;color:var(--muted);font-variant-numeric:tabular-nums}
.catrow{display:flex;gap:8px;align-items:center}
.catrow input{flex:1;min-width:0}
.catacts{display:flex;align-items:center;gap:6px;margin-top:8px}
.catacts .catmeta{flex:1;font-size:.72rem;color:var(--muted)}
.iconbtn.danger{color:var(--danger);border-color:#E8D5D1}
/* 切り替えが「入っている」ことを示す（スタメニ管理画面のサロン一覧） */
.iconbtn.on{background:var(--ink);border-color:var(--ink);color:#fff}

/* 必ず1つ選ぶ枠（2026年8月20日追加）。見出しの横に理由を添え、進めないときは足元に出す */
.cat-label .reqmark{
  margin-left:8px;font-size:.66rem;font-weight:700;color:var(--accent);
  background:var(--accent-soft);border:1px solid #E5D9C0;border-radius:999px;padding:2px 9px;
}
.reqnote{margin:0 12px 6px;font-size:.72rem;color:var(--danger);line-height:1.6}

/* 標準・独自の区分（スタメニ管理画面のカテゴリ別の構成・2026年8月20日追加） */
.kindchip{
  display:inline-block;background:#F4F1EA;border:1px solid var(--line);border-radius:999px;
  padding:2px 9px;font-size:.66rem;font-weight:700;color:var(--muted);white-space:nowrap;
}
.kindchip.own{background:var(--accent-soft);border-color:#E5D9C0;color:var(--accent)}
