/* SENDUNE public site, the Bento Box (VNKT, 3 Oct 2026, after the Framer reference): separate tiles with gaps on a
   grey ground, one accent tile that carries the argument, and in every tile an eyebrow, a headline and a body line,
   the headline scaling with the tile. SENDUNE's greys and Verdana (docs/DESIGN.md); the logo is the only image. */
:root {
  --ground: #ddd;        /* the old Send With SES page grey (VNKT) */
  --tile: #f7f7f7;
  --accent: #555;        /* the one coloured tile: the dashboard's dark grey, white words */
  --line: #ccc;
  --line-soft: #ddd;
  --text: #555;
  --quiet: #888;
  --red: #ef8081;
  --link: #6699ee;
  --gap: 12px;
  --radius: 2px;         /* DESIGN.md §3: square-ish; the reference's 12px would be a decision for VNKT */
}
* { box-sizing: border-box; }
html, body { margin: 0; }
body {
  font-family: Verdana, sans-serif; font-size: 15px; line-height: 1.5; color: var(--text); background: var(--ground);
  min-height: 100vh; display: flex; flex-direction: column; padding: var(--gap);
}
a { color: inherit; }
h1, h2, p, ul { margin: 0; }
[hidden] { display: none !important; }
.sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }

/* The layout is at most 1280px wide, centred; wider screens show the ground on both sides (VNKT, 5 Oct 2026). */
.bento, .foot { width: 100%; max-width: 1280px; margin-left: auto; margin-right: auto; }

/* ---------- the grid: four columns, rows in proportion ---------- */
.bento {
  flex: 1; min-height: 0;
  display: grid; gap: var(--gap);
  grid-template-columns: repeat(4, minmax(0, 1fr));
  grid-template-rows: minmax(0, 40fr) minmax(0, 40fr) minmax(0, 67fr) minmax(0, 73fr);   /* Pricing over Cost Calculator: tuned so both fit at 1280x720 and 1440x900 */   /* Pricing has room to spare, the Calculator needs it */
  grid-template-areas:
    "brand  brand   table    table"
    "brand  brand   table    table"
    "signin pricing table    table"
    "signin calc    how      what";   /* VNKT, 5 Oct 2026: How it works and What you get beside the Calculator, the Contacts table above them */
}
.tile { background: var(--tile); border: 1px solid #bbb; border-radius: var(--radius); padding: 18px 22px; min-width: 0; overflow: hidden; display: flex; flex-direction: column; }
.brand { grid-area: brand; } .signin { grid-area: signin; }
.pricing { grid-area: pricing; } .calc { grid-area: calc; }
.side { display: contents; }   /* its tiles are grid items in their own areas */
.how { grid-area: how; } .features { grid-area: what; } .contacts { grid-area: table; }
.feats { margin: 0; padding-left: 18px; font-size: 13px; } .feats li { line-height: 1.5; margin-top: 3px; }
.feats li { font-weight: 600; font-size: 13px; }
.feats a { color: inherit; text-decoration: none; } .feats a:hover, .feats a:focus-visible { text-decoration: underline; }   /* each feature opens its page (SEO); looks like text until hovered */
.feats { padding-left: 0; list-style-position: inside; } .feats li { margin-top: 0; padding: 6px 0; } .feats li + li { border-top: 1px solid var(--line-soft); }   /* a line between features, as in How it works (VNKT, 5 Oct 2026) */   /* semi bold (VNKT, 5 Oct 2026); "+ much more" is not a feature, so no bullet */   /* What you get: one feature a line (VNKT, 5 Oct 2026) */
/* How it works as three numbered steps (VNKT, 5 Oct 2026: "to make it sound easy") */
.steps { list-style: none; padding: 0; margin: 0; counter-reset: step; font-size: 13px; display: grid; grid-auto-rows: 1fr; }   /* three steps, equal height (VNKT, 5 Oct 2026) */
.steps li { counter-increment: step; position: relative; padding: 10px 0 10px 32px; display: flex; align-items: center; }
.steps li + li { border-top: 1px solid var(--line-soft); }   /* a line between steps, like the Calculator rows (VNKT, 5 Oct 2026) */
.steps li::before { content: counter(step); position: absolute; left: 0; top: calc(50% - 11px); width: 22px; height: 22px; line-height: 22px; border-radius: 50%; background: var(--accent); color: #fff; font-weight: bold; font-size: 12px; text-align: center; }
.side > .tile { min-height: 0; justify-content: flex-start; }   /* four equal tiles; less top and bottom air so the longest (Why AWS SES) fits at 1440x900 inside 1280px */   /* the four right-hand tiles share the column equally, whatever the rows do */
@media (min-width: 861px) { body { height: 100vh; } }   /* one screen: a tile that spills is clipped and shot.mjs says so */

/* ---------- tile anatomy ---------- */
/* Every tile's title: bold, dark, one size for all (VNKT 3 Oct 2026: "every section must get a bold heading with bigger font size";
   5 Oct 2026: not small and grey). The class keeps its old name so the markup does not change. */
.eyebrow { font-size: 18px; font-weight: bold; color: var(--quiet); margin-bottom: 9px; text-transform: capitalize; }   /* grey, as the old eyebrow was (VNKT, 5 Oct 2026); the Login/Signup tabs keep their own colours */   /* TITLE: 20px; sub-headings are 14px bold, so the two never look alike */
.tile h2 { font-size: 20px; line-height: 1.25; font-weight: bold; margin-bottom: 8px; }
.side h2 { font-size: 13px; line-height: 1.4; margin-bottom: 4px; }   /* sub-heading level */
.tile:not(.signin) p:not(.eyebrow) { font-size: 13px; }   /* home text 13px (VNKT, 5 Oct 2026); the sign-in tile keeps the app card's 14px */
.tile .n { font-size: 26px; }

/* the brand tile: logo beside the words, the Contacts table under them */
.brand { justify-content: space-evenly; gap: 10px; }
.brand_why { border-top: 1px solid var(--line-soft); padding-top: 10px; }
.badges { display: flex; gap: 12px; flex-wrap: wrap; }   /* the old site's Hacker News badge + an Open Source badge drawn to match (VNKT, 5 Oct 2026) */
.badges img { height: 44px; width: auto; display: block; }
.brand_why h2 { font-size: 20px; font-weight: bold; margin-bottom: 4px; }
.brand_top { display: flex; gap: 20px; align-items: flex-start; }
.logo { flex: none; width: var(--logo, 80px); height: var(--logo, 80px); }   /* as tall as the headline + its line, on every screen (VNKT, 5 Oct 2026: small on a 14-inch MacBook) */
.brand h1 { font-size: 30px; line-height: 1.1; font-weight: bold; margin-bottom: 4px; }
.brand p:not(.eyebrow) { font-size: 15px; max-width: 34em; }

/* ---------- sign-in tile: the dashboard's login card IS the tile. Every size below was MEASURED on app.sendune.com
   on 3 Oct 2026 (tools: puppeteer over the live page): card 320x380 with a 1px #bbb line; head 60px, two tabs 20px/600,
   #eee, active #555, idle #bbb; body #f8f8f8, inputs 250px (78% of the card) x 40px, 20px apart, 14px, radius 0,
   1px #ccc, centred placeholder; the ? 20px #aaa beside the password; foot 60px #eee with a 1px #bbb line above and
   Submit 86x36 #555 bold 14px centred; "Or" 20px; Google: white box with the G then blue; terms 12px #777. ---------- */
.tile.signin { padding: 0; background: var(--tile); container-type: inline-size; }   /* the tiles' own grey, like every other tile (VNKT, 5 Oct 2026); inputs white on it, as on app.sendune.com */   /* two classes: no general .tile padding (phone, short screens) reaches it */   /* white form (VNKT, 5 Oct 2026); the inputs take the light grey instead */   /* its line is every tile's line */
.card { display: flex; flex-direction: column; flex: 1; min-height: 0; border-bottom: 1px solid #ddd; }   /* the form: tabs, fields, Submit under them (VNKT, 5 Oct 2026: no band) */
.card_head { display: flex; height: 60px; flex: none;   /* ALWAYS 60px, at every screen size (VNKT, 5 Oct 2026) */ background: #eee; border-bottom: 1px solid #bbb; }   /* the tabs' lines are the frame's #bbb; only lines INSIDE the white area are #ddd (VNKT, 5 Oct 2026) */
.tab { flex: 1; display: flex; align-items: center; justify-content: center; font-weight: bold; font-size: 18px; color: #bbb; text-decoration: none; }   /* type scale: 16 bold / 14 / 12 / 11 (the terms line), nothing else */
#to_signup { border-left: 1px solid #bbb; }   /* the one divider between the two tabs; never on the single Forgot Password head, where it doubled the tile's own left line (5 Oct 2026) */
.tab.active { color: var(--text); }
span.tab { cursor: default; }
.signin.challenged .alt { display: none; }   /* only while Cloudflare draws its box (rare on sendune.com): the box needs the room */
.signin.challenged .turnstile { margin-bottom: 0; }
.tip.back { font-size: 15px; line-height: 19px; }   /* the app's Back To Login x, in the ? spot */
.card_body { flex: 1; min-height: 0; display: flex; flex-direction: column; align-items: center; justify-content: safe center; padding: 20px; }
.fields .btn { display: block; margin: 0 auto; }
/* below the form, a separate element: Or, Google, terms (VNKT, 5 Oct 2026); it takes the rest of the tile */
.alt { flex: none; height: 180px; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 0 20px; }   /* FIXED height at the tile's foot, so Google never moves between Login, Signup and Forgot password (VNKT, 5 Oct 2026) */
.fields { width: 78cqw; }   /* 78% of the TILE's width (container query unit), as the app's 250px is of its 320px card */
.card_body > * { max-width: 100%; }
.field { display: block; margin-bottom: 20px; position: relative; }
.field input { width: 100%; height: 40px; padding: 0 15px; font: inherit; font-size: 14px; color: var(--text); background: #fff; border: 1px solid var(--line); border-radius: 0; text-align: center; }
.field input::placeholder { color: #aaa; }
.field input:focus { outline: none; border-color: #999; background: #fff; }
.tip { position: absolute; right: -25px;   /* 5px after the field, as measured on the app (field ends 845, ? starts 850) */  top: 10px; width: 20px; height: 20px; border-radius: 50%; background: #aaa; color: #fff; font-size: 12px; font-weight: bold; line-height: 20px; text-align: center; text-decoration: none; }
.msg { min-height: 20px; line-height: 20px; font-size: 14px; text-align: center; white-space: pre-line; }   /* under Submit, a sentence a line */
.msg.err { color: var(--red); }
.google { text-align: center; }
.google a { display: inline-flex; align-items: stretch; background: #4285f4; color: #fff; font-size: 14px; font-weight: bold; text-decoration: none; border: 1px solid #4285f4; }
.google .g { display: flex; align-items: center; justify-content: center; width: 42px; background: #fff; }
.google .gw { padding: 0 20px; line-height: 40px; white-space: nowrap; }
.fine { margin-top: 18px; font-size: 11px; color: #777; text-align: center; }
.fine a { color: #777; }
.btn { height: 36px; padding: 0 15px; min-width: 86px; border: 0; border-radius: 0; background: var(--text); color: #fff; font: inherit; font-size: 14px; font-weight: bold; cursor: pointer; }
.btn:hover { opacity: .9; }
.btn[disabled] { opacity: .5; cursor: default; }
.turnstile { display: flex; justify-content: center; margin-bottom: 8px; }
.teams { list-style: none; padding: 0; margin: 0 0 8px; display: grid; gap: 6px; }
.teams button { width: 100%; height: 34px; font: inherit; font-size: 13px; color: var(--text); background: #fafafa; border: 1px solid var(--line); border-radius: 0; cursor: pointer; }
.teams button:hover { border-color: #999; }

/* ---------- Pricing tile and Cost Calculator tile, one below the other (VNKT, 5 Oct 2026). Every line on ONE
   line: nothing wraps (white-space: nowrap); tools/shot.mjs reports any that would not fit. ---------- */
.pricing, .calc { justify-content: flex-start; }
/* every titled tile: the SAME distance from the tile's top to its title, everywhere */
.side > .tile, .tile.pricing, .tile.calc, .tile.contacts { --px: 22px; padding: 0 var(--px) 12px; }
/* THE TITLE (VNKT, 5 Oct 2026): left-aligned at the top of the tile, Every Word Capitalised, UNDERLINED - a 1px #ddd
   line under the title's own words, as wide as the title and no wider (not across the tile). */
.side > .tile > .eyebrow, .pricing > .eyebrow, .calc > .eyebrow, .contacts > .eyebrow {
  flex: none; align-self: flex-start; margin: 14px 0 12px; padding: 0 0 6px;
  border-bottom: 1px solid #ddd; line-height: 1.2; text-align: left;
}
/* A titled tile: the TITLE is anchored to the top; only what sits UNDER it is spread over the space left, centred
   between the title and the tile's foot (VNKT, 5 Oct 2026: "anchored to the top of the box"). The auto margins on the
   first and last thing under the title do the centring; the title's own margin stays as the least gap. */
.side > .tile > .eyebrow + *, .pricing > .eyebrow + *, .calc > .eyebrow + *, .contacts > .eyebrow + * { margin-top: auto; }
.side > .tile > :last-child, .pricing > :last-child, .calc > :last-child, .contacts > :last-child { margin-bottom: auto; }
.pricing *, .calc * { white-space: nowrap; }
.plans { display: grid; gap: 16px; }   /* clear air between Free Plan and Pay As You Send (VNKT, 5 Oct 2026) */
.plan h2 { font-size: 16px; margin-bottom: 2px; }   /* bigger, VNKT 5 Oct 2026 */
.plan .aka { font-weight: bold; }   /* (PAYS) bold like the rest of the heading */
.plan ul { margin: 0; padding-left: 18px; font-size: 13px; }
.plan li { line-height: 1.6; }
.calc h2 { font-size: 13px; margin-bottom: 0; }
.calc .n { font-size: 22px; }
input[type=range] { width: 100%; margin: 8px 0 10px; accent-color: var(--accent); }
.cost { border-collapse: collapse; width: 100%; font-size: 13px; }
.cost th { text-align: left; font-weight: normal; padding: 6px 0; }   /* room to breathe between the lines (VNKT, 5 Oct 2026) */
.cost th .how { font-size: 11px; color: var(--quiet); margin-left: 4px; }
.cost td { padding: 6px 0 6px 8px; text-align: right; font-weight: bold; font-variant-numeric: tabular-nums; }
.cost tr + tr { border-top: 1px solid var(--line-soft); }
.cost .total th, .cost .total td { border-top: 1px solid var(--line); padding-top: 6px; font-weight: bold; font-size: 16px; }   /* the total, bigger */

/* "Unlimited Contacts": the fair-usage note opens on hover or keyboard focus (VNKT, 5 Oct 2026). The weekly ramp is the
   one in apps/api routes/contacts.ts meteredContactsLimit; change both together. */
.fair { position: relative; cursor: help; border-bottom: 1px dotted var(--quiet); outline: none; }
.tip_box {
  display: none; position: absolute; left: 0; bottom: calc(100% + 8px); z-index: 10; width: 280px;
  white-space: normal; font-size: 12px; line-height: 1.5; font-weight: normal; color: #fff;
  background: var(--text); padding: 10px 12px; border-radius: var(--radius); box-shadow: var(--shadow-dropdown, 0 4px 12px rgba(0,0,0,.12));
}
.tip_box b { font-weight: bold; }
.fair:hover .tip_box, .fair:focus .tip_box { display: block; }
.pricing { overflow: visible; }   /* the note may rise above the tile */

/* ---------- the Contacts page, drawn in code ---------- */
.ctable_wrap { overflow: auto; }
.ctable { width: 100%; border-collapse: collapse; font-size: 13px; border: 1px solid var(--line); background: #fff; }
.ctable th { background: #eee; border-bottom: 1px solid var(--line); border-right: 1px solid var(--line); padding: 6px 10px; text-align: left; font-weight: bold; font-size: 12px; }
.ctable th:last-child { border-right: 0; }
.ctable td { border-bottom: 1px solid var(--line-soft); padding: 5px 10px; white-space: nowrap; vertical-align: middle; }
.ctable tr:last-child td { border-bottom: 0; }
.ctable .when { color: var(--quiet); font-size: 12px; }
.ctable .mono { font-family: ui-monospace, Menlo, Consolas, monospace; font-weight: bold; font-size: 12px; }
.chip { display: inline-block; border-radius: 10px; padding: 1px 8px; margin: 1px 4px 1px 0; font-size: 12px; line-height: 17px; white-space: nowrap; }
.st_sub { background: #c8efce; color: #276832; }
.st_unsub { background: #e4e4e4; color: #555; }
.st_bounce { background: #fcdbc5; color: #8f4819; }
.t1 { background: #dcd6f7; color: #3f3380; }
.t2 { background: #cfe6f7; color: #1f4f73; }
.t3 { background: #f3e6bf; color: #6b5410; }
.t4 { background: #f7d6ea; color: #7d2a5a; }

/* ---------- footer, on the ground, under the tiles ---------- */
.foot { display: flex; justify-content: space-between; align-items: baseline; gap: 4px 24px; flex-wrap: wrap; padding: 10px 0 0; }   /* the row starts and ends on the tiles' own edges */
.foot nav { display: flex; flex-wrap: wrap; gap: 2px 16px; font-size: 12px; }
.foot a { text-decoration: none; }
.foot a:hover { text-decoration: underline; }

/* Footer on a laptop or wider: every link on ONE row, spread across the 1280px (VNKT, 5 Oct 2026). shot.mjs fails the
   page if the row ever wraps. A phone may wrap. */
@media (min-width: 861px) {
  .foot nav { flex-wrap: nowrap; justify-content: space-between; width: 100%; gap: 0 12px; white-space: nowrap; }
}

/* ---------- phone ---------- */
@media (max-width: 860px) {
  .bento { grid-template-columns: 1fr 1fr; grid-template-rows: none; grid-auto-rows: auto;
    grid-template-areas: "brand brand" "signin signin" "pricing pricing" "calc calc" "table table" "how how" "what what"; }
  .tile { padding: 18px; }
  .side > .tile, .tile.pricing, .tile.calc, .tile.contacts { --px: 18px; padding: 0 var(--px) 18px; }
  .side > .tile { flex: none; }
  .brand h1 { font-size: 26px; }
  .foot { flex-direction: column; align-items: flex-start; }
}
/* ---------- short laptop screens (1280x720, 1366x768, 1470x832) ---------- */
@media (min-width: 861px) and (max-height: 860px) {
  :root { --gap: 10px; }
  body { font-size: 14px; }
  .tile { padding: 12px 16px; }
  .eyebrow { line-height: 1.2; }
  .tile h2 { font-size: 17px; margin-bottom: 4px; }
  .side h2 { font-size: 13px; margin-bottom: 2px; }
  .feats { font-size: 13px; } .tile .feats li { font-size: 12px; padding: 3px 0; } .feats li { margin-top: 1px; line-height: 1.4; }
  .steps li { padding-top: 6px; padding-bottom: 6px; line-height: 1.4; }
  .tile:not(.signin) p:not(.eyebrow) { font-size: 13px; }
  .tile .n { font-size: 22px; }
  .brand h1 { font-size: 24px; margin-bottom: 4px; }
  .brand { --logo: 70px; }
  .brand p:not(.eyebrow) { font-size: 13px; }
  .brand { gap: 6px; }
  .plans { gap: 8px; }
  .plan h2 { font-size: 15px; }
  .calc h2 { font-size: 13px; }
  .cost .total th, .cost .total td { font-size: 15px; }
  .plan li { line-height: 1.25; }
  .calc .n { font-size: 19px; }
  .side > .tile, .tile.pricing, .tile.calc, .tile.contacts { --px: 16px; padding: 0 var(--px) 8px; }
  .side > .tile > .eyebrow, .pricing > .eyebrow, .calc > .eyebrow, .contacts > .eyebrow { margin-top: 10px; margin-bottom: 8px; padding-bottom: 5px; }
  .cost .total th, .cost .total td { padding-top: 3px; }
  .cost th, .cost td { padding: 3px 0; }
  .cost td { padding-left: 8px; }
  .pricing p:not(.eyebrow) { font-size: 12px; }
  .card_body { padding: 12px 16px; }
  .alt { height: 140px; padding: 0 16px; }
  .field { margin-bottom: 12px; }
  .google .gw { line-height: 36px; padding: 0 16px; }
  .google .g { width: 38px; }
  .fine { margin-top: 10px; }
  .accent p:not(.eyebrow) { font-size: 13px; }
  .msg { margin-top: 2px; }
  input[type=range] { margin: 2px 0 6px; }
  .cost { font-size: 13px; }
  .ctable th { padding: 4px 8px; } .ctable td { padding: 3px 8px; }
  .foot { padding-top: 6px; }
}

/* ---------- 404 page: one tile in the middle of the ground ---------- */
body.lost { display: flex; align-items: center; justify-content: center; min-height: 100vh; padding: 16px; }
.lost_tile { max-width: 440px; width: 100%; align-items: center; text-align: center; gap: 10px; padding: 32px 28px; }
.lost_tile h1 { font-size: 24px; font-weight: bold; }
.lost_tile p { font-size: 14px; }
.lost_tile a { color: var(--link); }



/* ---------- guide + legal pages: articles that scroll (VNKT, 5 Oct 2026: no box around the content, "look decent") ----------
   A header band, then the text on the light ground in a readable column, with a sticky side list: the page's own
   sections ("On this page") and its sibling pages (Guides or Legal). */
body.doc_page { background: var(--tile); display: block; padding: 0; }
@media (min-width: 861px) { body.doc_page { height: auto; } }
.doc_band { background: #eee; border-bottom: 1px solid #bbb; }
.doc_band_in { max-width: 1280px; margin: 0 auto; padding: 28px 16px; display: flex; align-items: center; gap: 20px; }
.doc_band .logo { --logo: 56px; }
.doc_title { flex: 1; min-width: 0; }
.crumb { font-size: 12px; color: var(--quiet); margin-bottom: 4px; }
.crumb a { color: var(--quiet); text-decoration: none; } .crumb a:hover { text-decoration: underline; }
.doc_band h1 { font-size: 30px; line-height: 1.15; font-weight: bold; margin-bottom: 6px; }
.doc_lead { font-size: 15px; color: var(--text); }
.doc_band .page_cta { color: #fff; flex: none; text-decoration: none; display: inline-block; line-height: 36px; }
.doc { max-width: 1280px; margin: 0 auto; padding: 40px 16px 64px; display: grid; gap: 56px;
  grid-template-columns: 220px minmax(0, 700px); grid-template-areas: "nav body"; justify-content: center; }
.doc_body { grid-area: body; font-size: 15px; line-height: 1.7; color: #444; }
.doc_nav { grid-area: nav; align-self: start; position: sticky; top: 24px; font-size: 13px; }
.nav_h { font-size: 11px; font-weight: bold; text-transform: uppercase; letter-spacing: .06em; color: var(--quiet); margin: 0 0 8px; }
.doc_nav ul { list-style: none; margin: 0 0 28px; padding: 0; border-left: 1px solid var(--line-soft); }
.doc_nav li a { display: block; padding: 4px 0 4px 12px; margin-left: -1px; border-left: 2px solid transparent; color: var(--text); text-decoration: none; line-height: 1.4; }
.doc_nav li a:hover { color: #222; border-left-color: var(--line); }
.doc_nav li a[aria-current="page"] { font-weight: bold; color: #222; border-left-color: var(--accent); }
.doc_body p { margin: 0 0 16px; }
.doc_body p.lead { font-size: 18px; line-height: 1.6; color: var(--text); margin-bottom: 24px; }
.doc_body h2 { font-size: 22px; line-height: 1.3; font-weight: bold; color: var(--text); margin: 44px 0 14px; padding-top: 28px; border-top: 1px solid var(--line-soft); scroll-margin-top: 16px; }
.doc_body > h2:first-child { margin-top: 0; padding-top: 0; border-top: 0; }
.doc_body a { color: var(--link); }
.doc_body figure { margin: 8px 0 28px; }
.doc_body figure img { display: block; width: 100%; height: auto; border-radius: 6px; border: 1px solid var(--line-soft); box-shadow: 0 2px 10px rgba(0,0,0,.06); background: #fff; }
.doc_body figure img[src$=".svg"] { width: auto; max-width: min(260px, 100%); margin: 0 auto; border: 0; box-shadow: none; background: none; }   /* illustrations stay small */
/* numbered steps on a thin line, like How it works on the home page */
.step { display: grid; grid-template-columns: 32px minmax(0, 1fr); gap: 16px; position: relative; padding-bottom: 8px; }
.step::before { content: ''; position: absolute; left: 15px; top: 34px; bottom: 0; width: 2px; background: var(--line-soft); }
.step:last-of-type::before { display: none; }
.step .num { width: 32px; height: 32px; border-radius: 50%; background: var(--accent); color: #fff; font-weight: bold; font-size: 14px; display: flex; align-items: center; justify-content: center; position: relative; }
.step_body { padding-top: 4px; min-width: 0; }
/* "Label: text" paragraphs become small cards */
.point { background: #fff; border: 1px solid var(--line-soft); border-left: 3px solid var(--accent); border-radius: 4px; padding: 12px 16px; margin: 0 0 12px; }
.point h3 { font-size: 15px; font-weight: bold; color: var(--text); margin: 0 0 4px; }
.point p { margin: 0; }
/* the closing "SENDUNE makes AWS SES easy" becomes a sign-up panel */
.cta_box { margin-top: 48px; background: #fff; border: 1px solid #bbb; border-radius: 6px; padding: 28px 32px; }
.cta_box h2 { margin: 0 0 12px; padding: 0; border: 0; font-size: 20px; }
.cta_box > p:last-child { margin: 20px 0 0; }
.cta_box .btn { color: #fff; text-decoration: none; display: inline-block; line-height: 36px; }
.doc_table { width: 100%; border-collapse: collapse; background: #fff; border: 1px solid var(--line); font-size: 14px; }
.doc_table th { background: #eee; text-align: left; padding: 10px 14px; border-bottom: 1px solid var(--line); }
.doc_table td { padding: 10px 14px; border-top: 1px solid var(--line-soft); }
.doc_page .foot { max-width: 1280px; margin: 0 auto; padding: 20px 16px 28px; border-top: 1px solid var(--line-soft); }
@media (max-width: 860px) {
  .doc_band_in { flex-wrap: wrap; padding: 20px 16px; }
  .doc_band h1 { font-size: 24px; }
  .doc { grid-template-columns: minmax(0, 1fr); grid-template-areas: "body" "nav"; gap: 24px; padding-top: 24px; }
  .doc_nav { position: static; border-top: 1px solid var(--line-soft); padding-top: 20px; }
  .doc_nav p.nav_h:first-child, .doc_nav p.nav_h:first-child + ul { display: none; }   /* "On this page" is for wide screens; phones get the sibling list */
  .cta_box { padding: 20px; }
}
.doc_body pre { background: #fff; border: 1px solid var(--line-soft); border-radius: 4px; padding: 12px 16px; margin: 0 0 18px; overflow-x: auto; font: 13px/1.6 ui-monospace, Menlo, Consolas, monospace; color: #333; }   /* code samples scroll inside themselves on a phone */
.doc_body h3.sub { font-size: 17px; font-weight: bold; color: var(--text); margin: 28px 0 10px; }
.doc_body p, .doc_body li { overflow-wrap: anywhere; }   /* long code names break instead of widening the page on a phone */
.doc_body hr { border: 0; border-top: 1px solid var(--line-soft); margin: 28px 0; }

/* Pricing page: two plan cards side by side, the calculator under them (the home page's slider and site.js) */
.plans_doc { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 8px; }
.plan_card { background: #fff; border: 1px solid #bbb; border-radius: 6px; padding: 20px 22px; }
.plan_card h3 { font-size: 17px; font-weight: bold; color: var(--text); margin: 0 0 6px; }
.plan_card .price { font-size: 22px; font-weight: bold; color: #333; margin-bottom: 10px; }
.plan_card .price span { font-size: 13px; font-weight: normal; color: var(--quiet); }
.plan_card ul { margin: 0; padding-left: 18px; }
.calc_doc { background: #fff; border: 1px solid #bbb; border-radius: 6px; padding: 20px 22px; margin-bottom: 8px; }
.calc_doc .calc_h { font-size: 15px; font-weight: bold; margin-bottom: 8px; }
.calc_doc input[type=range] { width: 100%; margin-bottom: 8px; }
@media (max-width: 860px) { .plans_doc { grid-template-columns: 1fr; } }

/* ---------- home: an icon before each box title (DESIGN.md §6: a bare icon before a heading, in the heading's own
   grey; Font Awesome 7 solid, inlined, CC BY 4.0) ---------- */
.eyebrow .ico { width: 1em; height: 1em; fill: currentColor; vertical-align: -0.12em; margin-right: 8px; }
/* the Contacts table runs edge to edge in its tile (VNKT, 5 Oct 2026) */
.contacts .ctable { border-left: 0; border-right: 0; }
.contacts .ctable th:first-child, .contacts .ctable td:first-child { padding-left: var(--px); }
.contacts .ctable th:last-child, .contacts .ctable td:last-child { padding-right: var(--px); }
/* the Filter bar: one tag at a time, like the dashboard's tag picker */
.cfilter { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-bottom: 10px; }
.cfilter .fico { width: 14px; height: 14px; fill: var(--quiet); margin-right: 2px; }
.cfilter .chip { border: 1px solid transparent; font: inherit; font-size: 12px; cursor: pointer; margin: 0; }
.cfilter .chip:hover { border-color: currentColor; }
.cfilter .chip[aria-pressed="true"] { border-color: currentColor; box-shadow: inset 0 0 0 1px currentColor; font-weight: bold; }
.tile.brand { padding-top: 0; padding-bottom: 0; gap: 0; }   /* space-evenly alone spaces it: top, between and bottom gaps all equal (VNKT, 5 Oct 2026) */
@media (max-width: 860px) { .tile.brand { padding-top: 18px; padding-bottom: 18px; gap: 14px; } }   /* a phone sizes the tile to its content, so it needs its own air */
/* the Contacts table fills the tile's height and scrolls (VNKT, 5 Oct 2026) */
.tile.contacts { padding-bottom: 0; }
.contacts > .cfilter { margin-top: 0 !important; }
/* 30 contacts, no scroll: the tile shows as many whole rows as fit (site.js), none cut in half (VNKT, 5 Oct 2026) */
.contacts > .ctable_wrap { margin-left: calc(-1 * var(--px)); margin-right: calc(-1 * var(--px)); flex: 1; min-height: 0; margin-bottom: 0 !important; overflow: hidden; }
.contacts .ctable tr.cut { display: none; }
@media (max-width: 860px) { .contacts > .ctable_wrap { overflow-x: auto; } .contacts .ctable tbody tr:nth-child(n+7) { display: none; } }   /* a phone shows six; the table may slide sideways */
