@layer reset, tokens, base, content, components;

@layer reset {
  *,
  ::before,
  ::after,
  ::backdrop {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
    /* 幅 0 の solid。border-width を指定するだけで線が引けるようにするため */
    border: 0 solid;
  }

  html {
    -webkit-text-size-adjust: 100%;
    tab-size: 4;
    -webkit-tap-highlight-color: transparent;
  }

  h1,
  h2,
  h3,
  h4,
  h5,
  h6 {
    font-size: inherit;
    font-weight: inherit;
  }

  a {
    color: inherit;
    text-decoration: inherit;
  }

  b,
  strong {
    font-weight: bolder;
  }

  code,
  kbd,
  samp,
  pre {
    font-family:
      ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New",
      monospace;
    font-size: 1em;
  }

  small {
    font-size: 80%;
  }

  /* 脚注参照が sup を使う */
  sub,
  sup {
    position: relative;
    font-size: 75%;
    line-height: 0;
    vertical-align: baseline;
  }
  sub {
    bottom: -0.25em;
  }
  sup {
    top: -0.5em;
  }

  hr {
    height: 0;
    color: inherit;
    border-top-width: 1px;
  }

  abbr:where([title]) {
    text-decoration: underline dotted;
  }

  table {
    border-color: inherit;
    border-collapse: collapse;
    text-indent: 0;
  }

  /* 記事本文のリストだけ content レイヤーでマーカーを復活させる */
  ol,
  ul,
  menu {
    list-style: none;
  }

  img,
  svg,
  video,
  canvas,
  audio,
  iframe,
  embed,
  object {
    display: block;
  }
  img,
  video {
    max-width: 100%;
    height: auto;
  }

  /*
   * AVIF のフォールバック用に img を picture で包むが、レイアウトは包む前と同じにしたい。
   * display: contents なら箱を作らないので、img の包含ブロックは picture の親のままになる。
   */
  picture {
    display: contents;
  }

  /* 目次トグル・共有ボタン用 */
  button {
    appearance: button;
    font: inherit;
    color: inherit;
    background-color: transparent;
    border-radius: 0;
  }

  summary {
    display: list-item;
  }

  /* Preflight は !important を付けているが、display を宣言する規則は
     いずれも同レイヤー内でこれより詳細度が低いため不要 */
  [hidden]:where(:not([hidden="until-found"])) {
    display: none;
  }
}

@layer tokens {
  :root {
    color-scheme: light dark;

    /* 配色 ------------------------------------------------------------- */
    --fg: light-dark(#000000, #ffffff);
    --bg: light-dark(#ffffff, #000000);
    --bg-artwork: light-dark(#dddddd, #222222);
    --bg-thead: light-dark(#dddddd, #222222);
    --border: #aaaaaa;
    --link: light-dark(#d50000, #88c0dd);
    --quote: light-dark(#666666, #9c9c9c);
    --linkcard: light-dark(#aaaaaa, #666666);
    --menu: light-dark(#666666, #9c9c9c);
    --code-fg: light-dark(#222222, #dddddd);
    --code-bg: light-dark(#eeeeee, #222222);

    /* グレーランプ（ホバー時の背景などに使う） --------------------------- */
    --gray-50: oklch(0.985 0 0);
    --gray-100: oklch(0.967 0 0);
    --gray-200: oklch(0.928 0 0);
    --gray-300: oklch(0.872 0 0);
    --gray-400: oklch(0.707 0 0);
    --gray-500: oklch(0.551 0 0);
    --gray-600: oklch(0.446 0 0);
    --gray-700: oklch(0.373 0 0);
    --gray-800: oklch(0.269 0 0);
    --gray-900: oklch(0.205 0 0);
    --gray-950: oklch(0.143 0 0);

    /* 寸法 --------------------------------------------------------------- */
    --content-width: 700px;

    /*
      ブレークポイント: xs 480px / sm 600px / md 700px
      カスタムプロパティは @media の条件部では使えないため、
      メディアクエリ側は直値で書く。値を変える際はここのコメントも更新すること。
    */
  }
}

@layer base {
  html {
    font-size: 16px;
    font-family:
      -apple-system, "Helvetica Neue", BlinkMacSystemFont, Arial,
      "Hiragino Kaku Gothic", Roboto, "Noto Sans CJK JP", "Segoe UI",
      sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol",
      "Noto Color Emoji";
  }

  body {
    max-inline-size: var(--content-width);
    margin-inline: auto;
    color: var(--fg);
    background: var(--bg);
    line-height: 1.7;

    @media (min-width: 700px) {
      border-inline: 1px solid var(--border);
    }
  }

  /* 見出し ------------------------------------------------------------- */

  h1,
  h2,
  h3,
  h4,
  h5,
  h6 {
    font-weight: 700;
  }

  h1 {
    margin-block: 0.5rem;
    padding-block: 0.5rem;
    padding-inline: 1rem;
    font-size: 1.875rem;
    line-height: 2.25rem;
    text-align: center;
  }

  h2 {
    margin-block: 4rem 2rem;
    padding-block: 0.5rem;
    font-size: 1.6rem;
    line-height: 2rem;
  }

  h3 {
    margin-block: 2rem;
    font-size: 1.3rem;
    line-height: 1.75rem;
  }

  h4 {
    margin-block: 1.5rem;
    font-size: 1.125rem;
    line-height: 1.75rem;
  }

  h5,
  h6 {
    font-size: 1rem;
    line-height: 1.5rem;
  }

  /* 記事内の見出し装飾 --------------------------------------------------- */

  article h2 {
    position: relative;
    padding-block: 0.75rem;
    border-block-end: 3px solid var(--border);

    /* 下線の左 25% だけをアクセント色にする */
    &::before {
      content: "";
      position: absolute;
      inset-block-end: -3px;
      inset-inline-start: 0;
      inline-size: 25%;
      border-block-end: 3px solid var(--link);
    }

    &:first-of-type {
      margin-block-start: 0;

      @media (min-width: 700px) {
        margin-block-start: 3rem;
      }
    }
  }

  article h3 {
    margin-block: 2.25rem 1.5rem;
    padding-block: 0.5rem;
    border-block-end: 1px solid var(--border);
  }

  /* 見出しは rehype-autolink-headings により a で包まれるため、
     リンク色ではなく本文色を維持する */
  article :is(h2, h3, h4, h5, h6) a {
    color: var(--fg);
  }

  /* リンク ------------------------------------------------------------- */

  article a {
    color: var(--link);
    word-break: break-all;

    @media (hover: hover) {
      &:hover {
        text-decoration-line: underline;
      }
    }
  }

  /* 表 ----------------------------------------------------------------- */

  table {
    inline-size: 100%;
    margin-block: 1.5rem;
  }

  table,
  thead,
  th,
  tbody,
  tr,
  td {
    padding-block: 0.25rem;
    padding-inline: 0.5rem;
    border: 1px solid var(--border);
  }

  thead {
    background-color: var(--bg-thead);
  }

  /* コード ------------------------------------------------------------- */

  pre {
    max-block-size: 540px;
    margin-block-end: 1.5rem;
    padding-block: 1rem;
    padding-inline: 2rem;
    overflow: auto;
    border-radius: 0.5rem;
  }

  /* 段落・リスト中のインラインコード */
  :is(p, li) code {
    padding: 2px 6px;
    font-size: 0.875rem;
    line-height: 1.25rem;
    color: var(--code-fg);
    background-color: var(--code-bg);
    border-radius: 4px;
  }

  code span {
    margin-block: 2px;
    font-size: 0.875rem;
    line-height: 1.25rem;
  }

  /* 引用 --------------------------------------------------------------- */

  blockquote {
    margin: 1.5rem;
    padding-inline: 1rem;
    color: var(--quote);
    border-inline-start: 4px solid var(--quote);
  }

  iframe {
    inline-size: 100%;
  }
}

@layer content {
  main article {
    margin-block: 2rem;
    margin-inline: 1rem;

    @media (min-width: 700px) {
      margin: 3rem;
    }

    :is(p, figure) {
      margin-block: 1.5rem;
    }

    :is(ul, ol) {
      margin-block: 1.5rem;
      padding-inline-start: 1.5rem;
    }

    ul li {
      list-style-type: disc;
    }

    ol li {
      list-style-type: decimal;
    }

    /* 入れ子のリストと、リスト項目内の段落は余白を持たせない */
    li :is(ul, ol, p) {
      margin-block: 0;
    }
  }
}

@layer components {
  .content-image {
    inline-size: 100%;
    block-size: auto;
    max-block-size: 540px;
    background-color: var(--bg-artwork);
    object-fit: contain;
  }

  article .content-image {
    margin-block: 1rem;
    border-block-start: 1px solid var(--border);
    border-block-end: 1px solid var(--border);
  }

  .caption {
    color: var(--gray-500);
    text-align: center;
  }

  /* リンクカード -------------------------------------------------------- */

  .link-card {
    display: flex;
    margin-block: 1.5rem;
    block-size: 6.375rem;
    overflow: hidden;
    border: 1px solid var(--border);
    border-radius: 0.5rem;
    transition: background-color 0.15s;

    @media (hover: hover) {
      &:hover {
        /* 移植元の hover:bg-gray-400/30 に相当 */
        background-color: color-mix(in oklch, var(--gray-400) 30%, transparent);
        text-decoration-line: none;
      }
    }
  }

  .link-card-body {
    display: flex;
    flex-direction: column;
    /* 画像の分を残して詰める。min-inline-size が無いと長い題で画像が押し出される */
    flex: 1;
    min-inline-size: 0;
    padding: 1rem;
  }

  /* 3 行とも 1 行に収め、溢れたら省略記号にする */
  .link-card-title,
  .link-card-description,
  .link-card-url {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }

  .link-card-title {
    color: var(--fg);
    font-weight: 700;

    @media (min-width: 480px) {
      font-size: 1.125rem;
    }
  }

  .link-card-description {
    color: var(--quote);
    font-size: 0.875rem;
  }

  .link-card-url {
    margin-block-start: auto;
    color: var(--link);
    font-size: 0.875rem;
  }

  .link-card-image {
    block-size: 100%;
    margin: 0;
    inline-size: auto;
    max-inline-size: 7.5rem;
    object-fit: cover;

    @media (min-width: 480px) {
      max-inline-size: 15rem;
    }
  }

  .tag {
    display: inline-block;
    margin-inline-end: 0.25rem;
    color: var(--link);

    @media (hover: hover) {
      &:hover {
        text-decoration-line: underline;
      }
    }
  }

  .emoji {
    block-size: 120px;
    font-size: 100px;
    line-height: 1.2;
  }

  .top-article {
    padding-top: 24px;
    border-block-end: 1px solid var(--border);
    text-align: center;

    .emoji {
      margin-block-end: 1rem;
    }

    h1 {
      margin-block: 2rem 0.5rem;
      padding-inline: 1rem;
      font-size: 1.5rem;
      color: var(--fg);
      border-inline-start: none;

      @media (min-width: 480px) {
        font-size: 1.875rem;
      }
    }

    p:last-child {
      margin-block-end: 2rem;
    }

    @media (min-width: 480px) {
      .tag,
      p:last-child {
        font-size: 1.25rem;
      }
    }
  }

  .top-article-tags {
    display: inline-block;
    margin-block-end: 1rem;
  }

  .expressive-code {
    margin-block: 1.5rem;
  }

  /* ヘッダ ------------------------------------------------------------- */

  .site-header {
    border-block-end: 1px solid var(--border);
  }

  .site-title {
    margin: 0;
    padding: 1rem;
    font-size: 1.25rem;
    color: var(--fg);
    /* 見出しの既定に付く縦線と余白はここでは不要 */
    border-inline-start: none;
  }

  .site-nav {
    display: flex;
    inline-size: 66%;
    margin: 0;
    padding: 0;

    li {
      list-style-type: none;
      transition: background-color 150ms;

      @media (hover: hover) {
        &:hover {
          background-color: color-mix(in srgb, var(--gray-400) 30%, transparent);
        }
      }
    }

    a {
      position: relative;
      display: block;
      padding-block: 0.75rem;
      padding-inline: 1rem;
      font-size: 1.125rem;
      text-align: center;
      color: var(--menu);
      text-decoration-line: none;
    }

    /* 現在地。下線は擬似要素で描くため、余分な要素を持たない */
    a[aria-current="page"] {
      font-weight: 700;
      color: var(--fg);

      &::after {
        content: "";
        position: absolute;
        inset-inline: 0;
        inset-block-end: 0;
        block-size: 0.25rem;
        border-radius: 9999px;
        background-color: var(--link);
      }
    }
  }

  /* フッタ ------------------------------------------------------------- */

  .site-footer {
    border-block-start: 1px solid var(--border);
  }

  .site-footer-meta {
    display: flex;
    align-items: center;
    block-size: 5rem;
    padding-inline: 1rem;
    border-block-start: 1px solid var(--border);
  }

  .sns-list {
    display: flex;
    /* 著作権表示と反対の端へ寄せる */
    margin-inline-start: auto;

    a {
      display: block;
      inline-size: 1.5rem;
      block-size: 1.5rem;
      margin-inline-start: 0.75rem;
      /* simple-icons の SVG は色を持たないため、ここで塗る */
      fill: var(--fg);
    }

    svg {
      inline-size: 100%;
      block-size: 100%;
    }
  }

  /* 目次 --------------------------------------------------------------- */

  .toc {
    margin-block: 3rem;
    margin-inline: 1rem;
    padding-block: 0.5rem;
    padding-inline: 1.5rem;
    background-color: var(--code-bg);
    border: 1px solid var(--border);
    border-radius: 0.375rem;

    @media (min-width: 700px) {
      margin-inline: 3rem;
    }

    summary {
      display: flex;
      align-items: center;
      justify-content: space-between;
      cursor: pointer;
      list-style: none;

      /* 既定の三角を消し、開閉に合わせて回る印を自前で描く */
      &::-webkit-details-marker {
        display: none;
      }

      &::after {
        content: "▼";
        font-size: 0.875rem;
        color: var(--menu);
        transition: transform 200ms ease-in-out;
        transform: rotate(-90deg);
      }
    }

    &[open] summary::after {
      transform: rotate(0deg);
    }

    summary h2 {
      margin: 0;
      padding: 0;
      font-size: 1.125rem;
      color: var(--fg);
      border-inline-start: none;
    }

    ol {
      margin-block: 0.5rem 0;
      padding: 0;
    }

    a {
      display: block;
      color: var(--menu);
      text-decoration-line: none;

      @media (hover: hover) {
        &:hover {
          color: var(--fg);
          text-decoration-line: underline;
        }
      }
    }
  }

  .toc-item {
    margin-block: 0.25rem;
    list-style-type: none;

    &[data-depth="2"] {
      padding-inline-start: 2rem;
    }

    &[data-depth="3"] {
      padding-inline-start: 4rem;
    }
  }

  /* 前後の記事 --------------------------------------------------------- */

  /* ページ先頭 ---------------------------------------------------------- */

  .top {
    padding-block: 2rem;
    text-align: center;
    border-block-end: 1px solid var(--border);

    h1 {
      margin-inline: auto;
      padding-inline: 1rem;
      color: var(--fg);
      border-inline-start: none;
    }

    p {
      padding-inline: 1rem;
      font-size: 1.25rem;
    }
  }

  .top-icon {
    display: block;
    inline-size: 10rem;
    block-size: 10rem;
    margin-inline: auto;
    border-radius: 9999px;
  }

  /* 記事一覧 ------------------------------------------------------------ */

  .article-cards {
    margin: 1.5rem;
  }

  .article-card {
    display: block;
    margin-block: 1.5rem;
    padding-block: 1rem;
    padding-inline: 2rem;
    border: 1px solid var(--border);
    border-radius: 5px;

    /* 絵文字を左に回すのは横幅が取れるときだけ */
    @media (min-width: 600px) {
      display: flex;
    }

    h2 {
      margin: 0 0 1rem;
      padding: 0 0 0.5rem;
      font-size: 1.125rem;
      color: var(--fg);
      border-inline-start: none;
      border-block-end: 2px solid var(--border);

      @media (min-width: 480px) {
        font-size: 1.25rem;
      }

      @media (hover: hover) {
        a:hover {
          text-decoration-line: underline;
        }
      }
    }

    p {
      margin: 0;
    }
  }

  .article-card-meta {
    width: 100%;
    margin: auto 0;
  }

  .article-card-emoji {
    margin-block: 2.5rem;
    font-size: 80px;
    text-align: center;

    @media (min-width: 600px) {
      margin-block: auto;
      padding-inline-end: 2rem;
      font-size: 100px;
    }
  }

  .article-card-tags {
    display: inline-block;
  }

  /* ページ送り ---------------------------------------------------------- */

  .page-bar {
    display: flex;
    block-size: 6rem;
    border-block-start: 1px solid var(--border);

    ul {
      display: flex;
      align-items: center;
      margin-inline: auto;
      padding: 0;
    }

    li {
      display: flex;
      margin-inline: 0.5rem;
      list-style-type: none;
    }
  }

  .page-bar-count {
    font-size: 1.5rem;
  }

  /* 端に達したら押せないことを色で示す */
  .page-bar-disabled {
    color: var(--bg-artwork);
  }

  /* 作品一覧 ------------------------------------------------------------ */

  .gallery {
    display: grid;
    grid-template-columns: repeat(3, 1fr);

    img {
      display: block;
      inline-size: 100%;
      aspect-ratio: 1;
      object-fit: cover;
      background-color: var(--bg-artwork);
    }
  }

  /* 作品詳細の下に置く横スクロールの帯 */
  .gallery-row {
    overflow-x: auto;
    /*
      スクロールバーはこの要素の内側の下端に置かれる。余白を中の項目ではなく
      ここに持たせることで、画像がバーの 0.5rem 上で収まる。
      重ねて描かれる種類のバー（macOS など）でも、その分だけ画像を避けられる
    */
    padding-block-end: 0.5rem;
    border-block-start: 1px solid var(--border);

    img {
      display: block;
      inline-size: 100%;
      aspect-ratio: 1;
      object-fit: cover;
      border-radius: 0.375rem;
      background-color: var(--bg-artwork);
    }

    a[aria-current="page"] img {
      outline: 2px solid var(--link);
    }

    @media (hover: hover) {
      a:not([aria-current="page"]):hover img {
        opacity: 0.4;
      }
    }
  }

  .gallery-row-track {
    display: flex;

    > a {
      flex: 0 0 27%;
      /* 下側の余白は .gallery-row が持つ（スクロールバーとの間隔になる） */
      padding-block: 0.5rem 0;
      padding-inline: 0.25rem;
    }
  }

  /* 作品詳細 ------------------------------------------------------------ */

  .artwork-detail {
    padding-block: 1rem 2rem;
    text-align: center;
    border-block-start: 4px solid var(--link);

    h1 {
      margin-inline: auto;
      padding-inline: 1rem;
      color: var(--fg);
      border-inline-start: none;

      @media (min-width: 480px) {
        font-size: 2.25rem;
      }
    }

    p {
      margin-inline: auto;
      padding-inline: 1rem;
      font-size: 1.25rem;
    }
  }

  .artwork-detail-tags {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    margin-block-end: 1rem;
    font-size: 1.25rem;
  }

  /* 戻る・共有 ---------------------------------------------------------- */

  .back {
    display: flex;
    align-items: center;
    block-size: 4rem;
    border-block-start: 1px solid var(--border);
  }

  .back-link {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    align-self: stretch;
    padding-inline: 1rem;
    transition: background-color 150ms;

    @media (hover: hover) {
      &:hover {
        background-color: color-mix(in srgb, var(--gray-400) 30%, transparent);
      }
    }
  }

  .share-button {
    display: block;
    inline-size: 2.5rem;
    block-size: 2.5rem;
    margin-inline: auto 1rem;
    padding: 0.5rem;
    background-color: #000000;
    border: 1px solid var(--border);
    border-radius: 0.375rem;
    fill: #ffffff;
    transition:
      background-color 150ms,
      fill 150ms;

    @media (hover: hover) {
      &:hover {
        background-color: #ffffff;
        fill: #000000;
      }
    }

    svg {
      inline-size: 100%;
      block-size: 100%;
    }
  }
}
