/* ============================================================================
 * board.css  ―  Literary Editorial（文芸誌エディトリアル）版
 * ----------------------------------------------------------------------------
 * 原典 : design-main/literary-editorial-template/{theme.json, design-system.yaml}
 *
 * 原典からそのまま採った値
 *   ink       #0A0E27  濃紺インク。本文・枠線・影に使う
 *   electric  #00F0FF  電気的な水色。番号の下地・下線・フォーカス
 *   coral     #FF6B6B  警告（alerts）
 *   violet    #7C3AED  特別な強調（special_emphasis）
 *   書体      Zen Kaku Gothic New（本文）／ Space Grotesk（数字）
 *   カード    2px solid ink ＋ 4px ずれた硬い影（::before）
 *   番号      40x40 の四角、下地は electric
 *   ラベル    rotate(-1deg) の傾き（付箋の見え方）
 *
 * 原典から意図的に変えた点
 *   paper #FEFEF8 → #FFFFFF    … 「背景は白でぱきっと」の指示
 *   ホバー白黒反転              … 一覧に何十枚も並ぶカードで反転は読みづらい。
 *                                 移動（-3px,-3px）と影の伸びだけ採用した
 *   紙のテクスチャ overlay      … 白でぱきっとさせたいので入れていない
 *
 * ★electric #00F0FF を文字色に使わないこと
 *   原典 theme.json は electric_on_paper を 4.8:1 と書いているが、実測は 1.39:1。
 *   白地に置くと文字はほぼ読めない。下地（ink 文字を載せる）と下線・枠線に限る。
 *   ink on electric は 13.49:1 なので、下地に使えば十分読める。
 *
 * 色の役割（役割ごとに1つだけ持たせる）
 *   ink      本文・枠線・影・進行中
 *   gray     未着手・補助文字
 *   violet   締め切りが近い
 *   coral    締め切り超過／残り5時間を切った
 *   electric 押せるもの・コメント（対話）の下地
 * ========================================================================== */

:root {
  /* --- 原典の素の値 --- */
  --ink:       #0A0E27;
  --electric:  #00F0FF;
  --coral:     #FF6B6B;
  --violet:    #7C3AED;

  /* --- ステータス色（枠線・バッジに使う濃い方） --- */
  --c-todo:  #6B7488;
  --c-doing: #0A0E27;
  --c-done:  #9AA1B1;
  --c-over:  #FF6B6B;

  /* --- ステータス色（背景に使う薄い方） --- */
  --c-todo-bg:  #F2F3F7;
  --c-doing-bg: #EAECF3;
  --c-done-bg:  #F5F6F9;
  --c-over-bg:  #FFECEC;

  /* --- 締め切りが近いとき専用。violet。他の部品では使わない --- */
  --c-accent:    #ede13a;
  --c-accent-dk: #b4b621;
  --c-accent-bg: #fefded;

  /* --- 締め切り超過／残り5時間を切ったとき専用。coral --- */
  /*     coral #FF6B6B は白地で 2.78:1 しかないので、文字には -dk を使う */
  --c-red:    #FF6B6B;
  --c-red-dk: #B3261E;
  --c-red-bg: #FFECEC;

  /* --- コメント（対話）。electric は下地専用、文字は -dk --- */
  --c-cmt:    #064045;
  --c-cmt-dk: #0A6070;
  --c-cmt-bg: #E4FDFF;

  /* --- 下地 --- */
  --border:  #DCDFE8;
  --bg:      #FFFFFF;
  --card:    #FFFFFF;
  --text:    #0A0E27;
  --sub:     #4A5568;

  /* --- 影。原典どおり「ずらした硬い影」。ぼかしを使わない --- */
  --shadow-sm: 2px 2px 0 var(--ink);
  --shadow-md: 4px 4px 0 var(--ink);
  --shadow-lg: 6px 6px 0 var(--ink);

  /* --- 角丸。エディトリアルなので原則 0 --- */
  --radius:    0px;
  --radius-sm: 0px;

  /* --- 書体 --- */
  --font-body: "Zen Kaku Gothic New", -apple-system, BlinkMacSystemFont,
               "Segoe UI", "Hiragino Sans", "Noto Sans JP", sans-serif;
  --font-num:  "Space Grotesk", "SFMono-Regular", Consolas, monospace;
}


* { box-sizing: border-box; }

body {
  margin: 0;
  padding: 28px 20px 60px;
  /* 丸ゴシックがある環境では丸ゴシックを使う。ポップさは字形で大きく変わる */
  font-family: var(--font-body);
  color: var(--text);
  /* 上が水色、下が薄黄色のグラデーション。1色塗りより一気に「ポップ」になる */
  background: var(--bg);
  background-attachment: fixed;
  line-height: 1.7;
  -webkit-font-smoothing: antialiased;
}

/* コンテンツを中央に寄せて、横に広がりすぎないようにする */
body > * { max-width: 940px; margin-left: auto; margin-right: auto; }

h1 { font-size: 25px; font-weight: 700; margin: 0 0 2px; letter-spacing: .02em; }
h2 {
  font-size: 18px;
  font-weight: 700;
  margin: 38px 0 14px;
  display: flex;
  align-items: center;
  gap: 9px;
}
/* 見出しの左に黄色の丸を置く。文字だけより視線が止まる */
h2::before {
  content: "";
  width: 11px; height: 11px;
  border-radius: 0;
  background: var(--c-doing);
  box-shadow: 0 0 0 4px var(--c-doing-bg);
  flex: none;
}

/* --- ページ見出し ------------------------------------------------------- */
.page-head {
  display: flex;
  align-items: baseline;
  gap: 18px;
  flex-wrap: wrap;
  background: var(--card);
  border: 2px solid #fff;
  border-radius: var(--radius);
  box-shadow: var(--shadow-sm);
  padding: 20px 26px;
  margin-bottom: 24px;
}
.page-head a {
  color: var(--c-doing);
  text-decoration: none;
  font-size: 14px;
  font-weight: 700;
  padding: 5px 14px;
  border-radius: 0;
  background: var(--c-doing-bg);
  transition: background .18s, transform .18s;
}
.page-head a:hover {
  text-decoration: none;
  background: var(--c-doing-bg);
  color: var(--c-doing);
  transform: translateY(-1px);
}

/* --- 通知バー ----------------------------------------------------------- */
/* 上から滑り込ませる。出たことに気づかせるのが目的 */
.notice {
  padding: 13px 20px;
  border-radius: 0;
  margin-bottom: 18px;
  font-size: 14px;
  font-weight: 700;
  box-shadow: var(--shadow-sm);
  animation: slide-down .28s cubic-bezier(.2, .9, .3, 1.2) both;
}
.notice-ok    { background: var(--c-done-bg); color: #1d8f6c; }
.notice-error { background: var(--c-over-bg); color: #d0453a; }

@keyframes slide-down {
  from { opacity: 0; transform: translateY(-12px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* --- タスクカード ------------------------------------------------------- */
#task-list { display: flex; flex-direction: column; gap: 14px; }

.task-card {
  position: relative;
  background: var(--card);
  border: 2px solid #fff;
  border-left: 7px solid var(--c-todo);
  border-radius: var(--radius);
  padding: 18px 22px;
  box-shadow: var(--shadow-sm);
  transition: box-shadow .2s, transform .2s, border-color .2s;
  /* 読み込み時に下からふわっと出す */
  animation: pop-in .34s cubic-bezier(.2, .9, .3, 1.15) both;
}

/* 上から順に少しずつ遅らせると「並んでいく」感じが出る */
.task-card:nth-child(1) { animation-delay: .00s; }
.task-card:nth-child(2) { animation-delay: .04s; }
.task-card:nth-child(3) { animation-delay: .08s; }
.task-card:nth-child(4) { animation-delay: .12s; }
.task-card:nth-child(5) { animation-delay: .16s; }
.task-card:nth-child(6) { animation-delay: .20s; }
.task-card:nth-child(n+7) { animation-delay: .24s; }

@keyframes pop-in {
  from { opacity: 0; transform: translateY(14px) scale(.98); }
  to   { opacity: 1; transform: translateY(0)    scale(1); }
}

.task-card:hover {
  box-shadow: var(--shadow-md);
  transform: translateY(-3px);
}

/* つかめるカードには、ホバー時だけ左端に「⋮⋮」を出す。
   常時出すとにぎやかになるので、触ろうとした時だけ見せる */
.task-card[draggable="true"] { cursor: grab; }
.task-card[draggable="true"]::before {
  content: "⋮⋮";
  position: absolute;
  left: 6px; top: 50%;
  transform: translateY(-50%);
  font-size: 13px;
  letter-spacing: -2px;
  color: var(--c-doing);
  opacity: 0;
  transition: opacity .18s;
  pointer-events: none;
}
.task-card[draggable="true"]:hover::before { opacity: .55; }
.task-card[draggable="true"]:active { cursor: grabbing; }

/* 他者のボードでは動かせないことをカーソルで示す */
.board-readonly .task-card { cursor: default; }
.board-readonly .task-card:hover { transform: none; }

/* ドラッグ中。少し傾けて浮かせると「持ち上げている」感じになる */
.task-card.dragging {
  opacity: .55;
  border-style: dashed;
  border-color: var(--c-doing);
  transform: scale(1.02) rotate(-1.2deg);
  box-shadow: var(--shadow-lg);
}

/* ステータスごとに左枠線と、ほんのり地色を変える */
.task-card.status-todo  { border-left-color: var(--c-todo);  }
.task-card.status-doing {
  border-left-color: var(--c-doing);
  background: var(--card);
}
.task-card.status-done {
  border-left-color: var(--c-done);
  background: var(--card);
}
.task-card.status-needs_reschedule {
  border-left-color: var(--c-over);
  background: var(--card);
  /* 期限超過は一度だけ小さく揺らして気づかせる */
  animation: pop-in .34s cubic-bezier(.2,.9,.3,1.15) both, nudge .5s .34s 1;
}
@keyframes nudge {
  0%, 100% { margin-left: 0; }
  25%      { margin-left: 5px; }
  75%      { margin-left: -5px; }
}

.task-card.status-done .card-title { text-decoration: line-through; color: var(--sub); }

.card-head { display: flex; align-items: center; gap: 12px; }
.card-title { font-size: 16px; font-weight: 700; margin: 0; flex: 1; word-break: break-word; }

/* --- バッジ ------------------------------------------------------------- */
/* 白抜き文字より、パステル地＋濃い文字の方が「やわらかいポップ」になる */
.badge {
  font-size: 12px;
  font-weight: 700;
  padding: 4px 14px;
  border-radius: 0;
  white-space: nowrap;
  flex: none;
}
.badge-todo             { background: var(--c-todo-bg);  color: #62748a; }
.badge-doing            { background: var(--c-doing-bg); color: #1a89b3; }
.badge-done             { background: var(--c-done-bg);  color: #1d8f6c; }
.badge-needs_reschedule { background: var(--c-over-bg);  color: #d0453a; }

.task-meta { font-size: 13px; color: var(--sub); margin-top: 5px; }

.card-actions {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-top: 14px;
  flex-wrap: wrap;
}

/* --- プルダウン --------------------------------------------------------- */
.status-select {
  font-family: inherit;
  font-size: 13px;
  font-weight: 700;
  color: var(--text);
  padding: 7px 34px 7px 14px;
  border: 2px solid var(--border);
  border-radius: 0;
  background: #fff;
  cursor: pointer;
  transition: border-color .18s, box-shadow .18s;
  /* 既定の三角を消して自前の矢印を置く */
  -webkit-appearance: none;
  appearance: none;
  background-image:
    var(--c-doing),
    var(--c-doing);
  background-position: right 16px center, right 11px center;
  background-size: 5px 5px, 5px 5px;
  background-repeat: no-repeat;
}
.status-select:hover { border-color: var(--c-doing); }
.status-select:disabled {
  background-color: #f4f7fa;
  color: var(--sub);
  cursor: not-allowed;
  background-image: none;
  padding-right: 14px;
}

/* --- ボタン ------------------------------------------------------------- */
.btn {
  font-family: inherit;
  font-size: 13px;
  font-weight: 700;
  padding: 8px 18px;
  border: 2px solid var(--border);
  border-radius: 0;
  background: #fff;
  color: var(--text);
  cursor: pointer;
  transition: transform .14s, box-shadow .18s, background .18s, border-color .18s;
}
.btn:hover {
  background: var(--c-doing-bg);
  border-color: var(--c-doing);
  transform: translateY(-2px);
  box-shadow: var(--shadow-sm);
}
/* 押した瞬間に沈ませる。これがあるだけで「反応した」感が出る */
.btn:active { transform: translateY(1px) scale(.97); box-shadow: none; }

.btn-primary {
  background: var(--c-doing);
  border-color: transparent;
  color: #fff;
  box-shadow: 2px 2px 0 var(--ink);
}
.btn-primary:hover {
  background: #2aa8d4;
  border-color: transparent;
  color: #fff;
  box-shadow: 2px 2px 0 var(--ink);
}

.btn-link {
  border: none;
  background: none;
  color: var(--sub);
  padding: 4px 8px;
  box-shadow: none;
}
.btn-link:hover {
  background: var(--c-over-bg);
  color: #d0453a;
  border: none;
  text-decoration: none;
  transform: none;
  box-shadow: none;
}

/* キーボード操作でも「どこにいるか」が分かるようにする */
.btn:focus-visible,
.status-select:focus-visible,
.inline-form input[type="text"]:focus-visible,
.inline-form select:focus-visible {
  outline: none;
  border-color: var(--c-doing);
  box-shadow: 0 0 0 4px var(--electric);
}

/* --- 公開設定パネル ----------------------------------------------------- */
#share-panel {
  background: var(--card);
  border: 2px solid #fff;
  border-radius: var(--radius);
  box-shadow: var(--shadow-sm);
  padding: 24px 28px;
  margin-top: 10px;
}

.share-step {
  margin-bottom: 24px;
  padding-bottom: 24px;
  border-bottom: 2px dashed var(--border);
}
.share-step:last-child { margin-bottom: 0; padding-bottom: 0; border-bottom: none; }
.share-step h3 {
  font-size: 14px;
  font-weight: 700;
  margin: 0 0 12px;
  color: #1a89b3;
}

.inline-form { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; }
.inline-form input[type="text"],
.inline-form select {
  font-family: inherit;
  font-size: 14px;
  padding: 9px 14px;
  border: 2px solid var(--border);
  border-radius: 0;
  background: #fff;
  transition: border-color .18s, box-shadow .18s;
}
.inline-form input[type="text"]::placeholder { color: #b6c4d2; }

.group-row {
  display: flex;
  align-items: center;
  gap: 20px;
  padding: 13px 16px;
  margin-bottom: 10px;
  border: 2px solid var(--border);
  border-radius: var(--radius-sm);
  background: #fbfdff;
  flex-wrap: wrap;
  transition: border-color .18s, background .18s;
}
.group-row:hover { border-color: var(--c-doing); background: #fff; }
.group-row:last-child { margin-bottom: 0; }
.group-name { font-weight: 700; min-width: 150px; }

.check {
  display: flex;
  align-items: center;
  gap: 7px;
  font-size: 13px;
  font-weight: 700;
  color: var(--sub);
  cursor: pointer;
  padding: 4px 12px 4px 8px;
  border-radius: 0;
  transition: background .18s, color .18s;
}
.check:hover { background: var(--c-doing-bg); color: var(--c-doing); }
.check input[type="checkbox"] {
  width: 17px; height: 17px;
  accent-color: var(--c-doing);
  cursor: pointer;
}

/* --- ユーザー候補チップ ------------------------------------------------- */
#user-candidates { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 12px; }
.candidate {
  font-family: inherit;
  font-size: 13px;
  font-weight: 700;
  padding: 7px 16px;
  border: 2px solid var(--border);
  border-radius: 0;
  background: #fff;
  color: var(--text);
  cursor: pointer;
  transition: transform .14s, background .18s, border-color .18s, color .18s;
}
.candidate:hover {
  background: var(--c-doing-bg);
  border-color: var(--c-doing);
  transform: translateY(-2px);
}
.candidate:active { transform: translateY(1px) scale(.96); }
/* 選ばれたものは黄色。水色の中に黄色が1つあると一目で分かる */
.candidate.selected {
  background: var(--c-doing);
  border-color: var(--c-doing);
  color: #6b4e00;
  box-shadow: 2px 2px 0 var(--ink);
}
#selected-user { font-size: 13px; font-weight: 700; color: var(--c-doing); margin-left: 6px; }

/* --- ボード一覧 --------------------------------------------------------- */
.board-link {
  display: block;
  background: var(--card);
  border: 2px solid #fff;
  border-left: 7px solid var(--c-doing);
  border-radius: var(--radius);
  padding: 18px 22px;
  margin-bottom: 14px;
  text-decoration: none;
  color: var(--text);
  box-shadow: var(--shadow-sm);
  transition: transform .2s, box-shadow .2s, border-left-color .2s;
}
.board-link:hover {
  transform: translateX(5px);
  box-shadow: var(--shadow-md);
  border-left-color: var(--c-doing);
}
.board-link .owner { font-weight: 700; font-size: 16px; }
.board-link .perm {
  font-size: 12px;
  font-weight: 700;
  color: #1a89b3;
  margin-left: 10px;
  padding: 3px 12px;
  border-radius: 0;
  background: var(--c-doing-bg);
}

/* --- 空・注意書き ------------------------------------------------------- */
.empty {
  color: var(--sub);
  font-size: 14px;
  text-align: center;
  padding: 44px 20px;
  background: rgba(255, 255, 255, .7);
  border: 2px dashed var(--border);
  border-radius: var(--radius);
}

.readonly-note {
  background: var(--c-todo-bg);
  border: 2px solid var(--border);
  border-left-width: 7px;
  padding: 13px 20px;
  font-size: 13px;
  font-weight: 700;
  color: #8a6800;
  border-radius: var(--radius-sm);
  margin-bottom: 20px;
}

/* --- 狭い画面 ----------------------------------------------------------- */
@media (max-width: 600px) {
  body { padding: 18px 12px 44px; }
  .page-head, #share-panel { padding: 16px 18px; }
  .task-card { padding: 15px 17px; }
  .comment-form { flex-direction: column; }
  .comment-form .btn { width: 100%; }
}

/* --- 動きを減らす設定にしている人には動かさない ------------------------- */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
  }
}

/* ============================================================================
 * 追加分（2026-08-31）
 * ----------------------------------------------------------------------------
 * 検証でCSS未定義と分かった2クラス。JS が付けているが定義が無かった。
 *   .btn-comment   カード内の「コメント N件」を開閉するボタン
 *   .comment-list  コメントを縦に並べる入れ物
 * ========================================================================== */

/* コメント開閉ボタン。★黄色から濃い水色に変更（黄色は締め切り専用に予約したため） */
.btn-comment {
  background: var(--c-cmt-bg);
  border: 2px solid var(--c-cmt-bg);
  color: var(--c-cmt-dk);
  font-size: 13px;
  padding: 7px 14px;
  box-shadow: none;
}
.btn-comment:hover {
  background: var(--c-cmt);
  border-color: var(--c-cmt);
  color: #fff;
  box-shadow: var(--shadow-sm);
}
/* 開いている間は塗って、開いていることが分かるようにする */
.btn-comment[aria-expanded="true"] {
  background: var(--c-cmt);
  border-color: var(--c-cmt);
  color: #fff;
}

/* コメントを縦に並べる入れ物 */
.comment-list {
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin-bottom: 12px;
}
.comment-list:empty { margin-bottom: 0; }

/* ============================================================================
 * ここから下は 2026-09-01 のホワイトボード案に合わせて追加した部品
 * ----------------------------------------------------------------------------
 * 追加した画面部品
 *   app-header      画面上部の帯（ユーザー名・検索・設定・ログアウト）
 *   col-head        タスク一覧の列見出し（タスク名／ラベル／期限／状態／コメント）
 *   card-row        カード1枚を横1行に並べるためのグリッド
 *   card-sub        カード内の「小タスク 2/4」とその進捗バー
 *   fab / modal     丸い「＋」ボタンと新規作成フォーム
 *   remain-box      詳細画面の「残り」表示
 *   subtask-list    詳細画面の小タスクチェックリスト
 *   member-card     みんなのボードの人名カード
 *   settings-card   設定画面の各セクション
 *   mini-calendar   今週の予定（Googleカレンダー差し替え予定の枠）
 *
 * 色は上の :root をそのまま使う。新しい色は足していないので
 * 水色 × 黄色の配色がどの画面でもズレない。
 * ========================================================================== */

/* -------------------------------------------------------------- ヘッダー */
.app-header {
  position: sticky;
  top: 0;
  z-index: 40;
  margin: -28px -20px 24px;
  padding: 0 20px;
  background: rgba(255, 255, 255, .82);
  backdrop-filter: blur(10px);
  border-bottom: 2px solid var(--border);
}
.app-header-inner {
  max-width: 1240px;
  margin: 0 auto;
  height: 64px;
  display: flex;
  align-items: center;
  gap: 16px;
}
.app-brand { display: flex; align-items: center; gap: 10px; flex-shrink: 0; }
.app-brand-mark {
  width: 34px; height: 34px; border-radius: 0;
  display: grid; place-items: center;
  font-weight: 700; color: #fff; font-size: 18px;
  background: var(--c-doing);
  box-shadow: var(--shadow-sm);
}
.app-user { font-size: 15px; }
.app-user strong { color: var(--c-doing); }

.app-search { flex: 1; min-width: 0; }
.app-search input {
  width: 100%; max-width: 340px;
  padding: 9px 14px;
  border: 2px solid var(--border);
  border-radius: 0;
  background: #fff;
  font: inherit; color: var(--text);
  transition: border-color .15s, box-shadow .15s;
}
.app-search input:focus {
  outline: none;
  border-color: var(--c-doing);
  box-shadow: 0 0 0 4px var(--c-doing-bg);
}

.app-nav { display: flex; gap: 6px; flex-shrink: 0; }
.icon-btn {
  display: flex; flex-direction: column; align-items: center; gap: 2px;
  padding: 6px 12px; border: 0; border-radius: var(--radius-sm);
  background: transparent; color: var(--sub);
  font: inherit; font-size: 11px; text-decoration: none;
  cursor: pointer; transition: background .15s, color .15s, transform .15s;
}
.icon-btn:hover { background: var(--c-doing-bg); color: var(--c-doing); transform: translateY(-1px); }
.icon-glyph { font-size: 18px; line-height: 1; }
.icon-label { white-space: nowrap; }

/* ---------------------------------------------------------------- レイアウト */
.board-wrap {
  max-width: 1240px; margin: 0 auto;
  display: grid; grid-template-columns: minmax(0, 1fr) 300px; gap: 22px;
  align-items: start;
}
.detail-wrap, .settings-wrap { max-width: 1240px; margin: 0 auto; }
.detail-grid {
  display: grid; grid-template-columns: minmax(0, 1fr) 320px; gap: 22px;
  align-items: start;
}
@media (max-width: 900px) {
  .board-wrap, .detail-grid { grid-template-columns: 1fr; }
}

.section-head {
  display: flex; align-items: center; justify-content: space-between;
  flex-wrap: wrap; gap: 12px; margin-bottom: 6px;
}
.section-title { font-size: 22px; margin: 0; }
.crumb { font-size: 13px; color: var(--sub); margin: 0 0 12px; }
.crumb a { color: var(--c-doing); text-decoration: none; }
.crumb a:hover { text-decoration: underline; }

/* ============================================================================
 * コントロールの形のルール（2026-09-02 確定。FB反映）
 * ----------------------------------------------------------------------------
 * 形が同じなら同じ働き、というルールに揃えた。以前は下の3つが全部
 * 同じ丸い pill だったので、押せるのか・何が起きるのかが見分けられなかった。
 *
 *   下線タブ  .vtab      … 一覧の「構造」が変わる（やる順／プロジェクトごと）
 *   四角トグル .chip      … 該当しない行を「隠す」だけ（状態の絞り込み）
 *   丸い pill  .label-chip … ★押せないラベル専用。丸い形は押せない印にする
 *
 * 選択中の見せ方も分けている。
 *   タブ     … 塗らない。下線だけ水色（主役なので文字を大きく）
 *   絞り込み … うすい水色の背景（補助なので控えめ）
 *   実行ボタン … 水色のベタ塗り（.btn-primary）
 * 水色の濃さで「実行 ＞ 選択中 ＞ 未選択」が読めるようにしている。
 * ========================================================================== */

/* -------- 絞り込み（四角・角丸6px）。1タップで切り替わる軽さを残す -------- */
.filter-row { display: flex; gap: 6px; flex-wrap: wrap; }
.chip {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 6px 12px; border: 1px solid var(--border); border-radius: 0;
  background: #fff; color: var(--sub); font: inherit; font-size: 12px;
  cursor: pointer; transition: background .15s, border-color .15s, color .15s;
}
.chip:hover { border-color: var(--c-doing); color: var(--c-doing); }
/* 選択中はうすい水色の背景。塗りつぶさないのは実行ボタンと区別するため */
.chip-on {
  background: var(--c-doing-bg); border-color: var(--c-doing);
  color: #0f5d7a; font-weight: 600;
}

/* -------- 表示切替タブ（下線のみ）。一覧の構造を決める主役 -------- */
.vtab-row {
  display: flex; gap: 22px; align-items: flex-end;
  border-bottom: 2px solid var(--border); margin-bottom: 2px;
}
.vtab {
  padding: 7px 2px; margin-bottom: -2px;
  background: transparent; border: 0; border-bottom: 3px solid transparent;
  color: var(--sub); font: inherit; font-size: 14px;
  cursor: pointer; transition: color .15s, border-color .15s;
}
.vtab:hover { color: var(--text); }
/* 選択中は塗らずに下線だけ。文字も太くして主役だと分かるようにする */
.vtab-on {
  color: var(--c-doing); border-bottom-color: var(--c-doing); font-weight: 700;
}
.drag-hint { font-size: 12px; color: var(--sub); margin: 0 0 12px; }
.readonly-banner {
  background: var(--c-todo-bg); border: 2px dashed var(--sub);
  border-radius: var(--radius-sm); padding: 10px 14px;
  font-size: 13px; margin: 0 0 14px;
}

/* ------------------------------------------------------------ 列見出しとカード */
.col-head, .card-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 84px 96px 108px 64px 32px;
  gap: 10px; align-items: center;
}
.col-head {
  padding: 0 18px 8px; font-size: 11px; color: var(--sub); font-weight: 600;
}
.col-head span { white-space: nowrap; }
@media (max-width: 900px) { .col-head { display: none; } }

.task-list { display: flex; flex-direction: column; gap: 10px; }

.task-card {
  background: var(--card); border: 2px solid var(--border);
  border-left: 6px solid var(--c-todo);
  border-radius: var(--radius); padding: 14px 18px;
  box-shadow: var(--shadow-sm);
  transition: transform .15s, box-shadow .15s, border-color .15s;
  animation: cardIn .32s both;
}
.task-card:nth-child(1) { animation-delay: .00s; }
.task-card:nth-child(2) { animation-delay: .04s; }
.task-card:nth-child(3) { animation-delay: .08s; }
.task-card:nth-child(4) { animation-delay: .12s; }
.task-card:nth-child(5) { animation-delay: .16s; }
.task-card:nth-child(n+6) { animation-delay: .20s; }
@keyframes cardIn {
  from { opacity: 0; transform: translateY(10px); }
  to   { opacity: 1; transform: none; }
}
.task-card:hover { box-shadow: var(--shadow-md); transform: translateY(-2px); }
.task-card[draggable="true"] { cursor: grab; }
.task-card[draggable="true"]:active { cursor: grabbing; }

.task-card.status-todo  { border-left-color: var(--c-todo); }
.task-card.status-doing { border-left-color: var(--c-doing); background: #fff; }
.task-card.status-done  { border-left-color: var(--c-done); opacity: .78; }
.task-card.is-over {
  border-color: var(--c-over); border-left-color: var(--c-over);
  background: var(--c-over-bg);
  animation: cardIn .32s both, shake .5s .3s 1;
}
@keyframes shake {
  0%,100% { transform: translateX(0); }
  25% { transform: translateX(-3px); }
  75% { transform: translateX(3px); }
}

/* ドラッグ中：つまんでいるカードを傾けて浮かせる */
.task-card.dragging {
  opacity: .55; border-style: dashed;
  transform: rotate(1.2deg) scale(1.02);
  box-shadow: var(--shadow-lg);
}
/* 挿入位置の目印 */
.task-card.drop-before { box-shadow: 0 -4px 0 0 var(--c-doing), var(--shadow-md); }
.task-card.drop-after  { box-shadow: 0  4px 0 0 var(--c-doing), var(--shadow-md); }

.card-title {
  font-size: 15px; font-weight: 600; color: var(--text);
  text-decoration: none; display: block;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.card-title:hover { color: var(--c-doing); text-decoration: underline; }
.status-done .card-title { text-decoration: line-through; color: var(--sub); }

.card-sub { display: flex; align-items: center; gap: 8px; margin-top: 5px; }
.card-sub-count { font-size: 11px; color: var(--sub); white-space: nowrap; }
.card-sub-none { font-size: 11px; color: var(--sub); opacity: .7; }
.card-sub-bar {
  flex: 1; max-width: 130px; height: 6px;
  background: var(--c-todo-bg); border-radius: 0; overflow: hidden;
}
.card-sub-bar i {
  display: block; height: 100%; border-radius: 0;
  background: var(--c-done);
  transition: width .3s;
}

.card-sub-list {
  list-style: none; margin: 10px 0 0; padding: 10px 0 0;
  border-top: 1px dashed var(--border);
  display: flex; flex-wrap: wrap; gap: 6px 14px;
}
.card-sub-list li { font-size: 12px; color: var(--sub); }
.card-sub-list li.sub-done { color: var(--c-done); text-decoration: line-through; }

.meta-due { font-size: 12px; color: var(--sub); white-space: nowrap; }
.meta-due-over { color: #e05a4f; font-weight: 700; }

.card-status-col { min-width: 0; }
.status-select {
  width: 100%; padding: 5px 8px; font: inherit; font-size: 12px;
  border: 2px solid var(--border); border-radius: 0;
  background: #fff; color: var(--text); cursor: pointer;
}
.status-select:focus { outline: none; border-color: var(--c-doing); }
.status-select:disabled { background: var(--c-over-bg); cursor: not-allowed; color: #b5675f; }

.btn-del {
  width: 26px; height: 26px; border: 0; border-radius: 0;
  background: transparent; color: var(--sub);
  font-size: 17px; line-height: 1; cursor: pointer;
  transition: background .15s, color .15s, transform .15s;
}
.btn-del:hover { background: var(--c-over-bg); color: #e05a4f; transform: rotate(90deg); }

.empty-msg, .side-empty {
  font-size: 13px; color: var(--sub); text-align: center;
  padding: 22px 10px; margin: 0;
}

/* ------------------------------------------------------------------ 右側 */
.board-side, .detail-side { display: flex; flex-direction: column; gap: 16px; }
.side-card, .settings-card, .detail-card {
  background: var(--card); border: 2px solid var(--border);
  border-radius: var(--radius); padding: 18px;
  box-shadow: var(--shadow-sm);
}
.settings-card { margin-bottom: 18px; }
/* カード上辺の帯。左が水色、右が黄色。全画面共通の「アプリの顔」 */
.side-card, .settings-card, .detail-card {
  position: relative; overflow: hidden;
}
.side-card::before, .settings-card::before, .detail-card::before {
  content: ""; position: absolute; inset: 0 0 auto 0; height: 4px;
  background: var(--c-doing);
}
.side-title { font-size: 14px; margin: 0 0 12px; }
.side-note { font-size: 12px; color: var(--sub); margin: 10px 0 0; line-height: 1.6; }

.side-card-comment { border-color: var(--c-cmt); }
.recent-comments { display: flex; flex-direction: column; gap: 8px; }
.recent-comment {
  display: block; padding: 10px 12px; border-radius: var(--radius-sm);
  background: var(--c-cmt-bg); border: 1px solid var(--c-cmt-bg);
  text-decoration: none; color: var(--text);
  transition: transform .15s, box-shadow .15s;
}
.recent-comment:hover { transform: translateX(3px); box-shadow: var(--shadow-sm); }
.rc-task { display: block; font-size: 11px; color: #8a6a00; font-weight: 700; }
.rc-body { display: block; font-size: 13px; margin: 3px 0; line-height: 1.5; }
.rc-who { display: block; font-size: 10px; color: var(--sub); }

/* 進捗リング */
.progress-summary { display: flex; align-items: center; gap: 16px; }
.prog-ring {
  width: 76px; height: 76px; border-radius: 0; flex-shrink: 0;
  display: grid; place-items: center;
  background: conic-gradient(var(--c-done) calc(var(--pct) * 1%), var(--c-todo-bg) 0);
  position: relative;
}
.prog-ring::after {
  content: ""; position: absolute; inset: 9px;
  background: #fff; border-radius: 0;
}
.prog-ring span { position: relative; font-size: 15px; font-weight: 700; }
.prog-list { list-style: none; margin: 0; padding: 0; font-size: 12px; color: var(--sub); }
.prog-list li { margin: 3px 0; }
.prog-list b { color: var(--text); font-size: 14px; }
.prog-over b { color: #e05a4f; }

/* 今週の予定 */
.mini-calendar { display: flex; flex-direction: column; gap: 4px; }
.cal-day {
  display: grid; grid-template-columns: 52px 1fr; gap: 8px;
  padding: 6px 8px; border-radius: 0; font-size: 12px;
}
.cal-day:hover { background: var(--c-doing-bg); }
.cal-today { background: var(--c-doing-bg); font-weight: 600; }
.cal-date { color: var(--sub); white-space: nowrap; }
.cal-date i { font-style: normal; margin-left: 3px; opacity: .7; }
.cal-tasks { min-width: 0; }
.cal-tasks b {
  display: block; font-weight: 500; overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap;
}
.cal-tasks em { color: var(--sub); opacity: .5; font-style: normal; }

/* ------------------------------------------------------- ＋ボタンとモーダル */
.fab {
  /* 2026-09-03 修正: 背景を --c-doing（進行中のステータス色）から electric に変更。
     ステータス色を流用していたため黒く見えていた。
     electric は白地に対して 1.41:1 しかないので、面だけでは輪郭が消える。
     2px の ink の枠と硬い影で形を作ること（border を外すと白背景に溶ける）。
     ＋ の文字は ink（electric 上で 13.49:1）。#fff だと 1.41:1 で読めない。 */
  position: fixed; right: 28px; bottom: 28px; z-index: 50;
  width: 60px; height: 60px; border-radius: 0;
  border: 2px solid var(--ink);
  background: var(--electric);
  color: var(--ink); font-size: 28px; line-height: 1; cursor: pointer;
  box-shadow: var(--shadow-lg);
  transition: transform .18s, box-shadow .18s;
}
.fab:hover { transform: scale(1.08) rotate(90deg); }
/* 押した瞬間だけ影を縮めて沈み込ませる（硬い影なので距離で押下感を出す） */
.fab:active { transform: scale(.96); box-shadow: var(--shadow-sm); }

.modal {
  position: fixed; inset: 0; z-index: 60;
  background: rgba(51, 70, 92, .35);
  backdrop-filter: blur(3px);
  display: grid; place-items: center; padding: 20px;
  animation: fadeIn .18s;
}
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
.modal-box {
  width: 100%; max-width: 480px; max-height: 90vh; overflow-y: auto;
  background: #fff; border-radius: var(--radius); padding: 24px;
  box-shadow: var(--shadow-lg);
  animation: popIn .22s;
}
@keyframes popIn {
  from { opacity: 0; transform: translateY(14px) scale(.97); }
  to   { opacity: 1; transform: none; }
}
.modal-title { font-size: 18px; margin: 0 0 18px; }
.modal-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 20px; }

/* ------------------------------------------------------------ 入力部品 */
.field { display: block; margin-bottom: 14px; }
.field-grow { flex: 1; }
.field-label {
  display: block; font-size: 12px; color: var(--sub);
  font-weight: 600; margin-bottom: 5px;
}
.field input, .field select, .field textarea, .memo-box, .comment-form textarea,
.subtask-add input, .member-search {
  width: 100%; padding: 10px 13px;
  border: 2px solid var(--border); border-radius: var(--radius-sm);
  background: #fff; font: inherit; color: var(--text);
  transition: border-color .15s, box-shadow .15s, transform .15s;
}
.field input:focus, .field select:focus, .field textarea:focus, .memo-box:focus,
.comment-form textarea:focus, .subtask-add input:focus, .member-search:focus {
  outline: none; border-color: var(--c-doing);
  box-shadow: 0 0 0 4px var(--c-doing-bg);
  transform: translateY(-1px);
}
.field textarea, .memo-box, .comment-form textarea { resize: vertical; }
.field-row { display: flex; gap: 12px; align-items: flex-end; }
.field-row .field { flex: 1; margin-bottom: 14px; }
.form-error {
  background: var(--c-over-bg); border: 1px solid var(--c-over);
  border-radius: var(--radius-sm); padding: 9px 12px;
  font-size: 13px; color: #c0392b; margin: 0 0 12px;
}

.btn {
  padding: 10px 20px; border: 0; border-radius: 0;
  font: inherit; font-weight: 600; cursor: pointer;
  position: relative; overflow: hidden;
  transition: transform .14s, box-shadow .14s, opacity .14s;
}
.btn:active { transform: translateY(1px) scale(.99); }
.btn:disabled { opacity: .6; cursor: progress; }
.btn-primary { background: var(--c-doing); color: #fff; box-shadow: var(--shadow-sm); }
.btn-primary:hover { box-shadow: var(--shadow-md); transform: translateY(-2px); }
.btn-accent { background: var(--c-doing); color: #fff; box-shadow: var(--shadow-sm); }
.btn-accent:hover { box-shadow: var(--shadow-md); transform: translateY(-2px); }
.btn-ghost { background: var(--c-todo-bg); color: var(--sub); }
.btn-ghost:hover { background: var(--border); }
.btn-block { width: 100%; margin-top: 10px; }
/* ホバー時に表面を光が斜めに通り抜ける */
.btn-primary::after, .btn-accent::after {
  content: ""; position: absolute; inset: 0;
  background: transparent;
  transform: translateX(-120%);
}
.btn-primary:hover::after, .btn-accent:hover::after {
  transition: transform .55s; transform: translateX(120%);
}

/* ------------------------------------------------------------ 詳細画面 */
.detail-head {
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: 12px; margin-bottom: 10px;
}
.detail-title { font-size: 20px; margin: 0; line-height: 1.45; }
.detail-meta { display: flex; align-items: center; gap: 12px; margin-bottom: 18px; }
.badge {
  display: inline-block; padding: 4px 12px; border-radius: 0;
  font-size: 12px; font-weight: 600;
}
.badge-todo  { background: var(--c-todo-bg);  color: #5c6b7f; }
.badge-doing { background: var(--c-doing-bg); color: #1d7fa3; }
.badge-done  { background: var(--c-done-bg);  color: #1e8f6b; }

.remain-box {
  background: var(--c-doing-bg); border-radius: var(--radius-sm);
  padding: 14px 16px; margin-bottom: 22px;
}
.remain-label { font-size: 12px; color: #1d7fa3; font-weight: 700; margin-right: 10px; }
.remain-count { font-size: 16px; font-weight: 700; }
.remain-bar {
  height: 9px; background: #fff; border-radius: 0;
  overflow: hidden; margin-top: 10px;
}
.remain-fill {
  height: 100%; width: 0;
  background: var(--c-done);
  border-radius: 0; transition: width .35s;
}

.sub-head { font-size: 14px; margin: 0 0 10px; }
.subtask-list { list-style: none; margin: 0; padding: 0; }
.subtask-item {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 10px 12px; border-radius: var(--radius-sm);
  border: 2px solid var(--border); margin-bottom: 7px;
  transition: background .15s, border-color .15s;
}
.subtask-item:hover { border-color: var(--c-doing); background: var(--c-doing-bg); }
.subtask-item.sub-done { background: var(--c-done-bg); border-color: var(--c-done); }
.subtask-item.sub-done span { text-decoration: line-through; color: var(--sub); }
.subtask-label { display: flex; align-items: center; gap: 10px; cursor: pointer; flex: 1; }
.subtask-label input { width: 18px; height: 18px; accent-color: var(--c-doing); cursor: pointer; }
.subtask-add { display: flex; gap: 8px; margin-top: 14px; }
.subtask-add input { flex: 1; }

.memo-box { min-height: 150px; font-size: 13px; line-height: 1.7; }
.memo-box[readonly] { background: var(--c-todo-bg); color: var(--sub); }

/* ---------------------------------------------------------- コメント表示 */
.comment-list { display: flex; flex-direction: column; gap: 12px; }
.comment {
  position: relative;
  background: var(--c-cmt-bg); border: 1px solid var(--c-cmt-bg);
  border-radius: var(--radius-sm); padding: 10px 12px;
}
/* 吹き出しの尻尾 */
.comment::after {
  content: ""; position: absolute; left: 16px; bottom: -7px;
  width: 12px; height: 12px; background: var(--c-cmt-bg);
  border-right: 1px solid var(--c-cmt-bg); border-bottom: 1px solid var(--c-cmt-bg);
  transform: rotate(45deg);
}
.comment-mine { background: var(--c-doing-bg); border-color: var(--c-doing); }
.comment-mine::after { background: var(--c-doing-bg); border-color: var(--c-doing); }
.comment-head { display: flex; align-items: center; gap: 8px; margin-bottom: 5px; }
.comment-who { font-size: 12px; font-weight: 700; }
.comment-at { font-size: 10px; color: var(--sub); }
.comment-head .btn-del { margin-left: auto; }
.comment-body { font-size: 13px; margin: 0; line-height: 1.65; white-space: pre-wrap; }
.comment-form { margin-top: 14px; }
.comment-form textarea::placeholder { color: #b6c4d2; }

/* ------------------------------------------------------------ 設定画面 */
.group-list { display: flex; flex-direction: column; gap: 12px; margin-bottom: 18px; }
.group-card {
  border: 2px solid var(--border); border-radius: var(--radius-sm); padding: 14px;
}
.group-head { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; }
.group-name { font-weight: 600; }
.badge-owner {
  font-size: 10px; padding: 2px 8px; border-radius: 0;
  background: var(--c-doing-bg); color: #1d7fa3; font-weight: 700;
}
.group-members { display: flex; flex-wrap: wrap; gap: 6px; }
.member-chip {
  font-size: 11px; padding: 4px 10px; border-radius: 0;
  background: var(--c-todo-bg); color: var(--sub);
}
.member-add { margin-top: 12px; }
.member-candidates { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.cand-chip {
  font-size: 12px; padding: 5px 12px; border-radius: 0;
  border: 2px solid var(--c-doing); background: #fff; color: var(--c-doing);
  font-family: inherit; cursor: pointer; transition: all .15s;
}
.cand-chip:hover { background: var(--c-doing); border-color: var(--c-doing); color: #fff; }

.share-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.share-table th {
  text-align: left; font-size: 11px; color: var(--sub);
  padding: 0 10px 8px; border-bottom: 2px solid var(--border);
}
.share-table td { padding: 12px 10px; border-bottom: 1px solid var(--border); }
.share-table input[type="checkbox"] {
  width: 20px; height: 20px; accent-color: var(--c-doing); cursor: pointer;
}
.share-table input[type="checkbox"]:disabled { cursor: not-allowed; opacity: .4; }
.ta-c { text-align: center; }

/* -------------------------------------------------------- みんなのボード */
.member-list { display: flex; flex-direction: column; gap: 12px; margin-top: 18px; }
.member-card {
  display: grid; grid-template-columns: 48px minmax(0, 1fr) 24px;
  gap: 14px; align-items: center;
  background: var(--card); border: 2px solid var(--border);
  border-radius: var(--radius); padding: 16px 18px;
  text-decoration: none; color: var(--text);
  box-shadow: var(--shadow-sm);
  transition: transform .15s, box-shadow .15s, border-color .15s;
}
.member-card:hover {
  transform: translateY(-3px); box-shadow: var(--shadow-md);
  border-color: var(--c-doing);
}
.member-avatar {
  width: 48px; height: 48px; border-radius: 0;
  display: grid; place-items: center;
  background: var(--c-doing);
  color: #fff; font-size: 20px; font-weight: 700;
}
.member-body { min-width: 0; }
.member-name { display: block; font-size: 15px; font-weight: 600; }
.member-meta {
  display: flex; flex-wrap: wrap; gap: 10px; align-items: center;
  font-size: 11px; color: var(--sub); margin: 4px 0 7px;
}
.member-group {
  padding: 2px 8px; border-radius: 0;
  background: var(--c-doing-bg); color: #1d7fa3; font-weight: 600;
}
.member-can { padding: 2px 8px; border-radius: 0; background: var(--c-doing-bg); color: #0f5d7a; font-weight: 600; }
.member-readonly { padding: 2px 8px; border-radius: 0; background: var(--c-todo-bg); }
.member-bar { display: block; height: 6px; background: var(--c-todo-bg); border-radius: 0; overflow: hidden; }
.member-bar i {
  display: block; height: 100%; border-radius: 0;
  background: var(--c-done);
}
.member-arrow { font-size: 18px; color: var(--c-doing); }

/* ---------------------------------------------------------------- トースト */
.toast {
  position: fixed; top: 76px; left: 50%; transform: translateX(-50%);
  z-index: 80; padding: 11px 22px; border-radius: 0;
  font-size: 13px; font-weight: 600; color: #fff;
  box-shadow: var(--shadow-md);
  animation: toastIn .24s;
}
@keyframes toastIn {
  from { opacity: 0; transform: translate(-50%, -12px); }
  to   { opacity: 1; transform: translate(-50%, 0); }
}
.toast-ok { background: var(--c-doing); }
.toast-ng { background: #ef7a6d; }

/* 動きを減らす設定の人にはアニメーションを出さない */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation: none !important; transition: none !important; }
}

/* ----------------------------------------------------------------------------
 * グリッドの子要素の最小幅を 0 にしておく。
 * これが無いと、長いタスク名や <script>alert(1)</script> のような
 * 折り返せない文字列が 1fr 列を押し広げ、カードが画面からはみ出る。
 * -------------------------------------------------------------------------- */
.board-main, .detail-main { min-width: 0; }

/* 列見出しの各項目。.col-head のグリッド列と1対1で対応する */
.col-head-title   { padding-left: 4px; }
.col-head-label   { text-align: center; }
.col-head-due     { text-align: left; }
.col-head-status  { text-align: left; }
.col-head-comment { text-align: center; }

/* ============================================================================
 * 改訂版4での追加分
 * ----------------------------------------------------------------------------
 * この節で定義するもの
 *   modal[hidden]   ポップアップが閉じられなかった不具合の修正（最重要）
 *   modal-head      ポップアップ右上の「×」を置くための行
 *   cd              締め切りまでのカウントダウン。子タスクカードの主役
 *   sub-card        子タスク1件ぶんのカード（マイタスク一覧の1行）
 *   proj-link       プロジェクト名。押せる文字なので下線で表す
 *   col-head-sub    子タスク表示のときの列見出し
 * ========================================================================== */

/* --------------------------------------------------------------------------
 * ポップアップが閉じない不具合の修正
 * .modal に display:grid を書いたことで、ブラウザ標準の [hidden]{display:none}
 * が打ち消され、hidden を付けても消えない状態になっていた。
 * クラスより属性セレクタを後ろに置いて、確実に打ち勝たせる。
 * -------------------------------------------------------------------------- */
.modal[hidden] { display: none !important; }

/* ポップアップを開いている間は背面をスクロールさせない */
body.modal-open { overflow: hidden; }

/* ------------------------------------------------------ ポップアップの頭 */
.modal-head {
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: 12px; margin-bottom: 18px;
}
.modal-head .modal-title { margin: 0; }
.modal-close {
  flex: none; width: 32px; height: 32px; border: 0; cursor: pointer;
  border-radius: 0; background: var(--c-todo-bg); color: var(--sub);
  font-size: 20px; line-height: 1; display: grid; place-items: center;
  transition: background .15s, color .15s, transform .15s;
}
.modal-close:hover {
  background: var(--c-over-bg); color: #e05a4f; transform: rotate(90deg);
}
.modal-close:active { transform: rotate(90deg) scale(.9); }

/* 入れ子の入力欄（「新しい大タスクを作る」を選んだときだけ出る） */
.field-nested {
  background: var(--c-doing-bg); border-radius: var(--radius-sm);
  padding: 12px 14px 0; margin-bottom: 14px;
  animation: popIn .18s;
}
.field-note {
  font-size: 11px; color: var(--sub); margin: -6px 0 14px;
}

/* ==========================================================================
 * カウントダウン
 * 数字を大きく、単位を小さく。色で急ぎ具合を出す。
 *   cd-over  超過      赤
 *   cd-today 当日      黄（時間表示）
 *   cd-soon  2日以内   黄
 *   cd-near  6日以内   水色
 *   cd-far   1週間以上 うすい水色
 *   cd-none  期限なし  グレー
 * ========================================================================== */
.cd {
  flex: none;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  width: 62px; min-height: 46px; padding: 5px 4px;
  border-radius: var(--radius-sm);
  border: 2px solid transparent;
  line-height: 1.1; text-align: center;
}
.cd-num { font-size: 21px; font-weight: 800; letter-spacing: -.5px; }
/* 日と時間の2段組み。
   上段（cd-main）で「2日」、下段（cd-sub）で端数の「5時間」を出す。
   下段は小さく薄くして、ぱっと見の情報量が増えすぎないようにする */
.cd-main { display: flex; align-items: baseline; gap: 1px; justify-content: center; }
.cd-sub {
  display: block; margin-top: -1px;
  font-size: 9px; font-style: normal; font-weight: 600;
  line-height: 1.1; opacity: .72; white-space: nowrap;
}
.cd-unit { font-size: 10px; font-style: normal; font-weight: 600; opacity: .9; }

/* ★色のルール（2026-09-02 確定）
     赤 = 締め切りを過ぎた／残り5時間を切った   … cd-over / cd-urgent
     黄 = 締め切りが近い（5時間〜2日）           … cd-today / cd-soon
     水色 = まだ余裕がある                        … cd-near / cd-far
   赤と黄はこのカウントダウンだけで使う。他の部品には出さない。 */
.cd-over   { background: var(--c-red-bg);    border-color: var(--c-red);     color: var(--c-red-dk); }
.cd-urgent { background: var(--c-red-bg);    border-color: var(--c-red);     color: var(--c-red-dk); }
.cd-today  { background: var(--c-accent-bg); border-color: var(--c-accent-dk); color: #a97a00; }
.cd-soon   { background: var(--c-accent-bg); border-color: var(--c-accent);  color: #a97a00; }
.cd-near   { background: var(--c-doing-bg);  border-color: var(--c-doing);   color: #1a89b3; }
.cd-far    { background: #f4fbfe;            border-color: var(--border);    color: #6f96ab; }
.cd-none   { background: var(--c-todo-bg);   border-color: var(--border);    color: var(--sub); }

/* 赤の2つは一度だけ小さく揺らして視線を引く。黄は脈打たせるだけ */
.cd-over   { animation: cdShake .5s ease-in-out 1; }
.cd-urgent { animation: cdShake .5s ease-in-out 2; }
.cd-today  { animation: cdPulse 1.6s ease-in-out 2; }
@keyframes cdShake {
  0%, 100% { transform: translateX(0); }
  25% { transform: translateX(-2px); }
  75% { transform: translateX(2px); }
}
@keyframes cdPulse {
  0%, 100% { box-shadow: 2px 2px 0 var(--ink); }
  50%      { box-shadow: 0 0 0 4px var(--electric); }
}

/* ==========================================================================
 * 子タスクカード
 * 列は  残り / 子タスク名 / 大タスク（ラベル）/ 期限 / 状態 / コメント / 削除
 * col-head-sub と grid-template-columns を必ず揃える
 * ========================================================================== */
.col-head-sub, .sub-row {
  display: grid;
  grid-template-columns: 62px minmax(0, 1fr) 168px 78px 108px 58px 30px;
  gap: 10px; align-items: center;
}
.col-head-sub { padding: 0 18px 8px; font-size: 11px; color: var(--sub); font-weight: 600; }
.col-head-sub span { white-space: nowrap; }
.col-head-cd { text-align: center; }

/* 列見出しは表示モードに合わせて出し分ける */
body.view-sub    .col-head-parent-view { display: none; }
body.view-parent .col-head-sub         { display: none; }

.sub-card {
  background: var(--card); border-radius: var(--radius);
  border: 1px solid var(--border);
  border-left: 5px solid var(--c-todo);
  padding: 12px 16px;
  box-shadow: var(--shadow-sm);
  transition: box-shadow .16s, transform .16s, opacity .16s;
  animation: cardIn .3s both;
}
.sub-card:nth-child(1) { animation-delay: .00s; }
.sub-card:nth-child(2) { animation-delay: .04s; }
.sub-card:nth-child(3) { animation-delay: .08s; }
.sub-card:nth-child(4) { animation-delay: .12s; }
.sub-card:nth-child(5) { animation-delay: .16s; }
.sub-card:nth-child(n+6) { animation-delay: .20s; }

.sub-card:hover { box-shadow: var(--shadow-md); transform: translateY(-2px); }

.sub-card.status-todo  { border-left-color: var(--c-todo); }
.sub-card.status-doing {
  border-left-color: var(--c-doing);
  background: #fff;
}
.sub-card.status-done { border-left-color: var(--c-done); opacity: .74; }
.sub-card.status-done .sub-title { text-decoration: line-through; color: var(--sub); }
.sub-card.is-over {
  border-color: var(--c-over);
  background: #fff;
}

/* つまめることを分かるようにする。触ったときだけ左端に印を出す */
.sub-card[draggable="true"] { cursor: grab; position: relative; }
.sub-card[draggable="true"]::before {
  content: "⋮⋮";
  position: absolute; left: -2px; top: 50%; transform: translateY(-50%);
  font-size: 11px; color: var(--sub); letter-spacing: -2px;
  opacity: 0; transition: opacity .15s;
}
.sub-card[draggable="true"]:hover::before { opacity: .5; }
.sub-card[draggable="true"]:active { cursor: grabbing; }

/* ドラッグ中のカードは傾けて浮かせる。持ち上げている感覚を出す */
.sub-card.dragging {
  opacity: .55; transform: rotate(1.2deg) scale(1.01);
  box-shadow: var(--shadow-lg);
  border-style: dashed;
}
/* 挿入位置を黄色い線で示す */
.sub-card.drop-before { box-shadow: 0 -4px 0 0 var(--c-doing), var(--shadow-md); }
.sub-card.drop-after  { box-shadow: 0  4px 0 0 var(--c-doing), var(--shadow-md); }

/* 閲覧モード（他者のボード）ではつまめる見た目にしない */
.board-readonly .sub-card { cursor: default; }
.board-readonly .sub-card:hover { transform: none; }

/* ------------------------------------------------------- カード内の各列 */
.sub-title-col { min-width: 0; }
.sub-title {
  display: block; font-size: 15px; font-weight: 600; color: var(--text);
  text-decoration: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.sub-title:hover { color: var(--c-doing); text-decoration: underline; }
/* 幅が狭いときだけ、カード内に親タスク名を出す（下の @media で表示） */
.sub-parent-sm { display: none; font-size: 11px; color: var(--sub); }

/* 大タスクをラベルとして見せるチップ */

.sub-status-col { min-width: 0; }
.sub-comment-col { text-decoration: none; justify-self: center; }

/* 大タスク表示のときのカード内カウントダウン（小さめに出す） */
.card-sub-cd { margin-left: 6px; }
.card-sub-cd .cd {
  display: inline-flex; flex-direction: row; gap: 2px;
  width: auto; min-height: 0; padding: 1px 6px; border-width: 1px;
  vertical-align: middle; animation: none;
}
.card-sub-cd .cd-num  { font-size: 11px; }
.card-sub-cd .cd-unit { font-size: 9px; }
.card-sub-cd .cd-sub  { font-size: 8px; margin-top: -2px; }

/* 表示切替のチップは主役ではないので少し控えめにする */


/* サイドの「つぎの締め切り」 */
.prog-next {
  margin: 12px 0 0; padding-top: 12px; border-top: 1px dashed var(--border);
  font-size: 11px; color: var(--sub); line-height: 1.7;
}
.prog-next a {
  color: var(--text); font-weight: 600; font-size: 12px; text-decoration: none;
}
.prog-next a:hover { color: var(--c-doing); text-decoration: underline; }
.prog-next .cd {
  display: inline-flex; flex-direction: row; gap: 3px; align-items: baseline;
  width: auto; min-height: 0; padding: 2px 7px; margin-left: 6px;
  border-width: 1px; vertical-align: middle; animation: none;
}
.prog-next .cd-num  { font-size: 12px; }
.prog-next .cd-unit { font-size: 9px; }
.prog-next .cd-sub  { font-size: 8px; margin-top: -2px; }

/* ------------------------------------------------------------ 幅が狭いとき */
@media (max-width: 900px) {
  .col-head-sub { display: none; }
  body.view-sub .col-head-sub { display: none; }

  /* 大タスクチップと期限列を畳んで、2段組みにする */
  .sub-row {
    grid-template-columns: 62px minmax(0, 1fr) 96px 30px;
    row-gap: 8px;
  }
  .meta-due { display: none; }
  .sub-parent-sm { display: none; }
  .sub-comment-col { justify-self: end; }
}

/* 動きを減らす設定の人にはアニメーションを出さない */
@media (prefers-reduced-motion: reduce) {
  .cd-over, .cd-urgent, .cd-today, .sub-card, .field-nested { animation: none !important; }
}

/* --------------------------------------------------------------------------
 * 検証で見つかった未定義クラスの補完
 * sub-del / comment-del / share-del は btn-del と併用しているので見た目は
 * すでに当たっているが、JS の絞り込み用の目印であることを明示しておく。
 * チェックボックス3種は素のままだと配色から浮くので、accent-color を合わせる。
 * -------------------------------------------------------------------------- */
.col-head-parent { /* 子タスク表示の「大タスク（ラベル）」列見出し */ }
.sub-del, .comment-del, .share-del { /* JS の絞り込み用。見た目は .btn-del */ }

.sub-check, .sw-view, .sw-comment {
  width: 18px; height: 18px; cursor: pointer;
  accent-color: var(--c-doing);   /* 水色のチェックにする */
  vertical-align: middle;
}
.sub-check:disabled, .sw-view:disabled, .sw-comment:disabled {
  cursor: not-allowed; opacity: .45;
}


/* ============================================================ 一覧の読み込み失敗
   通信に失敗した理由を、消えない形で一覧の上に出す枠。
   toast は数秒で消えてしまい原因を読み返せないため、こちらに残す。 */
.list-error {
  margin: 10px 0 14px;
  padding: 12px 16px;
  border: 1.5px solid var(--c-over);
  border-left-width: 5px;
  border-radius: var(--radius-sm);
  background: var(--c-over-bg);
  color: #8c3b3b;
  font-size: .86rem;
  line-height: 1.7;
}
.list-error strong { font-size: .92rem; }
.list-error ul { margin: 6px 0 4px; padding-left: 1.2em; }
.list-error li { word-break: break-all; }
.list-error-hint { display: block; margin-top: 4px; color: #a4655f; font-size: .8rem; }

/* ============================================================================
 * ここから下は DB 設計 改訂版4 に合わせて追加した部分
 * ----------------------------------------------------------------------------
 * 追加した理由
 *   ・一覧が「やる順」の単一リストに変わった                  → .order-list 系
 *   ・タスク詳細が階層ツリーになった                          → .tree 系
 *   ・labels マスタが増えた                                   → .label-chip 系
 *   ・user_stats のホバーカードを付けた                        → .hover-card 系
 *   ・ステータスの色はマスタから来るので --sc で受け取る形にした
 *
 * 旧レイアウト（.col-head / .sub-row / body.view-sub）のルールは
 * 対応する要素がテンプレートから無くなったため、どの要素にも当たらない。
 * 消しても動くが、同じセレクタが二重に効いて色が混ざる事故を避けるため、
 * ここでは新しいクラス名だけを使い、既存ルールには触れていない。
 * 唯一 .card-row だけは列構成が変わったので、下で明示的に上書きしている。
 * ========================================================================== */

/* --- 優先度の色。カード上の印とカレンダーの点で共通に使う ---------------- */
:root {
  --c-p1: #ff8a80;   /* 緊急 */
  --c-p2: #ffb74d;   /* 高   */
  --c-p3: #38b6e0;   /* 通常 */
  --c-p4: #a9bccd;   /* 低   */
  --c-p5: #c6d2dc;   /* 最低 */
}

/* ------------------------------------------------------------ カードの列構成
 * 2026-09-01 の変更で、通し番号（34px）と優先度（92px）の2列を外した。
 * 空いた 126px は、切れていた期限（8/29 23:5… と欠けていた）に回している。
 *
 * 現在の並びは
 *   カウントダウン / タスク名 / プロジェクト / ラベル / 期限 / 状態 / コメント / 削除
 *
 * 旧定義（.col-head, .card-row）は6列だったので、ここで上書きしている。 */
.card-row {
  display: grid;
  grid-template-columns:
    62px                /* カウントダウン */
    minmax(0, 1fr)      /* タスク名 */
    132px               /* プロジェクト名のチップ */
    auto                /* ラベル（無いときは詰まる） */
    104px               /* 期限。時刻まで入るので折り返させない幅にする */
    104px               /* 状態 */
    56px                /* コメント */
    28px;               /* 削除 */
  /* ↑ 列を足したときは下の狭い画面用の指定も必ず揃える */
  gap: 10px;
  align-items: center;
}

/* ------------------------------------------------------------ 字下げについて
 * 「やる順」の一覧では字下げしない（2026-09-01 修正）。
 *
 * 直した内容
 *   以前は depth に応じて margin-left を付けていたため、
 *   カードごとに左端の位置と幅が変わり、
 *   カウントダウン・期限・状態などの列が縦に揃わずガタついていた。
 *   やる順の一覧は「上から順」だけを見せる場所で親子関係は主役ではないので、
 *   字下げをやめて全カードの左端を揃える。
 *
 *   親子関係は、カード内の「親タスク名」とプロジェクトのチップで分かる。
 *   階層を字下げで見せるのは「プロジェクトごと」の表示だけに寄せた（下の view-project）。
 */
.task-card.depth-0,
.task-card.depth-1,
.task-card.depth-2 { margin-left: 0; }

/* 完了扱い（is_closed が true）のカードは沈める。
   status_key === "done" ではなくマスタの is_closed で判定している */
.task-card.is-closed { opacity: .62; border-left-color: var(--c-done); }
.task-card.is-closed .card-title { text-decoration: line-through; color: var(--sub); }

/* 期限超過は赤枠 */
.task-card.is-over { border-left-color: var(--c-over); background: #fffbfb; }

/* タスク名の下に出す小さい行（親タスク名と配下の進み具合） */

/* 自分がプロジェクト（depth 0）のときの印 */

/* --- 優先度のバッジ --------------------------------------------------------
 * カード上のプルダウンは外したので、残っているのは表示専用のバッジだけ。
 * タスク詳細の #detail-prio と、ツリー行の .tree-prio が使っている。
 * 色（--c-p1〜5）はカレンダーの点とも共通。 */
.prio-badge {
  display: inline-block; border-radius: 0;
  padding: 3px 10px; font-size: 11px; font-weight: 700;
  color: #fff; white-space: nowrap;
}
.prio-1 { background: var(--c-p1); }
.prio-2 { background: var(--c-p2); }
.prio-3 { background: var(--c-p3); }
.prio-4 { background: var(--c-p4); }
.prio-5 { background: var(--c-p5); }

/* --------------------------------------------------- プロジェクトごとの表示 */
.project {
  background: rgba(255,255,255,.6); border: 2px solid var(--border);
  border-radius: var(--radius); padding: 12px; margin-bottom: 16px;
}
.project-head {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 2px 6px 12px;
}
.project-title {
  font-size: 15px; font-weight: 700; color: var(--text); text-decoration: none;
}
.project-title:hover { color: #1c7fa8; text-decoration: underline; }
.project-prog { display: flex; align-items: center; gap: 8px; margin-left: auto; }
.project-count { font-size: 11px; font-weight: 700; color: var(--sub); white-space: nowrap; }
.project-bar {
  width: 96px; height: 7px; background: var(--c-todo-bg);
  border-radius: 0; overflow: hidden;
}
.project-bar i { display: block; height: 100%; background: var(--c-done); border-radius: 0; }
.project-body { display: flex; flex-direction: column; gap: 10px; }

/* ------------------------------------------------------------------ ラベル
 * labels マスタ + task_labels。value があれば「工数 8h」の形で出す。
 * 色は各ラベルが持っているので、--chip で受け取る。 */
.label-chips { display: flex; gap: 4px; flex-wrap: wrap; align-items: center; }
.label-chip {
  display: inline-flex; align-items: center; gap: 3px;
  background: color-mix(in srgb, var(--chip, #7ec8e3) 24%, #fff);
  border: 1px solid var(--chip, #7ec8e3);
  color: #3b5566; border-radius: 0;
  padding: 2px 8px; font-size: 10px; font-weight: 600; white-space: nowrap;
}
.label-chip-lg { padding: 5px 12px; font-size: 12px; }
.label-unit {
  font-style: normal; opacity: .7;
  border-left: 1px solid currentColor; padding-left: 4px; margin-left: 2px;
}
.label-common {
  font-style: normal; font-size: 9px; font-weight: 700;
  background: #fff; border-radius: 0; padding: 1px 5px; opacity: .75;
}
.label-list { display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 14px; }

/* ============================================================== 階層ツリー
 * タスク詳細の左側。ここのドラッグ&ドロップだけが sort_order を更新する。
 * 返却が depth, sort_order 順なので、1ループで組んだ結果をそのまま並べる。 */
.tree-head { margin-top: 22px; }
.tree-hint {
  font-size: 11px; color: var(--sub); margin: 2px 0 10px; line-height: 1.6;
}
.task-tree { display: flex; flex-direction: column; gap: 6px; }

.tree-node { display: flex; flex-direction: column; gap: 6px; }

/* 子は左に線を引いて、親子の関係が目で追えるようにする */
.tree-children {
  display: flex; flex-direction: column; gap: 6px;
  margin-left: 20px; padding-left: 14px;
  border-left: 2px dashed var(--border);
}

.tree-row {
  display: grid;
  grid-template-columns:
    auto                /* つまむ部分 */
    minmax(0, 1fr)      /* タスク名 */
    52px                /* カウントダウン */
    64px                /* 優先度 */
    100px               /* 状態 */
    52px                /* コメント */
    auto auto;          /* ＋子 / 削除 */
  gap: 8px; align-items: center;
  background: var(--card); border: 2px solid var(--border);
  border-left: 5px solid var(--c-todo);
  border-radius: var(--radius-sm); padding: 8px 12px;
  transition: transform .12s, box-shadow .12s, border-color .12s, background .12s;
}
.tree-row:hover { box-shadow: var(--shadow-sm); border-color: var(--c-doing); }
.tree-row.is-closed { opacity: .6; border-left-color: var(--c-done); }
.tree-row.is-closed .tree-title { text-decoration: line-through; color: var(--sub); }
.tree-row.is-over { border-left-color: var(--c-over); background: #fffbfb; }

/* 選択中（右のメモ・コメントの対象） */
.tree-row.tree-current {
  border-color: var(--c-doing); background: var(--c-doing-bg);
  box-shadow: 0 0 0 3px var(--c-doing-bg);
}
/* 一覧から飛んできた行を一度だけ光らせる */
.tree-row.tree-focus { animation: focusPulse 1.6s ease-out 2; }
@keyframes focusPulse {
  0%, 100% { box-shadow: 2px 2px 0 var(--ink); }
  40%      { box-shadow: 0 0 0 6px var(--electric); }
}

.tree-row[draggable="true"] { cursor: grab; }
.tree-row[draggable="true"]:active { cursor: grabbing; }
.tree-grip {
  color: var(--sub); opacity: .35; font-size: 11px; letter-spacing: -2px;
  transition: opacity .12s;
}
.tree-row:hover .tree-grip { opacity: .75; }

/* つまんでいる行は少し傾けて浮かせる。持ち上げている感触を出す */
.tree-row.dragging {
  opacity: .5; transform: rotate(1deg) scale(.99);
  border-style: dashed; box-shadow: var(--shadow-lg);
}
/* 落とす位置を黄色い線で示す */
.tree-row.drop-before { box-shadow: 0 -3px 0 0 var(--c-doing); }
.tree-row.drop-after  { box-shadow: 0  3px 0 0 var(--c-doing); }

.tree-title {
  background: none; border: 0; padding: 0; text-align: left;
  font-size: 13px; font-weight: 600; color: var(--text);
  cursor: pointer; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  font-family: inherit;
}
.tree-title:hover { color: #1c7fa8; text-decoration: underline; }

.tree-prio {
  display: inline-block; text-align: center;
  border-radius: 0; padding: 2px 6px;
  font-size: 10px; font-weight: 700; color: #fff; white-space: nowrap;
}
.tree-status-col { display: flex; }
.tree-status {
  width: 100%; font-size: 11px; font-weight: 600;
  padding: 4px 6px; border-radius: 0;
  border: 2px solid var(--border); background: #fff; color: var(--text);
  cursor: pointer;
}
.tree-status:focus { outline: none; border-color: var(--c-doing);
                     box-shadow: 0 0 0 3px var(--c-doing-bg); }

.tree-add {
  background: var(--c-doing-bg); border: 1px solid var(--c-doing);
  color: #8a6a00; border-radius: 0; padding: 2px 8px;
  font-size: 10px; font-weight: 700; cursor: pointer; white-space: nowrap;
  font-family: inherit; transition: background .12s, transform .12s;
}
.tree-add:hover  { background: var(--c-doing); }
.tree-add:active { transform: translateY(1px); }

.tree-del { justify-self: end; }

/* ------------------------------------------------- 選択中タスクのパネル（右） */
.side-card-sel { border-top: 4px solid var(--c-doing); }
.sel-title {
  margin: 0 0 4px; font-size: 14px; font-weight: 700; color: var(--text);
  word-break: break-word;
}
.sel-path {
  margin: 0 0 12px; font-size: 11px; color: var(--sub); line-height: 1.6;
  word-break: break-word;
}
.new-parent-name { font-weight: 700; color: var(--text); }

/* ============================================================ ホバーカード
 * 名前にカーソルを載せると user_stats の内容を出す。
 * completion_rate が null のときは「まだタスクがありません」に振り分ける。 */
.member-wrap { position: relative; }

.hover-card {
  position: absolute; left: 50%; top: calc(100% + 8px);
  transform: translateX(-50%);
  width: 268px; z-index: 40;
  background: #fff; border: 2px solid var(--c-doing);
  border-radius: var(--radius-sm); padding: 14px;
  box-shadow: var(--shadow-lg);
  animation: hoverIn .16s ease-out both;
}
@keyframes hoverIn {
  from { opacity: 0; transform: translateX(-50%) translateY(-4px); }
  to   { opacity: 1; transform: translateX(-50%) translateY(0); }
}
/* 上向きの三角。吹き出しに見せる */
.hover-card::before {
  content: ""; position: absolute; left: 50%; top: -8px;
  width: 12px; height: 12px; margin-left: -6px;
  background: #fff;
  border-left: 2px solid var(--c-doing); border-top: 2px solid var(--c-doing);
  transform: rotate(45deg);
}

.hover-head {
  display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
  padding-bottom: 10px; margin-bottom: 10px;
  border-bottom: 1px solid var(--border);
}
.hover-head strong { font-size: 14px; color: var(--text); }
.hover-group {
  background: var(--c-doing-bg); color: #1c7fa8;
  border-radius: 0; padding: 2px 8px; font-size: 10px; font-weight: 600;
}

.hover-rate-row {
  display: flex; align-items: baseline; gap: 8px; margin-bottom: 10px;
}
.hover-rate-label { font-size: 11px; color: var(--sub); font-weight: 600; }
.hover-rate { font-size: 22px; font-weight: 800; color: var(--c-done); }
.hover-none { font-size: 11px; color: var(--sub); font-style: italic; }

.hover-stats {
  list-style: none; margin: 0 0 8px; padding: 0;
  display: grid; grid-template-columns: 1fr 1fr; gap: 4px 10px;
}
.hover-stats li {
  display: flex; justify-content: space-between; align-items: baseline;
  font-size: 11px; color: var(--sub);
  border-bottom: 1px dotted var(--border); padding-bottom: 2px;
}
.hover-stats li b { font-size: 13px; color: var(--text); }
.hover-stats li.hover-over { color: #c0392b; }
.hover-stats li.hover-over b { color: #c0392b; }

.hover-fb {
  background: var(--c-doing-bg); border-radius: 0;
  padding: 8px 10px; margin-bottom: 0;
}
.hover-fb li { border-bottom: 0; padding-bottom: 0; }

.hover-last { margin: 8px 0 0; font-size: 10px; color: var(--sub); text-align: right; }
.hover-loading { margin: 0; font-size: 12px; color: var(--sub); text-align: center; }

/* ------------------------------------------------------------ 画面が狭いとき */
@media (max-width: 760px) {
  .tree-row {
    grid-template-columns: auto minmax(0, 1fr) 48px auto;
  }
  .tree-row .tree-prio,
  .tree-row .tree-status-col { display: none; }
  .tree-children { margin-left: 10px; padding-left: 8px; }
  .hover-card { width: 232px; }
}

/* 動きを減らす設定の人にはアニメーションを出さない */
@media (prefers-reduced-motion: reduce) {
  .hover-card, .tree-row.tree-focus { animation: none; }
  .tree-row, .status-select { transition: none; }
}

/* ------------------------------------------------- 表示モードごとの出し分け
 * dashboard.js の applyViewClass() が body に付けるクラス。
 *   body.view-order    やる順の単一リスト（既定）
 *   body.view-project  プロジェクトごとの階層表示
 *
 * v4 では列見出しの出し分けに使っていたが、v5 は表示モードごとに
 * innerHTML を丸ごと差し替えるので、CSS 側で切り替える必要はなくなった。
 * ただし操作の説明文だけはモードによって当てはまらなくなるため、
 * ここで出し分けている（やる順のドラッグは view-order のときだけ）。 */
body.view-project .drag-hint { display: none; }

/* プロジェクト表示のときだけ字下げする。
 * 「やる順」では字下げしない（カードの左端が揃わず列がガタつくため）。 */
body.view-project .task-card.depth-0 { margin-left: 0; }
body.view-project .task-card.depth-1 { margin-left: 18px; }
body.view-project .task-card.depth-2 { margin-left: 36px; }

/* 狭い画面では字下げを浅くする。
 * この指定は必ず上の 18px/36px より後ろに置く。
 * 詳細度が同じなので、前に置くと後ろの指定に負けて効かない。 */
@media (max-width: 760px) {
  body.view-project .task-card.depth-1 { margin-left: 10px; }
  body.view-project .task-card.depth-2 { margin-left: 20px; }
}


/* ============================================================================
 * やる順の一覧（2026-09-01 UI変更）
 * ----------------------------------------------------------------------------
 * 優先度ごとの箱に振り分けるのをやめ、単一リストで「上から順にやる順番」を見せる。
 *   .order-list   やる順のリストそのもの
 *   .drop-before  ドラッグ中、このカードの「前」に入ることを示す線
 *   .drop-after   同じく「後ろ」に入ることを示す線
 *   .done-box     完了ぶんをまとめてしまっておく折りたたみ
 *
 * 丸数字の通し番号（.order-num）と、カード上の優先度プルダウン（.prio-mark）は
 * 9/1 の修正で外した。上から並んでいること自体がやる順であり、
 * カードに優先度が並ぶと「順番と優先度のどちらが本当の順序か」が読めなくなるため。
 * ========================================================================== */

.order-list { display: flex; flex-direction: column; gap: 10px; }

.order-empty {
  margin: 0; padding: 22px 14px; text-align: center;
  font-size: 13px; color: var(--sub);
  background: rgba(255,255,255,.6);
  border: 2px dashed var(--border); border-radius: var(--radius);
}

/* ------------------------------------------------ ドロップ位置の目印 */
.task-card.drop-before,
.task-card.drop-after { position: relative; }

.task-card.drop-before::before,
.task-card.drop-after::after {
  content: ""; position: absolute; left: 0; right: 0; height: 4px;
  background: var(--c-doing); border-radius: 0;
  box-shadow: 0 0 0 3px var(--c-doing-bg);
}
.task-card.drop-before::before { top: -7px; }
.task-card.drop-after::after   { bottom: -7px; }

/* つまんでいる最中のカード。持ち上げている感じを出す */
.task-card.dragging {
  opacity: .55; transform: rotate(1.2deg) scale(.99);
  border-style: dashed;
}
/* ドラッグ中はカード内のリンクや操作を反応させない（誤操作を防ぐ） */
body.is-dragging .task-card a,
body.is-dragging .task-card select,
body.is-dragging .task-card button { pointer-events: none; }

/* つかめることを、触ったときだけ知らせる */
.task-card[draggable="true"] { cursor: grab; }
.task-card[draggable="true"]:active { cursor: grabbing; }

/* ------------------------------------------------ 完了ぶんの折りたたみ */
.done-box {
  margin-top: 18px; border: 2px solid var(--border);
  border-radius: var(--radius); background: rgba(255,255,255,.5);
}
.done-summary {
  cursor: pointer; padding: 10px 14px;
  font-size: 12px; font-weight: 700; color: var(--sub);
  list-style: none;
}
.done-summary::-webkit-details-marker { display: none; }
.done-summary::before { content: "\25B8 "; color: var(--c-done); }
.done-box[open] .done-summary::before { content: "\25BE "; }
.done-summary b { color: var(--c-done); }
.done-body {
  display: flex; flex-direction: column; gap: 8px;
  padding: 0 10px 12px;
}

@media (prefers-reduced-motion: reduce) {
  .task-card.dragging { transform: none; }
}

@media (max-width: 900px) {
  /* 狭い画面では プロジェクト・ラベル・期限 を隠す（下の 1791 行の指定）。
   * 残るのは カウントダウン / タスク名 / 状態 / コメント / 削除 の5列。
   * 上の 8列指定と数が合っていないと列がずれるので、必ずセットで直す。 */
  .card-row {
    grid-template-columns: 56px minmax(0, 1fr) 96px 48px 26px;
  }
}



/* 現在いる画面のナビを分かるようにしておく */
.icon-btn.is-current {
  background: var(--c-doing-bg); border-radius: 0;
}

/* カレンダーから飛んできたときに、該当カードを一度だけ光らせる */
.focus-flash {
  animation: focusFlash 1.8s ease-out 1;
}
@keyframes focusFlash {
  0%   { box-shadow: 2px 2px 0 var(--ink); }
  30%  { box-shadow: 0 0 0 8px var(--electric); }
  100% { box-shadow: 2px 2px 0 var(--ink); }
}

@media (prefers-reduced-motion: reduce) {
  .focus-flash { animation: none; }
}

/* ============================================================================
 * みんな（グループ → メンバー）  ―  2026/09/01 追加
 * ----------------------------------------------------------------------------
 * 左にグループカード、右にそのグループの所属メンバーカードを並べる。
 * 色は :root の既存トークンだけを使う。新しい色は足していない。
 * ========================================================================== */

.people-wrap {
  max-width: 1180px;
  margin: 0 auto;
  display: grid;
  /* 左は固定寄り、右を広く。min-width:0 がないと長い名前で列が押し広がる */
  grid-template-columns: minmax(0, 340px) minmax(0, 1fr);
  gap: 20px;
  align-items: start;
}

.people-groups,
.people-members {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  box-shadow: var(--shadow-sm);
  padding: 18px 18px 22px;
  /* 上辺の帯。左が水色・右が黄色。アプリ共通の「顔」 */
  border-top: 3px solid transparent;
  background-image:
    var(--card),
    var(--c-doing);
  background-origin: border-box;
  background-clip: padding-box, border-box;
}

.people-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  margin-bottom: 2px;
}
.people-head .section-title { margin: 0; }

/* 丸い「＋」ボタン */
.btn-round {
  flex: 0 0 auto;
  width: 34px;
  height: 34px;
  border-radius: 0;
  border: none;
  background: var(--c-doing);
  color: #6b4e00;
  font-size: 18px;
  font-weight: 700;
  line-height: 1;
  cursor: pointer;
  box-shadow: var(--shadow-sm);
  transition: transform .12s, box-shadow .12s, background .12s;
}
.btn-round:hover {
  background: var(--c-doing);
  transform: translateY(-2px);
  box-shadow: var(--shadow-md);
}
.btn-round:active { transform: translateY(0); box-shadow: var(--shadow-sm); }

/* ------------------------------------------------------ 左：グループカード */

.group-cards {
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin-top: 12px;
}

.group-pick {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  grid-template-areas:
    "name arrow"
    "meta arrow";
  align-items: center;
  gap: 2px 10px;
  width: 100%;
  text-align: left;
  padding: 13px 14px;
  border: 1.5px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--card);
  color: var(--text);
  cursor: pointer;
  font-family: inherit;
  transition: transform .12s, box-shadow .12s, border-color .12s, background .12s;
}
.group-pick:hover {
  transform: translateX(3px);
  border-color: var(--c-doing);
  box-shadow: var(--shadow-sm);
}
/* 選択中のグループ。水色で塗って、右のパネルとの対応を分かりやすくする */
.group-pick.is-on {
  background: var(--c-doing-bg);
  border-color: var(--c-doing);
  box-shadow: var(--shadow-sm);
}

.group-pick-name {
  grid-area: name;
  font-size: 15px;
  font-weight: 700;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.group-pick-meta {
  grid-area: meta;
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  align-items: center;
  font-size: 11.5px;
  color: var(--sub);
}
.group-pick-count { font-weight: 600; }
.group-pick-open {
  background: var(--c-done-bg);
  color: #1f8f6b;
  border-radius: 0;
  padding: 1px 8px;
  font-weight: 600;
}
.group-pick-owner {
  background: var(--c-todo-bg);
  color: #8a6a00;
  border-radius: 0;
  padding: 1px 8px;
  font-weight: 600;
}
.group-pick-arrow {
  grid-area: arrow;
  color: var(--c-doing);
  font-size: 16px;
}

/* ------------------------------------------------------ 右：メンバーカード */

.member-hint,
.member-loading {
  margin: 14px 0 0;
  padding: 22px 16px;
  text-align: center;
  color: var(--sub);
  font-size: 13px;
  background: var(--bg);
  border: 1px dashed var(--border);
  border-radius: var(--radius-sm);
}

.member-cards {
  display: grid;
  /* 幅に応じて 1〜3 列。カードの中身は固定なので折り返しても崩れない */
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: 12px;
  margin-top: 14px;
}

.member-pick {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  gap: 12px;
  padding: 14px;
  border: 1.5px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--card);
  cursor: pointer;
  transition: transform .14s, box-shadow .14s, border-color .14s;
}
.member-pick:hover {
  transform: translateY(-4px);
  border-color: var(--c-doing);
  box-shadow: var(--shadow-md);
}
.member-pick:focus-visible {
  outline: none;
  border-color: var(--c-doing);
  box-shadow: 0 0 0 4px var(--c-doing-bg);
}
/* 自分のカード。黄色の枠で他人と区別する */
.member-pick.is-self {
  border-color: var(--c-doing);
  background: var(--c-doing-bg);
}
/* まだ公開設定をしていない人。押しても移動しないので、見た目で伝える */
.member-pick.is-locked {
  cursor: not-allowed;
  background: var(--c-todo-bg);
  border-style: dashed;
  opacity: .75;
}
.member-pick.is-locked:hover {
  transform: none;
  border-color: var(--c-todo);
  box-shadow: none;
}

.member-pick-avatar {
  width: 40px;
  height: 40px;
  border-radius: 0;
  display: grid;
  place-items: center;
  background: var(--c-doing);
  color: #fff;
  font-size: 17px;
  font-weight: 700;
}
.member-pick.is-self .member-pick-avatar { background: var(--c-doing); color: #4a3600; }
.member-pick.is-locked .member-pick-avatar { background: var(--c-todo); }

.member-pick-body {
  display: flex;
  flex-direction: column;
  gap: 4px;
  min-width: 0;
}
.member-pick-name {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 14.5px;
  font-weight: 700;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.member-pick-tag {
  flex: 0 0 auto;
  font-size: 10.5px;
  font-weight: 600;
  color: #8a6a00;
  background: #fff;
  border: 1px solid var(--c-doing);
  border-radius: 0;
  padding: 0 6px;
}

.member-pick-nums {
  display: flex;
  gap: 8px;
  align-items: center;
  font-size: 11.5px;
  color: var(--sub);
}
.mp-num b { color: var(--text); font-size: 13px; }
.mp-over {
  color: #c0392b;
  background: var(--c-over-bg);
  border-radius: 0;
  padding: 1px 7px;
  font-weight: 600;
}

/* 達成率。バーと数字を横に並べる */
.member-pick-rate {
  display: flex;
  align-items: center;
  gap: 7px;
}
.mp-bar {
  flex: 1 1 auto;
  height: 6px;
  min-width: 0;
  background: var(--c-todo-bg);
  border-radius: 0;
  overflow: hidden;
}
.mp-bar > i {
  display: block;
  height: 100%;
  background: var(--c-done);
  border-radius: 0;
  transition: width .3s;
}
.mp-pct {
  flex: 0 0 auto;
  font-size: 11.5px;
  font-weight: 700;
  color: var(--c-done);
}
/* 分母 0 のとき。0% と出すと「やっていない」ように見えるので文言を変える */
.mp-none { font-size: 11px; color: var(--sub); }

.member-pick-perm { font-size: 11px; }
.mp-can    { color: #1f8f6b; font-weight: 600; }
.mp-ro     { color: var(--sub); }
.mp-locked { color: #7d8ea1; font-weight: 600; }

.member-pick-arrow {
  font-size: 15px;
  color: var(--c-doing);
}
.member-pick.is-locked .member-pick-arrow { color: var(--c-todo); }

/* メンバー追加の候補チップに付ける「＋」 */
.cand-plus {
  margin-left: 6px;
  font-weight: 700;
  color: var(--c-doing);
}

/* 画面が狭いときは縦積みにする */
@media (max-width: 900px) {
  .people-wrap { grid-template-columns: minmax(0, 1fr); }
}

/* ==========================================================================
 * タスクカード レイアウト刷新（2026-09-01 FB反映）
 *
 * FBの指摘
 *   ・情報が全部同じ重さで横一列に並んでいて、どれが主役か分からない
 *   ・丸い形が「押せるもの」と「押せないもの」の両方に使われている
 *   ・コメントが来ていることが分かりにくい
 *
 * 直した考え方
 *   1段目 = 締め切りとタスク名だけ。ここだけ見れば「何をいつまでに」が分かる。
 *   2段目 = プロジェクト名・期限日時・状態。小さくグレーで従える。
 *   丸い形（pill）はラベルだけに残し、押せる文字は下線で表す。
 * ========================================================================== */

:root {
  /* コメントの丸数字の色。★要相談：赤は「期限超過」に予約したいので、
     いまは対話の色として水色寄りの濃い色を仮置きしている。
     決まったらこの2行を変えるだけで全カードに反映される */
  --cmt-badge: var(--c-cmt);
  --cmt-badge-text: #ffffff;
}

/* ---- カード本体 ---------------------------------------------------------- */
.task-card { position: relative; overflow: visible; }

/* ドラッグの持ち手（⋮⋮）は左上のコメント丸数字とぶつかるので、
   下寄りに逃がしてから中央に戻す */
.task-card[draggable="true"]::before { top: 58%; }

/* ---- 2段組みのグリッド --------------------------------------------------- */
.card-row {
  display: grid;
  grid-template-columns:
    auto              /* カウントダウン（1・2段目にまたがる） */
    minmax(0, 1fr)    /* タスク名 ／ 2段目のメタ行 */
    auto              /* ラベル */
    28px;             /* ×（1・2段目にまたがる） */
  grid-template-rows: auto auto;
  gap: 3px 12px;
  align-items: center;
}

/* カウントダウンと × は2段にまたがらせて、上下中央で位置を固定する */
.card-row > .cd      { grid-row: 1 / span 2; }
.card-row > .btn-del { grid-row: 1 / span 2; align-self: center; justify-self: end; }

.card-title {
  grid-row: 1; grid-column: 2;
  font-size: 16px; font-weight: 700; line-height: 1.35;
  color: var(--text); text-decoration: none;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.card-title:hover { color: var(--c-doing); text-decoration: underline; }

.label-chips { grid-row: 1; grid-column: 3; justify-content: flex-end; }

/* 2段目。タスク名の下から始めて、ラベルの列まで伸ばす */
.card-meta-line {
  grid-row: 2; grid-column: 2 / span 2;
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  min-width: 0;
}

/* ---- カウントダウン（大きく・数字主役） ---------------------------------- */
/* FB「そんな減ってる感はないよ」への当面の手当て。
   目減りが見える作り（バー等）は後日に回し、いまは数字を大きくして
   時間の端数まで読めるようにする */
.cd {
  width: 88px; min-height: 58px; padding: 6px 4px;
  border-radius: var(--radius-sm);
}
.cd-num  { font-size: 30px; font-weight: 800; letter-spacing: -1px; }
.cd-unit { font-size: 13px; font-weight: 700; opacity: 1; }
.cd-sub  { font-size: 13px; font-weight: 700; opacity: .85; margin-top: 0; }

/* ---- プロジェクト名：グレーの下線 → 乗せたら水色 ------------------------- */
/* 色のない下線だけだと「押せない補足」に見えることがあるので、
   マウスを乗せたときに水色へ変えて、押せることが分かるようにする */
.proj-link {
  font-size: 13px; color: var(--sub);
  text-decoration: underline;
  text-decoration-color: var(--border);
  text-underline-offset: 3px;
  max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  transition: color .15s, text-decoration-color .15s;
}
.proj-link:hover,
.proj-link:focus-visible {
  color: var(--c-doing);
  text-decoration-color: var(--c-doing);
}
.proj-self { font-size: 13px; color: var(--sub); opacity: .7; }

/* ---- 2段目の期限・状態は小さく従える ------------------------------------- */
.card-meta-line .meta-due { font-size: 13px; }
.card-meta-line .card-status-col { min-width: 0; }
.card-meta-line .status-select {
  width: auto; font-size: 12px; padding: 3px 8px;
  border-width: 1px; border-radius: var(--radius-sm);
}

/* ---- コメントの丸数字（左上） -------------------------------------------- */
.cmt-badge {
  position: absolute; top: -9px; left: -9px; z-index: 2;
  width: 24px; height: 24px; border-radius: 0;
  display: grid; place-items: center;
  background: var(--cmt-badge); color: var(--cmt-badge-text);
  border: 2px solid #fff;
  font-size: 12px; font-weight: 800; line-height: 1;
  text-decoration: none;
  transition: transform .15s;
}
.cmt-badge:hover { transform: scale(1.12); }

/* 丸数字だけだとカードが多いとき見落とすので、左端に帯も出す。
   一覧の左を上から流し見るだけで「意見が来ている行」が拾える */
.task-card.has-cmt { border-left: 3px solid var(--cmt-badge); }

/* ---- 狭い画面 ------------------------------------------------------------ */
@media (max-width: 1100px) {
  /* 2段組み（カウントダウン／タスク名／ラベル／×）のまま、
     ラベルだけ2段目に落として横幅を稼ぐ。列数は末尾の新レイアウトと揃える */
  .card-row { column-gap: 10px; }
  .label-chips { grid-row: 2; grid-column: 3; }
  .card-meta-line { grid-column: 2; }
}

@media screen and (max-width: 760px) {
  .card-row {
    grid-template-columns: auto minmax(0, 1fr) 28px;
  }
  .card-row > .btn-del { grid-row: 1; grid-column: 3; align-self: start; }
  .label-chips    { grid-row: 3; grid-column: 2 / span 2; justify-content: flex-start; }
  .card-meta-line { grid-row: 2; grid-column: 2 / span 2; }
  .card-row > .cd { grid-row: 1 / span 3; }
  .cd { width: 76px; min-height: 52px; }
  .cd-num { font-size: 26px; }
}

/* ------------------------------------------------------------------
   優先度順の「のぞき見」スイッチ（.peek-sw）と 提案バー（.suggest-bar）
   2026-09-03：塗りボタン（.sort-action）を廃止してスイッチに置き換え

   形のルール
     下線（.vtab）         … 表示の切り替え（一覧の構造が変わる）
     角丸6pxの四角（.chip）… 絞り込み（行が隠れる）
     スイッチ（.peek-sw）  … 一時的なオンオフ。保存しない  ← ここ
     塗り                  … 実行して保存する操作
     pill（丸）            … 押せないラベル専用

   色は水色系のみ。黄色は締め切り専用に予約しているので使わない。
   ------------------------------------------------------------------ */

.peek-wrap {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}

.peek-wrap[hidden] { display: none; }

.peek-sw {
  font: inherit;
  font-size: 12px;
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 4px 10px 4px 5px;
  border: 1px solid var(--border);
  border-radius: 0;                  /* 丸くしない。pill はラベル専用 */
  background: var(--card);
  color: var(--sub);
  cursor: pointer;
  transition: background .14s, border-color .14s, color .14s;
}

.peek-sw:hover { border-color: var(--c-doing); color: var(--text); }

.peek-sw:focus-visible {
  outline: 2px solid var(--c-cmt-dk);
  outline-offset: 2px;
}

/* オンのとき。うすい水色の背景にする（絞り込みの選択中と同じ考え方） */
.peek-sw-on {
  background: var(--c-doing-bg);
  border-color: var(--c-doing);
  color: var(--c-cmt-dk);
  font-weight: 600;
}

/* --- スイッチの見た目（レール＋つまみ） --- */

.peek-sw-track {
  position: relative;
  flex: 0 0 auto;
  width: 28px;
  height: 16px;
  border-radius: 0;                /* ここだけ丸いが、ラベルではなく部品の形 */
  background: var(--border);
  transition: background .16s;
}

.peek-sw-knob {
  position: absolute;
  top: 2px;
  left: 2px;
  width: 12px;
  height: 12px;
  border-radius: 0;
  background: var(--card);
  box-shadow: 2px 2px 0 var(--ink);
  transition: transform .16s;
}

.peek-sw-on .peek-sw-track { background: var(--c-doing); }
.peek-sw-on .peek-sw-knob  { transform: translateX(12px); }

.peek-sw-label { white-space: nowrap; }

/* オンのあいだだけ出る注記。
   見えている順番と保存されている順番が違う状態なので、必ず明示する */
.peek-note {
  font-size: 11px;
  color: var(--sub);
  white-space: nowrap;
}

.peek-note[hidden] { display: none; }

@media (prefers-reduced-motion: reduce) {
  .peek-sw, .peek-sw-track, .peek-sw-knob { transition: none; }
}

/* --- 提案バー（他人のボードで並び替えたときだけ出る） --- */

.suggest-bar {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  margin: 0 0 12px;
  padding: 10px 13px;
  border: 1px solid var(--c-cmt);
  border-left: 3px solid var(--c-cmt);   /* コメント（対話）の色 */
  border-radius: var(--radius-sm);
  background: var(--c-cmt-bg);
}

.suggest-bar[hidden] { display: none; }

.suggest-mark { font-size: 15px; line-height: 1; color: var(--c-cmt-dk); }

.suggest-text {
  flex: 1 1 240px;
  min-width: 0;
  font-size: 12px;
  line-height: 1.7;
  color: var(--c-cmt-dk);
}

.suggest-text b { display: block; font-size: 13px; }

.suggest-btns { display: inline-flex; gap: 8px; flex-wrap: wrap; }

.btn-suggest-send,
.btn-suggest-reset {
  font: inherit;
  font-size: 12px;
  padding: 6px 12px;
  border-radius: 0;
  cursor: pointer;
  transition: filter .12s, background .12s, color .12s;
}

/* 送信は本来「実行」なので塗り。ただし機能が未実装なので押せない状態にする */
.btn-suggest-send {
  border: 0;
  background: var(--c-cmt);
  color: #fff;
  font-weight: 600;
}

.btn-suggest-send:disabled {
  background: var(--c-todo-bg);
  color: var(--sub);
  cursor: not-allowed;
  font-weight: 400;
}

.btn-suggest-reset {
  border: 1px solid var(--c-cmt);
  background: var(--card);
  color: var(--c-cmt-dk);
}

.btn-suggest-reset:hover { background: var(--c-cmt-bg); }

.btn-suggest-send:focus-visible,
.btn-suggest-reset:focus-visible {
  outline: 2px solid var(--c-cmt-dk);
  outline-offset: 2px;
}

/* プロジェクトごとの表示中は「やる順」の話ではないので隠す */
body.view-project .suggest-bar { display: none; }

/* ============================================================================
 * Literary Editorial 部品層（2026-09-02 追加）
 * ----------------------------------------------------------------------------
 * ここまでの定義に対して、原典 design-system.yaml の
 * layout_components.cards / navigation / special_effects を当てる。
 *
 * 守った制約
 *   ・カードの構成（1段目=締切+タスク名、2段目=大タスク+期限+状態、× は右端）は変えない
 *   ・× の位置（最も右・上下中央・2段にまたがる）はそのまま
 * ========================================================================== */

body {
  background: var(--bg);
  font-family: var(--font-body);
  color: var(--text);
}

/* --- 数字は Space Grotesk。原典 numbering_system の指定 --- */
.cd-num, .cd-unit, .cd-sub, .cmt-badge, .prog-ring span,
.project-count, .meta-due { font-family: var(--font-num); }

/* ------------------------------------------------ カード：2px 枠 ＋ 硬い影 */
.task-card {
  position: relative;
  background: var(--card);
  border: 2px solid var(--ink);
  border-left: 2px solid var(--ink);
  border-radius: 0;
  box-shadow: none;
  margin-bottom: 18px;
  transition: transform .15s ease, box-shadow .15s ease;
}

/* 原典 special_effects.shadow_cards：::before で 4px ずらした黒い影を敷く。
   ただし ::before はドラッグの持ち手（⋮⋮）に既に使われているので、
   影は box-shadow で表現して衝突を避ける */
.task-card { box-shadow: 4px 4px 0 var(--ink); }

/* 原典 hover_effects：左上へ移動して影を伸ばす。
   白黒反転は採っていない（一覧に何十枚も並ぶので読みづらくなる） */
.task-card:hover {
  transform: translate(-3px, -3px);
  box-shadow: 7px 7px 0 var(--ink);
}

/* 状態は「左の太い帯」で示す。
 *
 * ★ここは ::after を使わないこと。
 *   .task-card.drop-after::after が「このカードの後ろに入る」線として
 *   既に ::after を使っている（board.css 1888行付近）。
 *   帯を ::after で描くと、幅と上下位置がドロップ線に漏れて
 *   線が 6px 幅・カード上端に出てしまう。
 *   そのため帯は border-left で描く。 */
.task-card { border-left: 6px solid var(--c-todo); }
.task-card.status-todo             { border-left-color: var(--c-todo); }
.task-card.status-doing            { border-left-color: var(--ink); }
.task-card.status-done             { border-left-color: var(--c-done); }
.task-card.status-needs_reschedule { border-left-color: var(--coral); }
.task-card.is-closed               { border-left-color: var(--c-done); }
.task-card.is-over                 { border-left-color: var(--coral); }

.task-card.is-over  { background: var(--card); }
.task-card.is-closed { opacity: .58; }

/* ドラッグ中：原典 rotated_elements の傾きを使う */
.task-card.dragging {
  opacity: .9;
  transform: rotate(-1deg);
  box-shadow: 8px 8px 0 var(--electric);
  border-style: dashed;
}
/* 落下位置は electric の太い線で示す */
.task-card.drop-before { box-shadow: 0 -6px 0 0 var(--electric), 4px 4px 0 var(--ink); }
.task-card.drop-after  { box-shadow: 0  6px 0 0 var(--electric), 4px 4px 0 var(--ink); }

/* ------------------------------------------------ 1段目：タスク名 */
.card-title {
  font-family: var(--font-body);
  font-size: 17px;
  font-weight: 700;
  line-height: 1.35;
  color: var(--text);
  text-decoration: none;
  letter-spacing: .01em;
}
.card-title:hover {
  color: var(--text);
  text-decoration: none;
  box-shadow: inset 0 -8px 0 var(--electric);
}

/* ------------------------------------------------ 2段目：大タスクへのリンク */
.card-meta-line { margin-top: 5px; }

.proj-link {
  font-family: var(--font-body);
  font-size: 13px;
  font-weight: 500;
  color: var(--sub);
  text-decoration: none;
  border-bottom: 1px solid var(--border);
  padding-bottom: 1px;
  transition: color .15s ease, border-color .15s ease;
}
.proj-link::before {
  content: "in ";
  font-family: var(--font-num);
  font-size: 10px;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--c-todo);
}
/* マウスを乗せたら electric の太い下線。electric は文字色にしない */
.proj-link:hover,
.proj-link:focus-visible {
  color: var(--text);
  border-bottom: 2px solid var(--electric);
}
.proj-self { font-size: 12px; color: var(--c-todo); letter-spacing: .1em; }

/* ------------------------------------------------ 締め切り */
.cd {
  border: 2px solid var(--ink);
  border-radius: 0;
  background: var(--card);
  padding: 6px 8px;
}
/* ★クラス名は common.js の countdownHtml() が出すものに合わせること。
 *   .cd-num  数字      .cd-unit 単位（日/時間/分）
 *   .cd-sub  端数      状態は .cd-far / .cd-near / .cd-soon /
 *                      .cd-today / .cd-urgent / .cd-over / .cd-none */
.cd-num {
  font-family: var(--font-num);
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  letter-spacing: -.02em;
}
.cd-unit, .cd-sub {
  font-family: var(--font-num);
  font-size: 11px;
  letter-spacing: .08em;
  color: var(--sub);
}

/* 余裕 → 無彩色 / 間近 → violet / 超過・5時間切り → coral */
.cd-far, .cd-near, .cd-none { color: var(--text); }
.cd-far .cd-num, .cd-near .cd-num { color: var(--text); }

.cd-soon, .cd-today {
  border-color: var(--c-accent);
  background: var(--c-accent-bg);
  color: var(--c-accent-dk);
}
.cd-soon .cd-num,  .cd-today .cd-num,
.cd-soon .cd-unit, .cd-today .cd-unit,
.cd-soon .cd-sub,  .cd-today .cd-sub { color: var(--c-accent-dk); }

.cd-urgent, .cd-over {
  border-color: var(--coral);
  background: var(--c-red-bg);
  color: var(--c-red-dk);
}
.cd-urgent .cd-num,  .cd-over .cd-num,
.cd-urgent .cd-unit, .cd-over .cd-unit,
.cd-urgent .cd-sub,  .cd-over .cd-sub { color: var(--c-red-dk); }

.meta-due { font-size: 12px; letter-spacing: .04em; color: var(--sub); }
.meta-due-over { color: var(--c-red-dk); font-weight: 700; }

/* ------------------------------------------------ コメント：付箋 */
/* 原典 numbering_system（40px 四角・下地 electric）と
   rotated_elements（rotate(-1deg)）を合わせて「付箋」にした。
   丸数字をやめたので、やる順の番号と読み違えられない */
.cmt-badge {
  position: absolute;
  top: -9px; left: -9px;
  min-width: 28px; height: 26px;
  padding: 0 6px;
  display: grid; place-items: center;
  background: var(--electric);
  color: var(--ink);
  border: 2px solid var(--ink);
  border-radius: 0;
  box-shadow: 2px 2px 0 var(--ink);
  font-family: var(--font-num);
  font-size: 13px; font-weight: 700;
  text-decoration: none;
  transform: rotate(-2deg);
  transition: transform .15s ease;
}
.cmt-badge::after {
  content: "";
  position: absolute; right: -2px; bottom: -2px;
  border: 5px solid transparent;
  border-right-color: var(--card);
  border-bottom-color: var(--card);
}
.cmt-badge:hover { transform: rotate(-2deg) scale(1.1); }
/* コメントが来ている行は左の帯を electric にする。
   ::after は使わない（上と同じ理由） */
.task-card.has-cmt { border-left-color: var(--c-cmt-dk); }

/* ------------------------------------------------ ラベル：付箋の見え方 */
.label-chip {
  border: 1px solid var(--ink);
  border-radius: 0;
  background: var(--card);
  color: var(--text);
  font-size: 11px;
  letter-spacing: .04em;
  padding: 3px 8px;
  transform: rotate(-1deg);
  box-shadow: 1px 1px 0 var(--ink);
}

/* ------------------------------------------------ タブ：electric の下線 */
.vtab {
  background: transparent;
  border: 0;
  border-bottom: 3px solid transparent;
  border-radius: 0;
  padding: 6px 2px;
  margin-right: 22px;
  font-family: var(--font-body);
  font-size: 15px;
  font-weight: 500;
  color: var(--sub);
  letter-spacing: .04em;
  box-shadow: none;
}
.vtab:hover { color: var(--text); }
.vtab-on {
  color: var(--text);
  font-weight: 700;
  background: transparent;
  border-bottom: 3px solid var(--electric);
  box-shadow: none;
}

/* ------------------------------------------------ 絞り込み：四角い枠 */
.chip {
  border: 1px solid var(--border);
  border-radius: 0;
  background: var(--card);
  color: var(--sub);
  font-size: 12px;
  letter-spacing: .04em;
  padding: 5px 11px;
  box-shadow: none;
}
.chip:hover { border-color: var(--ink); color: var(--text); }
.chip-on {
  border-color: var(--ink);
  color: var(--text);
  font-weight: 700;
  background: var(--card);
  box-shadow: inset 0 -4px 0 var(--electric);
}

/* ------------------------------------------------ ボタン */
.btn {
  border-radius: 0;
  font-family: var(--font-body);
  letter-spacing: .04em;
  box-shadow: none;
  transition: transform .12s ease, box-shadow .12s ease;
}
.btn-primary {
  background: var(--ink);
  color: var(--card);
  border: 2px solid var(--ink);
  box-shadow: 3px 3px 0 var(--electric);
}
.btn-primary:hover {
  background: var(--ink);
  transform: translate(-2px, -2px);
  box-shadow: 5px 5px 0 var(--electric);
}
.btn-ghost, .btn-sub {
  background: var(--card);
  color: var(--text);
  border: 2px solid var(--ink);
  box-shadow: 2px 2px 0 var(--ink);
}
.btn-ghost:hover, .btn-sub:hover {
  transform: translate(-1px, -1px);
  box-shadow: 4px 4px 0 var(--ink);
}
.btn-del {
  background: transparent;
  border: 0;
  color: var(--c-todo);
  font-size: 17px;
  box-shadow: none;
}
.btn-del:hover { color: var(--c-red-dk); background: transparent; }

/* ------------------------------------------------ 見出し・ヘッダー */
.app-header {
  background: var(--card);
  border-bottom: 2px solid var(--ink);
  box-shadow: none;
  border-radius: 0;
}
.app-logo {
  font-family: var(--font-body);
  font-weight: 900;
  letter-spacing: -.01em;
  color: var(--text);
  background: none;
  -webkit-text-fill-color: currentColor;
}
.panel, .card, .box, .side-box {
  border: 2px solid var(--ink);
  border-radius: 0;
  background: var(--card);
  box-shadow: 4px 4px 0 var(--ink);
}
.section-title, .panel-title, h1, h2, h3 {
  font-family: var(--font-body);
  letter-spacing: .01em;
  color: var(--text);
}

/* セクションの上に置く小さな英字ラベル。原典 sections.title_style */
.kicker {
  font-family: var(--font-num);
  font-size: 10.5px;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--sub);
}

/* ------------------------------------------------ 入力欄 */
input[type="text"], input[type="password"], input[type="date"],
input[type="datetime-local"], input[type="number"], select, textarea {
  border: 2px solid var(--ink);
  border-radius: 0;
  background: var(--card);
  color: var(--text);
  font-family: var(--font-body);
  box-shadow: none;
}
input:focus, select:focus, textarea:focus {
  outline: 2px solid var(--electric);
  outline-offset: 1px;
  border-color: var(--ink);
  box-shadow: none;
  transform: none;
}
.status-select {
  border: 1px solid var(--ink);
  border-radius: 0;
  font-size: 12px;
  padding: 3px 6px;
}

/* ------------------------------------------------ バッジ・コメント吹き出し */
.badge {
  border-radius: 0;
  border: 1px solid var(--sc, var(--ink));
  background: var(--card);
  color: var(--text);
  font-size: 11px;
  letter-spacing: .06em;
  box-shadow: none;
}
.comment {
  border: 2px solid var(--ink);
  border-radius: 0;
  background: var(--card);
  box-shadow: 3px 3px 0 var(--ink);
}
.comment::after { display: none; }
.comment-who { font-weight: 700; }
.comment-at { font-family: var(--font-num); font-size: 11px; letter-spacing: .06em; }

/* ------------------------------------------------ フォーカス（原典の指定） */
:focus-visible { outline: 2px solid var(--electric); outline-offset: 2px; }

/* ------------------------------------------------ 動きを減らす設定 */
@media (prefers-reduced-motion: reduce) {
  .task-card, .btn, .cmt-badge { transition: none; animation: none; }
  .task-card:hover, .btn:hover { transform: none; }
}

/* ============================================================================
 * 2026-09-03 追記：横スクロール停止 と ヘッダーの右揃え
 * ----------------------------------------------------------------------------
 * 直した症状
 *   ① タブ「プロジェクトごと」を押すと画面が右にずれる
 *   ② 「優先度順で見る」を押すと画面が右にずれる
 *   ③ ヘッダーの「みんな／設定／ログアウト」が右端に来ない
 *
 * ①② の原因（2つ重なっていた）
 *   (a) ページに横スクロールできる余地があると、ボタンにフォーカスが当たった
 *       瞬間にブラウザが「見える位置まで運ぶ」動作をする。左端の「やる順」で
 *       起きず、右側の2つだけで起きるのがその証拠。
 *   (b) スイッチをオンにすると注記「表示だけ・保存されません」が横に生えて
 *       見出し行が伸びる。伸びたぶんが画面外に出る。
 *
 * ③ の原因
 *   .app-header は body の直下なので body > * の max-width:940px を受ける。
 *   一方 .board-wrap は自前で max-width:1240px を持つため上書きされない。
 *   結果ヘッダーだけ 940px で頭打ちになり、本文より内側で終わっていた。
 *   さらに /boards・/settings・/tasks/<id> の3画面には検索欄が無いため、
 *   余白を吸う要素が無く、ナビが左に寄ったままになっていた。
 * ========================================================================== */

/* -------------------------------------------------------------- ① 横スクロール停止
 * overflow-x: hidden ではなく clip を使う。
 *   hidden … スクロール枠を作るので、JS やブラウザからは動かせてしまう
 *   clip   … スクロール枠そのものを作らないので逃げ道が無くなる
 * clip はスクロール枠を作らないため、ヘッダーの position:sticky も効いたまま。
 * （縦は触らない。overflow-y は visible のまま残す） */
html { overflow-x: clip; }
body { overflow-x: clip; }

/* -------------------------------------------------------------- ③ ヘッダー
 * body > * の 940px を外して、本文（.board-wrap）と同じ 1240px に揃える。
 * .app-header 自身は左右 -20px の負のマージンで画面幅いっぱいに広げ、
 * 中身の .app-header-inner だけを 1240px で中央に置く。 */
.app-header { max-width: none; }
.app-header-inner { max-width: 1240px; margin: 0 auto; }

/* 余った幅を全部ナビの左側に吸わせる。
 * 検索欄が無い画面（みんな・設定・タスク詳細）でもナビが右端に張り付く。 */
.app-nav { margin-left: auto; }

/* -------------------------------------------------------------- ②(b) 注記の位置
 * 横に生やすのをやめて、スイッチの次の行に置く。
 * flex-basis:100% で必ず改行させるので、オンにしても行の幅は変わらず
 * 高さだけが変わる。→ 画面外にはみ出さない。 */
.peek-note {
  flex-basis: 100%;
  white-space: normal;   /* nowrap をやめる。折り返せるようにする */
  margin-top: 2px;
  line-height: 1.4;
}

/* -------------------------------------------------------------- 折り返しの保険
 * 見出し行の中の部品が1行に収まらないとき、はみ出す前に折り返させる。 */
.vtab-row  { flex-wrap: wrap; }
.peek-wrap { max-width: 100%; }

/* -------------------------------------------------------------- カードのはみ出し防止
 * ラベル列が auto なので、長いラベルが並ぶとカードの外へ押し出していた。
 * 縮める余地（minmax の下限 0）を与えて、行の中で折り返させる。 */
.card-row { grid-template-columns: auto minmax(0, 1fr) minmax(0, auto) 28px; }
.label-chips { flex-wrap: wrap; min-width: 0; }

/* -------------------------------------------------------------- 狭い画面のナビ
 * ナビが2行に折り返すとヘッダーの高さが崩れるので、
 * 先に文字を落としてアイコンだけにする。 */
@media (max-width: 720px) {
  .app-nav .icon-label { display: none; }
  .icon-btn { padding: 6px 9px; }
}
@media (max-width: 520px) {
  /* 検索欄を2段目に下げる。ナビは1段目の右端に残す */
  .app-header-inner { flex-wrap: wrap; height: auto; padding: 10px 0; row-gap: 8px; }
  .app-search { order: 3; flex-basis: 100%; }
  .app-search input { max-width: none; }
}

/* ==========================================================================
   タスク詳細のツリー行 — 2026-09-03 作り直し
   --------------------------------------------------------------------------
   直した症状（スクリーンショットのとおり）
     ・カウントダウンの箱が枠からあふれ、タスク名が右へ押し出されて
       「Postgr…」のように切れていた
     ・その結果 ＋子 と × が右端で見切れていた
     ・コメント数が「💬 0」の小さな文字で、一覧の付箋と揃っていなかった

   原因
     .cd は 3 か所で定義されていて、最後（テーマ適用時）に
         width: 88px / min-height: 58px / .cd-num 30px
     まで大きくした。これは一覧のカード向けの寸法だが .card-row に
     限定しなかったので、ツリー行にもそのまま効いていた。
     一方 .tree-row のグリッドはカウントダウンに 52px しか渡していないため、
     36px ぶんはみ出して以降の列を全部右へ押していた。

   直し方
     ・グリッドをやめて flex にする。並ぶ要素が編集権限で増減するので、
       列番号を固定しない方が崩れない
     ・伸縮するのはタスク名だけ（min-width: 0）。ここが 0 まで縮むので
       行が枠を越えない ＝ 見切れが起きない
     ・付箋は行の上へはみ出して上の行に重なるが、これは許容（指示による）。
       重なりを避けたいのはタスク名・優先度・状態の 3 つだけ
     ・カウントダウンはツリー用に小さくする（一覧側の寸法は変えない）
   ========================================================================== */

/* 付箋がはみ出すので、囲みは切り取らない */
.task-tree, .tree-node, .tree-children { overflow: visible; }

/* 行間は元の 6px のまま詰めておく（付箋が上の行に重なるのは許容する方針）。
   付箋を切り取らないように、囲みの overflow だけ visible にしてある。 */
.task-tree     { gap: 6px; }
.tree-node     { gap: 6px; }
/* 字下げは詰める。ここを削るとタスク名に使える横幅がそのぶん増える */
.tree-children { gap: 6px; margin-left: 14px; padding-left: 12px; }

/* ---- 行本体 -------------------------------------------------------------- */
.tree-row {
  position: relative;          /* 付箋の位置の基準 */
  overflow: visible;
  display: flex;               /* grid をやめる。要素が増減しても崩れない */
  align-items: center;
  gap: 10px;
  padding: 10px 12px;
}

/* ---- 付箋（コメント数）：一覧のカードと同じ .cmt-badge を使う ------------ */
.tree-row > .cmt-badge {
  top: -10px;
  left: -8px;
  z-index: 3;
  border: 2px solid var(--ink);   /* 一覧側の白枠ではなく ink。行の枠と揃える */
  cursor: pointer;
  font-family: var(--font-num);
}
/* コメントが来ている行は左の帯を目印にする（一覧と同じ考え方） */
.tree-row.has-cmt { border-left-color: var(--c-cmt-dk); }

/* ---- つまむ部分 ---------------------------------------------------------- */
.tree-grip { flex: 0 0 auto; }

/* ---- カウントダウン：ツリー用に小さく ------------------------------------ */
/* ここだけ寸法を上書きする。マイタスク一覧の大きい表示は触らない */
.tree-row .cd {
  flex: 0 0 auto;
  width: 72px;
  min-height: 44px;
  padding: 4px;
}
.tree-row .cd-num  { font-size: 20px; letter-spacing: -.5px; }
.tree-row .cd-unit { font-size: 10px; }
.tree-row .cd-sub  { font-size: 10px; }

/* ---- タスク名＋メタ：ここだけが伸び縮みする ------------------------------ */
.tree-body {
  flex: 1 1 auto;
  min-width: 0;                /* 0 まで縮める。これが無いと行があふれる */
  display: flex;
  flex-direction: column;
  gap: 4px;
  align-items: flex-start;
}
/* 名前は左詰め・太字。1段目の主役 */
.tree-row .tree-title {
  max-width: 100%;
  font-size: 15px;
  font-weight: 700;
  letter-spacing: .01em;
}
/* 2段目。優先度と状態を小さく従える */
.tree-meta {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  min-width: 0;
}
.tree-row .tree-status {
  width: auto;                 /* 元は 100%。flex の中で伸びきってしまう */
  font-size: 11px;
  padding: 3px 7px;
  border-width: 1px;
}

/* ---- ＋（子タスクを追加）------------------------------------------------- */
/* 「＋子」の文字をやめて四角い ＋ ボタンに。右下の追加ボタンと同じ考え方
   （electric の塗り・ink の枠・ink の硬い影） */
.tree-add {
  flex: 0 0 auto;
  width: 28px; height: 28px; padding: 0;
  display: grid; place-items: center;
  background: var(--electric);
  color: var(--ink);
  border: 2px solid var(--ink);
  border-radius: 0;
  box-shadow: 2px 2px 0 var(--ink);
  font-size: 15px; font-weight: 700; line-height: 1;
  transition: transform .15s, box-shadow .15s;
}
.tree-add:hover {
  background: var(--electric);
  transform: translate(-1px, -1px);
  box-shadow: 3px 3px 0 var(--ink);
}
.tree-add:active {
  transform: translate(1px, 1px);
  box-shadow: 1px 1px 0 var(--ink);
}

/* ---- ×：常に一番右 ------------------------------------------------------- */
.tree-row .tree-del {
  flex: 0 0 auto;
  margin-left: 2px;
  justify-self: auto;          /* grid 時代の指定を打ち消す */
}

/* ---- 画面が狭いとき ------------------------------------------------------ */
@media (max-width: 1100px) {
  .tree-row { gap: 8px; }
  .tree-row .cd { width: 64px; min-height: 40px; }
  .tree-row .cd-num { font-size: 18px; }
}
@media (max-width: 760px) {
  /* flex なので列指定は不要。字下げだけ詰めて横幅を稼ぐ */
  .tree-children { margin-left: 8px; padding-left: 8px; }
  .tree-row .tree-title { font-size: 14px; }
  /* 優先度は隠す。状態は残す（操作できる方を優先） */
  .tree-row .tree-prio { display: none; }
  .tree-row .tree-status-col { display: flex; }
}

/* ==========================================================================
   ツリー行を「マイタスク一覧のカード」と同じ見た目に揃える — 2026-09-03
   --------------------------------------------------------------------------
   方針
     大プロジェクト内のタスクも、一覧のカードと見た目を変えない。
     違うのは「情報量」だけ。一覧にある大タスクへのリンクと期限の文字は
     ツリーでは出さない（親子はインデントで分かり、締切は左の箱にある）。

   一覧の .task-card から持ってきたもの
     ・2px の ink の枠、角丸なし、4px ずらした硬い影
     ・状態は左の 6px の帯で示す
     ・ホバーで左上へ 3px 動いて影が伸びる
     ・つまむと -1deg 傾いて枠が破線、影が electric
     ・落下位置は electric の 6px の線
     ・タスク名は太字。ホバーで下に electric の下線が入る

   ツリー側だけの扱い
     ・行間は影のぶん（4px）を見込んで 10px 空ける。詰めると下の行の枠に
       影が重なって濁る
     ・付箋は行の上へ 10px はみ出して上の行に重なる。これは許容（指示による）
   ========================================================================== */

.tree-row {
  background: var(--card);
  border: 2px solid var(--ink);
  border-left: 6px solid var(--c-todo);
  border-radius: 0;
  box-shadow: 4px 4px 0 var(--ink);
  padding: 11px 13px;
  transition: transform .15s ease, box-shadow .15s ease;
}
.tree-row:hover {
  border-color: var(--ink);
  transform: translate(-3px, -3px);
  box-shadow: 7px 7px 0 var(--ink);
}

/* 状態の帯。割り当ては一覧の .task-card と同じ */
.tree-row.is-closed { border-left-color: var(--c-done); opacity: .58; }
.tree-row.is-over   { border-left-color: var(--coral); background: var(--card); }
.tree-row.has-cmt   { border-left-color: var(--c-cmt-dk); }

/* 選択中（右のメモ・コメントの対象）は影の色で示す。
   背景を変えると帯の色が読みにくくなるので背景は白のまま */
.tree-row.tree-current {
  border-color: var(--ink);
  background: var(--card);
  box-shadow: 4px 4px 0 var(--electric);
}

.tree-row.dragging {
  opacity: .9;
  transform: rotate(-1deg);
  border-style: dashed;
  box-shadow: 8px 8px 0 var(--electric);
}
.tree-row.drop-before { box-shadow: 0 -6px 0 0 var(--electric), 4px 4px 0 var(--ink); }
.tree-row.drop-after  { box-shadow: 0  6px 0 0 var(--electric), 4px 4px 0 var(--ink); }

/* タスク名。一覧の .card-title と同じ見せ方（枠が狭いので 1px だけ小さく）。
   「Postgr…」のように切らず、折り返す。切ると何のタスクか読めない */
.tree-row .tree-title {
  font-family: var(--font-body);
  font-size: 16px;
  font-weight: 700;
  line-height: 1.35;
  color: var(--text);
  letter-spacing: .01em;
  white-space: normal;
  overflow: visible;
  text-overflow: clip;
  overflow-wrap: anywhere;
  text-decoration: none;
}
.tree-row .tree-title:hover {
  color: var(--text);
  text-decoration: none;
  box-shadow: inset 0 -8px 0 var(--electric);
}

/* 影が下の行の枠に重ならないよう、行間を影のぶんだけ空ける */
.task-tree     { gap: 10px; }
.tree-node     { gap: 10px; }
.tree-children { gap: 10px; }

/* 親子をつなぐ線も硬い線にする（破線はテーマに合わない） */
.tree-children { border-left: 2px solid var(--border); }

/* ==========================================================================
 * ＋ボタンの見た目を3種で統一（2026-09-03）
 *
 * これまで別々の色だった：
 *   .fab       右下の追加（60px） … electric に修正済み
 *   .tree-add  子タスク追加（28px）… electric に修正済み
 *   .btn-round グループ／メンバー追加（34px）← ここだけ --c-doing のまま黒く見えていた
 *
 * 3種に共通させるルール（サイズだけ変える）
 *   ・背景  electric
 *   ・文字  ink（electric 上で 13.49:1。#fff は 1.41:1 で読めない）
 *   ・枠    2px solid ink（electric は白地に 1.41:1 なので枠がないと輪郭が溶ける）
 *   ・影    ink の硬い影。距離をサイズに比例させる（28px→2px / 34px→3px / 60px→6px）
 *   ・角丸  0
 * ========================================================================== */
.btn-round {
  background: var(--electric);
  color: var(--ink);
  border: 2px solid var(--ink);
  border-radius: 0;
  box-shadow: 3px 3px 0 var(--ink);
  transition: transform .15s, box-shadow .15s;
}
/* 硬い影なので、動かす距離と影の距離で押下感を出す（色は変えない） */
.btn-round:hover {
  background: var(--electric);
  transform: translate(-1px, -1px);
  box-shadow: 4px 4px 0 var(--ink);
}
.btn-round:active {
  transform: translate(1px, 1px);
  box-shadow: 1px 1px 0 var(--ink);
}

/* メンバー候補チップの中の「＋」は文字なので、押せる色（electric）ではなく
   ink のままにする。electric は白地に 1.41:1 で文字として読めない。 */
.cand-plus { color: var(--ink); }

/* ============================================================================
   並び替え依頼（提案）機能              2026-09-03 追加
   ----------------------------------------------------------------------------
   色は増やしていない。
     ・electric（--c-cmt）＝ 対話。コメントに割り当てた色をそのまま使う
                             提案も「意見を伝える」ものなので同じ領域に入れる
     ・violet と coral は締め切り専用のまま。ここでは一切使わない
     ・上がった／下がったの区別は色ではなく ▲▼ の記号で出す
   形も既存の割り当てに従う。
     ・塗り     ＝ 実行して保存する（保存して依頼／統合する）
     ・枠線だけ ＝ 実行しない（編集／やめる／今はしない）
=========================================================================== */

/* ------------------------------------------------- ① OJT 側：提案バー */

.propose-bar {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  flex-wrap: wrap;
  margin: 0 0 14px;
  padding: 12px 14px;
  background: var(--bg);
  border: 2px solid var(--border);
}

/* 編集モードに入ったら枠を electric にして、いま触れる状態だと分かるようにする */
.propose-bar.propose-on {
  border-color: var(--c-cmt);
  box-shadow: var(--shadow-sm);
}

.propose-bar-main { flex: 1 1 240px; min-width: 0; }

.propose-bar-title {
  display: block;
  font-size: 13px;
  font-weight: 700;
  color: var(--text);
  margin: 0 0 3px;
}

.propose-bar-note {
  display: block;
  font-size: 12px;
  line-height: 1.7;
  color: var(--sub);
}

.propose-btns { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }

/* 実行して保存するので塗り。electric の上に載せる文字は ink（13.49:1） */
.btn-propose-save {
  font: inherit;
  font-size: 13px;
  font-weight: 700;
  padding: 8px 16px;
  border: 2px solid var(--ink);
  border-radius: var(--radius);
  background: var(--c-cmt);
  color: var(--ink);
  box-shadow: var(--shadow-sm);
  cursor: pointer;
}
.btn-propose-save:hover:not(:disabled) {
  box-shadow: var(--shadow-md);
  transform: translate(-2px, -2px);
}
.btn-propose-save:active:not(:disabled) { box-shadow: none; transform: translate(0, 0); }
.btn-propose-save:disabled { opacity: .45; cursor: not-allowed; box-shadow: none; }

/* 保存しないので枠線だけ */
.btn-propose-edit,
.btn-propose-cancel {
  font: inherit;
  font-size: 13px;
  padding: 7px 14px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg);
  color: var(--sub);
  cursor: pointer;
}
.btn-propose-edit:hover,
.btn-propose-cancel:hover { border-color: var(--ink); color: var(--text); }

.btn-propose-edit[hidden],
.btn-propose-save[hidden],
.btn-propose-cancel[hidden] { display: none; }

.propose-msg-wrap { flex: 1 1 100%; }
.propose-msg-wrap[hidden] { display: none; }

.propose-msg-wrap textarea {
  width: 100%;
  font: inherit;
  font-size: 13px;
  padding: 8px 10px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg);
  color: var(--text);
  resize: vertical;
  min-height: 56px;
}
.propose-msg-wrap textarea:focus {
  outline: none;
  border-color: var(--c-cmt);
  box-shadow: 0 0 0 3px var(--c-cmt-bg);
}
.propose-msg-wrap .field-note { margin: 5px 0 0; }

/* 編集モード中のカード。つまめることが分かるように持ち手を出す */
.task-card.propose-draggable { cursor: grab; }
.task-card.propose-draggable:hover { box-shadow: var(--shadow-md); }
body.propose-editing #order-list .task-card { border-style: solid; }

/* --------------------------------------- ② 新人側：依頼の知らせ */

.reorder-requests { display: flex; flex-direction: column; gap: 8px; margin: 0 0 12px; }
.reorder-requests[hidden] { display: none; }

/* コメントと同じ種類の知らせなので見た目を揃える。
   ただし押すと確認画面が開く別物なので、左に鉛筆の印を置いて区別する */
.reorder-req {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  text-align: left;
  font: inherit;
  padding: 10px 11px;
  border: 2px solid var(--c-cmt);
  border-radius: var(--radius);
  background: var(--c-cmt-bg);
  color: var(--text);
  box-shadow: var(--shadow-sm);
  cursor: pointer;
}
.reorder-req:hover { transform: translate(-2px, -2px); box-shadow: var(--shadow-md); }
.reorder-req:active { transform: translate(0, 0); box-shadow: none; }

.rq-mark { flex: 0 0 auto; font-size: 15px; color: var(--c-cmt-dk); }
.rq-main { flex: 1 1 auto; min-width: 0; }

.rq-title {
  display: block;
  font-size: 13px;
  font-weight: 700;
  color: var(--c-cmt-dk);
}
.rq-msg {
  display: block;
  font-size: 12px;
  line-height: 1.6;
  color: var(--text);
  margin-top: 2px;
  overflow-wrap: anywhere;
}
.rq-who { display: block; font-size: 11px; color: var(--sub); margin-top: 3px; }
.rq-go { flex: 0 0 auto; font-size: 18px; color: var(--c-cmt-dk); }

/* ------------------------------------- ② 新人側：差分ポップアップ */

/* 左右に並べるので、通常のポップアップより広くする */
.modal-box-wide { max-width: 860px; width: min(96vw, 860px); }

.diff-who { font-size: 13px; font-weight: 700; color: var(--text); margin: 0 0 4px; }

.diff-msg {
  font-size: 13px;
  line-height: 1.7;
  color: var(--text);
  margin: 0 0 12px;
  padding: 9px 11px;
  border-left: 3px solid var(--c-cmt);
  background: var(--c-cmt-bg);
  overflow-wrap: anywhere;
}
.diff-msg[hidden] { display: none; }

.diff-summary {
  font-size: 12px;
  color: var(--sub);
  margin: 0 0 10px;
  padding-bottom: 8px;
  border-bottom: 1px solid var(--border);
}

.diff-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }

.diff-col { min-width: 0; }

.diff-col-head {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .08em;
  color: var(--sub);
  margin: 0 0 7px;
}
.diff-col-after .diff-col-head { color: var(--c-cmt-dk); }

.diff-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 4px;
  max-height: 46vh;
  overflow-y: auto;
}

.diff-line {
  display: flex;
  align-items: center;
  gap: 9px;
  padding: 7px 9px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg);
  font-size: 13px;
}

.dl-no {
  flex: 0 0 auto;
  min-width: 20px;
  font-family: var(--font-num);
  font-size: 13px;
  font-weight: 700;
  color: var(--sub);
  text-align: right;
}
.dl-title { flex: 1 1 auto; min-width: 0; overflow-wrap: anywhere; }

.dl-mark {
  flex: 0 0 auto;
  font-family: var(--font-num);
  font-size: 11px;
  font-weight: 700;
  color: var(--c-cmt-dk);
}

/* 位置が動く行。変更前は薄く、変更後は electric で示す。
   上がった／下がったの区別は ▲▼ の記号で出しているので、色は分けない */
.diff-line.dl-moved { border-style: dashed; color: var(--sub); }
.diff-line.dl-up,
.diff-line.dl-down {
  border-color: var(--c-cmt);
  background: var(--c-cmt-bg);
  font-weight: 500;
}

.diff-actions-note { font-size: 11px; color: var(--sub); margin: 12px 0 0; line-height: 1.7; }

/* 見送りは戻せない操作なので、実行ボタンから離して左端に置く */
.modal-actions-split { justify-content: space-between; }

@media screen and (max-width: 640px) {
  .diff-cols { grid-template-columns: 1fr; }
  .diff-list { max-height: 30vh; }
}

/* ============================================================================
   「コメントで伝える」                                        2026-09-03 追加
   ----------------------------------------------------------------------------
   他者のボードのカードから、その場でコメントを送る機能。
   色は増やしていない。コメントは --c-cmt（濃い水色）で統一する。
   締め切りの violet / coral とぶつけないため、ここでは黄と赤を使わない。
   形は「塗り＝実行」「角丸なし」「硬い影」の既定に合わせる。
=========================================================================== */

/* ---------------------------------------------- カード内の「コメント」ボタン
   .task-card は position:relative の普通のブロック。
   グリッドである .card-row の中には入れない（列が増えて崩れるため）。      */
.card-cmt-line {
  display: flex;
  justify-content: flex-end;
  margin-top: 8px;
}

.btn-card-cmt {
  font: inherit;
  font-family: var(--font-body);
  font-size: 12px;
  font-weight: 500;
  padding: 4px 11px;
  border-radius: 0;                    /* 丸は「押せないラベル」に予約している */
  border: 1px solid var(--c-cmt-dk);
  background: var(--card);
  color: var(--c-cmt-dk);
  cursor: pointer;
  transition: background .12s ease, box-shadow .12s ease, transform .12s ease;
}

.btn-card-cmt::before {
  content: "\FF0B";                    /* 全角プラス。付箋の数字と役割を分ける */
  font-family: var(--font-num);
  font-size: 11px;
  margin-right: 5px;
}

.btn-card-cmt:hover {
  background: var(--c-cmt-bg);
  box-shadow: var(--shadow-sm);
  transform: translate(-1px, -1px);
}

.btn-card-cmt:active { box-shadow: none; transform: translate(0, 0); }

.btn-card-cmt:focus-visible {
  outline: 2px solid var(--c-cmt-dk);
  outline-offset: 2px;
}

/* 並び替えの編集モード中は隠す。つまんでいる最中に押せると
   どちらの操作をしているのか分からなくなる */
body.propose-editing .card-cmt-line { display: none; }

/* 付箋は「読む」ための入口でもあるので、押せることを示す */
.cmt-badge { cursor: pointer; }

/* ---------------------------------------------------- ポップアップの中身 */

.cmt-target {
  margin: 0 0 12px;
  padding: 8px 11px;
  background: var(--c-cmt-bg);
  border-left: 4px solid var(--c-cmt-dk);
  font-size: 14px;
  font-weight: 700;
  color: var(--ink);
  overflow-wrap: anywhere;
}

/* これまでのやり取り。件数が増えても高さが暴れないよう上限を決めて中で送る */
.cmt-thread {
  max-height: 236px;
  overflow-y: auto;
  margin-bottom: 14px;
  padding-right: 4px;
}

.cmt-item {
  border: 1px solid var(--border);
  border-left: 3px solid var(--border);
  background: var(--card);
  padding: 8px 10px;
  margin-bottom: 8px;
}

/* 自分の投稿だけ左の線を濃い水色にする。誰の発言かを色で足さず、
   「自分か／相手か」の1点だけ示す */
.cmt-item.cmt-mine {
  border-left-color: var(--c-cmt-dk);
  background: var(--c-cmt-bg);
}

.cmt-item-head {
  display: flex;
  align-items: center;
  gap: 9px;
  margin-bottom: 4px;
}

.cmt-who  { font-size: 12px; font-weight: 700; color: var(--ink); }

.cmt-at {
  font-family: var(--font-num);
  font-size: 11px;
  letter-spacing: .06em;
  color: var(--sub);
}

/* 削除は自分の投稿だけに出る。目立たせない */
.cmt-del {
  margin-left: auto;
  background: transparent;
  border: 0;
  font: inherit;
  font-size: 14px;
  line-height: 1;
  padding: 2px 4px;
  color: var(--sub);
  cursor: pointer;
}
.cmt-del:hover { color: var(--coral); }

.cmt-item-body {
  margin: 0;
  font-size: 13px;
  line-height: 1.7;
  color: var(--ink);
  white-space: pre-wrap;               /* 改行をそのまま活かす */
  overflow-wrap: anywhere;
}

.cmt-empty,
.cmt-loading {
  margin: 0;
  padding: 14px 4px;
  font-size: 12px;
  color: var(--sub);
  text-align: center;
}

/* 読み込みに失敗したときは黙って消えないようにする。
   原因が読めないと、どこで止まったのか追えない */
.cmt-load-error {
  margin: 0;
  padding: 9px 11px;
  border: 2px solid var(--coral);
  background: var(--c-over-bg);
  font-size: 12px;
  line-height: 1.7;
  color: var(--c-red-dk);
}

@media screen and (max-width: 560px) {
  .cmt-thread { max-height: 180px; }
  .card-cmt-line { justify-content: flex-start; }
}
