/* Cool, ink-and-envelope palette — deliberately NOT the warm cream/orange
   family camalochatools.com and gruyeranotes.com both use. Navy is the
   primary accent here (buttons, links, hovers); red is demoted to a single
   signature detail (the "X" in the wordmark) plus validation states; gold
   marks the curated "Featured" sidebar group only. See the risk-mitigation
   memo — an earlier version of this palette was still too close to
   camalochatools.com's warm cream/orange scheme despite different hex
   values, because both landed in the same hue family. */
:root{
  --paper:#EEF0F4; --paper-2:#E2E6ED; --paper-3:#D2D9E3;
  --ink:#1E2438; --ink-soft:#535E75; --ink-faint:#8791A6;
  --line:#C7CFDC;
  --accent:#2E3A63; --accent-ink:#F2F4F8;
  --red:#C6402B;
  --gold:#B8863B;
  --sidebar-w:260px; --topbar-h:60px;
  /* One typewriter face for everything — headings, body copy, labels, data
     — not just titles. This is the whole point of the "correspondence"
     redesign: it should read like an actual typed letter throughout, not a
     normal site with a typewriter accent font on headings only. */
  --font-body:'Courier Prime',ui-monospace,'SFMono-Regular',Menlo,Consolas,monospace;
  --font-head:'Courier Prime',ui-monospace,'SFMono-Regular',Menlo,Consolas,monospace;
  --font-mono:'Courier Prime',ui-monospace,'SFMono-Regular',Menlo,Consolas,monospace;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
/* Faint ruled-paper lines across the whole page — the cheapest, most
   pervasive "correspondence" cue, since every surface sits on top of it. */
body{background:var(--paper) repeating-linear-gradient(to bottom,
    transparent 0, transparent 27px, var(--paper-3) 28px);
  color:var(--ink);line-height:1.6;-webkit-font-smoothing:antialiased;font-family:var(--font-body)}
button,input,select,textarea{font-family:inherit}
html[data-cjk="sc"] body,html[data-cjk="sc"] button,html[data-cjk="sc"] input,
html[data-cjk="sc"] select,html[data-cjk="sc"] textarea,html[data-cjk="sc"] option{font-family:'Noto Sans SC',sans-serif}
html[data-cjk="jp"] body,html[data-cjk="jp"] button,html[data-cjk="jp"] input,
html[data-cjk="jp"] select,html[data-cjk="jp"] textarea,html[data-cjk="jp"] option{font-family:'Noto Sans JP',sans-serif}
/* Courier Prime (--font-head) has no CJK glyphs — redefine the variable
   itself on CJK pages so every current and future consumer resolves correctly. */
html[data-cjk="sc"]{--font-head:'Noto Sans SC',sans-serif}
html[data-cjk="jp"]{--font-head:'Noto Sans JP',sans-serif}
a{color:inherit}
img{max-width:100%}
h1,h2,h3{line-height:1.15;font-weight:600;font-family:var(--font-head);letter-spacing:-.01em}

/* ============================== layout shell ==============================
   Deliberately NOT a top bar with dropdowns (that's gruyeranotes.com's
   pattern) — navigation lives in a persistent left sidebar, off-canvas on
   narrow screens, toggled from a slim top bar. The language picker is a
   true modal dialog, not an absolutely-positioned panel. */
.shell{display:flex;min-height:100vh}

/* A flex item with position:sticky inherits stretch-to-tallest-sibling
   height from its .shell row, which on a long generated table could be
   thousands of pixels tall — its own centered content then floated at the
   visual midpoint of the whole page instead of staying at the viewport top.
   position:fixed sidesteps that entirely, exactly like .lang-trigger. */
.topbar{position:fixed;top:0;left:0;right:0;height:var(--topbar-h);display:flex;align-items:center;
  gap:14px;padding:0 18px;background:var(--paper-2);border-bottom:1px solid var(--line);z-index:55}
.menu-toggle{width:36px;height:32px;background:none;border:1px solid var(--line);border-radius:8px;
  cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px}
.menu-toggle span{display:block;width:16px;height:2px;background:var(--ink);border-radius:1px}
.brand-mini{display:flex}
.logo-ico{display:block;flex-shrink:0;margin-top:-7px}

.sidebar-backdrop{display:none;position:fixed;inset:0;background:rgba(30,36,56,.4);z-index:40}
.sidebar-backdrop:not([hidden]){display:block}

.sidebar{position:fixed;top:0;left:0;height:100%;width:var(--sidebar-w);background:var(--paper-2);
  border-right:1px solid var(--line);padding:22px 18px;display:flex;flex-direction:column;gap:20px;
  transform:translateX(-100%);transition:transform .22s ease;z-index:50;overflow-y:auto}
.sidebar.open{transform:translateX(0)}

.brand{display:flex;align-items:center;gap:9px;text-decoration:none;font-weight:600;font-size:1.1rem;
  color:var(--ink);font-family:var(--font-head);flex-shrink:0}
.brand-x{color:var(--red);font-style:italic;font-weight:700}
.tld{color:var(--accent);font-weight:500}

.side-nav{flex:1;min-height:0}
.side-group{margin-bottom:22px}
.side-group-label{font-family:var(--font-mono);font-size:.66rem;font-weight:700;text-transform:uppercase;
  letter-spacing:.08em;color:var(--ink-faint);margin:0 0 8px}
/* A third accent (gold) marks the curated "Featured" group only — the one
   place on the site meant to read as hand-picked rather than exhaustive. */
.side-group:first-of-type .side-group-label{color:var(--gold)}
.side-group:first-of-type a .nav-icon{color:var(--gold)}
.side-group a{display:flex;align-items:center;gap:9px;padding:7px 10px;margin:0 -10px;border-radius:6px;
  text-decoration:none;color:var(--ink-soft);font-size:.92rem}
.side-group a:hover{background:var(--paper-3);color:var(--ink)}
.side-group a .nav-icon{flex-shrink:0;color:var(--ink-faint)}
.side-group a:hover .nav-icon{color:var(--accent)}

/* Tools/Compare are the full catalog — collapsed accordions by default so
   the sidebar doesn't turn into one long uncomfortable scroll; only the
   short curated "Featured" group stays permanently expanded. */
.side-group-collapsible{margin-bottom:8px}
.side-group-toggle{display:flex;align-items:center;justify-content:space-between;width:100%;
  background:none;border:none;cursor:pointer;padding:6px 0;text-align:left}
.side-group-toggle .side-group-label{margin:0}
.side-group-caret{color:var(--ink-faint);flex-shrink:0;transition:transform .15s ease}
.side-group-toggle[aria-expanded="true"] .side-group-caret{transform:rotate(180deg)}
.side-group-body{padding-top:6px}
.side-group-body[hidden]{display:none}

/* language picker trigger — fixed to the viewport corner, not part of the
   sidebar's own scrolling flow (it used to sit mid-list and get crowded). */
.lang-trigger{position:fixed;top:14px;right:16px;z-index:60;display:flex;align-items:center;gap:8px;
  background:var(--paper);border:1px solid var(--line);border-radius:100px;padding:8px 15px;cursor:pointer;
  font-weight:600;color:var(--ink);font-size:.88rem;box-shadow:0 4px 14px rgba(30,36,56,.12)}
.lang-trigger:hover{border-color:var(--accent)}
.lang-flag{font-size:1.05em}

/* language picker: a real modal dialog, not a dropdown */
.modal-backdrop{display:none;position:fixed;inset:0;background:rgba(30,36,56,.45);z-index:100;
  align-items:center;justify-content:center;padding:20px}
.modal-backdrop:not([hidden]){display:flex}
.modal{position:relative;background:var(--paper);border-radius:14px;padding:28px 24px 24px;
  max-width:420px;width:100%;max-height:80vh;overflow-y:auto;box-shadow:0 24px 60px rgba(30,36,56,.3)}
.modal-close{position:absolute;top:14px;right:14px;width:30px;height:30px;border-radius:50%;
  background:var(--paper-2);border:1px solid var(--line);cursor:pointer;font-size:1.1rem;color:var(--ink-soft);line-height:1}
.modal-close:hover{color:var(--accent);border-color:var(--accent)}
.lang-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin-top:8px}
.lang-grid a{display:flex;align-items:center;gap:8px;text-decoration:none;color:var(--ink);
  font-size:.92rem;padding:9px 10px;border-radius:8px}
.lang-grid a:hover{background:var(--paper-2)}
.lang-grid a[aria-current]{font-weight:800;color:var(--accent);background:var(--paper-2)}
.lang-grid a[lang="zh-Hans"]{font-family:'Noto Sans SC',sans-serif}
.lang-grid a[lang="ja"]{font-family:'Noto Sans JP',sans-serif}

.content-col{flex:1;min-width:0;display:flex;flex-direction:column;padding-top:var(--topbar-h)}
main{max-width:700px;margin:0 auto;padding:36px 22px 60px;width:100%}

@media (min-width:900px){
  .topbar{display:none}
  .content-col{padding-top:0}
  .sidebar-backdrop{display:none !important}
  .sidebar{position:sticky;top:0;height:100vh;transform:none;flex-shrink:0}
  .shell{align-items:flex-start}
}

/* hero */
.hero{padding:6px 0 8px}
.hero h1{font-size:2.1rem;margin:0 0 12px;text-wrap:balance}
.hero-p{color:var(--ink-soft);margin:0;font-size:1.08rem;max-width:56ch}

/* tool/comparison/home pages: a wide banner photo sits above the heading —
   real photography (free-license stock), framed like a postage stamp
   (dashed border + inset padding, matching the site's postal motif) rather
   than a plain rectangular thumbnail. No page-icon here any more — the
   photo itself is enough context above the heading. */
.hero-with-media{display:block}
.hero-with-media h1{margin-top:0}
.hero-photo-frame{padding:5px;border:2px dashed var(--accent);border-radius:10px;background:var(--paper-2);margin-bottom:18px}
.hero-photo{display:block;width:100%;height:auto;aspect-ratio:1200/480;object-fit:cover;border-radius:6px;background:var(--paper-3)}

/* section headings get a small seal-dot marker instead of a bar */
main>h2,.content h2{position:relative;padding-left:22px;margin-top:38px}
main>h2::before,.content h2::before{content:"";position:absolute;left:0;top:.4em;width:11px;height:11px;
  border-radius:50%;background:var(--accent);box-shadow:0 0 0 3px var(--paper-2)}
/* Home's "Tools"/"Compare" headings carry a real icon instead — no dot */
h2.section-h{display:flex;align-items:center;gap:10px;padding-left:0}
h2.section-h::before{display:none}
h2.section-h .section-ico{flex-shrink:0;color:var(--accent)}

/* Home grid: envelope-front / open-letter-back flip cards, landscape like
   an actual envelope (not a tall tile). Front carries a corner stamp.
   Desktop (real pointer + hover): plain CSS hover-flip, the front <a>
   navigates normally. Touch: app.js intercepts taps instead (see the
   isMobile() gate there) — one tap flips and holds it, tapping the flipped
   card (or any other card) closes it, and `.tc-go` — visible on mobile
   only — is the sole way to actually navigate once flipped. */
/* Real envelope proportions: a C6 envelope (the common one for a folded
   letter) is 114×162mm, a width:height ratio of ~1.42:1 — noticeably
   taller/squarer than a DL business envelope (2:1). minmax(210px,1fr)
   columns at 148px tall land right on that ratio. */
.grid-tools{display:grid;gap:18px;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));margin:16px 0 32px}
.tool-card{position:relative;height:148px;perspective:1200px;cursor:pointer}
.tc-inner{position:relative;width:100%;height:100%;transition:transform .5s cubic-bezier(.4,.2,.2,1);
  transform-style:preserve-3d}
@media (hover:hover) and (pointer:fine){
  .tool-card:hover .tc-inner{transform:rotateY(180deg)}
}
.tool-card.flipped .tc-inner{transform:rotateY(180deg)}
.tc-face{position:absolute;inset:0;backface-visibility:hidden;-webkit-backface-visibility:hidden;
  border:1px solid var(--line);border-radius:3px;display:flex;flex-direction:column;align-items:center;
  justify-content:center;padding:16px;text-align:center;cursor:pointer}
.tc-face,.tc-face *{cursor:pointer}
.tc-front{background:var(--paper-2);text-decoration:none;color:var(--ink)}
.tc-front::after{content:"";position:absolute;left:16px;right:16px;bottom:16px;height:1px;
  background:var(--line)}
.tc-front b{font-family:var(--font-head);font-weight:700;font-size:1.05rem;color:var(--ink)}
/* the "stamp": square, not tilted — sits fully inside the card, printed
   with a tiny landscape (like a real postage stamp's picture) in red */
.tc-stamp{position:absolute;top:10px;right:10px;width:30px;height:30px;background:var(--paper);
  border:1.5px dashed var(--ink-faint);border-radius:2px;
  display:flex;align-items:center;justify-content:center;color:var(--red);
  box-shadow:0 2px 5px rgba(30,36,56,.18)}
.tc-back{transform:rotateY(180deg);background:var(--paper) repeating-linear-gradient(to bottom,
    transparent 0,transparent 20px,var(--line) 21px);gap:8px}
.tc-back span{color:var(--ink-soft);font-size:.85rem;line-height:1.45}
/* Only reachable once flipped, and only meaningful on touch (desktop just
   flips back on mouse-out and the front link is right there again) */
.tc-go{display:none;color:var(--accent);font-weight:700;font-size:.85rem;text-decoration:none;cursor:pointer}
@media (max-width:560px){
  .tc-go{display:inline-block}
}

/* tool widget */
.tool{background:var(--paper-2);border:1px solid var(--line);border-radius:10px;padding:22px;margin:22px 0}
.tool .row{display:grid;gap:16px;grid-template-columns:1fr 1fr;margin-bottom:16px}
.tool .row.row-single{grid-template-columns:1fr}
.tool label{display:block;font-weight:600;font-size:.92rem;margin-bottom:6px}
.tool input[type=number],.tool input[type=text],.tool input[type=date],.tool select{width:100%;padding:11px 12px;border:1px solid var(--line);
  border-radius:8px;font-size:1rem;background:var(--paper);color:var(--ink)}
.tool input::placeholder{color:var(--ink-faint)}
.required-mark{color:var(--red)}
.tool input.input-error{border-color:var(--red);box-shadow:0 0 0 3px rgba(198,64,43,.15)}
.field-error{color:var(--red);font-weight:700;font-size:.85rem;margin-top:6px}

/* buttons: pill-shaped with a perforated inner ring, like a postage stamp —
   not gruyeranotes.com's plain filled rounded-rect */
.btn{position:relative;display:inline-flex;align-items:center;justify-content:center;gap:8px;
  border:none;border-radius:100px;padding:13px 26px;font-weight:600;cursor:pointer;
  text-decoration:none;font-size:.98rem;font-family:var(--font-head);transition:transform .15s ease}
.btn-primary{background:var(--accent);color:var(--accent-ink)}
.btn-primary::after{content:"";position:absolute;inset:3px;border-radius:100px;
  border:1.5px dashed rgba(251,237,231,.55);pointer-events:none}
.btn-primary:hover{transform:scale(1.03)}
.btn-secondary{background:var(--paper);color:var(--ink);border:1.5px solid var(--line)}
.btn-secondary:hover{border-color:var(--accent);color:var(--accent)}

/* charts drawn above a listing — type varies per tool (bar/timeline/etc.)
   to fit whatever the data actually is. Save options (PNG/PDF) reuse the
   same "export-block" ticket-strip as the listing below, labeled "Guardar"
   instead of "Exportar", and sit ABOVE the chart. */
.chart-block{margin-top:18px;margin-bottom:18px}
.chart-block canvas{width:100%;height:180px;display:block;border:1px solid var(--line);border-radius:8px}
/* the editorial-calendar timeline can hold up to 50 points — JS sets an
   explicit pixel width on the canvas past a point count, and this wrapper
   scrolls horizontally instead of squeezing everything unreadably narrow */
.chart-scroll{overflow-x:auto;border-radius:8px}
.chart-scroll canvas{border-radius:8px}

.tool-result{margin-top:18px;padding-top:16px;border-top:1px dashed var(--line)}
.result-row{display:flex;justify-content:space-between;padding:6px 0;font-size:1rem}
.result-row b{font-family:var(--font-mono);font-variant-numeric:tabular-nums}
.verdict{margin-top:12px;font-weight:600;background:var(--paper);border-radius:8px;padding:12px 14px}
.verdict-bad{background:#F3E1D8;color:#7A2013}
.verdict-ok{background:#E1EBE3;color:#1F5C34}

.split-table{width:100%;border-collapse:collapse;margin-top:4px}
.split-table th,.split-table td{text-align:left;padding:8px 10px;border-bottom:1px solid var(--line);font-size:.95rem}
.split-table td:last-child{font-family:var(--font-mono);font-variant-numeric:tabular-nums}
.inline-note{margin-top:14px;font-size:.9rem;color:var(--ink-soft)}
.inline-note a{color:var(--accent);font-weight:700;text-decoration:none}

.result-head{display:flex;justify-content:flex-end;margin-bottom:14px}
/* "ticket stub" export strip — a perforated pill divided into sections, not
   gruyeranotes.com's colored square badges */
.export-block{display:flex;align-items:stretch;flex-wrap:wrap;justify-content:flex-end;
  border:1px dashed var(--line);border-radius:100px;overflow:hidden;background:var(--paper);margin-left:auto}
.export-label{display:flex;align-items:center;margin:0;padding:0 14px;font-family:var(--font-mono);
  font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-faint);
  border-right:1px dashed var(--line)}
.export-btns{display:flex}
.export-btn{background:none;border:none;padding:0;cursor:pointer;border-right:1px dashed var(--line)}
.export-btn:last-child{border-right:none}
.export-ico{display:flex;align-items:center;gap:6px;padding:10px 16px;font-family:var(--font-mono);
  font-weight:700;font-size:.74rem;color:var(--ink-soft);transition:color .12s,background .12s}
.export-ico::before{content:"";width:9px;height:9px;background:var(--ink-faint);flex-shrink:0;
  clip-path:polygon(30% 0,100% 0,100% 70%);transition:background .12s}
.export-btn:hover .export-ico{color:var(--accent);background:var(--paper-2)}
.export-btn:hover .export-ico::before{background:var(--accent)}

/* comparison table */
.compare-table{width:100%;border-collapse:collapse;margin:20px 0;font-size:.92rem}
.compare-table th,.compare-table td{text-align:left;padding:10px 12px;border-bottom:1px solid var(--line)}
.compare-table thead th{font-weight:600;color:var(--ink);font-family:var(--font-head)}
.compare-table tbody tr:nth-child(odd){background:var(--paper-2)}

/* content / faq */
.content{margin:28px 0}
.content p{margin:0 0 12px}
.faq{margin:28px 0}
.faq details{border:1px solid var(--line);border-radius:8px;padding:12px 16px;margin-bottom:10px;background:var(--paper-2)}
.faq summary{font-weight:600;cursor:pointer;font-family:var(--font-head)}
.faq p{margin:10px 0 2px;color:var(--ink-soft)}

/* reserved, CLS-safe AdSense slots */
.ad-slot{display:flex;align-items:center;justify-content:center;background:var(--paper-2);
  border:1px dashed var(--line);border-radius:8px;color:var(--ink-faint);font-family:var(--font-mono);
  font-size:.72rem;text-transform:uppercase;letter-spacing:.06em;margin:28px 0}
.ad-banner{min-height:90px}
.ad-in-content{min-height:250px}
.ad-footer{min-height:90px}

/* honesty notices — a small stamped notice next to any benchmark, projection
   or estimate, so results never get mistaken for personalized guarantees */
.notice{display:flex;gap:10px;align-items:flex-start;margin-top:16px;padding:12px 14px;
  background:var(--paper);border:1px dashed var(--line);border-radius:8px;font-size:.85rem;color:var(--ink-soft)}
.notice::before{content:"";flex-shrink:0;margin-top:.4em;width:9px;height:9px;border-radius:50%;
  background:var(--gold);box-shadow:0 0 0 3px var(--paper-2)}
.notice b{color:var(--ink);font-family:var(--font-mono);text-transform:uppercase;
  font-size:.7rem;letter-spacing:.05em;margin-right:5px}

/* footer */
footer{border-top:1px solid var(--line);margin-top:40px;background:var(--paper-2)}
footer .container{max-width:700px;margin:0 auto;padding:26px 22px;text-align:center;color:var(--ink-soft);font-size:.85rem}
.fnav{display:flex;gap:16px;justify-content:center;margin-bottom:10px}
.fnav a{text-decoration:none;color:var(--ink-soft);font-weight:600}
.fnav a:hover{color:var(--accent)}
.disclosure{max-width:520px;margin:0 auto 10px;opacity:.85}

@media (max-width:560px){
  .tool .row{grid-template-columns:1fr}
  .lang-grid{grid-template-columns:1fr}
  .hero-photo{aspect-ratio:4/3}
}
