/* ==========================================================================
   BAMFLOW — Design Tokens
   Hướng thị giác: "precision engineering" — graphite trung tính, hairline 1px,
   hình học sắc cạnh, một accent tín hiệu duy nhất dùng rất tiết chế.

   Chủ ý khác biệt với hệ OXMODE (indigo/cyan/violet, aurora, bo tròn 20–28px,
   glow neon, Be Vietnam Pro): xem bảng đối chiếu trong README.
   Quy tắc: component CSS chỉ dùng biến semantic bên dưới, không dùng hex thô.
   ========================================================================== */

:root {
  /* ---------- Color: surface ----------
     Graphite trung tính, hoàn toàn không ám tím. Mỗi bậc cách nhau đủ để phân
     lớp mà không cần đổ bóng. */
  --bg-base: #08090b;
  --bg-sunken: #050608;
  --bg-raised: #0e1014;
  --bg-panel: #12151a;
  --bg-panel-hover: #171b21;
  --bg-inset: #0a0c0f;

  /* ---------- Color: text ---------- */
  /* Tỷ lệ tương phản đo trên --bg-base (#08090b). Mọi giá trị đều đạt WCAG
     2.2 AA cho chữ thường (≥4.5:1) vì bậc muted có dùng cho body 15px. */
  --text-primary: #f2f4f7;   /* 17.42:1 */
  --text-secondary: #9aa1ad; /*  7.66:1 */
  --text-muted: #78808d;     /*  5.00:1 */
  --text-on-accent: #0a0a0a; /*  6.91:1 trên --accent */

  /* ---------- Color: accent ----------
     Amber tín hiệu. Chỉ dùng cho: trạng thái tương tác, mục đang hoạt động,
     dữ liệu cần nhấn. Mọi thứ còn lại giữ đơn sắc — đó là kỷ luật của hệ này. */
  --accent: #ff6a1f;
  --accent-rgb: 255, 106, 31; /* dùng cho rgba(var(--accent-rgb), a) trong style.css */
  --accent-hover: #ff8340;
  --accent-dim: #c94f10;
  --accent-soft: rgba(255, 106, 31, 0.12);
  --accent-softer: rgba(255, 106, 31, 0.06);
  --accent-line: rgba(255, 106, 31, 0.4);

  /* ---------- Color: stroke ---------- */
  --stroke: rgba(255, 255, 255, 0.09);
  --stroke-strong: rgba(255, 255, 255, 0.16);
  --stroke-faint: rgba(255, 255, 255, 0.05);
  --stroke-blueprint: rgba(255, 255, 255, 0.035);

  /* ---------- Color: feedback ---------- */
  --ok: #4ade80;
  --warn: #facc15;
  --err: #f87171;
  --err-line: rgba(248, 113, 113, 0.45);

  /* ---------- Typography ----------
     Archivo (grotesk công nghiệp) cho tiêu đề, IBM Plex Sans cho body,
     IBM Plex Mono cho nhãn kỹ thuật và dữ liệu. Cả ba đều có bộ tiếng Việt. */
  --font-display: "Archivo", "Segoe UI", system-ui, sans-serif;
  --font-body: "IBM Plex Sans", "Segoe UI", system-ui, -apple-system, sans-serif;
  --font-mono: "IBM Plex Mono", "SF Mono", ui-monospace, Consolas, monospace;

  --leading-display: 1.02;
  --leading-heading: 1.18;
  --leading-body: 1.62;

  --text-2xs: 0.6875rem;  /* 11px — nhãn mono */
  --text-xs: 0.75rem;     /* 12px */
  --text-sm: 0.8125rem;   /* 13px */
  --text-md: 0.9375rem;   /* 15px — body mặc định của khối nội dung */
  --text-base: 1rem;      /* 16px */
  --text-lg: 1.125rem;    /* 18px */
  --text-xl: 1.375rem;    /* 22px */
  --text-2xl: clamp(1.5rem, 1.15rem + 1.3vw, 1.9rem);
  --text-3xl: clamp(1.9rem, 1.3rem + 2.3vw, 2.65rem);
  --text-display: clamp(2.4rem, 1.35rem + 4.4vw, 4.1rem);
  --text-numeric: clamp(2rem, 1.4rem + 2.2vw, 3rem);

  /* Chữ hiển thị siết chặt; nhãn mono giãn rộng — tương phản này là chữ ký
     của hệ, thay cho vai trò mà glow đảm nhiệm ở hệ neon. */
  --tracking-display: -0.035em;
  --tracking-heading: -0.02em;
  --tracking-label: 0.16em;
  --tracking-mono: 0.04em;

  /* ---------- Spacing ---------- */
  --space-px: 1px;
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-5: 20px;
  --space-6: 24px;
  --space-8: 32px;
  --space-10: 40px;
  --space-12: 48px;
  --space-16: 64px;
  --space-20: 80px;
  --space-24: 96px;
  --space-32: 128px;

  /* ---------- Radius ----------
     Sắc cạnh có chủ ý. Không có bậc nào vượt 6px ngoại trừ chấm tròn. */
  --r-none: 0;
  --r-xs: 2px;
  --r-sm: 3px;
  --r-md: 4px;
  --r-lg: 6px;
  --r-round: 999px;

  /* ---------- Elevation ----------
     Phân lớp bằng hairline và nền, không bằng bóng đổ toả sáng. */
  --line-top: inset 0 1px 0 rgba(255, 255, 255, 0.045);
  --shadow-panel: 0 1px 0 rgba(0, 0, 0, 0.6), 0 12px 32px -16px rgba(0, 0, 0, 0.9);
  --shadow-lift: 0 1px 0 rgba(0, 0, 0, 0.6), 0 20px 44px -18px rgba(0, 0, 0, 0.95);
  --focus-ring: 0 0 0 2px var(--bg-base), 0 0 0 4px var(--accent);

  /* ---------- Bề mặt phụ thuộc chủ đề ----------
     Mọi giá trị nửa trong suốt phải nằm ở đây, không viết thẳng trong
     style.css — nếu không thì chế độ sáng sẽ vỡ. */
  --bar-bg: rgba(16, 14, 28, 0.78);
  --bar-bg-stuck: rgba(12, 10, 24, 0.94);
  --drawer-bg: rgba(12, 10, 24, 0.96);
  --grain-opacity: 0.16;
  --photo-filter: saturate(0.82) contrast(1.04) brightness(0.94);
  /* Quầng sáng nền hero. Quầng "cool" là ánh sáng trung tính, không phải màu
     accent thứ hai — nó tạo chiều sâu mà không phá kỷ luật một accent. */
  --hero-aura-warm: rgba(255, 106, 31, 0.35);
  --hero-aura-cool: rgba(190, 214, 255, 0.13);
  /* Vòm sáng đỉnh hero: lõi gần trắng rồi loang thành amber — đọc ra là nguồn
     sáng, không phải một vệt màu cam. Tăng cường độ sáng để ánh sáng từ trên
     đổ xuống mạnh hơn, rõ hơn. */
  --hero-dome-core: rgba(255, 215, 185, 0.32);
  --hero-dome-mid: rgba(255, 106, 31, 0.28);
  --hero-star: rgba(255, 255, 255, 0.85);
  --hero-star-dim: rgba(210, 224, 245, 0.5);
  --hero-star-warm: rgba(255, 176, 122, 0.7);

  /* ---------- Motion ----------
     Nhanh và dứt khoát. Không có gì lơ lửng hay nảy. */
  --ease: cubic-bezier(0.32, 0.72, 0, 1);
  --ease-out: cubic-bezier(0.22, 1, 0.36, 1);
  --t-fast: 100ms;
  --t-normal: 150ms;
  --t-slow: 220ms;
  --t-reveal: 360ms;

  /* ---------- Layout ---------- */
  --container-max: 1240px;
  --gutter: var(--space-8);
  --header-h: 64px;
  --header-offset: var(--space-5); /* khoảng hở giữa thanh nav nổi và mép trên */
  --z-bg: -1;
  --z-header: 100;
  --z-drawer: 200;
  --z-skip: 300;
}

/* ==========================================================================
   Chế độ sáng
   Cùng một hệ, đổi bậc nền và siết accent tối lại cho đủ tương phản. Amber
   #ff6a1f trên nền sáng chỉ đạt 2.2:1 nên bản sáng dùng #c2410c (4.83:1 trên
   nền, 5.18:1 khi làm nền nút với chữ trắng).
   ========================================================================== */
[data-theme="light"] {
  --bg-base: #f6f7f9;
  --bg-sunken: #eceff3;
  --bg-raised: #ffffff;
  --bg-panel: #ffffff;
  --bg-panel-hover: #f9fafc;
  --bg-inset: #f1f3f7;

  --text-primary: #0d1117;   /* 17.65:1 */
  --text-secondary: #47505f; /*  7.59:1 */
  --text-muted: #5f6875;     /*  5.26:1 */
  --text-on-accent: #ffffff; /*  5.18:1 trên --accent */

  --accent: #ea580c;
  --accent-rgb: 255, 106, 31;
  --accent-hover: #c2410c;
  --accent-dim: #9f3409;
  --accent-soft: rgba(234, 88, 12, 0.12);
  --accent-softer: rgba(234, 88, 12, 0.06);
  --accent-line: rgba(234, 88, 12, 0.35);

  --stroke: rgba(13, 17, 23, 0.12);
  --stroke-strong: rgba(13, 17, 23, 0.2);
  --stroke-faint: rgba(13, 17, 23, 0.07);
  --stroke-blueprint: rgba(13, 17, 23, 0.05);

  --ok: #15803d;
  --err: #b91c1c;
  --err-line: rgba(185, 28, 28, 0.4);

  --line-top: inset 0 1px 0 rgba(255, 255, 255, 0.9);
  --shadow-panel: 0 1px 2px rgba(13, 17, 23, 0.05), 0 12px 28px -18px rgba(13, 17, 23, 0.28);
  --shadow-lift: 0 2px 4px rgba(13, 17, 23, 0.06), 0 20px 40px -20px rgba(13, 17, 23, 0.35);

  --bar-bg: rgba(255, 255, 255, 0.78);
  --bar-bg-stuck: rgba(255, 255, 255, 0.94);
  --drawer-bg: rgba(255, 255, 255, 0.97);
  --grain-opacity: 0.04;
  --photo-filter: saturate(0.92) contrast(1.02);
  --hero-aura-warm: rgba(194, 65, 12, 0.17);
  --hero-aura-cool: rgba(37, 84, 168, 0.09);
  /* Nền sáng thì "sao" phải là chấm tối, không phải chấm sáng */
  --hero-dome-core: rgba(255, 214, 184, 0.5);
  --hero-dome-mid: rgba(194, 65, 12, 0.1);
  --hero-star: rgba(13, 17, 23, 0.22);
  --hero-star-dim: rgba(13, 17, 23, 0.12);
  --hero-star-warm: rgba(194, 65, 12, 0.3);
}

@media (max-width: 900px) {
  :root {
    --gutter: var(--space-5);
    --header-h: 58px;
    --header-offset: var(--space-3);
  }
}
