﻿@charset "UTF-8";
/* =====================================================================
   nzw.jp Design System — Design Tokens (Single Source of Truth)
   ---------------------------------------------------------------------
   配色・トーンは index.html を正式基準として標準化。
   全ページ共通で読み込み、CSS カスタムプロパティ (--nzw-*) を参照する。
   Tailwind 利用ページでも、非利用ページでも同じ値を使えるよう
   フレームワーク非依存の素の CSS 変数で定義する。

   使い方:
     <link rel="stylesheet" href="https://nzw.jp/static/css/design-system.css">
     color: var(--nzw-text);
     background: var(--nzw-accent);

   スタイルガイド: https://nzw.jp/static/design-system.html
   ===================================================================== */

:root {
  /* -----------------------------------------------------------------
     1. Color — Surface / 背景・面
     ----------------------------------------------------------------- */
  --nzw-bg:            #ffffff;  /* ページ背景 */
  --nzw-card:          #ffffff;  /* カード面 */
  --nzw-surface-1:     #f8fafc;  /* Slate 50  — わずかに沈んだ面 */
  --nzw-surface-2:     #f1f5f9;  /* Slate 100 — セクション区切り背景 */
  --nzw-surface-3:     #e2e8f0;  /* Slate 200 — さらに沈んだ面 */

  /* -----------------------------------------------------------------
     2. Color — Border / 罫線
     ----------------------------------------------------------------- */
  --nzw-border:        #e2e8f0;  /* Slate 200 — 標準の罫線 */
  --nzw-border-strong: #cbd5e1;  /* Slate 300 — 強調罫線 */
  --nzw-border-subtle: #f1f5f9;  /* Slate 100 — ごく薄い罫線 */

  /* -----------------------------------------------------------------
     3. Color — Text / 文字
     ----------------------------------------------------------------- */
  --nzw-text:          #1e293b;  /* Slate 800 — 本文 */
  --nzw-text-strong:   #0f172a;  /* Slate 900 — 見出し・強調 */
  --nzw-sub:           #64748b;  /* Slate 500 — 補助テキスト */
  --nzw-muted:         #94a3b8;  /* Slate 400 — キャプション・無効 */
  --nzw-on-accent:     #ffffff;  /* アクセント面上の文字 */

  /* -----------------------------------------------------------------
     4. Color — Accent (Sky) / アクセント = ブランド主色
     ----------------------------------------------------------------- */
  --nzw-accent:        #0ea5e9;  /* Sky 500 — 主アクセント */
  --nzw-accent-strong: #0284c7;  /* Sky 600 — hover / 押下 */
  --nzw-accent-deep:   #0369a1;  /* Sky 700 — 文字としてのアクセント */
  --nzw-accent-light:  #38bdf8;  /* Sky 400 — 明るいアクセント */
  --nzw-accent-soft:   #e0f2fe;  /* Sky 100 — バッジ・淡い背景 */
  --nzw-accent-bg:     #f0f9ff;  /* Sky 50  — hover 背景・極淡面 */

  /* -----------------------------------------------------------------
     5. Color — Secondary & Semantic / 副次・意味色
     ----------------------------------------------------------------- */
  --nzw-blue:          #2563eb;  /* Blue 600 — 補助リンク・第2系統 */
  --nzw-blue-strong:   #1d4ed8;  /* Blue 700 */

  --nzw-success:       #16a34a;  /* Green 600 */
  --nzw-success-soft:  #dcfce7;  /* Green 100 */
  --nzw-warning:       #f59e0b;  /* Amber 500 */
  --nzw-warning-light: #fbbf24;  /* Amber 400 */
  --nzw-warning-soft:  #fef3c7;  /* Amber 100 */
  --nzw-danger:        #f43f5e;  /* Rose 500 */
  --nzw-danger-soft:   #ffe4e6;  /* Rose 100 */

  /* -----------------------------------------------------------------
     6. Color — Brand accents / プロダクト別アクセント枠線
       (index.html の project-card 系で使用)
     ----------------------------------------------------------------- */
  --nzw-brand-indigo:  #6366f1;
  --nzw-brand-violet:  #8b5cf6;
  --nzw-brand-emerald: #10b981;
  --nzw-brand-amber:   #f59e0b;
  --nzw-brand-line:    #06c755;  /* LINE */

  /* -----------------------------------------------------------------
     7. Gradient / グラデーション
     ----------------------------------------------------------------- */
  /* hsl(h, 42%, 89.5%)。白へ寄せすぎると隣り合う色相の差が消えて
     ただの灰色の線になるため、彩度ではなく明度でやわらかさを出している。 */
  --nzw-rainbow: linear-gradient(
      90deg,
      #efd9d9, #efe5d9, #efeed9, #d9efd9,
      #d9e6ef, #e4d9ef, #ebd9ef, #efd9d9);
  /* 同じ 7 色の円錐版。面で使うときはこちら。 */
  --nzw-rainbow-conic: conic-gradient(
      from 0deg,
      #efd9d9, #efe5d9, #efeed9, #d9efd9,
      #d9e6ef, #e4d9ef, #ebd9ef, #efd9d9);
  /* アイコンリング（.nzw-icon-ring）専用の虹。上の 2 つより彩度を残している。
     リングの見え幅は外径 - アイコン径 = 2〜4px しかなく、線用の明度で
     やわらげた色をそのまま流すと、ただのクリーム色の輪になって
     回転しているのかどうか分からなくなるため。 */
  --nzw-rainbow-conic-icon: conic-gradient(
      from 0deg,
      #ffb3b3, #ffd9b3, #ffffb3, #b3ffb3,
      #b3d9ff, #d9b3ff, #e6b3ff, #ffb3b3);
  --nzw-gradient-accent:
      linear-gradient(135deg, var(--nzw-accent-light), var(--nzw-accent-strong));
  --nzw-gradient-surface:
      linear-gradient(180deg, var(--nzw-bg), var(--nzw-surface-2));

  /* -----------------------------------------------------------------
     8. Typography — Font families / 書体
     ----------------------------------------------------------------- */
  --nzw-font-sans:    "Noto Sans JP", "Inter", system-ui, -apple-system, sans-serif;
  --nzw-font-mono:    "JetBrains Mono", ui-monospace, "SFMono-Regular", monospace;
  --nzw-font-display: "Orbitron", var(--nzw-font-sans);   /* ロゴ・数値表現 */
  --nzw-font-game:    "Rajdhani", var(--nzw-font-sans);   /* ゲーム系UI   */

  /* -----------------------------------------------------------------
     9. Typography — Scale / 文字サイズ (1rem = 16px)
     ----------------------------------------------------------------- */
  --nzw-text-xs:   0.75rem;   /* 12px */
  --nzw-text-sm:   0.875rem;  /* 14px */
  --nzw-text-base: 1rem;      /* 16px */
  --nzw-text-lg:   1.125rem;  /* 18px */
  --nzw-text-xl:   1.25rem;   /* 20px */
  --nzw-text-2xl:  1.5rem;    /* 24px */
  --nzw-text-3xl:  1.875rem;  /* 30px */
  --nzw-text-4xl:  2.25rem;   /* 36px */
  --nzw-text-5xl:  3rem;      /* 48px */

  /* Weight & line-height */
  --nzw-weight-normal:   400;
  --nzw-weight-medium:   500;
  --nzw-weight-bold:     700;
  --nzw-weight-black:    900;
  --nzw-leading-tight:   1.25;
  --nzw-leading-normal:  1.6;
  --nzw-leading-relaxed: 1.8;

  /* -----------------------------------------------------------------
     10. Spacing / 余白 (4px グリッド)
     ----------------------------------------------------------------- */
  --nzw-space-1:  0.25rem;  /*  4px */
  --nzw-space-2:  0.5rem;   /*  8px */
  --nzw-space-3:  0.75rem;  /* 12px */
  --nzw-space-4:  1rem;     /* 16px */
  --nzw-space-5:  1.25rem;  /* 20px */
  --nzw-space-6:  1.5rem;   /* 24px */
  --nzw-space-8:  2rem;     /* 32px */
  --nzw-space-10: 2.5rem;   /* 40px */
  --nzw-space-12: 3rem;     /* 48px */
  --nzw-space-16: 4rem;     /* 64px */
  --nzw-space-20: 5rem;     /* 80px */

  /* -----------------------------------------------------------------
     11. Radius / 角丸
     ----------------------------------------------------------------- */
  --nzw-radius-xs:   2px;
  --nzw-radius-sm:   0.375rem;  /*  6px */
  --nzw-radius-md:   0.5rem;    /*  8px */
  --nzw-radius-lg:   0.75rem;   /* 12px (rounded-xl)  */
  --nzw-radius-xl:   1rem;      /* 16px (rounded-2xl) */
  --nzw-radius-full: 9999px;

  /* -----------------------------------------------------------------
     12. Shadow / 影
     ----------------------------------------------------------------- */
  --nzw-shadow-sm:   0 1px 2px 0 rgba(0, 0, 0, 0.05);
  --nzw-shadow-md:   0 4px 6px -1px rgba(0, 0, 0, 0.1),
                     0 2px 4px -2px rgba(0, 0, 0, 0.1);
  --nzw-shadow-lg:   0 10px 15px -3px rgba(0, 0, 0, 0.1),
                     0 4px 6px -4px rgba(0, 0, 0, 0.1);
  --nzw-shadow-xl:   0 20px 25px -5px rgba(0, 0, 0, 0.1),
                     0 8px 10px -6px rgba(0, 0, 0, 0.1);
  /* アクセントの淡いグロー (index.html のカード hover で使用) */
  --nzw-shadow-accent: 0 10px 30px -5px rgba(14, 165, 233, 0.15),
                       inset 0 1px 0 rgba(255, 255, 255, 0.8);
  /* レトロ・オフセット影 (book / レトロUI 系) */
  --nzw-shadow-retro: 3px 3px 0 #d6d0c2;

  /* -----------------------------------------------------------------
     13. Motion / アニメーション
     ----------------------------------------------------------------- */
  --nzw-ease:          cubic-bezier(0.4, 0, 0.2, 1);
  --nzw-ease-out:      cubic-bezier(0, 0, 0.2, 1);
  --nzw-duration-fast: 150ms;
  --nzw-duration:      300ms;
  --nzw-duration-slow: 500ms;
  --nzw-transition:    all var(--nzw-duration) var(--nzw-ease);

  /* -----------------------------------------------------------------
     14. Layout / レイアウト
     ----------------------------------------------------------------- */
  --nzw-container:     1120px;  /* コンテンツ最大幅 */
  --nzw-container-narrow: 768px;

  /* -----------------------------------------------------------------
     15. Z-index / 重なり順
     ----------------------------------------------------------------- */
  --nzw-z-base:    1;
  --nzw-z-header:  100;
  --nzw-z-overlay: 1000;
  --nzw-z-modal:   1100;
  --nzw-z-toast:   1200;
}

/* =====================================================================
   Keyframes — 共通アニメーション
   ===================================================================== */
@keyframes nzw-rainbow-flow {
  0%   { background-position:   0% 50%; }
  50%  { background-position: 100% 50%; }
  100% { background-position:   0% 50%; }
}
@keyframes nzw-float {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-20px); }
}
@keyframes nzw-spin-slow {
  from { transform: rotate(0deg); }
  to   { transform: rotate(360deg); }
}
/* アイコンリング用。回転だけだと 2px の輪は動いて見えないので、
   色相も 1 周させる（集約前の各ページの rainbow-rotate と同じ挙動）。
   filter をキーフレーム側に持たせているのは、プロパティ側の filter が
   アニメーションに上書きされて彩度指定が効かなくなるのを避けるため。 */
@keyframes nzw-icon-ring-spin {
  from {
    transform: rotate(0deg);
    filter: saturate(var(--nzw-icon-ring-sat, 1)) hue-rotate(0deg);
  }
  to {
    transform: rotate(360deg);
    filter: saturate(var(--nzw-icon-ring-sat, 1)) hue-rotate(360deg);
  }
}

/* アクセシビリティ: 動きの抑制を希望するユーザーには共通アニメを停止 */
@media (prefers-reduced-motion: reduce) {
  .nzw-rainbow-line { animation: none; }
  *,
  *::before,
  *::after {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
  }
}

/* =====================================================================
   Optional component layer
   ---------------------------------------------------------------------
   すべて上記トークンのみで構築した、任意採用のベースクラス。
   採用は任意だが、新規ページはこれらを使うと統一が取りやすい。
   ===================================================================== */

/* Rainbow line — ヘッダー下/区切りの虹色ライン。
   天気で彩度と速度を段階的に変えたい場合は、親（body 等）に
   .nzw-weather-* を付けて --nzw-rainbow-sat / --nzw-rainbow-duration を上書きする。 */
.nzw-rainbow-line {
  height: 2px;
  width: 100%;
  background: var(--nzw-rainbow);
  background-size: 400% 400%;
  animation: nzw-rainbow-flow var(--nzw-rainbow-duration, 90s) linear infinite;
  filter: saturate(var(--nzw-rainbow-sat, 1));
  transition: filter 3s var(--nzw-ease);
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.03);
}

/* 雪 → 曇 → 雨 → 晴 の順に、静か → 活発。
   天気コードの判定範囲は static/js/bg-synapse.js の WEATHER_PRESETS と共通。 */
.nzw-weather-snow   { --nzw-rainbow-duration: 110s; --nzw-rainbow-sat: 0.5;  }
.nzw-weather-cloudy { --nzw-rainbow-duration:  90s; --nzw-rainbow-sat: 0.75; }
.nzw-weather-rain   { --nzw-rainbow-duration:  72s; --nzw-rainbow-sat: 1;    }
.nzw-weather-clear  { --nzw-rainbow-duration:  56s; --nzw-rainbow-sat: 1.3;  }

/* Icon ring — サイトアイコンを囲む虹のリング。
   全ページのヘッダーで使う。以前は各ページに同じ CSS がコピペされていたため、
   ここを唯一の定義とする。`.icon-rainbow-wrapper` は既存マークアップ用の別名。

   ページ側で上書きできるトークン:
     --nzw-icon-ring-size      リング外径          (既定 28px)
     --nzw-icon-ring-inner     アイコン径          (既定 24px)
     --nzw-icon-ring-bg        リング内側の塗り     (既定 #fff)
     --nzw-icon-ring-gradient  虹のグラデーション   (既定 --nzw-rainbow-conic-icon)
     --nzw-icon-ring-sat       虹の彩度倍率        (既定 1)
     --nzw-icon-ring-duration  1 回転の周期        (既定 3s)
     --nzw-icon-ring-glow      リング外周のグロー   (既定 none)

   周期を長くしたい場合は --nzw-icon-ring-duration を上げる。ただし
   10s を超えたあたりから「止まっている」ように見えるので注意。 */
.nzw-icon-ring,
.icon-rainbow-wrapper {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
.nzw-icon-ring::before,
.icon-rainbow-wrapper::before {
  content: '';
  position: absolute;
  width: var(--nzw-icon-ring-size, 28px);
  height: var(--nzw-icon-ring-size, 28px);
  border-radius: var(--nzw-radius-full);
  background: var(--nzw-icon-ring-gradient, var(--nzw-rainbow-conic-icon));
  animation: nzw-icon-ring-spin var(--nzw-icon-ring-duration, 3s) linear infinite;
  box-shadow: var(--nzw-icon-ring-glow, none);
  z-index: 0;
}
.nzw-icon-ring::after,
.icon-rainbow-wrapper::after {
  content: '';
  position: absolute;
  width: var(--nzw-icon-ring-inner, 24px);
  height: var(--nzw-icon-ring-inner, 24px);
  border-radius: var(--nzw-radius-full);
  background: var(--nzw-icon-ring-bg, #fff);
  z-index: 1;
}
.nzw-icon-ring img,
.icon-rainbow-wrapper img {
  position: relative;
  z-index: 2;
  display: block;
  width: var(--nzw-icon-ring-inner, 24px);
  height: var(--nzw-icon-ring-inner, 24px);
  border-radius: var(--nzw-radius-full);
}

/* Button */
.nzw-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--nzw-space-2);
  padding: var(--nzw-space-3) var(--nzw-space-6);
  font-family: var(--nzw-font-sans);
  font-size: var(--nzw-text-sm);
  font-weight: var(--nzw-weight-bold);
  line-height: 1;
  border-radius: var(--nzw-radius-full);
  border: 1px solid transparent;
  cursor: pointer;
  transition: var(--nzw-transition);
  text-decoration: none;
}
.nzw-btn--primary {
  /* 白文字を載せるため accent ではなく accent-strong を採用
     (#0ea5e9 は白文字で 2.77:1 と WCAG 不可。#0284c7 は 4.10:1 で大文字AA合格) */
  background: var(--nzw-accent-strong);
  color: var(--nzw-on-accent);
  box-shadow: var(--nzw-shadow-sm);
}
.nzw-btn--primary:hover {
  background: var(--nzw-accent-deep);
  box-shadow: var(--nzw-shadow-md);
  transform: translateY(-1px);
}
.nzw-btn--secondary {
  background: var(--nzw-card);
  color: var(--nzw-accent-deep);
  border-color: var(--nzw-border-strong);
  box-shadow: var(--nzw-shadow-sm);
}
.nzw-btn--secondary:hover {
  background: var(--nzw-accent-bg);
  box-shadow: var(--nzw-shadow-md);
}
.nzw-btn--ghost {
  background: transparent;
  color: var(--nzw-accent-deep);
}
.nzw-btn--ghost:hover {
  background: var(--nzw-accent-soft);
}

/* Card */
.nzw-card {
  background: var(--nzw-card);
  border: 1px solid var(--nzw-border);
  border-radius: var(--nzw-radius-xl);
  box-shadow: var(--nzw-shadow-sm);
  padding: var(--nzw-space-6);
  transition: var(--nzw-transition);
}
.nzw-card--hover:hover {
  box-shadow: var(--nzw-shadow-accent);
  transform: translateY(-4px);
}

/* Badge / Pill */
.nzw-badge {
  display: inline-flex;
  align-items: center;
  gap: var(--nzw-space-1);
  padding: 0.2rem var(--nzw-space-3);
  font-size: var(--nzw-text-xs);
  font-weight: var(--nzw-weight-bold);
  line-height: 1.4;
  border-radius: var(--nzw-radius-full);
  color: var(--nzw-accent-deep);
  background: var(--nzw-accent-soft);
  border: 1px solid var(--nzw-accent-light);
}
.nzw-badge--success { color: var(--nzw-success); background: var(--nzw-success-soft); border-color: var(--nzw-success); }
.nzw-badge--warning { color: var(--nzw-warning); background: var(--nzw-warning-soft); border-color: var(--nzw-warning-light); }
.nzw-badge--danger  { color: var(--nzw-danger);  background: var(--nzw-danger-soft);  border-color: var(--nzw-danger); }

/* Surface helpers */
.nzw-surface       { background: var(--nzw-bg);        color: var(--nzw-text); }
.nzw-surface-muted { background: var(--nzw-surface-2); color: var(--nzw-text); }
