/* ============================================================
   FreePrintKit — global.css
   Design System: Vivid Pastel Multi · Cool Gray BG
   Updated: 2026-03-30 v2.0
   ============================================================ */

/* ── Google Fonts (load in <head> of every page) ──
   Inter, Instrument Serif, DM Mono, Nunito, Patrick Hand, Merriweather
   ------------------------------------------------------------ */

/* ============================================================
   1. DESIGN TOKENS
   ============================================================ */
:root {
  /* Color — Green zone (ctrl + preview) */
  --color-accent:        #2E8B57;
  --color-accent-hover:  #1e6e42;
  --color-accent-light:  #E8F7EE;
  --color-accent-border: #A8DDB8;
  --color-accent-surface:#d6eedd;

  /* Color — Blue zone (col-left + col-right) */
  --color-cta:           #2979C8;
  --color-cta-hover:     #1a5faa;
  --color-cta-light:     #EEF5FC;
  --color-cta-border:    #93C5E8;
  --color-cta-surface:   #F4F9FD;

  /* Color — Highlight */
  --color-highlight:     #FFE066;
  --color-highlight-text:#6a5200;

  /* Color — Text */
  --color-text:          #1a1c1a;
  --color-text-secondary:#2d3d31;
  --color-text-muted:    #5a6b5e;
  --color-text-faint:    #8aab92;
  --color-text-ghost:    #c4ddc9;

  /* Color — Surface & BG */
  --color-bg:            #ffffff;
  --color-bg-page:       #F2F4F7;
  --color-bg-subtle:     #f8faf8;
  --color-bg-green:      #E8F7EE;
  --color-bg-green-mid:  #d6eedd;
  --color-bg-green-deep: #c8e8d4;

  /* Color — Border */
  --color-border:        #7BCBA0;
  --color-border-subtle: #A8DDB8;

  /* Color — Print */
  --color-print-text:    #000000;
  --color-print-border:  #cccccc;

  /* Typography */
  --ff: 'Inter', system-ui, sans-serif;
  --fs: 'Instrument Serif', Georgia, serif;
  --fm: 'DM Mono', monospace;

  /* Radius */
  --r4:  4px;
  --r6:  6px;
  --r8:  8px;
  --r10: 8px;   /* ลดจาก 10 → 8 */
  --r14: 10px;  /* ลดจาก 14 → 10 */
  --r20: 14px;  /* ลดจาก 20 → 14 */

  /* Shadow */
  --sh0: 0 1px 2px rgba(0,0,0,.04);
  --sh2: 0 2px 8px rgba(0,0,0,.07), 0 6px 20px rgba(0,0,0,.05);
  --sh-paper: 0 4px 16px rgba(0,0,0,.08), 0 20px 60px rgba(0,0,0,.12);

  /* Layout */
  --nav-h:    52px;
  --col-side: 272px;
  --col-ctrl: 272px;
  --action-h: 64px;

  /* Spacing scale */
  --sp-xs: .35rem;
  --sp-sm: .6rem;
  --sp-md: .9rem;
  --sp-lg: 1.25rem;

  /* Share — brand colors */
  --color-share-fb:   #1877f2;
  --color-share-wa:   #25d366;
  --color-share-line: #06c755;
  --color-share-copy: #6b7280;
}


/* ============================================================
   2. RESET
   ============================================================ */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { height: 100%; }
body {
  min-height: 100%;
  font-family: var(--ff);
  background: var(--color-bg-page);
  color: var(--color-text);
  -webkit-font-smoothing: antialiased;
}
a    { text-decoration: none; color: inherit; }
button { font-family: var(--ff); cursor: pointer; border: none; background: none; }
svg  { display: block; flex-shrink: 0; }


/* ============================================================
   3. NAV
   ============================================================ */
.nav {
  height: var(--nav-h);
  position: sticky; top: 0; z-index: 200;
  background: rgba(255,255,255,.95);
  backdrop-filter: blur(20px) saturate(180%);
  border-bottom: 1px solid var(--color-border-subtle);
  display: flex; align-items: center;
  padding: 0 1rem; gap: .75rem;
}
.nav-logo {
  font-family: var(--fs);
  font-size: 1.1rem; font-style: italic;
  letter-spacing: -.02em; color: var(--color-text); flex-shrink: 0;
}
.nav-logo span { color: var(--color-accent); font-style: normal; }
.nav-div { width: 1px; height: 16px; background: var(--color-border); flex-shrink: 0; }

/* Breadcrumb */
.bc { display: flex; align-items: center; gap: .1rem; flex: 1; overflow: hidden; min-width: 0; }
.bc-sep { color: var(--color-text-ghost); font-size: .75rem; padding: 0 .05rem; flex-shrink: 0; }
.bc-link {
  font-size: .72rem; font-weight: 500; color: var(--color-text-muted);
  padding: .2rem .4rem; border-radius: var(--r6);
  white-space: nowrap;
  transition: color .12s, background .12s;
}
.bc-link:hover { color: var(--color-accent); background: var(--color-accent-light); }
.bc-cur {
  font-size: .72rem; font-weight: 600; color: var(--color-text);
  padding: .2rem .48rem; border-radius: var(--r6);
  background: var(--color-bg-green); border: 1px solid var(--color-border);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.nav-right { display: flex; align-items: center; gap: .5rem; flex-shrink: 0; margin-left: auto; }
.lang-btn {
  height: 30px; padding: 0 .65rem;
  border: 1px solid var(--color-border); border-radius: var(--r6);
  font-size: .72rem; font-weight: 600; color: var(--color-text-muted);
  background: var(--color-bg-green);
  display: flex; align-items: center; gap: .28rem;
  transition: all .12s; cursor: pointer;
}
.lang-btn:hover { border-color: var(--color-text-faint); color: var(--color-text); background: var(--color-bg); }

@media (max-width: 480px) {
  .nav { padding: 0 .875rem; }
  .bc-link:not(:nth-last-of-type(2)) { display: none; }
  .bc-sep:not(:nth-last-of-type(2))  { display: none; }
}


/* ============================================================
   4. PAGE HEADER (eyebrow, title, badges)
   ============================================================ */
.page-hdr { flex-shrink: 0; }

.eyebrow {
  display: inline-flex; align-items: center; gap: .3rem;
  font-size: .6rem; font-weight: 600; letter-spacing: .07em; text-transform: uppercase;
  color: var(--color-accent); background: var(--color-accent-light);
  border: 1px solid rgba(46,139,87,.2);
  padding: .2rem .58rem; border-radius: 99px; margin-bottom: .5rem;
}
.page-title {
  font-family: var(--fs);
  font-size: 2rem; font-weight: 400; letter-spacing: -.03em; line-height: 1.15;
  color: var(--color-text); margin-bottom: .4rem;
}
.page-title em { font-style: italic; color: var(--color-accent); }

.badges { display: flex; align-items: center; gap: .28rem; flex-wrap: wrap; }
.badge {
  display: inline-flex; align-items: center; gap: .22rem;
  font-size: .62rem; font-weight: 500; color: var(--color-text-muted);
  border: 1px solid var(--color-border); border-radius: 99px;
  padding: .15rem .45rem; background: var(--color-bg);
}


/* ============================================================
   5. FORM CONTROLS (col-ctrl — green zone)
   ============================================================ */
.controls {
  background: var(--color-bg);
  border: 2.5px solid var(--color-border);
  border-radius: var(--r20);
  box-shadow: var(--sh2);
  overflow: hidden;
  display: flex; flex-direction: column; flex: 1; min-height: 0;
}
.ctrl-body {
  overflow-y: auto; overflow-x: hidden;
  display: flex; flex-direction: column; flex: 1; min-height: 0;
  scrollbar-width: thin; scrollbar-color: var(--color-border) transparent;
}
.ctrl-body::-webkit-scrollbar { width: 4px; }
.ctrl-body::-webkit-scrollbar-thumb { background: var(--color-border); border-radius: 4px; }

.csect { padding: .75rem 1rem; border-bottom: 1px solid var(--color-border-subtle); }
.csect:last-child { border-bottom: none; }
.csect-hd {
  display: flex; align-items: center; gap: .35rem;
  font-size: .65rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase;
  color: var(--color-text-faint); margin-bottom: .7rem;
}
.csect-hd::after { content: ''; flex: 1; height: 1px; background: linear-gradient(90deg, var(--color-border-subtle), transparent); }

.cstack { display: flex; flex-direction: column; gap: .65rem; }
.crow   { display: flex; flex-direction: column; gap: .35rem; }
.clabel { font-size: .72rem; font-weight: 600; letter-spacing: .04em; text-transform: uppercase; color: var(--color-text-muted); }

/* Pill radio */
.pills { display: flex; gap: .25rem; flex-wrap: wrap; }
.pills input { display: none; }
.pills label {
  height: 32px; padding: 0 .88rem;
  border: 1px solid var(--color-border); border-radius: 99px;
  font-size: .78rem; font-weight: 600; color: var(--color-text-muted);
  display: flex; align-items: center;
  cursor: pointer; transition: all .12s; user-select: none;
  background: var(--color-bg-green);
}
.pills label:hover { border-color: var(--color-text-faint); color: var(--color-text-secondary); background: var(--color-bg); }
.pills input:checked + label { background: var(--color-accent); border-color: var(--color-accent); color: #fff; }

/* Count buttons */
.cnts { display: flex; gap: .25rem; }
.cnts input { display: none; }
.cnts label {
  min-width: 42px; height: 34px; padding: 0 .4rem;
  border: 1px solid var(--color-border); border-radius: var(--r8);
  font-size: .84rem; font-weight: 700; color: var(--color-text-muted);
  display: flex; align-items: center; justify-content: center;
  cursor: pointer; transition: all .12s; user-select: none;
  background: var(--color-bg-green); font-family: var(--fm);
}
.cnts label:hover { border-color: var(--color-text-faint); color: var(--color-text); background: var(--color-bg); }
.cnts input:checked + label { background: var(--color-accent); border-color: var(--color-accent); color: #fff; }

/* Font picker */
.fontpicker-wrap { 
  max-height: 58px;
  overflow-y: auto; 
  overflow-x: hidden;
  scrollbar-width: thin; 
  scrollbar-color: var(--color-border) transparent; 
  border-radius: var(--r8); 
}
.fontpicker-wrap::-webkit-scrollbar { width: 4px; }
.fontpicker-wrap::-webkit-scrollbar-thumb { background: var(--color-border); border-radius: 4px; }
.fontpicker { 
  display: grid; 
  grid-template-columns: repeat(4, 1fr); 
  gap: .3rem; 
  padding: .25rem;
}
.fontpicker label {
  aspect-ratio: 1 / 1;
  min-height: 44px;
  border: 1.5px solid var(--color-border); border-radius: var(--r10);
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .08rem;
  cursor: pointer; transition: all .15s; user-select: none; background: var(--color-bg-green);
}
.fontpicker input { display: none; }
.fontpicker label:hover { border-color: var(--color-accent); background: #fff; box-shadow: 0 2px 6px rgba(0,0,0,.07); }
.fontpicker input:checked + label { border-color: var(--color-accent); background: #fff; box-shadow: 0 0 0 2px var(--color-accent); }
.fp   { font-size: 1.25rem; line-height: 1; color: var(--color-text); }
.fn   { font-size: .55rem; color: var(--color-text-faint); letter-spacing: .02em; text-transform: uppercase; font-family: var(--fm); text-align: center; padding: 0 2px; }
.fontpicker input:checked + label .fp { color: var(--color-accent); }
.fontpicker input:checked + label .fn { color: var(--color-accent); opacity: .8; }
.fp-nunito    { font-family: 'Nunito', sans-serif; }
.fp-fredoka   { font-family: 'Fredoka', sans-serif; }
.fp-baloo     { font-family: 'Baloo 2', cursive; }
.fp-patrick   { font-family: 'Patrick Hand', cursive; }
.fp-comic     { font-family: 'Comic Neue', cursive; }
.fp-quicksand { font-family: 'Quicksand', sans-serif; }
.fp-bubblegum { font-family: 'Bubblegum Sans', cursive; }
.fp-chewy     { font-family: 'Chewy', cursive; }
.fp-schoolbell{ font-family: 'Schoolbell', cursive; }
.fp-kranky    { font-family: 'Kranky', cursive; }
.fp-luckiest  { font-family: 'Luckiest Guy', cursive; }
.fp-titan     { font-family: 'Titan One', cursive; }
.fp-boogaloo  { font-family: 'Boogaloo', cursive; }
.fp-shrikhand { font-family: 'Shrikhand', cursive; }
.fp-lilita    { font-family: 'Lilita One', cursive; }
.fp-caveat    { font-family: 'Caveat', cursive; }
.fp-handlee   { font-family: 'Handlee', cursive; }
.fp-gloria    { font-family: 'Gloria Hallelujah', cursive; }
.fp-pacifico  { font-family: 'Pacifico', cursive; }
.fp-righteous { font-family: 'Righteous', cursive; }

/* Stats bar (home) */
.stats-bar {
  display: flex; gap: .5rem; flex-wrap: wrap;
  margin: .75rem 0;
}
.stat-item {
  display: flex; flex-direction: column; align-items: center;
  flex: 1; min-width: 72px;
  padding: .5rem .25rem;
  background: var(--color-bg-green);
  border: 1px solid var(--color-border-subtle);
  border-radius: var(--r8);
}
.stat-num {
  font-size: 1.25rem; font-weight: 700;
  color: var(--color-accent); line-height: 1.1;
}
.stat-lbl {
  font-size: .6rem; font-weight: 600; letter-spacing: .04em;
  text-transform: uppercase; color: var(--color-text-muted);
  margin-top: .15rem; text-align: center;
}

/* Color picker */
.color-swatches { display: flex; gap: .25rem; flex-wrap: wrap; }
.color-swatches input { display: none; }
.color-swatches label {
  width: 28px; height: 28px; border-radius: 50%;
  border: 2px solid transparent; cursor: pointer;
  transition: transform .1s, box-shadow .1s;
  outline-offset: 2px;
}
.color-swatches label:hover { transform: scale(1.12); }
.color-swatches input:checked + label {
  box-shadow: 0 0 0 2px var(--color-bg), 0 0 0 4px var(--color-accent);
}
.color-custom { position: relative; cursor: pointer; }
.color-swatch-custom {
  display: flex; align-items: center; justify-content: center;
  width: 28px; height: 28px; border-radius: 50%;
  border: 2px dashed var(--color-border);
  font-size: .8rem; color: var(--color-text-faint);
  transition: border-color .15s;
}
.color-custom:hover .color-swatch-custom { border-color: var(--color-text-muted); }

/* Toggle switches */
.toggles { display: flex; flex-direction: column; }
.trow {
  display: flex; align-items: center; justify-content: space-between;
  padding: .35rem 0; gap: 1rem;
  font-size: .83rem; font-weight: 500; color: var(--color-text-secondary);
  border-bottom: 1px solid var(--color-border-subtle);
}
.trow:last-child { border-bottom: none; }
.sw { position: relative; display: inline-block; width: 36px; height: 20px; flex-shrink: 0; }
.sw input { opacity: 0; width: 0; height: 0; }
.sw-track { position: absolute; inset: 0; border-radius: 99px; background: var(--color-border); cursor: pointer; transition: background .18s; }
.sw-knob  { position: absolute; top: 3px; left: 3px; width: 14px; height: 14px; border-radius: 50%; background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,.22); pointer-events: none; transition: transform .2s cubic-bezier(.34,1.56,.64,1); }
.sw input:checked ~ .sw-track { background: var(--color-accent); }
.sw input:checked ~ .sw-knob  { transform: translateX(16px); }

/* Shuffle inline button */
.btn-shuf-inline {
  width: 100%; height: 40px; padding: 0 .9rem;
  background: var(--color-accent-light); color: var(--color-accent);
  border: 1px solid var(--color-border); border-radius: var(--r10);
  font-size: .82rem; font-weight: 700;
  display: flex; align-items: center; justify-content: center; gap: .45rem;
  transition: all .15s;
}
.btn-shuf-inline:hover  { background: var(--color-accent); color: #fff; border-color: var(--color-accent); }
.btn-shuf-inline:active { transform: scale(.98); }

/* ctrl-about: base (hidden on mobile, shown via media query on tablet+) */
.ctrl-about { 
  display: none;
  background: var(--color-cta-light);
  border: 1px solid var(--color-cta-border);
  border-radius: var(--r14);
}

/* ad-728x90 placeholder (hidden on mobile, appears below preview on tablet+) */
.ad-728x90 { display: none; }

/* ── ctrl-section / ctrl-label  (shell.js V3 form builder) ── */
.ctrl-section {
  padding: .7rem 1rem;
  border-bottom: 1px solid var(--color-border-subtle);
  display: flex; flex-direction: column; gap: .5rem;
}
.ctrl-section:last-child { border-bottom: none; }
.ctrl-section.ctrl-shuffle { padding-top: .6rem; padding-bottom: .75rem; }

.ctrl-label {
  font-size: .62rem; font-weight: 700;
  letter-spacing: .1em; text-transform: uppercase;
  color: var(--color-text-faint);
  display: flex; align-items: center; gap: .3rem;
}
.ctrl-label::after {
  content: ''; flex: 1; height: 1px;
  background: linear-gradient(90deg, var(--color-border-subtle), transparent);
}

/* Pill radio (button variant — not input+label) */
.pill-row { display: flex; gap: .28rem; flex-wrap: wrap; }
.pill {
  height: 30px; padding: 0 .85rem;
  border: 1.5px solid var(--color-border); border-radius: 99px;
  font-size: .76rem; font-weight: 600; color: var(--color-text-muted);
  background: var(--color-bg-green);
  display: flex; align-items: center;
  cursor: pointer; transition: all .12s; user-select: none;
}
.pill:hover  { border-color: var(--color-text-faint); color: var(--color-text-secondary); background: var(--color-bg); }
.pill.active { background: var(--color-accent); border-color: var(--color-accent); color: #fff; }

/* Toggle group (segment control) */
.tgl-row {
  display: flex; gap: 0;
  border: 1.5px solid var(--color-border); border-radius: var(--r8);
  overflow: hidden; background: var(--color-bg-green);
}
.tgl-btn {
  flex: 1; height: 30px; padding: 0 .5rem;
  border: none; border-right: 1px solid var(--color-border);
  font-size: .73rem; font-weight: 600; color: var(--color-text-muted);
  background: transparent;
  cursor: pointer; transition: all .12s; user-select: none;
}
.tgl-btn:last-child { border-right: none; }
.tgl-btn:hover  { background: var(--color-bg); color: var(--color-text); }
.tgl-btn.active { background: var(--color-accent); color: #fff; }

/* Toggle switch (button variant — not input) */
.sw-row {
  display: flex; align-items: center; justify-content: space-between;
  min-height: 36px; gap: .75rem;
}
.sw-label {
  font-size: .82rem; font-weight: 500; color: var(--color-text-secondary);
  flex: 1;
}
.sw-btn {
  position: relative; width: 38px; height: 22px; flex-shrink: 0;
  border-radius: 99px; background: var(--color-border);
  border: none; cursor: pointer;
  transition: background .18s;
}
.sw-btn.on { background: var(--color-accent); }
.sw-thumb {
  position: absolute; top: 3px; left: 3px;
  width: 16px; height: 16px; border-radius: 50%;
  background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,.22);
  pointer-events: none;
  transition: transform .2s cubic-bezier(.34,1.56,.64,1);
}
.sw-btn.on .sw-thumb { transform: translateX(16px); }

/* Select dropdown */
.fpk-select {
  width: 100%; height: 36px; padding: 0 2rem 0 .75rem;
  border: 1.5px solid var(--color-border); border-radius: var(--r8);
  font-size: .84rem; font-weight: 500; color: var(--color-text);
  background: var(--color-bg-green);
  cursor: pointer; appearance: none; font-family: var(--ff);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23999' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right .65rem center;
  transition: border-color .12s;
}
.fpk-select:hover { border-color: var(--color-text-faint); background-color: var(--color-bg); }
.fpk-select:focus { outline: none; border-color: var(--color-accent); box-shadow: 0 0 0 2px rgba(46,139,87,.15); }

/* Number input */
.fpk-number {
  width: 100%; height: 36px; padding: 0 .75rem;
  border: 1.5px solid var(--color-border); border-radius: var(--r8);
  font-size: .84rem; font-weight: 600; color: var(--color-text);
  background: var(--color-bg-green); font-family: var(--fm);
  transition: border-color .12s;
}
.fpk-number:focus { outline: none; border-color: var(--color-accent); box-shadow: 0 0 0 2px rgba(46,139,87,.15); }

/* Text input */
.fpk-text {
  width: 100%; height: 36px; padding: 0 .75rem;
  border: 1.5px solid var(--color-border); border-radius: var(--r8);
  font-size: .84rem; color: var(--color-text);
  background: var(--color-bg-green); font-family: var(--ff);
  transition: border-color .12s;
}
.fpk-text:focus { outline: none; border-color: var(--color-accent); box-shadow: 0 0 0 2px rgba(46,139,87,.15); }

/* Color picker input */
.fpk-color {
  width: 48px; height: 36px; padding: 2px;
  border: 1.5px solid var(--color-border); border-radius: var(--r8);
  background: var(--color-bg-green); cursor: pointer;
}

/* Font card grid (font-dropdown renders as font-card grid) */
.font-grid {
  display: grid; grid-template-columns: repeat(4, 1fr); gap: .3rem;
  max-height: 80px; overflow-y: auto;
  scrollbar-width: thin; scrollbar-color: var(--color-border) transparent;
  border-radius: var(--r8);
}
.font-grid::-webkit-scrollbar { width: 4px; }
.font-grid::-webkit-scrollbar-thumb { background: var(--color-border); border-radius: 4px; }
.font-card {
  height: 40px; padding: 0 .3rem;
  border: 1.5px solid var(--color-border); border-radius: var(--r8);
  font-size: .72rem; font-weight: 600; color: var(--color-text-muted);
  background: var(--color-bg-green);
  display: flex; align-items: center; justify-content: center;
  cursor: pointer; transition: all .12s; user-select: none;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.font-card:hover  { border-color: var(--color-accent); background: #fff; box-shadow: 0 2px 6px rgba(0,0,0,.07); }
.font-card.active { border-color: var(--color-accent); background: #fff; box-shadow: 0 0 0 2px var(--color-accent); color: var(--color-accent); }

/* Shuffle / Regenerate button at bottom of ctrl */
.btn-shuffle {
  width: 100%; height: 40px; padding: 0 .9rem;
  background: var(--color-accent-light); color: var(--color-accent);
  border: 1.5px solid var(--color-border); border-radius: var(--r10);
  font-size: .82rem; font-weight: 700; font-family: var(--ff);
  display: flex; align-items: center; justify-content: center; gap: .45rem;
  transition: all .15s; cursor: pointer;
}
.btn-shuffle:hover  { background: var(--color-accent); color: #fff; border-color: var(--color-accent); }
.btn-shuffle:active { transform: scale(.98); }

/* Custom Font Dropdown */
.custom-font-select {
  position: relative;
  width: 100%;
}

.custom-select-trigger {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .5rem;
  padding: .6rem .8rem;
  background: var(--color-bg-green);
  border: 1.5px solid var(--color-border);
  border-radius: var(--r10);
  cursor: pointer;
  transition: all .15s;
  user-select: none;
}

.custom-select-trigger:hover {
  border-color: var(--color-accent);
  background: #fff;
  box-shadow: 0 2px 6px rgba(0,0,0,.07);
}

.trigger-preview {
  font-size: 1.1rem;
  font-weight: 600;
  color: var(--color-text);
  min-width: 30px;
  flex-shrink: 0;
}

.trigger-label {
  font-size: .85rem;
  color: var(--color-text-secondary);
  flex: 1;
  text-align: left;
}

.trigger-icon {
  color: var(--color-text-muted);
  flex-shrink: 0;
  transition: transform .2s;
}

.custom-select-menu.open ~ .custom-select-trigger .trigger-icon {
  transform: rotate(180deg);
}

.custom-select-menu {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  margin-top: .3rem;
  background: var(--color-bg);
  border: 1.5px solid var(--color-border);
  border-radius: var(--r10);
  box-shadow: 0 4px 12px rgba(0,0,0,.12);
  max-height: 0;
  overflow: hidden;
  opacity: 0;
  transition: all .2s;
  z-index: 1000;
}

.custom-select-menu.open {
  max-height: 360px;
  opacity: 1;
  overflow-y: auto;
  overflow-x: hidden;
}

.custom-option {
  display: flex;
  align-items: center;
  gap: .6rem;
  padding: .5rem .8rem;
  cursor: pointer;
  transition: all .1s;
  border-bottom: 1px solid rgba(0,0,0,.03);
}

.custom-option:last-child {
  border-bottom: none;
}

.custom-option:hover {
  background: var(--color-bg-green);
}

.custom-option[data-selected="true"] {
  background: var(--color-accent-light);
  border-left: 3px solid var(--color-accent);
  padding-left: calc(.8rem - 2px);
}

.option-preview {
  font-size: 1rem;
  font-weight: 600;
  color: var(--color-text);
  min-width: 28px;
  flex-shrink: 0;
  text-align: center;
}

.option-label {
  font-size: .8rem;
  color: var(--color-text-muted);
  text-transform: uppercase;
  letter-spacing: .02em;
  flex: 1;
}

.font-select-input {
  display: none;
}
  width: 100%; height: 36px; padding: 0 .75rem;
  border: 1px solid var(--color-border); border-radius: var(--r8);
  font-size: .84rem; font-weight: 500; color: var(--color-text);
  background: var(--color-bg-green);
  cursor: pointer; appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23999' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right .65rem center;
  padding-right: 2rem;
  transition: border-color .12s;
}
.font-select:hover  { border-color: var(--color-text-faint); background-color: var(--color-bg); }
.font-select:focus  { outline: none; border-color: var(--color-accent); box-shadow: 0 0 0 2px rgba(34,139,87,.15); }

/* Status dot */
.stat { display: flex; align-items: center; gap: .3rem; font-size: .72rem; color: var(--color-text-faint); font-family: var(--fm); min-width: 0; overflow: hidden; }
.stat-dot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; background: var(--color-border); transition: background .3s, box-shadow .3s; }
.stat-dot.on { background: #22c55e; box-shadow: 0 0 0 3px rgba(34,197,94,.18); }
.stat-txt { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }


/* ============================================================
   6. PREVIEW CARD (col-preview — green zone)
   ============================================================ */
.preview-card {
  background: var(--color-bg);
  border: 2.5px solid var(--color-border);
  border-radius: var(--r20);
  box-shadow: var(--sh2);
  overflow: hidden; display: flex; flex-direction: column;
}
.p-chrome {
  display: flex; align-items: center; justify-content: space-between;
  padding: .55rem 1rem;
  background: var(--color-bg-green); border-bottom: 1px solid var(--color-border-subtle);
  flex-shrink: 0;
}
.dots { display: flex; gap: .28rem; }
.dot  { width: 9px; height: 9px; border-radius: 50%; }
.dot:nth-child(1) { background: #ef4444; }
.dot:nth-child(2) { background: #f59e0b; }
.dot:nth-child(3) { background: #22c55e; }
.chrome-lbl { font-size: .72rem; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: var(--color-text-faint); }

/* Paper viewport — dot grid */
.paper-vp {
  display: flex; align-items: flex-start; justify-content: center;
  padding: .75rem .75rem .5rem; box-sizing: border-box;
  background: var(--color-accent-surface);
  background-image: radial-gradient(circle, rgba(0,0,0,.07) 1px, transparent 1px);
  background-size: 18px 18px; background-position: 9px 9px;
  overflow: hidden;
}
/*
 * paper-scaler: ใช้ CSS zoom แทน transform:scale
 * zoom ทำให้ browser คิด layout ใหม่ (คิดขนาดจริง) — ต่างจาก transform
 * ที่แค่ scale ภาพโดยไม่เปลี่ยน layout พื้นฐาน
 * JS scalePaper() จะ set --zoom ให้พอดี viewport
 */
.paper-scaler {
  zoom: var(--zoom, 1);
  transform-origin: top center;
  transition: zoom .25s cubic-bezier(.16,1,.3,1);
  flex-shrink: 0;
  display: flex;
  justify-content: center;
}

/*
 * .paper — ใช้ mm จริง ๆ เพื่อให้ screen กับ print ตรงกัน 100%
 * padding ตรงกับ print.css (12mm top/sides, 18mm bottom สำหรับ footer)
 * box-sizing: border-box — ขนาด mm รวม padding แล้ว
 */
.paper {
  /* Default: A4 Portrait */
  width: 210mm;
  height: 297mm;
  background: #fff;
  box-shadow: var(--sh-paper);
  border-radius: 2px;
  padding: 12mm 14mm 18mm;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  box-sizing: border-box;
}

/* A4 Portrait (default — same as base) */
.paper.preview__page--a4-portrait {
  width: 210mm; height: 297mm;
}

/* A4 Landscape */
.paper.preview__page--a4-landscape {
  width: 297mm; height: 210mm;
}

/* Letter Portrait (8.5" × 11") */
.paper.preview__page--letter-portrait {
  width: 215.9mm; height: 279.4mm;
}

/* Letter Landscape */
.paper.preview__page--letter-landscape {
  width: 279.4mm; height: 215.9mm;
}

/* Legal Portrait (8.5" × 14") */
.paper.preview__page--legal-portrait {
  width: 215.9mm; height: 355.6mm;
}

/* Legal Landscape */
.paper.preview__page--legal-landscape {
  width: 355.6mm; height: 215.9mm;
}

/* A3 Portrait */
.paper.preview__page--a3-portrait {
  width: 297mm; height: 420mm;
}

/* A3 Landscape */
.paper.preview__page--a3-landscape {
  width: 420mm; height: 297mm;
}

/* Toolbar below preview */
.p-toolbar {
  display: flex; align-items: center;
  padding: .55rem 1rem; gap: .35rem;
  border-top: 1px solid var(--color-border-subtle);
  background: var(--color-bg); flex-shrink: 0; flex-wrap: wrap;
}
.p-info { flex: 1; font-size: .72rem; color: var(--color-text-faint); font-family: var(--fm); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }

/* Tool buttons (Shuffle / Print / Download PDF) */
.btn-tool {
  height: 36px; padding: 0 1.05rem;
  border: 2px solid var(--color-border); border-radius: var(--r8);
  background: var(--color-bg-green); font-size: .76rem; font-weight: 700; color: var(--color-text-secondary);
  display: flex; align-items: center; gap: .3rem; flex-shrink: 0;
  transition: all .12s; box-shadow: 0 1px 3px rgba(0,0,0,.07);
}
.btn-tool:hover  { background: var(--color-bg); border-color: var(--color-text-faint); color: var(--color-text); box-shadow: 0 2px 6px rgba(0,0,0,.1); }
.btn-tool:active { transform: scale(.97); }
.btn-tool.primary { background: var(--color-cta); border-color: var(--color-cta); color: #fff; box-shadow: 0 2px 8px rgba(41,121,200,.35); }
.btn-tool.primary:hover { background: var(--color-cta-hover); box-shadow: 0 3px 10px rgba(41,121,200,.45); }

/* Empty state */
.empty-state { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .9rem; }
.empty-icon  { width: 52px; height: 52px; border-radius: 50%; border: 1.5px dashed var(--color-text-ghost); display: flex; align-items: center; justify-content: center; font-size: 1.3rem; opacity: .38; }
.empty-t1    { font-size: .7rem; color: var(--color-text-faint); font-family: var(--fm); }
.empty-t2    { font-size: .6rem; color: var(--color-text-ghost); }

/* Error state */
.error-state { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .75rem; padding: 1.5rem; text-align: center; }
.error-icon  { font-size: 1.5rem; opacity: .5; }
.error-t1    { font-size: .82rem; font-weight: 600; color: var(--color-text-secondary); }
.error-t2    { font-size: .72rem; color: var(--color-text-muted); }
.btn-reset {
  height: 34px; padding: 0 1rem;
  border: 1px solid var(--color-border); border-radius: var(--r8);
  font-size: .76rem; font-weight: 600; color: var(--color-text-secondary);
  background: var(--color-bg-green);
  display: flex; align-items: center; gap: .3rem;
  transition: all .12s; cursor: pointer;
}
.btn-reset:hover { border-color: var(--color-text-faint); color: var(--color-text); background: var(--color-bg); }

/* Print footer — visible on paper only */
.print-footer { text-align: center; font-size: 7pt; color: #ccc; font-family: sans-serif; padding-top: 5mm; }
@media screen { .print-footer { display: none; } }
@media print  { .print-footer { display: block !important; } }


/* ============================================================
   7. SIDE CARDS (col-left & col-right — blue zone)
   ============================================================ */

/* Rating card & generic card */
.rcard {
  background: var(--color-cta-light);
  border: 1px solid var(--color-cta-border);
  border-radius: var(--r10); padding: .55rem .75rem;
  display: flex; flex-direction: column; gap: .3rem;
}
.rcard-hd { font-size: .62rem; font-weight: 700; letter-spacing: .09em; text-transform: uppercase; color: var(--color-cta); display: flex; align-items: center; gap: .3rem; }

/* Stars */
.stars { display: flex; gap: 0; }
.star  { font-size: 1.05rem; color: var(--color-text-ghost); background: none; border: none; cursor: pointer; line-height: 1; min-width: 28px; min-height: 28px; display: flex; align-items: center; justify-content: center; transition: color .1s, transform .1s; }
.star:hover, .star.on { color: var(--color-cta); transform: scale(1.12); }

.report-lnk { font-size: .68rem; color: var(--color-text-faint); cursor: pointer; transition: color .12s; text-align: left; min-height: 28px; display: flex; align-items: center; }
.report-lnk:hover { color: #ef4444; text-decoration: underline; }

/* Share row */
.share-row { display: grid; grid-template-columns: repeat(6,1fr); gap: .25rem; }
.share-btn {
  min-height: 32px;
  border: 1px solid var(--color-cta-border); border-radius: var(--r8);
  background: var(--color-cta-surface);
  display: flex; align-items: center; justify-content: center;
  cursor: pointer; transition: all .15s; color: var(--color-text-muted);
}
.share-btn:hover  { border-color: var(--color-cta-border); background: var(--color-cta-light); transform: translateY(-1px); box-shadow: var(--sh0); }
.share-btn:active { transform: translateY(0); }
.share-btn svg { width: 16px; height: 16px; flex-shrink: 0; }

/* YMAL */
.ymal { background: var(--color-cta-light); border: 1px solid var(--color-cta-border); border-radius: var(--r10); padding: .55rem .75rem; }
.ymal-hd { font-size: .62rem; font-weight: 700; letter-spacing: .09em; text-transform: uppercase; color: var(--color-cta); margin-bottom: .4rem; display: flex; align-items: center; gap: .3rem; }
.ymal-hd::after { content: ''; flex: 1; height: 1px; background: linear-gradient(90deg, var(--color-cta-border), transparent); }
.ymal-list { display: flex; flex-direction: column; gap: .2rem; }

/* About / description box — collapsible, blue */
.desc-box { background: var(--color-cta-light); border: 1.5px solid var(--color-cta-border); border-radius: var(--r14); overflow: hidden; }
.desc-box-toggle {
  width: 100%; display: flex; align-items: center; justify-content: space-between;
  gap: .4rem; padding: .75rem 1rem; cursor: pointer;
  background: transparent; border: none; text-align: left;
}
.desc-box-toggle:hover { background: rgba(41,121,200,.06); }
.desc-box-hd-label { font-size: .68rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: var(--color-cta); display: flex; align-items: center; gap: .35rem; }
.desc-box-hd-label::before { content: ''; display: inline-block; width: 6px; height: 6px; border-radius: 50%; background: var(--color-cta); opacity: .55; }
.desc-toggle-icon { color: var(--color-cta); opacity: .7; }
.desc-body   { font-size: .83rem; line-height: 1.65; color: var(--color-text-secondary); padding: 0 1rem .85rem; }
.desc-body p { margin-bottom: .55rem; }
.desc-body p:last-child { margin-bottom: 0; }
.desc-tip    { display: flex; gap: .4rem; align-items: flex-start; font-size: .78rem; color: var(--color-text-muted); background: #deeef9; border-radius: var(--r8); padding: .55rem .7rem; margin-top: .5rem; }

/* Blue zone overrides for eyebrow / badges in col-left */
.col-left .eyebrow { color: var(--color-cta); background: #deeef9; border-color: rgba(41,121,200,.2); }
.col-left .page-title em { color: var(--color-cta); }
.col-left .badge   { border-color: var(--color-cta-border); color: #1a6aaa; }


/* ============================================================
   8. AD SLOTS
   ============================================================ */
.ad-tag { font-size: .46rem; font-weight: 700; letter-spacing: .14em; text-transform: uppercase; color: var(--color-text-faint); font-family: var(--fm); }
.ad-dim { font-size: .52rem; color: var(--color-text-faint); font-family: var(--fm); padding: .08rem .32rem; border: 1px solid var(--color-border); border-radius: 3px; }

/* Green zone ad slots */
.ad-320x50  { width: 100%; min-height: 40px;  background: var(--color-bg); border: 1px solid var(--color-border); border-radius: var(--r8); display: flex; align-items: center; justify-content: center; gap: .5rem; }
.ad-300x250 { width: 100%; min-height: 250px; background: var(--color-bg); border: 1px solid var(--color-border); border-radius: var(--r14); display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .35rem; }

/* Blue zone ad slots override */
.col-left .ad-300x250,
.col-left .ad-320x50,
.col-right .ad-300x250,
.col-right .ad-320x50,
.tablet-bottom .ad-300x250,
.tablet-bottom .ad-320x50 {
  background: var(--color-cta-surface);
  border-color: var(--color-cta-border);
}


/* ============================================================
   9. MOBILE — 3-page snap scroll
   ============================================================ */
.mobile-scroll {
  height: calc(100vh - var(--nav-h));
  height: calc(100dvh - var(--nav-h));
  overflow-y: scroll; overflow-x: hidden;
  scroll-snap-type: y mandatory;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior-y: contain;
  background: var(--color-bg-page);
}
.m-page {
  height: calc(100vh - var(--nav-h));
  height: calc(100dvh - var(--nav-h));
  flex-shrink: 0;
  scroll-snap-align: start; scroll-snap-stop: always;
  display: flex; flex-direction: column;
  overflow: hidden;
  padding: .7rem .875rem calc(.7rem + var(--action-h));
  gap: .55rem;
}
#mPage0 { gap: .3rem; padding-top: .5rem; padding-bottom: calc(.5rem + var(--action-h)); }
#mPage0 .page-title { font-size: 1.25rem; margin-bottom: .15rem; line-height: 1.2; }
#mPage0 .eyebrow    { margin-bottom: .2rem; font-size: .55rem; padding: .15rem .5rem; }
#mPage0 .badges     { display: none; }
#mPage0 .m-page-ad  { flex-shrink: 0; padding-top: .3rem; }
#mPage2 { padding-bottom: .75rem; overflow: hidden; }

/* Pager dots */
.m-pager { position: fixed; right: .65rem; top: 50%; transform: translateY(-50%); z-index: 100; display: flex; flex-direction: column; gap: .45rem; }
.m-pager-dot { position: relative; width: 7px; height: 7px; border-radius: 50%; background: var(--color-text-ghost); transition: background .2s, transform .2s; cursor: pointer; }
.m-pager-dot::before { content: ''; position: absolute; inset: -18px; }
.m-pager-dot.active  { background: var(--color-accent); transform: scale(1.4); }

/* Page label + number */
.m-page-label { display: flex; align-items: center; gap: .4rem; font-size: .56rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: var(--color-text-faint); flex-shrink: 0; }
.m-page-num   { width: 20px; height: 20px; border-radius: 50%; background: var(--color-bg-green); border: 1px solid var(--color-border); display: flex; align-items: center; justify-content: center; font-size: .56rem; font-weight: 700; color: var(--color-text-muted); font-family: var(--fm); flex-shrink: 0; }
.m-page-num.active { background: var(--color-accent); border-color: var(--color-accent); color: #fff; }

.m-page-ad { flex-shrink: 0; margin-top: auto; padding-top: .5rem; }

/* Mobile paper viewport */
.m-paper-vp {
  flex: 1; min-height: 260px;
  max-height: calc(100dvh - var(--nav-h) - 210px);
  display: flex; align-items: flex-start; justify-content: center;
  padding: 1rem;
  background: var(--color-accent-surface);
  background-image: radial-gradient(circle, rgba(0,0,0,.07) 1px, transparent 1px);
  background-size: 18px 18px; background-position: 9px 9px;
  overflow: hidden;
}

/* Swipe hint */
.swipe-hint {
  position: fixed;
  bottom: calc(var(--action-h) + env(safe-area-inset-bottom,0px) + .75rem);
  left: 50%; transform: translateX(-50%);
  z-index: 120;
  display: flex; align-items: center; gap: .4rem;
  background: rgba(17,24,39,.72); backdrop-filter: blur(8px);
  color: #fff; font-size: .68rem; font-weight: 600; letter-spacing: .04em;
  padding: .38rem .8rem; border-radius: 99px;
  pointer-events: none; opacity: 1; transition: opacity .4s; white-space: nowrap;
}
.swipe-hint.hidden { opacity: 0; }
@media (min-width: 768px) { .swipe-hint { display: none; } }

/* Mobile sticky action bar */
.m-sticky-bar {
  position: fixed; bottom: 0; left: 0; right: 0; z-index: 150;
  height: calc(var(--action-h) + env(safe-area-inset-bottom, 0px));
  padding-bottom: env(safe-area-inset-bottom, 0px);
  background: rgba(255,255,255,.97); backdrop-filter: blur(20px);
  border-top: 1px solid var(--color-border);
  display: flex; align-items: center; gap: .4rem;
  padding-left: .875rem; padding-right: .875rem;
  box-shadow: 0 -4px 16px rgba(0,0,0,.08);
}
.m-sticky-bar .btn-sm-shuf-full {
  flex: 1; height: 46px;
  background: var(--color-accent); color: #fff;
  border: none; border-radius: var(--r10);
  font-size: .9rem; font-weight: 700;
  display: flex; align-items: center; justify-content: center; gap: .5rem;
  transition: background .15s;
  box-shadow: 0 2px 6px rgba(46,139,87,.25);
}
.m-sticky-bar .btn-sm-shuf-full:hover  { background: var(--color-accent-hover); }
.m-sticky-bar .btn-sm-shuf-full:active { transform: scale(.98); }
.m-sticky-bar .btn-sm-shuf  { width: 42px; height: 42px; flex-shrink: 0; border: 1px solid var(--color-border); border-radius: var(--r10); background: var(--color-bg-green); color: var(--color-text-muted); display: flex; align-items: center; justify-content: center; transition: all .12s; }
.m-sticky-bar .btn-sm-shuf:hover { border-color: var(--color-text-faint); color: var(--color-text); background: var(--color-bg); }
.m-sticky-bar .btn-sm-print { height: 42px; padding: 0 .95rem; border: 1px solid var(--color-border); border-radius: var(--r10); font-size: .83rem; font-weight: 600; color: var(--color-text-secondary); background: var(--color-bg); display: flex; align-items: center; gap: .38rem; transition: all .12s; }
.m-sticky-bar .btn-sm-print:hover { border-color: var(--color-text-faint); color: var(--color-text); }
.m-sticky-bar .btn-sm-dl { flex: 1; height: 42px; background: var(--color-cta); color: #fff; border-radius: var(--r10); font-size: .83rem; font-weight: 700; display: flex; align-items: center; justify-content: center; gap: .38rem; transition: all .15s; box-shadow: 0 1px 4px rgba(41,121,200,.32); }
.m-sticky-bar .btn-sm-dl:hover  { background: var(--color-cta-hover); }
.m-sticky-bar .btn-sm-dl:active,
.m-sticky-bar .btn-sm-print:active { transform: scale(.98); }

/* Download area (mobile page 3) */
.download-area { background: var(--color-bg); border: 1px solid var(--color-border); border-radius: var(--r20); box-shadow: var(--sh2); padding: 1.35rem 1.1rem; display: flex; flex-direction: column; gap: .8rem; align-items: center; text-align: center; }
.dl-icon  { width: 52px; height: 52px; border-radius: 50%; background: var(--color-accent-light); border: 1.5px solid rgba(46,139,87,.2); display: flex; align-items: center; justify-content: center; color: var(--color-accent); }
.dl-title { font-size: .98rem; font-weight: 600; color: var(--color-text); letter-spacing: -.01em; }
.dl-sub   { font-size: .73rem; color: var(--color-text-muted); line-height: 1.55; }
.dl-btns  { display: flex; gap: .5rem; width: 100%; }
.btn-dl-primary { flex: 1; height: 46px; background: var(--color-cta); color: #fff; border-radius: var(--r10); font-size: .84rem; font-weight: 700; display: flex; align-items: center; justify-content: center; gap: .4rem; transition: all .15s; box-shadow: 0 1px 4px rgba(41,121,200,.32), 0 4px 14px rgba(41,121,200,.2); }
.btn-dl-primary:hover  { background: var(--color-cta-hover); }
.btn-dl-primary:active { transform: scale(.98); }
.btn-dl-sec  { flex: 1; height: 46px; border: 1px solid var(--color-border); border-radius: var(--r10); font-size: .84rem; font-weight: 600; color: var(--color-text-secondary); background: var(--color-bg); display: flex; align-items: center; justify-content: center; gap: .4rem; transition: all .12s; }
.btn-dl-sec:hover  { border-color: var(--color-text-faint); color: var(--color-text); }
.btn-dl-sec:active { transform: scale(.98); }


/* ============================================================
   10. (reserved)
   ============================================================ */


/* ============================================================
   11. LAYOUT — Show/hide helpers
   ============================================================ */
.mobile-only    { display: block; }
.desktop-layout { display: none; }
.tablet-bottom  { display: none; }


/* ============================================================
   12. TABLET >= 768px  — 2-col: ctrl + preview
   ============================================================ */
@media (min-width: 768px) {
  .mobile-scroll, .mobile-only, .m-sticky-bar, .m-pager { display: none; }
  .desktop-layout { display: block; }

  .page {
    width: 100%; max-width: 1360px; margin: 0 auto;
    padding: .85rem 1rem 2rem;
    display: grid;
    grid-template-columns: 240px minmax(0,1fr);
    grid-template-areas:
      "ctrl  preview"
      "ctrl  bottom";
    column-gap: .85rem; row-gap: .75rem;
    align-items: start;
  }
  .col-right { display: none; }

  /* ctrl-about: About header lives at top of ctrl col — blue zone */
  .ctrl-about {
    background: var(--color-cta-light);
    border: 1px solid var(--color-cta-border);
    border-radius: var(--r14);
    box-shadow: none;
    padding: .85rem 1rem;
    display: flex; flex-direction: column; gap: .5rem;
    flex-shrink: 0;
  }
  .ctrl-about-hdr { display: flex; flex-direction: column; }
  .ctrl-title { font-size: 1.35rem; margin-bottom: .25rem; }
  .ctrl-tags-row {
    display: flex; flex-wrap: wrap; gap: .25rem;
    margin-top: .1rem;
  }

  .col-ctrl {
    grid-area: ctrl;
    position: sticky; top: calc(var(--nav-h) + .75rem);
    height: calc(100dvh - var(--nav-h) - 1.5rem);
    /* ไม่ scroll ที่ระดับ column — ปล่อยให้ .ctrl-body scroll ข้างใน card แทน
       เพราะ scrollbar ของ column จะโผล่ทับ border ของ .controls card */
    overflow: visible;
    display: flex; flex-direction: column; gap: .7rem;
  }
  .col-ctrl .controls { flex: 1; min-height: 0; }

  .col-preview { grid-area: preview; display: flex; flex-direction: column; gap: .7rem; }
  .preview-card {
    display: flex; flex-direction: column;
    height: calc(100dvh - var(--nav-h) - 1.5rem); min-height: 480px;
  }
  .paper-vp { flex: 1; min-height: 0; overflow: hidden; }

  /* ad-728x90: leaderboard below preview */
  .ad-728x90 {
    width: 100%; min-height: 90px;
    background: var(--color-cta-light);
    border: 1px solid var(--color-cta-border);
    border-radius: var(--r10);
    display: flex; align-items: center; justify-content: center; gap: .5rem;
  }

  /* tablet-bottom: YMAL + Share below ad */
  .tablet-bottom {
    grid-area: bottom;
    display: grid; grid-template-columns: 1fr 1fr;
    gap: .75rem; align-items: start;
  }
  .tablet-bottom .rcard:first-child  { grid-column: 1; }
  .tablet-bottom .rcard:nth-child(2) { grid-column: 2; }
  .tablet-bottom .ymal               { grid-column: 1 / -1; }

  /* hide tablet-only header duplicates */
  .tablet-hdr-only { display: none !important; }
  #tAboutSlot      { display: none !important; }
}


/* ============================================================
   13. DESKTOP >= 1100px  — 3-col: ctrl 260px | preview flex | right 260px
   ============================================================ */
@media (min-width: 1100px) {
  .page {
    grid-template-columns: 320px minmax(0,1fr) 220px;
    grid-template-areas: "ctrl preview right";
    column-gap: .85rem; row-gap: 0;
    align-items: stretch;
    padding: .9rem 1.25rem 1.5rem;
  }

  .col-ctrl {
    grid-area: ctrl;
    position: sticky; top: calc(var(--nav-h) + .85rem);
    height: calc(100dvh - var(--nav-h) - 1.7rem);
    display: flex; flex-direction: column;
    overflow: visible;
  }
  /* ctrl-about is outside .controls — don't let it scroll away */
  .ctrl-about {
    background: var(--color-cta-light);
    border: 1px solid var(--color-cta-border);
    border-radius: var(--r14);
    padding: .85rem 1rem;
    display: flex;
    flex-direction: column;
    gap: .5rem;
    flex-shrink: 0;
    max-height: 38vh;
    overflow-y: auto;
    scrollbar-width: thin; scrollbar-color: var(--color-border) transparent;
  }
  .ctrl-about::-webkit-scrollbar       { width: 3px; }
  .ctrl-about::-webkit-scrollbar-thumb { background: var(--color-border); border-radius: 3px; }
  .col-ctrl .controls { flex: 1; min-height: 0; }

  .col-preview {
    grid-area: preview;
    display: flex; flex-direction: column; gap: .7rem;
    position: sticky; top: calc(var(--nav-h) + .85rem);
    height: calc(100dvh - var(--nav-h) - 1.7rem);
  }
  .preview-card {
    display: flex; flex-direction: column;
    flex: 1; min-height: 0; overflow: hidden;
  }
  .paper-vp { flex: 1; min-height: 0; overflow: hidden; }

  .col-right {
    grid-area: right;
    display: flex !important; /* override tablet display:none */
    position: sticky; top: calc(var(--nav-h) + .85rem);
    height: calc(100dvh - var(--nav-h) - 1.7rem);
    overflow-y: auto; overflow-x: hidden;
    scrollbar-width: thin; scrollbar-color: var(--color-border) transparent;
    flex-direction: column; gap: .7rem;
  }
  .col-right::-webkit-scrollbar       { width: 4px; }
  .col-right::-webkit-scrollbar-thumb { background: var(--color-border); border-radius: 4px; }

  /* tablet-bottom is hidden on desktop — right col takes its role */
  .tablet-bottom { display: none; }
}


/* ============================================================
   14. LARGE DESKTOP >= 1440px
   ============================================================ */
@media (min-width: 1440px) {
  :root { --col-ctrl: 340px; }
  .page {
    grid-template-columns: 340px minmax(0,1fr) 240px;
    padding: .9rem 1.5rem; column-gap: 1rem;
  }
}


/* ============================================================
   15. PRINT
   ============================================================ */

/*
   @page rules must be in a static stylesheet — Chrome ignores dynamically
   injected @page rules (via JS innerHTML) because it caches @page at load time.
   We use data-orientation and data-paper attributes on <html> to select the
   correct rule. print.js sets these attributes instead of injecting a <style>.
*/

/* ── Named @page per size+orientation combo ──
   Chrome picks the correct named page via the `page` property on .paper.fpk-*
   shell.js sets class fpk-{size}-{orientation} on #dPreviewPg / #mPreviewPg
   via _syncPreviewPageClass() whenever the user changes settings.
   NO default @page rule here — the named page on the element is the sole authority. */

/*
 * margin: 0 — .paper จัดการ padding เองทั้งหมด (12mm 14mm 18mm)
 * การใช้ margin: 0 ยังซ่อน browser header/footer โดยอัตโนมัติ
 * ผู้ใช้ไม่ต้อง untick "Headers and footers" เองใน print dialog
 */
@page fpk-a4-portrait      { size: 210mm 297mm portrait;         margin: 0; }
@page fpk-a4-landscape     { size: 297mm 210mm landscape;        margin: 0; }
@page fpk-letter-portrait  { size: 215.9mm 279.4mm portrait;     margin: 0; }
@page fpk-letter-landscape { size: 279.4mm 215.9mm landscape;    margin: 0; }
@page fpk-legal-portrait   { size: 215.9mm 355.6mm portrait;     margin: 0; }
@page fpk-legal-landscape  { size: 355.6mm 215.9mm landscape;    margin: 0; }
@page fpk-a3-portrait      { size: 297mm 420mm portrait;         margin: 0; }
@page fpk-a3-landscape     { size: 420mm 297mm landscape;        margin: 0; }

@media print {
  /* Assign named page via direct classes on .paper element.
     Chrome does NOT support the `page` property through ancestor/descendant
     selectors like html[data-*] .paper { page: ... } — it must be a direct
     selector on the element itself.
     shell.js adds class fpk-{size}-{orientation} to #dPreviewPg / #mPreviewPg
     via _syncPreviewPageClass() whenever params change. */
  .paper.fpk-a4-portrait      { page: fpk-a4-portrait; }
  .paper.fpk-a4-landscape     { page: fpk-a4-landscape; }
  .paper.fpk-letter-portrait  { page: fpk-letter-portrait; }
  .paper.fpk-letter-landscape { page: fpk-letter-landscape; }
  .paper.fpk-legal-portrait   { page: fpk-legal-portrait; }
  .paper.fpk-legal-landscape  { page: fpk-legal-landscape; }
  .paper.fpk-a3-portrait      { page: fpk-a3-portrait; }
  .paper.fpk-a3-landscape     { page: fpk-a3-landscape; }

  /* print.css section 1 handles the whitelist hide/show logic.
     global.css only needs to ensure base layout resets for the print path.
     NOTE: .paper already uses mm units on screen — no px→mm overrides needed here. */
  html, body { overflow: visible !important; height: auto !important; padding: 0 !important; margin: 0 !important; background: #fff !important; }
  .paper-vp { padding: 0 !important; background: none !important; background-image: none !important; overflow: visible !important; min-height: auto !important; max-height: none !important; }
  /* zoom=1 at print: browser already has the real mm layout */
  .paper-scaler { zoom: 1 !important; }

  /* Strip screen-only decoration from .paper */
  .paper {
    box-shadow: none !important;
    border-radius: 0 !important;
    page-break-after: always;
    break-after: page;
  }
  .paper:last-child { page-break-after: auto; break-after: auto; }

  .print-footer { display: block !important; }
}


/* ============================================================
   16. SIDE CARDS — Tags / Affiliate / Donate
   ============================================================ */

/* Base side card */
.side-card {
  border-radius: var(--r14);
  overflow: hidden;
}

.side-card-hd {
  font-size: .62rem; font-weight: 700;
  letter-spacing: .09em; text-transform: uppercase;
  display: flex; align-items: center; gap: .32rem;
  margin-bottom: .4rem;
}

/* ── Tags card ── */
.side-card--tags {
  background: var(--color-cta-light);
  border: 1px solid var(--color-cta-border);
  padding: .9rem 1rem;
}
.side-card--tags .side-card-hd { color: var(--color-cta); }

.tags-row {
  display: flex; flex-wrap: wrap; gap: .3rem;
}
.tags-placeholder {
  font-size: .72rem; color: var(--color-text-faint);
}

/* small tag pill — links to search */
.tag-pill-sm {
  display: inline-flex; align-items: center;
  height: 26px; padding: 0 .65rem;
  border: 1px solid var(--color-cta-border);
  border-radius: 99px;
  font-size: .7rem; font-weight: 600;
  color: var(--color-cta);
  background: var(--color-cta-surface);
  transition: all .12s; cursor: pointer;
  text-decoration: none;
}
.tag-pill-sm:hover {
  background: var(--color-cta-light);
  border-color: var(--color-cta);
  color: var(--color-cta-hover);
  transform: translateY(-1px);
}

/* ── Affiliate card ── */
.side-card--affiliate {
  background: var(--color-bg);
  border: 1px solid var(--color-border);
  padding: .55rem .75rem;
}
.side-card--affiliate .side-card-hd { color: var(--color-text-muted); }

.affiliate-list {
  display: flex; flex-direction: column; gap: .2rem;
}
.affiliate-item {
  display: flex; align-items: center; gap: .45rem;
  padding: .35rem .5rem;
  border: 1px solid var(--color-border-subtle);
  border-radius: var(--r6);
  background: var(--color-bg-subtle);
  text-decoration: none;
  transition: all .12s;
  min-height: 36px;
}
.affiliate-item:hover {
  background: var(--color-bg-green);
  border-color: var(--color-border);
  transform: translateY(-1px);
  box-shadow: var(--sh0);
}
.affiliate-icon {
  font-size: .95rem; flex-shrink: 0;
  width: 22px; text-align: center;
}
.affiliate-body {
  display: flex; flex-direction: column; flex: 1; min-width: 0; gap: .05rem;
}
.affiliate-title {
  font-size: .74rem; font-weight: 600;
  color: var(--color-text); line-height: 1.2;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.affiliate-desc {
  font-size: .62rem; color: var(--color-text-muted); line-height: 1.2;
}
.affiliate-arrow {
  flex-shrink: 0; color: var(--color-text-ghost);
  transition: transform .12s, color .12s;
}
.affiliate-item:hover .affiliate-arrow {
  transform: translateX(2px);
  color: var(--color-accent);
}
.affiliate-disclosure {
  font-size: .56rem; color: var(--color-text-ghost);
  text-align: center; margin-top: .35rem;
  line-height: 1.4;
}

/* ── Donate color tokens (warm amber zone) ── */
:root {
  --color-donate-bg-start: #fff8ee;
  --color-donate-bg-end:   #fff3e0;
  --color-donate-border:   #f5d49a;
  --color-donate-title:    #7a4f10;
  --color-donate-sub:      #9c6f2e;
  --color-donate-btn:      #f59e0b;
  --color-donate-btn-hover:#d97706;
}

/* ── Donate card ── */
.side-card--donate {
  background: linear-gradient(135deg, var(--color-donate-bg-start) 0%, var(--color-donate-bg-end) 100%);
  border: 1px solid var(--color-donate-border);
  padding: .85rem 1rem;
  min-height: 56px;
  display: flex; align-items: center;
}

.donate-inner {
  display: flex; flex-direction: row;
  align-items: center; gap: .5rem;
  width: 100%;
}
.donate-icon {
  font-size: 1rem; flex-shrink: 0; line-height: 1;
}
.donate-copy { display: flex; flex-direction: column; gap: .15rem; flex: 1; min-width: 0; }
.donate-title {
  font-size: .78rem; font-weight: 700;
  color: var(--color-donate-title);
}
.btn-donate {
  display: inline-flex; align-items: center; justify-content: center;
  height: 30px; padding: 0 .85rem; flex-shrink: 0;
  background: var(--color-donate-btn); color: var(--color-bg);
  border-radius: var(--r8); border: none;
  font-size: .72rem; font-weight: 700;
  text-decoration: none;
  transition: all .15s;
  box-shadow: 0 2px 8px rgba(245,158,11,.3);
}
.btn-donate:hover {
  background: var(--color-donate-btn-hover);
  box-shadow: 0 3px 12px rgba(245,158,11,.4);
  transform: translateY(-1px);
}
.btn-donate:active { transform: scale(.98); }


/* ============================================================
   17. NAV SEARCH BAR  (V3 — เพิ่มในทุก page)
   ============================================================ */
.nav-search-wrap {
  flex: 1; min-width: 0; max-width: 400px;
}
.nav-search {
  display: flex; align-items: center; gap: .4rem;
  height: 34px; padding: 0 .75rem;
  border: 1.5px solid var(--color-border);
  border-radius: 99px;
  background: var(--color-bg-green);
  transition: border-color .15s, box-shadow .15s;
}
.nav-search:focus-within {
  border-color: var(--color-accent);
  box-shadow: 0 0 0 3px rgba(46,139,87,.12);
  background: var(--color-bg);
}
.nav-search__icon {
  width: 14px; height: 14px; flex-shrink: 0;
  color: var(--color-text-faint);
}
.nav-search__input {
  flex: 1; min-width: 0; border: none; background: transparent;
  font-family: var(--ff); font-size: .82rem; color: var(--color-text);
  outline: none;
}
.nav-search__input::placeholder { color: var(--color-text-ghost); }

@media (max-width: 480px) {
  .nav-search-wrap { max-width: none; }
}


/* ============================================================
   18. LANG MENU  (V3 dropdown)
   ============================================================ */
.lang-menu {
  position: absolute; top: calc(var(--nav-h) - 4px); right: 1rem;
  background: var(--color-bg); border: 1.5px solid var(--color-border);
  border-radius: var(--r10); box-shadow: var(--sh2);
  min-width: 120px; overflow: hidden; z-index: 500;
}
.lang-opt {
  display: block; width: 100%; text-align: left;
  padding: .55rem .9rem;
  font-size: .8rem; font-weight: 500; color: var(--color-text-secondary);
  background: none; border: none; cursor: pointer;
  transition: background .1s;
}
.lang-opt:hover { background: var(--color-bg-green); color: var(--color-text); }


/* ============================================================
   19. FOOTER  (V3)
   ============================================================ */
.footer {
  border-top: 1px solid var(--color-border-subtle);
  background: var(--color-bg);
  padding: 2rem 1.25rem 3rem;
}
.footer-inner {
  max-width: 1360px; margin: 0 auto;
  display: flex; flex-direction: column; gap: 1rem; align-items: center;
  text-align: center;
}
.footer-brand { display: flex; flex-direction: column; gap: .25rem; }
.footer-logo {
  font-family: var(--fs); font-size: 1.1rem; font-style: italic;
  color: var(--color-text); letter-spacing: -.02em;
}
.footer-logo span { color: var(--color-accent); font-style: normal; }
.footer-tagline { font-size: .75rem; color: var(--color-text-muted); }
.footer-links {
  display: flex; flex-wrap: wrap; gap: .3rem .9rem;
  justify-content: center;
}
.footer-links a {
  font-size: .75rem; color: var(--color-text-muted);
  transition: color .12s;
}
.footer-links a:hover { color: var(--color-accent); }
.footer-donate { color: var(--color-accent) !important; font-weight: 600; }
.footer-copy { font-size: .68rem; color: var(--color-text-ghost); }

@media (min-width: 768px) {
  .footer-inner { flex-direction: row; text-align: left; align-items: flex-start; }
  .footer-links { justify-content: flex-start; }
}


/* ============================================================
   20. HOME PAGE  (V3)
   ============================================================ */
.main-wrap {
  max-width: 1360px; margin: 0 auto;
  padding: 1.5rem 1.25rem 3rem;
}
.page-slot { /* no style — just a container */ }

.home-hero {
  padding: 2rem 0 1.5rem;
  border-bottom: 1px solid var(--color-border-subtle);
  margin-bottom: 2rem;
}
.hero-sub {
  font-size: .95rem; color: var(--color-text-muted); line-height: 1.6;
  max-width: 520px; margin-top: .5rem;
}

.home-section { margin-bottom: 2.5rem; }
.section-hd {
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: .9rem;
}
.section-title {
  font-family: var(--fs); font-size: 1.25rem; font-weight: 400;
  letter-spacing: -.02em; color: var(--color-text);
}
.section-more {
  font-size: .78rem; font-weight: 600; color: var(--color-accent);
  transition: color .12s;
}
.section-more:hover { color: var(--color-accent-hover); }

/* Tag cloud */
.tag-cloud {
  display: flex; flex-wrap: wrap; gap: .4rem;
  margin-bottom: 1.5rem;
}
.tag-pill {
  display: inline-flex; align-items: center; gap: .3rem;
  height: 30px; padding: 0 .85rem;
  border: 1.5px solid var(--color-border); border-radius: 99px;
  font-size: .76rem; font-weight: 600; color: var(--color-text-muted);
  background: var(--color-bg-green);
  transition: all .12s; cursor: pointer; text-decoration: none;
}
.tag-pill:hover, .tag-pill.active {
  border-color: var(--color-accent); color: var(--color-accent);
  background: var(--color-accent-light);
}
.tag-pill__count {
  font-size: .65rem; color: var(--color-text-ghost);
  font-family: var(--fm);
}

/* Tool grid */
.tool-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: .65rem;
}
.tool-card {
  display: flex; align-items: flex-start; gap: .75rem;
  padding: .9rem 1rem; border-radius: var(--r14);
  border: 1.5px solid var(--color-border);
  background: var(--color-bg);
  text-decoration: none; color: var(--color-text);
  transition: all .15s; cursor: pointer;
  box-shadow: var(--sh0);
  min-height: 44px;
}
.tool-card:hover {
  border-color: var(--color-accent); background: var(--color-accent-light);
  transform: translateY(-2px); box-shadow: var(--sh2);
}
.tool-card__icon { font-size: 1.5rem; flex-shrink: 0; line-height: 1; }
.tool-card__body { display: flex; flex-direction: column; gap: .2rem; min-width: 0; }
.tool-card__title { font-size: .84rem; font-weight: 600; color: var(--color-text); line-height: 1.3; }
.tool-card__desc  { font-size: .72rem; color: var(--color-text-muted); line-height: 1.4; }
.tool-card__tags  { display: flex; flex-wrap: wrap; gap: .2rem; margin-top: .3rem; }
.tool-card__tag   {
  font-size: .6rem; font-weight: 600; text-transform: uppercase; letter-spacing: .04em;
  color: var(--color-text-faint); background: var(--color-bg-green);
  border: 1px solid var(--color-border-subtle); border-radius: 99px;
  padding: .1rem .4rem;
}

/* Home policy bar */
.home-policy {
  display: flex; flex-wrap: wrap; gap: .6rem;
  padding: 1rem 1.25rem;
  background: var(--color-bg-green); border-radius: var(--r14);
  border: 1px solid var(--color-border-subtle);
}
.policy-item {
  display: flex; align-items: center; gap: .35rem;
  font-size: .8rem; font-weight: 600; color: var(--color-text-secondary);
}


/* ============================================================
   21. SEARCH PAGE  (V3)
   ============================================================ */
.search-page { display: flex; flex-direction: column; gap: 1.25rem; }
.search-header { display: flex; flex-direction: column; gap: .75rem; }
.search-title {
  font-family: var(--fs); font-size: 1.5rem; font-weight: 400;
  letter-spacing: -.02em; color: var(--color-text);
}
.search-bar-big {
  display: flex; align-items: center; gap: .6rem;
  height: 48px; padding: 0 1rem;
  border: 2px solid var(--color-border); border-radius: 99px;
  background: var(--color-bg); max-width: 600px;
  transition: border-color .15s, box-shadow .15s;
}
.search-bar-big:focus-within {
  border-color: var(--color-accent);
  box-shadow: 0 0 0 4px rgba(46,139,87,.1);
}
.search-bar-big svg {
  width: 18px; height: 18px; flex-shrink: 0; color: var(--color-text-faint);
}
.search-bar-big input {
  flex: 1; border: none; background: transparent; outline: none;
  font-family: var(--ff); font-size: .95rem; color: var(--color-text);
}
.search-bar-big input::placeholder { color: var(--color-text-ghost); }

/* Tag filter row */
.tag-filter {
  display: flex; flex-wrap: wrap; gap: .35rem;
}

/* Search results */
.search-results { }
.no-results {
  text-align: center; padding: 3rem 1rem;
  font-size: .9rem; color: var(--color-text-muted);
}


/* ============================================================
   22. GENERATOR — About block  (V3)
   ============================================================ */
.about-block {
  display: flex; flex-direction: column; gap: .45rem;
}
.about-text {
  font-size: .82rem; line-height: 1.65; color: var(--color-text-secondary);
}
.about-tip {
  display: flex; gap: .4rem; align-items: flex-start;
  font-size: .78rem; color: var(--color-text-muted);
  background: rgba(41,121,200,.07); border-radius: var(--r8);
  padding: .55rem .7rem;
}


/* ============================================================
   23. YMAL CARD  (V3 grid style — ต่างจาก V2 list)
   ============================================================ */
.ymal-card {
  display: flex; align-items: center; gap: .4rem;
  padding: .32rem .5rem; border-radius: var(--r6);
  border: 1px solid transparent;
  background: transparent;
  text-decoration: none; color: var(--color-text-secondary);
  font-size: .76rem; font-weight: 500;
  transition: all .12s; min-height: 30px;
}
.ymal-card:hover {
  border-color: var(--color-cta-border);
  background: var(--color-cta-light);
  color: var(--color-text);
}
.ymal-card__icon { font-size: .95rem; flex-shrink: 0; }
.ymal-card__title { flex: 1; line-height: 1.25; }


/* ============================================================
   24. DESKTOP-ONLY helper
   ============================================================ */
.desktop-only { display: block; }
@media (max-width: 767px) { .desktop-only { display: none; } }



/* ============================================================
   25. AD SLOT  (V3 generic — shell.js ใช้ data-ad-slot attribute)
   ============================================================ */
[data-ad-slot], .ad-slot {
  background: var(--color-cta-light);
  border: 1px dashed var(--color-cta-border);
  border-radius: var(--r10);
  display: flex; align-items: center; justify-content: center;
  font-size: .6rem; font-weight: 600; letter-spacing: .1em; text-transform: uppercase;
  color: var(--color-text-faint); font-family: var(--fm);
}



/* ============================================================
   26. GENERATOR FULL-VIEWPORT LAYOUT  (V3 — no page scroll)
   ============================================================ */

/* ── body/html: allow full-height stacking ── */
html, body {
  height: 100%;
}
body {
  display: flex;
  flex-direction: column;
}

/* Gen-wrap: fills remaining height between nav and gen-footer */
.gen-wrap {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
  overflow: hidden;           /* no outer page scroll */
  background: var(--color-bg-page);
}

/* Desktop-layout inside gen-wrap must also fill */
.gen-wrap .desktop-layout.desktop-only {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
}

/* main-wrap (non-generator pages) stays scrollable */
.main-wrap {
  flex: 1;
  overflow-y: auto;
}

/* ── Generator slim footer ── */
.gen-footer {
  flex-shrink: 0;
  border-top: 1px solid var(--color-border-subtle);
  background: var(--color-bg);
}
.gen-footer__inner {
  max-width: 1360px; margin: 0 auto;
  padding: .55rem 1.25rem;
  display: flex; align-items: center; justify-content: space-between;
  gap: 1rem; flex-wrap: wrap;
}
.gen-footer__links {
  display: flex; flex-wrap: wrap; gap: .2rem .75rem;
}
.gen-footer__links a {
  font-size: .7rem; color: var(--color-text-muted);
  transition: color .12s;
}
.gen-footer__links a:hover { color: var(--color-accent); }
.gen-footer__donate { color: var(--color-accent) !important; font-weight: 600; }
.gen-footer__copy { font-size: .65rem; color: var(--color-text-ghost); white-space: nowrap; }

/* ── Nav breadcrumb (generator only) ── */
.nav--generator { }
.nav-bc {
  flex: 1; min-width: 0;
  display: flex; align-items: center; gap: .2rem;
  overflow: hidden;
}
.nav-bc__link {
  font-size: .72rem; font-weight: 500; color: var(--color-text-muted);
  padding: .2rem .35rem; border-radius: var(--r6);
  white-space: nowrap;
  transition: color .12s, background .12s;
}
.nav-bc__link:hover { color: var(--color-accent); background: var(--color-accent-light); }
.nav-bc__sep { font-size: .7rem; color: var(--color-text-ghost); padding: 0 .05rem; }
.nav-bc__cur {
  font-size: .72rem; font-weight: 600; color: var(--color-text);
  padding: .2rem .48rem; border-radius: var(--r6);
  background: var(--color-bg-green); border: 1px solid var(--color-border);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}


/* ============================================================
   27. DESKTOP GENERATOR GRID — wider ctrl, smaller preview
   Override sections 12 & 13 for generator pages only
   ============================================================ */

/* Tablet >= 768px: ctrl wider 300px */
@media (min-width: 768px) {
  .gen-wrap .page {
    width: 100%; max-width: 1360px; margin: 0 auto;
    padding: .65rem 1rem .65rem;
    display: grid;
    grid-template-columns: 300px minmax(0,1fr);
    grid-template-areas:
      "ctrl  preview"
      "ctrl  bottom";
    column-gap: .75rem; row-gap: .65rem;
    align-items: start;
    height: 100%;
    box-sizing: border-box;
  }

  .gen-wrap .col-ctrl {
    grid-area: ctrl;
    position: sticky; top: calc(var(--nav-h) + .65rem);
    height: calc(100dvh - var(--nav-h) - var(--gen-footer-h, 42px) - 1.3rem);
    overflow: visible;
    display: flex; flex-direction: column; gap: .6rem;
  }

  .gen-wrap .col-preview {
    grid-area: preview;
    display: flex; flex-direction: column; gap: .6rem;
    height: calc(100dvh - var(--nav-h) - var(--gen-footer-h, 42px) - 1.3rem);
    position: sticky; top: calc(var(--nav-h) + .65rem);
    overflow: hidden;
  }

  .gen-wrap .preview-card {
    display: flex; flex-direction: column;
    flex: 1; min-height: 0; overflow: hidden;
  }
  .gen-wrap .paper-vp { flex: 1; min-height: 0; overflow: hidden; }
  .gen-wrap .col-right { display: none; }
}

/* Desktop >= 1100px: ctrl 360px | preview smaller | right 220px */
@media (min-width: 1100px) {
  .gen-wrap .page {
    grid-template-columns: 360px minmax(0,1fr) 300px;
    grid-template-areas: "ctrl preview right";
    column-gap: .75rem; row-gap: 0;
    align-items: stretch;
    padding: .65rem 1rem .65rem;
  }

  .gen-wrap .col-ctrl {
    position: sticky; top: calc(var(--nav-h) + .65rem);
    height: calc(100dvh - var(--nav-h) - var(--gen-footer-h, 42px) - 1.3rem);
    display: flex; flex-direction: column;
    overflow: visible;
  }

  .gen-wrap .col-preview {
    grid-area: preview;
    display: flex; flex-direction: column; gap: 0;
    position: sticky; top: calc(var(--nav-h) + .65rem);
    height: calc(100dvh - var(--nav-h) - var(--gen-footer-h, 42px) - 1.3rem);
    overflow: hidden;
  }

  .gen-wrap .col-right {
    grid-area: right;
    display: flex !important;
    position: sticky; top: calc(var(--nav-h) + .65rem);
    height: calc(100dvh - var(--nav-h) - var(--gen-footer-h, 42px) - 1.3rem);
    overflow-y: auto; overflow-x: hidden;
    scrollbar-width: thin; scrollbar-color: var(--color-border) transparent;
    flex-direction: column; gap: .6rem;
  }
  .gen-wrap .col-right::-webkit-scrollbar { width: 4px; }
  .gen-wrap .col-right::-webkit-scrollbar-thumb { background: var(--color-border); border-radius: 4px; }

  .gen-wrap .col-ctrl .ad-320x50 { flex-shrink: 0; }
  .gen-wrap .tablet-bottom { display: none; }
}

/* Large desktop >= 1440px: ctrl 380px */
@media (min-width: 1440px) {
  .gen-wrap .page {
    grid-template-columns: 380px minmax(0,1fr) 300px;
    padding: .65rem 1.5rem .65rem;
  }
}



/* ============================================================
   28. FONT & SIZE PREVIEW DROPDOWN  (fpd-*)
   ============================================================ */

/* Wrapper — relative for menu positioning */
.fpd-wrap { position: relative; }

/* Trigger button — looks like a select */
.fpd-trigger {
  display: flex; align-items: center; gap: .55rem;
  height: 40px; padding: 0 .85rem;
  border: 1.5px solid var(--color-border); border-radius: var(--r10);
  background: var(--color-bg-green); cursor: pointer;
  transition: border-color .15s, box-shadow .15s;
  user-select: none;
}
.fpd-trigger:hover {
  border-color: var(--color-accent); background: var(--color-bg);
}
.fpd-trigger--open {
  border-color: var(--color-accent);
  box-shadow: 0 0 0 3px rgba(46,139,87,.12);
  background: #fff;
}
.fpd-trigger-preview {
  font-size: 1.15rem; font-weight: 700; line-height: 1;
  color: var(--color-text); flex-shrink: 0; min-width: 28px;
  text-align: center;
}
.fpd-trigger-name {
  flex: 1; font-size: .85rem; font-weight: 600;
  color: var(--color-text-secondary); overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap;
}
.fpd-trigger-arrow {
  width: 14px; height: 14px; flex-shrink: 0;
  color: var(--color-text-faint);
  transition: transform .2s cubic-bezier(.34,1.2,.64,1);
}
.fpd-trigger--open .fpd-trigger-arrow { transform: rotate(180deg); }

/* Dropdown menu */
.fpd-menu {
  position: absolute; left: 0; right: 0;
  top: calc(100% + .35rem);
  background: var(--color-bg);
  border: 1.5px solid var(--color-border);
  border-radius: var(--r10);
  box-shadow: 0 8px 24px rgba(0,0,0,.12), 0 2px 6px rgba(0,0,0,.07);
  z-index: 400;
  /* closed state */
  max-height: 0; overflow: hidden; opacity: 0;
  pointer-events: none;
  transition: max-height .22s cubic-bezier(.4,0,.2,1), opacity .18s;
}
.fpd-menu--above {
  top: auto;
  bottom: calc(100% + .35rem);
  box-shadow: 0 -8px 24px rgba(0,0,0,.12), 0 -2px 6px rgba(0,0,0,.07);
}
.fpd-menu.fpd-open {
  max-height: 260px; opacity: 1; pointer-events: all;
}

/* Scrollable inner */
.fpd-scroll {
  overflow-y: auto; overflow-x: hidden;
  max-height: 256px;
  padding: .3rem;
  scrollbar-width: thin; scrollbar-color: var(--color-border) transparent;
}
.fpd-scroll::-webkit-scrollbar { width: 4px; }
.fpd-scroll::-webkit-scrollbar-thumb { background: var(--color-border); border-radius: 4px; }

/* Individual item */
.fpd-item {
  display: flex; align-items: center; gap: .6rem;
  padding: .45rem .65rem; border-radius: var(--r8);
  cursor: pointer; transition: background .1s;
  min-height: 40px;
}
.fpd-item:hover { background: var(--color-bg-green); }
.fpd-item--active {
  background: var(--color-accent-light);
}
.fpd-item--active:hover { background: var(--color-accent-light); }

/* Font item parts */
.fpd-preview {
  font-size: 1.2rem; font-weight: 600; line-height: 1;
  color: var(--color-text); flex-shrink: 0; min-width: 30px;
  text-align: center;
}
.fpd-name {
  flex: 1; font-size: .82rem; color: var(--color-text-secondary);
  line-height: 1.2;
}
.fpd-check {
  width: 13px; height: 13px; flex-shrink: 0;
  color: var(--color-accent); stroke-width: 2.5;
}

/* Size item parts */
.szd-preview {
  font-size: var(--fs-base, 14px);
  font-weight: 700; color: var(--color-text);
  flex-shrink: 0; min-width: 30px; text-align: center;
}
.szd-unit {
  flex: 1; font-size: .75rem; color: var(--color-text-faint);
  font-family: var(--fm);
}

