/*
 * RingiQuest ブログ（記事一覧・個別記事）の追加スタイルシート。
 *
 * `styles.css` が定義するデザイントークン（--bg / --surface / --accent 等）を
 * そのまま継承する前提で、ここには**差分のみ**を書く。トークンの再定義はしない。
 * `styles.css` を先に読み込み、このファイルは常にその後に読み込むこと
 * （HTML 側の <link> の順序に依存する）。
 *
 * ビルドステップ無し・第三者フォント無しの原則は LP トップと同じ。
 */

/* ---------- パンくず ---------- */
/*
 * 個別記事の先頭に置く現在地表示。区切りの「/」は疑似要素で描画し、
 * マークアップ側にセパレータの文字を持たせない（スクリーンリーダーの
 * 読み上げに余計な記号を混ぜないため）。
 */
.breadcrumb {
  margin-bottom: clamp(1.5rem, 4vw, 2.5rem);
  font-size: 0.875rem;
  color: var(--text-muted);
}

.breadcrumb ol {
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.35rem;
}

.breadcrumb li {
  display: flex;
  align-items: center;
  gap: 0.35rem;
}

.breadcrumb li + li::before {
  content: "/";
  color: var(--border);
}

.breadcrumb a {
  color: var(--text-muted);
  text-decoration: none;
}

.breadcrumb a:hover,
.breadcrumb a:focus-visible {
  color: var(--accent);
}

.breadcrumb li[aria-current="page"] {
  color: var(--text);
}

/* ---------- 記事一覧（/blog/） ---------- */
.blog-index {
  padding-block: clamp(2.5rem, 6vw, 4.5rem);
}

.post-list {
  list-style: none;
  display: grid;
  gap: 1.25rem;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
}

/*
 * カード全体をクリック可能にしたいが、<h2> の中の <a> を
 * カードの外側にもう一枚 <a> で包むと（入れ子リンク）マークアップとして
 * 不正になる。そこで h2 内の <a> だけを本物のリンクにし、
 * ::after を position:absolute; inset:0 でカード全面に伸ばして
 * クリック領域だけを拡張する（見出し以外の文章はリンクの一部に
 * 「見えない」だけで、実際はクリックできる）。
 */
.post-card {
  position: relative;
  /* グリッドの直接の子は <li> なので、その中の .post-card は既定では
     中身の高さしか持たない＝タイトルの行数が違うとカードの下端が揃わない。
     height:100% で <li>（stretch 済み）の高さまで伸ばして下端を揃える。 */
  height: 100%;
  background-color: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  padding: clamp(1.25rem, 3vw, 1.75rem);
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  transition: border-color 0.15s ease;
}

.post-card:has(h3 a:hover),
.post-card:has(h3 a:focus-visible) {
  border-color: var(--accent);
}

.post-card__meta {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  font-size: 0.8125rem;
  color: var(--text-muted);
}

.post-card__category {
  display: inline-flex;
  align-items: center;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 0.15rem 0.6rem;
  font-weight: 600;
  color: var(--accent);
}

/* 一覧の見出し階層は h1「ブログ」→ h2「章の見出し」→ h3「記事タイトル」。
   章立てを入れたとき、記事タイトルを h2 のままにすると章見出しと同列になり、
   読む順番が構造として伝わらなくなるため h3 に下げてある
   （グローバルの h3 には font-size の指定が無いので、ここで明示する）。 */
.post-card h3 {
  font-size: 1.1875rem;
  line-height: 1.5;
}

.post-card h3 a {
  color: var(--text);
  text-decoration: none;
}

.post-card h3 a::after {
  content: "";
  position: absolute;
  inset: 0;
}

/* 通し番号。カードは多段グリッドで折り返すので、
   「上から順に読む」ことは並び順だけでは伝わらない＝番号で明示する。 */
.post-card__seq {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  min-width: 1.5rem;
  height: 1.5rem;
  padding-inline: 0.35rem;
  border-radius: 999px;
  background-color: var(--accent);
  color: var(--bg);
  font-size: 0.75rem;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
}

/* ---------- 一覧の章立て ---------- */

.blog-index__group + .blog-index__group {
  margin-top: clamp(2.5rem, 6vw, 4rem);
}

/* 章の見出し。グローバル h2（clamp で最大 2.25rem）のままだと
   記事カードより目立ちすぎるので、ひとまわり小さくする。 */
.blog-index__group-heading {
  margin: 0 0 1.25rem;
  padding-bottom: 0.6rem;
  border-bottom: 1px solid var(--border);
  font-size: clamp(1.125rem, 2.8vw, 1.375rem);
  line-height: 1.5;
  text-align: left;
}

.blog-index__group-note {
  display: block;
  margin-top: 0.35rem;
  font-size: 0.875rem;
  font-weight: 400;
  color: var(--text-muted);
}

.post-card > p {
  color: var(--text-muted);
  font-size: 0.9375rem;
}

/* ---------- 記事全体のラッパ ---------- */
.post {
  padding-block: clamp(2.5rem, 6vw, 4rem);
}

.post__header {
  max-width: 40rem;
  margin-inline: auto;
  margin-bottom: clamp(2rem, 5vw, 3rem);
}

.post__meta {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  font-size: 0.875rem;
  color: var(--text-muted);
  margin-bottom: 0.9rem;
}

.post__category {
  display: inline-flex;
  align-items: center;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 0.2rem 0.7rem;
  font-weight: 600;
  color: var(--accent);
}

.post__header h1 {
  font-size: clamp(1.625rem, 4.4vw, 2.5rem);
  line-height: 1.4;
}

.post__lead {
  margin-top: 1rem;
  font-size: clamp(1rem, 1.6vw, 1.125rem);
  color: var(--text-muted);
}

/* ---------- 目次 ---------- */
.post__toc {
  max-width: 40rem;
  margin-inline: auto;
  margin-bottom: clamp(2rem, 5vw, 3rem);
  background-color: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  padding: clamp(1.25rem, 3vw, 1.75rem);
}

/* 目次の見出し（記事側は <h2 id="toc-heading">目次</h2> を使う）。
   styles.css のグローバル h2（中央寄せ・balance の装飾見出し）を打ち消し、
   ボックス内の小見出しとして扱う。 */
.post__toc h2 {
  margin: 0 0 0.75rem;
  border: none;
  padding: 0;
  text-align: left;
  font-size: 1rem;
  font-weight: 700;
  line-height: 1.4;
}

.post__toc ol {
  list-style: decimal;
  padding-left: 1.25rem;
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
}

/* 目次の入れ子（H3 相当）は控えめなインデントに留め、番号の書式は
   下位も decimal のまま揃える（アルファベット等に変えると視覚ノイズが増える）。 */
.post__toc ol ol {
  margin-top: 0.4rem;
  padding-left: 1.5rem;
  color: var(--text-muted);
  font-size: 0.9375rem;
}

.post__toc a {
  color: var(--text);
  text-decoration: none;
}

.post__toc a:hover,
.post__toc a:focus-visible {
  color: var(--accent);
  text-decoration: underline;
}

/* ---------- 本文 ---------- */
/*
 * 日本語の長文を読ませるための本体。40rem は1行あたりおよそ35〜40文字
 * （日本語フォントの実測基準）に収まり、視線の水平移動が疲れにくい幅。
 * line-height は本文用に 1.9 まで上げる（styles.css の全体行間 1.75 より
 * さらに余裕を持たせ、漢字が続く文章でも行を追いやすくする）。
 */
.post__body {
  max-width: 40rem;
  margin-inline: auto;
  line-height: 1.9;
  font-size: 1.0625rem;
  overflow-wrap: anywhere;
}

/*
 * 目次（.post__toc）から見出しへ飛んだときに、見出しが sticky なサイトヘッダーの
 * 下に潜り込まないようにする。
 *
 * .site-header は position:sticky（styles.css）なので、ブラウザは見出しを
 * ビューポート最上端に合わせようとし、結果としてヘッダーの高さぶんだけ
 * 隠れてしまう。**リンクは機能しているのに目的の見出しが見えない**という、
 * 気づきにくい壊れ方をする（自動テストでも横スクロールや console エラーには
 * 出ないので、スクリーンショットを見るまで分からなかった）。
 *
 * scroll-margin-top で「飛び先の上に確保しておく余白」を指定して回避する。
 * 値はヘッダーの実測高さ（約62px）に少し余裕を足したもの。
 */
.post__body h2,
.post__body h3 {
  scroll-margin-top: 5rem;
}

.post__body > * + * {
  margin-top: 1.5em;
}

.post__body p {
  color: var(--text);
}

/*
 * 技術記事で使うインラインコード（`wrangler deploy`、`/api/*` など）。
 * 等幅フォントはシステムのものだけを使う（Web フォントは読み込まない方針）。
 * 日本語本文の中に混ざるため、font-size は少し落として行の高さが跳ねるのを防ぐ。
 * 長いパスやコマンドで横スクロールが出ないよう、折り返しを許可しておく。
 */
.post__body code {
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
  font-size: 0.9em;
  background-color: var(--surface-raised);
  border: 1px solid var(--border);
  border-radius: 4px;
  padding: 0.1em 0.35em;
  overflow-wrap: anywhere;
}

/*
 * h2 は「セクションの切れ目」を明示する要素なので、上の余白を大きく取り、
 * かつ左ボーダーで視覚的な区切りを作る（styles.css 側の見出しは中央寄せ・
 * balance の装飾見出しだが、本文中の見出しは左寄せの実用見出しにする）。
 */
.post__body h2 {
  margin-top: 3.5rem;
  padding-left: 0.9rem;
  border-left: 4px solid var(--accent);
  font-size: clamp(1.25rem, 3vw, 1.625rem);
  line-height: 1.5;
  text-align: left;
  text-wrap: pretty;
}

/* 本文最初の見出しは、リード文からすぐ続くので上の余白を詰める。 */
.post__body > h2:first-child {
  margin-top: 0;
}

.post__body h3 {
  margin-top: 2.25rem;
  font-size: clamp(1.0625rem, 2.4vw, 1.25rem);
  line-height: 1.5;
  text-align: left;
  text-wrap: pretty;
}

/*
 * :not(.button) が必須。本文中の CTA（.post__cta）にはボタン（.button--primary 等）を
 * 置くことがあり、除外しないとここの `color: var(--accent)` が
 * `.button--primary { color: var(--bg) }` より詳細度で勝ってしまい、
 * 「テキストの色が背景色と同じ」で文字が見えなくなる（実測で発生した）。
 */
.post__body a:not(.button) {
  color: var(--accent);
  text-decoration: underline;
  text-underline-offset: 0.2em;
}

.post__body a:not(.button):hover,
.post__body a:not(.button):focus-visible {
  color: var(--accent-strong);
}

.post__body ul,
.post__body ol {
  /* styles.css の全体リセットで ul/ol は padding:0 になっているため、
     ここで明示的に戻さないとマーカー（・や数字）が本文の左端で切れる。 */
  padding-left: 1.5rem;
  display: flex;
  flex-direction: column;
  gap: 0.5em;
}

.post__body ul {
  list-style: disc;
}

.post__body ol {
  list-style: decimal;
}

.post__body li {
  color: var(--text);
}

.post__body strong {
  color: var(--text);
  font-weight: 700;
}

.post__body blockquote {
  margin: 0;
  padding: 0.25rem 1.25rem;
  border-left: 3px solid var(--border);
  color: var(--text-muted);
  font-size: 0.9375rem;
}

/* ---------- 補足ボックス（callout） ---------- */
.callout {
  border-left: 4px solid var(--accent);
  background-color: var(--surface-raised);
  border-radius: var(--radius-sm);
  padding: 1rem 1.25rem;
  font-size: 0.9375rem;
}

.callout strong {
  display: block;
  margin-bottom: 0.4rem;
  color: var(--text);
}

.callout--warn {
  border-left-color: var(--stamp);
}

/* ---------- 本文中の導線ボックス ---------- */
.post__cta {
  background-color: var(--surface-raised);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  padding: clamp(1.25rem, 3.5vw, 1.75rem);
  text-align: center;
}

.post__cta p {
  color: var(--text-muted);
  margin-bottom: 1rem;
}

/*
 * styles.css の .button は white-space: nowrap（ラベルの折り返し崩れを防ぐため）。
 * だが記事本文の CTA は「RingiQuest を無料ではじめる」のように長いラベルを
 * 使うことがあり、nowrap のままだと 360px 幅でボタンがコンテナ幅を超えて
 * 横スクロールを生む（実測）。ここでは記事内 CTA に限定して折り返しを許可する。
 */
.post__cta .button {
  white-space: normal;
}

/* ---------- 記事冒頭の但し書き（.post__note） ----------
 *
 * 「この記事は実体験ではなく設計側の説明である」のように、記事の立場を
 * 先に断るための枠。/about/「記事を書くうえで守っていること」で
 * **「実際に試したことだけを書く」**と公表しているので、そうでない記事は
 * 黙って混ぜずにここで明示する（2026-08-19・siblings が最初の適用先）。
 */
.post__note {
  margin-bottom: clamp(1.75rem, 4vw, 2.5rem);
  padding: clamp(1rem, 3vw, 1.25rem);
  background-color: var(--surface-raised);
  border-left: 3px solid var(--border);
  border-radius: var(--radius-sm);
  color: var(--text-muted);
  font-size: 0.9375rem;
}

/* ---------- 記事フッター ---------- */
.post__footer {
  max-width: 40rem;
  margin-inline: auto;
  margin-top: clamp(3rem, 7vw, 4.5rem);
  padding-top: clamp(2rem, 5vw, 3rem);
  border-top: 1px solid var(--border);
}

.post__author {
  color: var(--text-muted);
  font-size: 0.9375rem;
}

/* ---------- 記事の著者表示（byline） ----------
 *
 * 以前はここに「RingiQuest は……管理アプリです」という製品説明を置いていたが、
 * 記事の署名欄に製品紹介を入れると、署名ではなく広告枠になる。
 * 誰が書いたのか・どういう立場で書いているのかを示し、/about/ へ繋ぐ。
 * 文面の事実は lp/public/about/index.html「作っている人について」が正。
 * 片方だけ直すと食い違うので、変えるときは両方直すこと。
 */
.post__byline {
  display: flex;
  flex-direction: column;
  gap: 0.375rem;
  padding: clamp(1rem, 3vw, 1.25rem);
  background-color: var(--surface-raised);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
}

.post__byline-name {
  font-size: 0.9375rem;
  font-weight: 600;
}

.post__byline-name a {
  color: var(--text);
  text-decoration: underline;
  text-underline-offset: 0.2em;
}

.post__byline-name a:hover,
.post__byline-name a:focus-visible {
  color: var(--accent);
}

.post__byline-bio {
  color: var(--text-muted);
  font-size: 0.875rem;
  line-height: 1.8;
}

/* ---------- 次に読む（連番の導線） ----------
 *
 * 検索から来た読者は一覧を経由しないので、記事の末尾に「次の1本」を
 * 置かないと連番の並びが機能しない（一覧を直したことに気づかれない）。
 * 「あわせて読みたい」が話題の近さで選ぶ横方向の導線なのに対し、
 * こちらは決まった順路を進む縦方向の導線＝役割が違うので併存させている。
 * 順番は lp/public/blog/index.html の並びが正。両方を直すこと。
 */
.post__next {
  margin-top: clamp(1.5rem, 4vw, 2.5rem);
}

.post__next h2 {
  margin: 0 0 0.75rem;
  border: none;
  padding: 0;
  text-align: left;
  font-size: 1rem;
  font-weight: 700;
  line-height: 1.4;
}

.post__next-card {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  background-color: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  padding: 1rem clamp(1rem, 3vw, 1.25rem);
  color: var(--text);
  text-decoration: none;
  transition: border-color 0.15s ease;
}

.post__next-card:hover,
.post__next-card:focus-visible {
  border-color: var(--accent);
}

.post__next-label {
  flex: none;
  color: var(--text-muted);
  font-size: 0.8125rem;
  font-variant-numeric: tabular-nums;
}

.post__next-title {
  font-weight: 600;
  line-height: 1.5;
}

.post__related {
  margin-top: clamp(1.5rem, 4vw, 2.5rem);
}

/* 「あわせて読みたい」の見出し（記事側は <h2 id="related-heading">…</h2> を使う）。
   post__toc h2 と同じ理由で、グローバル h2 の装飾を打ち消す。 */
.post__related h2 {
  margin: 0 0 0.75rem;
  border: none;
  padding: 0;
  text-align: left;
  font-size: 1rem;
  font-weight: 700;
  line-height: 1.4;
}

.post__related ul {
  list-style: none;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}

.post__related a {
  color: var(--accent);
  text-decoration: underline;
  text-underline-offset: 0.2em;
}

.post__related a:hover,
.post__related a:focus-visible {
  color: var(--accent-strong);
}

/* ---------- レスポンシブ ---------- */
/* 360px 幅でも .post__toc の内側パディングとカードのグリッドが崩れないよう、
   auto-fit のミニマム幅は post-list 側で 260px に抑えてある（styles.css の
   .card-grid と同じ値）。ここでは横スクロールを生む要因になりやすい
   要素（コードや長い URL）に対する保険として overflow-wrap を .post__body に
   一括で当てているため、追加のブレークポイントは不要。 */
@media (max-width: 560px) {
  .post__meta,
  .post-card__meta {
    flex-wrap: wrap;
  }
}
