/* =============================================================================
   style.css — 画面の見た目（CSS）。最小限のひな型。
   CSSの基本: 「セレクタ { プロパティ: 値; }」で、どの部分をどう見せるかを指定する。
   想定: スマホ閲覧がメイン＋PCの大きい画面にも対応（レスポンシブ）。
   ============================================================================= */

/* =============================================================================
   ★デザイントークン（色の定義集）— ここが「色を変える唯一の場所」
   -----------------------------------------------------------------------------
   :root は「ページ全体」を指す特別な指定。ここで作った「--名前: 色;」は
   “変数（色に付けた名前）”で、下の各スタイルからは var(--名前) で呼び出す。
   ＝色を直接書かず、名前で参照する。こうすると…
     ・同じ色があちこちに散らばらない（1か所を直せば全部変わる）
     ・将来「デザインテーマ」を切り替えるのも、ここを差し替えるだけで済む
   （将来テーマを増やすときは、例えば <body class="theme-b"> を付けて
    「.theme-b { --color-primary: 別の色; … }」と上書きすれば画面全体が変わる。）

   色を調整したいときは、原則この :root の中の値だけを書き換えること。
   ============================================================================= */
:root {
  /* --- 機能色：ホームの各メニュー＝機能ごとの“固有色”（混ぜない） --- */
  --color-record:         #8cc152;  /* 記録＝緑 */
  --color-record-hover:   #7cb342;  /* 記録（マウスを乗せたとき少し濃く） */
  --color-record-bg:      #f3f9ec;  /* ごく薄い緑の背景（薄い青の --color-accent-bg の緑版） */
  --color-record-bg-hover:#e9f4dc;  /* 上の薄い緑の“マウスを乗せたとき”版（少し濃い） */
  --color-edit:           #f5c84b;  /* 編集＝黄 */
  --color-edit-hover:     #eebb2e;
  --color-edit-soft:      #fbe7b3;  /* 編集の淡い黄（編集画面の月ナビ帯・日付帯の背景） */
  --color-shipping:       #f48fb1;  /* 出荷＝ピンク */
  --color-shipping-hover: #ef79a3;
  --color-shipping-bg:      #fdf0f4;  /* ごく薄いピンクの背景（記録画面の --color-record-bg のピンク版） */
  --color-shipping-bg-hover:#fbe4ec;  /* 上の薄いピンクの"マウスを乗せたとき"版（少し濃い） */
  --color-shipping-text:   #ad1457;   /* ピンク系の濃いめ文字（記録画面の --color-success の役割のピンク版） */
  --color-settings:       #d4dade;  /* 設定＝グレー */
  --color-settings-hover: #c4ccd1;
  --color-stats:          #c3a6e0;  /* 統計＝紫 */
  --color-stats-hover:    #b28fd6;
  --color-stats-bg:       #f4eefa;  /* ごく薄い紫の背景（記録画面の --color-record-bg の紫版） */
  --color-stats-text:     #6b3f99;  /* 紫系の濃いめ文字（出荷画面の --color-shipping-text の紫版） */
  /* お客様情報＝khaki（くすんだ淡い黄土色）。ホーム画面のボタン色＆その画面の上部バーの色。 */
  --color-customer-info:       khaki;    /* #F0E68C */
  --color-customer-info-hover: #e6d977;  /* 上の色に触れたとき少し濃く */
  /* 農業日誌＝bisque（うすい肌色。2026-08-07 ユーザー決定）。ホームのボタン＆その画面の上部バーの色。
     とても淡い色なので、線・見出し・強調には濃い茶（下の2つ）を必ず組で使う
     （bisque 単体では文字や枠が背景に埋もれて読めないため）。 */
  --color-nikki:       bisque;   /* #FFE4C4 */
  --color-nikki-hover: #f7d3ab;  /* 上の色に触れたとき少し濃く */
  --color-nikki-deep:  #c98b4b;  /* bisque の濃い版（タブの下線・枠線・選択の印） */
  --color-nikki-bg:    #fff6ec;  /* ごく薄い地色（年の見出し帯・ナビ帯。--color-accent-bg の日誌版） */
  --color-nikki-text:  #8a5a2b;  /* 濃い茶の文字（bisque や薄い地の上に載せる。--color-stats-text の日誌版） */
  /* 原価の内訳（人件費／材料費）を色分けするための専用トークン。統計画面の円グラフ・積み上げ棒グラフで使う。
     以前は --color-stats と --color-stats-hover（同じ紫の濃淡）を流用していたが、濃淡だけの違いは
     見分けにくいとの指摘（2026-07-11）を受け、はっきり別の色相にした。階層4「コスト分析」でも
     同じ2色を再利用する想定のため、統計テーマ色ではなく役割名で定義する。 */
  --color-cost-labor:     var(--color-stats);  /* 人件費＝統計のテーマ色（紫）そのまま */
  --color-cost-material:  #3f9c8f;             /* 材料費＝紫の反対側に近いティール（緑がかった青） */

  /* --- 共通アクション色：ダイアログ・下部バーのボタン（全画面で同じ意味＝同じ色） --- */
  /* 決定／はい／OK／更新／記録＝主アクション。今回“青系”で統一。 */
  --color-primary:        #235e9c;  /* 主ボタンの色（やや明るい青） */
  --color-primary-hover:  #1d4f83;  /* 主ボタン（マウスを乗せたとき少し濃く） */
  --color-on-primary:     #fff;     /* 主ボタンの上に載る文字色（白） */
  /* キャンセル／いいえ＝副アクション（控えめなグレー）。 */
  --color-cancel:         #e0e0e0;
  --color-cancel-hover:   #d2d2d2;
  --color-on-cancel:      var(--text);     /* 副ボタンの文字色（濃いグレー） */
  /* 削除＝取り消せない危険操作（濃いピンク）。 */
  --color-danger:         #d05a7a;
  --color-danger-hover:   #bf4d6c;
  --color-on-danger:      #fff;

  /* --- 選択・強調色：カレンダーの選択日／チェックON／タブ選択 など ---
     主アクションと同じ青に統一して、アプリ全体の“青”を1色にそろえる。 */
  --color-accent:         var(--color-primary);  /* 選択・強調の青＝主ボタンと同じ色（別名。primaryを変えれば一緒に変わる） */
  --color-accent-soft:    #9db8d6;               /* 薄い青（枠・フォーカスの線） */
  --color-accent-bg:      #d9e6f5;               /* ごく薄い青（選択中の背景） */
  --color-accent-bg-hover:#c9dcee;               /* 上の薄い青の“マウスを乗せたとき”版（少し濃い） */
  --color-on-accent:      #fff;                  /* 青塗りの上の文字色（白） */

  /* --- 中立色：文字（濃い→薄いの3段階。役割で使い分ける） --- */
  --text:        #1b1b1b;  /* 通常の文字・見出し（濃い＝ほぼ黒） */
  --text-hint:   #555555;  /* 少し弱い文字・補足・ヒント（表の見出しなど） */
  --text-faint:  #999999;  /* さらに薄い文字・未選択の案内・無効時 */
  --color-on-label: #000;  /* 緑ラベル（--color-record 等）の上に載る黒文字 */

  /* --- 中立色：背景・面 --- */
  --bg:               #f7f7f7;  /* ページ全体の背景 */
  --surface-card:     #fff;     /* 白い面（カード・パネル・自作UI部品の地）。アプリ内の“白い箱”はこれに統一 */
  --surface-input:    #eceef0;  /* 入力欄の薄いグレー地（初期設定など） */
  --surface-disabled: #f0f0f0;  /* 無効な入力欄の地 */
  --hover-bg:         #f2f4f5;  /* ボタン/行にマウスを乗せたとき */
  --active-bg:        #e7eaec;  /* 押した瞬間 */

  /* --- 中立色：枠線 --- */
  --border:           #cfcfcf;  /* 標準の枠線 */
  --border-light:     #e2e4e7;  /* 薄い区切り線 */
  --border-input:     #bbb;     /* ダイアログの入力欄など、少し濃いめの枠 */

  /* --- 状態色：意味のある色（機能色とは別に、成功・エラー等を表す） --- */
  --color-error:        #c62828;  /* エラー・注意・危険を表す赤（アプリ内の"赤"はこれに統一）。日曜の色にも使う */
  --color-error-hover:  #ad2323;  /* 赤いボタンにマウスを乗せたとき（少し濃い赤） */
  --color-success:      #2e7d32;  /* 成功・マスターログイン中を表す緑（アプリ内の"濃い緑"はこれに統一） */
  --color-warn:         #b96b00;  /* 注意・警告を表す橙（success/error と並ぶ状態色。例：使用量が多め） */
  --color-warn-text:    #8a4e00;  /* 注意の数値などに使う、濃い橙の文字 */
  --color-warn-bg:      #fdf1e0;  /* ごく薄い橙の背景（注意バナー等の地。--color-record-bg 等の橙版） */
  --color-today:        var(--color-success);  /* カレンダーの「今日」＝成功緑と同じ（選択＝青と区別するため別名だけ持つ） */
  --color-saturday:     #1565c0;  /* 土曜（青） */
  --color-sun-bg:       #fdecec;  /* カレンダー日曜列の淡い赤背景 */
  --color-sat-bg:       #eaf1fb;  /* カレンダー土曜列の淡い青背景 */
  /* 予定超過（終了予定日を過ぎたのに完了していない作業計画）の行に敷く淡いピンク。
     「注意」の橙(--color-warn-bg)とは別の役割として持つ＝一覧の中で「期限切れの1項目」を
     ひと目で見分けるための地色。バッジ（設定画面の作業計画ボタン）と同じ状態を指す。 */
  --color-overdue-bg:       #fadfe8;  /* 予定超過の行の背景（淡いピンク） */
  --color-overdue-bg-hover: #f6cbda;  /* 同・マウスを乗せた／押したとき（少し濃いピンク） */

  /* --- 系列識別色：複数カテゴリ（野菜別・畑別など）を色分けして比べるグラフ専用の8色 ---
     2026-07-13新設。既存の機能色/状態色は「意味のある1色」だが、これは「区別するためだけの色」
     という別の役割のため新規カテゴリにした（似た色の重複ではなく、8色セットで1つの役割）。
     色の並び順は固定（隣同士が見分けやすい順）で、増減させない・並べ替えない。
     9系列目以降は個別の色を割り当てず「その他」としてまとめる（stats_calc.phpの集計側で処理）。 */
  --chart-series-1: #2a78d6;  /* 青 */
  --chart-series-2: #1baf7a;  /* 青緑 */
  --chart-series-3: #eda100;  /* 黄 */
  --chart-series-4: #008300;  /* 緑 */
  --chart-series-5: #4a3aa7;  /* 紫 */
  --chart-series-6: #e34948;  /* 赤 */
  --chart-series-7: #e87ba4;  /* ピンク */
  --chart-series-8: #eb6834;  /* 橙（8番目=「その他」用としても使う） */

  /* --- サイズ：文字・アイコンの大きさ（画面をまたいで使い回す“役割”ごとの大きさ） ---
     色と同じ考え方で、大きさも「名前」で管理する。生の px を各所に直書きせず、
     var(--名前) で参照する＝1か所直せば、同じ役割の場所がまとめて変わる。
     名前は「どの画面か」ではなく「どんな役割か」で付ける（他画面でも使い回せるように）。
     ※まずはホーム画面上部から導入。ほかの画面へは順次この名前に置き換えていく。 */

  /* 角丸（かどまる）を“役割ごと”に分けて持つ。名前で「どこに効くか」が分かるようにする。
     ＝デザインで「カードの角丸だけ変えたい」ときは --radius-card だけ直せばよい。
     ※メニューボタンは別役割として --btn-menu-radius、ゲージのバーは --gauge-radius に分けてある。
       極小部品(4px)は、他画面に着手するとき --radius-chip を追加予定。 */
  --radius-control: 8px;   /* 操作部品の角丸（ボタン・入力欄・タブなど） */
  --radius-card:    10px;  /* カード・パネルの角丸（情報を載せる箱） */
  --radius-dialog:  14px;  /* モーダル（<dialog>）の角丸。確認/カレンダー/時刻など全ポップアップ共通 */
  --radius-checkbox: 4.5px;  /* チェックボックスの角丸（一辺30pxの15%）。アプリ全体共通 */

  --font-display: 26px;  /* 画面で一番大きく見せる強調文字（例：ホーム上部の日付） */
  --font-note:    15px;  /* 補足・案内の小さめ文字（例：お知らせ、一覧の「データ無し」） */
  --font-hint:    13px;  /* さらに小さい補足・ヒント文（入力欄下の注意・使い方ヒント・？印の中の文字・ログインのラベル） */
  --font-input:   16px;  /* 入力欄・ボタン等の操作部品の文字（スマホ自動ズーム防止の下限。16px未満だとiPhone等で入力時に画面が拡大する） */
  --font-tab:     20px;  /* 画面上部の切り替えタブの文字（出荷画面の「出荷入力/精算記録/履歴」など）。操作部品より一回り大きく見せる */
  --font-genka-label: 20px;  /* 出荷画面の参考原価帯「参考原価」見出しの文字。帯の高さ（数字26px基準）を超えない範囲で大きめに */
  --font-unit:    15px;  /* 入力欄に添える単位テキストの文字（時間単価の「円」・手数料の「%」・素材の資材単位）。表とは役割が違うので --table-font とは別トークン */
  --table-font:   15px;  /* 表（データ一覧）のセル・見出しの文字（規格表など。他の表にも使い回せる汎用） */
  --icon-sm:      22px;  /* 小さめアイコンの一辺の大きさ（例：右上のログアウト） */
  --icon-sm-pad:  6px;   /* 小さめアイコンボタンの内側余白（指で押しやすくするため） */
  --help-mark-size: 20px; /* ？ヘルプ丸印の一辺（記録の.rate-help・野菜の.help-markで共通。--icon-sm 22pxより一回り小さい別部品） */

  /* メニューボタン（ホームの記録・編集・出荷・設定・統計）の大きさ一式。 */
  --btn-menu-h:      80px;  /* ボタンの高さ */
  --btn-menu-font:   22px;  /* ラベルの文字サイズ */
  --btn-menu-icon:   40px;  /* 左のアイコンの一辺の大きさ */
  --btn-menu-radius: 10px;  /* 角の丸み */
  --btn-menu-pad-x:  20px;  /* 左右の内側余白＝左端アイコンの位置もこの値にそろえる */

  /* 背の低いメニューボタン（マスターログイン・マスターログアウト）。
     メニューボタンより低め。角丸はメニューボタン共通（--btn-menu-radius）を流用する。 */
  --btn-menu-low-h:    54px;  /* 高さ（メニューボタン80pxより低い） */
  --btn-menu-low-font: 18px;  /* 文字サイズ */
  --btn-menu-low-icon: 32px;  /* 人型アイコンの大きさ */

  /* 縦の間隔（役割ごと）。名前で「何と何の間か」が分かるようにする。 */
  --section-gap: 16px;  /* 画面内で大きなブロック（カード・ボタン群など）を縦に積むときの間隔 */
  --btn-gap:     14px;  /* ボタンを縦に並べたときの、ボタン同士の間隔 */

  /* ゲージ（データベース使用量バーなどの“割合バー”）一式。
     状態色（正常＝--color-success／注意＝--color-warn／危険＝--color-error）は
     共通の状態色を使う。ここではゲージ固有のサイズと、土台・枠・レールの色だけを持つ。 */
  --gauge-font:   16px;      /* 見出し・数値の文字サイズ */
  --gauge-h:      12px;      /* 帯（ゲージ）の高さ＝太さ */
  --gauge-radius: 6px;       /* 帯の角丸 */
  --gauge-pad-y:     6px;     /* バー枠の上下の内側余白（高さ54pxに収める詰め） */
  --gauge-pad-x:    14px;     /* バー枠の左右の内側余白 */
  --gauge-label-gap: 8px;     /* 見出しと右の数値の間（横の間隔） */
  --gauge-row-gap:   6px;     /* 見出し行と、その下のバーの間 */
  --gauge-bg:     #dbe2e8;   /* 土台の背景 */
  --gauge-border: #a9b6c0;   /* 枠線 */
  --gauge-track:  #bcc7d0;   /* 未使用部分（帯の下地＝レール） */

  /* お知らせ領域（ホーム上部の「日付＋お知らせ」の白い枠）一式。役割ごとに余白を持つ。 */
  --notice-pad-y:        14px;  /* 枠の上下の内側余白 */
  --notice-pad-x:        44px;  /* 枠の左右の内側余白（右上ログアウトアイコンと重ならない広さ） */
  --notice-date-gap:      6px;  /* 日付と、その下のお知らせ文の間 */
  --notice-line-gap:      2px;  /* お知らせが複数行のときの行間 */
  --notice-logout-inset:  8px;  /* 右上ログアウトアイコンの、枠の角からの距離 */

  /* 季節のワンポイント絵（お知らせ枠の左下に置く桜などの小さな絵）の大きさ一式。
     枠の高さ（日付＋お知らせ1行で約80px）に収まり、中央寄せの文字とぶつからない大きさ。 */
  --season-art-w:    104px;  /* 絵の横幅 */
  --season-art-h:     78px;  /* 絵の高さ */
  --season-art-inset:  4px;  /* 枠の左下の角からの距離 */

  /* 上部バー（全画面共通の帯 .settings-bar）の大きさ一式。色は別枠の --bar-bg/--bar-fg。
     ※ --bar-h と --bar-close-tap は複数箇所で“必ず一致”させる連動値（バラバラに直すとズレる）。 */
  --bar-h:          52px;  /* 帯の高さ（.settings-bar の height と .topbar-* の padding-top で共用） */
  --bar-pad-x:      16px;  /* 帯の左右の内側余白 */
  --bar-gap:         8px;  /* 帯内の要素間隔（戻る×と見出しの間） */
  --bar-close-tap:  44px;  /* 戻る×のタップ領域（見出しh1の右余白と釣り合わせて中央に見せる） */
  --bar-close-icon: 34px;  /* 戻る×アイコン(svg)の実寸 */
  --bar-title-font: 20px;  /* 上部バーの見出し文字 */

  /* 記録画面（作業追加）の「記録日時」表示一式。役割ごとに余白・文字を持つ。 */
  --record-datetime-pad:      2px 28px 4px;  /* 日時ボックスの内側余白（左右を広めにして両端を中央寄りに） */
  --record-datetime-font:     18px;          /* 日時の文字サイズ */
  --record-datetime-gap:      14px;          /* 日付と時刻の間隔（ラベルの右余白も同値） */
  --record-datetime-time-pad: 6px 4px;       /* 日付・時刻ボタンの内側余白 */

  /* 記録画面の「天気・気温」一式（日時のすぐ下の行）。日時と同じ作法にそろえる。 */
  /* --- 記録画面の上部（上部バー→日時→天気→畑）の「見た目の隙間」を 10px にそろえる ---
     ねらい: 目に見える隙間を、全画面共通の行間（--item-row-gap＝10px）と同じにする。

     なぜ「行間を10pxにする」だけでは合わないか:
       ① 目に見える隙間 ＝ 上の要素の内側余白 ＋ 行間 ＋ 下の要素の内側余白 の合計。
          行間を10pxにしても、内側余白のぶんだけ広く見えてしまう。
       ② さらに各行は「ラベル（内側余白なし）」と「ボタン（上下6pxの内側余白）」が
          中央ぞろえで並ぶため、“文字から文字までの距離”は計算だけでは求めにくい。
       → そこで下の3つは **実際にブラウザで測って合わせた値**（3か所とも文字基準で10px）。

     ※ 文字サイズ・ボタンの内側余白（--record-datetime-time-pad）・.app-main の余白（16px）を
       変えたときは、ここの値も測り直すこと（計算では出せない）。 */
  --record-datetime-pull-up:  12px;  /* 上部バー → 日時 を 10px にする引き上げ量 */
  --record-weather-pull-up:   16px;  /* 日時 → 天気 を 10px にする引き上げ量 */
  --record-weather-pull-next: 12px;  /* 天気 → 畑（以降の項目行）を 10px にする引き上げ量 */
  --record-weather-icon:     20px;  /* 天気アイコン（表示ボタンの中。文字の高さに合わせた実寸） */
  --record-weather-icon-gap:  4px;  /* 天気アイコンと天気名の間隔 */
  --tenki-opt-icon:          26px;  /* ドロップダウンの選択肢アイコンの実寸（タップ用に少し大きめ） */
  --tenki-opt-gap:           12px;  /* ドロップダウンの選択肢アイコンと文字の間隔 */

  /* 天気アイコンの色（天気ごと＝役割で持つ）。線画SVGの線の色になる。
     実際の空の色をイメージしつつ、白地でも見やすい濃さにそろえてある。 */
  --tenki-color-sunny:       #ef9a1e;  /* 晴れ＝太陽のオレンジ */
  --tenki-color-cloudy:      #8b95a1;  /* 曇り＝雲のグレー */
  --tenki-color-cloudy-rain: #6d8ba9;  /* 曇時々雨＝グレーと青の中間 */
  --tenki-color-rain:        #2f7ed1;  /* 雨＝青 */
  --tenki-color-snow:        #56b4dd;  /* 雪＝水色 */
  --editday-list-icon:       20px;  /* 編集画面の記録一覧の写真アイコンの実寸（列幅もこの値） */
  --editday-memo-icon:       17px;  /* 同・メモアイコン（塗りの画像なので線画より小さめが釣り合う） */
  /* 記録一覧の1行に文字が入りきらないときに使う、小さめの文字サイズ（JSが段階的に付け替える）。
     通常 15px（--table-font）→ 13px → 12px の順に試して、1行に収まるところを探す。 */
  --editday-fit-font-s:      13px;  /* 少し小さく（1段階目） */
  --editday-fit-font-xs:     12px;  /* もっと小さく（2段階目。これでも入らなければ2行表示にする） */
  /* 記録一覧の「畑」列に必ず残す最低幅。畑列は“余った幅をもらう”設計（1fr）なので、
     その日に長い野菜名・作業内容が1件でもあると幅を取られて畑名がほぼ消えてしまう。
     それを防ぐための下限（12pxなら1行に約7文字＝2行で15文字ぶん入る）。 */
  --editday-hatake-min:      90px;

  /* 項目行（入力行：畑・野菜などの1行）一式。記録・設定など複数画面で使い回す汎用トークン。 */
  --item-row-gap: 10px;  /* 項目行どうしの縦の間隔 */
  --item-row-h:   48px;  /* 項目行の高さ（緑ラベル・入力欄で共通） */
  --input-row-h:  40px;  /* 小さめ入力欄の高さ（数量・単価など副次的な入力。項目行48pxより一段低くコンパクトに） */

  /* フォーム部品の共通サイズ */
  --checkbox-size: 30px;  /* チェックボックスの一辺（アプリ全体で共通・指で押しやすい大きさ） */

  /* 緑ラベル（項目名の緑ボックス）一式。記録の各項目・素材見出しなど、緑ラベル全般で使う。 */
  --label-pad: 6px 8px;  /* 緑ラベルの内側余白 */

  /* モーダル（ポップアップ <dialog>）の枠一式。確認・カレンダー・時刻など全モーダルで共有する。
     角丸は上の --radius-dialog(14px)。文字サイズは各ダイアログ内の --dialog-title-size/-body-size。 */
  --dialog-pad:      16px;                          /* モーダルの内側余白 */
  --dialog-shadow:   0 10px 40px rgba(0, 0, 0, 0.25);  /* モーダルの影（浮いて見せる） */
  --dialog-backdrop: rgba(0, 0, 0, 0.45);           /* 背後を暗くする幕（::backdrop） */
}

/* 「*」= すべての要素。box-sizing は、幅の計算に余白を含める指定（レイアウトが崩れにくい）。 */
* { box-sizing: border-box; }

/* html … 端末の回転や拡大時に文字サイズが勝手に変わるのを防ぐ（iOS対策）。 */
/* ※ 以前は scrollbar-gutter:stable でスクロールバー領域を常時確保していたが、
   その“確保された右側の帯”のせいで、画面上部に固定した全幅バー（.settings-bar）の
   右側に白い隙間が残ってしまう（fixed の right:0 はこの確保領域の内側までしか届かない）。
   バーを端まで届かせることを優先し、この指定は外す（横ずれ対策より隙間ゼロを優先）。 */
html { -webkit-text-size-adjust: 100%; }

/* =============================================================================
   共通ローディング（画面遷移／DB取得の待ち時間に出す「クルクル」＋操作ブロック）
   既定は非表示。app.js が遷移開始で少し遅れて .is-on を付けて表示する。
   ============================================================================= */
.app-loading {
  position: fixed; inset: 0; z-index: 100;   /* 画面全体を覆う（最前面） */
  display: none;                             /* 既定は出さない */
  align-items: center; justify-content: center;
  background: rgba(0, 0, 0, 0.3);            /* うっすら暗くして下の操作をブロック */
}
.app-loading.is-on { display: flex; }        /* 表示状態 */
/* くるくる回る輪（スピナー）。太めの円の一部だけ白くして回転させる。 */
.app-loading-spinner {
  width: 46px; height: 46px;
  border: 5px solid rgba(255, 255, 255, 0.45);
  border-top-color: var(--color-on-primary);        /* 上だけ白＝回っているのが分かる */
  border-radius: 50%;
  animation: app-spin 0.8s linear infinite;
}
@keyframes app-spin { to { transform: rotate(360deg); } }
/* 端末側で「動きを減らす」設定のときは、回転を止めて点滅に控える（過度な動き対策）。 */
@media (prefers-reduced-motion: reduce) {
  .app-loading-spinner { animation: app-spin 2s linear infinite; }
}

/* body = ページ全体。フォント・文字色・背景色のような“全体の土台”を決める。 */
body {
  margin: 0;
  font-family: system-ui, -apple-system, "Hiragino Kaku Gothic ProN", "Meiryo", sans-serif;
  line-height: 1.6;     /* 行間に少しゆとりを持たせて読みやすく */
  color: var(--text);          /* 文字色（濃いグレー） */
  background: var(--bg);  /* 背景色（薄いグレー） */
  min-height: 100vh;
  min-height: 100dvh;   /* dvh = スマホのアドレスバー増減を考慮した“実際の表示高さ” */
  /* iPhone等の横向き時、ノッチ側に文字が隠れないよう左右に安全余白を取る。 */
  padding-left: env(safe-area-inset-left);
  padding-right: env(safe-area-inset-right);
}

/* ボタン・リンクをタップしたときの“青い反応色”を消して、見た目を素直にする（スマホ）。 */
button, a { -webkit-tap-highlight-color: rgba(0, 0, 0, 0); }

/* 本文エリア。max-width で横幅を制限し、margin:auto で中央寄せ。 */
.app-main { max-width: 480px; margin: 0 auto; padding: 16px; }

/* フォーム部品の見た目（入力欄を押しやすい大きさに）。 */
form label { display: block; margin: 12px 0; }                 /* ラベルを縦に並べる */
form input, form select { width: 100%; padding: 8px; font-size: var(--font-input); }
form label.checkbox { display: flex; align-items: center; gap: 8px; } /* チェックは横並び */
form label.checkbox input { width: auto; }                     /* チェックは幅100%にしない */
/* --- チェックボックス（アプリ全体共通デザイン） ---
   ブラウザ標準の見た目（border-radiusを指定してもOS/ブラウザによって角が丸まらない）に
   accent-color で色だけ変えるやり方だと限界があるため、appearance:none で標準の見た目を消し、
   枠・チェックマークを自前で描く。色を変えたい場面（警告=赤系／ログイン=緑系など）は、
   この基本形の上から :checked の background/border-color だけを個別に上書きする。 */
input[type="checkbox"] {
  appearance: none;
  -webkit-appearance: none;   /* Safari対応 */
  margin: 0;
  border: 2px solid var(--border-input);
  border-radius: var(--radius-checkbox);
  background: var(--surface-card);
  position: relative;         /* チェックマーク(::after)を内側に置く基準 */
  cursor: pointer;
}
input[type="checkbox"]:checked {
  background: var(--color-accent);   /* 既定の色（青）。warn/successは各箇所で上書き */
  border-color: var(--color-accent);
}
/* チェックマーク（レ点）。borderの2辺をL字に見せて45度回すと、よく見るレ点になる定番の描き方。
   位置・太さはボックスサイズ（--checkbox-size=30px）に対する割合で決めているので、
   サイズトークンを変えてもレ点の見た目のバランスは保たれる。 */
input[type="checkbox"]:checked::after {
  content: '';
  position: absolute;
  left: 27%;
  top: 8%;
  width: 30%;
  height: 55%;
  border: solid #fff;
  border-width: 0 3px 3px 0;
  transform: rotate(40deg);
}
input[type="checkbox"]:disabled {
  background: var(--surface-disabled);
  border-color: var(--border-input);
  cursor: not-allowed;
}
input[type="checkbox"]:focus-visible {
  outline: 2px solid var(--color-accent-soft);
  outline-offset: 2px;
}
button { padding: 10px 16px; font-size: var(--font-input); cursor: pointer; }

/* 状態表示などの小さな見た目。 */
.error { color: var(--color-error); }                                     /* エラーは赤 */
.hint { color: var(--text-hint); font-size: var(--font-hint); margin: 4px 0 0; }       /* 補足は小さい灰色 */
.badge { display: inline-block; padding: 4px 8px; background: #fdd835; border-radius: 4px; } /* 黄色の札 */

/* =============================================================================
   ホーム画面（ログイン後のメイン画面・モック準拠）
   ※ .home 配下だけに効くよう限定する。
   ============================================================================= */

/* 画面全体を縦積みにし、高さいっぱいを使う。これで最下部の
   「マスターログイン」を下端に寄せられる（.home-bottom の margin-top:auto）。
   app-main の上下padding 16px×2=32px を差し引く。 */
.home {
  display: flex;
  flex-direction: column;
  gap: var(--section-gap);
  min-height: calc(100vh - 32px);
  min-height: calc(100dvh - 32px);
}

/* --- 入力欄の案内文（placeholder）の色。全画面共通 ---
   placeholder … 入力欄が空のとき薄く表示される案内文（例「畑の名前を入力してください」）。
   ブラウザごとの既定色はまちまちなので、アプリの「薄い文字」トークンにそろえる。
   「入力済みの文字（濃い）」と見分けやすい薄さにするのが目的。 */
input::placeholder,
textarea::placeholder {
  color: var(--text-faint);
  opacity: 1;   /* 一部ブラウザは既定で半透明にするため、透過を切って色指定どおりに見せる */
}

/* --- 未送信バナー（オフライン耐性・全画面共通） ---
   記録の送信に失敗してキュー（端末内）に残っている間、どの画面でも最上部に出す帯。
   app.js（未送信キューの共通処理）が body の先頭に挿し込み、送信し終えると消す。
   色は「注意」の状態色（橙）＝エラーほど深刻ではないが気づいてほしい情報。 */
.kiroku-queue-banner {
  background: var(--color-warn-bg);
  color: var(--color-warn-text);
  border-bottom: 1px solid var(--color-warn);
  padding: 8px 12px;
  text-align: center;
  font-size: var(--font-note);
  font-weight: 700;
}

/* --- 上部の枠：日付＋お知らせ --- */
.home-header {
  position: relative;            /* 右上のログアウトを絶対配置する基準 */
  border: 1px solid var(--border);     /* モックの細い枠線 */
  border-radius: var(--radius-card);
  background: var(--surface-card);     /* 白い面（共通トークン） */
  padding: var(--notice-pad-y) var(--notice-pad-x);  /* 上下14px・左右44px（左右はログアウトアイコン回避） */
  text-align: center;
}
/* 日付（例: 2026年7月17日（金））。狭い画面で2行に折り返さないよう、
   文字サイズを「画面幅に収まる大きさ」まで自動で縮める。
   ・min(A, B) … AとBの小さい方を使う標準機能。広い画面ではA（通常の26px）のまま。
   ・B の逆算式 … 100vw（画面の横幅）から左右の余白
     （本文 .app-main の16px×2 ＋ 枠 .home-header の44px×2 ＝ 120px）と
     字間（letter-spacing 1px × 最長14文字）を引き、最長の日付
     「2026年12月31日（水）」の文字幅（全角6文字＋半角数字8文字 ≒ 10.4文字分）で割る。 */
.home-date {
  font-size: min(var(--font-display), calc((100vw - 134px) / 10.4));
  font-weight: 600;
  letter-spacing: 1px;
  white-space: nowrap;   /* 保険: 万一計算より長くても折り返さず1行のままにする */
}
.home-notice { margin-top: var(--notice-date-gap); font-size: var(--font-note); color: var(--text-hint); }
.home-notice p { margin: var(--notice-line-gap) 0; }         /* お知らせ各行 */
.home-notice .empty { color: var(--text-faint); }      /* お知らせが無いときの薄い文字 */

/* --- 季節のワンポイント絵（ホーム上部の枠の左下） ---
   型: 枠に「season-art ＋ season-<季節キー>」の2クラスを足すだけで絵が出る。
   絵は assets/season-<キー>-bg.svg。今がどの季節かは app/season.php が日付から決める。
   ::before … 枠の中に自動で作られる「最初の子レイヤー」。ここに絵を置けば、
   枠本来の白い背景や枠線はそのまま生かせる（設定ボタンの .set-btn-art と同じ考え方）。
   全面ではなく左下の小さな絵なので、inset(全面)ではなく left/bottom と大きさを指定する。 */
.season-art { overflow: hidden; }        /* 角丸からはみ出たぶんを切り落とす */
.season-art::before {
  content: "";
  position: absolute;
  left: var(--season-art-inset);         /* 枠の左下に少し余白を空けて置く */
  bottom: var(--season-art-inset);
  width: var(--season-art-w);            /* ワンポイントの大きさ（下のトークンで調整） */
  height: var(--season-art-h);
  background: left bottom / contain no-repeat;  /* 絵全体が入る大きさで左下に。画像は季節ごとに下で指定 */
  opacity: .6;                           /* うっすら（濃さの調整はここ1か所） */
  pointer-events: none;                  /* 装飾なのでタップ判定に影響させない */
}
/* 日付とお知らせを絵より手前に出す（position を持たせると描画順が上がる）。
   右上のログアウトは既に absolute なので、そのままでも絵より手前に描かれる。 */
.home-header .home-date,
.home-header .home-notice { position: relative; }

/* 季節ごとの絵（キーは app/season.php の SEASON_LABELS と共通。
   新しい季節の絵に差し替えるときは、assets にSVGを置いて下の1行を直すだけ）。 */
.season-fuyu::before      { background-image: url("season-fuyu-bg.svg"); }      /* 冬＝雪をかぶった枝と雪だるま */
.season-hatsuharu::before { background-image: url("season-hatsuharu-bg.svg"); } /* 初春＝ふきのとうとつくし */
.season-haru::before      { background-image: url("season-haru-bg.svg"); }      /* 春＝桜 */
.season-shoka::before     { background-image: url("season-shoka-bg.svg"); }     /* 初夏＝植えたばかりの苗 */
.season-tsuyu::before     { background-image: url("season-tsuyu-bg.svg"); }     /* 梅雨＝あじさいと雨 */
.season-natsu::before     { background-image: url("season-natsu-bg.svg"); }     /* 夏＝アイスバー */
.season-shoshu::before    { background-image: url("season-shoshu-bg.svg"); }    /* 初秋＝十五夜（団子・すすき・満月） */
.season-aki::before       { background-image: url("season-aki-bg.svg"); }       /* 秋＝もみじとどんぐり */
.season-shoto::before     { background-image: url("season-shoto-bg.svg"); }     /* 初冬＝大きなみかん */

/* 右上の小さなログアウトボタン（アイコンのみ）。 */
.logout-form.corner { position: absolute; top: var(--notice-logout-inset); right: var(--notice-logout-inset); margin: 0; }
.logout-btn {
  background: transparent; border: none; padding: var(--icon-sm-pad);
  color: var(--text-hint); cursor: pointer; line-height: 0;
}
.logout-btn:hover { color: var(--color-error); }     /* ホバーで赤くして“出る”操作だと分かる */
.logout-btn svg { width: var(--icon-sm); height: var(--icon-sm); display: block; }

/* --- メニューボタン（記録・編集など） --- */
.home-menu { display: flex; flex-direction: column; gap: var(--btn-gap); }
/* メニューの区切り線（「出荷」と「設定」の間）。上＝日々の作業／下＝設定・管理、の境目。
   ・<hr> の既定の枠線と余白を消し、上辺の1本線だけにする。
   ・margin は 0 のまま＝間隔は .home-menu の gap（14px）に任せる
     （ここで margin を足すと gap と足し算になり、そこだけ不自然に空く）。 */
.menu-sep {
  width: 100%;
  margin: 0;
  border: none;
  border-top: 1px solid var(--border);
}

/* ===== ソラコロからのお知らせ（ホーム画面・出荷と設定の間）=====
   1日1回のAIアドバイスを、マスコット（ソラコロ）の絵と並べて出す小さなカード。
   ・メニューボタンと同じ幅に収まり、ボタンではないので押せる見た目にはしない。
   ・色はごく薄い緑（--color-record-bg）＝畑・作物の話題であることを、うるさくない範囲で示す。
     ボタンの機能色（記録の緑）とは別物なので、面の色として薄いほうを使う。
   ・スマホを最優先に、絵は縮み、文章は折り返す（--responsive の考え方）。 */
.soracoro-notice {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  padding: 12px 14px;
  border: 1px solid var(--border-light);
  border-radius: var(--radius-card);
  background: var(--color-record-bg);
}
/* 絵の部分。flex-shrink:0 ＝ 文章が長くてもソラコロを潰さない。 */
.soracoro-notice-icon {
  flex-shrink: 0;
  line-height: 0;   /* SVGの下に余分なすき間ができるのを防ぐ */
}
/* min-width:0 ＝ 長い単語があってもはみ出さずに折り返させるための決まり文句（flex項目の作法）。 */
.soracoro-notice-body { flex: 1; min-width: 0; }
.soracoro-notice-text {
  margin: 0;
  font-size: 14px;
  line-height: 1.7;
  color: var(--text);
  white-space: pre-wrap;   /* AIの文章に改行があれば、そのまま活かす */
}
/* 「考えています…」の待ちメッセージ。本文より控えめにする。 */
.soracoro-notice-loading {
  margin: 0;
  font-size: 13px;
  color: var(--text-hint);
}

/* メンテナンス遮断中（非スーパーマスター）にメニューの代わりに出す案内文。 */
.maintenance-blocked-notice {
  margin-top: var(--notice-date-gap);
  color: var(--color-warn-text);
  font-weight: 700;
  text-align: center;
}

/* 共通のメニューボタン。アイコンは左端に固定し、文字はボタン全体の中央に置く。
   position:relative（親の基準）＋ アイコンを absolute で左に固定することで、
   ラベルはアイコンの幅に影響されず“ボタン全体”の中央にそろう。 */
.menu-btn {
  position: relative;           /* 中のアイコンを絶対配置する基準 */
  display: flex;
  align-items: center;
  justify-content: center;      /* ラベルを横中央に */
  width: 100%;
  height: var(--btn-menu-h);    /* メニューボタン（記録・編集など）の縦サイズ */
  padding: 0 var(--btn-menu-pad-x);
  border: none;
  border-radius: var(--btn-menu-radius);
  color: var(--text);               /* 文字は濃い色（モックに合わせる） */
  font-size: var(--btn-menu-font);
  font-family: inherit;             /* <button>要素はブラウザ既定でArial等になるため、本文と同じフォントにそろえる */
  font-weight: 700;
  text-decoration: none;
  cursor: pointer;
}
/* アイコンは左端に固定（文字の中央そろえに影響しないよう absolute にする）。 */
.menu-btn .menu-icon {
  position: absolute;
  left: var(--btn-menu-pad-x);
  top: 50%;
  transform: translateY(-50%);  /* 縦中央 */
  line-height: 0;
}
.menu-btn .menu-icon svg { width: var(--btn-menu-icon); height: var(--btn-menu-icon); display: block; }
/* マスターログイン／ログアウトの人型アイコンは従来サイズのままにする。 */
.menu-master .menu-icon svg { width: var(--btn-menu-low-icon); height: var(--btn-menu-low-icon); }
/* ラベルはボタン全体の中央に表示する。 */
.menu-btn .menu-label { text-align: center; }

/* 各ボタンの色（モック配色）。hover は少し濃く。 */
.menu-record   { background: var(--color-record); }
.menu-record:hover { background: var(--color-record-hover); }
.menu-edit     { background: var(--color-edit); }
.menu-edit:hover   { background: var(--color-edit-hover); }
.menu-settings { background: var(--color-settings); }   /* 設定=グレー（少し濃いめ） */
.menu-settings:hover { background: var(--color-settings-hover); }
.menu-shipping { background: var(--color-shipping); }   /* 出荷=ピンク */
.menu-shipping:hover { background: var(--color-shipping-hover); }
.menu-stats    { background: var(--color-stats); }   /* 統計=紫 */
.menu-stats:hover  { background: var(--color-stats-hover); }
.menu-customer-info { background: var(--color-customer-info); }   /* お客様情報=khaki */
.menu-customer-info:hover { background: var(--color-customer-info-hover); }
.menu-nikki    { background: var(--color-nikki); }   /* 農業日誌=bisque */
.menu-nikki:hover  { background: var(--color-nikki-hover); }

/* --- 最下部（マスターログイン／マスター中の表示） --- */
.home-bottom { margin-top: auto; }        /* 余白を上に押し上げて下端へ寄せる */

/* マスターログインのボタン（少し濃いめのグレー）。 <summary> を menu-btn として使う。
   縦サイズは他メニューより少しだけ小さくする。 */
.menu-master { background: var(--color-settings); color: var(--text); font-size: var(--btn-menu-low-font); height: var(--btn-menu-low-h); }
.menu-master:hover { background: var(--color-settings-hover); }

/* お知らせ領域の最上段「テスト環境です」（テスト環境でだけ出る）。
   下の「○○ でマスターログイン中」とまったく同じ見た目（緑・太字）にそろえる
   ＝目立ちすぎる装飾は付けない（2026-08-19 ユーザー指示）。 */
.home-notice .notice-testenv { color: var(--color-success); font-weight: 700; }

/* お知らせ領域の1段目「○○ でマスターログイン中」。緑・少し強調。 */
.home-notice .notice-master { color: var(--color-success); font-weight: 700; }

/* 自動お知らせ（ルール合致）。注意喚起なので少し目立つ赤系＋太字にする。 */
.home-notice .notice-auto { color: var(--color-error); font-weight: 700; }

/* 電波なしのお知らせ（JSがオフライン中だけ挿入する。home.php の同名スクリプト参照）。
   自動お知らせと同じ注意喚起の赤系＋太字で統一する。 */
.home-notice .notice-offline { color: var(--color-error); font-weight: 700; }

/* お知らせ編集ボタン（スーパーマスター専用・マスターログアウトの上）。淡い青系で区別。
   大きさ（高さ・文字・角丸・アイコン）は記録・編集など他のメニューボタンと共通にそろえる
   （.menu-btn のトークンをそのまま使う）。＝ここでは色だけ変え、文字サイズは上書きしない
   （こうすると --btn-menu-font＝22px が効き、他のメニューボタンと同じ大きさになる）。 */
.menu-announce { background: var(--color-accent-bg); color: var(--color-accent); }
.menu-announce:hover { background: var(--color-accent-bg-hover); }

/* =============================================================================
   「はじめの設定」カード（初回セットアップの道案内）。
   マスターログイン中に必須マスタが揃っていないときだけ、メニューの上に表示する。
   白いカードに5つのステップを縦に並べ、行タップでその登録画面へ直行できる。
   ============================================================================= */
.setup-card {
  border: 1.5px solid var(--color-accent-soft);   /* 薄い青の枠＝「案内」の雰囲気で目を引く */
  border-radius: var(--radius-card);
  background: var(--surface-card);
  padding: 14px 16px;
}
/* タイトル行。「はじめの設定」（左）と進捗「2 / 5」（右）を両端に振り分ける。 */
.setup-title {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin: 0;
  font-size: 18px;
  font-weight: 700;
}
.setup-progress {
  color: var(--color-accent);
  font-size: var(--font-note);
  font-variant-numeric: tabular-nums;   /* 数字を等幅にして進むたびのガタつきを防ぐ */
}
.setup-lead { margin: 4px 0 10px; font-size: var(--font-hint); color: var(--text-hint); }

/* ステップの並び。<ol> の標準の番号・点は消して自前の丸番号で見せる。 */
.setup-steps {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 4px;
}
/* 1ステップ＝1行。リンク（<a>）と押せない行（<span>）で同じ見た目を共有する。 */
.setup-step-body {
  display: flex;
  align-items: center;
  gap: 10px;
  min-height: 48px;              /* 指で押しやすい高さ（44px以上）を確保 */
  padding: 4px 10px;
  border-radius: var(--radius-control);
  text-decoration: none;
  color: var(--text);
  font-size: var(--font-input);
  font-weight: 600;
}
a.setup-step-body:hover  { background: var(--hover-bg); }
a.setup-step-body:active { background: var(--active-bg); }

/* 左端の丸印（番号／チェック）。 */
.setup-step-mark {
  flex: none;                    /* 行が詰まっても丸をつぶさない */
  width: 28px;
  height: 28px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 2px solid var(--border);
  background: var(--surface-card);
  color: var(--text-hint);
  font-size: 15px;
  font-weight: 700;
}
/* 完了＝緑の丸に白いチェック。 */
.setup-step-mark.is-check {
  border-color: var(--color-success);
  background: var(--color-success);
  color: #fff;
}
.setup-step-mark.is-check svg { width: 16px; height: 16px; display: block; }
/* ラベルは残りの幅いっぱいに広げる（右端の矢印・バッジを右へ押しやる）。 */
.setup-step-label { flex: 1; }
/* 完了した行は文字を薄くして「もう済んだ」ことを見せる。 */
.setup-step.is-done .setup-step-label { color: var(--text-faint); }

/* 「つぎはここ」の行＝最初の未完了ステップ。薄い青の背景＋青い番号丸で目立たせる。 */
.setup-step.is-next .setup-step-body { background: var(--color-accent-bg); }
.setup-step.is-next a.setup-step-body:hover  { background: var(--color-accent-bg-hover); }
.setup-step.is-next a.setup-step-body:active { background: var(--color-accent-bg-hover); }
.setup-step.is-next .setup-step-mark {
  border-color: var(--color-accent);
  background: var(--color-accent);
  color: var(--color-on-accent);
}
/* 「つぎはここ」バッジ（青地に白文字の小さなラベル）。 */
.setup-step-next {
  flex: none;
  padding: 3px 8px;
  border-radius: 999px;          /* 999px＝高さの半分を超える値を入れると完全な丸角（ピル形）になる */
  background: var(--color-accent);
  color: var(--color-on-accent);
  font-size: 12px;
  font-weight: 700;
  white-space: nowrap;
}
/* 右端の「›」矢印（タップで進める目印）。 */
.setup-step-arrow { flex: none; width: 18px; height: 18px; color: var(--text-faint); }

/* まだ押せない行（例: 作業計画は畑と野菜が先）。全体を薄くしてリンクではないことを見せる。 */
.setup-step.is-locked .setup-step-body  { cursor: default; }
.setup-step.is-locked .setup-step-label { color: var(--text-faint); }
.setup-step.is-locked .setup-step-mark  { border-color: var(--border-light); color: var(--text-faint); }
/* ロック理由の補足（ラベルの下に小さく）。small はブロックにして2行目として出す。 */
.setup-step-note {
  display: block;
  font-size: var(--font-hint);
  font-weight: 400;
  color: var(--text-faint);
}

.setup-note {
  margin: 8px 0 0;
  font-size: var(--font-hint);
  color: var(--text-faint);
  text-align: center;
}

/* 案内から次の画面へ進ませる「誘導ボタン」（全画面共通の部品）。
   例: ホームの「マスターログインへ」、記録画面の「作業計画を登録する」など、
   「この先に進むにはこれを押す」という一本道の場面で使う。
   主アクション色（青）で、次に押すべき場所だと一目で分かるようにする。
   <button> と <a> のどちらでも同じ見た目になるようにしておく。 */
.guide-btn {
  display: flex;                 /* <a>でも中央寄せが効くように flex にする */
  align-items: center;
  justify-content: center;
  width: 100%;
  min-height: 48px;              /* 指で押しやすい高さ */
  margin-top: 4px;
  border: none;
  border-radius: var(--radius-control);
  background: var(--color-primary);
  color: var(--color-on-primary);
  font-size: var(--font-input);
  font-family: inherit;          /* <button>の既定フォントを本文と同じにそろえる */
  font-weight: 700;
  text-decoration: none;         /* <a>のときの下線を消す */
  cursor: pointer;
}
.guide-btn:hover  { background: var(--color-primary-hover); }
.guide-btn:active { background: var(--color-primary-hover); }

/* =============================================================================
   データベース使用量バー（スーパーマスター専用・お知らせ編集ボタンと記録ボタンの間）。
   5GB を上限に、使用割合を色付きバーで見せる。メニューボタンと同じ幅になじませる。
   ============================================================================= */
/* ※ 同じ見た目のバーを「写真の使用量」（お客様情報画面）でも使うため、
   .usage-gauge という汎用の名前をセレクタに併記して1つのルールを共有している。
   ＝同じCSSを2度書かない。片方だけ直して見た目がズレる、という事故も防げる。 */
.db-usage,
.usage-gauge {
  width: 100%;
  min-height: var(--btn-menu-low-h);      /* 普段はマスターボタンと同じ54px。画面が狭くて見出しが折り返したときは、枠が下に伸びてバーが隠れないようにする（固定heightではなく最低の高さにする） */
  display: flex;                          /* 中身（見出し行＋帯）を縦に積み… */
  flex-direction: column;
  justify-content: center;                /* 54pxのときは上下中央。伸びたときは中身なりに並ぶ */
  padding: var(--gauge-pad-y) var(--gauge-pad-x);  /* 上下6px（詰め気味）・左右14px */
  border-radius: var(--btn-menu-radius);  /* 角丸はメニューボタン共通(10px)を流用 */
  background: var(--gauge-bg);            /* 土台の背景 */
  border: 1px solid var(--gauge-border);  /* 枠線 */
}
/* 見出し（左）と数値（右）を1行に振り分ける。 */
.db-usage-label,
.usage-gauge-label {
  display: flex;
  justify-content: space-between; /* 左右の端に寄せる */
  align-items: baseline;
  gap: var(--gauge-label-gap);
  margin-bottom: var(--gauge-row-gap);
  line-height: 1.3;               /* 54pxに収めるため行の高さを詰める */
  font-size: var(--gauge-font);   /* 見出し・数値の文字サイズ */
  color: var(--text);                 /* 文字色をほぼ黒に近い濃さに */
}
/* white-space:nowrap ＝ 途中で改行させない。
   狭い画面で「データベース使 / 用量」のように途中で折り返してしまうのを防ぐ。
   代わりに、幅に収まらないときは app.js が文字サイズを少しだけ小さくして1行に収める
   （2026-08-10 ユーザー指示）。 */
.db-usage-title,
.usage-gauge-title { font-weight: 700; white-space: nowrap; }
/* 数字は等幅（tabular-nums）にして、割合が変わっても幅がガタつかないように。 */
.db-usage-value,
.usage-gauge-value { font-variant-numeric: tabular-nums; white-space: nowrap; }
/* バーの外枠（＝未使用ぶんの背景）。overflow:hidden で中身を角丸に切り取る。 */
.db-usage-bar,
.usage-gauge-bar {
  width: 100%;
  height: var(--gauge-h);        /* 帯（ゲージ）の太さ */
  border-radius: var(--gauge-radius);
  background: var(--gauge-track); /* 未使用部分（レール） */
  overflow: hidden;
}
/* バーの中身（使用量ぶんだけ幅が伸びる）。色は下の状態クラスで切り替える。 */
.db-usage-fill,
.usage-gauge-fill {
  height: 100%;
  border-radius: var(--gauge-radius) 0 0 var(--gauge-radius);   /* 左端だけ丸める（右端は伸びる途中なので角なし） */
  transition: width .3s ease;   /* 幅の変化を滑らかに（見た目だけ） */
}
/* 使用割合による色分け（PHP側の $dbLevel / $level と対応）。しっかり濃い色で見せる。 */
.db-usage--ok     .db-usage-fill,
.usage-gauge--ok     .usage-gauge-fill { background: var(--color-success); } /* 緑＝余裕あり */
.db-usage--warn   .db-usage-fill,
.usage-gauge--warn   .usage-gauge-fill { background: var(--color-warn); } /* 橙＝注意 */
.db-usage--danger .db-usage-fill,
.usage-gauge--danger .usage-gauge-fill { background: var(--color-error); } /* 赤＝残りわずか */
/* 注意・危険のときは数値の色も変えて気づきやすくする。 */
.db-usage--warn   .db-usage-value,
.usage-gauge--warn   .usage-gauge-value { color: var(--color-warn-text); font-weight: 700; }
.db-usage--danger .db-usage-value,
.usage-gauge--danger .usage-gauge-value { color: var(--color-error); font-weight: 700; }
/* ホームの使用量枠は <a>（データベース使用量画面へのリンク）。リンクの既定の
   見た目（下線・青文字）を打ち消し、タップ時だけ軽く反応させる。 */
a.db-usage { display: block; text-decoration: none; cursor: pointer; }
a.db-usage:hover  { background: var(--hover-bg); }
a.db-usage:active { background: var(--active-bg); }
/* ※「画像使用量」バー（.home-photo-usage）に余白は付けない。
   ホームのメニュー（.home-menu）が flex の gap（--btn-gap＝14px）で
   全要素の間隔をまとめて付けているため、ここで margin を足すと二重になる
   （実際に 14px + 16px = 30px になり、そこだけ広く空いた）。 */

/* =============================================================================
   お客様情報画面（設定メニュー ＞ お客様情報）
   「白いカード」を縦に積む構成。中身は カード見出し ＋ 明細行 or 数値タイル。
   スマホ縦画面を基準にし、画面が広いときはタイルの列数が自然に増える。
   ============================================================================= */
/* カードの間隔（画面全体を縦に積む）。 */
.cinfo-page { display: flex; flex-direction: column; gap: 14px; }

/* 情報を載せる白い箱。角丸・枠線はアプリ共通のトークンを使う。 */
.cinfo-card {
  background: var(--surface-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  padding: 14px 16px 16px;
}
/* カードの見出し（「お客様情報」「登録されている数」など）。下に細い区切り線を引く。 */
.cinfo-card-title {
  margin: 0 0 12px; padding-bottom: 8px;
  font-size: 17px; font-weight: 700; color: var(--text);
  border-bottom: 1px solid var(--border-light);
}

/* --- 明細行（項目名：値） --- */
.cinfo-rows { margin: 0; }
/* 1行＝左に項目名・右に値。狭い画面でも折り返さず、値だけが縮むようにする。 */
.cinfo-row {
  display: flex; justify-content: space-between; align-items: baseline;
  gap: 12px; padding: 9px 0;
  border-bottom: 1px solid var(--border-light);
}
.cinfo-row:last-child { border-bottom: none; padding-bottom: 0; }
.cinfo-row dt { flex: 0 0 auto; font-size: 15px; color: var(--text-hint); }
/* dd は既定で左に余白が付くので打ち消す。値は右寄せ＝項目名と視線が分かれて読みやすい。 */
.cinfo-row dd {
  margin: 0; text-align: right; font-size: 16px; font-weight: 700; color: var(--text);
  overflow-wrap: anywhere;   /* 長いお客様名でも枠からはみ出さずに折り返す */
}
/* お客様名のうしろの敬称「様」。名前そのものより控えめにしたいので、
   左の項目名（「お客様名」）と同じ薄い灰色・太字なしにする。 */
.cinfo-honorific { margin-left: 3px; color: var(--text-hint); font-weight: 400; }
/* お客様番号は数字が並ぶので、等幅＋少し文字間を空けて読みやすくする。 */
.cinfo-code { font-variant-numeric: tabular-nums; letter-spacing: 1px; }
/* プラン名は契約の要なので、テーマの青で目立たせる。 */
.cinfo-plan { color: var(--color-primary); }

/* --- 数値タイル（登録件数・写真の枚数） --- */
/* auto-fit と minmax … 「1つ最低140px」を保ちつつ、入るだけ列を増やす指定。
   スマホ（幅375px前後）では2列、タブレット・PCでは3〜4列に自動で変わる。 */
.cinfo-tiles {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 10px;
}
.cinfo-tile {
  display: flex; flex-direction: column; gap: 4px;
  padding: 10px 12px;
  background: var(--color-record-bg);            /* ごく薄い緑（アプリ共通の淡い地） */
  border: 1px solid var(--border-light);
  border-radius: var(--radius-control);
}
.cinfo-tile-label { font-size: 13px; color: var(--text-hint); }
/* 数値は大きく。等幅にして桁が変わっても揺れないようにする。 */
.cinfo-tile-num {
  font-size: 22px; font-weight: 700; color: var(--text);
  font-variant-numeric: tabular-nums; line-height: 1.2;
}
/* 単位（件・人・枚）は数値より小さく、少し離して添える。 */
.cinfo-tile-unit { font-size: 13px; font-weight: 400; color: var(--text-hint); margin-left: 3px; }
/* 残りが少ないタイルは赤く（数値だけでなく枠と地も変えて、ひと目で気づけるように）。 */
.cinfo-tile.is-alert { background: #fdeef1; border-color: var(--color-error); }
.cinfo-tile.is-alert .cinfo-tile-num { color: var(--color-error); }

/* 写真の枚数タイルは、使用量バーの下に少し間を空けて置く。 */
.cinfo-tiles-photo { margin-top: 12px; }

/* --- 補足・警告の文 --- */
/* 補足（小さめ・弱い色）。「※」的な説明に使う。 */
.cinfo-note { margin: 12px 0 0; font-size: 13px; line-height: 1.6; color: var(--text-hint); }
/* カードの先頭に置く導入文のときは、上の余白を消す。 */
.cinfo-note-lead { margin-top: 0; font-size: 15px; color: var(--text); }
/* 警告（容量がいっぱい・残りわずか）。赤い枠の帯で目立たせる。 */
.cinfo-alert {
  margin: 12px 0 0; padding: 10px 12px;
  font-size: 14px; line-height: 1.6; font-weight: 700; color: var(--color-error);
  background: #fdeef1; border: 1px solid var(--color-error); border-radius: var(--radius-control);
}

/* --- 古い写真をまとめて削除（お客様情報画面・管理者のときだけ出る） --- */
/* 「期間のドロップダウン」＋「削除するボタン」を1行に。
   狭い画面ではボタンが下に回り込む（flex-wrap）。 */
.cinfo-del-row { display: flex; flex-wrap: wrap; gap: 10px; align-items: stretch; margin-top: 12px; }
/* ドロップダウンは余った幅いっぱいに広げる（選択肢の文字が長いため）。
   min-width で、狭い画面でも潰れすぎないようにする。 */
.cinfo-del-select { flex: 1 1 200px; min-width: 0; }
/* js-picker が作る表示ボタンにも、入力欄と同じ見た目を当てる
   （.picker-display は <button> なので、select 向けの指定は継承されない）。 */
.cinfo-del-row .picker-display {
  height: 46px; padding: 0 12px; font-size: 15px;
  background: var(--surface-card); border: 1px solid var(--border-input);
  border-radius: var(--radius-control);
}
.cinfo-del-btn { flex: 0 0 auto; padding: 0 20px; height: 46px; border-radius: var(--radius-control); }

/* 確認ダイアログの中：これから消す対象（「1年より前の写真 120枚（11.2MB）」）。 */
.cinfo-del-target {
  margin: 4px 0 12px; padding: 10px 12px;
  font-size: 17px; font-weight: 700; text-align: center; color: var(--text);
  background: var(--surface-input); border-radius: var(--radius-control);
}
/* 取り消せないことの警告。赤字で強く。 */
.cinfo-del-warn {
  margin: 0 0 14px; font-size: 15px; line-height: 1.6;
  color: var(--color-error); text-align: center;
}
/* マスターパスワードの入力欄（ラベルを上、入力を下に積む）。 */
.cinfo-del-pw { display: flex; flex-direction: column; gap: 6px; margin-bottom: 18px; text-align: left; }
.cinfo-del-pw span { font-size: 14px; color: var(--text-hint); }
.cinfo-del-pw input {
  height: 46px; padding: 0 12px; font-size: 16px;   /* 16px＝スマホで自動ズームされない大きさ */
  border: 1px solid var(--border-input); border-radius: var(--radius-control);
}

/* プランを上げると使えるようになる機能の案内（例: 記録画面のメモ欄の下に出す
   「ベーシックプランにすると写真も記録できます」）。
   売り込みが強く見えないよう、薄い地色・破線の枠・小さめの文字で静かに置く。 */
.plan-upsell {
  margin: 4px 0 var(--section-gap);
  padding: 10px 12px;
  font-size: 14px; line-height: 1.5; text-align: center;
  color: var(--color-success);
  background: var(--color-record-bg);       /* ごく薄い緑（記録画面の地色） */
  border: 1px dashed var(--color-record);   /* 破線＝「今は使えない」やわらかい表現 */
  border-radius: var(--radius-control);
}

/* --- データベース使用量画面（db_usage.php・スーパーマスター専用） ---
   ホームの使用量バーのタップ先。5GB到達予測のグラフ（SVG）は統計画面の
   損益分岐点図（.stats-cvp-*）と同じ固定viewBox方式で、配色も既存の意味に合わせる
   （実績・現在=青〔--color-accent〕／上限・到達=赤〔--color-error〕）。 */
.dbu-page { padding-bottom: 24px; }
.dbu-current { margin: 0 0 14px; }   /* 現在の使用量バー（ホームと同じ部品）の下余白 */
.dbu-card {
  background: var(--surface-card);
  border: 1px solid var(--border-light);
  border-radius: var(--radius-card, 10px);
  padding: 14px;
}
.dbu-heading { margin: 0 0 8px; font-size: 18px; font-weight: 700; color: var(--text); }
.dbu-forecast { margin: 0 0 12px; font-size: 16px; line-height: 1.6; color: var(--text); }
/* 到達が1年以内に迫っているときは結論の文章を赤字で目立たせる。 */
.dbu-forecast.is-warning { color: var(--color-error); font-weight: 700; }
.dbu-chart { width: 100%; }
.dbu-svg { width: 100%; height: auto; display: block; }
.dbu-axis { stroke: var(--border); stroke-width: 1; }
/* 実績＝青の実線。予測＝同じ青の破線（「実績の続き」であることが色で分かる）。 */
.dbu-actual { fill: none; stroke: var(--color-accent); stroke-width: 2; }
.dbu-forecast-line { stroke: var(--color-accent); stroke-width: 2; stroke-dasharray: 5 4; }
/* 上限5GB＝赤の破線（超えてはいけない線）。 */
.dbu-limit { stroke: var(--color-error); stroke-width: 1.5; stroke-dasharray: 4 3; }
.dbu-guide { stroke: var(--text-faint); stroke-width: 1; stroke-dasharray: 3 3; }
.dbu-point--now   { fill: var(--color-accent); }
.dbu-point--reach { fill: var(--color-error); }
.dbu-ylabel, .dbu-xlabel { font-size: 11px; fill: var(--text-hint); }
.dbu-xlabel--now   { fill: var(--color-accent); font-weight: 700; }
.dbu-xlabel--reach { fill: var(--color-error); font-weight: 700; }
/* 凡例（色見本＋説明）。統計画面の凡例と同じ横並び・折り返し型。 */
.dbu-legend {
  display: flex; flex-wrap: wrap; gap: 6px 16px;
  margin: 10px 0 0; padding: 0; list-style: none;
  font-size: 13px; color: var(--text-hint);
}
.dbu-legend li { display: flex; align-items: center; gap: 6px; }
.dbu-swatch { display: inline-block; width: 18px; height: 4px; border-radius: 2px; }
.dbu-swatch--actual   { background: var(--color-accent); }
.dbu-swatch--forecast { background: repeating-linear-gradient(90deg, var(--color-accent) 0 4px, transparent 4px 7px); }
.dbu-swatch--limit    { background: repeating-linear-gradient(90deg, var(--color-error) 0 4px, transparent 4px 7px); }
.dbu-note { margin: 12px 0 0; font-size: 12px; line-height: 1.7; color: var(--text-faint); }
/* カードの先頭に置く導入文（「まだお客様のデータがありません」など）は上の余白を消す。 */
.dbu-note-lead { margin-top: 0; }
/* カードが続けて並ぶときの間隔（予測グラフのカード → お客様ごとの使用量のカード）。 */
.dbu-card + .dbu-card { margin-top: 14px; }

/* --- お客様ごとの使用量リスト（多い順・最大100件） --- */
/* ol の既定の番号は使わず、自前の順位（.dbu-rank-no）を左端に出す
   ＝3桁（100位）でも桁がそろい、名前の開始位置がガタつかない。 */
.dbu-rank { margin: 0; padding: 0; list-style: none; }
.dbu-rank-row {
  display: flex; align-items: baseline; gap: 8px;
  padding: 8px 0; border-bottom: 1px solid var(--border-light);
}
.dbu-rank-row:last-child { border-bottom: none; }
/* 順位。右そろえ＋等幅数字で桁をそろえる。 */
.dbu-rank-no {
  flex: 0 0 2.4em; text-align: right;
  font-size: 13px; color: var(--text-hint); font-variant-numeric: tabular-nums;
}
/* お客様名。長い名前でも枠を壊さないよう、ここだけが伸び縮みする（min-width:0 が必須）。 */
.dbu-rank-name {
  flex: 1 1 auto; min-width: 0;
  font-size: 15px; font-weight: 700; color: var(--text); overflow-wrap: anywhere;
}
/* お客様番号は名前の後ろに小さく添える。 */
.dbu-rank-code {
  margin-left: 6px; font-size: 12px; font-weight: 400;
  color: var(--text-faint); font-variant-numeric: tabular-nums;
}
/* 停止中（利用不可にしたお客様）の印。 */
.dbu-rank-off { margin-left: 6px; font-size: 11px; font-weight: 400; color: var(--color-error); }
/* 使用量。数字は等幅で桁をそろえる（縦に並べたとき比べやすい）。
   画像の画面では容量の下に枚数も出すので、右そろえの縦積みにする。 */
.dbu-rank-size {
  flex: 0 0 auto; display: flex; flex-direction: column; align-items: flex-end;
  font-size: 15px; font-weight: 700;
  color: var(--text); font-variant-numeric: tabular-nums;
}
/* 枚数（画像使用量の画面だけ）。容量より小さく淡い色で、補助情報として添える。 */
.dbu-rank-count { font-size: 12px; font-weight: 400; color: var(--text-hint); }
/* お客様に属さないぶん（共通マスタ・ログ）。太い線で区切って「合計欄」らしく見せる。 */
.dbu-rank-sum {
  display: flex; justify-content: space-between; gap: 8px;
  margin-top: 10px; padding-top: 10px; border-top: 2px solid var(--border);
  font-size: 13px; color: var(--text-hint);
}
.dbu-rank-sum span:last-child { font-variant-numeric: tabular-nums; white-space: nowrap; }
/* 集計に入っていないテーブルがあるときの警告（開発者向け・通常は出ない）。 */
.dbu-warn {
  margin: 12px 0 0; padding: 10px 12px;
  font-size: 13px; line-height: 1.6; color: var(--color-error);
  background: #fdeef1; border: 1px solid var(--color-error); border-radius: var(--radius-control);
}

/* お知らせ編集ダイアログは広めにする（画面幅に対してほぼいっぱい・上限は大きめ）。
   ※ .confirm-dialog より後ろに書かれた同名指定に負けないよう、セレクタを
   　 dialog.announce-dialog（要素＋クラス）にして優先度を上げている。 */
dialog.announce-dialog { width: min(96vw, 720px); }
/* テキスト領域はダイアログの横幅いっぱいに広げる。 */
.announce-textarea { width: 100%; }
/* ヒント文は小さいまま保つ。共通ルール（.confirm-dialog p=大きめ）に負けないよう、
   セレクタを .announce-dialog .announce-hint（クラス2つ）にして優先度を上げている。 */
.announce-dialog .announce-hint { margin: 0 0 10px; font-size: 12px; color: var(--text-hint); }
.announce-textarea {
  width: 100%;
  font-size: 15px;
  line-height: 1.5;
  padding: 10px;
  border: 1px solid var(--border);
  border-radius: 8px;
  resize: vertical;          /* 縦方向だけリサイズ可 */
  font-family: inherit;
}

/* =============================================================================
   メンテナンス予定欄（お知らせ編集ダイアログ内・スーパーマスター専用）。
   日付＋開始時刻＋終了時刻の3つのボタンを横並びにする。狭い画面では折り返す。
   ボタンの見た目（青字・太字）は記録/出荷画面の日時欄（.rdt-date/.rdt-time）と
   そろえるが、あちらは .record-form/.shipping-form にスコープされているため、
   ここでは同じ見た目を専用クラスの中で完結させる（既存ルールを巻き込まないため）。
   ============================================================================= */
.maintenance-field, .maintenance-block-field { margin: 14px 0; }
.maintenance-field-label { font-weight: 700; margin: 0 0 6px; color: var(--text); }
/* 予定（告知）の欄とは別ブロックの「アクセス遮断」欄。今の状態が一目で分かるよう
   ラベル右にステータス文字を出す（遮断中だけ警告色で目立たせる）。 */
.maintenance-block-status { margin-left: 8px; font-weight: 400; font-size: var(--font-hint); color: var(--text-hint); }
.maintenance-block-status.is-on { color: var(--color-warn-text); font-weight: 700; }
/* 「アクセスを遮断する」チェック。オンにすると影響が大きい操作なので警告色で目立たせる。
   チェック自体はアプリ共通の押しやすい大きさ（--checkbox-size）、文言は控えめに小さく。
   セレクタを .announce-dialog .maintenance-block-checkbox（クラス2つ）にしているのは、
   共通の "confirm-dialog label{font-size:22px}"（745-750行目）に負けないようにするため。 */
.announce-dialog .maintenance-block-checkbox { align-items: center; color: var(--color-warn-text); font-weight: 700; font-size: var(--font-note); }
/* input[type="checkbox"] まで書いて詳細度を上げる（既存の "form label.checkbox input{width:auto}"
   （291-292行目）に width: auto で上書きされてしまうため、それより詳細度を高くする必要がある）。 */
.maintenance-block-checkbox input[type="checkbox"] {
  width: var(--checkbox-size); height: var(--checkbox-size); flex: 0 0 auto;
}
.maintenance-block-checkbox input[type="checkbox"]:checked {
  background: var(--color-warn); border-color: var(--color-warn); /* 警告色（影響が大きい操作なので目立たせる） */
}
/* 日付・「開始」・時刻・「終了」・時刻の5要素を折り返さず必ず1行に収める。
   container-type: inline-size … この枠の実際の幅を基準にコンテナクエリ単位(cqw)が使えるようにする
   （子要素の font-size に cqw を使うことで、枠が狭いスマホでは自動的に文字が小さくなり、
   PC等の広い枠ではそれぞれ clamp() の上限＝今までと同じ大きさで頭打ちになる）。 */
.maintenance-datetime {
  display: flex;
  align-items: center;
  justify-content: center;   /* 5要素を枠の中央にまとめる（左寄りで右側が余るのを防ぐ） */
  flex-wrap: nowrap;
  container-type: inline-size;
  gap: 8px;
  padding: var(--record-datetime-pad);
  border: 1px solid var(--border);
  border-radius: 8px;
}
.maintenance-datetime .rdt-date,
.maintenance-datetime .rdt-time {
  border: none;
  background: transparent;
  padding: var(--record-datetime-time-pad);
  font-family: inherit;
  /* 上限は今までと同じ --record-datetime-font（18px）。下限は潰れすぎない8px。 */
  font-size: clamp(8px, 5.5cqw, var(--record-datetime-font));
  white-space: nowrap;
  color: var(--color-accent);
  font-weight: 700;
  cursor: pointer;
}
.maintenance-datetime .rdt-date:active,
.maintenance-datetime .rdt-time:active { opacity: .6; } /* タップの反応（スマホ） */
.maintenance-datetime .maintenance-sep {
  font-size: clamp(7px, 3.2cqw, 13px);
  white-space: nowrap;
  color: var(--text-hint);
}
/* 「予定を削除」ボタンは他の2つ（保存／キャンセル）より少し控えめな幅にする。 */
.confirm-actions .maintenance-clear-btn { flex: 0.6; }

/* ボタンの右側に出すバッジ群（お知らせ編集＝アクセス遮断中／メンテナンス予定あり、
   出荷・設定・作業計画＝「今日のやること」の件数）。アイコン（左端固定）と対になる形で
   右端に固定する。複数同時に出ることがあるので横並びのコンテナ（.menu-badges）でまとめ、
   右端固定はコンテナ側だけに持たせる。設定画面のボタン（.set-btn）でも同じ型を使う。 */
.menu-btn .menu-badges,
.set-btn .menu-badges {
  position: absolute;
  right: var(--btn-menu-pad-x);
  top: 50%;
  transform: translateY(-50%);
  display: flex;
  align-items: center;
  gap: 6px;
  line-height: 0;
}
.menu-btn .menu-badge { color: var(--color-warn); }               /* 既定＝注意色（橙） */
.menu-btn .menu-badge--block { color: var(--color-error); }       /* アクセス遮断中は危険色（赤）で強調 */
.menu-btn .menu-badge svg { width: 22px; height: 22px; display: block; }
.menu-btn .menu-badge--block svg { width: 34px; height: 34px; }   /* 遮断中はより目立つよう一回り大きく */

/* 「今日のやること」の件数バッジ（出荷ボタン=「出荷中」／設定ボタン=「予定超過」）。
   小さなラベルの下に、⑥のような「赤い丸に白抜き数字」を大きめに出す縦2行構成。
   放置するとお金の計算が狂う項目の合図。0件のときは home.php がバッジ自体を出さない
   ＝「出ていたら対応が必要」というサイン。 */
.menu-btn .menu-badge--count,
.set-btn .menu-badge--count {
  display: flex;
  flex-direction: column;               /* ラベルの下に丸数字を縦に積む */
  align-items: center;                  /* 左右は中央揃え */
  gap: 7px;                             /* ラベルと丸数字のすき間 */
  /* 最長ラベル「予定超過」（14px×4文字=56px）に合わせた最小幅。出荷ボタンの「出荷中」
     （3文字）も同じ幅の箱の中央に置かれるため、2つのバッジの横位置（中心線）が上下で揃う。 */
  min-width: 56px;
  color: inherit;                       /* ラベルはボタンの文字色に合わせる（.menu-badge 既定の橙を打ち消す） */
}
.menu-btn .menu-badge-count-label,
.set-btn .menu-badge-count-label {
  font-size: 14px;
  font-weight: 700;
  line-height: 1;
  white-space: nowrap;                  /* 「予定超過」を途中で折り返させない */
}
.menu-btn .menu-badge-count-num,
.set-btn .menu-badge-count-num {
  /* 数字を丸の中央にきっちり置くため、flex で上下左右とも中央揃えにする */
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: 30px;                      /* 1桁なら直径30pxの正円になる */
  height: 30px;
  padding: 0 6px;                       /* 2桁以上でも数字が丸からはみ出さない（横に伸びて楕円になる） */
  border-radius: 999px;                 /* 高さの半分より大きい角丸＝正円/カプセル形になる */
  background: var(--color-error);       /* 地＝危険色の赤 */
  color: var(--color-on-danger);        /* 数字＝白（赤地の上で読める色） */
  font-size: 17px;
  font-weight: 700;
  /* 白い縁取り。出荷ボタン（ピンク地）のように赤と近い色の上でも輪郭がはっきり出るように。 */
  box-shadow: 0 0 0 2px var(--color-on-danger);
}

/* メンテナンス告知（ホーム画面・ログイン画面の両方で使う共通クラス。警告色で目立たせる）。 */
.notice-maintenance { color: var(--color-warn-text); font-weight: 700; }

/* =============================================================================
   確認ダイアログ（はい／いいえ）共通スタイル
   ── ログアウト確認・マスターログイン・管理者作成・ホーム画面設定など、
      class="confirm-dialog" を付けた <dialog> すべてに効く。

   ★フォントサイズの一元管理（重要）
     見出しと中身の文字サイズは、下の2つの変数（--dialog-*-size）だけで決まる。
     ここを書き換えれば、全ダイアログのタイトル／中身のサイズが一斉に変わる。
     今後ダイアログを増やすときも、
       ・外側に class="confirm-dialog"（＋必要なら独自クラス）
       ・見出しは class="confirm-title"
       ・中身は .confirm-message / <p> / <label> / <select> / <input> / .check-row
     を使えば、指定なしで自動的にこのサイズに揃う。
   ============================================================================= */
.confirm-dialog {
  /* ↓↓↓ ダイアログの文字サイズはこの2つで一元管理する ↓↓↓ */
  --dialog-title-size: 24px;   /* 見出し（.confirm-title）の文字サイズ */
  --dialog-body-size: 22px;    /* 中身（本文・ラベル・入力欄など）の文字サイズ。
                                  入力欄は 16px 未満だとスマホ（特にiPhone）で入力時に
                                  画面が勝手に拡大するため、必ず 16px 以上を保つこと。 */
  border: none;
  border-radius: var(--radius-dialog);   /* 全モーダル共通の角丸（14px。旧12px→統一） */
  padding: var(--dialog-pad);            /* 全モーダル共通の余白（16px。旧20px→統一） */
  width: min(90vw, 320px);       /* 画面幅の90%か320pxの小さい方（スマホでも収まる） */
  box-shadow: var(--dialog-shadow);      /* 全モーダル共通の影（旧α.2→.25に統一） */
  white-space: normal;           /* 本文は普通に折り返す。「？」ヘルプのダイアログは
                                    折り返し禁止（.rate-label の nowrap）なラベルの中に
                                    出力されることがあり、その指定が継承されて文章が
                                    1行に伸びる（横スクロールが出る）のを打ち消す */
}
/* ::backdrop … ダイアログの背後（画面全体）を暗くする専用の指定。 */
.confirm-dialog::backdrop { background: var(--dialog-backdrop); }   /* 全モーダル共通の幕（旧α.4→.45に統一） */
/* マスターログイン／管理者作成のポップアップは、入力欄が入るよう少し広く。 */
.master-dialog { width: min(92vw, 360px); }

/* 履歴タブ：出荷ロット編集ダイアログ（日付・時刻だけ編集可・他は表示のみ）。
   中身は .init-form.shipping-form を付けて出荷入力タブと同じ「ピンクラベル＋隣接する入力欄」
   の見た目にそろえる（.init-row/.init-label/.init-input/.record-datetime はそちらのCSSが効く）。
   畑変更時の確認・値下げ明細の編集・ロット削除は次のステップ以降で追加。 */
.history-edit-dialog { width: min(96vw, 460px); }
/* タイトル「出荷の記録を編集」と右端の「記録を削除」ボタンを1行に並べる。 */
.history-edit-title-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  margin: 0 0 8px;      /* 共通 .confirm-title の下マージンをここへ移す（中の <p> 側は0にする） */
}
.history-edit-title-row .confirm-title { margin: 0; }
/* 「記録を削除」は他の操作ボタン（下部の大きい確定/キャンセル）より控えめな小さめサイズにする。 */
.history-edit-delete-btn {
  flex: 0 0 auto;
  padding: 4px 10px;
  font-size: var(--font-note);
  font-weight: 700;
  border: none;
  border-radius: var(--radius-control);
  cursor: pointer;
}
/* 「最後の精算記録を編集」：記録画面の「＋素材を追加」（破線枠・薄い色の背景・濃いめの文字）と
   同じ見た目にする。色だけ記録画面の緑ではなく出荷画面のピンク系トークンを使う。 */
.history-edit-tail-start-btn {
  display: block;
  width: 100%;
  min-height: var(--item-row-h);
  padding: 10px;
  border: 1px dashed var(--color-shipping);
  border-radius: var(--radius-control);
  background: var(--color-shipping-bg);
  color: var(--color-shipping-text);
  font-size: var(--font-note);
  font-weight: 700;
  cursor: pointer;
}
.history-edit-tail-start-btn:hover { background: var(--color-shipping-bg-hover); }
/* 末尾行編集中の下部ボタン「削除」：OK/キャンセルの半分の横幅にする
   （共通の .confirm-actions button は flex:1 なので、ここだけ 0.5 に上書き）。 */
.confirm-actions .history-edit-tail-del-btn { flex: 0.5; }
/* 出荷入力タブは画面いっぱいの横幅を前提にしているため、ダイアログ内では項目の縦間隔だけ少し詰める。 */
.history-edit-form { gap: 10px; }
/* 日時・出荷先・畑をまとめる器。.history-edit-form 直下から1階層深くなった分、
   中の項目間隔（gap）をここで肩代わりする（無いと3項目がぴったりくっついて見える）。 */
#history-edit-top-fields { display: flex; flex-direction: column; gap: 10px; }
/* 「畑」「野菜」等の項目名(<label>)は、共通の .confirm-dialog label ルール（22px）に負けて
   履歴タブの絞り込み（出荷先・野菜・条件）より大きく見えてしまう。詳細度を上げて元の16pxに戻し、
   一覧の項目名と同じ見た目にそろえる（入力欄側は #history-edit-dialog の --dialog-body-size
   上書きで16pxに揃える。ここではラベルだけ念のため詳細度を確保しておく）。 */
.history-edit-form .init-label { font-size: var(--font-input); }
/* 一覧のカード見出し（.history-lot-head）をそのまま複製して表示する枠。
   .settle-lot-head は一覧の中で使う前提の上下余白(padding:10px 4px)を持っているため、
   ダイアログ内ではその分だけ下に間延びして見える。ここだけ詰める（一覧側の見た目には影響しない）。 */
#history-edit-head { margin: 0; }
#history-edit-head .settle-lot-head { padding-bottom: 0; }
/* 一覧では .history-lot-head がタップで開閉するボタンなので cursor:pointer が付くが、
   このダイアログ内は表示専用のクローン（開閉しない）なので、押せそうに見えないよう既定カーソルに戻す。 */
#history-edit-head .history-lot-head { cursor: default; }
/* 閉じるボタンの上にも、項目同士（畑・野菜の間など）と同じ間隔をあける（.history-edit-form の gap と揃える）。 */
.history-edit-dialog .confirm-actions { margin-top: 10px; }

/* 値下げ・確定の履歴（★削除はまだ器のみ。中身の .settle-detail-row は履歴タブの一覧と
   共通のクラスなのでそのまま同じ見た目になる）。 */
.history-edit-details-list { display: flex; flex-direction: column; }

/* 販売確定金額の説明ポップアップ：手数料差引の例を表で見せるため少し幅広に。 */
#kakutei-kingaku-help-dialog { width: min(92vw, 360px); }
.kakutei-help-table {
  width: 100%;
  border-collapse: collapse;
  margin: 8px 0 16px;   /* 下にも余白を入れ、下の「閉じる」ボタンと詰まらないようにする */
  font-size: var(--font-hint);
}
.kakutei-help-table th,
.kakutei-help-table td {
  border: 1px solid var(--border);
  padding: 4px 8px;
  text-align: right;
}
.kakutei-help-table th { background: var(--surface-disabled); text-align: center; }
.kakutei-help-table td:first-child { text-align: left; }
/* 最終行「支払金額」＝実際に入力する金額なので、薄い緑地で目立たせる。 */
.kakutei-help-table .kakutei-help-total td { background: rgba(46, 125, 50, 0.12); font-weight: 700; }

/* 記録画面「作業者を追加」「作業内容を追加」モーダルの入力レイアウト。
   ラベルを上・入力欄を下に積み、入力欄は横幅いっぱいにする。
   セレクタを #id にして、共通の .confirm-dialog input（22px）より優先させる。
   ※ 作業者・作業内容・出荷先の各ダイアログで同じレイアウトを使うので、id をカンマで並べて共通化。 */
/* このモーダルだけ少し横幅を広げる（共通の .master-dialog=360px より優先。#id で詳細度が高い）。 */
#worker-add-dialog,
#sagyou-add-dialog,
#sozai-add-dialog,
#saki-add-dialog,
#hatake-add-dialog,
#yasai-add-dialog { width: min(94vw, 440px); }
#worker-add-dialog label,
#sagyou-add-dialog label,
#sozai-add-dialog label,
#saki-add-dialog label,
#hatake-add-dialog label,
#yasai-add-dialog label { display: block; margin: 0 0 12px; font-weight: 600; }
#worker-add-dialog input,
#worker-add-dialog textarea,
#sagyou-add-dialog input,
#sagyou-add-dialog textarea,
#sozai-add-dialog input,
#sozai-add-dialog textarea,
#sozai-add-dialog select,
#saki-add-dialog input,
#saki-add-dialog textarea,
#hatake-add-dialog input,
#hatake-add-dialog textarea,
#hatake-add-dialog select,
#yasai-add-dialog input,
#yasai-add-dialog textarea,
#yasai-add-dialog select {
  display: block; width: 100%; margin-top: 4px;
  padding: 8px; box-sizing: border-box;
  border: 1px solid var(--border-input); border-radius: 6px;
  font-size: var(--font-input);   /* 16px 未満だとスマホで入力時に画面が勝手に拡大するため */
}
/* 落とし穴: 上の「select { display: block }」は、js-picker が元の <select> を
   隠すために付ける hidden 属性（＝UAスタイルの display:none）に打ち勝ってしまい、
   隠したはずの素材 <select> が二重に見えてしまう。hidden のときは確実に隠す
   （#id + 属性でこのルールの詳細度を上げて優先させる）。 */
#sozai-add-dialog select[hidden],
#hatake-add-dialog select[hidden],
#yasai-add-dialog select[hidden] { display: none; }

/* 野菜追加ダイアログの規格表（.kikaku-table）内の入力欄は、上の「#yasai-add-dialog input」
   （枠付き・padding:8px全方向）に詳細度で勝たれてしまい、本来の.kikaku-inputの見た目
   （枠なし・セルいっぱい＝表の枠線を活かす）が壊れる。#yasai-edit-dialogは規格表がlabelの
   外に無い構造なので直接子孫セレクタ(>)で回避しているが、こちらは<table>がlabelの外にある
   ため、詳細度を上げて元の見た目を明示的に復元する方式にした。 */
#yasai-add-dialog .kikaku-input {
  width: 100%; box-sizing: border-box; margin-top: 0;
  border: none; border-radius: 0; background: var(--surface-card);
  font-size: var(--font-input); padding: 10px 8px; font-family: inherit;
}
#yasai-add-dialog .kikaku-kosuu .kosuu-input { padding-right: 26px; text-align: right; }

/* 作業者追加ダイアログの時間単価（単位「円」付き）。上の「#worker-add-dialog input」
   （padding:8px の全方向指定）が詳細度で勝ってしまい、共通の
   ".init-unit-wrap .init-input"（padding-right:30px）が効かなくなるため、
   #id を付けて詳細度を上げ、単位と数字が重ならないよう右余白を確保する。
   数字は右寄せ（他の単位付き入力欄と統一。2026-07-14）＝単位「円」は右端に固定表示。 */
#worker-add-dialog .init-unit-wrap .init-input { padding-right: 30px; text-align: right; }

/* 出荷先追加ダイアログの手数料（単位「%」付き）。上と同じ理由で #id を付けて詳細度を上げる。 */
#saki-add-dialog .init-unit-wrap .init-input { padding-right: 30px; text-align: right; }

/* 項目数が多いフォーム系ダイアログは、一覧表示（畑の編集など初期設定画面）の入力欄と同じ16pxに
   揃える（共通の .confirm-dialog は22pxだが、ラベル・入力欄が並ぶ画面には大きすぎるため）。
   --dialog-body-size を上書きするだけで、ラベル・入力欄・チェック行がまとめて変わる
   （.confirm-dialog の「label/select/input/.check-row { font-size: var(--dialog-body-size) }」
   ルールがそのまま効く）。対象を増やすときはこのセレクタにIDを追加するだけでよい。 */
#saki-add-dialog,
#yasai-edit-dialog,
#customer-add-dialog,
#customer-edit-dialog,
#master-dialog,
#worker-add-dialog,
#sagyou-add-dialog,
#sozai-add-dialog,
#hatake-add-dialog,
#yasai-add-dialog,
#history-edit-dialog { --dialog-body-size: var(--font-input); }

/* 規格編集ダイアログ（出荷入力タブ「＋ 規格の編集」＝#yasai-edit-dialog）。
   野菜名・荷姿・メモは上の追加ダイアログ群と同じ「ラベル縦積み＋枠付き入力欄」に揃えるが、
   規格テーブル（.kikaku-table）内の入力欄は既にそちら専用のスタイル（.kikaku-input）を
   持っているため、直接の子要素（>）だけを対象にして重複適用・崩れを避ける。 */
#yasai-edit-dialog { width: min(94vw, 440px); }
#yasai-edit-dialog > label { display: block; margin: 0 0 12px; font-weight: 600; }
#yasai-edit-dialog > label > input,
#yasai-edit-dialog > label > select,
#yasai-edit-dialog > label > textarea {
  display: block; width: 100%; margin-top: 4px;
  padding: 8px; box-sizing: border-box;
  border: 1px solid var(--border-input); border-radius: 6px;
  font-size: var(--font-input);
}
#yasai-edit-dialog .kikaku-table { margin-bottom: 12px; }
/* 野菜（この画面では変更不可）は入力欄ではなく「野菜：〇〇」の文字だけの表示にする。
   他のラベルと同じ太字・余白で揃える（値の部分だけ通常の太さに戻す）。 */
#yasai-edit-dialog .yed-yasai-display { margin: 0 0 12px; font-weight: 600; }
#yasai-edit-dialog .yed-yasai-display span { font-weight: 400; }
/* 荷姿はラベルと選択欄を1行に横並びで見せる（上の縦積みルールをこの行だけ上書き）。 */
#yasai-edit-dialog > label.yed-row-inline {
  display: flex; align-items: center; gap: 12px;
}
#yasai-edit-dialog > label.yed-row-inline > select {
  width: auto; flex: 1; margin-top: 0;
}
/* 素材ドロップダウンを js-picker（自作ドロップダウン）にしたときの表示ボタン。
   .picker-display は <button> なので上の「select」向けの枠・余白を受け継がない。
   ここで他の入力欄と同じ枠・余白・文字サイズに揃える。
   ※ 文字を左・▾を右に振り分ける display:flex（共通の .picker-display）は上書きしない。 */
#sozai-add-dialog .picker-display,
#hatake-add-dialog .picker-display,
#yasai-add-dialog .picker-display {
  width: 100%; margin-top: 4px;
  padding: 8px; box-sizing: border-box;
  border: 1px solid var(--border-input); border-radius: 6px;
  font-size: var(--font-input);
}
/* マスターログインダイアログ（#master-dialog）のマスター選択を js-picker にしたときの表示ボタン。
   このダイアログの入力欄はネイティブ表示（枠はブラウザ標準）だが、.picker-display は <button> で
   その枠を持たないため、標準的な入力欄風の枠・余白を付けて隣のパスワード欄と揃える。
   文字サイズはこのダイアログの他の入力欄と同じ（var で一元管理。16px＝スマホ自動ズーム防止の下限）。
   ※ display:flex（文字左・▾右）は共通の .picker-display を活かすため上書きしない。 */
#master-dialog .picker-display {
  width: 100%; margin-top: 4px;
  padding: 8px; box-sizing: border-box;
  border: 1px solid var(--border-input); border-radius: 6px;
  font-size: var(--dialog-body-size);
}
/* メモ欄：最初から2行ぶん見える高さにし、リサイズは“縦方向だけ”許可する
   （横に伸ばせるとダイアログの幅を超えてレイアウトが崩れるため縦のみに制限）。 */
#worker-add-dialog textarea,
#sagyou-add-dialog textarea,
#sozai-add-dialog textarea,
#saki-add-dialog textarea {
  min-height: 3.4em;   /* 約2行ぶん（行の高さ1.5 × 2 ＋ 余白） */
  resize: vertical;    /* both（縦横）ではなく縦だけ変更可にする */
}
#worker-add-dialog .error,
#sagyou-add-dialog .error,
#sozai-add-dialog .error,
#saki-add-dialog .error { margin: 0 0 12px; }
/* 素材追加ダイアログ：単価入力欄＋単位の行。
   ・固定単位の素材（肥料等）… 時間単価と同じ .init-unit-wrap 方式で、入力欄の枠内に
     単位（例: 円/1kgあたり）を重ねる。入力欄は行の全幅（is-narrowなし）。
     数字は他の単位付き入力欄と同じ右寄せ（2026-07-14統一）＝単位のすぐ左にくっつく。
     padding-right は単位の最大長「円/1セットあたり」が収まるよう広めに確保してあるので、
     右寄せでも数字と単位の文字が重ならない。
   ・「資材」… 単位が5択から選ぶ形になるため、入力欄を狭めて(is-narrow)右にドロップダウンを
     並べる（JSのupdateTanniが #so-tanka-wrap の is-narrow クラスを付け外しして切り替える）。
   ここは #sozai-add-dialog input の共通ルール（display:block; width:100%; padding:8px）を
   打ち消す必要があるため、#id を付けて詳細度を上げている。 */
#sozai-add-dialog .sozai-tanka-row { display: flex; align-items: center; gap: 8px; }
#sozai-add-dialog .init-unit-wrap { flex: 1; margin-top: 0; }
#sozai-add-dialog .init-unit-wrap .init-input { padding-right: 100px; text-align: right; margin-top: 0; line-height: 20px; }
/* 資材選択時：単価入力欄は残り幅いっぱい、単位ドロップダウンは最長の選択肢
   「円/1セットあたり」の表示幅にぴったり合わせた固定幅にする（残り幅を単価欄に回す）。
   単位は右のドロップダウン側で選ぶので、数字は他の単位付き入力欄と同じ右寄せに戻す。 */
#sozai-add-dialog .init-unit-wrap.is-narrow { flex: 1 1 auto; min-width: 0; }
#sozai-add-dialog .init-unit-wrap.is-narrow .init-input { padding-right: 8px; text-align: right; }
/* 資材の単位ドロップダウン（js-picker化される <select> の入れ物）。
   flex を伸縮なし（0 0）にして固定幅にし、中の .picker-wrap（既定 flex:1）・
   .picker-display（既定 width:100%）が親の幅にそのまま収まるようにする。 */
#sozai-add-dialog .sozai-tanni-wrap { display: flex; flex: 0 0 150px; margin-top: 0; }
/* 左の単価入力欄と高さ・上端をそろえるための2点セット（実際に踏んだ2つの段差の原因）。
   ① line-height：この単位ボタンは文字を小さく(13px)して幅150pxに収めているため、
     line-height が既定値（フォントサイズに連動する相対値）のままだと文字が小さい分
     だけ高さが低くなる→絶対px値でそろえて解消（単価欄側も同じ20pxにしてある）。
   ② margin-top：共通ルール #sozai-add-dialog .picker-display の margin-top:4px を
     引き継いだままだと、margin-top:0 の単価欄より4px下にずれる→ここで打ち消す。 */
#sozai-add-dialog .sozai-tanni-wrap .picker-display { font-size: 13px; padding: 8px 6px; line-height: 20px; margin-top: 0; }

/* 見出し。サイズは変数で。セレクタを .confirm-dialog .confirm-title（クラス2つ）に
   しているのは、下の「中身」ルール（.confirm-dialog p など）に負けて小さくならないため。 */
.confirm-title { margin: 0 0 8px; font-weight: 700; }
.confirm-dialog .confirm-title { font-size: var(--dialog-title-size); }
/* 中身の文字（本文・説明文・ラベル・選択欄・入力欄・チェック行）を一括で同じサイズに。 */
.confirm-dialog .confirm-message,
.confirm-dialog p,
.confirm-dialog label,
.confirm-dialog select,
.confirm-dialog input,
.confirm-dialog .check-row { font-size: var(--dialog-body-size); line-height: 1.5; }
.confirm-message { margin: 0 0 20px; }

/* ボタン（はい／いいえ 等）は、文字量が少なく押しやすさ優先なので固定サイズのまま。 */
.confirm-actions { display: flex; gap: 10px; }        /* ボタンを横並び */
.confirm-actions button {
  flex: 1;                        /* 2つのボタンを均等幅に */
  padding: 12px;
  border: none;
  border-radius: 8px;
  font-size: var(--font-input);
  cursor: pointer;
}
/* ボタンの色は「主アクション=緑 / 副アクション=グレー」で統一。
   ダイアログ内だけでなく通常ページ（初期設定の確定/キャンセル等）でも使い回せるよう、
   場所を限定しない共通クラスにしている（形は各コンテナ側で padding 等を指定）。 */
.btn-yes { background: var(--color-primary); color: var(--color-on-primary); }  /* 確定/はい/OK = 青で強調 */
.btn-yes:hover { background: var(--color-primary-hover); }
.btn-no  { background: var(--color-cancel); color: var(--color-on-cancel); }  /* キャンセル/いいえ = 控えめグレー */
.btn-no:hover { background: var(--color-cancel-hover); }
.btn-del { background: var(--color-danger); color: var(--color-on-danger); }  /* 削除 = 濃いめのピンク・白文字 */
.btn-del:hover { background: var(--color-danger-hover); }

/* --- 共通：正常／エラー メッセージ ダイアログ（flash_dialog.php） ---
   set_flash_message() で積んだメッセージを、画面中央に大きく表示する共通ダイアログ。
   正常=緑・エラー=赤。アイコン＋大きな本文＋OKボタン。 */
.flash-dialog { width: min(94vw, 460px); text-align: center; }
/* 上部の大きめアイコン（成功=✓ / エラー=！）。色は種類で切り替える。 */
.flash-icon { margin: 2px auto 12px; width: 68px; height: 68px; line-height: 0; }
.flash-icon svg { width: 68px; height: 68px; display: block; }
.flash-dialog.is-ok    .flash-icon { color: var(--color-success); }
.flash-dialog.is-error .flash-icon { color: var(--color-error); }
/* 本文はデカデカと大きく。.confirm-dialog p（共通の本文サイズ）より優先させるため、
   詳細度の高い .flash-dialog .flash-text で指定する。 */
.flash-dialog .flash-text { font-size: 24px; font-weight: 700; line-height: 1.5; margin: 0 0 22px; }
.flash-dialog.is-ok    .flash-text { color: var(--color-success); }
.flash-dialog.is-error .flash-text { color: var(--color-error); }
/* 補足の一文（例: 写真の残り枚数のお知らせ）。本文（24px）より少しだけ小さい文字で添える。
   本文（.flash-text）の下マージンを打ち消してから、自分の下に余白を取り直す。 */
.flash-dialog .flash-note {
  font-size: 19px; font-weight: 400; line-height: 1.6;
  color: var(--text); margin: -10px 0 22px;
}
/* 補足の中の【】で囲んだ部分（例:【残り1枚】）。赤い太字で目立たせる。
   ＝「あと何枚しか撮れないか」を一目で分かるようにするための強調。 */
.flash-dialog .flash-note-strong { color: var(--color-error); font-weight: 700; }
/* エラー時は OK ボタンも赤系にする（正常時は共通の緑 .btn-yes のまま）。 */
.flash-dialog.is-error .btn-yes { background: var(--color-error); }
.flash-dialog.is-error .btn-yes:hover { background: var(--color-error-hover); }

/* =============================================================================
   表示設定の画面（/settings/display。端末ごとの見た目の設定）
   ※ .disp-page 配下だけに効くよう限定する（お客様情報カード .cinfo-card と同じ型）。
   ============================================================================= */

/* 画面全体を縦に積む（上部バー→設定のかたまり→ボタン）。
   padding-bottom … 下部固定のボタンバー(.init-actions)に中身が隠れないよう空ける余白
   （初期設定画面の .init-setting と同じ考え方・同じ値）。 */
.disp-page { display: flex; flex-direction: column; gap: 14px; padding-bottom: 96px; }

/* 設定のかたまり（白い箱）。角丸・枠線はアプリ共通のトークンを使う。 */
.disp-group {
  background: var(--surface-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  padding: 14px 16px 16px;
}
/* かたまりの見出し（「ホーム画面のボタン」「時刻の表示」）。下に細い区切り線。 */
.disp-group-title {
  margin: 0 0 10px; padding-bottom: 8px;
  font-size: 17px; font-weight: 700; color: var(--text);
  border-bottom: 1px solid var(--border-light);
}
/* 見出しの下の補足説明。 */
.disp-note { margin: 0 0 12px; font-size: 13px; color: var(--text-hint); line-height: 1.6; }

/* 1行＝チェック□＋説明文。label で囲んでいるので文字を押しても切り替わる。 */
.disp-group .check-row {
  display: flex; align-items: center; gap: 10px;
  padding: 7px 0; font-size: 16px; cursor: pointer;
}
/* チェック□は指で押しやすいよう少し大きめに（幅100%にはしない＝flex:0 0 auto）。 */
.disp-group .check-row input[type="checkbox"] {
  width: var(--checkbox-size); height: var(--checkbox-size); flex: 0 0 auto; cursor: pointer;
}

/* --- 2択の選び分け（時／分） --- */
/* 左に「時」「分」のラベル、右に2つのボタン。 */
.disp-row { display: flex; align-items: center; gap: 12px; padding: 7px 0; }
.disp-row-label { flex: 0 0 2.5em; font-size: 16px; font-weight: 700; color: var(--text); }

/* 2つのボタンを横に並べた切り替え（セグメント）。丸いラジオ本体は隠し、
   囲みの <span> をボタンとして見せる（押しやすく・選択中が一目で分かる）。 */
.disp-seg { display: flex; gap: 8px; flex: 1 1 auto; }
.disp-seg label { flex: 1 1 0; cursor: pointer; }
/* ラジオ本体は見えなくする（見た目は span 側で作る）。 */
.disp-seg input[type="radio"] { position: absolute; opacity: 0; width: 0; height: 0; }
.disp-seg span {
  display: block; text-align: center;
  padding: 10px 6px; font-size: 16px;
  background: var(--surface-input); color: var(--text);
  border: 1px solid var(--border-input); border-radius: var(--radius-control);
}
/* :has(...) ＝「中の input が選ばれている label」を選ぶ書き方。選択中は青く塗る。 */
.disp-seg label:has(input:checked) span {
  background: var(--color-accent); color: var(--color-on-accent);
  border-color: var(--color-accent);
  font-weight: 700;
}
/* キーボード操作でも今どこにいるか分かるように、フォーカス時は枠を目立たせる。 */
.disp-seg label:has(input:focus-visible) span {
  outline: 2px solid var(--color-accent-soft); outline-offset: 2px;
}

/* --- 見本（選んだ書き方で「8月14日 9時5分」を表示） --- */
.disp-sample {
  display: flex; align-items: center; gap: 12px;
  margin-top: 12px; padding: 10px 12px;
  background: var(--color-accent-bg); border-radius: var(--radius-control);
}
.disp-sample-label { flex: 0 0 auto; font-size: 13px; color: var(--text-hint); }
.disp-sample-value { font-size: 17px; font-weight: 700; color: var(--text); }


/* =============================================================================
   設定する画面（設定メニュー・モック準拠）
   ※ .settings 配下だけに効くよう限定する。
   ============================================================================= */

/* --- 上部バー：左に「×」戻る、中央に見出し --- */
/* 全画面共通の上部バー。色は各画面が付けるクラス（.topbar-record など）で --bar-bg を指定する
   ＝「遷移元のホームボタンと同じ色」になる（下の .topbar-* を参照）。
   ★画面上部に固定する（position:fixed）＝スクロールしても常に見える（スクロール対象から外す）。
     ・left/right:0 で画面の端まで届く“全幅の帯”にする（下部の .init-actions と同じ作法）。
       fixed は画面（ビューポート）基準なので、右のスクロールバー領域まで隙間なく埋まる。
     ・max-width＋margin:auto で、本文カラム（480px）と同じ幅で中央に置く。
   色を指定しない画面のための既定は白背景・濃い文字（従来の見た目に近い保険）。 */
.settings-bar {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 20;                                          /* 本文より前面に */
  max-width: 480px;                                     /* .app-main と同じ幅 */
  margin: 0 auto;                                       /* 画面中央に寄せる */
  display: flex;
  align-items: center;
  gap: var(--bar-gap);
  height: calc(var(--bar-h) + env(safe-area-inset-top));  /* 帯の高さ（52px＋ノッチ分を上に足す） */
  padding: env(safe-area-inset-top) var(--bar-pad-x) 0;   /* 上＝ノッチ分／左右16px */
  background: var(--bar-bg, #fff);                      /* 帯の色（既定は白） */
  color: var(--bar-fg, var(--text));                        /* 帯の文字色（既定は濃い文字） */
  box-sizing: border-box;                              /* padding込みで幅計算（はみ出し防止） */
}
/* 上部バーを固定したぶん、本文が帯の下に隠れないよう、帯の高さぶん上に余白を空ける。
   （帯を持つ画面＝.topbar-* が付いた画面だけに効かせる。ホーム/ログインは対象外。） */
.topbar-record,
.topbar-edit,
.topbar-shipping,
.topbar-settings,
.topbar-stats,
.topbar-customer-info,
.topbar-nikki {
  padding-top: calc(var(--bar-h) + env(safe-area-inset-top));  /* 帯の高さぶん本文を下げる（.settings-bar の height と必ず一致） */
}
/* 上部バーの色＝ホーム画面の「遷移ボタン」と同じ色にする（.topbar-* を画面の外枠に付ける）。
   文字色はホームボタンと同じ濃い色（var(--text)）で全色共通（黄・グレーは白だと読めないため）。 */
.topbar-record   { --bar-bg: var(--color-record); }   /* 記録＝緑 */
.topbar-edit     { --bar-bg: var(--color-edit); }   /* 編集＝黄 */
.topbar-shipping { --bar-bg: var(--color-shipping); }   /* 出荷＝ピンク */
.topbar-settings { --bar-bg: var(--color-settings); }   /* 設定＝グレー */
.topbar-stats    { --bar-bg: var(--color-stats); }   /* 統計＝紫 */
.topbar-customer-info { --bar-bg: var(--color-customer-info); }   /* お客様情報＝khaki */
.topbar-nikki    { --bar-bg: var(--color-nikki); }   /* 農業日誌＝bisque */
/* 戻るボタン（Uターン矢印）。スマホの指でも押しやすいよう、当たり判定を 44px 四方に広げる。
   （中のアイコンの大きさは svg の width/height。box を広げてタップしやすくするのが狙い） */
.settings-close {
  flex: 0 0 auto;                  /* 幅は中身なりで固定（縮まない） */
  display: inline-flex;            /* 中のアイコンを…           */
  align-items: center;             /* …上下中央、              */
  justify-content: center;         /* …左右中央にそろえる。      */
  width: var(--bar-close-tap);     /* 指で押しやすい最小サイズ（縦横44px） */
  height: var(--bar-close-tap);
  margin: -6px 0 -6px -10px;       /* 当たり判定は広げつつ、見た目の位置は左端のまま */
  color: var(--bar-fg, var(--text));   /* 帯の文字色に追従（× アイコンは currentColor 描画） */
  text-decoration: none;
  line-height: 0;
  border-radius: var(--radius-control);   /* 操作部品の角丸（8px→トークンへ寄せ） */
}
.settings-close svg { width: var(--bar-close-icon); height: var(--bar-close-icon); display: block; }
/* 押した瞬間/ホバー時の反応（スマホは:active、PCは:hover）。どの帯色でも自然に見えるよう、
   文字色はそのまま・背景をうっすら暗くするだけにする。 */
.settings-close:hover,
.settings-close:active { background: rgba(0, 0, 0, 0.08); }
/* ホームへ戻るボタン（家アイコン）。右端に置き、左端の戻るボタンと“対”にする（app.js が全バーに足す）。
   見た目・当たり判定は .settings-close の左右反転版（44px 四方・右に -10px はみ出しで右端にそろえる）。 */
.settings-home {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: var(--bar-close-tap);
  height: var(--bar-close-tap);
  margin: -6px -10px -6px 0;        /* 当たり判定は広げつつ、見た目の位置は右端のまま */
  color: var(--bar-fg, var(--text));
  text-decoration: none;
  line-height: 0;
  border-radius: var(--radius-control);
}
/* 家アイコンは線が多く大きく見えるので、戻る矢印(34px)より少し小さめ(28px)にする。タップ領域(44px)は据え置き。 */
.settings-home svg { width: 28px; height: 28px; display: block; }
.settings-home:hover,
.settings-home:active { background: rgba(0, 0, 0, 0.08); }
/* 画面単位ヘルプの「？」（上部バーの見出し文字のすぐ右）。
   help_button('screen-〜', 'bar-help') が出力する。「この画面でできること」を開く。
   丸は28pxで描きつつ、::after の透明な当たり判定でタップ域を44px相当に広げる
   （見た目は小さく・押しやすさは確保、の両立）。色は帯の文字色（currentColor）に追従。 */
.bar-help {
  position: relative;              /* ::after（透明のタップ領域）の基準 */
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  padding: 0;
  border: 1.5px solid currentColor;
  border-radius: 50%;
  background: transparent;
  color: inherit;                  /* 帯の文字色に追従 */
  font-size: 15px;
  font-weight: 700;
  line-height: 1;
  cursor: pointer;
  vertical-align: middle;          /* 見出し文字と上下中央をそろえる */
  margin-left: 8px;
}
.bar-help::after { content: ''; position: absolute; inset: -8px; } /* 透明のタップ領域（44px相当） */
.bar-help:hover,
.bar-help:active { background: rgba(0, 0, 0, 0.08); }

/* 画面単位ヘルプなど、文章が多いポップアップは幅を少し広げる（help_texts.php の wide 指定）。
   dialog.〜 と要素名を付けて詳細度を上げる（.confirm-dialog の width に確実に勝たせる）。 */
dialog.help-wide-dialog { width: min(92vw, 400px); }

/* ヘルプの箇条書き（画面単位ヘルプの本文）。左寄せ・行間広め・点は「・」風の標準表示。 */
.confirm-dialog .help-list {
  margin: 0;
  padding-left: 1.3em;             /* 箇条書きの点のぶんだけ字下げ */
  text-align: left;
}
.confirm-dialog .help-list li { margin-bottom: 10px; }
.confirm-dialog .help-list li:last-child { margin-bottom: 0; }

/* ヘルプ本文の中の「補足」（例：iPhoneで項目が見つからないときの追加手順）。
   本文より控えめに見せたいので小さめ・灰色。長めの文になるので中央寄せをやめて左寄せにする。 */
.confirm-dialog .help-note {
  margin: 10px 0 0;
  text-align: left;
  color: var(--text-hint);
  font-size: var(--font-hint);
}

/* 見出し「設定する」。中央に置く。左の戻る(44px)と右のホーム(44px)が左右対称なので、
   h1 は flex:1 で両者の間を埋め、text-align:center で自然に中央にそろう（右の作り物余白は不要）。 */
.settings-bar h1 {
  flex: 1;
  text-align: center;
  margin: 0;
  padding-right: 0;                /* 右端にホームボタン(実体)が付いたので、釣り合わせ用の余白は不要 */
  font-size: var(--bar-title-font);
  font-weight: 700;
  color: inherit;                  /* 帯の文字色（--bar-fg）に追従する */
}

/* --- メニュー（白い枠のボタンを縦に並べる） --- */
/* ボタン同士の縦の間隔は、ホームのメニューボタンと同じ --btn-gap(14px) にそろえる。 */
.settings-menu { display: flex; flex-direction: column; gap: var(--btn-gap); }

/* 各ボタン。アイコンは左端固定、ラベルはボタン全体の中央（home.php の menu-btn と同方針）。
   大きさ（高さ・文字・角丸・アイコン・左右余白）は、ホームのメニューボタンと同じ
   --btn-menu-* トークンに完全統一する（旧: 高さ72→80 / 文字21→22 / 角丸8→10 に変更）。
   白枠＋白地の見た目はこの画面固有なので、枠線(border)と白地(--surface-card)はそのまま残す。 */
.set-btn {
  position: relative;              /* 中のアイコンを絶対配置する基準 */
  display: flex;
  align-items: center;
  justify-content: center;         /* ラベルを横中央に */
  width: 100%;
  min-height: var(--btn-menu-h);   /* ホームのメニューボタンと同じ高さ（長い文言は折り返しで伸びる） */
  padding: 10px var(--btn-menu-pad-x);   /* 左右はメニューボタン共通の余白。上下10pxはこの箇所だけの値 */
  border: 1px solid var(--border);       /* モックの細い枠線 */
  border-radius: var(--btn-menu-radius); /* 角丸もメニューボタン共通（10px） */
  background: var(--surface-card); /* 白い面（アプリ共通の白＝--surface-card） */
  color: var(--text);
  font-size: var(--btn-menu-font); /* ラベルの文字もメニューボタン共通（22px） */
  font-weight: 700;
  text-decoration: none;
  cursor: pointer;
  font-family: inherit;            /* <button> でも本文と同じフォントにそろえる（既定リセット対策） */
}
/* ホバー（PC）と押した瞬間（スマホの:active）で薄いグレーにして、押せた実感を出す。 */
.set-btn:hover { background: var(--hover-bg); }
.set-btn:active { background: var(--active-bg); }
/* アイコンは左端に固定（ラベルの中央そろえに影響しないよう absolute にする）。 */
.set-btn .set-icon {
  position: absolute;
  left: var(--btn-menu-pad-x);     /* 左端アイコンの位置＝メニューボタン共通の左右余白にそろえる（旧22→20px） */
  top: 50%;
  transform: translateY(-50%);
  line-height: 0;
  color: var(--text);
}
.set-btn .set-icon svg { width: var(--btn-menu-icon); height: var(--btn-menu-icon); display: block; }
/* ラベルはボタン全体の中央。長い文言（ホーム画面設定）は折り返してもきれいに見せる。 */
.set-btn .set-label { text-align: center; line-height: 1.25; }
/* ラベルを背景イラスト（.set-btn-bg）より手前に置く（position を持たせて描画順を上げる）。 */
.set-btn .set-label { position: relative; }

/* --- 設定ボタンの背景イラスト（うっすらとしたカラー画） ---
   型: ボタンに「set-btn-art ＋ set-btn-<名前>」の2クラスを足し、::before レイヤーに絵を敷く。
   新しいボタンに絵を足すときは、assets にSVGを置いて下の background-image 1行を増やすだけ。
   設定メニューのボタン（.set-btn）だけでなく、各一覧画面の「＋新規作成」ボタン
   （.plan-add-btn。position:relative を持たせてある）にも同じ2クラスを足すだけで使える。
   ::before … ボタンの中に自動で作られる「最初の子レイヤー」。ここに絵を敷けば、
   ボタン本来の背景色（白・ホバー時のグレー）はそのまま生かせて、薄さも opacity 一発で調整できる。 */
.set-btn-art { overflow: hidden; }   /* 角丸からはみ出た絵を切り落とす */
.set-btn-art::before {
  content: "";
  position: absolute;
  inset: 0;                        /* ボタン全面に敷く（inset=上下左右0の略記） */
  background: center / cover no-repeat;  /* 絵をボタン全面に（歪ませず切り抜き）。画像は下で個別指定 */
  opacity: .35;                    /* うっすら（文字・アイコンの読みやすさ優先。濃さはここで調整） */
  pointer-events: none;            /* 装飾なのでタップ判定に影響させない */
}
.set-btn-hatake::before        { background-image: url("hatake-bg.svg"); }        /* 畑の風景 */
.set-btn-yasai::before         { background-image: url("yasai-bg.svg"); }         /* 並んだ野菜 */
.set-btn-sagyou-sya::before    { background-image: url("sagyou-sya-bg.svg"); }    /* 農作業をする人たち */
.set-btn-sagyou-naiyou::before { background-image: url("sagyou-naiyou-bg.svg"); } /* 農作業の道具と素材 */
.set-btn-shukka-saki::before   { background-image: url("shukka-saki-bg.svg"); }   /* 出荷のトラックと届け先 */
.set-btn-plan::before          { background-image: url("plan-bg.svg"); }          /* カレンダー・時計・育つ芽 */
.set-btn-home-display::before  { background-image: url("home-display-bg.svg"); }  /* スマホ＋歯車＋スパナ */

/* --- 押せる場所の「浮いて見える」演出（薄い影＝エレベーション） ---
   型: 対象のクラスを持つ要素すべてに薄い影を付け、「ここは触れる面」だと直感的に伝える。
   常時アニメーションはさせず、押した瞬間（:active）だけ影を沈めて「押した」手応えを返す
   （新しい要素を対象に足すときは、下のセレクタ一覧にクラス名を追記するだけでよい）。
   対象は「主要な導線」に絞った（キャンセル/削除/？ヘルプ等の補助的なボタンは対象外）。
   .list-row（一覧の行）は <tr> 要素で border-collapse と影の相性が悪いため対象外にし、
   既存のhover/active背景色変化のままにしてある。
   新しく浮かせたい要素は、専用クラスが無ければ「raised」クラスを直接足せばよい。
   （2026-07-20：常時回転する縁取り光は「安っぽい」との指摘を受け、この落ち着いた
   薄い影の演出に変更した。色分けはせず、影の濃さだけで統一する） */
.raised,
.set-btn,
.menu-btn,
.stats-sort-tab,
.plan-add-btn,
.sozai-add-btn,
a.stats-alert--link,
a.stats-ranking-card--link,
.stats-summary-card--link,
a.db-usage {
  box-shadow: 0 2px 3px rgba(20, 30, 45, .28), 0 4px 10px rgba(20, 30, 45, .16);
  transition: box-shadow .15s ease, transform .1s ease;
}
.raised:active,
.set-btn:active,
.menu-btn:active,
.stats-sort-tab:active,
.plan-add-btn:active,
.sozai-add-btn:active,
a.stats-alert--link:active,
a.stats-ranking-card--link:active,
.stats-summary-card--link:active,
a.db-usage:active {
  box-shadow: 0 0 1px rgba(20, 30, 45, .1);  /* 押した瞬間は影が沈んで薄くなる */
  transform: translateY(1px);
}
@media (prefers-reduced-motion: reduce) {
  /* 「アニメーションを減らす」設定の人には、沈む動き（transform）を出さない。 */
  .raised:active, .set-btn:active, .menu-btn:active, .stats-sort-tab:active,
  .plan-add-btn:active, .sozai-add-btn:active,
  a.stats-alert--link:active, a.stats-ranking-card--link:active, .stats-summary-card--link:active,
  a.db-usage:active {
    transform: none;
  }
}

/* =============================================================================
   初期設定画面（畑などのマスタ登録・モック準拠）
   ※ .init-setting 配下だけに効くよう限定する。上部バーは設定画面と共通
   （.settings-bar / .settings-close）を流用している。
   ============================================================================= */

/* 下部固定のボタンバー(.init-actions)に最後の入力欄が隠れないよう、下に余白を確保する。 */
.init-setting { padding-bottom: 96px; }

/* --- 設定内容（入力フォーム） --- */
.init-form { display: flex; flex-direction: column; gap: 16px; }
/* 1行＝ラベル（上）＋入力欄（下）の縦並び。
   「作業者を追加」等のダイアログと同じ配置に統一（2026-07-16。旧・ラベル左の横並びから変更）。
   仕組み: flex-wrap で「1行に収まらない分は折り返す」ようにし、ラベルを幅100%にすることで
   入力欄が必ず次の行（＝ラベルの下）へ落ちる。畑の「大きさ」（数値＋単位）のように
   入力部品が複数ある行でも、部品同士は2行目の中で横並びのまま保てるのがこの方式の利点。
   ※ 記録画面(.record-form)・出荷画面(.shipping-form)は、後方の指定でラベル幅40%等を
     上書きして「色ラベル＋入力欄が隣接」の一体型にしているので、この変更の影響を受けない。 */
.init-row { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; row-gap: 1px; }
.init-label { flex: 0 0 100%; margin: 0; font-size: 16px; font-weight: 700; color: var(--text); }
/* ↑ margin:0 … 共通の form label { margin:12px 0 } を打ち消す。これが無いと row-gap を
   いくら詰めてもラベルの上下に12pxずつ余白が残り、間隔が広く見えてしまう。 */
/* 例外: チェックボックス行（マスター・事後決定・完了）は「ラベル＋□」の横並びのまま。
   ラベルの下に□だけがぽつんと置かれるより自然で、ダイアログのチェック行
   （□＋文言の横並び）とも感覚が揃う。:has(...)＝「中に .init-check を含む行」を選ぶ書き方。 */
.init-row:has(.init-check) { flex-wrap: nowrap; }
.init-row:has(.init-check) .init-label { flex: 0 0 auto; }
/* 入力欄。font-size:16px はスマホ（特にiPhone）の自動ズーム防止のための下限。 */
.init-input {
  flex: 1;
  min-width: 0;                 /* flex 内で入力欄がはみ出さないための保険 */
  font-size: var(--font-input);
  padding: 10px;
  border: 1px solid var(--border);
  border-radius: var(--radius-control);      /* 操作部品の角丸（8px） */
  background: var(--surface-input);          /* モックの薄いグレー入力欄 */
  font-family: inherit;
}
/* 入力中は白背景＋枠を強調して「今ここに入力している」と分かりやすくする。 */
.init-input:focus {
  background: var(--surface-card);           /* 白い面（アプリ共通の白） */
  outline: 2px solid var(--color-accent-soft);
  outline-offset: 0;
}
.init-textarea { resize: vertical; line-height: 1.5; }
/* 変更できない項目の固定表示（例: ＋素材を追加から開いた素材フォームの「作業内容」）。
   入力欄と同じ枠に、無効の地色（--surface-disabled）で「ここは変えられない」と伝える。 */
.init-input-fixed { background: var(--surface-disabled); cursor: default; }

/* --- 作業者タブ：マスターのチェックボックス／補足ヒント --- */
/* ラベルの右に置く四角。指でも押しやすいよう大きめ。flex:1 にしない（左寄せのまま）。 */
.init-check { flex: 0 0 auto; width: var(--checkbox-size); height: var(--checkbox-size); cursor: pointer; }
/* パスワード欄の下の補足文（マスター時のみ必要）。上の欄に近づけて表示。 */
.init-hint { margin: -6px 0 0; font-size: var(--font-hint); color: var(--text-hint); }

/* --- 入力欄の右端に単位を重ねて表示する（時間単価の「円」など） --- */
.init-unit-wrap { position: relative; flex: 1; min-width: 0; display: flex; }
/* 入力欄は幅いっぱい。単位の分だけ右に余白を空け、数字は右寄せにする。 */
.init-unit-wrap .init-input { flex: 1; padding-right: 30px; text-align: right; }
.init-unit {
  position: absolute; right: 10px; top: 50%; transform: translateY(-50%);
  color: var(--text); font-size: var(--font-unit); pointer-events: none;  /* 単位「円/%」の文字。クリックは透過 */
}

/* --- 素材タブ（初期設定・一覧編集で共通の settings_init.php）：単価＋単位の行 ---
   記録画面「素材を追加」ダイアログ（#sozai-add-dialog の .sozai-tanka-row）と同じ考え方に
   統一（2026-07-16）：固定単位の素材は単価欄に単位を重ねて表示、「資材」のときだけ単価欄を
   狭めて右に単位の5択ドロップダウンを並べる。ここでは単位ドロップダウンも他の項目と同じ
   class="init-input js-picker" にしているので、単価欄と自動的に高さ・見た目がそろい、
   ダイアログ側で必要だった文字サイズ／line-height／margin-top の個別調整は不要になる。 */
/* flex:1 が必要な理由: .init-row は（今回のラベル縦積み化で）flex-wrap:wrap になっており、
   ラベルが幅100%を占めて必ず改行するため、.sozai-tanka-row は「折り返した行にただ1つだけ
   並ぶ要素」になる。flex-grow を指定しないと既定の0のままそのcontent幅（＝中の入力欄の
   min-content幅）にしか広がらず、行の右側に大きな余白ができてしまう（実際に踏んだ不具合。
   他の項目が素の<input class="init-input">＝flex:1を持つため素材の単価欄だけ問題が出た）。 */
.init-setting .sozai-tanka-row { display: flex; align-items: center; gap: 8px; flex: 1; }
/* 固定単位（肥料等）＝単価欄1つが行いっぱい（.init-unit-wrap は既定で flex:1）。
   単位文字列が長い（例「円/1kgあたり」）ため、重ならないよう右余白を広めに確保する。 */
.init-setting .sozai-tanka-row .init-unit-wrap .init-input { padding-right: 100px; text-align: right; }
/* 「資材」＝単位ドロップダウンは選択肢がすべて収まる最小幅の固定幅、単価欄は残り幅いっぱい
   （2026-07-16：単価欄を固定幅・ドロップダウンを可変にしていたのを逆にした＝ユーザー指定）。
   180px＝ユーザー指定値。最長「円/1セットあたり」＋右端の▾は収まりきらず見切れる可能性が
   ある（ヘッドレスChromeでの実測では210pxが必要だった）ため見た目の確認は要注意。 */
.init-setting .sozai-tanka-row .init-unit-wrap.is-narrow { flex: 1 1 auto; min-width: 0; }
.init-setting .sozai-tanka-row .init-unit-wrap.is-narrow .init-input { padding-right: 8px; text-align: right; }
.init-setting .sozai-tanka-row .sozai-tanni-wrap { display: flex; flex: 0 0 180px; min-width: 0; }

/* 【record-form】素材リストの各行にJSで作る編集用の単価入力欄（上とは別物。
   マスターが素材の単価をその場で直す小さい入力欄）。クラス名が紛らわしいが、
   settings_init.php の単価欄は上の書き換えで class="init-input" のみに変わったため、
   この .sozai-tanka-input は現在この record-form 専用（詳細は下の .record-form 側の定義）。 */
.sozai-tanka-input { flex: 0 0 110px; text-align: right; }

/* --- 畑タブ：大きさ（数値＋単位ドロップダウン） --- */
/* 数値と単位（js-pickerの.picker-wrap＝flex:1）を同じ幅（1:1）で並べる（2026-07-12 ユーザー指定）。 */
.hatake-size-input { flex: 1 1 0; min-width: 0; text-align: right; }
/* 作業計画画面「＋畑を追加」ダイアログの大きさ行。<label>大きさ...</label>の中で
   数値欄と単位ドロップダウンを横並びにする入れ物（初期設定の畑タブは.init-rowがその役を
   兼ねるが、ダイアログのlabelはそうではないため専用クラスにした）。 */
.hatake-size-row { display: flex; gap: 8px; }

/* --- 野菜タブ：荷姿（ドロップダウン） --- */
select.init-input { cursor: pointer; }

/* --- 野菜タブ：規格・個数の表 --- */
.kikaku-table { width: 100%; border-collapse: collapse; }
.kikaku-table th,
.kikaku-table td { border: 1px solid var(--border); padding: 0; }
/* 見出し行（規格 / 内容量）。 */
.kikaku-table thead th {
  background: var(--surface-input); font-size: var(--table-font); font-weight: 700; color: var(--text);
  text-align: center; padding: 8px 4px;
}
/* 左端の行番号（1〜5）の細い列。 */
.kikaku-table .kikaku-no { width: 34px; text-align: center; color: var(--text-hint); font-size: var(--table-font); }
/* 内容量の列は少し狭め（規格名の方を広く使う）。 */
.kikaku-table thead th:last-child,
.kikaku-table td.kikaku-kosuu { width: 42%; }
/* セル内の入力欄は枠なしで、セルいっぱいに広げる（表の枠線を活かす）。
   font-size:16px はスマホの自動ズーム防止の下限。 */
.kikaku-input {
  width: 100%; box-sizing: border-box;
  border: none; background: var(--surface-card); font-size: var(--font-input); padding: 10px 8px;  /* 地色は共通の白（生#fff→トークンへ寄せ） */
  font-family: inherit;
}
.kikaku-input:focus { outline: 2px solid var(--color-accent-soft); outline-offset: -2px; }
/* 内容量セルは「入力欄」の右端に「個」を重ねて表示する（表の列幅を崩さないため absolute）。 */
.kikaku-kosuu { position: relative; }
/* 「個」の分だけ右に余白。数値は右寄せにして桁をそろえる。 */
.kikaku-kosuu .kosuu-input { padding-right: 26px; text-align: right; }
.kikaku-unit {
  position: absolute; right: 8px; top: 50%; transform: translateY(-50%);
  color: var(--text); font-size: var(--table-font); pointer-events: none;  /* 文字はクリックを透過 */
}
/* 詳細画面の「読み取り版」規格表。入力欄の代わりに文字を直接セルに置くので、
   入力欄と同じくらいの余白を td に付ける（枠の中に文字がぴったり付かないように）。 */
.kikaku-table .kikaku-cell { padding: 10px 8px; font-size: var(--table-font); color: var(--text); }
.kikaku-table .kikaku-kosuu-cell { text-align: right; }   /* 内容量（数値＋個）は右寄せ */

/* --- 規格テーブルの「操作」列（▼→ 上に移動 / 下に移動 / 削除。2026-08-18 追加） ---
   設定＞野菜の登録・編集フォームだけに出す（表に .has-ops が付く）。記録画面などの
   ダイアログにある同じ規格表には操作列を出さないので、幅の指定もここで切り分ける。 */
/* 操作列がある表では、右端の見出し＝操作列。上の「th:last-child＝内容量 42%」を打ち消して
   44px（指で押せる最小サイズ）に固定する。内容量の幅は td.kikaku-kosuu 側の指定が効く。 */
.kikaku-table.has-ops thead th:last-child { width: 44px; }
.kikaku-table td.kikaku-ops,
.kikaku-table th.kikaku-ops { width: 44px; text-align: center; }
/* ▼のボタン。この列は文字を持たないので、三角を中央に置き、セルいっぱいの押し面にする
   （枠・背景は表の枠線に任せて消す）。 */
.kikaku-table td.kikaku-ops .picker-display {
  justify-content: center;
  min-height: 44px;
  padding: 0;
  background: none;
  border: 0;
}
/* まだ何も入力していない行では▼を見せない（並べ替えも削除もするものが無いため）。
   visibility ＝ 場所は取ったまま隠す（列の幅がガタつかない）。 */
.kikaku-table td.kikaku-ops.is-empty-row .picker-wrap { visibility: hidden; }
/* 削除確認ダイアログの補足（「更新」を押すと確定します）。本文より小さく控えめに。 */
.kikaku-del-note {
  margin: -12px 0 16px;
  font-size: var(--font-note);
  color: var(--text-hint);
  text-align: center;
}

/* --- 野菜タブ：使い方ヒント（？＋説明） --- */
.kikaku-help { display: flex; align-items: flex-start; gap: 8px; color: var(--text-hint); font-size: var(--font-hint); margin-top: -4px; }
.help-mark {
  flex: 0 0 auto; width: var(--help-mark-size); height: var(--help-mark-size);
  border: 1px solid var(--text-faint); border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: var(--font-hint); font-weight: 700; color: var(--text-hint);
}
.help-text { line-height: 1.5; }

/* 確定／キャンセルのボタン（左=確定・右=キャンセル）。色は共通クラス（.btn-yes 緑 / .btn-no グレー）。
   ★画面下部に固定する（position:fixed）。スクロールしても常に見えて押せる。
     ・left/right:0 ＋ margin:0 auto ＋ max-width で、本文カラム(480px)と同じ幅で中央に置く。
     ・padding の下側に env(safe-area-inset-bottom) を足し、iPhone のホームバーに重ならないようにする。
     ・背景は body と同じ #f7f7f7、上に細い境界線を引いて、下の入力欄と視覚的に分ける。 */
.init-actions {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  display: flex;
  gap: 12px;
  max-width: 480px;                 /* .app-main と同じ幅 */
  margin: 0 auto;                   /* 画面中央に寄せる */
  padding: 12px 16px calc(12px + env(safe-area-inset-bottom));
  background: var(--bg);
  border-top: 1px solid var(--border-light);
  box-sizing: border-box;           /* padding を含めて幅計算（はみ出し防止） */
}
.init-actions .btn-yes,
.init-actions .btn-no,
.init-actions .btn-del {        /* 詳細画面の「削除」も同じ大きさにそろえる */
  flex: 1;                      /* 2つを均等幅に */
  padding: 13px;
  border: none;
  border-radius: var(--radius-control);      /* 操作部品の角丸（8px） */
  font-size: var(--font-input);
  font-weight: 700;
  text-align: center;
  text-decoration: none;        /* <a> のキャンセルでも下線を出さない */
  cursor: pointer;
  font-family: inherit;
}

/* ※ 作業計画画面のラベル幅を広げる個別ルール（旧・横並び時代の 108px 指定）は、
     ラベルを上に置く縦並びへの統一（2026-07-16）でラベルが全幅になったため削除した。 */

/* --- 記録画面（作業追加）と出荷画面：畑の上の「日時」行（モック準拠） ---
   「日時 ｜ ◯月◯日  ◯時◯分」。日時ラベルの右に縦の区切り線、日付・時刻は青文字。
   記録画面（.record-form）と出荷画面（.shipping-form）の両方に同じ見た目を効かせる
   （セレクタを両方に付けることで、どちらのフォームでも同一スタイルになる）。 */
.record-form .record-datetime,
.shipping-form .record-datetime {
  display: flex;
  align-items: center;
  /* 両端そろえ（space-between）で「日時／日付／時刻」を行いっぱいに分散し、左右の余白を最小に。
     日時＝左端・日付＝中ほど・時刻＝右端に来る（モックと同じ並び）。gap は詰まりすぎ防止の最小間隔。 */
  justify-content: space-between;
  gap: var(--record-datetime-gap);
  padding: var(--record-datetime-pad);         /* 左右に余白を入れて、両端（日時・時刻）を内側＝中央寄りに */
  font-size: var(--record-datetime-font);
}
.record-form .rdt-label,
.shipping-form .rdt-label {
  font-weight: 700;
  color: var(--text);
  padding-right: var(--record-datetime-gap);
  border-right: 2px solid var(--border);   /* モックの縦の区切り線 */
}
/* 日付・時刻は「タップで選ぶ」ボタン。見た目は素の青文字にそろえる（モック準拠）。
   <button> の既定の枠・背景・余白を消し、青い太字テキストとして見せる。 */
.record-form .rdt-date,
.record-form .rdt-time,
.shipping-form .rdt-date,
.shipping-form .rdt-time {
  border: none;
  background: transparent;
  padding: var(--record-datetime-time-pad);
  font-family: inherit;
  font-size: inherit;
  color: var(--color-accent);
  font-weight: 700;
  cursor: pointer;
}
.record-form .rdt-date:active,
.record-form .rdt-time:active,
.shipping-form .rdt-date:active,
.shipping-form .rdt-time:active { opacity: .6; } /* タップの反応（スマホ） */

/* --- 記録画面の「天気・気温」の行（日時のすぐ下） ---
   「天気｜(アイコン)晴れ　気温｜25℃」の並び。日時の行(.record-datetime)と同じ作法・同じ
   トークンを使い、見た目を完全にそろえる（＝2つの行が1つのまとまりに見える）。 */
.record-form .record-weather {
  display: flex;
  align-items: center;
  justify-content: space-between;   /* 日時の行と同じ「両端そろえ」 */
  /* 細い画面では1行に収まらないので、折り返しを許す（flex-wrap: wrap）。
     「天気｜曇時々雨　気温｜-15℃」のような最長の組み合わせは約383px必要で、
     幅360px前後のスマホでははみ出すため。広い画面では今までどおり1行に並ぶ。 */
  flex-wrap: wrap;
  /* gap は「行間 列間」の順。折り返して2行になったときも行が詰まりすぎないようにする。 */
  gap: 2px var(--record-datetime-gap);
  padding: var(--record-datetime-pad);
  font-size: var(--record-datetime-font);
}
/* 日時の行を上部バー寄りに引き上げる（記録画面だけ）。
   本文はもともと「上部バーの高さ(--bar-h)」＋「.app-main の余白(16px)」だけ下がっており、
   帯の下端から日時までが16px空いている。ここが広く見えるので少し詰める。
   ※ 帯の高さぶんの padding-top（.topbar-* ）は帯に隠れないための必須の値なので触らない。
     代わりにフォームの先頭＝日時の行を負のマージンで引き上げる（後続の行もまとめて上がる）。
   詰め具合は --record-datetime-pull-up の1か所で調整できる。 */
.record-form .record-datetime {
  margin-top: calc(var(--record-datetime-pull-up) * -1);
}

/* 日時の行と天気の行は「いつ・どんな空模様だったか」という一続きの情報なので、
   他の項目行（畑・野菜…）より間隔を詰めて、2行で1つのまとまりに見せる。
   やり方＝上に少し引き上げる（負のマージン）。.record-form の行間（--item-row-gap）は
   全行に一律で効くため、この2行の間だけを詰めるにはこの方法をとる。
   「～（間に何かあってもよい兄弟セレクタ）」＝日時の行より後ろにある天気の行に効かせる。
   ※「＋」（すぐ隣だけ）ではダメ。日時と天気の間には、画面に出ない
     アイコンの置き場（#tenki-icons・hidden）が挟まっているため。 */
.record-form .record-datetime ~ .record-weather {
  margin-top: calc(var(--record-weather-pull-up) * -1);
  /* 下（畑・野菜などの項目行との間）も同じように詰める。 */
  margin-bottom: calc(var(--record-weather-pull-next) * -1);
}

/* 上のマージン調整だけでは「行の枠どうし」が 0px になるだけで、
   各行が内側に持つ余白（--record-datetime-pad の上2px・下4px）が隙間として残る。
   完全に詰めるため、隣り合う側の内側余白も消す。
   ※ 左右の余白（28px）は残す＝両端の寄せ方は今までどおり。
   ※ これでも日付・天気などの「ボタン自体の上下余白（--record-datetime-time-pad の6px）」は
     残る。これは指で押すための領域なので消さない。 */
.record-form .record-datetime { padding-bottom: 0; }
.record-form .record-weather  { padding-top: 0; padding-bottom: 0; }

/* 「ラベル＋値」の塊。これ自体を1つの部品として折り返すので、
   折り返しても「天気」と値が離ればなれにならない。 */
.record-form .rw-pair {
  display: flex;
  align-items: center;
  gap: var(--record-datetime-gap);
}

/* 天気・気温は畑・野菜と同じ自作ドロップダウン（js-picker）で選ぶ。
   ただし見た目は日時の行にそろえたいので、入力欄らしい枠は付けず、
   日付・時刻ボタンと同じ「素の青文字」にする（.picker-display の既定を上書き）。 */
.record-form .rw-tenki.picker-display,
.record-form .rw-kion.picker-display {
  display: inline-flex;             /* アイコンと文字を横に並べて中央でそろえる */
  align-items: center;
  justify-content: flex-start;      /* 既定の space-between（▼を右端に置く用）は使わない */
  gap: var(--record-weather-icon-gap);
  width: auto;                      /* 既定の width:100% だと行いっぱいに広がってしまう */
  border: none;
  background: transparent;
  padding: var(--record-datetime-time-pad);
  font-family: inherit;
  font-size: inherit;
  color: var(--color-accent);
  font-weight: 700;
  cursor: pointer;
}
.record-form .rw-tenki.picker-display:active,
.record-form .rw-kion.picker-display:active { opacity: .6; }   /* タップの反応（スマホ） */

/* 未選択のとき＝薄いグレーの「任意」。押せることは分かるが、値ではないと見て分かるようにする。
   （.is-placeholder は js-picker が未選択のときに付けるクラス） */
.record-form .rw-tenki.is-placeholder,
.record-form .rw-kion.is-placeholder { color: var(--text-hint); font-weight: 400; }

/* 「▼」の目印を消す（no-caret）。日時の行と同じ素の見た目にするため。 */
.picker-display.no-caret::after { content: none; }

/* 天気アイコン（表示ボタンの中）。flex で潰れないよう flex-shrink:0（＝0 0 auto）にする。 */
.record-form .rw-tenki .tenki-icon {
  flex: 0 0 auto;
  width:  var(--record-weather-icon);
  height: var(--record-weather-icon);
}

/* --- 編集の詳細画面（読み取り専用）の天気： アイコン＋天気名を横並びにする --- */
.detail-tenki { display: inline-flex; align-items: center; gap: var(--record-weather-icon-gap); }
.detail-tenki .tenki-icon {
  flex: 0 0 auto;
  width:  var(--record-weather-icon);
  height: var(--record-weather-icon);
}

/* --- 記録画面（作業追加）だけ：項目名を「緑の背景ボックス」にする（モック準拠） ---
   モックでは各項目名（畑/野菜/作業者…）が緑のボックスになっている。記録画面（.record-form）
   のときだけラベルを緑ボックスにし、入力欄と段差なく一体に見せる。他画面（初期設定・作業計画）
   は従来どおりプレーンなラベルのまま（この指定は .record-form 配下だけに効く）。
   ※ 緑ボックスは「項目名ラベル」だけ。下部の「記録」ボタンは共通の .btn-yes（主アクション色＝青）を使う。 */
/* --- 記録画面を「編集モード」で開いたとき（編集詳細の「編集」から）だけ：緑基調→黄基調に統一 ---
   遷移元の編集画面（黄）と色をそろえる。record ビューの form に is-edit が付く。
   やり方＝この配下でだけ「記録の緑トークン」を「編集の黄トークン」へ差し替える。
   こうすると下の各所（項目ラベル・素材見出し・＋追加ボタン）の var(--color-record…) 参照が
   まとめて黄に変わる（＝ルール『テーマ切替は変数の上書きで済ませる』／生の色は直書きしない）。 */
.record-form.is-edit {
  --color-record:          var(--color-edit);        /* 濃い緑 → 濃い黄 */
  --color-record-hover:    var(--color-edit-hover);  /* 緑ホバー → 黄ホバー */
  --color-record-bg:       var(--color-edit-soft);   /* 薄い緑面 → 淡い黄面 */
  --color-record-bg-hover: var(--color-edit-soft);   /* そのホバーも淡い黄に */
}
/* 記録フォームは項目（畑〜メモ）の縦の間隔を詰める（.init-form の gap:16px を上書き）。
   ※ この画面だけ。初期設定・作業計画は従来どおり16px。 */
.record-form { gap: var(--item-row-gap); }
/* 緑ラベルと入力欄をぴったり隣接させる（あいだの隙間を無くす）。 */
.record-form .init-row { gap: 0; }
/* 項目名ラベル＝緑の背景ボックス（白の太字・中央寄せ）。行の高さいっぱいに伸ばす。 */
.record-form .init-label {
  flex: 0 0 40%;                 /* モックの広めの緑ボックス（画面幅の4割） */
  align-self: stretch;          /* 右の入力欄と同じ高さにそろえる */
  display: flex;
  align-items: center;
  justify-content: center;      /* 文字を左右中央に置く */
  min-height: var(--item-row-h);   /* 項目行の高さ（指で押しやすい） */
  margin: 0;                    /* 共通の form label { margin:12px 0 } を打ち消す（行間の正体） */
  padding: var(--label-pad);    /* 緑ラベルの内側余白 */
  background: var(--color-record);  /* 記録＝緑（ホームの「記録する」ボタンと同色） */
  color: var(--color-on-label);     /* 項目名は黒文字（緑ラベル上） */
  border-radius: var(--radius-control) 0 0 var(--radius-control);   /* 左側だけ角丸（右の入力欄と一体に見せる） */
}
/* 入力欄・単位ラッパーの入力は緑ラベルの右に段差なく続く（左角は直角＝一体化）。
   高さは緑ラベル（48px）にそろえる（収穫量など、入力欄が低く見えないように）。 */
.record-form .init-input,
.record-form .init-unit-wrap .init-input {
  border-radius: 0 var(--radius-control) var(--radius-control) 0;
  border-left: none;            /* ラベルとの境目の二重線を消す */
  min-height: var(--item-row-h);   /* 緑ラベルと同じ高さにそろえる（見た目の段差を無くす） */
}
/* 単位ラッパー（収穫量の kg 付き入力）を行の高さいっぱいに伸ばし、中の入力欄も48pxにそろえる。 */
.record-form .init-unit-wrap { align-self: stretch; }
/* 選択（フォーカス）時、枠が外側に広がって緑ラベルと段差になるのを防ぐ。
   フォーカス枠を内側（inset）に描くことで、外形の高さ(48px)を変えずに「選択中」を示す。 */
.record-form .init-input:focus { outline-offset: -2px; }

/* js-picker の「2段表示」（選択肢に data-sub があるとき）。名前と補助情報を縦積みにして
   表示ボタンの左側へ。右端の▾は従来どおり。高さ48pxの枠に収まるよう行間を詰める。
   例: 作業者ドロップダウンの中に「田中／時給 1200円」の二段で見せる（マスターのみ）。 */
/* 2段のときだけ上下パディングを詰めて、枠の高さ(48px)を1段のときと変えない。
   border-box なので内側の高さ＝48 − 枠線2 − 上下パディング。1段の10pxのままだと2段が
   入りきらず枠が伸びるため、2段のときは4pxにして 48 − 2 − 8 = 38px を確保する（2段の文字≈33px）。 */
.picker-display.has-sub { padding-top: 4px; padding-bottom: 4px; }
.picker-lines {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: center;
  min-width: 0;                 /* 長い名前でも横あふれさせない（下の省略と併用） */
  line-height: 1.15;            /* 行間を詰めて2段を48pxに収める */
}
.picker-lines .picker-main {
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;          /* 名前が長いときは…で省略（2段目の時給と重ならないように） */
}
.picker-lines .picker-sub {
  font-size: var(--font-hint);  /* 2段目（時給）は小さめ・淡色 */
  color: var(--text-hint);
}

/* 素材・使用量ブロックの開閉アニメ（作業内容を選ぶと開く／外すと閉じる）。
   スピード感重視で 0.18 秒＋軽いフェード。高さの伸縮は grid のトリック（0fr→1fr）で行う
   （max-height と違い、中身の実寸に合わせて滑らかに伸び縮みする。モダンブラウザ対応）。 */
.record-form .sozai-section {
  display: grid;
  grid-template-rows: 0fr;              /* 畳んだ状態（高さ0）。JS が .is-open を付けると開く */
  opacity: 0;
  transition: grid-template-rows .18s ease, opacity .18s ease;
}
.record-form .sozai-section.is-open {
  grid-template-rows: 1fr;             /* 開いた状態（中身の高さいっぱいまで） */
  opacity: 1;
}
/* grid の子。畳む間に中身がはみ出さないよう overflow:hidden。
   min-height:0 は「中身の最小高さで潰れず、0 まで縮める」ための必須指定。
   中の3要素（見出し／素材行／＋追加）は、元と同じ縦間隔（--item-row-gap）で並べる。 */
.record-form .sozai-section-inner {
  min-height: 0;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  gap: var(--item-row-gap);
}
/* 「動きを減らす」設定の端末では、アニメを止めて即時に開閉する（酔い・負担への配慮）。 */
@media (prefers-reduced-motion: reduce) {
  .record-form .sozai-section { transition: none; }
}

/* 素材・使用量の見出し（緑の全幅バー）。タイトルは中央。 */
.record-form .sozai-header {
  display: flex;
  align-items: center;
  justify-content: center;         /* タイトルを中央に */
  min-height: var(--item-row-h);   /* 項目行と同じ高さにそろえる（旧44px→48px） */
  padding: 6px 16px;
  background: var(--color-record);  /* 記録＝緑（項目名ラベルと同色） */
  color: var(--color-on-label);     /* 緑ラベル上の黒文字（.init-label と共通） */
  border-radius: var(--radius-control);
  font-weight: 700;
}
/* 素材リスト末尾の「＋追加」。全幅・破線枠の“追加ボタン”らしい見た目にする。 */
.record-form .sozai-add-btn {
  display: block;
  width: 100%;
  margin-top: 8px;
  min-height: var(--item-row-h);   /* 素材見出し・緑ラベルと同じ高さにそろえる（旧・中身依存の約46px→48px） */
  padding: 10px;
  border: 1px dashed var(--color-record);  /* 記録＝緑の破線（＝ここを押すと足せる、の合図） */
  border-radius: var(--radius-control);
  background: var(--color-record-bg);  /* ごく薄い緑 */
  color: var(--color-success);     /* 緑系の濃いめ文字 */
  font-size: var(--font-note);
  font-weight: 700;
  cursor: pointer;
}
.record-form .sozai-add-btn:hover { background: var(--color-record-bg-hover); }

/* 素材・使用量の行（作業内容に連動して JS が生成）。
   1行＝左「チェック＋素材名」／右「数量入力＋単位」。 */
.record-form .sozai-rows { display: flex; flex-direction: column; gap: 6px; }
.record-form .sozai-rows:empty { display: none; }   /* 素材が無いときは行エリアを詰める */
.record-form .sozai-row {
  display: flex;
  align-items: center;
  justify-content: space-between; /* 名前は左・入力は右 */
  gap: 10px;
  padding: 6px 4px;
}
/* 左側：チェックボックス＋素材名（名前タップでもチェックできるよう label で囲む）。 */
.record-form .sozai-check-wrap {
  display: flex; align-items: center; gap: 8px;
  /* flex-grow は 0（＝横に広げない）。1 にするとラベルが素材名の右の空きまで広がり、
     数量欄の近くをクリックしたつもりが“チェック外し”になって入力できなくなる（実際に踏んだ）。
     grow しないことで、チェック切り替えは「チェック＋素材名」の範囲だけに限定される。 */
  flex: 0 1 auto; min-width: 0;   /* 縮みは許可（長い名前対策）・伸びは無し */
  cursor: pointer;
}
.record-form .sozai-check { width: var(--checkbox-size); height: var(--checkbox-size); flex: 0 0 auto; }
.record-form .sozai-name { font-weight: 700; color: var(--text); overflow-wrap: anywhere; }
/* 素材名（＋マスターのみ単価の二段目）を縦積みにする入れ物。 */
.record-form .sozai-name-col { display: flex; flex-direction: column; min-width: 0; gap: 1px; }
/* 【マスターのみ】素材名の下に出す単価（新規＝読み取り／編集＝入力欄を内包）。小さめ・淡色。 */
.record-form .sozai-tanka-disp { font-size: var(--font-hint); color: var(--text-hint); font-weight: 400; }
/* 【編集＋マスター】素材名の下の単価入力欄（ラベル「単価」＋小さめ入力＋単位）。 */
.record-form .sozai-tanka-edit {
  display: flex; align-items: center; gap: 4px;
  margin-top: 2px;
  font-size: var(--font-hint); color: var(--text-hint); font-weight: 400;
}
.record-form .sozai-tanka-input {
  width: 5.5em; min-width: 0;
  padding: 2px 6px;
  border: 1px solid var(--border);
  border-radius: var(--radius-control);
  background: var(--surface-card);
  font-size: var(--font-input);   /* 16px＝スマホ入力時の自動ズーム防止 */
  font-family: inherit;
  text-align: right;
}
.record-form .sozai-tanka-input:disabled { background: var(--surface-disabled); color: var(--text-faint); }
.record-form .sozai-tanka-unit { white-space: nowrap; }
/* 右側：数量入力＋単位。 */
.record-form .sozai-input-wrap { display: flex; align-items: center; gap: 6px; flex: 0 0 auto; }
/* 農機ドロップダウンは js-picker（app.js）でピッカー化され、<select> の代わりに
   <div class="picker-wrap"><button class="picker-display">…</button>…</div> が実際に表示される。
   .picker-wrap は既定 flex:1（他画面の入力欄用の伸びる指定）だが、ここは固定幅にしたいので上書きする。 */
.record-form .sozai-input-wrap .picker-wrap { flex: 0 0 auto; }
/* 数量入力（数字）と農機ドロップダウンの共通の見た目。font-size:16px はスマホの自動ズーム防止。 */
.record-form .sozai-suuryou {
  min-height: var(--input-row-h);   /* 小さめ入力欄の高さ（素材行はコンパクトに） */
  padding: 6px 8px;
  border: 1px solid var(--border);
  border-radius: var(--radius-control);
  background: var(--surface-card);
  font-size: var(--font-input);
  font-family: inherit;
}
.record-form input.sozai-suuryou { width: 96px; text-align: right; } /* 数字入力は右寄せ・固定幅 */
/* 農機ドロップダウン。ピッカー化後は <select> ではなく <button class="picker-display"> が表示されるため、
   要素タイプに依存しない .sozai-nouki クラス（select にも picker-display にも残る）で幅を効かせる。 */
.record-form .sozai-nouki { min-width: 130px; }
.record-form .sozai-unit { min-width: 1.4em; color: var(--text); font-weight: 700; }
/* チェックオフのとき＝入力不可（disabled）。数量欄・単位をグレーアウトする。 */
.record-form .sozai-suuryou:disabled {
  background: var(--surface-disabled);
  color: var(--text-faint);
  cursor: not-allowed;
}
.record-form .sozai-input-wrap.is-disabled .sozai-unit { color: var(--border-input); }
/* 素材が無い作業内容のときの案内。 */
.record-form .sozai-empty { color: var(--text-hint); font-size: var(--font-note); padding: 4px; }

/* 項目名の右に「？」ヘルプアイコンを少し離して置くラベル（全画面共通）。
   display:flex … 記録画面の緑ラベル（元からflex）以外の画面（初期設定など）でも、
   項目名と「？」が横に並ぶようにする。
   記録画面の収穫見通し割合だけは項目名が長いので、文字を少し小さくする（14px）。 */
.rate-label { display: flex; align-items: center; gap: 6px; white-space: nowrap; }
.record-form .rate-label { font-size: 14px; }
/* 「？」ボタン＝小さな丸に？（初期設定のヒント印 .help-mark と同じ見た目）。
   ヘルプ共通部品 help_button()（app/help_texts.php）が出力する全画面共通のボタン。
   緑ラベルの上でも白背景の上でも読めるよう、枠・文字は濃色にしている。 */
.rate-help {
  flex: 0 0 auto;
  width: var(--help-mark-size);
  height: var(--help-mark-size);
  padding: 0;
  border: 1px solid var(--text);
  border-radius: 50%;
  background: transparent;
  color: var(--text);
  font-size: var(--font-hint);
  font-weight: 700;
  line-height: 1;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
}
/* 販売確定金額ラベルの2段目（「金額」＋？ボタン）を横並びにする。 */
.shipping-form .settle-kingaku-label-line { display: inline-flex; align-items: center; gap: 4px; }
/* メモだけは全幅の緑バーを上に、テキストエリアを下に置く（モック準拠）。
   記録画面（.record-form）と出荷画面（.shipping-form）の両方に同じ形を適用する。
   ★ここは flex にしない（block にする）。textarea が display:flex の直接の子だと、
     Chrome ではリサイズのつまみは出るのに実際にはドラッグで高さを変えられない（既知の挙動）。
     block 配置にすると普通に縦リサイズできる。ラベル・テキストエリアは各自で全幅にする。 */
.record-form .init-row-memo,
.shipping-form .init-row-memo { display: block; }
.record-form .init-row-memo .init-label,
.shipping-form .init-row-memo .init-label {
  /* 緑ラベルは display:flex のブロック要素なので、親が block でも自動で全幅になる。 */
  min-height: var(--item-row-h);   /* 他の緑ラベルと同じ高さにそろえる（旧40px→48px） */
  border-radius: var(--radius-control) var(--radius-control) 0 0;   /* 上側だけ角丸 */
}
.record-form .init-row-memo .init-textarea,
.shipping-form .init-row-memo .init-textarea {
  display: block;
  width: 100%;
  box-sizing: border-box;       /* padding/border を含めて全幅に収める（横はみ出し防止） */
  border-radius: 0 0 var(--radius-control) var(--radius-control);   /* 下側だけ角丸 */
  border-top: none;             /* 緑バーとの境目の二重線を消す */
  border-left: 1px solid var(--border);  /* 上の一般指定で消した左枠を戻す（メモは全幅なので枠が要る） */
  resize: vertical;             /* 縦だけリサイズ可（横に伸ばして崩れないように） */
}

/* --- 写真（記録画面・試作中） ---
   メモ欄と同じ「全幅の緑バー＋その下に中身」の形にそろえる。
   撮った写真はまだサーバーに送らず、画面に並べる／端末に保存するだけ。 */
.record-form .init-row-photo { display: block; }
.record-form .init-row-photo .init-label {
  min-height: var(--item-row-h);        /* 他の緑ラベルと同じ高さ */
  border-radius: var(--radius-control) var(--radius-control) 0 0;   /* 上側だけ角丸 */
}
/* 緑バーの下にくる中身の箱。バーと段差なくつながって見えるように上枠を消す。 */
.record-form .photo-body {
  border: 1px solid var(--border);
  border-top: none;
  border-radius: 0 0 var(--radius-control) var(--radius-control);
  padding: 10px;
  background: var(--surface-card);
}
/* 試作中であることの注意書き（小さめ・控えめの色）。 */
.record-form .photo-note {
  margin: 0 0 8px;
  font-size: var(--font-note);
  color: var(--text-hint);
  line-height: 1.5;
}
/* 本物の「ファイル選択」欄は見た目を整えにくいので画面から隠す
   （見えているボタンを押すと、JS がこれをクリックする）。 */
.record-form .photo-file { display: none; }

/* 「写真を撮る」「写真を選ぶ」の2つ。素材の「＋追加」と同じ破線ボタンの見た目にそろえる。 */
.record-form .photo-actions { display: flex; gap: 8px; }
.record-form .photo-btn {
  flex: 1;                              /* 2つで幅を等分する */
  min-height: var(--item-row-h);        /* 指で押しやすい高さ */
  padding: 10px;
  border: 1px dashed var(--color-record);
  border-radius: var(--radius-control);
  background: var(--color-record-bg);
  color: var(--color-success);
  font-size: var(--font-note);
  font-weight: 700;
  cursor: pointer;
}
.record-form .photo-btn:hover { background: var(--color-record-bg-hover); }
.record-form .photo-btn:disabled {     /* 縮小の処理中は押せなくする */
  opacity: .6;
  cursor: default;
}
.record-form .photo-error { margin: 8px 0 0; }

/* 縮小できた写真の一覧（縦に並べる）。 */
.record-form .photo-list { display: flex; flex-direction: column; gap: 10px; }
.record-form .photo-list:empty { display: none; }   /* 0枚のときは余白を作らない */
.record-form .photo-item {
  border: 1px solid var(--border-light);
  border-radius: var(--radius-control);
  padding: 8px;
  margin-top: 10px;
}
.record-form .photo-item:not(:first-child) { margin-top: 0; }
/* 写真そのもの。横は箱いっぱい、縦は伸びすぎないよう上限を付ける。
   object-fit:contain … 縦横比を保ったまま枠内に収める（引き伸ばさない）。 */
.record-form .photo-thumb {
  display: block;
  width: 100%;
  max-height: 240px;
  object-fit: contain;
  border-radius: var(--radius-control);
  background: var(--bg);
}
/* 縮小の結果（何ピクセル・何KB・元の何分の1か）。確認用の情報なので小さく。 */
.record-form .photo-meta {
  margin-top: 6px;
  font-size: var(--font-note);
  color: var(--text-hint);
  line-height: 1.5;
  word-break: break-all;   /* 数字が続いても枠からはみ出さない */
}
/* 既に保存されている写真（編集モード）。枠を少し濃くして「保存済み」と分かるようにする。 */
.record-form .photo-item.is-saved { border-color: var(--border); }
/* 保存済みの写真の下に余白を置き、「写真を撮る／選ぶ」のボタンとくっつかないようにする
   （リストの上側には .photo-item の margin-top で既に同じだけ空いている＝上下で対称になる）。 */
.record-form .photo-list-saved { margin-bottom: var(--item-row-gap); }
/* 既存写真はタップで拡大するのでボタン。ボタンらしい枠・背景は消して写真だけ見せる。 */
.record-form .photo-thumb-btn {
  display: block;
  width: 100%;
  padding: 0;
  border: none;
  background: none;
  cursor: pointer;
}
.record-form .photo-thumb-btn:active img { opacity: .85; }
.record-form .photo-item.is-saved .photo-status { color: var(--text-hint); font-weight: 400; }

/* サーバーへ送れたかどうかの表示。送信中＝薄い文字、成功＝緑、失敗＝赤。 */
.record-form .photo-status {
  margin-top: 4px;
  font-size: var(--font-note);
  color: var(--text-hint);
  line-height: 1.5;
}
.record-form .photo-item.is-uploaded .photo-status { color: var(--color-success); font-weight: 700; }
.record-form .photo-item.is-failed   .photo-status { color: var(--color-error);   font-weight: 700; }

.record-form .photo-item-actions { display: flex; gap: 8px; margin-top: 8px; }
/* 「端末に保存」「削除」。a と button の見た目をそろえる。 */
.record-form .photo-mini-btn {
  flex: 1;
  min-height: 44px;                /* 指で押しやすい最低の大きさ */
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px solid var(--border);
  border-radius: var(--radius-control);
  background: var(--surface-card);
  color: var(--color-accent);
  font-size: var(--font-note);
  font-weight: 700;
  text-decoration: none;           /* a のときの下線を消す */
  cursor: pointer;
}
.record-form .photo-mini-del { color: var(--color-danger); }

/* 動作の記録（試作中だけの仮表示。原因が分かったらこの節ごと消す）。
   スマホではエラーを見る道具が使えないため、処理の進み具合を画面に出す。 */
.record-form .photo-debug {
  margin-top: 10px;
  border: 1px solid var(--border);
  border-radius: var(--radius-control);
  background: var(--bg);
}
.record-form .photo-debug-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 6px 8px;
  border-bottom: 1px solid var(--border-light);
  font-size: var(--font-note);
  font-weight: 700;
  color: var(--text-hint);
}
.record-form .photo-debug-clear {
  min-height: 32px;
  padding: 0 12px;
  border: 1px solid var(--border);
  border-radius: var(--radius-control);
  background: var(--surface-card);
  color: var(--text-hint);
  font-size: 12px;
  cursor: pointer;
}
/* 記録が増えても画面を占領しないよう、高さの上限を付けて中でスクロールさせる。 */
.record-form .photo-debug-body {
  max-height: 220px;
  overflow-y: auto;
  padding: 6px 8px;
}
.record-form .photo-debug-line {
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;  /* 桁をそろえて読みやすく */
  font-size: 11px;
  line-height: 1.7;
  color: var(--text-hint);
  word-break: break-all;   /* 長い行も枠からはみ出さない */
}

/* --- 自作カレンダー（作業計画の日付選択・大きく表示） ---
   標準の <input type="date"> のカレンダーは大きさを変えられないため、
   日付欄タップで開く大きなカレンダー（<dialog id="cal-dialog">）を自前で用意する。 */

/* 日付の表示欄。タップでカレンダーを開くので指カーソル。文字入力カーソルは出さない（readonly）。 */
.date-display { cursor: pointer; caret-color: transparent; }

.cal-dialog {
  border: none;
  border-radius: var(--radius-dialog);   /* 全モーダル共通（14px） */
  padding: var(--dialog-pad);            /* 全モーダル共通（16px） */
  width: min(96vw, 460px);          /* 画面いっぱいに近い大きさ（スマホでも大きく） */
  box-shadow: var(--dialog-shadow);      /* 全モーダル共通の影 */
}
.cal-dialog::backdrop { background: var(--dialog-backdrop); } /* 全モーダル共通の幕 */

/* 見出し行：‹ ／ 年月（中央） ／ › */
.cal-head { display: flex; align-items: center; gap: 8px; margin-bottom: 12px; }
.cal-title { flex: 1; min-width: 0; text-align: center; font-size: 22px; font-weight: 700; color: var(--color-accent); }
/* 前月/次月ボタン。枠や背景は付けず、矢印だけのシンプルな見た目にする（当たり判定は48px四方を維持）。 */
.cal-nav {
  width: 48px; height: 48px;
  border: none; border-radius: 10px; background: transparent;
  font-size: 26px; line-height: 1; color: var(--text); cursor: pointer; font-family: inherit;
}
.cal-nav:hover  { background: var(--hover-bg); }
.cal-nav:active { background: var(--active-bg); }
/* 「今日」ボタン。クリア／閉じるの上に、横いっぱいで置く。 */
.cal-today {
  display: block; width: 100%;
  margin: 14px 0 0; padding: 13px;
  border: 1px solid var(--border); border-radius: var(--radius-control); background: var(--surface-card);  /* 角丸8px・地#fff→トークンへ寄せ */
  font-size: var(--font-input); font-weight: 700; color: var(--color-accent); cursor: pointer; font-family: inherit;
}
.cal-today:hover  { background: var(--hover-bg); }
.cal-today:active { background: var(--active-bg); }

/* グリッド内（右下の空きスペース）に置く「今日」ボタン（3列ぶん）。
   編集カレンダーの .editcal-today と同じ考え方＝白地＋枠＋青字。押すと表示を今月に戻す。
   ※時刻ピッカーの「現在時刻」は従来どおり全幅の .cal-today を使う（こちらはグリッド外なので別クラス）。 */
.cal-gridtoday {
  grid-column: span 3;              /* 右下の3マスぶんを占める */
  display: flex; align-items: center; justify-content: center;
  border: 1px solid var(--border);
  border-radius: var(--radius-control);
  background: var(--surface-card);
  color: var(--color-accent);       /* 既存の「今日」ボタンと同じ青字 */
  font-size: var(--font-input); font-weight: 700;
  cursor: pointer; font-family: inherit;
}
.cal-gridtoday:hover  { background: var(--hover-bg); }
.cal-gridtoday:active { background: var(--active-bg); }

/* --- カレンダーの「スワイプで月めくり」アニメ用（記録画面／作業計画画面で共通） ---
   グリッドを枠(cal-viewport)で包み、スライドではみ出す隣の月を隠す（枠の外は見えない）。
   「今日」ボタンはグリッドの外へ出して右下に絶対配置で固定し、アニメで動かないようにする。 */
.cal-viewport { position: relative; overflow: hidden; } /* 位置の基準＋はみ出しを隠す */
/* スライドで入ってくる隣月の一時レイヤー。グリッド(.cal-grid)と同じ位置・大きさに重ねる。 */
.cal-slide { position: absolute; inset: 0; }
/* グリッド外に出した「今日」ボタン。右下に固定（大きさ・位置はJSで最終行の右3マスに合わせる）。
   z-index:1 でスライドするマスより前面に置く（見た目は .cal-gridtoday を流用）。 */
.cal-today-fixed { position: absolute; z-index: 1; }

/* 曜日見出しと日付グリッドは同じ7列にそろえる。 */
.cal-weekdays,
.cal-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; }
.cal-weekdays { margin-bottom: 4px; }
.cal-weekdays span { min-width: 0; text-align: center; font-size: 15px; font-weight: 700; color: var(--text-hint); padding: 4px 0; }
/* 曜日見出しの色（日=赤 / 土=青）。 */
.cal-weekdays .cal-sun { color: var(--color-error); }
.cal-weekdays .cal-sat { color: var(--color-saturday); }

/* 日付マス。正方形（aspect-ratio 1:1）で大きく、押しやすく。
   min-width:0 … 画面の横幅が狭いときにマスが縮んで、横スクロールバーを出さず横幅に追従させる。 */
.cal-cell  { aspect-ratio: 1 / 1; min-width: 0; }
.cal-empty { visibility: hidden; }        /* 月初の空きマス（位置合わせ用） */
.cal-day {
  display: flex; align-items: center; justify-content: center;
  border: 1px solid var(--border-light); border-radius: 10px; background: var(--surface-card);  /* 角丸10pxは据え置き・地#fff→トークンへ寄せ */
  font-size: 18px; color: var(--text); cursor: pointer; font-family: inherit;
}
.cal-day:hover  { background: var(--hover-bg); }
.cal-day:active { background: var(--active-bg); }
/* 開いた瞬間の自動フォーカスで出る黒い枠を消す（.picker-item / .time-item と同じ方針）。
   キーボードで Tab を押したときだけ枠を出す（アクセシビリティのため）。 */
.cal-day:focus, .cal-nav:focus, .cal-today:focus { outline: none; }
.cal-day:focus-visible, .cal-nav:focus-visible, .cal-today:focus-visible {
  outline: 2px solid var(--color-accent-soft); outline-offset: -2px;
}
/* 日付マスの曜日色（クラス2つで曜日見出しやマスの既定色より優先させる）。 */
/* 日曜＝淡い赤地／土曜＝淡い青地に、文字は黒（＝編集カレンダーと同じ見せ方に統一）。
   ※以前は文字を赤/青に色付けしていたが、背景で示す方式にそろえた。数字は既定の黒文字のまま。 */
.cal-day.cal-sun { background: var(--color-sun-bg); }
.cal-day.cal-sat { background: var(--color-sat-bg); }
/* 今日＝緑の枠、選択中＝青で塗りつぶし（選択は曜日色より優先＝白文字）。 */
.cal-day.is-today    { border-color: var(--color-today); color: var(--color-today); font-weight: 700; }
.cal-day.is-selected { background: var(--color-accent); border-color: var(--color-accent); color: var(--color-on-accent); font-weight: 700; }

.cal-actions { display: flex; gap: 10px; margin-top: 10px; }
.cal-actions button {
  flex: 1; padding: 13px; border: none; border-radius: var(--radius-control);  /* 角丸8px→トークンへ寄せ */
  font-size: var(--font-input); font-weight: 700; cursor: pointer; font-family: inherit;
}

/* --- 記録画面の時刻ピッカー（1分きざみ。時／分の縦リストから選ぶ） ---
   標準の <input type="time"> は分きざみを細かく指定しづらいため、時（0〜23）と
   分（0〜59）を縦スクロールのリストから選ぶ自作ピッカー（<dialog id="time-dialog">）を用意する。 */
.time-dialog {
  border: none;
  border-radius: var(--radius-dialog);   /* 全モーダル共通（14px） */
  padding: var(--dialog-pad);            /* 全モーダル共通（16px） */
  width: min(90vw, 320px);
  box-shadow: var(--dialog-shadow);      /* 全モーダル共通の影 */
}
.time-dialog::backdrop { background: var(--dialog-backdrop); } /* 全モーダル共通の幕 */
.time-title { text-align: center; font-size: 20px; font-weight: 700; color: var(--color-accent); margin-bottom: 12px; }

/* 時・分の2カラムを横に並べる。 */
.time-cols { display: flex; gap: 10px; }
.time-colwrap { flex: 1; display: flex; flex-direction: column; }
.time-collabel { text-align: center; font-size: 15px; font-weight: 700; color: var(--text-hint); margin-bottom: 6px; }
/* 1カラム＝この高さの中でスクロールして選ぶ。position:relative は中の項目の
   offsetTop（自動スクロールの計算）の基準にするため。 */
.time-col {
  position: relative;
  height: 240px;
  overflow-y: auto;
  border: 1px solid var(--border-light);
  border-radius: 10px;
  padding: 4px;
  -webkit-overflow-scrolling: touch; /* スマホで慣性スクロール */
}
/* 時・分の各項目（0〜59 等）。押しやすい大きさ。 */
.time-item {
  display: block;
  width: 100%;
  padding: 12px 0;
  margin: 2px 0;
  border: none;
  border-radius: 8px;
  background: #fff;
  font-size: 20px;
  font-family: inherit;
  color: var(--text);
  cursor: pointer;
  text-align: center;
}
.time-item:hover  { background: var(--hover-bg); }
.time-item:active { background: var(--active-bg); }
/* 開いた瞬間の自動フォーカスで出る黒い枠を消す（.picker-item と同じ方針）。
   キーボードで Tab を押したときだけ枠を出す（アクセシビリティのため）。
   ※ .time-col は「中がスクロールする箱」なので、ブラウザが自動でフォーカス先に選ぶことがある。 */
.time-item:focus, .time-col:focus { outline: none; }
.time-item:focus-visible, .time-col:focus-visible { outline: 2px solid var(--color-accent-soft); outline-offset: -2px; }
/* 選択中＝青で塗りつぶし（カレンダーの選択日と同じ色）。 */
.time-item.is-selected { background: var(--color-accent); color: var(--color-on-accent); font-weight: 700; }

/* --- 共通の「自作ドロップダウン（ピッカー）」 ---
   標準の <select> の選択肢の見た目は変えられないため、時刻ピッカーと同じ雰囲気の
   自作リストに置き換える共通部品（app.js が <select class="js-picker"> を置き換える）。
   モーダルではなく、元の欄の“すぐ下”にリストが開く（標準ドロップダウンと同じ挙動）。
   ・入れ物 .picker-wrap … 相対配置（表示ボタンの土台。リスト自体は画面基準の fixed）。
   ・表示ボタン .picker-display … 元の入力欄と同じ見た目＋右端に「▾」。
   ・選択肢リスト .picker-panel … 表示ボタンの真下に絶対配置で開く。 */

/* 入れ物。元の入力欄（.init-input）の位置にそのまま収まるよう、行の flex 子として振る舞う。
   単位ラッパー(.init-unit-wrap)と同じく flex:1・高さいっぱい(align-self:stretch)。 */
.picker-wrap {
  position: relative;            /* リストを真下に絶対配置する基準 */
  flex: 1;
  min-width: 0;
  align-self: stretch;
  display: flex;                 /* 中の表示ボタンを幅いっぱいに */
}

/* 画面に見える表示ボタン。元 select の .init-input を引き継ぐので枠・背景・高さは共通。
   ここでは「ボタン特有の中央寄せ」を解除し、左寄せ＋右端に ▾ を出す。 */
.picker-display {
  display: flex;
  align-items: center;
  justify-content: space-between; /* 文字を左、▾ を右に振り分ける */
  gap: 8px;
  width: 100%;
  text-align: left;
  cursor: pointer;
  color: var(--text);
}
.picker-display::after {
  /* ドロップダウンの目印＝下向きの三角。文字「▾」ではなく CSS で図形として描く
     （フォントに依存しないので、欄や選択肢の文字サイズに一切影響しない）。
     大きさは下の border の数値だけで決まる：
       ・border-left / border-right … 三角の「幅」の半分（左右対称の透明部分）
       ・border-top … 三角の「高さ」（この色が三角の色）
     もっと大きく／小さくしたいときは、この3つの px を同じ比率で増減する。 */
  content: '';
  width: 0;
  height: 0;
  border-left: 8px solid transparent;
  border-right: 8px solid transparent;
  border-top: 13px solid var(--text-hint);
  flex: 0 0 auto;
  transition: transform .15s;
}
/* 開いている間は ▲ に（上向き）＝いま開いていると分かる。 */
.picker-wrap.is-open .picker-display::after { transform: rotate(180deg); }
.picker-display.is-placeholder { color: var(--text-faint); } /* 未選択のときは案内文を薄く見せる */
/* 必須なのに未選択のまま送信しようとしたときの赤枠（native の「選んでください」の代わり）。 */
.picker-display.is-invalid { border-color: var(--color-error); outline: 2px solid #f3b0b0; outline-offset: -2px; }
/* 無効（disabled）＝まだ触れない状態。元の <select> が disabled のとき app.js が表示ボタンにも付ける。
   グレーアウトして押せない見た目にする（例: 収穫見通し割合は畑・野菜を選ぶまで触れない）。 */
.picker-display:disabled { background: var(--surface-disabled); color: var(--text-faint); cursor: not-allowed; }
.picker-display:disabled::after { border-top-color: var(--border-input); } /* 三角も薄く */

/* 選択肢リスト（表示ボタンの真下に開く浮動パネル）。既定は非表示。
   position:fixed（画面基準）で、JS(sizeAndPlace)が開くたびに top/left/width を実測して合わせる。
   ※ position:absolute（親=.picker-wrap基準）だと、出荷画面のタブ切替枠（.ship-panels。
     横スライドのため overflow:hidden＋高さ固定）のような「はみ出しを隠す」祖先の中では、
     リストが枠の外側にクリップされて見えなくなってしまう。fixed ならその影響を受けない。
   選択中の行を見える位置に寄せる自動スクロールのため、この要素自体も基準になる。 */
.picker-panel {
  display: none;                 /* 既定は閉じる */
  position: fixed;
  z-index: 50;
  /* 高さの上限は JS が開くたびに決める（最大10個ぶん／画面に収まる高さの小さい方）。
     ここは JS が効かない場合の保険。 */
  max-height: 70vh;
  overflow-y: auto;
  background: #fff;
  border: 1px solid var(--border);
  border-radius: 8px;
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);
  padding: 4px;
  -webkit-overflow-scrolling: touch; /* スマホで慣性スクロール */
}
.picker-wrap.is-open .picker-panel { display: block; } /* 開いたら表示 */
/* 上向き／下向きの top・bottom は fixed 座標を実測する JS(sizeAndPlace) 側で直接指定する。 */

/* 選択肢1件（押しやすい大きさ・左寄せ）。 */
.picker-item {
  display: block;
  width: 100%;
  padding: 14px 12px;
  margin: 2px 0;
  border: none;
  border-radius: 8px;
  background: #fff;
  font-size: 17px;
  font-family: inherit;
  color: var(--text);
  cursor: pointer;
  text-align: left;
}
.picker-item:hover  { background: var(--hover-bg); }
.picker-item:active { background: var(--active-bg); }
/* 開いた瞬間の自動フォーカスで出る黒い枠を消す。キーボード操作のときだけ枠を出す（アクセシビリティ）。 */
.picker-item:focus { outline: none; }
.picker-item:focus-visible { outline: 2px solid var(--color-accent-soft); outline-offset: -2px; }
.picker-item.is-selected { background: var(--color-accent); color: var(--color-on-accent); font-weight: 700; } /* 選択中＝青塗り */
/* 選択中は2段目（.picker-sub）の文字色も明るくする。.picker-lines .picker-sub の固定色（薄いグレー）
   のままだと、濃い青地の上で読みにくくなるため（2026-07-08、精算記録タブの野菜ピッカーで発覚）。 */
.picker-item.is-selected .picker-sub { color: var(--color-on-accent); }
.picker-item.opt-add { color: var(--color-success); font-weight: 700; } /* 「＋追加」は緑文字（将来のドロップダウン用） */

/* アイコン付きの選択肢（例: 天気）＝アイコンと文字を横に並べる。
   （.picker-item の既定は display:block なので、そのままだとアイコンの下に文字が回り込む） */
/* white-space:nowrap … 「曇時々雨」のような長めの選択肢を途中で折り返さない
   （折り返すと、リストの必要な横幅を測るときに実際より狭く算出されてしまう）。 */
.picker-item.has-icon { display: flex; align-items: center; gap: var(--tenki-opt-gap); white-space: nowrap; }
.picker-item.has-icon .tenki-icon {
  flex: 0 0 auto;
  width:  var(--tenki-opt-icon);
  height: var(--tenki-opt-icon);
}

/* リストが必要とする横幅を測る一瞬だけ使う（app.js が付け外しする）。
   行は既定で width:100%（親に合わせる）なので、そのままでは「中身に必要な幅」を測れない。
   測るあいだだけ、パネルと行を内容ぴったりの幅にする。 */
.picker-panel.is-measuring { width: max-content !important; max-height: none !important; }
.picker-panel.is-measuring .picker-item { width: max-content; white-space: nowrap; }

/* 「選択を消す」の行（任意入力の項目で、選んだ値を未選択に戻す）。
   ふつうの選択肢と役割が違うので、控えめなグレー文字にして下に区切り線を引く。
   white-space:nowrap … 短いリスト（気温など）で「選択を消す」が2行に折れないようにする。 */
.picker-item.picker-clear {
  white-space: nowrap;
  color: var(--text-hint);
  border-bottom: 1px solid var(--border-light);
  border-radius: 0;
  margin-bottom: 4px;
}

/* --- 天気アイコンの色 ---
   SVG は stroke="currentColor"（文字色に追従）なので、ここで文字色を指定すると線に色が付く。
   選択中（青塗り）のときは色を戻して白抜きにする＝濃い青の上でも見えるようにするため。 */
.tenki-sunny       { color: var(--tenki-color-sunny); }
.tenki-cloudy      { color: var(--tenki-color-cloudy); }
.tenki-cloudy-rain { color: var(--tenki-color-cloudy-rain); }
.tenki-rain        { color: var(--tenki-color-rain); }
.tenki-snow        { color: var(--tenki-color-snow); }
.picker-item.is-selected .tenki-icon { color: inherit; } /* 選択中は行の文字色（白）に合わせる */

/* =============================================================================
   編集画面（「編集する」・黄基調）＝月カレンダー＋選んだ日の記録リスト（モック準拠）
   ※ 上部バーは全画面共通（.settings-bar / .settings-close・色は .topbar-edit で黄）。
     カレンダー本体はこの画面専用（.editcal-*）。日の選択はリンクでページ再読込する。
   ============================================================================= */

/* この画面は帯・カレンダーを“画面端まで”出す（モック準拠）。本文コンテナ .app-main の
   左右 padding:16px を打ち消して全幅にする（上部固定バー .settings-bar と同じ幅感）。
   上の -16px（margin-top）は .app-main の上 padding も打ち消し、上部バーの帯と月ナビの間の
   隙間をなくす（帯のすぐ下からカレンダーが始まる）。
   ※ 上部バーは position:fixed なので、この負マージンの影響を受けない。 */
.edit-view { margin: -16px -16px 0; }

/* --- 月ナビ（‹ 2025年10月 ›）。淡い黄の帯。 --- */
.editcal-nav {
  display: flex;
  align-items: center;
  gap: var(--bar-gap);                 /* 上部バーと同じ要素間隔 */
  padding: 6px var(--bar-pad-x);       /* 左右は上部バーと同じ余白にそろえる */
  background: var(--color-edit-soft);  /* 編集の淡い黄 */
}
/* 前月/次月ボタン。指で押しやすいよう当たり判定を大きめに。
   枠や背景は付けず、矢印だけのシンプルな見た目にする（自作カレンダー .cal-nav と同じ考え方）。 */
.editcal-navbtn {
  flex: 0 0 auto;
  display: inline-flex; align-items: center; justify-content: center;
  width: 40px; height: 40px;
  border: none;
  background: transparent;
  color: var(--text); text-decoration: none;
  font-size: 26px; line-height: 1;
  border-radius: var(--radius-control);
}
.editcal-navbtn:hover  { background: var(--hover-bg); }
.editcal-navbtn:active { background: var(--active-bg); }
/* 中央の「年月」。 */
.editcal-title { flex: 1; text-align: center; font-size: var(--bar-title-font); font-weight: 700; color: var(--text); }

/* --- 曜日見出し（日〜土）。7列。日=赤 / 土=青。 --- */
.editcal-week { display: grid; grid-template-columns: repeat(7, 1fr); }
.editcal-week span {
  text-align: center; padding: 6px 0;
  font-size: var(--table-font); font-weight: 700; color: var(--text-hint);
}
.editcal-week .editcal-sun { color: var(--color-error); }
.editcal-week .editcal-sat { color: var(--color-saturday); }

/* --- 日付グリッド。7列。実在する日のマスだけ細い枠で囲う。 --- */
/* ビューポート＝月パネルの帯を左右に滑らせる「窓」。はみ出す隣の月を隠す。
   touch-action: pan-y ＝縦スクロールはブラウザ任せ、横スワイプはJSで扱う。 */
.editcal-viewport { position: relative; overflow: hidden; touch-action: pan-y; }
/* トラック＝月パネルを載せる帯。JSが transform: translateX(...) で左右に動かす。 */
.editcal-track { position: relative; }
/* 1か月ぶんのパネル＝7列×6段のマス。幅はビューポート一杯（＝1か月ぶんの横幅）。 */
.editcal-month { display: grid; grid-template-columns: repeat(7, 1fr); width: 100%; }
/* 当月パネルだけは通常の流れに置く＝この高さがトラック（窓）の高さを決める。 */
.editcal-month.is-current { position: relative; }
/* 前後の月パネルは当月に重ねず、左右に絶対配置（left は JS が off*100% で指定）。 */
.editcal-month:not(.is-current) { position: absolute; top: 0; height: 100%; }
.editcal-cell { min-height: 60px; }   /* バッジ（26px）を余裕をもって収める高さ */
/* 存在しない日（前月末・翌月頭）のマスは非表示にする（枠も背景も出さない）。
   visibility:hidden なので場所は取り続ける＝曜日の位置と「6段固定の高さ」は崩れない。 */
.editcal-empty { visibility: hidden; }

/* 1日ぶんのマス。実在する日だけ細い枠で囲う（上に日付、その下に件数バッジ）。 */
.editcal-day {
  display: flex; flex-direction: column; align-items: center;
  padding: 3px 2px 4px;
  border: 1px solid var(--border-light);   /* 実在する日だけ枠を出す */
  text-decoration: none; color: var(--text);
  background: var(--surface-card);
}
.editcal-day:hover  { background: var(--hover-bg); }
.editcal-day:active { background: var(--active-bg); }
/* 日曜列＝淡い赤地・土曜列＝淡い青地（モック準拠）。 */
.editcal-day.editcal-sun { background: var(--color-sun-bg); }
.editcal-day.editcal-sat { background: var(--color-sat-bg); }
/* 日付の数字（マスの左上）。 */
.editcal-num { align-self: flex-start; font-size: var(--table-font); font-weight: 700; line-height: 1.2; }
/* 記録がある日：件数を〇の中に入れた1つのバッジで示す（マスの中央下・少し大きめ）。
   1桁は真円、2桁以上は min-width＋横 padding で自然に楕円（pill）状に伸びる。 */
.editcal-badge {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 26px; height: 26px; padding: 0 6px;
  margin-top: 3px;
  border-radius: 999px;                 /* 完全な丸 */
  background: var(--color-edit);        /* 「編集する」帯と同じ黄色の背景 */
  color: var(--text);                   /* 「編集する」帯と同じ濃い文字色 */
  font-size: var(--table-font);         /* 15px */
  font-weight: 700; line-height: 1;
}
/* 右下に固定する「今日」ボタン（3列ぶん）。ビューポート基準の絶対配置なので、
   月パネルが左右に流れてもボタンの位置は動かない（＝常に右下に見える）。
   見た目は既存の「今日」ボタン（日付ピッカー .cal-today）と同じ＝白地＋枠＋青字（共通デザイン）。 */
.editcal-today {
  position: absolute; right: 7px; bottom: 7px;   /* ビューポート右下に固定（周囲7pxの余白） */
  width: calc(100% * 3 / 7 - 14px);     /* 右下3マスぶんの幅（左右7pxずつ内側に） */
  height: 46px;                         /* マス1段(60px)から上下7pxずつ内側 */
  box-sizing: border-box;
  z-index: 2;                           /* 流れる月パネルより前面に置く */
  display: flex; align-items: center; justify-content: center;
  border: 1px solid var(--border);
  border-radius: var(--radius-control);
  background: var(--surface-card);
  color: var(--color-accent);           /* 既存の「今日」ボタンと同じ青字 */
  font-size: var(--font-input); font-weight: 700;
  text-decoration: none; cursor: pointer;
}
.editcal-today:hover  { background: var(--hover-bg); }
.editcal-today:active { background: var(--active-bg); }
/* 今日＝緑の枠＋緑の数字（日付ピッカー .cal-day.is-today と同じ色に統一）。
   ※編集カレンダーはマスの枠が grid 側にあるため、border ではなく内側 box-shadow で緑枠を描く。 */
.editcal-day.is-today   { box-shadow: inset 0 0 0 2px var(--color-today); color: var(--color-today); }
/* 選択中＝青で塗りつぶし＋白文字（日付ピッカー .cal-day.is-selected と同じ）。選択は今日より優先。 */
.editcal-day.is-selected { background: var(--color-accent); color: var(--color-on-accent); box-shadow: none; }
.editcal-day.is-selected:hover { background: var(--color-accent); }

/* --- 選択した日の記録リスト --- */
/* 日付の帯（例 2025年10月8日 (水)）。淡い黄で、上のカレンダーと下のリストを仕切る。 */
/* 日付の帯。3列のグリッド（左の空き／日付／右の「農業日誌」ボタン）にしている。
   左右の列を同じ幅（1fr）にしてあるので、右にボタンが有っても無くても
   真ん中の日付は帯の中央に来る（ボタンのぶんだけ日付がずれる、を防ぐ）。 */
.editday-bar {
  display: grid;
  grid-template-columns: 1fr auto 1fr;  /* 左＝空き／中＝日付（内容ぶん）／右＝ボタン */
  align-items: center;
  font-weight: 700; color: var(--text);
  padding: 8px var(--bar-pad-x);
  background: var(--color-edit-soft);
  /* カレンダーのすぐ下に続ける（隙間なし）。 */
}
.editday-date { grid-column: 2; text-align: center; }  /* 日付は必ず真ん中の列に置く */
/* 帯の右端に出す「農業日誌」ボタン（マスター＋ベーシック以上のときだけ表示）。
   帯そのものが黄色いので、ボタンは白地＋茶枠にして「押せるもの」だと分かるようにする。 */
.nikki-link {
  justify-self: end;                 /* 右の列の中で右端に寄せる */
  display: inline-flex; align-items: center; gap: 4px;
  padding: 5px 10px;
  background: var(--surface-card);
  color: var(--color-nikki-text);
  border: 1px solid var(--color-nikki-deep);
  border-radius: var(--radius-control);
  font-size: var(--font-hint); font-weight: 700;
  text-decoration: none; white-space: nowrap;  /* 「農業日誌」を途中で折り返さない */
}
.nikki-link svg { width: 16px; height: 16px; }
.nikki-link:hover  { background: var(--color-nikki-bg); }
.nikki-link:active { background: var(--color-nikki); }   /* スマホは:hoverが無いので押した瞬間の色も付ける */
/* 1件＝1行（畑・野菜・時刻・作業内容・›）。押すと詳細へ。 */
/* 記録リスト全体を1つのグリッドにして列幅を決める（＝各行で列幅がバラつかない）。
   ・畑    … **余った幅を全部もらう**（`1fr`）＝野菜・時刻・作業内容・矢印を除いた残り全部。
             畑名は左寄せで、足りない分は右側に余白になる（長すぎる畑名だけ「…」省略）。
   ・野菜  … 内容ぶんに合わせるが **横幅の25%を上限**（`fit-content(25%)`）。ただしセル側 `min-width:4.5em`
             で内容幅より少し広めにする（畑に余りが行きすぎないように）。25%を超えたら「…」省略。
   ・時刻  … `HH:MM`。セル側 `min-width:3.8em` で少しだけゆとりを持たせる（中央寄せ）。
   ・作業内容 … 内容ぶんに合わせるが **横幅の35%を上限**（`fit-content(35%)`）。35%を超えたら「…」省略。
     ※`fit-content()` は内容ぶんに追従しつつ上限を効かせる（`minmax(0,25%/35%)` だと余白配分で
       常に上限まで伸びて、内容が短くても上限幅になってしまうので使わない）。
   ・矢印  … 内容ぶん（畑が余白を吸収するので › は自然に行の右端に来る）。
   全行 subgrid なので、これらの列幅は全行でそろう（内容幅は「全行で最も広いもの」に合わせる）。
   左右の余白は帯と同じ16px（各行ではなくここで持たせ、subgrid の桁ズレを防ぐ）。 */
.editday-list {
  display: grid;
  /* 列は 畑／野菜／時刻／作業内容／写真／メモ／矢印 の7つ。
     写真・メモの2列はアイコン1つ分で幅を固定する（--editday-list-icon）。
     こうすると、写真やメモが無い記録でも場所が空くだけで、全行の桁がそろう。 */
  grid-template-columns:
    minmax(var(--editday-hatake-min), 1fr) fit-content(20%) max-content fit-content(35%)
    var(--editday-list-icon) var(--editday-list-icon) auto;
  column-gap: 8px;
  padding: 0 var(--bar-pad-x);
}
.editday-row {
  grid-column: 1 / -1;                 /* リストの全列にまたがる */
  display: grid;
  grid-template-columns: subgrid;      /* 親（.editday-list）の列幅をそのまま使う＝全行そろう */
  align-items: center;
  padding: 14px 0;                     /* 左右は親の padding が持つ（ここで持つと桁がズレる） */
  border-bottom: 1px solid var(--border-light);
  text-decoration: none; color: var(--text);
  font-size: var(--table-font);
  cursor: pointer;
}
.editday-row:hover  { background: var(--hover-bg); }
.editday-row:active { background: var(--active-bg); }
.editday-row:focus  { outline: 2px solid var(--color-accent-soft); outline-offset: -2px; }
/* 畑・野菜・作業内容は1行にして、はみ出す分だけ「…」省略する（列幅は上の grid が決める）。
   畑/野菜は幅の取り合いで縮んだとき、作業内容は35%上限を超えたときに省略が効く。 */
.editday-hatake,
.editday-yasai,
.editday-sagyou { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.editday-hatake { font-weight: 700; }
/* 一覧の写真・メモアイコン（アイコンだけ・文字なし）。
   入れ物の幅はグリッド側で固定してあるので、中身が無くても場所は空いたままになる。 */
.editday-photo,
.editday-memo {
  display: flex;
  align-items: center;
  justify-content: center;
}
.editday-photo svg {
  width: var(--editday-list-icon);
  height: var(--editday-list-icon);
  display: block;
}
/* メモは塗りつぶしの画像なので、線画の写真アイコンと同じ寸法だと大きく見える。
   一回り小さくして見た目の重さをそろえる（列の幅は変えないので位置はそのまま）。 */
.editday-memo img {
  width: var(--editday-memo-icon);
  height: var(--editday-memo-icon);
  display: block;
}
/* 写真アイコンは線画。文字より少し薄くして、行の文字（畑名など）より主張させない。 */
.editday-photo svg { color: var(--text-hint); }
/* 野菜は内容ぶんに合わせるが「最低4.5em」を確保して内容幅より少し広く見せる（上限は grid の
   fit-content(25%)＝25%まで）。floor があるぶん、余り幅は畑に回りすぎない。 */
.editday-yasai  { color: var(--text); min-width: 4.5em; }
/* 時刻(HH:MM)も少しだけゆとりを持たせる（最低3.8em・中央寄せ）。 */
.editday-time   { color: var(--text-hint); white-space: nowrap; min-width: 3.8em; text-align: center; }
.editday-sagyou { color: var(--text); }

/* --- 長い畑名・野菜名・作業内容を、できるだけ読める形で見せる（はみ出し対策） --- */
/* 上の「…」省略だけだと、名前や作業内容が長いとき何の記録か分からなくなってしまう。
   そこで edit.php の JS が、実際にはみ出している文字にだけ次のクラスを順番に付けていく
   （どこに付けるかの判断＝JS、見た目の指定＝ここ）。
     ① .is-fit-s    … 文字を少し小さく（13px）
     ② .is-fit-xs   … さらに小さく（12px。読める下限のつもり）
     ③ .is-fit-wrap … それでも入らなければ2行にする（2行にも入らない分は「…」＝ここまで）
   2行のときは行間を詰めてあるので（12px×1.3×2行＝約31px）、行の高さは右端の「›」
   （20px×1.6＝32px）の範囲に収まる＝1行だけの記録と高さがそろい、リストがガタつかない。 */
.editday-hatake.is-fit-s,
.editday-yasai.is-fit-s,
.editday-sagyou.is-fit-s   { font-size: var(--editday-fit-font-s); }
.editday-hatake.is-fit-xs,
.editday-yasai.is-fit-xs,
.editday-sagyou.is-fit-xs  { font-size: var(--editday-fit-font-xs); }
/* 2行表示。-webkit-line-clamp は「指定した行数で切って末尾に…を付ける」指定で、
   display:-webkit-box とセットで使う決まり（text-overflow の代わりにこちらが省略を担当する）。 */
.editday-hatake.is-fit-wrap,
.editday-yasai.is-fit-wrap,
.editday-sagyou.is-fit-wrap {
  white-space: normal;       /* 折り返しを許可（上で指定した nowrap を打ち消す） */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;     /* 2行まで表示 */
  line-clamp: 2;             /* 同じ意味の新しい書き方（対応済みブラウザ用に併記） */
  line-height: 1.3;          /* 2行でも行の高さが増えないよう行間を詰める */
  overflow-wrap: anywhere;   /* 長い英数字の連なりも、途中で折り返してよいことにする */
}
.editday-arrow  { color: var(--text-faint); font-size: 20px; }
/* その日の記録が無いときの案内文。 */
.editday-empty { color: var(--text-hint); font-size: var(--font-note); padding: 16px var(--bar-pad-x); }

/* =============================================================================
   ログイン画面（添付デザインに合わせたスタイル）
   ※ ここは「.login 配下」だけに効くよう限定し、他の画面には影響させない。
   ============================================================================= */

/* ログイン画面の外枠。カードを縦・横とも中央に置く。
   min-height で“画面の高さいっぱい”を確保し、スマホでも上に寄りすぎないようにする
   （app-main の上下padding 16px×2 = 32px を差し引く）。 */
.login {
  display: flex;
  align-items: center;       /* 縦中央 */
  justify-content: center;   /* 横中央 */
  min-height: calc(100vh - 32px);
  min-height: calc(100dvh - 32px);
  padding: 24px 0;
}

/* 白いカード本体。角丸＋やわらかい影で“浮いた1枚”に見せる。 */
.login-card {
  width: 100%;
  max-width: 340px;            /* 画像のように細めの1カラム */
  background: var(--surface-card);  /* 白い面（アプリ共通の白。生#fff→トークンへ寄せ） */
  border-radius: 16px;         /* 角を丸く（この箇所固有の大きめ角丸＝据え置き） */
  padding: 32px 28px;          /* 内側の余白をたっぷり */
  box-shadow: 0 6px 24px rgba(0, 0, 0, 0.08); /* ふんわりした影 */
}

/* ロゴ（円形アイコン）。中央寄せして下に余白。 */
.login-logo { display: block; margin: 0 auto 20px; }

/* 「ログイン」見出し。黒めの太字。 */
.login h1 { font-size: 22px; margin: 0 0 20px; color: var(--text); }

/* 入力1項目のまとまり（ラベル＋入力欄）。グローバルの form label より優先させる。 */
.login .field { display: block; margin: 0 0 4px; }

/* 項目名（「お客様番号」など）。小さめのグレー文字。 */
.login .field-label { display: block; font-size: var(--font-hint); color: var(--text-hint); margin-bottom: 6px; }

/* 入力欄。背景うすグレー＋枠線なし＋角丸（画像の見た目）。 */
.login .field input {
  width: 100%;
  padding: 12px 14px;
  font-size: var(--font-input);             /* 16px = スマホで自動ズームされないサイズ */
  background: var(--surface-input);
  border: none;
  border-radius: var(--radius-control);     /* 操作部品の角丸（8px→トークンへ寄せ） */
  color: var(--text);
}
/* 入力中（フォーカス時）は白地＋緑の枠で“今ここ”を分かりやすく。 */
.login .field input:focus { outline: 2px solid var(--color-success); background: var(--surface-card); }  /* 生#fff→トークンへ寄せ */

/* ヒント文（入力欄の下の補足）。上下の余白を調整。 */
.login .hint { margin: 6px 0 16px; }

/* 「ログイン状態を維持する」。チェックとラベルを横並び、文字は緑。 */
.login .checkbox {
  display: flex; align-items: center; gap: 8px;
  margin: 8px 0 22px;
  color: var(--color-success); font-size: var(--font-note);
}
.login .checkbox input {
  width: var(--checkbox-size); height: var(--checkbox-size);   /* 全チェックボックス共通サイズ */
}
.login .checkbox input:checked {
  background: var(--color-success); border-color: var(--color-success);  /* チェックの色を緑に */
}

/* ログインボタン。山吹色（黄）×白文字。横幅いっぱい。 */
.login .btn-primary {
  position: relative;          /* 右端の「›」を絶対配置するための基準 */
  display: block;              /* <a> でも <button> と同じブロック幅で使えるようにする */
  width: 100%;
  padding: 14px;
  border: none;
  border-radius: var(--radius-control);   /* 操作部品の角丸（8px→トークンへ寄せ） */
  background: #f4b400;          /* ログイン専用の山吹色（1箇所ブランド色＝据え置き。トークン化は要相談） */
  color: #fff;
  font-size: var(--font-input);
  font-weight: bold;
  text-align: center;          /* <a> ではテキストが左寄せにならないように */
  text-decoration: none;       /* <a> の下線を消す */
  cursor: pointer;
}
.login .btn-primary:hover { background: #e0a500; } /* マウスを乗せたら少し濃く */
/* ボタン右端の「›」矢印（画像の「＞」を再現）。文字に頼らずCSSで付ける。 */
.login .btn-primary::after {
  content: "\203A";            /* › （右向きの山括弧） */
  position: absolute;
  right: 20px;
  top: 50%;
  transform: translateY(-50%);
  font-size: 18px;
}

/* エラーメッセージ。カード内で少し下に余白を取る。 */
.login .error { margin: 0 0 16px; }
/* メンテナンス告知。エラーと同じく少し下に余白を取る。 */
.login .notice-maintenance { margin: 0 0 16px; }

/* =============================================================================
   一覧表示画面（設定メニュー内・モック準拠）
   ※ .list-view 配下だけに効くよう限定する。上部バーは設定画面と共通
   （.settings-bar / .settings-close）を流用している。
   ============================================================================= */

/* --- 一覧テーブル。行ごとに下線、縦線なし（モック準拠）。 --- */
.list-table {
  width: 100%;
  border-collapse: collapse;        /* 隣り合うセルの境界線を1本に重ねる */
  font-size: var(--table-font);     /* 表の文字（15px。規格表など他の表と共通の役割トークン） */
}
.list-table th,
.list-table td {
  text-align: left;
  padding: 12px 8px;
  border-bottom: 1px solid var(--border-light); /* 行の区切り線 */
  vertical-align: top;
  word-break: break-word;           /* 長いメモ等でも枠からはみ出さない */
}
/* 見出し行（素材・詳細…）。文字は少し薄めにして、下線を濃くして本文と区別する。 */
.list-table th {
  color: var(--text-hint);
  font-weight: 700;
  border-bottom: 2px solid var(--border);
}
/* --- 列ごとの幅・寄せの調整（見出し th と 中身 td の両方に同じクラスを付ける） ---
   ・.list-col-center … 中身を中央に置く（マスター＝チェック／メモ＝アイコン）。見出しも中央にそろう。
   ・.list-col-narrow … セルを中身の幅ぶんだけに縮める（時間単価/単価/マスター/メモ）。
        こうすると残り幅を先頭の名前列（作業者など）が広く使える。
        width:1% ＋ white-space:nowrap は「中身の幅までギュッと縮める」表組みの定番テク。
   ※ 上の「.list-table td { text-align:left }」等に詳細度で負けないよう「.list-table」を前置する。 */
.list-table .list-col-center { text-align: center; }
/* 幅を縮めた列は左右の余白をやや広めにして、列に少しゆとりを持たせる。
   その分だけ、残り幅を使う名前列（作業者など）は少しせまくなる。 */
.list-table .list-col-narrow { width: 1%; white-space: nowrap; padding-left: 18px; padding-right: 18px; }
/* 値の列（時間単価/単価/大きさ など）は、見出しは中央・中身は右寄せにして位置をそろえる。
   th と td で寄せ方を分けたいので、要素名を付けて別々に指定する。 */
.list-table th.list-col-value { text-align: center; }
.list-table td.list-col-value { text-align: right; }
/* 見出し（タイトル）だけ中央にする列（例: 素材の「詳細」）。中身の td は既定（左）のまま。 */
.list-table th.list-col-hcenter { text-align: center; }

/* メモ列のアイコン（メモがある行だけ表示）。 */
.list-memo-icon { width: 20px; height: 20px; display: inline-block; vertical-align: middle; }

/* マスター列のチェックボックスの見た目（表示のみ・押せない）。ホーム画面設定と同じ雰囲気。 */
/* 四角い枠。オフ＝中身が白い四角。角は少しだけ丸める。 */
.list-check {
  display: inline-block;
  width: 20px;
  height: 20px;
  box-sizing: border-box;          /* 枠線を含めて 20px に収める */
  border: 2px solid #b7bcc4;       /* オフ時の灰色の枠（この箇所固有の灰＝据え置き） */
  border-radius: 4px;              /* 角をほんの少し丸く（極小部品。--radius-chip は複数箇所化したとき新設予定） */
  background: var(--surface-card);  /* オフ＝白（生#fff→トークンへ寄せ） */
  vertical-align: middle;
  position: relative;              /* 中の白チェック（::after）を絶対配置する基準 */
}
/* オン＝青い四角。枠も背景も青にする。 */
.list-check.is-on {
  background: var(--color-accent);
  border-color: var(--color-accent);
}
/* オンのときだけ、白いチェックマーク（レ点）を描く。
   「右下だけ線を残した小さな四角」を45度回してレ点に見せる、定番のCSS技。 */
.list-check.is-on::after {
  content: "";
  position: absolute;
  left: 5px;
  top: 1px;
  width: 5px;
  height: 10px;
  border: solid var(--color-on-accent);  /* レ点＝青地の上に載る白（生#fff→トークンへ寄せ） */
  border-width: 0 2px 2px 0;       /* 右辺と下辺だけ残す→回すとレ点 */
  transform: rotate(45deg);
}

/* 下部の固定バー：左に注意文（削除済み表示中）／右にトグルボタン。 */
.wp-bottombar {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  display: flex;
  align-items: center;
  justify-content: flex-end;        /* 注意文・ボタンをまとめて右へ寄せる */
  gap: 12px;
  max-width: 480px;                 /* .app-main と同じ幅で中央寄せ */
  margin: 0 auto;
  padding: 10px 16px calc(10px + env(safe-area-inset-bottom));
  background: var(--bg);
  border-top: 1px solid var(--border-light);
  box-sizing: border-box;
}
/* 削除済み表示中の注意文（バー右側・ボタンの左隣・赤・大きめ）。 */
.wp-deleted-note { min-width: 0; color: var(--color-error); font-size: 16px; font-weight: 700; line-height: 1.3; margin: 0; }
/* 削除済み表示トグルのボタン。高さは下部バーの他ボタンと同じ（padding:13px・font16px・角丸8px）。
   min-width で「削除済みを表示」と「通常表示に戻る」を同じ幅にそろえる。 */
.wp-toggle {
  min-width: 7.5em;
  text-align: center;
  padding: 13px 16px;
  border: none;
  border-radius: var(--radius-control);   /* 操作部品の角丸（8px→トークンへ寄せ） */
  background: var(--color-cancel);
  color: var(--color-on-cancel);
  font-size: var(--font-input);
  font-weight: 700;
  text-decoration: none;
  cursor: pointer;
}
.wp-toggle:hover { background: var(--color-cancel-hover); }
.wp-toggle:active { background: #c8c8c8; }

/* =============================================================================
   作業計画一覧（設定メニュー「作業計画」の入口画面。settings_plan_list.php）
   一覧・新規作成・編集・完了の導線がすべてここから始まる。
   ============================================================================= */

/* 作業計画一覧は下部に固定バー（削除済み表示ボタン）があるので、隠れないよう下に余白を確保。 */
.plan-list-view { padding-bottom: 84px; }

/* 「＋新規作成」ボタン（一覧の上・全幅）。カテゴリボタン（.list-cat）と同じ白い枠ボタンを
   土台に、押す目的が分かるよう文字と＋アイコンを主アクション色（青）にする。 */
.plan-add-btn {
  /* 背景イラスト（.set-btn-art の ::before レイヤー）をこのボタンの中に敷けるようにする基準。
     位置やサイズには影響しない（relative は「自分は動かず、中の absolute の基準になる」指定）。 */
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;   /* アイコンと文字をまとめて中央に置く */
  gap: 8px;
  width: 100%;
  box-sizing: border-box;
  padding: 13px 16px;
  margin-bottom: var(--section-gap);
  border: 1px solid var(--border);
  border-radius: var(--radius-control);   /* 操作部品の角丸（8px） */
  background: var(--surface-card);
  color: var(--text);                     /* 文字と＋アイコン＝黒（背景イラストと色がケンカしないように。旧＝青 --color-primary） */
  font-size: var(--font-input);
  font-weight: 700;
  text-decoration: none;
  cursor: pointer;
}
.plan-add-btn svg { width: 20px; height: 20px; }
.plan-add-btn:hover { background: var(--hover-bg); }
.plan-add-btn:active { background: var(--active-bg); }

/* --- 作業計画一覧（1項目=上下2段・3列の特殊レイアウト・モック準拠） ---
   3列: 1列目=畑/開始日、2列目=野菜/終了予定日、3列目=収穫予定個数/完了。 */
.wp-table { width: 100%; border-collapse: collapse; font-size: var(--table-font); }  /* 表の文字（15px→トークンへ寄せ） */
/* 見出し（2段）。文字は薄め・左寄せ。下段の下に濃い区切り線。 */
.wp-table th { color: var(--text-hint); font-weight: 700; text-align: left; padding: 6px 8px; }
.wp-table thead tr:last-child th { border-bottom: 2px solid var(--border); padding-bottom: 10px; }
/* データセル。 */
.wp-table td { padding: 8px; vertical-align: middle; }
/* 上段の下は点線（同じ項目の上段と下段の区切り）。 */
.wp-table .wp-top td { padding-top: 12px; border-bottom: 1px dashed var(--border-light); }
/* 下段の下は実線（項目と項目の区切り）。2行で1項目なので、見出し下と同じ線で境界を示す。 */
.wp-table .wp-bottom td { padding-bottom: 12px; border-bottom: 2px solid var(--border); }
/* 番号（1,2,…）。1列目で畑名の前に置く小さな見出し。 */
.wp-no { display: inline-block; min-width: 1.3em; color: var(--text-hint); }
/* 3列目（収穫予定/完了）は中身の幅に縮める。残りの幅を1列目と2列目で半分ずつ分ける
   （両方を width:50% にすると、3列目を除いた残り幅が 50:50 で等分される）。 */
.wp-table .wp-c1,
.wp-table .wp-c2 { width: 50%; }
/* 収穫予定（数値）は見出しも中身も右寄せ。3列目なので中身幅に縮める。 */
.wp-table .wp-num { text-align: right; white-space: nowrap; width: 1%; }
/* 日付の中身は折り返さない。 */
.wp-table .wp-date { white-space: nowrap; color: var(--text); }
/* 完了は見出しも中身も右寄せ。3列目なので中身幅に縮める。 */
.wp-table .wp-check { text-align: right; white-space: nowrap; width: 1%; }
/* 1項目=1つの <tbody>。マウスを乗せたら、その項目の2行をまとめてハイライトする。
   （行単位の .list-row:hover だと片方の行しか光らないため、tbody:hover で両方に効かせる） */
.wp-table .wp-item { cursor: pointer; }
.wp-table .wp-item:hover td { background: var(--hover-bg); }
.wp-table .wp-item:active td { background: var(--active-bg); }

/* 予定超過（終了予定日を過ぎたのに完了していない）の項目は、背景を淡いピンクにして
   「早く完了にしてほしい項目」だと分かるようにする。1項目=上下2行なので、tbody に付けた
   .is-overdue から中の td すべてに背景を敷く＝2行まとめて色が変わる。
   ※ 上の .wp-item:hover より後に書くこと（同じ強さのルールは後勝ちのため。
     ホバー時の色はさらに下で上書きしている）。 */
.wp-table .wp-item.is-overdue td { background: var(--color-overdue-bg); }
/* 超過の項目にマウスを乗せた／押したときは、同系色の少し濃いピンクにする
   （灰色のホバー色に戻すと「超過」の意味が消えてしまうため）。 */
.wp-table .wp-item.is-overdue:hover td,
.wp-table .wp-item.is-overdue:active td { background: var(--color-overdue-bg-hover); }

/* 完了済みの項目は薄くして「もう動いていない計画」であることをひと目で分かるようにする
   （進行中の計画との区別。出荷履歴の完了ロットと同じ流儀）。 */
.wp-table .wp-item.is-kanryou td { opacity: .6; }

/* 完了チェックのボタン（一覧上でタップして完了/解除する）。
   見た目は中の共通チェックボックス（.list-check）に任せ、ボタン自体は透明にする。
   padding で当たり判定を44px四方近くまで広げる（スマホで押しやすく。skill §6）。 */
.list-check-btn {
  border: none;
  background: none;
  padding: 12px;             /* 中のチェック20px + 12px×2 = 44px の当たり判定 */
  margin: -12px;             /* 広げたぶんを打ち消して、見た目の位置は元のまま */
  cursor: pointer;
  line-height: 0;            /* ボタンの行の高さで縦位置がずれないように */
}

/* 削除済み表示の「元に戻す」ボタン（各行の右端の小さなボタン）。
   グレーの操作ボタン（.wp-toggle）と同じ配色で、表の行に収まる小さめサイズにする。 */
.wp-restore-btn {
  padding: 8px 12px;
  border: none;
  border-radius: var(--radius-control);
  background: var(--color-cancel);
  color: var(--color-on-cancel);
  font-size: var(--font-note);
  font-weight: 700;
  cursor: pointer;
}
.wp-restore-btn:hover { background: var(--color-cancel-hover); }
.wp-restore-btn:active { background: #c8c8c8; }  /* 押した瞬間（.wp-toggle:active と同じ色） */

/* 行タップで詳細へ。押せることが分かるよう、指を乗せる/フォーカスで色を変える。 */
.list-row { cursor: pointer; }
.list-row:hover { background: var(--hover-bg); }
.list-row:active { background: var(--active-bg); }
.list-row:focus { outline: 2px solid var(--color-accent-soft); outline-offset: -2px; }

/* データ無し・準備中のときの案内文。 */
.list-empty { color: var(--text-hint); font-size: var(--font-note); padding: 8px 2px; }  /* 「データ無し」等の案内文（15px→補足文トークンへ寄せ） */

/* --- 作業内容の編集画面「素材」セクション（2026-07 画面統合） ---
   素材は作業内容の子データなので、作業内容の編集フォームの下に素材の一覧と
   「＋素材を追加」を出す。表・ボタンは一覧画面の共通クラス（.list-table/.plan-add-btn）を流用。 */
.sozai-master-section { margin-top: 32px; }                 /* フォームの操作ボタンと十分に間を空ける */
.sozai-master-title {
  font-size: var(--font-note);      /* 補足見出しなので本文よりやや小さく（15px） */
  font-weight: 700;
  color: var(--text-hint);          /* 薄めの文字色（セクションの区切りとして控えめに） */
  margin: 0 0 10px;
}

/* --- 作業内容の「新規作成」画面の素材入力欄（2026-08-18） ---
   作業内容を登録するのと同時に、その作業で使う素材もまとめて入力できるようにした欄。
   「＋素材を追加」を押すと入力行（.sozai-new-row）が1つずつ増える。
   入力欄そのもの（素材/名称/単価＋単位）は単独の素材フォームと同じ部品をそのまま使うので、
   ここでは「1件分のまとまりが目で見て分かる」ための枠と、行番号・削除ボタンだけを定義する。 */
.sozai-new-section { margin-top: 24px; }
/* 見出し「素材（任意）」。編集画面の素材セクションと同じ見た目にそろえる。 */
.sozai-new-title {
  font-size: var(--font-note);
  font-weight: 700;
  color: var(--text-hint);
  margin: 0 0 10px;
}
/* まだ1行も足していないときの案内文。 */
.sozai-new-empty { color: var(--text-hint); font-size: var(--font-note); margin: 0 0 10px; }
/* 素材1件分の入れ物。薄い枠で囲って「ここまでが1件」と分かるようにする。 */
.sozai-new-row {
  border: 1px solid var(--border-light);
  border-radius: var(--radius-card);
  background: var(--surface-card);
  padding: 4px 12px 12px;
  margin-bottom: 12px;
}
/* 行の上部＝左に「素材1」、右に×（この行の入力欄を消す）。 */
.sozai-new-head { display: flex; align-items: center; justify-content: space-between; }
.sozai-new-no { font-size: var(--font-note); font-weight: 700; color: var(--text-hint); }
/* ×ボタン。指で押しやすいよう44px角の当たり判定を確保する（負マージンで見た目は詰める）。 */
.sozai-new-del {
  border: 0;
  background: none;
  color: var(--text-hint);
  font-size: 20px;
  line-height: 1;
  padding: 12px;
  margin: -12px -12px -12px 0;
  min-width: 44px;
  min-height: 44px;
  cursor: pointer;
}
/* 「＋素材を追加」ボタン（.plan-add-btn の全幅ボタンを流用）。上の行と少しだけ間を空ける。 */
.sozai-new-add { margin-top: 4px; }

/* =============================================================================
   一覧表示の詳細画面（1件の全項目・読み取り・モック準拠）
   ※ .detail-view 配下だけに効くよう限定。上部バーは共通（.settings-bar）を流用。
   ============================================================================= */
.detail-view { padding-bottom: 96px; }
/* 1項目＝ラベル（左・固定幅）＋値（右・残り幅）。行ごとに薄い区切り線。 */
.detail-fields { display: flex; flex-direction: column; }
.detail-row {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 12px 4px;
  border-bottom: 1px solid var(--border-light);
}
.detail-label { flex: 0 0 6em; color: var(--text-hint); font-weight: 700; }
.detail-value { flex: 1; min-width: 0; color: var(--text); word-break: break-word; }
.detail-empty { color: var(--text-faint); }
/* メモは下に「見出し帯＋枠」で表示。 */
.detail-memo { margin-top: 18px; }
.detail-memo-title {
  text-align: center;
  font-weight: 700;
  color: var(--text);
  background: var(--border);   /* メモ見出しの帯。薄い灰色(#eee)から濃いめの灰色に */
  padding: 6px;
  border-radius: 4px;
}
.detail-memo-box {
  border: 1px solid var(--border-light);
  border-radius: 4px;
  min-height: 90px;
  padding: 10px;
  margin-top: 8px;
  color: var(--text);
  word-break: break-word;
  /* 下辺をドラッグして高さを変えられる（記録画面のメモと同じ操作感。編集・設定どちらの詳細でも共通）。
     ※ このメモ枠は <div>（読み取り専用）。div は既定の overflow:visible だと resize が効かないため、
       overflow:auto をセットで指定する（これが無いとリサイズハンドルが出ない）。 */
  resize: vertical;   /* 縦方向だけドラッグでリサイズ可能に */
  overflow: auto;     /* resize を有効にする条件（visible 以外に）。あふれたら枠内スクロール */
}
/* --- 記録に付けた写真（編集の詳細画面） ---
   メモと同じ「見出し帯＋枠」の形にそろえる。中身は写真を縦に並べるだけ。 */
.detail-photos .detail-memo-box {
  min-height: 0;        /* 写真が無いときに大きな空白を作らない（メモ枠の90pxは使わない） */
  resize: none;         /* 写真枠は高さ調整の必要がないので、つまみを出さない */
  overflow: visible;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.detail-photos-empty { margin: 0; color: var(--text-hint); font-size: var(--font-note); }
/* 写真1枚（タップで拡大するのでボタン）。ボタンらしい枠や背景は消して、写真だけ見せる。 */
.detail-photo {
  display: block;
  width: 100%;
  padding: 0;
  border: none;
  background: none;
  cursor: pointer;
}
.detail-photo img {
  display: block;
  width: 100%;
  height: auto;         /* width/height 属性があっても、縦横比を保って幅に合わせる */
  max-height: 260px;
  object-fit: contain;  /* 縦横比を保ったまま枠内に収める（引き伸ばさない） */
  border-radius: var(--radius-control);
  background: var(--bg);
}
.detail-photo:active img { opacity: .85; }   /* スマホでの押した感 */

/* 写真の拡大表示（全画面共通。開閉と向きの調整は app.js が行う）。
   画面いっぱいを使って見せるため、ダイアログ自体を画面全体に広げ、
   中の画像を「中央に置いて、必要なら90度回す」形にする。
   画像の大きさ・回転は app.js が測って style で指定するので、ここでは位置決めだけ。 */
dialog.photo-zoom-dialog {
  width: 100vw;
  height: 100dvh;              /* dvh … スマホのアドレスバーを除いた実際の高さ */
  max-width: 100vw;
  max-height: 100dvh;
  padding: 0;
  border: none;
  background: transparent;     /* 背景は下の ::backdrop（黒）が見える */
  overflow: hidden;            /* 回転した画像がはみ出してもスクロールバーを出さない */
  /* touch-action:none … ブラウザ標準のピンチ拡大・スクロールをこの中では起こさせない。
     これが無いと「ページ全体が拡大」され、写真を閉じてもアプリの画面が拡大されたままになる。
     代わりの拡大操作（ピンチ）は app.js が自前で行うので、閉じれば必ず元に戻る。 */
  touch-action: none;
}
dialog.photo-zoom-dialog::backdrop { background: rgba(0, 0, 0, .88); }
dialog.photo-zoom-dialog img {
  position: absolute;   /* 画面の中央に置く（回しても中心はずれない） */
  top: 50%;
  left: 50%;
  /* 大きさと transform（中央寄せ・回転・拡大・移動）は app.js が指定する */
}
/* 「×」閉じるボタン。拡大中は画面タップで閉じない作りなので、確実な出口として常に出す。
   写真の上に重なるため、半透明の黒地＋白文字にして写真の明るさに関係なく見えるようにする。 */
dialog.photo-zoom-dialog .photo-zoom-close {
  position: absolute;
  top: calc(env(safe-area-inset-top, 0px) + 8px);   /* スマホの切り欠きを避ける */
  right: 8px;
  width: 44px;                 /* 指で押しやすい最低の大きさ */
  height: 44px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: 50%;
  background: rgba(0, 0, 0, .55);
  color: #fff;
  font-size: 26px;
  line-height: 1;
  cursor: pointer;
}
dialog.photo-zoom-dialog .photo-zoom-close:active { background: rgba(0, 0, 0, .75); }

/* 下部の「削除／編集」ボタンは、初期設定の登録/キャンセルと同じ下部固定バー（.init-actions）を
   流用する（大きさ・位置をそろえるため）。色は 編集=.btn-yes 緑 / 削除=.btn-del 濃いピンク。 */

/* -----------------------------------------------------------------------------
   編集画面の「記録の詳細」だけの味付け（黄基調・モック 10-edit-detail 準拠）。
   .detail-view.topbar-edit 配下だけに効かせ、一覧（設定）の詳細には影響させない。
   --------------------------------------------------------------------------- */
/* 項目ラベルは編集の濃い黄（--color-edit-hover を流用）＋中央寄せ（モックに合わせる）。 */
.detail-view.topbar-edit .detail-label {
  color: var(--color-edit-hover);
  text-align: center;
}
/* ただし「日時」ラベルだけは黒のまま（値を青で目立たせる行なので、ラベルは通常色）。 */
.detail-view.topbar-edit .detail-datetime .detail-label { color: var(--text); }
/* 日時の値は青＝主強調色（記録画面の日時ボタンと同じ色みに合わせる）。 */
.detail-value.is-accent { color: var(--color-accent); font-weight: 700; }

/* 素材は「素材名（左・可変）… 数量＋単位（右・そのままの幅）」を1行ずつ縦に並べる。 */
.detail-sozai { display: flex; flex-direction: column; gap: 6px; }
.detail-sozai-row { display: flex; align-items: baseline; gap: 10px; }
.detail-sozai-name { flex: 1; min-width: 0; word-break: break-word; }        /* 素材名は余り幅をもらう */
.detail-sozai-qty  { flex: 0 0 auto; white-space: nowrap; text-align: right; } /* 数量＋単位は右寄せ・折り返さない */

/* 編集できる期間を過ぎた記録の案内文（削除・編集ボタンの代わりに出す）。中央・弱い文字。 */
.detail-locked {
  margin: 4px 4px 0;
  text-align: center;
  color: var(--text-hint);
  font-size: var(--font-hint);
  line-height: 1.6;
}

/* =============================================================================
   画面幅に応じた微調整（レスポンシブ）
   ============================================================================= */

/* --- 小さめのスマホ（横幅 〜400px）：カードの内側余白を少し詰める --- */
@media (max-width: 400px) {
  .login-card { padding: 26px 20px; border-radius: 14px; }
  .login h1 { font-size: 20px; }
}

/* --- タブレット・PC（横幅 768px〜）：本文を少し広く、ヘッダーのタップ域を確保 --- */
@media (min-width: 768px) {
  .app-main { max-width: 560px; }      /* 大画面では本文を少しゆったり */
  .settings-bar { max-width: 560px; }  /* 上部固定バーも本文カラムと同じ幅にそろえる */
  .init-actions { max-width: 560px; }  /* 下部固定バーも本文カラムと同じ幅にそろえる */
  .wp-bottombar { max-width: 560px; }  /* 作業計画一覧の下部固定バーも同じ幅にそろえる */
  .login-card { max-width: 360px; }    /* ログインカードは広げすぎない */
}

/* =============================================================================
   出荷画面（ピンク・フェーズ4）
   ・上部バーの色は .topbar-shipping（既存のしくみ）で自動的にピンクになる。
   ・ここでは「出荷する」画面だけの部品を書く：
     上部バーの保存ボタン／タブ／参考原価の黄帯／ピンクのラベル（記録の緑ラベルの色違い）。
   ============================================================================= */

/* タブ（出荷入力 / 精算記録 / 履歴）。上部バーのすぐ下に横3等分で並べる。
   現在地(is-active)はピンクの下線と文字、準備中(is-disabled)は薄い文字。 */
.ship-tabs {
  display: flex;
  margin: 0 0 var(--section-gap);
  border-bottom: 1px solid var(--border);
}
.ship-tab {
  flex: 1;
  text-align: center;
  padding: 10px 4px;
  font-size: var(--font-tab);        /* タブ用の一回り大きい文字 */
  font-weight: 700;
  color: var(--text-faint);          /* 既定は薄い文字（準備中タブ） */
  border-bottom: 3px solid transparent;
  margin-bottom: -1px;               /* 親の下線に自分の下線を重ねる */
  user-select: none;
  cursor: pointer;                   /* クリックで切り替えられるタブ（is-disabledは下で上書き） */
}
.ship-tab.is-active {
  background: var(--color-shipping);         /* 現在地は背景を出荷色（ピンク）で塗る */
  color: var(--color-on-label);              /* ピンク背景の上は黒文字 */
  border-bottom-color: var(--color-shipping);/* 下線もピンク */
  border-radius: var(--radius-control) var(--radius-control) 0 0;  /* 上側だけ角丸でタブらしく */
}
.ship-tab.is-disabled { cursor: default; }

/* タブの中身（パネル）。横に並べて .ship-panels-track を left(px) で動かす
   （タブクリック・スワイプの両方をこのしくみ1つでまかなう）。
   ・.ship-panels … 外枠。隣のパネルがはみ出さないよう overflow:hidden。
   ・.ship-panels-track … 実際に動く内側。パネルの数ぶん横に並べる（flex）。
   ・.ship-panel … 1枚ぶん＝画面幅と同じ（flex-basis:100%）。
   ★スライドに transform を使わない理由：下部の「記録」ボタン（.init-actions）は position:fixed で
     画面下に固定しているが、CSSの仕様で「祖先要素に transform があると、その子孫の fixed 要素は
     画面基準ではなく祖先基準の配置になる」。track に transform を使うとボタンが画面から外れて
     見えなくなってしまうため、position:relative + left(px) でスライドさせる。 */
.ship-panels { overflow: hidden; position: relative; transition: height .25s ease; }
.ship-panels-track {
  display: flex;
  align-items: flex-start;       /* 既定のstretchだと一番背の高いパネルに全部揃ってしまうため明示 */
  position: relative;
  left: 0;
  transition: left .25s ease;    /* タブクリック・スワイプ後のスナップをこの速さで動かす */
}
.ship-panel {
  flex: 0 0 100%;
  min-width: 0;                       /* flexの最小幅バグ防止（中の要素がはみ出す代わりに縮む） */
  box-sizing: border-box;
}
/* 共通ルール（.init-setting{padding-bottom:96px}＝下部固定ボタンに隠れないための余白）は、
   出荷画面では「出荷入力」「精算記録」タブにしか下部固定ボタン(.init-actions)が無いのに
   .init-setting はページ全体（3タブ共通）へ付いているため、履歴タブにも同じ余白が付いてしまい、
   本来スクロール不要な量の履歴でも下に不要な余白＋スクロールバーが出ていた。ここで一旦打ち消し、
   実際にボタンがある2タブのパネルにだけ同じ余白を付け直す。 */
.shipping-page.init-setting { padding-bottom: 0; }
.ship-panel[data-panel="input"],
.ship-panel[data-panel="settle"] { padding-bottom: 96px; }
/* 「動きを減らす」設定の端末では、アニメを止めて即時に切り替える（酔い・負担への配慮）。 */
@media (prefers-reduced-motion: reduce) {
  .ship-panels-track, .ship-panels { transition: none; }
}

/* 精算記録タブ：出荷ロット一覧・作業・メモをまとめた入れ物（JSが出荷先・野菜の選択で表示/非表示を切替）。
   .settle-form（.init-form）の gap は直接の子どうしにしか効かないため、この中でも
   同じ間隔で縦に並ぶよう、ここにも同じ display:flex + gap を付ける（付けないと中の項目間が詰まる）。
   min-width:0 … これ自体が .settle-form のflexアイテムであり、既定の min-width:auto のままだと
   「下の孫要素（.settle-lot-details）のコンテンツが伸びた分だけ、この入れ物ごと横に広がる」→
   ツリー展開時に画面が左にずれる、という不具合の原因になっていた（出荷入力タブにはこの入れ子が無いため
   同種の不具合が起きない）。flexの「縮む連鎖」は親から子まで全階層に min-width:0 が要るので、
   下の .settle-lot-list にも同じ理由で付けている。 */
.settle-wip { display: flex; flex-direction: column; gap: var(--item-row-gap); min-width: 0; }

/* 出荷ロット一覧（精算記録タブ）。1ロット＝ .settle-lot（畑・個数・野菜・出荷先＋明細を常に展開表示）。 */
.settle-lot-list { display: flex; flex-direction: column; min-width: 0; }
.settle-lot-list .init-hint { text-align: center; padding: 24px 0; } /* データが無いときの案内文 */

.settle-lot { border-top: 1px solid var(--border); min-width: 0; }
.settle-lot:last-child { border-bottom: 1px solid var(--border); }
.settle-lot.is-kanryou { opacity: .6; }  /* 確定済み（is_kanryou）のロットは少し薄く見せる */

.settle-lot-head {
  display: flex;
  flex-wrap: wrap;   /* 参考原価（.settle-lot-genka-full）だけ次の行に折り返すため */
  align-items: center;
  gap: 8px;
  padding: 10px 4px;
}
.settle-lot-date  { flex: 0 0 auto; font-size: var(--font-hint); color: var(--text-hint); }

/* 精算記録タブ：同じ出荷先×畑×野菜×規格の「有効な出荷データ」が複数あるときだけ出す選択チェックボックス
   （実質は単一選択＝<input type="radio">。1件しか無いときは自動選択するので不要＝既定は隠す）。
   .needs-pick は該当ロットが2件以上ある間だけJS(syncWip)が .settle-lot-list に付ける。 */
.settle-lot-pick {
  display: none;
  flex: 0 0 auto;
}
.settle-lot-list.needs-pick .settle-lot-pick { display: inline-block; }

/* 複数候補があるのにどれも選ばれていないまま記録ボタンを押したときの案内文（既定は非表示）。 */
.settle-lot-pick-warning {
  color: var(--color-error);
  font-size: var(--font-note);
  font-weight: 700;
  margin: 0;
}
.settle-lot-main, .settle-lot-sub {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
}
.settle-lot-hatake, .settle-lot-yasai, .settle-lot-kikaku { font-weight: 700; }
.settle-lot-kosuu,  .settle-lot-saki,  .settle-lot-genka-label { font-size: var(--font-hint); color: var(--text-hint); }
/* 参考原価＝「ラベル＋金額」を横並びにする1行（親 .settle-lot-main/.settle-lot-sub が
   column の flex なので、中身をまとめて1つのflexアイテムにしないとラベルと金額が縦に割れてしまう）。
   align-self:flex-start … 既定 align-items:stretch のままだと行が横いっぱいに伸びてしまうため。 */
.settle-lot-genka-row { display: flex; align-items: baseline; align-self: flex-start; gap: 4px; }
/* 参考原価の金額部分だけ、出荷入力タブの参考原価（黄帯）と同じ配色にする（背景=黄・文字=黒）。
   ラベル「参考原価」は2行目（.settle-lot-saki）と同じフォントのまま、値だけ黄色くする。 */
.settle-lot-genka-value {
  padding: 1px 6px;
  background: var(--color-edit);
  color: var(--color-on-label);
  border-radius: var(--radius-control);
}

/* 野菜名の行だけ、右側に規格名（例「2L」）を右寄せで添える。野菜名と同じフォント（太さ・大きさ・色）で見せる。 */
.settle-lot-yasai-line { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; }
.settle-lot-kikaku { flex: 0 0 auto; }

/* 明細（値下げ/廃棄/残り）。常に展開表示（開閉なし）。
   min-width:0 … 何も指定しないと明細行の内容ぶん .settle-lot 自体が横に広がり、
   画面が左にずれて見える不具合の原因になっていた。 */
.settle-lot-details { min-width: 0; }
.settle-lot-details-inner { min-width: 0; overflow: hidden; }

.settle-detail-row {
  display: flex;
  align-items: center;
  gap: 8px;
  min-width: 0;                /* flexアイテムの既定 min-width:auto による横はみ出しを防ぐ */
  padding: 4px 4px 4px 24px;   /* 左にインデントして明細行だと分かるようにする */
  font-size: var(--font-hint);
}
.settle-detail-arrow { color: var(--text-hint); }
.settle-detail-date  { flex: 0 0 auto; min-width: 64px; }
.settle-detail-suu   { flex: 1; min-width: 0; text-align: right; }
.settle-detail-tanka { flex: 0 0 auto; min-width: 64px; text-align: right; }

/* 残り個数・単価（赤字で強調。ui-spec §8「残り X 個 Y 円を赤字表示」）。
   font-size: inherit … 明細行共通の小さめ文字（.settle-detail-row の --font-hint）を打ち消して、
   親の標準サイズ＝参考原価の金額（.settle-lot-genka-value）と同じ大きさに揃える（2026-08-05）。 */
.settle-detail-remain {
  color: var(--color-error);
  font-weight: 700;
  font-size: inherit;
  padding-bottom: 10px;
}

/* 履歴タブ：出荷ロット一覧。精算記録タブと同じデータ・ツリー構造（.settle-lot系）を流用しつつ、
   絞り込みをせず全件（完了・未完了とも）を並べる（.history-lot-list の中は .settle-lot のCSSがそのまま効く）。
   精算記録タブは完了済みを .settle-lot.is-kanryou で薄く見せる（＝もう操作対象ではない、という意味）が、
   履歴タブは過去の記録を確認する場なので薄くせず、代わりに状態バッジ（未精算／精算済み）で判別できるようにする。 */
/* 絞り込み（出荷先/野菜/条件）の最後の行との間に、項目行どうしと同じ間隔をあける。 */
.history-lot-list { display: flex; flex-direction: column; min-width: 0; margin-top: var(--item-row-gap); }
.history-lot-list .init-hint { text-align: center; padding: 24px 0; }
.history-lot-list .settle-lot.is-kanryou { opacity: 1; }
/* 履歴タブの一覧では参考原価は表示しない（ユーザー判断）。カード自体は精算記録タブと共通の
   markup（.settle-lot-genka-row）を持たせてあるので、ここだけ隠す。編集ダイアログは
   このカードをクローンして #history-edit-head（.history-lot-list の外）に出すため、そちらは
   このルールの対象外＝普通に表示される。 */
.history-lot-list .settle-lot-genka-row { display: none; }

.history-status-badge {
  flex: 0 0 auto;
  width: 4.4em;         /* 「販売中」に合わせた固定幅（「完了」もここで中央寄せしてそろえる） */
  text-align: center;
  font-size: var(--font-hint);
  font-weight: 700;
  padding: 2px 8px;
  border-radius: var(--radius-control);
  white-space: nowrap;
  color: #fff;
  box-sizing: border-box;
}
.history-status-badge.is-open { background: var(--color-warn); }  /* 未精算＝注意色（橙） */
.history-status-badge.is-done { background: var(--color-success); } /* 精算済み＝完了色（緑） */

/* 履歴タブ：出荷ロットの明細（値下げ/廃棄/残り）は初期は折りたたみ、ヘッダーのタップで開閉する。
   .anim-section と同じgridトリックだが、履歴タブは .shipping-form の外（.history-lot-list内）に
   あるため専用クラスにする（.shipping-form スコープのCSSは効かないため）。 */
.history-lot-head { cursor: pointer; }
/* 参考原価（1個あたり・規格あたり）：畑/数量/出荷先の下に全幅の別行として折り返し、左右に並べる
   （.settle-lot-head 側の flex-wrap:wrap ＋ ここの flex-basis:100% で「1項目だけ次の行へ」）。
   左端は下の明細行の ▶（.settle-detail-row の padding-left:24px）と横位置をそろえる。
   精算記録タブ・履歴タブの編集ダイアログで共通（.settle-lot-head を使う両方に効く）。 */
.settle-lot-genka-full {
  flex-basis: 100%;
  margin-top: 2px;
  padding-left: 24px;
  display: flex;
  justify-content: space-between;
  align-items: baseline;
}
/* 1個あたり側（左）だけ、ラベル「参考原価」と金額の間を広げる（共通の.settle-lot-genka-rowの
   gap:4pxのままだと詰まって見えるため、ここだけ広げる）。 */
.settle-lot-genka-full .settle-lot-genka-row:first-child { gap: 28px; }
.history-detail-toggle {
  display: grid;
  grid-template-rows: 0fr;
  opacity: 0;
  transition: grid-template-rows .18s ease, opacity .18s ease;
}
.history-detail-toggle.is-open {
  grid-template-rows: 1fr;
  opacity: 1;
}
.history-detail-toggle .settle-lot-details-inner { min-height: 0; } /* grid の子として縮められるようにする */
@media (prefers-reduced-motion: reduce) {
  .history-detail-toggle { transition: none; }
}

/* 開閉状態を示す矢印。閉時は右向き、開くと下向きに回転する。 */
.history-toggle-arrow {
  flex: 0 0 auto;
  color: var(--text-hint);
  transition: transform .18s ease;
}
.history-lot-head[aria-expanded="true"] .history-toggle-arrow { transform: rotate(90deg); }

/* 履歴タブ：展開した明細の下に置く編集ボタン（.init-actions の画面下部固定ボタンとは別物・
   明細の続きとして右寄せの小さめボタン）。色は他画面の編集ボタンと同じ共通クラス（.btn-yes=青）を使う。 */
.history-lot-actions {
  display: flex;
  justify-content: flex-end;
  gap: 8px;
  padding: 8px 4px 4px;
}
.history-lot-actions .btn-yes,
.history-lot-actions .btn-del {
  padding: 8px 36px;
  border: none;
  border-radius: var(--radius-control);
  font-size: var(--font-input);
  font-weight: 700;
  cursor: pointer;
}

/* 1つあたり参考原価（黄帯）。左に小さく「1個あたり」＋「参考原価」、右に金額＋単位。
   幅は下の入力行(.init-row)とそろえる（フォームの子として同じ幅に伸びる）。 */
.ship-genka {
  box-sizing: border-box;            /* padding込みで幅計算（右にはみ出さない） */
  display: flex;
  align-items: center;
  gap: var(--bar-gap);
  /* 下方向の間隔はフォームの gap（.shipping-form）に任せる。ここで margin-bottom を足すと
     出荷先との間だけ二重に空いてしまうため付けない。 */
  padding: 6px 12px;
  min-height: var(--item-row-h);
  background: var(--color-edit);     /* 黄（編集色の黄トークンを流用） */
  color: var(--color-on-label);      /* 黄の上に載る黒文字 */
  border-radius: var(--radius-control);
  font-weight: 700;
}
/* 見出し・数字・円の3つを同じ幅（各1/3）に並べる。 */
.ship-genka-title,
.ship-genka-value,
.ship-genka-unit  { flex: 1; }                                           /* 3列を均等幅にする */
/* 左側の見出しは「1個あたり」を上・「参考原価」を下の2段に積む（縦並び）。 */
.ship-genka-title { display: flex; flex-direction: column; align-items: center; line-height: 1.2; }
.ship-genka-sub   { font-size: var(--font-hint); }                       /* 「1個あたり」（上段・小さめ） */
.ship-genka-label { font-size: var(--font-genka-label); }                /* 「参考原価」（下段・大きめ。太字は帯全体の font-weight:700 を継承） */
.ship-genka-value { font-size: var(--font-display); text-align: center; }/* 金額（列の中央） */
.ship-genka-unit  { font-size: var(--font-unit); text-align: center; }   /* 「円」（列の中央） */

/* --- 値付けシミュレーション（出荷入力タブ）：出荷金額を打つとその場で出る「利益・利益率」の箱。
       黒字＝緑系／赤字（.is-loss）＝赤系に切り替えて、儲かるかどうかが一目で分かるようにする。
       （状態を表す色なので --color-success / --color-error に寄せる。薄い背景色だけは
         この箱専用の一点もの＝トークン化しない。skill §1「例外」参照。） --- */
.ship-sim-box {
  box-sizing: border-box;
  display: flex;
  flex-direction: column;              /* 「利益」「利益率」の2行を縦に積む */
  gap: 2px;
  padding: 8px 12px;
  border: 1px solid #a5d6a7;           /* 薄緑の枠（黒字のとき） */
  border-radius: 8px;
  background: #e8f5e9;                 /* 薄緑の地（黒字のとき） */
  color: var(--color-success);
  font-weight: 700;
}
.ship-sim-row {
  display: flex;
  align-items: baseline;               /* 大きい数字と小さいラベルの下端をそろえる */
  gap: 6px;
}
.ship-sim-label { flex: 1; font-size: var(--font-hint); }     /* 「利益（手数料◯%差引後）」「利益率」 */
.ship-sim-note  { font-weight: 400; }                          /* 注記（手数料◯%差引後）は細字で控えめに */
.ship-sim-value { font-size: var(--font-display); }            /* 数字は参考原価と同じ大きさで目立たせる */
.ship-sim-unit  { font-size: var(--font-unit); }               /* 「円/個」「%」 */
/* 赤字（利益がマイナス）のとき：箱ごと赤系に切り替える（JSが .is-loss を付け外しする）。 */
.ship-sim-box.is-loss {
  border-color: #ef9a9a;
  background: #fdecea;
  color: var(--color-error);
}

/* --- 出荷入力フォーム：記録画面と同じ「ラベル＝色ボックス＋入力欄が段差なく隣接」の作り。
       色だけ緑→ピンクにする（記録の .record-form 一式をピンクで再現）。 --- */
.shipping-form { gap: var(--item-row-gap); }        /* 項目の縦間隔を詰める（.init-form の16pxを上書き） */
.shipping-form .init-row { gap: 0; }                /* ラベルと入力欄をぴったり隣接 */
/* 項目名ラベル＝ピンクの背景ボックス（黒の太字・中央寄せ）。行の高さいっぱいに伸ばす。 */
.shipping-form .init-label {
  flex: 0 0 40%;                     /* モックの広めのラベルボックス（画面幅の4割） */
  align-self: stretch;               /* 右の入力欄と同じ高さにそろえる */
  display: flex;
  align-items: center;
  justify-content: center;           /* 文字を左右中央に置く */
  min-height: var(--item-row-h);     /* 項目行の高さ（指で押しやすい） */
  margin: 0;                         /* 共通の form label { margin:12px 0 } を打ち消す */
  padding: var(--label-pad);         /* ラベルの内側余白 */
  background: var(--color-shipping);         /* 出荷＝ピンク（ホームの「出荷する」ボタンと同色） */
  border: 1px solid var(--color-shipping);   /* 入力欄の枠と高さ・見た目をそろえる */
  color: var(--color-on-label);              /* 項目名は黒文字（ピンクラベル上） */
  border-radius: var(--radius-control) 0 0 var(--radius-control);  /* 左側だけ角丸（入力欄と一体に見せる） */
}
/* 入力欄はピンクラベルの右に段差なく続く（左角は直角＝一体化・高さもそろえる）。 */
.shipping-form .init-input,
.shipping-form .init-unit-wrap .init-input {
  border-radius: 0 var(--radius-control) var(--radius-control) 0;
  border-left: none;                 /* ラベルとの境目の二重線を消す */
  min-height: var(--item-row-h);     /* ピンクラベルと同じ高さにそろえる */
}
.shipping-form .init-unit-wrap { align-self: stretch; }  /* 単位付き入力欄も行の高さいっぱいに */
.shipping-form .init-input:focus { outline-offset: -2px; }  /* 選択枠を内側に描き段差を防ぐ */

/* 出荷金額のラベルは「1個あたり」の小注記を上に、「出荷金額」を下に縦積みにする。
   2行ぶんのテキストが素の line-height（既定 約1.2）だと min-height(--item-row-h) をわずかに超えて
   「出荷数」の行（1行ラベル）より背が高くなってしまうため、line-height を詰めて 48px 以内に収める。 */
.shipping-form .init-label.ship-label-sub { flex-direction: column; gap: 1px; line-height: 1.1; }
.shipping-form .ship-sub-note { font-size: var(--font-hint); font-weight: 700; line-height: 1.1; }

/* 出荷金額・出荷数ブロックの開閉アニメ（規格を選ぶと開く／外すと閉じる）。
   記録画面の素材ブロック（.sozai-section）と同じ作り＝grid のトリック（0fr→1fr）で
   中身の実寸に合わせて滑らかに伸び縮みする。 */
.shipping-form .ship-suu-section {
  display: grid;
  grid-template-rows: 0fr;              /* 畳んだ状態（高さ0）。JS が .is-open を付けると開く */
  opacity: 0;
  transition: grid-template-rows .18s ease, opacity .18s ease;
}
.shipping-form .ship-suu-section.is-open {
  grid-template-rows: 1fr;             /* 開いた状態（中身の高さいっぱいまで） */
  opacity: 1;
}
/* grid の子。畳む間に中身がはみ出さないよう overflow:hidden。min-height:0 は0まで縮めるための必須指定。 */
.shipping-form .ship-suu-section-inner {
  min-height: 0;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  gap: var(--item-row-gap);
}
/* 「動きを減らす」設定の端末では、アニメを止めて即時に開閉する（酔い・負担への配慮）。 */
@media (prefers-reduced-motion: reduce) {
  .shipping-form .ship-suu-section { transition: none; }
}

/* 汎用の開閉アニメ（.ship-suu-section と全く同じ作り）。精算記録タブの出荷先→野菜／野菜→作業以下／
   作業→入力欄など、選択のたびに新しい項目を同じ見た目で出し入れしたい場面で使い回す。 */
.shipping-form .anim-section {
  display: grid;
  grid-template-rows: 0fr;
  opacity: 0;
  transition: grid-template-rows .18s ease, opacity .18s ease;
}
.shipping-form .anim-section.is-open {
  grid-template-rows: 1fr;
  opacity: 1;
}
.shipping-form .anim-section-inner {
  min-height: 0;
  min-width: 0;               /* flexの入れ子でも横に広がってしまわないよう明示（過去の不具合対策） */
  overflow: hidden;
  display: flex;
  flex-direction: column;
  gap: var(--item-row-gap);
}
@media (prefers-reduced-motion: reduce) {
  .shipping-form .anim-section { transition: none; }
}

/* 出荷履歴（前回の出荷単価）ブロック。外枠は .anim-section（データが揃うと出入り）、
   中はさらに .anim-section を入れ子にしてタップで展開/縮小する（初期は縮小）。
   角丸の枠で囲む（ホームの .home-header と同じ「白背景＋細い枠線＋カードの角丸」）。
   padding は内側（.anim-section-inner）に持たせる＝外側は grid で高さ0まで縮むため、
   ここに padding を置くと閉じていても枠の上下だけ隙間が残ってしまう。 */
#ship-history-outer {
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  background: var(--surface-card);
}
#ship-history-outer > .anim-section-inner {
  padding: 4px 8px;
}
.ship-history-toggle {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
  border: none;
  background: none;
  padding: 8px 4px;
  font-size: var(--font-input);
  font-weight: 700;
  color: inherit;
  cursor: pointer;
}
.ship-history-arrow {
  color: var(--text-hint);
  transition: transform .18s ease;
}
.ship-history-toggle[aria-expanded="true"] .ship-history-arrow { transform: rotate(90deg); }
.ship-history-content { padding: 0 4px 4px; }
.ship-history-row {
  margin: 0;
  font-size: var(--font-hint);
  color: var(--text-hint);
}

/* 出荷先追加ダイアログ（#saki-add-dialog）の「事後決定」チェック行。
   表示設定の画面（.disp-group .check-row）と同じ「チェック□＋説明文」の型。 */
#saki-add-dialog .check-row {
  display: flex;
  align-items: center;
  gap: 10px;
  cursor: pointer;
}
#saki-add-dialog .check-row input[type="checkbox"] {
  width: var(--checkbox-size);
  height: var(--checkbox-size);
  flex: 0 0 auto;
  cursor: pointer;
}

/* =============================================================================
   統計画面（「統計」・紫基調・フェーズ6）＝階層1「トップ（経営ダッシュボード）」のみ実装。
   設計方針は docs/ui-spec.md §11（4階層のドリルダウン構成）参照。今回は階層1のみ。
   ★このアプリで唯一「スマホとPCで見せる情報量を変える」画面：
     スマホ＝通勤中などにさっと確認できるよう大まかな数字（各ランキング上位3件）だけ、
     PC＝900px以上の広い画面で本文を大きく広げ、全件を横並びで比較できるようにする。
   ============================================================================= */
.stats-body {
  display: flex;
  flex-direction: column;
  gap: var(--section-gap);
  padding-top: 16px;  /* 上部バーの帯とサマリーの間の余白（他画面の本体上端と揃える） */
}

/* --- 期間：「期間 ‹ YYYY年MM月 ～ YYYY年MM月 ›」（編集画面の月ナビと同じ‹›）。記録画面の「日時」行と同じ考え方
   （ラベル＋縦の区切り線＋青文字の操作ボタン）だが要素数が違うため、この画面専用の値を持つ。 --- */
.stats-period {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: nowrap;             /* 折り返さず必ず1行（狭い画面では下の clamp() が文字を縮めて収める） */
  gap: 4px;
  padding: 10px 8px;
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  background: var(--surface-card);
  /* 最大22px・最小11pxの範囲で、画面幅(vw)に応じて自動で縮む。
     広い画面（PC等）では上限の22pxで止まり、狭いスマホでは1行に収まるよう縮む。
     clamp(下限, 基準値, 上限) … 基準値がvw(画面幅の%)なので、画面が狭いほど自動で小さくなる。 */
  font-size: clamp(11px, 3.5vw, 22px);
  white-space: nowrap;           /* 万一の折り返しも防ぐ（保険） */
}
.stats-period-label {
  font-weight: 700;
  color: var(--text);
  padding-right: 6px;
  border-right: 2px solid var(--border);  /* 記録画面の「日時」ラベルと同じ縦の区切り線 */
}
/* 枠や背景は付けず、矢印だけのシンプルな見た目にする（自作カレンダー .cal-nav・編集画面の
   .editcal-navbtn と同じ考え方）。当たり判定はこのバーの余白事情に合わせた34px四方。 */
.stats-period-nav {
  flex: 0 0 auto;
  display: inline-flex; align-items: center; justify-content: center;
  width: 34px; height: 34px;
  border: none;
  background: transparent;
  color: var(--text);
  text-decoration: none;
  font-size: 16px;
  border-radius: var(--radius-control);
}
.stats-period-nav:hover  { background: var(--hover-bg); }
.stats-period-nav:active { background: var(--active-bg); }
.stats-period-ym {
  border: none;
  background: transparent;
  padding: 4px 2px;
  font-family: inherit;
  font-size: inherit;
  color: var(--color-accent);
  font-weight: 700;
  cursor: pointer;
}
.stats-period-ym:active { opacity: .6; }  /* タップの反応（スマホ） */
.stats-period-tilde { color: var(--text-hint); }

/* --- サマリー：総売上・総原価・総利益・利益率の4枚のカード。スマホは2列、PCは4列一列。 --- */
.stats-summary-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.stats-summary-card {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: 14px;
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  background: var(--surface-card);
}
/* 利益率カードだけ紫で強調する（このダッシュボードで一番見てほしい数字のため）。 */
.stats-summary-card--main { border-color: var(--color-stats); background: var(--color-stats-bg); }
/* ラベルと「？」ヘルプボタンを横並びにする行（記録画面の.rate-labelと同じ考え方）。 */
.stats-summary-label-row { display: flex; align-items: center; gap: 4px; }
.stats-summary-label { font-size: var(--font-note); color: var(--text-hint); }
.stats-summary-value {
  font-size: var(--font-display);      /* このアプリで“一番大きく見せる”役割の文字（ホーム上部の日付と同じ） */
  font-weight: 700;
  color: var(--text);
  font-variant-numeric: tabular-nums;  /* 数字の桁がそろって読みやすい */
}
.stats-summary-card--main .stats-summary-value { color: var(--color-stats-text); }
/* 記録不足で計算できない指標（時給・ROI・収穫達成率など）の代わりの案内文。数字ではないので控えめな色に。 */
.stats-summary-value--empty { font-size: var(--font-note); color: var(--text-faint); font-weight: 400; }

/* サマリーカードをタップすると月別推移へ（.rate-helpは除く。JS側で判定）。 */
.stats-summary-card--link { cursor: pointer; }
.stats-summary-card--link:active { opacity: .8; }
.stats-summary-card--link:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; }

/* --- 隠れロス合計（旧・廃棄の警告を拡張）。既存の「注意＝橙」状態色をそのまま使う。 --- */
.stats-alert {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 14px;
  border: 1px solid var(--color-warn);
  border-radius: var(--radius-card);
  background: var(--color-warn-bg);
}
/* <a>化した分のリンク見た目リセット＋タップで階層4へ行けることが分かる程度の反応。 */
a.stats-alert--link { color: inherit; text-decoration: none; -webkit-tap-highlight-color: transparent; }
a.stats-alert--link:active { opacity: .8; }
.stats-alert-icon {
  flex: 0 0 auto;
  display: inline-flex; align-items: center; justify-content: center;
  width: 22px; height: 22px;
  border-radius: 50%;
  background: var(--color-warn);
  color: #fff;
  font-weight: 700;
  font-size: 14px;
}
.stats-alert-text { color: var(--color-warn-text); font-size: var(--font-note); }
.stats-alert-text strong { font-size: var(--font-input); }

/* --- ランキング：野菜別／畑別。スマホは縦積み、PCは横2カラム。 --- */
.stats-rankings { display: flex; flex-direction: column; gap: var(--section-gap); }
.stats-ranking-card {
  padding: 14px;
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  background: var(--surface-card);
}
.stats-ranking-title { display: flex; align-items: center; gap: 6px; margin: 0 0 10px; font-size: 17px; font-weight: 700; color: var(--text); }
.stats-bar-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.stats-bar-row {
  display: grid;
  grid-template-columns: 76px 1fr 52px;  /* 名前｜バー｜数値 の3列 */
  align-items: center;
  gap: 8px;
}
.stats-bar-name {
  font-size: var(--font-note);
  color: var(--text);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;  /* 長い名前は省略（…） */
}
.stats-bar-track {
  position: relative;
  height: var(--gauge-h);
  border-radius: var(--gauge-radius);
  background: var(--gauge-track);      /* ホームのDB使用量バーと同じ“レール”の色 */
  overflow: hidden;
}
.stats-bar-fill {
  display: block;
  height: 100%;
  border-radius: var(--gauge-radius) 0 0 var(--gauge-radius);
  background: var(--color-stats);      /* 通常＝統計の紫 */
}
.stats-bar-value { text-align: right; font-size: var(--font-note); font-variant-numeric: tabular-nums; color: var(--text); }
/* 赤字（利益率マイナス）の行は赤（危険の状態色）にして目立たせる。経営判断の警告として使う想定。 */
.stats-bar-row.is-negative .stats-bar-fill  { background: var(--color-error); }
.stats-bar-row.is-negative .stats-bar-value { color: var(--color-error); font-weight: 700; }

/* スマホでは各ランキングの上位3件だけを見せる（要点優先。4件目以降は900px未満で非表示）。 */
.stats-bar-row:nth-child(n+4) { display: none; }

/* --- 評価（読み取り専用）。記録画面の「メモ」欄（全幅の色バー＋下にテキストエリア）と同じ構成だが、
   入力欄ではなく <div> に定型文をそのまま表示するだけ。色は記録=緑・出荷=ピンクと同じ考え方で
   このページのテーマ色（統計＝紫 --color-stats）を使う。 --- */
.stats-evaluation-label {
  display: flex;
  align-items: center;
  justify-content: center;         /* 文字を左右中央に置く（記録画面の緑ラベルと同じ） */
  min-height: var(--item-row-h);
  padding: var(--label-pad);
  background: var(--color-stats);  /* 統計＝紫（このページの上部バーと同じ色） */
  color: var(--color-on-label);
  font-weight: 700;
  border-radius: var(--radius-control) var(--radius-control) 0 0;  /* 上側だけ角丸 */
}
.stats-evaluation-box {
  display: block;
  width: 100%;
  box-sizing: border-box;              /* padding/border を含めて全幅に収める */
  min-height: 88px;                    /* textarea 4行ぶん相当 */
  padding: 10px;
  border: 1px solid var(--border);
  border-top: none;                    /* 上の紫バーとの境目の二重線を消す */
  border-radius: 0 0 var(--radius-control) var(--radius-control);  /* 下側だけ角丸 */
  background: var(--surface-card);     /* 白い面（アプリ共通の白） */
  font-size: var(--font-input);
  line-height: 1.5;
  white-space: pre-wrap;               /* 本文中の改行をそのまま活かす */
  color: var(--text);
  /* 下辺をドラッグして高さを変えられる（記録詳細のメモ枠 .detail-memo-box と同じ操作感）。
     ※ この枠は <div>（読み取り専用）。div は既定の overflow:visible だと resize が効かないため、
       overflow:auto をセットで指定する（これが無いとリサイズハンドルが出ない）。 */
  resize: vertical;                    /* 縦方向だけドラッグでリサイズ可能に */
  overflow: auto;                      /* resize を有効にする条件（visible 以外に）。あふれたら枠内スクロール */
}
/* 「◯年◯月◯日 時点」＝いつのデータで書かれた評価かの注記（2026-08-14 追加）。
   本文ではなく補足なので、右寄せ・小さめ・薄い文字にして評価文の邪魔をしない。 */
.stats-evaluation-generated {
  margin: 6px 2px 0;
  text-align: right;
  font-size: var(--font-hint);
  color: var(--text-hint);
}
.stats-evaluation-limit-note {
  margin: 6px 2px 0;
  font-size: var(--font-hint);
  color: var(--text-hint);             /* エラーではなく単なる案内なので警告色にはしない */
}
/* 「評価を更新する」ボタン（スーパーマスター専用・動作確認用）。統計のテーマ色（紫）で、控えめな小ボタンにする。 */
.stats-evaluation-regenerate-btn {
  display: block;
  margin: 8px 2px 0;
  padding: 8px 14px;
  border: none;
  border-radius: var(--radius-control);
  background: var(--color-stats);
  color: var(--color-on-label);
  font-size: var(--font-note);
  font-weight: 700;
  cursor: pointer;
}
.stats-evaluation-regenerate-btn:hover { background: var(--color-stats-hover); }
.stats-evaluation-regenerate-btn:disabled { opacity: .6; cursor: default; }
.stats-evaluation-error {
  margin: 6px 2px 0;
  font-size: var(--font-hint);
  color: var(--color-error);
}

/* このページ専用に本文の幅を、スマホ〜PC(900px)化する直前まで画面幅にそのまま追従させる
   （.app-main-stats は StatsController が layout.php の <main> へ渡すクラス。他画面の .app-main には
   影響しない）。他画面は480px/768px以上560pxの段階的な固定幅のままなので、480〜900px幅の中間サイズ
   （タブレットや横に広げたウィンドウ）で左右に大きな余白が残っていた（* { box-sizing:border-box }
   により max-width:100% は左右のpadding込みでちょうど画面幅いっぱいになる＝段階的な固定値をやめて
   常時この式にする）。900px以上は1080pxで頭打ちにし、そこから先はレイアウト（列数）だけ切り替える。 */
.app-main-stats { max-width: min(1080px, 100%); }
.app-main-stats .settings-bar { max-width: min(1080px, 100%); }  /* 固定の上部バーも本文と同じ幅にそろえる */

/* ランキング/一覧の行をリンクにするときの共通の型。<li class="stats-bar-row"> のgrid構成
   （nth-child(n+4)によるスマホ上位3件表示の対象）は変えず、内側の <a> は display:contents で
   見た目のボックスを消し、中の<span>がliのgridへ直接並ぶようにする
   （リンクとしての振る舞い・タップ範囲は<a>のまま保たれる）。階層2「野菜別 原価内訳」一覧の行が使う。 */
.stats-bar-row-link { display: contents; color: inherit; text-decoration: none; }

/* 野菜別ランキングは「カード領域そのもの」をタップすると階層2（全野菜の原価内訳比較）へ遷移する
   （2026-07-11：1件ずつのドリルダウンを直接の入口にすると横比較できずユーザビリティが低いという
   指摘を受けての設計変更。以前あった行ごとのリンクは廃止し、畑別と同じ非リンクの行に戻した）。 */
a.stats-ranking-card--link {
  display: block;
  color: inherit;
  text-decoration: none;
  -webkit-tap-highlight-color: transparent;
}
a.stats-ranking-card--link:hover  { background: var(--color-stats-bg); }
a.stats-ranking-card--link:active { background: var(--color-stats-bg); opacity: .85; }
.stats-ranking-hint {
  margin: 10px 0 0;
  text-align: right;
  font-size: var(--font-hint);
  color: var(--color-stats-text);
  font-weight: 700;
}

/* 一覧内の最大値を100%とする相対スケールの行はスマホでも上位3件に絞らず全件見せる
  （「経営判断のための比較」が目的の一覧では、階層1ランキングの「上位だけ見せれば足りる」が
   当てはまらないため。対象の<ol>に .stats-bar-list--show-all を付けて使う）。 */
.stats-bar-list--show-all .stats-bar-row:nth-child(n+4) { display: grid; }

@media (min-width: 900px) {
  .stats-summary-grid { grid-template-columns: repeat(4, 1fr); }
  .stats-rankings { flex-direction: row; }
  .stats-ranking-card { flex: 1 1 0; }
  /* PCでは隠していた4件目以降を再表示し、全件を横並びで見比べられるようにする。 */
  .stats-bar-row:nth-child(n+4) { display: grid; }
}

/* =============================================================================
   統計画面 - 階層2「野菜別詳細」（原価内訳のみ実装。ui-spec.md §11「階層2」参照）
   ============================================================================= */
.stats-yasai-period {
  margin: 0;
  text-align: center;
  color: var(--text-hint);
  font-size: var(--font-note);
}
.stats-yasai-empty { color: var(--text-hint); font-size: var(--font-note); }
.stats-yasai-subtitle { margin: var(--section-gap) 0 10px; font-size: 15px; font-weight: 700; color: var(--text); }

/* 円グラフ（人件費 vs 材料費）はCSSの conic-gradient だけで描く（JS/画像ライブラリ不要）。
   同じテーマ色（統計＝紫）の2トーン（--color-stats／--color-stats-hover）で人件費・材料費を区別する。 */
.stats-pie-row { display: flex; align-items: center; gap: 20px; flex-wrap: wrap; }
.stats-pie {
  flex: 0 0 auto;
  width: 120px;
  height: 120px;
  border-radius: 50%;
}

/* 人件費/材料費の色の凡例（色の意味の対応表）。円グラフの横（詳細ページ）・積み上げ棒グラフの上
   （比較一覧ページ）の両方から使う共通部品。 */
.stats-cost-legend {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 8px;
  font-size: var(--font-note);
  color: var(--text);
}
/* 比較一覧ページでは単独（円グラフの横ではなくページ上部）に置くため、横並びにする。 */
.stats-cost-legend--standalone { flex-direction: row; gap: 16px; justify-content: center; margin: 0 0 4px; }
.stats-cost-swatch {
  display: inline-block;
  width: 12px;
  height: 12px;
  border-radius: 3px;
  margin-right: 6px;
  vertical-align: middle;
}
.stats-cost-swatch--labor    { background: var(--color-cost-labor); }
.stats-cost-swatch--material { background: var(--color-cost-material); }
/* 階層4「隠れロス」円グラフの3色。既存の状態色をそのまま流用する（新しい色を増やさない）：
   値下げ損失＝赤（--color-error、赤字と同じ「損失」の意味）／廃棄損失＝橙（--color-warn、旧・廃棄警告と同じ色）／
   手数料＝青（--color-accent、第三者に払う中立的なコスト）。 */
.stats-cost-swatch--nesage    { background: var(--color-error); }
.stats-cost-swatch--haiki     { background: var(--color-warn); }
.stats-cost-swatch--tesuuryou { background: var(--color-accent); }
.stats-cost-total { margin: 10px 0 0; text-align: center; font-weight: 700; color: var(--text); }
/* 作業内容別コスト構成のように「円＋割合」を1つの値に併記するときの、割合側の控えめな表示。 */
.stats-cost-ratio { color: var(--text-hint); font-weight: 400; }

/* 損益分岐点分析（CVP図。2026-07-14追加）：このプロジェクト初のXY座標グラフ。
   円グラフ・棒グラフはCSSのみで描いてきたが、2直線の交点を示すにはSVGの座標系が要る。
   色は系列識別トークン（--chart-series-N）を流用（--color-cost-labor/materialは
   「原価内訳」カードの人件費/材料費の個別内訳という意味で既に使っているため転用しない）。 */
.stats-cvp-chart { display: flex; justify-content: center; }
.stats-cvp-svg   { width: 100%; max-width: 420px; height: auto; }
.stats-cvp-axis  { stroke: var(--border); stroke-width: 1; }
.stats-cvp-line  { stroke-width: 2; fill: none; }
.stats-cvp-line--cost  { stroke: var(--chart-series-6); }
.stats-cvp-line--sales { stroke: var(--chart-series-2); }
.stats-cvp-guide { stroke: var(--text-hint); stroke-width: 1; stroke-dasharray: 3 3; }
.stats-cvp-point { fill: var(--text); }
.stats-cvp-label { font-size: 11px; fill: var(--text-hint); }
.stats-cvp-result  { margin: 10px 0 0; text-align: center; font-weight: 700; color: var(--text); }
.stats-cvp-warning { margin: 0 0 10px; color: var(--color-error); font-size: var(--font-note); }

/* 「今どこにいるか」＝実績販売個数の表示（2026-07-14追加。損益分岐点しか出ておらず現在地が
   読み取れないという指摘を受けて追加）。ガイド点線は損益分岐点と区別するため濃い色にする。
   総費用線・売上高線のギャップ（差＝利益/損失）は、黒字なら控えめな色、赤字だけ赤で目立たせる
   （stats-bar-rowのis-negativeと同じ「赤字だけ強調する」既存ルールを踏襲）。 */
.stats-cvp-guide--sold  { stroke: var(--text); }
.stats-cvp-label--sold  { font-weight: 700; fill: var(--text); }
.stats-cvp-point--sold  { fill: var(--text); }
.stats-cvp-gap          { stroke: var(--text-hint); stroke-width: 3; }
.stats-cvp-gap.is-loss  { stroke: var(--color-error); }
.stats-cvp-status         { margin: 4px 0 0; text-align: center; font-size: var(--font-note); color: var(--text); }
.stats-cvp-status.is-loss { color: var(--color-error); }

/* 材料費の作業内容別内訳・野菜別の原価比較など、金額（円）を表示する内訳リストは
   階層1の利益率(%)用より名前・数値の列を広めに取る。 */
.stats-bar-list--yen .stats-bar-row { grid-template-columns: 96px 1fr 84px; }

/* 野菜別 利益ランキング一覧：野菜1件＝1枠のカードに分け、「利益（金額）」「利益率（割合）」を
   別の色のバーで並べる（2026-07-12：同じ紫の帯を2本積んだだけでは「別々の情報の羅列」に見えて
   分かりにくいという指摘を受けて作り直した。枠で囲むことで“この2本は同じ野菜の情報”と一目で伝わり、
   色を変えることで“違う種類の指標”と一目で伝わる、の両方を狙う）。
   利益＝統計のテーマ色（紫）、利益率＝アプリ共通のアクセント色（青）。青はこのアプリで紫の次に
   認識しやすい色としてボタン等に使われている色をそのまま流用＝新しい色を増やさない。 */
.stats-yasai-rank-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.stats-yasai-rank-card {
  display: block;
  color: inherit;
  text-decoration: none;
  padding: 12px 14px;
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  background: var(--surface-card);
}
.stats-yasai-rank-head { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; }
.stats-yasai-rank-badge {
  flex: 0 0 auto;
  display: inline-flex; align-items: center; justify-content: center;
  width: 22px; height: 22px;
  border-radius: 50%;
  background: var(--color-stats-bg);
  color: var(--color-stats-text);
  font-size: var(--font-hint);
  font-weight: 700;
}
.stats-yasai-rank-name { font-size: var(--font-input); font-weight: 700; color: var(--text); }
.stats-yasai-rank-metric {
  display: grid;
  grid-template-columns: 50px 1fr 74px;  /* ラベル(利益/利益率)｜バー｜数値 */
  align-items: center;
  gap: 8px;
}
.stats-yasai-rank-metric + .stats-yasai-rank-metric { margin-top: 6px; }
.stats-yasai-rank-metric-label { font-size: var(--font-hint); color: var(--text-hint); }
.stats-yasai-rank-metric-value {
  font-size: var(--font-note);
  color: var(--text);
  text-align: right;
  font-variant-numeric: tabular-nums;
}
.stats-yasai-rank-fill {
  display: block;
  height: 100%;
  border-radius: var(--gauge-radius);
}
.stats-yasai-rank-fill--profit { background: var(--color-stats); }
.stats-yasai-rank-fill--rate   { background: var(--color-accent); }
.stats-yasai-rank-swatch--profit { background: var(--color-stats); }
.stats-yasai-rank-swatch--rate   { background: var(--color-accent); }
/* 赤字の野菜は枠ごと赤で強調する（利益・利益率の2本のバー・数値とも同じ赤に統一＝「これは損している」を
   色だけで一目で伝える。バーの色分け〔紫/青〕より赤字警告を優先する）。 */
.stats-yasai-rank-card.is-negative { border-color: var(--color-error); }
.stats-yasai-rank-card.is-negative .stats-yasai-rank-fill { background: var(--color-error); }
.stats-yasai-rank-card.is-negative .stats-yasai-rank-metric-value { color: var(--color-error); font-weight: 700; }

/* 単一指標（売上/原価/利益率）のカード：ラベル列を持たず「バー｜数値」の2列にする
  （2026-07-13追加：利益ランキングと違い1本しか指標が無いため専用の列構成）。 */
.stats-yasai-rank-metric--single { grid-template-columns: 1fr 90px; }

/* 一覧の1位を強調する共通クラス（赤字=is-negativeと対になる「一番良い」の意味。
   新しい色は増やさず、統計テーマ色〔紫〕の薄い背景・太枠で目立たせる＝2026-07-13追加）。 */
.stats-bar-row.is-top { background: var(--color-stats-bg); border-radius: var(--radius-control); }
.stats-bar-row.is-top .stats-bar-name { font-weight: 700; color: var(--color-stats-text); }
.stats-yasai-rank-card.is-top { border-color: var(--color-stats); border-width: 2px; }

/* カード見出し行のシェア%（全体に占める割合）。名前の右に控えめに添える。 */
.stats-yasai-rank-share {
  margin-left: auto;
  font-size: var(--font-hint);
  color: var(--text-hint);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

/* 一覧上部のミニサマリー（合計/平均＋対象件数）。数値の羅列を見る前に「全体感」を一目で伝える
  （2026-07-13追加）。 */
.stats-yasai-list-summary {
  display: flex;
  gap: 16px;
  flex-wrap: wrap;
  align-items: baseline;
  padding: 10px 14px;
  margin-bottom: var(--section-gap);
  border-radius: var(--radius-card);
  background: var(--color-stats-bg);
  color: var(--color-stats-text);
  font-size: var(--font-note);
}
.stats-yasai-list-summary strong { font-size: var(--font-input); font-weight: 700; }

/* 野菜別 原価内訳の比較一覧：1行＝1野菜の「人件費+材料費」を積み上げ棒グラフで表す。
   外側(.stats-cost-bar)の幅＝一覧内の合計原価の相対スケール（金額に絶対的な上限が無いため）、
   内側2つの幅＝その野菜自身の合計に対する人件費/材料費の割合（＝円グラフと同じ考え方を棒で表現）。 */
.stats-cost-bar { display: flex; height: 100%; border-radius: inherit; overflow: hidden; }
.stats-cost-bar-labor    { height: 100%; background: var(--color-cost-labor); }
.stats-cost-bar-material { height: 100%; background: var(--color-cost-material); }

/* 野菜別ランキング一覧（stats_yasai_list.php）の見出し下の1行案内（例「売上が多い順に並んでいます」）。 */
.stats-yasai-hint { margin: 0 0 10px; color: var(--text-hint); font-size: var(--font-note); }

/* 畑別ランキング一覧の並び替えタブ（利益率順／坪効率順）。設定画面のタブ(.init-tab)と似た考え方だが
   2択の軽いトグルなので専用の小さいスタイルにする。 */
.stats-sort-tabs { display: flex; gap: 8px; margin-bottom: 10px; }
.stats-sort-tab {
  flex: 1 1 0;
  text-align: center;
  padding: 10px;
  border: 1px solid var(--border);
  border-radius: var(--radius-control);
  background: var(--surface-card);
  color: var(--text-hint);
  font-size: var(--font-note);
  font-weight: 700;
  text-decoration: none;
}
.stats-sort-tab.is-active { background: var(--color-stats); color: var(--color-on-label); border-color: var(--color-stats); }

/* 野菜のカルテ（stats_yasai.php）の売上・原価・利益・利益率カードで、利益/利益率が赤字のときに赤くする
  （階層1ランキングの.is-negativeと同じ考え方。金額カードは.stats-summary-valueに直接付ける）。 */
.stats-summary-value.is-negative { color: var(--color-error); }

/* =============================================================================
   積み上げ縦棒グラフ（月別売上）＋畑内訳の複数色円グラフ（2026-07-13追加）
   ・階層2一覧「総売上」タップ先＝月別×野菜別（複数色・積み上げ）
   ・野菜のカルテ「月別 売上」＝月別・単色（統計テーマ色）
   ・野菜のカルテ「畑内訳」＝畑別・複数色（円グラフ）
   色は :root の系列識別色 --chart-series-1〜8（役割は :root コメント参照）。
   ============================================================================= */
.stats-vbar-plot {
  display: flex;
  align-items: flex-end;
  gap: 1.2%;  /* %指定＝コンテナ幅に対する割合。枠が広がれば間隔も比例して広がる
                 （2026-07-14：一度vwのclampを試したが、狭い画面でも間隔が広がって棒が細く見える
                  逆効果になったため元に戻した。「狭いほど間隔を目立たなくする」は下の
                  .stats-vbar-stackの幅比率〔colに対する相対%〕側で対応する）。 */
  height: 200px;
  padding: 4px 2px 0;
}
.stats-vbar-col {
  flex: 1 1 0;  /* 本数ぶん均等分割＝上限を設けない。本数が少なければ自然に太く、多ければ細くなる */
  min-width: 0;
  height: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: flex-end;
}
.stats-vbar-stack {
  width: 80%;  /* colの幅いっぱいではなく80%だけ使う＝棒とcol幅の差(=見た目の隙間)はcolの相対%なので、
                  列が狭くなる（画面が狭い・月数が多い）ほど隙間の絶対pxも自動的に小さくなる。
                  2026-07-14：65%だと隙間が目立つという指摘を受けて80%に引き上げた。 */
  height: 100%;  /* 既定は満杯。積み上げ版(月別×野菜別)はPHP側でこの高さ自体をインライン指定して上書きする */
  display: flex;
  flex-direction: column-reverse;  /* 先頭の系列(売上が多い野菜)を下から積む */
  border-radius: var(--gauge-radius) var(--gauge-radius) 0 0;
  overflow: hidden;
  background: var(--gauge-track);  /* データが無い/少ない月も土台の帯がうっすら見える */
}
.stats-vbar-seg { width: 100%; background: var(--color-stats); }  /* 単色版（月別売上）の既定色 */
/* 単色版で1位（最大値）の月を強調＝横棒一覧の.is-topと同じ考え方。 */
.stats-vbar-seg.is-top { background: var(--color-stats-text); }
/* 月ラベルの文字も画面幅に連続的に追従する（13px〜18pxの範囲。本文最大幅1080pxで18pxに達するよう
   vw係数を逆算＝18/1080*100）。太さ・間隔と同じ「段階切替ではなく連続追従」の考え方（2026-07-14）。
   ★同日：10px〜13pxでは小さすぎて見えないという指摘を受け、範囲を底上げした。 */
.stats-vbar-axis-label {
  margin-top: 6px;
  font-size: clamp(13px, 1.7vw, 18px);
  color: var(--text-hint);
  white-space: nowrap;
}
.stats-vbar-axis-label.is-top { color: var(--color-stats-text); font-weight: 700; }

.stats-vbar-legend {
  list-style: none;
  margin: 14px 0 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 8px 14px;
  font-size: var(--font-hint);
  color: var(--text);
}
.stats-vbar-swatch {
  display: inline-block;
  width: 10px;
  height: 10px;
  border-radius: 2px;
  margin-right: 5px;
  vertical-align: middle;
}

/* ===== お客様の管理画面（customer_management.php・スーパーマスター専用） ===== */
/* お客様番号・お客様名・ライセンスは他の一覧画面（--table-font 15px）より読みやすく大きめに。
   セル全体を対象にする（「操作」列の「変更」ボタンは .customer-edit-btn 自身の
   font-size 指定が優先されるので、親セルをまとめて18pxにしてもボタンの文字は変わらない）。
   縦方向も、共通 .list-table の vertical-align:top（上寄せ）だと「変更」ボタンの高さぶん
   他列の文字が上に寄って見えるため、この画面だけ中央にそろえる。
   文字サイズは18pxを上限に、画面幅（vw）に応じて連続的に縮む（.stats-vbar-axis-label と
   同じ考え方）。お客様番号（9桁）などが狭い画面で折り返さず1行に収まるようにするため。
   vw係数は「上限px ÷ 本文最大幅(1080px) × 100」で逆算＝18/1080*100。 */
.customer-list-table th,
.customer-list-table td {
  font-size: clamp(13px, 1.7vw, 18px);
  vertical-align: middle;
}
/* 番号・ライセンス・操作（.list-col-narrow）は中身の幅ぶんだけに縮む列だが、共通ルール
   （2040行目）の左右余白18px固定のままだと3列ぶん占有幅が大きく、残り幅を使うお客様名列を
   圧迫する。この画面だけ余白も画面幅に応じて縮め、お客様名列の表示幅を確保する
   （vw係数は上と同じ「上限px÷1080×100」＝18/1080*100）。 */
.customer-list-table .list-col-narrow {
  padding-left: clamp(6px, 1.7vw, 18px);
  padding-right: clamp(6px, 1.7vw, 18px);
}
/* DB列（データベース番号）は「1」のような1〜2文字だけなので、余白をさらに絞った最小幅にする。 */
.customer-list-table .customer-col-db {
  padding-left: clamp(4px, 0.8vw, 8px);
  padding-right: clamp(4px, 0.8vw, 8px);
  text-align: center;
}
/* 「変更」ボタンは自身の font-size（--font-input=16px）・padding が固定なので、そのままだと
   狭い画面でも幅を譲らない。ここも同じ考え方で画面幅に応じて縮める
   （16px→16/1080*100、上下8px→8/1080*100、左右24px→24/1080*100）。 */
.customer-list-table .customer-edit-btn {
  font-size: clamp(12px, 1.5vw, 16px);
  padding: clamp(5px, 0.75vw, 8px) clamp(10px, 2.2vw, 24px);
}
/* 一覧の上のツールバー：上段=削除済み表示切替／「＋ 新規追加」（左右に離す）、
   下段=検索欄（全幅）。上段は横幅が足りない画面では折り返す。 */
.customer-toolbar {
  display: flex;
  flex-direction: column;
  gap: 18px; /* 上段（削除済み表示/新規追加）と検索欄の間を少しゆったりさせる */
  padding: 4px 2px 12px;
}
.customer-toolbar-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 10px;
}
/* 検索欄は下段で全幅。16px＝スマホの自動ズーム防止。 */
.customer-search-input {
  width: 100%;
  box-sizing: border-box;
  padding: 10px 14px;
  border: 1px solid var(--border-input);
  border-radius: var(--radius-control);
  font-size: var(--font-input);
  background: var(--surface-input);
  color: var(--text);
}
.customer-inactive-toggle {
  flex: 0 0 auto;
  padding: 10px 16px;
  border: none;
  border-radius: var(--radius-control);
  font-size: var(--font-note);
  font-weight: 700;
  cursor: pointer;
  white-space: nowrap;
}
/* 「削除したお客様を表示」がオンの間は、青地にして今どちらを見ているか分かるようにする。 */
.customer-inactive-toggle.is-active {
  background: var(--color-accent);
  color: var(--color-on-accent);
}
.customer-toolbar-row .btn-yes {
  flex: 0 0 auto;
  padding: 10px 20px;
  border: none;
  border-radius: var(--radius-control);
  font-size: var(--font-input);
  font-weight: 700;
  cursor: pointer;
}
/* 一覧「操作」列の「変更」ボタン。他画面の共通ボタン（.confirm-actions button・
   history-lot-actions の編集ボタン等）と同じ角丸・文字サイズにそろえる。 */
.customer-edit-btn {
  padding: 8px 24px;
  border: none;
  border-radius: var(--radius-control);
  font-size: var(--font-input);
  font-weight: 700;
  cursor: pointer;
  white-space: nowrap;
}
/* 新規追加ダイアログ：お客様番号の入力欄＋「再生成」ボタンを横並びにする。 */
.customer-code-wrap {
  display: flex;
  gap: 8px;
  align-items: center;
}
/* お客様番号の入力欄は伸び縮みして行の余りを埋める（再生成ボタン・DB番号ピッカーとの間に
   不自然な空白を作らない）。 */
.customer-code-wrap input { flex: 1 1 auto; min-width: 0; }
/* 新規追加ダイアログの「お客様番号＋DB番号」ブロック。<label>と同じ余白・太さで揃える
   （labelで包むとピッカーのタップで番号入力欄へフォーカスが飛ぶため、divで作っている）。 */
.customer-add-code-field { display: block; margin: 0 0 12px; font-weight: 600; font-size: var(--dialog-body-size); }
/* ラベル行：左「お客様番号（半角数字9桁）」・右端「DB番号」。 */
.customer-add-code-labels { display: flex; justify-content: space-between; align-items: baseline; }
/* DB番号ピッカー（js-pickerが作る .picker-wrap ＝行の右端の要素）。中身の幅だけにする。
   ※ セレクタを .customer-code-wrap 配下に限定する（#customer-add-dialog 全体に書くと
   ライセンスのピッカーまで巻き込まれて右寄せになってしまう）。 */
.customer-code-wrap .picker-wrap { flex: 0 0 auto; }
.customer-code-wrap .picker-display {
  width: auto; min-width: 64px;    /* 「1 ▾」程度が収まる最小幅 */
  padding: 8px 10px; box-sizing: border-box;
  border: 1px solid var(--border-input); border-radius: 6px;
  font-size: var(--font-input);
}
.customer-code-regen {
  flex: 0 0 auto;
  padding: 10px 14px;
  border: none;
  border-radius: var(--radius-control);
  font-size: var(--font-note);
  font-weight: 700;
  cursor: pointer;
  white-space: nowrap;
}
/* 変更ダイアログ：お客様番号の表示（変更不可のため入力欄ではなく2段表示）。
   1段目=ラベル（小さめ・ヒント色）、2段目=番号本体（このアプリの“一番大きく見せる”役割の
   文字サイズ --font-display。ホーム上部の日付・出荷画面の金額と同じ役割）。 */
.customer-edit-code-block { margin: -4px 0 12px; }
/* 変更ダイアログ：お客様番号（左）とDB番号（右端）を同じ行で左右に振り分ける。
   1行目=ラベル同士、2行目=値同士（customer_management.php の .customer-edit-code-row）。 */
.customer-edit-code-row { display: flex; justify-content: space-between; align-items: baseline; }
.customer-edit-code-label {
  display: block;
  color: var(--text-hint);
  font-size: var(--font-note);
}
.customer-edit-code-value {
  display: block;
  font-size: var(--font-display);
  font-weight: 700;
  color: var(--text);
  letter-spacing: 1px;
}
/* 変更ダイアログ：登録年月日（お客様番号ブロックの下・ライセンスの上）。
   お客様番号のような「主役の情報」ではなく“ついでに確認する補足”なので、
   ラベルと値を1行に並べて小さく出す（番号は26pxで大きく、こちらは本文と同じ控えめな大きさ）。 */
.customer-edit-created-block {
  display: flex;              /* ラベルと値を横並びにする */
  gap: 8px;
  align-items: baseline;      /* 文字の下端をそろえる（大きさが違っても並びが崩れない） */
  margin: -4px 0 12px;
}
.customer-edit-created-value {
  font-size: var(--font-note);
  color: var(--text);
}
/* 変更ダイアログ：バリデーションエラー（Ajax失敗時にダイアログ内へ表示。ページ遷移しないため
   共通の flash_dialog は使えない＝この場所に直接出す）。 */
.customer-edit-error {
  color: var(--color-error);
  font-size: var(--font-note);
  font-weight: 700;
  margin: -4px 0 12px;
}
/* 変更ダイアログ下部の「削除する」ボタン。主アクション（変更する/キャンセル）から離し、
   罫線で軽く区切って誤操作を防ぐ。 */
.customer-edit-danger {
  margin-top: 16px;
  padding-top: 14px;
  border-top: 1px solid var(--border-light);
  display: flex;
  justify-content: center;
  gap: 10px;
  flex-wrap: wrap;
}
.customer-edit-danger .btn-del,
.customer-edit-danger .btn-yes {
  padding: 8px 20px;
  border: none;
  border-radius: var(--radius-control);
  font-size: var(--font-note);
  font-weight: 700;
  cursor: pointer;
}
/* 完全削除の確認ダイアログ：通常の confirm-message より強調する警告文。 */
.customer-danger-text { color: var(--color-error); }

/* このページ専用に本文の幅を、スマホ〜PC化する直前まで画面幅にそのまま追従させる
  （.app-main-stats と同じ考え方＝段階的な固定幅ではなく常時この式にする）。
   900px以上は1080pxで頭打ちにする。 */
.app-main-customers { max-width: min(1080px, 100%); }
.app-main-customers .settings-bar { max-width: min(1080px, 100%); }

/* 通知トースト（変更・削除・復元の結果を画面下に一時表示。ページ遷移しないので
   共通の flash_dialog の代わりに使う）。 */
.customer-toast {
  position: fixed;
  left: 50%;
  bottom: 24px;
  transform: translateX(-50%) translateY(10px);
  max-width: min(92vw, 420px);
  padding: 10px 22px;
  border-radius: var(--radius-control);
  font-size: var(--font-input);
  font-weight: 700;
  color: #fff;
  text-align: center;
  opacity: 0;
  pointer-events: none;
  transition: opacity .18s ease, transform .18s ease;
  z-index: 50;
}
.customer-toast.is-show { opacity: 1; transform: translateX(-50%) translateY(0); }
.customer-toast.is-ok    { background: var(--color-success); }
.customer-toast.is-error { background: var(--color-error); }
@media (prefers-reduced-motion: reduce) {
  .customer-toast { transition: none; }
}

/* 天気の行の下に出す小さな案内（2種類）。
   ① 取得中の表示（<p>）… 位置情報を調べている間だけ出す
   ② ブロックの案内（<button>）… タップで解除手順が開く
   ボタンらしい枠や背景は消して、どちらもふつうの案内文に見せる。 */
.record-form .record-geo-note {
  display: block;
  width: 100%;
  margin: 0 0 2px;
  padding: 0 var(--record-datetime-gap);
  border: none;
  background: transparent;
  font-family: inherit;
  font-size: var(--font-hint);   /* .init-hint と同じ大きさ（button は継承しないため明示） */
  color: var(--text-hint);
  text-align: left;
  line-height: 1.4;
}
/* ★重要★ hidden のときは必ず隠す。
   上で display を指定すると、ブラウザ既定の [hidden]{display:none} を打ち消してしまい、
   hidden を付けても消えなくなる（作者が書いたCSSのほうが優先されるため）。
   **hidden で出し入れする要素に display を指定したら、この1行を必ずセットで書くこと。**
   （js-picker の「元の select が二重に出る」落とし穴とまったく同じ原因） */
.record-form .record-geo-note[hidden] { display: none; }
/* 押せるのは「ブロックの案内」だけ（取得中の表示は押せない）。 */
.record-form button.record-geo-note { cursor: pointer; }
.record-form button.record-geo-note:active { opacity: .6; }   /* タップの反応（スマホ） */

/* 取得中の小さなクルクル。全画面ローディングの回転（app-spin）を使い回す。
   文字と同じ行に収まる大きさにし、色は「取得中」の文字になじむ控えめな青。 */
.geo-spinner {
  display: inline-block;
  width: 12px;
  height: 12px;
  margin-right: 6px;
  vertical-align: -1px;
  border: 2px solid var(--border-light);
  border-top-color: var(--color-accent);   /* 一部だけ濃くして回転が分かるようにする */
  border-radius: 50%;
  animation: app-spin 0.8s linear infinite;
}
/* 「解除のしかたを見る」だけリンクらしく見せる＝押せることが分かるようにする。 */
.record-geo-note-link {
  color: var(--color-accent);
  font-weight: 700;
  text-decoration: underline;
  white-space: nowrap;   /* 途中で改行させない */
}

/* =============================================================================
   農業日誌（/nikki）— bisque 基調。過去5年ぶんの記録を並べて振り返る画面。
   ・上部バーは全画面共通（.settings-bar）。色は外枠の .topbar-nikki が決める。
   ・bisque はとても淡いので、文字・線には濃い茶（--color-nikki-text /
     --color-nikki-deep）を必ず組で使う（淡い色だけだと読めないため）。
   ============================================================================= */

/* --- タブ（この日／月でくらべる／写真） --------------------------------------
   出荷画面のタブ（.ship-tab）と同じ作法。違いは「押すとページを開き直す ＜a＞」点だけ
   （日誌はタブごとに見るデータが違うので、全部を先に読み込まない＝軽い）。 */
.nikki-tabs {
  display: flex;
  margin: 0 0 var(--section-gap);
  border-bottom: 1px solid var(--border);
}
.nikki-tab {
  flex: 1;
  text-align: center;
  padding: 10px 4px;
  font-size: var(--font-tab);
  font-weight: 700;
  color: var(--text-faint);          /* 選んでいないタブは薄い文字 */
  text-decoration: none;
  border-bottom: 3px solid transparent;
  margin-bottom: -1px;               /* 親の下線に自分の下線を重ねる */
}
.nikki-tab.is-active {
  background: var(--color-nikki);            /* 現在地は bisque で塗る */
  color: var(--color-nikki-text);            /* 淡い地の上なので濃い茶の文字 */
  border-bottom-color: var(--color-nikki-deep);
  border-radius: var(--radius-control) var(--radius-control) 0 0;  /* 上側だけ角丸 */
}

/* --- 日／月の送り（◀ 8月7日 (金) ▶）。編集画面の月ナビと同じ役割の帯。 --- */
.nikki-nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
  background: var(--color-nikki-bg);
  border-radius: var(--radius-control);
  padding: 6px 10px;
  margin-bottom: var(--item-row-gap);
}
.nikki-navbtn {
  flex: 0 0 auto;
  min-width: 44px;                   /* 指で押しやすい当たり判定 */
  text-align: center;
  padding: 4px 8px;
  color: var(--color-nikki-text);
  font-size: var(--font-input);
  text-decoration: none;
}
.nikki-navbtn:active { background: var(--color-nikki); border-radius: var(--radius-control); }
.nikki-navtitle { font-size: var(--font-tab); font-weight: 700; }
/* 送りの下に出す使い方のヒント（小さい灰色）。 */
.nikki-hint { margin: 0 0 var(--item-row-gap); font-size: var(--font-hint); color: var(--text-hint); }

/* --- 「この日」タブ：1年＝1カード ------------------------------------------ */
.nikki-year {
  background: var(--surface-card);
  border: 1px solid var(--border-light);
  border-radius: var(--radius-card);
  margin-bottom: var(--item-row-gap);
  overflow: hidden;                  /* 角丸から中身がはみ出さないように */
}
.nikki-year-head {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 7px 10px;
  background: var(--color-nikki-bg);
  border-bottom: 1px solid var(--border-light);
  font-weight: 700;
}
.nikki-year-num { font-size: var(--font-input); }
/* いちばん上（＝いま基準にしている年）に付ける小さな印。 */
.nikki-year-badge {
  background: var(--color-nikki-text);
  color: var(--color-on-primary);
  border-radius: var(--radius-control);
  padding: 1px 7px;
  font-size: var(--font-hint);
}
/* 右側の「天気・気温・件数」。控えめな文字にする。 */
.nikki-year-meta {
  margin-left: auto;                 /* 右端へ押しやる */
  display: inline-flex; align-items: center; gap: 4px;
  font-weight: 400;
  font-size: var(--font-hint);
  color: var(--text-hint);
}
.nikki-tenki-icon { width: 18px; height: 18px; }   /* 共通の天気アイコン（色は .tenki-* が付ける） */

/* 記録1件＝1行。押すと既存の「記録の詳細」画面へ。 */
.nikki-rec {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  padding: 8px 10px;
  border-top: 1px solid var(--border-light);
  color: var(--text);
  text-decoration: none;
}
.nikki-rec:first-of-type { border-top: none; }
.nikki-rec:hover  { background: var(--hover-bg); }
.nikki-rec:active { background: var(--active-bg); }
.nikki-rec-time { flex: 0 0 3.2em; color: var(--text-hint); font-size: var(--font-hint); padding-top: 2px; }
/* min-width:0 … 長い文字が入っても横に伸びないようにする（下の「…」省略を効かせるため） */
.nikki-rec-main { flex: 1; min-width: 0; }
.nikki-rec-tags { display: flex; flex-wrap: wrap; gap: 4px; }
/* 畑・野菜の名前は薄い青の小さなラベルにする（作業内容と見分けやすくするため）。 */
.nikki-tag {
  background: var(--color-accent-bg);
  border-radius: 6px;
  padding: 0 6px;
  font-size: var(--font-hint);
}
.nikki-rec-work { display: block; font-weight: 700; margin-top: 2px; }
/* メモは1行に収め、あふれたら「…」で省略する（行の高さをそろえるため）。 */
.nikki-rec-memo {
  display: block;
  margin-top: 2px;
  color: var(--text-hint);
  font-size: var(--font-hint);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* 写真のサムネイル（1枚目だけ）。2枚以上あるときは右下に「+1」を出す。 */
.nikki-rec-thumb { position: relative; flex: 0 0 46px; height: 46px; }
.nikki-rec-thumb img {
  width: 100%; height: 100%;
  object-fit: cover;                 /* 縦横比を保ったまま枠いっぱいに切り取る */
  border-radius: var(--radius-control);
  display: block;
}
.nikki-rec-thumb-more {
  position: absolute; right: 2px; bottom: 2px;
  background: rgba(0, 0, 0, 0.55);
  color: #fff;
  border-radius: 8px;
  padding: 0 5px;
  font-size: 11px;
}
/* その日の収穫量の合計（カードのいちばん下）。記録＝緑の系統でうっすら色を付ける。 */
.nikki-harvest {
  padding: 6px 10px;
  border-top: 1px solid var(--border-light);
  background: var(--color-record-bg);
  color: var(--color-success);
  font-size: var(--font-hint);
  font-weight: 700;
}
/* 記録が無い年の1行。 */
.nikki-empty { margin: 0; padding: 12px 10px; color: var(--text-faint); font-size: var(--font-note); }
.nikki-empty--wide { text-align: center; }

/* --- 「月でくらべる」タブ：小さいカレンダーを5年ぶん ------------------------ */
.nikki-mini {
  background: var(--surface-card);
  border: 1px solid var(--border-light);
  border-radius: var(--radius-card);
  padding: 8px;
  margin-bottom: var(--item-row-gap);
}
.nikki-mini-head { display: flex; align-items: baseline; margin-bottom: 4px; }
.nikki-mini-title { font-weight: 700; }
.nikki-mini-sum { margin-left: auto; font-size: var(--font-hint); color: var(--text-hint); }
.nikki-mini-week,
.nikki-mini-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; }
.nikki-mini-week { font-size: var(--font-hint); color: var(--text-hint); text-align: center; margin-bottom: 2px; }
.nikki-mini-week .is-sun { color: var(--color-error); }
.nikki-mini-week .is-sat { color: var(--color-saturday); }
/* 日付のマス。正方形にそろえ、記録がある日だけ地色＋件数バッジを出す。 */
.nikki-mini-cell {
  position: relative;
  aspect-ratio: 1 / 1;               /* 縦と横を同じ長さにする */
  display: flex; align-items: center; justify-content: center;
  border-radius: 5px;
  background: var(--bg);
  color: var(--text);
  font-size: var(--font-hint);
  text-decoration: none;
}
.nikki-mini-cell.is-empty { background: transparent; }
.nikki-mini-cell.is-sun { color: var(--color-error); }
.nikki-mini-cell.is-sat { color: var(--color-saturday); }
.nikki-mini-cell.has-rec { background: var(--color-nikki-bg); font-weight: 700; }
.nikki-mini-cell.is-today { outline: 2px solid var(--color-today); }        /* 今日＝緑（他画面と同じ） */
/* ※「選択中＝青枠」はこの画面では使わない（月を動かすと基準日が1日になり、毎回1日に枠が付くため）。 */
.nikki-mini-num { line-height: 1; }
/* 件数のバッジ（マスの右下に小さく）。 */
.nikki-mini-badge {
  position: absolute; right: 1px; bottom: 1px;
  min-width: 14px; height: 14px;
  display: flex; align-items: center; justify-content: center;
  background: var(--color-nikki-deep);
  color: var(--color-on-primary);
  border-radius: 50%;
  font-size: 10px;
  font-weight: 700;
}

/* --- 「写真」タブ：年ごとのアルバム ----------------------------------------- */
.nikki-album { margin-bottom: var(--section-gap); }
.nikki-album-year {
  font-weight: 700;
  color: var(--color-nikki-text);
  margin-bottom: 6px;
}
.nikki-album-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; }
.nikki-album-item { margin: 0; }
/* 写真1枚＝1つのリンク（押すとその記録の詳細画面へ。拡大表示は詳細画面でできるのでここではしない）。
   写真と下の説明をまとめて1つの <a> に入れているので、どこを押しても同じ場所へ行く。 */
.nikki-album-btn {
  display: block; width: 100%;
  text-decoration: none;
  color: var(--text-hint);
}
.nikki-album-btn img {
  width: 100%;
  aspect-ratio: 1 / 1;
  object-fit: cover;
  border-radius: var(--radius-control);
  display: block;
}
.nikki-album-btn:active img { opacity: .7; }   /* スマホは:hoverが無いので、押した瞬間の反応を付ける */
/* 写真の下の短い説明（日付＋野菜名）。長い名前は「…」で省略して1行に収める。 */
.nikki-album-item figcaption {
  margin-top: 2px;
  font-size: var(--font-hint);
  text-align: center;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* --- PC など広い画面：年カード・カレンダーを2列に並べて見比べやすくする ----- */
@media (min-width: 900px) {
  .nikki-view .nikki-body { display: grid; grid-template-columns: 1fr 1fr; gap: 0 var(--section-gap); }
  /* 送り（◀▶）とヒントは横いっぱいのまま（2列にまたがらせる）。 */
  .nikki-view .nikki-nav,
  .nikki-view .nikki-hint { grid-column: 1 / -1; }
}
