/* =====================================================================
   AENET Cloud Public — FGRID v1.5 (GENERATED — do not edit by hand)
   Source of truth: design/typography.json (aenet.fgrid.v1).
   Regenerate with: npm run fgrid:build
   ===================================================================== */
:root{
  /* ---- Font families ---- */
  --f-font-sans:system-ui, -apple-system, 'Segoe UI', Roboto, 'Noto Sans Thai', 'Noto Sans SC', sans-serif;
  --f-font-mono:ui-monospace, 'SF Mono', 'Cascadia Code', Menlo, Consolas, monospace;
  /* ---- Type scale F01–F14 ---- */
  --f-size-01:10px;
  --f-size-02:11px;
  --f-size-03:12px;
  --f-size-04:13px;
  --f-size-05:14px;
  --f-size-06:15px;
  --f-size-07:16px;
  --f-size-08:18px;
  --f-size-09:20px;
  --f-size-10:24px;
  --f-size-11:28px;
  --f-size-12:34px;
  --f-size-13:42px;
  --f-size-14:52px;
  /* ---- Weights ---- */
  --f-weight-regular:400;
  --f-weight-medium:500;
  --f-weight-semibold:600;
  --f-weight-bold:700;
  --f-weight-extrabold:800;
  /* ---- Line heights ---- */
  --f-line-tight:1.18;
  --f-line-heading:1.25;
  --f-line-normal:1.5;
  --f-line-relaxed:1.65;
  --f-line-code:1.35;
  /* ---- Tracking ---- */
  --f-track-normal:0;
  --f-track-snug:0.01em;
  --f-track-code:0.06em;
  --f-track-wide:0.08em;
  --f-track-wider:0.12em;
  --f-track-label:0.14em;
  /* ---- Text color roles (mapped to RGBM / design tokens) ---- */
  --f-color-text-primary:var(--text);
  --f-color-text-secondary:var(--muted);
  --f-color-text-muted:var(--muted);
  --f-color-text-accent:var(--rgbm-cyan);
  --f-color-text-code:var(--muted);
  --f-color-text-success:var(--rgbm-green);
  --f-color-text-warning:var(--rgbm-amber);
  --f-color-text-danger:var(--rgbm-red);
  --f-color-text-public:var(--rgbm-blue);
  --f-color-text-research:var(--rgbm-magenta);
  /* ---- Locale factors ---- */
  --f-locale-line-th:1.15;
  --f-locale-line-zh:1.1;
}

/* ---- FGRID roles ---- */
.f-role-display-hero{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-13);
  font-weight:var(--f-weight-bold);
  line-height:var(--f-line-heading);
  letter-spacing:var(--f-track-normal);
  color:var(--f-color-text-primary);
}
.f-role-page-h1{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-11);
  font-weight:var(--f-weight-bold);
  line-height:var(--f-line-heading);
  letter-spacing:var(--f-track-normal);
  color:var(--f-color-text-primary);
}
.f-role-page-h2{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-09);
  font-weight:var(--f-weight-semibold);
  line-height:var(--f-line-heading);
  letter-spacing:var(--f-track-normal);
  color:var(--f-color-text-primary);
}
.f-role-page-h3{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-07);
  font-weight:var(--f-weight-semibold);
  line-height:var(--f-line-heading);
  letter-spacing:var(--f-track-normal);
  color:var(--f-color-text-primary);
}
.f-role-body-lg{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-08);
  font-weight:var(--f-weight-regular);
  line-height:var(--f-line-relaxed);
  letter-spacing:var(--f-track-normal);
  color:var(--f-color-text-secondary);
}
.f-role-body-default{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-07);
  font-weight:var(--f-weight-regular);
  line-height:var(--f-line-relaxed);
  letter-spacing:var(--f-track-normal);
  color:var(--f-color-text-primary);
}
.f-role-body-sm{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-05);
  font-weight:var(--f-weight-regular);
  line-height:var(--f-line-normal);
  letter-spacing:var(--f-track-normal);
  color:var(--f-color-text-secondary);
}
.f-role-label-default{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-04);
  font-weight:var(--f-weight-medium);
  line-height:var(--f-line-normal);
  letter-spacing:var(--f-track-normal);
  color:var(--f-color-text-secondary);
}
.f-role-label-sm{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-03);
  font-weight:var(--f-weight-medium);
  line-height:var(--f-line-normal);
  letter-spacing:var(--f-track-code);
  color:var(--f-color-text-secondary);
}
.f-role-label-upper{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-03);
  font-weight:var(--f-weight-semibold);
  line-height:var(--f-line-tight);
  letter-spacing:var(--f-track-wider);
  color:var(--f-color-text-accent);
  text-transform:uppercase;
}
.f-role-nav-code{
  font-family:var(--f-font-mono);
  font-size:var(--f-size-02);
  font-weight:var(--f-weight-semibold);
  line-height:var(--f-line-tight);
  letter-spacing:var(--f-track-wide);
  color:var(--f-color-text-accent);
  white-space:nowrap;
}
.f-role-nav-label{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-05);
  font-weight:var(--f-weight-medium);
  line-height:var(--f-line-normal);
  letter-spacing:var(--f-track-snug);
  color:var(--f-color-text-primary);
}
.f-role-nav-utility{
  font-family:var(--f-font-mono);
  font-size:var(--f-size-03);
  font-weight:var(--f-weight-medium);
  line-height:var(--f-line-tight);
  letter-spacing:var(--f-track-code);
  color:var(--f-color-text-muted);
}
.f-role-nav-locale{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-03);
  font-weight:var(--f-weight-medium);
  line-height:var(--f-line-tight);
  letter-spacing:var(--f-track-code);
  color:var(--f-color-text-secondary);
}
.f-role-context-item{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-04);
  font-weight:var(--f-weight-medium);
  line-height:var(--f-line-normal);
  letter-spacing:var(--f-track-snug);
  color:var(--f-color-text-secondary);
}
.f-role-context-active{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-04);
  font-weight:var(--f-weight-semibold);
  line-height:var(--f-line-normal);
  letter-spacing:var(--f-track-snug);
  color:var(--f-color-text-accent);
}
.f-role-context-code{
  font-family:var(--f-font-mono);
  font-size:var(--f-size-02);
  font-weight:var(--f-weight-semibold);
  line-height:var(--f-line-tight);
  letter-spacing:var(--f-track-wide);
  color:var(--f-color-text-muted);
}
.f-role-system-code{
  font-family:var(--f-font-mono);
  font-size:var(--f-size-03);
  font-weight:var(--f-weight-semibold);
  line-height:var(--f-line-tight);
  letter-spacing:var(--f-track-wide);
  color:var(--f-color-text-accent);
}
.f-role-system-name{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-07);
  font-weight:var(--f-weight-bold);
  line-height:var(--f-line-heading);
  letter-spacing:var(--f-track-snug);
  color:var(--f-color-text-primary);
}
.f-role-system-status{
  font-family:var(--f-font-mono);
  font-size:var(--f-size-03);
  font-weight:var(--f-weight-bold);
  line-height:var(--f-line-tight);
  letter-spacing:var(--f-track-wide);
  color:var(--f-color-text-accent);
  text-transform:uppercase;
}
.f-role-api-method{
  font-family:var(--f-font-mono);
  font-size:var(--f-size-03);
  font-weight:var(--f-weight-bold);
  line-height:var(--f-line-tight);
  letter-spacing:var(--f-track-code);
  color:var(--f-color-text-public);
  text-transform:uppercase;
}
.f-role-api-path{
  font-family:var(--f-font-mono);
  font-size:var(--f-size-05);
  font-weight:var(--f-weight-medium);
  line-height:var(--f-line-normal);
  letter-spacing:var(--f-track-snug);
  color:var(--f-color-text-accent);
}
.f-role-api-schema{
  font-family:var(--f-font-mono);
  font-size:var(--f-size-03);
  font-weight:var(--f-weight-medium);
  line-height:var(--f-line-tight);
  letter-spacing:var(--f-track-code);
  color:var(--f-color-text-muted);
}
.f-role-api-description{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-05);
  font-weight:var(--f-weight-regular);
  line-height:var(--f-line-normal);
  letter-spacing:var(--f-track-snug);
  color:var(--f-color-text-secondary);
}
.f-role-metric-value{
  font-family:var(--f-font-mono);
  font-size:var(--f-size-09);
  font-weight:var(--f-weight-bold);
  line-height:var(--f-line-tight);
  letter-spacing:var(--f-track-snug);
  color:var(--f-color-text-accent);
}
.f-role-metric-label{
  font-family:var(--f-font-mono);
  font-size:var(--f-size-03);
  font-weight:var(--f-weight-medium);
  line-height:var(--f-line-tight);
  letter-spacing:var(--f-track-wider);
  color:var(--f-color-text-muted);
  text-transform:uppercase;
}
.f-role-code-inline{
  font-family:var(--f-font-mono);
  font-size:var(--f-size-04);
  font-weight:var(--f-weight-regular);
  line-height:var(--f-line-code);
  letter-spacing:var(--f-track-snug);
  color:var(--f-color-text-code);
}
.f-role-code-block{
  font-family:var(--f-font-mono);
  font-size:var(--f-size-04);
  font-weight:var(--f-weight-regular);
  line-height:var(--f-line-relaxed);
  letter-spacing:var(--f-track-snug);
  color:var(--f-color-text-code);
}
.f-role-caption{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-03);
  font-weight:var(--f-weight-regular);
  line-height:var(--f-line-normal);
  letter-spacing:var(--f-track-snug);
  color:var(--f-color-text-muted);
}
.f-role-breadcrumb{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-04);
  font-weight:var(--f-weight-regular);
  line-height:var(--f-line-normal);
  letter-spacing:var(--f-track-snug);
  color:var(--f-color-text-secondary);
}
.f-role-kgrid-code{
  font-family:var(--f-font-mono);
  font-size:var(--f-size-02);
  font-weight:var(--f-weight-semibold);
  line-height:var(--f-line-tight);
  letter-spacing:var(--f-track-code);
  color:var(--f-color-text-muted);
}
.f-role-kgrid-label{
  font-family:var(--f-font-mono);
  font-size:var(--f-size-03);
  font-weight:var(--f-weight-medium);
  line-height:var(--f-line-tight);
  letter-spacing:var(--f-track-code);
  color:var(--f-color-text-secondary);
}
.f-role-ksharp-code{
  font-family:var(--f-font-mono);
  font-size:var(--f-size-02);
  font-weight:var(--f-weight-semibold);
  line-height:var(--f-line-tight);
  letter-spacing:var(--f-track-wide);
  color:var(--f-color-text-accent);
}
.f-role-ksharp-title{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-06);
  font-weight:var(--f-weight-bold);
  line-height:var(--f-line-heading);
  letter-spacing:var(--f-track-snug);
  color:var(--f-color-text-primary);
}
.f-role-ksharp-search{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-04);
  font-weight:var(--f-weight-regular);
  line-height:var(--f-line-normal);
  letter-spacing:var(--f-track-snug);
  color:var(--f-color-text-primary);
}
.f-role-ksharp-group{
  font-family:var(--f-font-mono);
  font-size:var(--f-size-03);
  font-weight:var(--f-weight-semibold);
  line-height:var(--f-line-tight);
  letter-spacing:var(--f-track-wider);
  color:var(--f-color-text-muted);
  text-transform:uppercase;
}
.f-role-ksharp-item{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-04);
  font-weight:var(--f-weight-medium);
  line-height:var(--f-line-normal);
  letter-spacing:var(--f-track-snug);
  color:var(--f-color-text-primary);
}
.f-role-ksharp-meta{
  font-family:var(--f-font-mono);
  font-size:var(--f-size-02);
  font-weight:var(--f-weight-regular);
  line-height:var(--f-line-tight);
  letter-spacing:var(--f-track-code);
  color:var(--f-color-text-muted);
}
.f-role-subnav-group{
  font-family:var(--f-font-mono);
  font-size:var(--f-size-03);
  font-weight:var(--f-weight-semibold);
  line-height:var(--f-line-tight);
  letter-spacing:var(--f-track-wider);
  color:var(--f-color-text-accent);
  text-transform:uppercase;
}
.f-role-subnav-item{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-04);
  font-weight:var(--f-weight-medium);
  line-height:var(--f-line-normal);
  letter-spacing:var(--f-track-snug);
  color:var(--f-color-text-primary);
}
.f-role-subnav-code{
  font-family:var(--f-font-mono);
  font-size:var(--f-size-02);
  font-weight:var(--f-weight-semibold);
  line-height:var(--f-line-tight);
  letter-spacing:var(--f-track-wide);
  color:var(--f-color-text-muted);
}
.f-role-subnav-description{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-03);
  font-weight:var(--f-weight-regular);
  line-height:var(--f-line-normal);
  letter-spacing:var(--f-track-snug);
  color:var(--f-color-text-secondary);
}
.f-role-subnav-status{
  font-family:var(--f-font-mono);
  font-size:var(--f-size-03);
  font-weight:var(--f-weight-bold);
  line-height:var(--f-line-tight);
  letter-spacing:var(--f-track-wide);
  color:var(--f-color-text-accent);
  text-transform:uppercase;
}
.f-role-fact-label{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-03);
  font-weight:var(--f-weight-medium);
  line-height:var(--f-line-tight);
  letter-spacing:var(--f-track-wider);
  color:var(--f-color-text-muted);
  text-transform:uppercase;
}
.f-role-fact-value{
  font-family:var(--f-font-sans);
  font-size:var(--f-size-05);
  font-weight:var(--f-weight-regular);
  line-height:var(--f-line-normal);
  letter-spacing:var(--f-track-snug);
  color:var(--f-color-text-primary);
}
.f-role-fact-code{
  font-family:var(--f-font-mono);
  font-size:var(--f-size-04);
  font-weight:var(--f-weight-medium);
  line-height:var(--f-line-normal);
  letter-spacing:var(--f-track-snug);
  color:var(--f-color-text-code);
}

/* ---- Responsive FGRID role overrides (KGRID breakpoints) ---- */
@media (min-width:760px) and (max-width:1099px){
  .f-role-display-hero{font-size:var(--f-size-12);}
  .f-role-page-h1{font-size:var(--f-size-10);}
  .f-role-page-h2{font-size:var(--f-size-08);}
  .f-role-page-h3{font-size:var(--f-size-06);}
  .f-role-body-lg{font-size:var(--f-size-07);}
  .f-role-body-default{font-size:var(--f-size-06);}
  .f-role-nav-label{font-size:var(--f-size-04);}
}
@media (max-width:759px){
  .f-role-display-hero{font-size:var(--f-size-11);}
  .f-role-page-h1{font-size:var(--f-size-10);}
  .f-role-page-h2{font-size:var(--f-size-08);}
  .f-role-page-h3{font-size:var(--f-size-06);}
  .f-role-body-lg{font-size:var(--f-size-07);}
  .f-role-body-default{font-size:var(--f-size-06);}
  .f-role-nav-label{font-size:var(--f-size-05);}
}

/* ---- FGRID locale rules ---- */
html[lang="th"] body{
  line-height:calc(var(--f-line-relaxed) * var(--f-locale-line-th));
  letter-spacing:.01em;
}
html[lang="th"] .f-role-page-h1,html[lang="th"] .f-role-body-lg{
  line-height:calc(var(--f-line-heading) * var(--f-locale-line-th));
}
html[lang="zh-cn"] body{
  line-height:calc(var(--f-line-relaxed) * var(--f-locale-line-zh));
  letter-spacing:.01em;
}
html[lang="zh-cn"] .f-role-nav-label,html[lang="zh-cn"] .f-role-subnav-item{
  letter-spacing:0;
}
