/* ============================================
   DIYKIT.AE — Design System Extension  (matches Design System v2)
   Drop into: public/assets/css/diykit-ext.css
   Load AFTER diykit.css.

   Components the base stylesheet doesn't cover: checkout, account,
   pagination, bulk pricing, stock/delivery meta, cart progress.
   Follows v2 conventions: var(--radius) on cards/panels/controls,
   100px on pills and rails, 50% on avatars and radio dots.
   Kept in a separate file so re-exporting the design system never
   clobbers these additions.
   ============================================ */

/* ── RESTORED: doc list arrow (dropped in v2, still used by product.php) ── */
.dk-doc-item__arrow { font-family: 'JetBrains Mono', monospace; font-size: 11px; color: var(--primary); }

/* ── SHARED: PANEL ── */
.dk-panel {
  border: 1px solid var(--border); background: var(--bg2);
  margin-bottom: 24px; border-radius: var(--radius); overflow: hidden;
}
.dk-panel__head {
  display: flex; align-items: center; gap: 12px;
  border-bottom: 1px solid var(--border);
  padding: 14px 20px;
}
.dk-panel__title {
  font-family: 'JetBrains Mono', monospace;
  font-size: 10px; color: var(--primary);
  text-transform: uppercase; letter-spacing: 0.15em;
}
.dk-panel__link {
  margin-left: auto;
  font-family: 'JetBrains Mono', monospace;
  font-size: 10px; color: var(--fg3);
  text-transform: uppercase; letter-spacing: 0.1em;
  transition: color 0.2s;
}
.dk-panel__link:hover { color: var(--primary); }
.dk-panel__body { padding: 24px 20px; }

/* ── SHARED: STATUS PILL ── */
.dk-status {
  display: inline-flex; align-items: center; gap: 6px;
  font-family: 'JetBrains Mono', monospace;
  font-size: 10px; text-transform: uppercase; letter-spacing: 0.1em;
  padding: 4px 12px; border: 1px solid var(--border); color: var(--fg3);
  border-radius: 100px;
}
.dk-status::before { content: ''; width: 5px; height: 5px; border-radius: 50%; background: currentColor; }
.dk-status--ok   { color: var(--primary); border-color: color-mix(in srgb, var(--primary) 35%, transparent); background: color-mix(in srgb, var(--primary) 6%, transparent); }
.dk-status--wait { color: #f0a020; border-color: color-mix(in srgb, #f0a020 40%, transparent); }
.dk-status--off  { color: #ef4444; border-color: color-mix(in srgb, #ef4444 40%, transparent); }

/* ── SHARED: DATA TABLE ── */
.dk-table { width: 100%; border-collapse: collapse; }
.dk-table th {
  text-align: left; padding: 11px 20px;
  border-bottom: 1px solid var(--border); background: var(--bg3);
  font-family: 'JetBrains Mono', monospace;
  font-size: 10px; font-weight: 600; color: var(--fg3);
  text-transform: uppercase; letter-spacing: 0.12em;
}
.dk-table td {
  padding: 14px 20px; border-bottom: 1px solid var(--border2, var(--border));
  font-family: 'JetBrains Mono', monospace;
  font-size: 12px; color: var(--fg2);
}
.dk-table tr:last-child td { border-bottom: none; }
.dk-table tbody tr { transition: background 0.2s; }
.dk-table tbody tr:hover td { background: color-mix(in srgb, var(--primary) 4%, transparent); }
.dk-table .num { text-align: right; font-variant-numeric: tabular-nums; color: var(--fg); }
.dk-table .ref { color: var(--primary); }

/* ── SHARED: STAT TILES ── */
.dk-tiles {
  display: grid; grid-template-columns: repeat(4, 1fr);
  gap: 1px; background: var(--border);
  border-bottom: 1px solid var(--border);
}
.dk-tile { background: var(--bg2); padding: 22px 20px; }
.dk-tile__label { font-family: 'JetBrains Mono', monospace; font-size: 10px; color: var(--fg3); text-transform: uppercase; letter-spacing: 0.12em; margin-bottom: 8px; }
.dk-tile__value { font-family: 'JetBrains Mono', monospace; font-weight: 700; font-size: 30px; color: var(--fg); line-height: 1; margin-bottom: 8px; }
.dk-tile__meta  { font-family: 'JetBrains Mono', monospace; font-size: 10px; color: var(--primary); letter-spacing: 0.06em; }

/* ── SHARED: PROGRESS RAIL ── */
.dk-progress { height: 4px; background: var(--bg3); margin-top: 8px; border-radius: 100px; overflow: hidden; }
.dk-progress > i { display: block; height: 100%; background: var(--primary); border-radius: 100px; transition: width 0.3s ease; }

/* ── SHOP: PAGINATION ── */
.dk-pager {
  display: flex; justify-content: center; gap: 1px;
  background: var(--border); border: 1px solid var(--border);
  margin: 8px auto 72px; width: fit-content;
  border-radius: var(--radius); overflow: hidden;
}
.dk-pager a {
  background: var(--bg2); min-width: 40px; height: 40px;
  display: flex; align-items: center; justify-content: center; padding: 0 14px;
  font-family: 'JetBrains Mono', monospace; font-size: 11px; color: var(--fg3);
  transition: color 0.2s, background 0.2s;
}
.dk-pager a:hover { color: var(--primary); background: color-mix(in srgb, var(--primary) 6%, transparent); }
.dk-pager a.active { background: var(--primary); color: var(--primary-fg); font-weight: 700; }
.dk-pager a.dots { pointer-events: none; color: var(--border); }

/* ── PRODUCT: PRICE META ROW ── */
.dk-price-meta {
  display: flex; flex-wrap: wrap;
  border: 1px solid var(--border); background: var(--bg2);
  margin: -8px 0 20px; border-radius: var(--radius); overflow: hidden;
}
.dk-price-meta span {
  flex: 1 1 auto; padding: 9px 14px;
  border-right: 1px solid var(--border);
  font-family: 'JetBrains Mono', monospace; font-size: 10px; color: var(--fg3);
  text-align: center; white-space: nowrap;
}
.dk-price-meta span:last-child { border-right: none; }
.dk-price-meta b { color: var(--primary); font-weight: 600; }

/* ── PRODUCT: KEY FACTS ── */
.dk-kv {
  display: grid; grid-template-columns: repeat(2, 1fr);
  gap: 1px; background: var(--border); border: 1px solid var(--border);
  margin-bottom: 20px; border-radius: var(--radius); overflow: hidden;
}
.dk-kv__row { background: var(--bg2); padding: 10px 14px; }
.dk-kv__k { font-family: 'JetBrains Mono', monospace; font-size: 9.5px; color: var(--fg3); text-transform: uppercase; letter-spacing: 0.12em; margin-bottom: 3px; }
.dk-kv__v { font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--fg); font-weight: 500; }

/* ── PRODUCT: INLINE ACTIONS ── */
.dk-inline-actions { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 12px; }
.dk-inline-actions button, .dk-inline-actions a {
  font-family: 'JetBrains Mono', monospace; font-size: 10px;
  text-transform: uppercase; letter-spacing: 0.1em;
  padding: 7px 14px; border: 1px solid var(--border);
  color: var(--fg3); background: transparent; cursor: pointer;
  border-radius: var(--radius);
  transition: color 0.2s, border-color 0.2s;
}
.dk-inline-actions button:hover, .dk-inline-actions a:hover { color: var(--primary); border-color: color-mix(in srgb, var(--primary) 50%, transparent); }

/* ── PRODUCT: BULK PRICING TIERS ── */
.dk-bulk {
  /* Tiers are per product now, so the count varies - a hard 4 columns left
     a two-tier product with two empty cells. */
  display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  gap: 1px; background: var(--border); border: 1px solid var(--border);
  border-radius: var(--radius); overflow: hidden;
}
.dk-bulk__tier { background: var(--bg2); padding: 16px 14px; text-align: center; transition: background .15s ease, box-shadow .15s ease; }
.dk-bulk__tier.best { background: color-mix(in srgb, var(--primary) 8%, transparent); }
/* The band the shopper's current quantity falls into. */
.dk-bulk__tier.active {
  background: color-mix(in srgb, var(--primary) 14%, transparent);
  box-shadow: inset 0 0 0 1px var(--primary);
}
.dk-bulk__qty { font-family: 'JetBrains Mono', monospace; font-size: 10px; color: var(--fg3); text-transform: uppercase; letter-spacing: 0.12em; margin-bottom: 6px; }
.dk-bulk__price { font-family: 'JetBrains Mono', monospace; font-weight: 700; font-size: 17px; color: var(--primary); }
.dk-bulk__save { font-family: 'JetBrains Mono', monospace; font-size: 10px; color: var(--fg3); margin-top: 4px; }

/* ── PRODUCT: COMPATIBILITY LIST ── */
.dk-compat {
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: 1px; background: var(--border); border: 1px solid var(--border);
  border-radius: var(--radius); overflow: hidden;
}
.dk-compat__item { background: var(--bg2); padding: 14px 16px; display: flex; align-items: center; gap: 10px; }
.dk-compat__mark { font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--primary); }
.dk-compat__name { font-family: 'JetBrains Mono', monospace; font-size: 11px; color: var(--fg2); }

/* ── CART: SHIPPING PROGRESS + NOTE ── */
.dk-cart-progress { border-top: 1px solid var(--border); margin-top: 20px; padding-top: 20px; }
.dk-cart-progress__row { display: flex; justify-content: space-between; gap: 12px; font-family: 'JetBrains Mono', monospace; font-size: 10px; color: var(--fg3); text-transform: uppercase; letter-spacing: 0.1em; }
.dk-cart-progress__row b { color: var(--primary); }
.dk-cart-note { font-family: 'JetBrains Mono', monospace; font-size: 10px; color: var(--fg3); line-height: 1.7; border-top: 1px solid var(--border); margin-top: 20px; padding-top: 16px; }
.dk-cart-note b { color: var(--primary); }

/* ── CHECKOUT: STEP BAR ── */
.dk-steps-bar {
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: 1px; background: var(--border); border: 1px solid var(--border);
  border-radius: var(--radius); overflow: hidden;
}
.dk-step-chip { background: var(--bg2); padding: 16px 20px; display: flex; align-items: center; gap: 12px; }
.dk-step-chip__num {
  width: 26px; height: 26px; flex-shrink: 0;
  border: 1px solid var(--border); border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-family: 'JetBrains Mono', monospace; font-size: 11px; color: var(--fg3);
}
.dk-step-chip__label { font-family: 'JetBrains Mono', monospace; font-size: 11px; color: var(--fg3); text-transform: uppercase; letter-spacing: 0.1em; }
.dk-step-chip.done .dk-step-chip__num  { border-color: color-mix(in srgb, var(--primary) 45%, transparent); color: var(--primary); }
.dk-step-chip.active .dk-step-chip__num { background: var(--primary); border-color: var(--primary); color: var(--primary-fg); font-weight: 700; }
.dk-step-chip.active .dk-step-chip__label { color: var(--primary); }

/* ── CHECKOUT: RADIO OPTION LIST ── */
.dk-options {
  display: grid; gap: 1px; background: var(--border); border: 1px solid var(--border);
  border-radius: var(--radius); overflow: hidden;
}
.dk-option {
  background: var(--bg2); padding: 14px 16px;
  display: flex; align-items: center; gap: 12px; cursor: pointer;
  font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--fg2);
  transition: background 0.2s, color 0.2s;
}
.dk-option__dot { width: 13px; height: 13px; flex-shrink: 0; border: 1px solid var(--border); border-radius: 50%; }
.dk-option__meta { margin-left: auto; font-size: 10px; color: var(--fg3); text-transform: uppercase; letter-spacing: 0.1em; }
.dk-option:hover { color: var(--fg); }
.dk-option.selected { background: color-mix(in srgb, var(--primary) 7%, transparent); color: var(--primary); }
.dk-option.selected .dk-option__dot { background: var(--primary); border-color: var(--primary); box-shadow: inset 0 0 0 2px var(--bg2); }
.dk-option.selected .dk-option__meta { color: var(--primary); }

/* ── CHECKOUT: SECURE NOTE ── */
.dk-note {
  display: flex; gap: 12px; align-items: flex-start;
  border: 1px solid color-mix(in srgb, var(--primary) 30%, transparent);
  background: color-mix(in srgb, var(--primary) 5%, transparent);
  padding: 14px 16px; margin-top: 24px; border-radius: var(--radius);
}
.dk-note__tag { font-family: 'JetBrains Mono', monospace; font-size: 10px; color: var(--primary); text-transform: uppercase; letter-spacing: 0.12em; flex-shrink: 0; }
.dk-note__text { font-family: 'JetBrains Mono', monospace; font-size: 11px; color: var(--fg3); line-height: 1.7; }

/* ── CHECKOUT / ACCOUNT: TWO-COLUMN SHELL ── */
.dk-split { display: grid; grid-template-columns: 1fr 320px; gap: 40px; padding: 40px 0 80px; align-items: start; }

/* Compact form inside a panel (reuses .dk-form__* field styles) */
.dk-fields { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
.dk-fields .dk-form__group { margin-bottom: 0; }
.dk-fields .wide { grid-column: 1 / -1; }
.dk-subhead { font-family: 'JetBrains Mono', monospace; font-size: 10px; color: var(--fg3); text-transform: uppercase; letter-spacing: 0.15em; margin: 28px 0 12px; }

/* ── ACCOUNT ── */
.dk-acct {
  display: grid; grid-template-columns: 232px 1fr;
  border: 1px solid var(--border); margin: 40px 0 80px;
  border-radius: var(--radius); overflow: hidden;
}
.dk-acct__nav { border-right: 1px solid var(--border); background: var(--bg2); padding-bottom: 16px; }
.dk-acct__nav .dk-sidebar__item { padding: 10px 16px; color: var(--fg2); border-radius: 0; }
.dk-acct__nav .dk-sidebar__item:hover { color: var(--fg); }
.dk-acct__nav .dk-sidebar__item.active { color: var(--primary); }
.dk-acct__body { background: var(--bg2); min-width: 0; }
.dk-acct__id {
  padding: 16px; border-bottom: 1px solid var(--border); margin-bottom: 16px;
  display: flex; align-items: center; gap: 12px;
}
.dk-acct__avatar {
  width: 40px; height: 40px; flex-shrink: 0; border-radius: 50%;
  border: 1px solid color-mix(in srgb, var(--primary) 40%, transparent);
  background: color-mix(in srgb, var(--primary) 12%, transparent);
  display: flex; align-items: center; justify-content: center;
  font-family: 'JetBrains Mono', monospace; font-weight: 700; font-size: 16px; color: var(--primary);
}
.dk-acct__name { font-family: 'JetBrains Mono', monospace; font-size: 13px; font-weight: 600; color: var(--fg); }
.dk-acct__sub  { font-family: 'JetBrains Mono', monospace; font-size: 10px; color: var(--fg3); letter-spacing: 0.08em; }
.dk-acct__section + .dk-acct__section { border-top: 1px solid var(--border); }

/* Address cards */
.dk-addr-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1px; background: var(--border); }
.dk-addr { background: var(--bg2); padding: 18px 20px; }
.dk-addr__label { font-family: 'JetBrains Mono', monospace; font-size: 10px; color: var(--primary); text-transform: uppercase; letter-spacing: 0.12em; margin-bottom: 8px; }
.dk-addr__body { font-family: 'JetBrains Mono', monospace; font-size: 11px; color: var(--fg2); line-height: 1.8; }

/* ── FOOTER: fifth column (Account) ── */
.dk-footer__grid { grid-template-columns: 2fr 1fr 1fr 1fr 1.6fr; }

/* ── RESPONSIVE ── */
@media (max-width: 1100px) {
  .dk-tiles  { grid-template-columns: 1fr 1fr; }
  .dk-bulk   { grid-template-columns: 1fr 1fr; }
  .dk-compat { grid-template-columns: 1fr 1fr; }
  .dk-footer__grid { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 900px) {
  .dk-split { grid-template-columns: 1fr; gap: 24px; }
  .dk-acct  { grid-template-columns: 1fr; }
  .dk-acct__nav { border-right: none; border-bottom: 1px solid var(--border); }
}
@media (max-width: 640px) {
  .dk-fields, .dk-kv, .dk-addr-grid, .dk-compat { grid-template-columns: 1fr; }
  .dk-steps-bar { grid-template-columns: 1fr; }
  .dk-footer__grid { grid-template-columns: 1fr; }
  .dk-price-meta span { flex: 1 1 100%; border-right: none; border-bottom: 1px solid var(--border); }
  .dk-price-meta span:last-child { border-bottom: none; }
  .dk-table th:nth-child(3), .dk-table td:nth-child(3) { display: none; }
}

/* ── REAL-DATA STATES ── */
/* Product with no image on file */
.dk-noimg {
  width: 100%; height: 100%;
  display: flex; align-items: center; justify-content: center;
  font-size: 10px; color: var(--fg3);
  text-transform: uppercase; letter-spacing: 0.14em;
  background:
    repeating-linear-gradient(45deg,
      transparent 0 10px,
      color-mix(in srgb, var(--fg3) 7%, transparent) 10px 11px);
  min-height: 160px;
}
/* Product with no price set yet */
.dk-price--tba { font-size: 13px; color: var(--fg3); font-weight: 500; }
.dk-price s { font-size: 11px; font-weight: 400; color: var(--fg3); margin-left: 6px; }

/* Grid cell wrapper (filtering toggles this, the card fills it) */
.dk-cardwrap { display: block; min-width: 0; }
.dk-cardwrap > .dk-product-card { height: 100%; }

/* Long real product names shouldn't blow up the card */
.dk-product-card__name {
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden; min-height: 2.6em;
}

/* ── LIGHT-THEME CORRECTIONS ──
   diykit.css was tuned with dark as the default. Now that the site opens in
   light, three things need pulling back. */

/* 1. The hero PCB grid is drawn at 55% primary — vivid on near-black,
      overpowering on a light page. Half the strength in light. */
[data-theme="light"] .dk-hero {
  background-image:
    linear-gradient(color-mix(in srgb, var(--primary) 22%, transparent) 1px, transparent 1px),
    linear-gradient(90deg, color-mix(in srgb, var(--primary) 22%, transparent) 1px, transparent 1px);
}
[data-theme="light"] body {
  background-image:
    radial-gradient(circle, color-mix(in srgb, var(--primary) 12%, transparent) 1px, transparent 1px);
}

/* 2. Sidebar / filter labels sit on --fg3, which is readable on dark but
      washes out on light. */
[data-theme="light"] .dk-sidebar__item,
[data-theme="light"] .dk-cart-row,
[data-theme="light"] .dk-range-labels { color: var(--fg2); }
[data-theme="light"] .dk-sidebar__item span:last-child { color: var(--fg3); }

/* 3. Real category names are long — let them wrap without hitting the count. */
.dk-sidebar__item { align-items: flex-start; gap: 10px; line-height: 1.45; }
.dk-sidebar__item span:first-child { flex: 1; text-align: left; }
.dk-sidebar__item span:last-child { flex-shrink: 0; }

/* Real tag values can be whole phrases — keep the chips to one line. */
.dk-filter-tag {
  max-width: 100%; white-space: nowrap; overflow: hidden;
  text-overflow: ellipsis; text-align: left;
}

/* diykit.css v2 has `.dk-sidebar__item span { color: var(--border) }`, which is
   meant for the count but also catches the label span — so category names render
   at border colour (near-invisible in both themes). Label takes the button's
   colour; only the trailing count stays muted. */
.dk-sidebar__item span:first-child { color: inherit; font-size: 11px; }
.dk-sidebar__item span:last-child  { color: var(--fg3); font-size: 10px; }

/* ════════════════════════════════════════════════════════════
   READABILITY + LIGHT PASS
   diykit.css v2 was tuned dark-first. With light as the default and
   real (long, dense) catalogue copy, the muted tokens were too faint
   to read — sidebar labels, SKUs, counts and captions all sit on
   --fg3. Raising the tokens fixes every one of them at once, rather
   than patching component by component.
   ════════════════════════════════════════════════════════════ */

/* Light: lift the page further and pull the muted greys back to readable. */
[data-theme="light"] {
  --bg:      #f7fafb;   /* was #f0f4f7 */
  --bg3:     #eef4f6;   /* was #e4ecf0 */
  --fg2:     #33525f;   /* was #3a5a68 */
  --fg3:     #55737f;   /* was #7a9aa8 — clears 4.5:1 on --bg and --bg2; was 2.3:1 */
  --border:  #d5e2e9;
  --border2: #e6eef2;
}

/* Dark: same problem in reverse — --fg3 was too close to the background.
   Guarded with :not([data-theme="light"]) — a bare :root matches in light too,
   and being later in the file it would override the light block above. */
:root:not([data-theme="light"]), [data-theme="dark"] {
  --fg2: #a8c6d3;   /* was #9bbac8 */
  --fg3: #8aacbb;   /* was #6a8fa0 — 6.2:1 on --bg2, was 3.4:1 */
}

/* Sidebar rows carry real category names — they are navigation, not captions. */
.dk-sidebar__item { color: var(--fg2); }
.dk-sidebar__item:hover { color: var(--fg); }
.dk-sidebar__item.active { color: var(--primary); }

/* SKU line above the product name */
.dk-product-card__sku { color: var(--fg3); }

/* ── HERO GRID + PAGE DOTS ──
   Both should read as deliberate structure, not a faint smudge. The v2
   values were picked against near-black; on a light page they vanish. */
[data-theme="light"] .dk-hero {
  background-image:
    linear-gradient(color-mix(in srgb, var(--primary) 42%, transparent) 1.25px, transparent 1.25px),
    linear-gradient(90deg, color-mix(in srgb, var(--primary) 42%, transparent) 1.25px, transparent 1.25px);
  background-size: 40px 40px;
}
[data-theme="light"] body {
  background-image:
    radial-gradient(circle, color-mix(in srgb, var(--primary) 34%, transparent) 1.4px, transparent 1.4px);
  background-size: 30px 30px;
}
:root:not([data-theme="light"]) body, [data-theme="dark"] body {
  background-image:
    radial-gradient(circle, color-mix(in srgb, var(--primary) 30%, transparent) 1.3px, transparent 1.3px);
  background-size: 30px 30px;
}
/* The vignette must not swallow the grid it sits on. */
[data-theme="light"] .dk-hero::before {
  background:
    radial-gradient(ellipse 52% 82% at 26% 50%, color-mix(in srgb, var(--bg) 82%, transparent) 0%, transparent 100%),
    linear-gradient(to bottom, transparent 68%, var(--bg) 100%);
}

/* ── REAL LOGO ── */
.dk-logo__mark {
  width: 36px; height: 36px; flex-shrink: 0;
  object-fit: contain; display: block;
}
.dk-footer .dk-logo__mark { width: 40px; height: 40px; }

/* ── AUTH ── */
@media (max-width: 900px) { .dk-auth-grid { grid-template-columns: 1fr !important; } }

/* ════════════════════════════════════════════════════════════
   REAL PRODUCT PHOTOS — SHOW THE WHOLE PART
   v2 uses object-fit:cover everywhere, plus opacity .75 and a
   scale(1.06) hover on cards. That works for lifestyle photography;
   it crops and dims actual component shots, which are the product.
   ════════════════════════════════════════════════════════════ */
.dk-product-card__img img,
.dk-gallery__main img,
.dk-gallery__thumb img,
.dk-cart-item__img img {
  object-fit: contain;
  opacity: 1;
}
.dk-product-card__img     { background: var(--bg2); }
.dk-product-card__img img { padding: 14px; }
/* The picture is a stand-in (the category's photo, or a drawn tile) because
   the product has none of its own. Held back visually so a browsing customer
   reads it as "no photo yet" rather than as this specific part. */
.dk-product-card__img.is-stand-in img { opacity: .55; filter: saturate(.5); }
.dk-product-card:hover .dk-product-card__img.is-stand-in img { opacity: .75; }
.dk-product-card:hover .dk-product-card__img img { opacity: 1; transform: none; }

.dk-gallery__main         { background: var(--bg2); }
.dk-gallery__main img     { padding: 28px; }
.dk-gallery__thumb img    { padding: 5px; background: var(--bg2); }
.dk-cart-item__img img    { padding: 4px; }

/* ── DESCRIPTION: real content has structure, so give it room ── */
.dk-rich { color: var(--fg2); font-size: 14px; line-height: 1.8; max-width: 78ch; }
.dk-rich > *:first-child { margin-top: 0; }
.dk-rich > *:last-child  { margin-bottom: 0; }
.dk-rich p  { margin: 0 0 14px; }
.dk-rich h2, .dk-rich h3, .dk-rich h4 {
  font-family: 'JetBrains Mono', monospace;
  font-size: 12px; color: var(--fg); font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.1em;
  margin: 26px 0 10px;
}
.dk-rich ul, .dk-rich ol { margin: 0 0 16px; padding-left: 20px; }
.dk-rich li { margin-bottom: 7px; }
.dk-rich li::marker { color: var(--primary); }
.dk-rich strong, .dk-rich b { color: var(--fg); font-weight: 600; }
.dk-rich hr { border: 0; border-top: 1px solid var(--border); margin: 22px 0; }
.dk-rich table {
  width: 100%; border-collapse: collapse; margin: 0 0 18px;
  font-family: 'JetBrains Mono', monospace; font-size: 12px;
}
.dk-rich th, .dk-rich td {
  border: 1px solid var(--border); padding: 9px 12px; text-align: left; vertical-align: top;
}
.dk-rich th { background: var(--bg3); color: var(--fg3); font-weight: 600;
  text-transform: uppercase; letter-spacing: 0.1em; font-size: 10px; }
.dk-rich td { color: var(--fg2); }

/* ── BACKGROUND DOTS: make them read ── */
[data-theme="light"] body {
  background-image:
    radial-gradient(circle, color-mix(in srgb, var(--primary) 62%, transparent) 1.6px, transparent 1.6px);
  background-size: 26px 26px;
}
:root:not([data-theme="light"]) body, [data-theme="dark"] body {
  background-image:
    radial-gradient(circle, color-mix(in srgb, var(--primary) 52%, transparent) 1.5px, transparent 1.5px);
  background-size: 26px 26px;
}

/* v2's rule is "solid bg on cards/sections so dots show only in gaps", but the
   shop sidebar and toolbar were never added to that list — so the dot grid runs
   straight behind their small mono text. Same treatment as the other panels. */
.dk-sidebar__section {
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 16px 14px;
  margin-bottom: 16px;
}
.dk-sidebar__section .dk-sidebar__title { margin-bottom: 10px; }
.dk-sidebar__section .dk-sidebar__item { margin: 0 -14px; padding-left: 14px; padding-right: 14px; }
.dk-shop-toolbar {
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 10px 16px;
}

/* ════════════════════════════════════════════════════════════
   NEVER UPSCALE A PRODUCT PHOTO
   The catalogue has images from 122x122 to 940x1500. object-fit:contain
   alone still stretches a small one to fill a 180px frame, which reads as
   "zoomed and blurry". Letting the image keep its natural size and
   centering it means small photos stay sharp and large ones scale down.
   ════════════════════════════════════════════════════════════ */
.dk-product-card__img {
  display: flex; align-items: center; justify-content: center;
  padding: 14px; background: var(--bg2);
}
.dk-product-card__img img {
  width: auto; height: auto;
  max-width: 100%; max-height: 100%;
  padding: 0; object-fit: contain; opacity: 1;
}

.dk-gallery__main {
  display: flex; align-items: center; justify-content: center;
  padding: 28px; background: var(--bg2);
}
.dk-gallery__main img {
  width: auto; height: auto;
  max-width: 100%; max-height: 100%;
  padding: 0; object-fit: contain;
}

.dk-gallery__thumb {
  display: flex; align-items: center; justify-content: center;
  padding: 5px; background: var(--bg2);
}
.dk-gallery__thumb img {
  width: auto; height: auto;
  max-width: 100%; max-height: 100%;
  padding: 0; object-fit: contain;
}

.dk-cart-item__img {
  display: flex; align-items: center; justify-content: center;
  padding: 4px; background: var(--bg2);
}
.dk-cart-item__img img {
  width: auto; height: auto;
  max-width: 100%; max-height: 100%;
  padding: 0; object-fit: contain; opacity: 1;
}

/* A very small source shouldn't be blown up by the browser either. */
.dk-product-card__img img,
.dk-gallery__main img { image-rendering: auto; }
/* ════════════════════════════════════════════════════════════
   AMBIENT DOT FIELD — WAVE
   One grid, one pitch. The previous version stacked a 26px field and a
   38px field; at two different pitches they read as two competing
   patterns rather than one, and where neither mask reached, the page
   went bare. Now a single dot grid carries a moving mask whose alpha
   never drops to zero — dots are present everywhere, the wave only
   changes how strongly they read.

   Coverage floor is the 0.34 stop in the linear mask: nothing on the
   page falls below roughly a third strength. The radial adds up to
   0.5 more on top (masks composite additively), so the crest is about
   three times the trough.
   ════════════════════════════════════════════════════════════ */

/* The flat body grid is replaced by the layer below. This has to match
   the specificity of the theme-scoped `[data-theme="…"] body` rules
   earlier in this file, or those win and you get the flat grid AND the
   wave stacked on each other. */
body,
[data-theme="light"] body,
[data-theme="dark"] body,
:root:not([data-theme="light"]) body { background-image: none; }

/* v2 also paints a 28px dot grid on .dk-steps. Same pitch as the global
   field but attached to a scrolling section, so the two slide across each
   other and interfere — that is the "conflicting dots" on the home page.
   One field only. */
.dk-steps { background-image: none; }

.dk-dots {
  position: fixed;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  overflow: hidden;          /* the canvas can never extend the page */
  contain: strict;

  /* Dot presence has to carry the wave. At 1.7px on a 28px pitch the field
     covers ~1.2% of the area, so even a full-range mask only moved regional
     brightness by ~3/255 — invisible. 2.3px on 24px is ~2.9%, and the same
     mask swing then reads clearly. */
  background-image: radial-gradient(circle,
    color-mix(in srgb, var(--primary) 100%, transparent) 2.3px, transparent 2.3px);
  background-size: 24px 24px;
  background-repeat: repeat;

  /* Two soft gradients, composited additively, sized well beyond the
     viewport so only a slow slice of each crosses the screen. */
  /* Crest-to-trough range is deliberately wide (0.18 -> 1.0) and the mask
     is only ~1.5x the viewport, so two or three crests are on screen at
     once and you see a band travel rather than the whole page fading. */
  -webkit-mask-image:
    linear-gradient(115deg,
      rgba(0,0,0,.18)  0%,  rgba(0,0,0,1)   14%, rgba(0,0,0,.22) 30%,
      rgba(0,0,0,.95) 46%,  rgba(0,0,0,.20) 62%, rgba(0,0,0,1)   78%,
      rgba(0,0,0,.24) 92%,  rgba(0,0,0,.18) 100%),
    radial-gradient(85% 70% at 28% 38%,
      rgba(0,0,0,.55) 0%, rgba(0,0,0,.20) 58%, rgba(0,0,0,0) 100%);
  mask-image:
    linear-gradient(115deg,
      rgba(0,0,0,.18)  0%,  rgba(0,0,0,1)   14%, rgba(0,0,0,.22) 30%,
      rgba(0,0,0,.95) 46%,  rgba(0,0,0,.20) 62%, rgba(0,0,0,1)   78%,
      rgba(0,0,0,.24) 92%,  rgba(0,0,0,.18) 100%),
    radial-gradient(85% 70% at 28% 38%,
      rgba(0,0,0,.55) 0%, rgba(0,0,0,.20) 58%, rgba(0,0,0,0) 100%);

  -webkit-mask-size: 125% 125%, 115% 115%;
          mask-size: 125% 125%, 115% 115%;
  -webkit-mask-repeat: no-repeat, no-repeat;
          mask-repeat: no-repeat, no-repeat;
  -webkit-mask-position: 0% 0%, 100% 0%;
          mask-position: 0% 0%, 100% 0%;

  animation: dk-wave 20s linear infinite alternate;
  will-change: mask-position;
}

/* diykit-ext.js replaces the masked grid above with a canvas as soon as it
   runs — the CSS version stays as the no-JS fallback. */
.dk-dots canvas { position: absolute; inset: 0; display: block; }

/* Only the mask travels — the dots themselves stay pinned to the grid,
   so the pattern breathes instead of sliding. */
@keyframes dk-wave {
  from {
    -webkit-mask-position: 0% 0%, 100% 0%;
            mask-position: 0% 0%, 100% 0%;
  }
  to {
    -webkit-mask-position: 100% 100%, 0% 100%;
            mask-position: 100% 100%, 0% 100%;
  }
}

/* Dark needs less — the field is brighter against near-black. */
:root:not([data-theme="light"]) .dk-dots,
[data-theme="dark"] .dk-dots {
  background-image: radial-gradient(circle,
    color-mix(in srgb, var(--primary) 82%, transparent) 2.2px, transparent 2.2px);
}

/* Motion is ambient, never necessary — hold it mid-cycle if asked. */
@media (prefers-reduced-motion: reduce) {
  .dk-dots {
    animation: none;
    -webkit-mask-position: 50% 50%, 50% 50%;
            mask-position: 50% 50%, 50% 50%;
  }
}

/* ── PRODUCT INFO COLUMN ──
   Description, price, buttons and the trust row sat straight on the dot
   field, which made the body copy hard to read. v2's own convention is a
   solid fill on anything carrying text, so this column becomes a panel
   like every other. The gallery side already has one. */
.dk-pdp-info {
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 26px 28px;
  align-self: start;
}
@media (max-width: 900px) { .dk-pdp-info { padding: 20px 18px; } }

/* ── HERO BACKGROUND SLIDES ──
   The homepage_blocks hero carries several background images and an
   interval. v2 styles a single .dk-hero__bg-img at opacity .45; stacking
   them and crossfading keeps that treatment and adds the rotation. */
.dk-hero__bg-img { opacity: 0; transition: opacity 1.1s ease; }
.dk-hero__bg-img.is-on { opacity: .45; }
@media (prefers-reduced-motion: reduce) {
  .dk-hero__bg-img { transition: none; }
}

/* ════════════════════════════════════════════════════════════
   MOBILE
   The base stylesheet stops at a couple of breakpoints and assumes a
   .dk-nav-quote class the markup never carried, so at 390px the action
   row was 326px wide and pushed the whole page 83px past the viewport.
   Everything below either fixes that or covers the components added
   here (checkout, account, tables, tabs, panels).
   ════════════════════════════════════════════════════════════ */

/* ── NAVBAR ── */
@media (max-width: 760px) {
  /* Secondary actions live in the menu on small screens; the bar keeps
     theme, cart and the hamburger. */
  .dk-nav-hide-sm { display: none !important; }
  .dk-nav__actions { gap: 6px; margin-left: auto; }
  .dk-nav__inner { gap: 10px; }
  .dk-logo__text .tld { display: none; }
}
@media (max-width: 600px) {
  .dk-nav-quote { display: none !important; }   /* base rule needs the class */
  .dk-logo__mark { width: 30px; height: 30px; }
  .dk-logo__text { font-size: 14px; }
  .dk-icon-btn { width: 34px; height: 34px; }
}

/* Menu: full-width rows, comfortable tap targets, scrolls if it runs long */
.dk-mobile-menu { max-height: calc(100vh - 56px); overflow-y: auto; }
.dk-mobile-menu a { padding: 15px 20px; font-size: 12.5px; }
.dk-mobile-menu__cta {
  color: var(--primary) !important;
  background: color-mix(in srgb, var(--primary) 7%, transparent);
  font-weight: 600;
}

/* ── SHOP ── */
@media (max-width: 900px) {
  /* base makes the filter blocks inline-block; as panels they need to stack */
  .dk-sidebar__section { display: block; margin-right: 0; }
  .dk-shop-toolbar { flex-wrap: wrap; gap: 10px; }
  .dk-shop-toolbar .dk-select { margin-left: auto; }
}
@media (max-width: 520px) {
  .dk-product-grid { grid-template-columns: 1fr; }
  .dk-cat-grid { grid-template-columns: 1fr 1fr; }
}

/* ── PRODUCT ── */
@media (max-width: 760px) {
  /* four tabs don't fit — let the bar scroll rather than wrap or clip */
  .dk-tabs__bar {
    overflow-x: auto; -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
  }
  .dk-tabs__bar::-webkit-scrollbar { display: none; }
  .dk-tabs__btn { flex: 0 0 auto; padding: 14px 16px; }
  .dk-tabs__panel { padding: 20px 16px; }
  .dk-pdp-info { padding: 20px 16px; }
  .dk-gallery__thumb { width: 62px; height: 50px; }
  .dk-qty-cart { flex-wrap: wrap; }
  .dk-qty-cart .dk-cart-btn { flex: 1 1 100%; order: 3; }
  .dk-bulk { grid-template-columns: 1fr 1fr; }
}

/* ── TABLES ── */
@media (max-width: 700px) {
  /* Orders, saved kits and wishlist carry too many columns for a phone.
     Scrolling the table beats hiding data or squeezing it unreadable. */
  .dk-table { display: block; overflow-x: auto; white-space: nowrap; -webkit-overflow-scrolling: touch; }
  .dk-table thead, .dk-table tbody, .dk-table tr { display: table; width: 100%; table-layout: auto; }
  .dk-table th, .dk-table td { padding: 11px 14px; }
}

/* ── ACCOUNT / CHECKOUT ── */
@media (max-width: 900px) {
  .dk-acct__nav { display: flex; flex-wrap: wrap; padding: 0; }
  .dk-acct__id { flex: 1 1 100%; margin-bottom: 0; }
  .dk-acct__nav .dk-sidebar__item {
    flex: 1 1 auto; width: auto; border-left: none;
    border-bottom: 2px solid transparent; justify-content: center; text-align: center;
  }
  .dk-acct__nav .dk-sidebar__item.active { border-left: none; border-bottom-color: var(--primary); }
  .dk-acct__nav .dk-sidebar__item span:last-child { display: none; }
  .dk-tiles { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 560px) {
  .dk-tiles { grid-template-columns: 1fr; }
  .dk-tile__value { font-size: 26px; }
}

/* ── CART ── */
@media (max-width: 640px) {
  .dk-cart-item { flex-wrap: wrap; gap: 12px; }
  .dk-cart-item__info { flex: 1 1 60%; min-width: 0; }
  .dk-cart-item__name { white-space: normal; }
  .dk-cart-item__price { width: auto; margin-left: auto; }
  .dk-cart-item__img { width: 60px; height: 52px; }
}

/* ── ODDS AND ENDS ── */
.dk-ai-card { overflow: hidden; }          /* the decorative glow escaped the card */
@media (max-width: 600px) {
  .dk-section-title { font-size: clamp(19px, 5.4vw, 26px); }
  .dk-panel__body { padding: 18px 16px; }
  .dk-panel__head { padding: 12px 16px; }
  .dk-note { flex-direction: column; gap: 6px; }
  .dk-price-meta span { text-align: left; }
  .dk-inline-actions button, .dk-inline-actions a { flex: 1 1 auto; justify-content: center; }
}

/* Spec rows are label(140px fixed) + value side by side. Real spec values
   are long, so on a phone the pair runs past the viewport — stack them. */
@media (max-width: 560px) {
  .dk-spec-row { flex-direction: column; gap: 3px; }
  .dk-spec-label { width: auto; }
  .dk-spec-value { word-break: break-word; }
}

/* Grid and flex children default to min-width:auto, so a long product name
   or a wide table stops the column shrinking and the page overflows instead.
   Explicit min-width:0 lets them size to the track. */
.dk-product-layout > *,
.dk-shop-layout > *,
.dk-split > *,
.dk-acct > *,
.dk-cart-layout > *,
.dk-product-grid > *,
.dk-auth-grid > * { min-width: 0; }

/* Real product names run to 170 characters with unbroken runs like
   "Overcharge/Overdischarge/Short-Circuit". In a monospace face those have
   no break opportunity, so the heading pushes the page sideways on a phone.
   Allow a break anywhere for the long-name fields. */
.dk-product-title,
.dk-product-card__name,
.dk-cart-item__name,
.dk-section-title,
.dk-breadcrumb__inner .current { overflow-wrap: anywhere; }
.dk-rich, .dk-product-desc, .dk-spec-value, .dk-kv__v { overflow-wrap: break-word; }


/* ═══════════════════════════════════════════════════════════════════════
   KIT PAGES
   The v2 design set added the kit listing and kit detail screens. Their
   own rules live in diykit.css (.dk-kit-card, .dk-parts-table, .dk-diagram-*,
   .dk-build-step, .dk-path-card, .dk-featured-kit). Everything below is the
   glue the real data needed: section spacing, the quote/price states, the
   sidebar blocks, and the phone behaviour for the two wide components.
   ═══════════════════════════════════════════════════════════════════════ */

/* ── section rhythm ── */
.dk-kit-paths,
.dk-kit-featured-wrap,
.dk-kit-grid-wrap,
.dk-kit-cta,
.dk-kit-related { padding: 64px 0; border-bottom: 1px solid var(--border); }
.dk-kit-featured-wrap { background: var(--bg2); }
.dk-kit-grid-wrap { padding-bottom: 80px; }
.dk-kit-related { border-bottom: none; border-top: 1px solid var(--border); }
.dk-steps--kits { border-top: 1px solid var(--border); }
.dk-kit-page { padding-top: 40px; padding-bottom: 80px; }
.dk-centered-head { text-align: center; margin-bottom: 40px; }
.dk-hero__actions,
.dk-featured-kit__actions { display: flex; gap: 12px; flex-wrap: wrap; }
.dk-path-card__cta { margin-top: auto; }
.dk-path-card__cta--invert { background: var(--primary-fg); color: var(--primary); }

/* ── typography helpers the kit pages use ── */
.dk-micro-label {
  font-family: 'JetBrains Mono', monospace; font-size: 10px; color: var(--fg3);
  text-transform: uppercase; letter-spacing: .12em; margin-bottom: 6px;
}
.dk-micro-note { font-family: 'JetBrains Mono', monospace; font-size: 11px; color: var(--fg3); }
.dk-kit-lede { color: var(--fg2); font-size: 15px; line-height: 1.85; margin-bottom: 28px; }
.dk-kit-section__note {
  font-family: 'JetBrains Mono', monospace; font-size: 11.5px; color: var(--fg3);
  margin: -6px 0 16px;
}
.dk-price--xl  { font-size: 32px; }
.dk-price--xxl { font-size: 36px; }
/* Kits with price 0.00 in the DB are quote-only. Styling them as a price
   would read as free, so they get the muted treatment instead. */
.dk-price--quote { color: var(--fg2); font-size: 20px; letter-spacing: .02em; }
.dk-price--xxl.dk-price--quote { font-size: 24px; }
.dk-dot-sep { color: var(--border); }
.dk-kit-card__guide { color: var(--primary); }
.dk-kit-grid__empty {
  font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--fg3);
  text-align: center; padding: 40px 0;
}

/* ── filter row ── */
.dk-filter-row { display: flex; gap: 8px; flex-wrap: wrap; }
.dk-filter-tag span { opacity: .55; margin-left: 4px; }

/* ── parts table extras ── */
.dk-parts-table__qty  { font-size: 12px; color: var(--fg3); }
.dk-parts-table__role { font-size: 13px; color: var(--fg3); }

/* ── wiring block ── */
.dk-diagram-visual__note,
.dk-diagram-legend__text {
  font-size: 11.5px; color: var(--fg3); line-height: 1.7; margin-top: 12px;
}
.dk-diagram-legend__text { margin: 0 0 14px; font-size: 12.5px; color: var(--fg2); }

/* ── substitution card ── */
.dk-addon-card__row {
  display: flex; align-items: center; justify-content: space-between;
  gap: 16px; flex-wrap: wrap;
}
.dk-addon-card__title {
  font-family: 'JetBrains Mono', monospace; font-size: 13px; font-weight: 600;
  color: var(--fg); margin-bottom: 4px;
}
.dk-addon-card__sub { font-size: 13px; color: var(--fg3); max-width: 46ch; }

/* ── spec table (reused from the product page pattern) ── */
.dk-spec-table { border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
.dk-spec-row {
  display: flex; gap: 16px; padding: 11px 14px;
  border-bottom: 1px solid var(--border); font-size: 13px;
}
.dk-spec-row:last-child { border-bottom: none; }
.dk-spec-row:nth-child(odd) { background: color-mix(in srgb, var(--fg) 2.5%, transparent); }
.dk-spec-row__k {
  width: 190px; flex-shrink: 0; color: var(--fg3);
  font-family: 'JetBrains Mono', monospace; font-size: 11.5px;
  text-transform: uppercase; letter-spacing: .06em;
}
.dk-spec-row__v { color: var(--fg2); overflow-wrap: anywhere; }

/* ── description prose ── */
.dk-prose { color: var(--fg2); font-size: 14.5px; line-height: 1.85; }
.dk-prose h2, .dk-prose h3, .dk-prose h4 {
  color: var(--fg); font-family: 'JetBrains Mono', monospace;
  font-size: 13px; text-transform: uppercase; letter-spacing: .08em;
  margin: 26px 0 10px;
}
.dk-prose p  { margin: 0 0 14px; }
.dk-prose ul, .dk-prose ol { margin: 0 0 16px; padding-left: 20px; }
.dk-prose li { margin-bottom: 7px; }
.dk-prose strong { color: var(--fg); }
.dk-prose table { width: 100%; border-collapse: collapse; margin: 0 0 16px; font-size: 13px; }
.dk-prose th, .dk-prose td { border: 1px solid var(--border); padding: 8px 10px; text-align: left; }
.dk-prose th { color: var(--fg); background: var(--bg2); }

/* ── sidebar ── */
.dk-kit-sidebar__price { margin-bottom: 16px; }
.dk-kit-sidebar__amount { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.dk-kit-sidebar__cta {
  width: 100%; justify-content: center; display: flex;
  padding: 14px; margin-bottom: 10px;
}
.dk-kit-sidebar__cta--last { padding: 12px; margin-bottom: 20px; }
.dk-kit-sidebar__block { border-top: 1px solid var(--border); padding-top: 20px; }
.dk-kit-sidebar__head {
  font-size: 10px; color: var(--primary); text-transform: uppercase;
  letter-spacing: .12em; margin-bottom: 14px;
}
.dk-kit-sidebar__row { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }
.dk-kit-sidebar__row--top { align-items: flex-start; gap: 8px; margin-bottom: 8px; }
.dk-kit-sidebar__icon { color: var(--primary); font-size: 13px; width: 16px; flex-shrink: 0; }
.dk-kit-sidebar__arrow { color: var(--primary); font-size: 12px; flex-shrink: 0; }
.dk-kit-sidebar__text { font-size: 11px; color: var(--fg2); line-height: 1.5; overflow-wrap: anywhere; }
.dk-kit-oos-box__title { font-size: 11px; font-weight: 600; color: var(--fg); margin-bottom: 6px; }
.dk-kit-oos-box__text { font-size: 12px; color: var(--fg3); line-height: 1.7; }
.dk-kit-oos-box--neutral { border-color: var(--border); }

/* ── the two containers that can overflow ── */
/* Grid/flex children are min-width:auto by default, so a 90-character part
   name or a wide table refuses to shrink and pushes the page sideways. */
.dk-kit-layout > *,
.dk-kit-main > *,
.dk-parts-table__row > *,
.dk-featured-kit > *,
.dk-kit-card__body > * { min-width: 0; }
.dk-parts-table__name,
.dk-kit-card__name,
.dk-featured-kit__title,
.dk-kit-section__title,
.dk-part-chip { overflow-wrap: anywhere; }
/* The sticky section nav is a single row of links; let it scroll rather than
   wrap into the sticky bar's height. */
.dk-kit-nav__inner {
  overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch;
}
.dk-kit-nav__inner::-webkit-scrollbar { display: none; }
.dk-kit-nav__link { white-space: nowrap; }
/* Code blocks keep their own scroller so a long line never widens the page. */
.dk-code-pre { overflow-x: auto; }

@media (max-width: 760px) {
  .dk-kit-paths,
  .dk-kit-featured-wrap,
  .dk-kit-grid-wrap,
  .dk-kit-cta,
  .dk-kit-related { padding: 44px 0; }
  .dk-kit-page { padding-top: 24px; padding-bottom: 52px; }
  .dk-centered-head { margin-bottom: 28px; }
  .dk-price--xl { font-size: 26px; }
  .dk-price--xxl { font-size: 30px; }
  .dk-spec-row { flex-direction: column; gap: 3px; }
  .dk-spec-row__k { width: auto; }
  .dk-addon-card__sub { max-width: none; }
  .dk-kit-stats { flex-wrap: wrap; }
}

@media (max-width: 480px) {
  /* Two kit cards side by side leaves ~150px per card at 390px, which the
     card's own padding and 12px name cannot fit. One per row below this. */
  .dk-kit-grid { grid-template-columns: 1fr; }
  .dk-hero__actions .dk-btn,
  .dk-featured-kit__actions .dk-btn { flex: 1 1 auto; justify-content: center; }
}

/* v2's .dk-steps__grid is a fixed 3-column grid, and the grid element itself
   is painted with --border so the 2px gaps read as hairline rules between
   cells. The home page has exactly three steps so it tiles cleanly; the kits
   page has four, which leaves two empty cells on the second row rendering as
   a solid border-coloured block beside step 04. The four-step variant gets
   its own track count. */
.dk-steps--kits .dk-steps__grid { grid-template-columns: repeat(4, 1fr); }
@media (max-width: 1100px) { .dk-steps--kits .dk-steps__grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 620px)  { .dk-steps--kits .dk-steps__grid { grid-template-columns: 1fr; } }

/* Parts table on narrow screens.
   v2 drops the Stock column first (≤768) and Role second (≤480). On a kit
   page that is backwards: whether each part is in stock is the reason the
   table exists — this kit has 25 of 28 parts unavailable and at 390px the
   only remaining signal was a slightly dimmer row. Drop Role instead, and
   below 480 fold Stock onto its own line under the component name. */
@media (max-width: 768px) {
  .dk-parts-table__head,
  .dk-parts-table__row { grid-template-columns: 1fr .4fr auto; }
  .dk-parts-table__head span:nth-child(3),
  .dk-parts-table__row span:nth-child(3) { display: none; }
  .dk-parts-table__head span:nth-child(4),
  .dk-parts-table__row span:nth-child(4) { display: block; }
}
@media (max-width: 480px) {
  .dk-parts-table__head { display: none; }
  .dk-parts-table__row {
    grid-template-columns: 1fr auto;
    grid-template-areas: "name qty" "stock qty";
    row-gap: 6px; align-items: center;
  }
  .dk-parts-table__row span:nth-child(1) { grid-area: name; }
  .dk-parts-table__row span:nth-child(2) { grid-area: qty; }
  .dk-parts-table__row span:nth-child(4) { grid-area: stock; display: block; }
}

/* Wiring board.
   v2's .dk-diagram-visual is a centred flex ROW holding a single child (the
   board, at width:100%). The kit page adds a caption under it, which as a
   second flex item lands beside the board and overlaps it. Stack instead. */
.dk-diagram-visual { flex-direction: column; }
.dk-diagram-visual__note { width: 100%; }

/* v2 colours the board chips through hand-written classes (.main, .sensor,
   .power …) chosen per example kit. These chips are generated from the kit's
   own parts, so the colour keys off the role instead — same palette. */
.dk-diagram-chip { background: var(--bg2); color: var(--fg2); border-color: var(--border); }
.dk-diagram-chip[data-role="controller-board"] {
  background: var(--primary); color: var(--primary-fg);
  border-color: var(--primary); grid-column: 1 / -1;
}
.dk-diagram-chip[data-role="sensor"] {
  background: color-mix(in srgb, var(--primary) 15%, var(--bg2));
  color: var(--fg); border-color: color-mix(in srgb, var(--primary) 30%, transparent);
}
.dk-diagram-chip[data-role="display"] {
  background: color-mix(in srgb, var(--primary) 10%, var(--bg2));
  color: var(--fg); border-color: color-mix(in srgb, var(--primary) 25%, transparent);
}
.dk-diagram-chip[data-role="motion"] {
  background: color-mix(in srgb, var(--primary) 8%, var(--bg2));
  color: var(--fg); border-color: color-mix(in srgb, var(--primary) 20%, transparent);
}
.dk-diagram-chip[data-role="power"] {
  background: color-mix(in srgb, #f59e0b 10%, var(--bg2));
  color: #b45309; border-color: color-mix(in srgb, #f59e0b 25%, transparent);
}
:root[data-theme="dark"] .dk-diagram-chip[data-role="power"] { color: #f59e0b; }


/* ═══════════════════════════════════════════════════════════════════════
   KIT DETAIL — second pass
   Grouped parts table, generated covers, wiring map, checkable build steps,
   the learn block, the compare table and the sticky action bar.
   ═══════════════════════════════════════════════════════════════════════ */

/* ── generated cover ── */
/* Kits with no photo get an inline SVG diagram instead of a broken image.
   Inline (not <img>) so it reads the theme tokens and flips with dark mode. */
.dk-kit-cover { display: block; width: 100%; height: 100%; }
.dk-kit-img-wrap--drawn { padding: 0; background: var(--bg2); }
.dk-kit-img-wrap--drawn .dk-kit-cover { aspect-ratio: 8 / 5; }
.dk-kit-card__img .dk-kit-cover,
.dk-featured-kit__img .dk-kit-cover { position: absolute; inset: 0; width: 100%; height: 100%; }

/* ── media + thumbnail rail ── */
.dk-kit-media { margin-bottom: 24px; }
.dk-kit-thumbs {
  display: flex; gap: 8px; margin-top: 10px;
  overflow-x: auto; scrollbar-width: none; padding-bottom: 2px;
}
.dk-kit-thumbs::-webkit-scrollbar { display: none; }
.dk-kit-thumb {
  flex: 0 0 auto; width: 62px; height: 62px; padding: 4px;
  background: var(--bg2); border: 1px solid var(--border);
  border-radius: calc(var(--radius) - 2px); cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  transition: border-color .15s;
}
.dk-kit-thumb:hover { border-color: var(--primary); }
.dk-kit-thumb.is-on { border-color: var(--primary); box-shadow: inset 0 0 0 1px var(--primary); }
.dk-kit-thumb img { max-width: 100%; max-height: 100%; width: auto; height: auto; object-fit: contain; }
.dk-kit-thumb--drawn { color: var(--primary); font-size: 18px; }

/* ── price + availability above the fold ── */
.dk-kit-topline {
  display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap;
  margin: 0 0 20px; padding-bottom: 18px; border-bottom: 1px solid var(--border);
}
.dk-kit-topline__stock {
  font-family: 'JetBrains Mono', monospace; font-size: 11px;
  padding: 4px 9px; border-radius: 2px; border: 1px solid;
  letter-spacing: .04em; margin-left: auto;
}
.dk-kit-topline__stock--ok    { color: var(--primary); border-color: color-mix(in srgb, var(--primary) 40%, transparent); background: color-mix(in srgb, var(--primary) 8%, transparent); }
.dk-kit-topline__stock--part  { color: #b45309; border-color: color-mix(in srgb, #f59e0b 40%, transparent); background: color-mix(in srgb, #f59e0b 8%, transparent); }
.dk-kit-topline__stock--quote { color: var(--fg3); border-color: var(--border); }
:root[data-theme="dark"] .dk-kit-topline__stock--part { color: #f59e0b; }

/* ── availability meter ── */
.dk-stock-meter { margin: 0 0 22px; }
.dk-stock-meter__head {
  display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap;
  margin-bottom: 8px; font-size: 11.5px;
}
.dk-stock-meter__count { color: var(--fg); font-weight: 600; }
.dk-stock-meter__value { color: var(--fg3); }
.dk-stock-meter__bar {
  height: 5px; background: color-mix(in srgb, var(--fg) 10%, transparent);
  border-radius: 3px; overflow: hidden;
}
.dk-stock-meter__bar span { display: block; height: 100%; background: var(--primary); }
.dk-kit-sidebar__meter { margin-bottom: 16px; display: grid; gap: 6px; }

/* ── grouped parts ── */
.dk-parts-groups { border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
.dk-parts-group { border-bottom: 1px solid var(--border); }
.dk-parts-group:last-child { border-bottom: none; }
.dk-parts-group__head {
  display: flex; align-items: center; gap: 12px; padding: 12px 14px;
  background: var(--bg2); cursor: pointer; list-style: none; user-select: none;
}
.dk-parts-group__head::-webkit-details-marker { display: none; }
.dk-parts-group__head:hover { background: color-mix(in srgb, var(--fg) 4%, var(--bg2)); }
.dk-parts-group__role {
  font-family: 'JetBrains Mono', monospace; font-size: 11px; font-weight: 600;
  text-transform: uppercase; letter-spacing: .08em; color: var(--fg);
  padding: 3px 8px; border-radius: 2px; border: 1px solid var(--border);
  background: var(--bg);
}
.dk-parts-group__count { font-size: 11px; color: var(--fg3); }
.dk-parts-group__chev { margin-left: auto; color: var(--fg3); font-size: 11px; transition: transform .18s; }
.dk-parts-group[open] .dk-parts-group__chev { transform: rotate(180deg); }

.dk-part-row {
  display: grid; grid-template-columns: 48px 1fr 44px 88px 96px;
  align-items: center; gap: 12px; padding: 10px 14px;
  border-top: 1px solid var(--border);
}
.dk-part-row.oos { opacity: .62; }
.dk-part-row:hover { background: color-mix(in srgb, var(--fg) 3%, transparent); }
.dk-part-row__thumb {
  width: 48px; height: 48px; border: 1px solid var(--border); background: var(--bg2);
  display: flex; align-items: center; justify-content: center; border-radius: 2px;
}
.dk-part-row__thumb img { max-width: 100%; max-height: 100%; width: auto; height: auto; object-fit: contain; }
.dk-part-row__glyph { color: var(--primary); opacity: .5; font-size: 15px; }
.dk-part-row__body { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.dk-part-row__name {
  font-family: 'JetBrains Mono', monospace; font-size: 12px; font-weight: 600;
  color: var(--fg); overflow-wrap: anywhere; line-height: 1.45;
}
a.dk-part-row__name:hover { color: var(--primary); }
.dk-part-row__sku { font-size: 10px; color: var(--fg3); letter-spacing: .04em; }
.dk-part-row__qty { font-size: 12px; color: var(--fg3); }
.dk-part-row__price { font-size: 12px; color: var(--fg2); text-align: right; }
.dk-part-row__stock { text-align: right; }

/* ── wiring map ── */
.dk-wire-map {
  display: grid; grid-template-columns: 220px 1fr; gap: 0;
  border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden;
  margin-bottom: 18px;
}
.dk-wire-map__hub {
  background: color-mix(in srgb, var(--primary) 10%, var(--bg2));
  border-right: 1px solid var(--border); padding: 22px 18px;
  display: flex; flex-direction: column; justify-content: center; gap: 6px;
}
.dk-wire-map__hub-label {
  font-size: 10px; letter-spacing: .12em; text-transform: uppercase; color: var(--primary);
}
.dk-wire-map__hub-name {
  font-family: 'JetBrains Mono', monospace; font-size: 12.5px; font-weight: 600;
  color: var(--fg); line-height: 1.5; overflow-wrap: anywhere;
}
.dk-wire-map__rows { padding: 6px 0; }
.dk-wire-row {
  display: grid; grid-template-columns: 132px 22px 1fr; align-items: center; gap: 10px;
  padding: 9px 16px 9px 0; border-bottom: 1px solid var(--border);
}
.dk-wire-row:last-child { border-bottom: none; }
.dk-wire-row__role {
  font-family: 'JetBrains Mono', monospace; font-size: 10.5px; font-weight: 600;
  text-transform: uppercase; letter-spacing: .06em;
  padding: 4px 8px; border-radius: 2px; border: 1px solid var(--border);
  background: var(--bg2); color: var(--fg2); text-align: center;
}
.dk-wire-row__line { height: 1px; background: var(--border); }
.dk-wire-row__parts { display: flex; flex-wrap: wrap; gap: 6px; min-width: 0; }
.dk-wire-chip {
  font-family: 'JetBrains Mono', monospace; font-size: 10.5px; color: var(--fg2);
  padding: 3px 8px; border: 1px solid var(--border); border-radius: 2px;
  background: var(--bg); overflow-wrap: anywhere;
}
/* A part that is out of stock is still part of the kit — a strike-through
   read as "removed from the build". Dim it and dash the border instead. */
.dk-wire-chip.oos { opacity: .6; border-style: dashed; }
.dk-wire-chip--more { color: var(--primary); border-color: color-mix(in srgb, var(--primary) 35%, transparent); }
.dk-wire-notes {
  border-left: 2px solid var(--primary); padding: 4px 0 4px 16px;
}
.dk-wire-notes p { font-size: 13px; color: var(--fg2); line-height: 1.8; margin: 0; }

/* role colours, shared by the parts groups and the wiring map */
.dk-parts-group__role[data-role="controller-board"],
.dk-wire-row__role[data-role="controller-board"] { color: var(--primary-fg); background: var(--primary); border-color: var(--primary); }
.dk-parts-group__role[data-role="sensor"],
.dk-wire-row__role[data-role="sensor"] { color: var(--fg); background: color-mix(in srgb, var(--primary) 16%, var(--bg2)); border-color: color-mix(in srgb, var(--primary) 32%, transparent); }
.dk-parts-group__role[data-role="display"],
.dk-wire-row__role[data-role="display"] { color: var(--fg); background: color-mix(in srgb, var(--primary) 10%, var(--bg2)); border-color: color-mix(in srgb, var(--primary) 24%, transparent); }
.dk-parts-group__role[data-role="motion"],
.dk-wire-row__role[data-role="motion"] { color: var(--fg); background: color-mix(in srgb, var(--primary) 7%, var(--bg2)); border-color: color-mix(in srgb, var(--primary) 18%, transparent); }
.dk-parts-group__role[data-role="power"],
.dk-wire-row__role[data-role="power"] { color: #b45309; background: color-mix(in srgb, #f59e0b 10%, var(--bg2)); border-color: color-mix(in srgb, #f59e0b 28%, transparent); }
:root[data-theme="dark"] .dk-parts-group__role[data-role="power"],
:root[data-theme="dark"] .dk-wire-row__role[data-role="power"] { color: #f59e0b; }

/* ── checkable build steps ── */
.dk-build { border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
.dk-build__progress {
  display: flex; align-items: center; gap: 12px;
  padding: 12px 16px; background: var(--bg2); border-bottom: 1px solid var(--border);
}
.dk-build__bar {
  flex: 1; height: 5px; border-radius: 3px; overflow: hidden;
  background: color-mix(in srgb, var(--fg) 10%, transparent);
}
.dk-build__bar span { display: block; height: 100%; background: var(--primary); transition: width .25s ease; }
.dk-build__count { font-size: 11px; color: var(--fg3); flex-shrink: 0; }
.dk-build__reset {
  font-family: 'JetBrains Mono', monospace; font-size: 10px; text-transform: uppercase;
  letter-spacing: .08em; color: var(--fg3); background: none; border: none;
  cursor: pointer; padding: 0; flex-shrink: 0;
}
.dk-build__reset:hover { color: var(--primary); }
.dk-build .dk-build-steps { display: block; }
.dk-build .dk-build-step {
  display: grid; grid-template-columns: 22px 34px 1fr; align-items: start; gap: 12px;
  padding: 13px 16px; border-bottom: 1px solid var(--border);
  cursor: pointer; transition: background .15s;
}
.dk-build .dk-build-step:last-child { border-bottom: none; }
.dk-build .dk-build-step:hover { background: color-mix(in srgb, var(--fg) 3%, transparent); }
.dk-build-step__check {
  appearance: none; width: 16px; height: 16px; margin: 2px 0 0;
  border: 1px solid var(--border); border-radius: 2px; background: var(--bg);
  cursor: pointer; flex-shrink: 0; position: relative;
}
.dk-build-step__check:checked { background: var(--primary); border-color: var(--primary); }
.dk-build-step__check:checked::after {
  content: ''; position: absolute; left: 4.5px; top: 1px;
  width: 4px; height: 8px; border: solid var(--primary-fg);
  border-width: 0 2px 2px 0; transform: rotate(45deg);
}
.dk-build-step__check:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.dk-build .dk-build-step__num { font-size: 11px; color: var(--fg3); padding-top: 2px; }
.dk-build .dk-build-step__text { font-size: 13.5px; color: var(--fg2); line-height: 1.75; }
.dk-build .dk-build-step.is-done .dk-build-step__text { color: var(--fg3); text-decoration: line-through; text-decoration-color: var(--border); }
.dk-build .dk-build-step.is-done .dk-build-step__num { color: var(--primary); }

/* ── learn block ── */
.dk-learn-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 2px; background: var(--border); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
.dk-learn-card { background: var(--bg); padding: 20px; }
.dk-learn-card__label { font-size: 10px; letter-spacing: .12em; text-transform: uppercase; color: var(--primary); margin-bottom: 10px; }
.dk-learn-card p { font-size: 13px; color: var(--fg2); line-height: 1.8; margin: 0; }
.dk-learn-card .dk-also-list { margin: 0; }

/* ── compare table ── */
.dk-compare-scroll { overflow-x: auto; border: 1px solid var(--border); border-radius: var(--radius); }
.dk-compare { width: 100%; min-width: 560px; border-collapse: collapse; font-size: 13px; }
.dk-compare th {
  font-family: 'JetBrains Mono', monospace; font-size: 10px; text-transform: uppercase;
  letter-spacing: .1em; color: var(--fg3); text-align: left; font-weight: 500;
  padding: 11px 14px; background: var(--bg2); border-bottom: 1px solid var(--border);
}
.dk-compare td { padding: 12px 14px; border-bottom: 1px solid var(--border); color: var(--fg2); }
.dk-compare tr:last-child td { border-bottom: none; }
.dk-compare .num { text-align: right; }
.dk-compare a { color: var(--fg); }
.dk-compare a:hover { color: var(--primary); }
.dk-compare tr.is-current td { background: color-mix(in srgb, var(--primary) 7%, transparent); color: var(--fg); }
.dk-compare__you {
  font-size: 9.5px; text-transform: uppercase; letter-spacing: .1em;
  color: var(--primary-fg); background: var(--primary);
  padding: 2px 6px; border-radius: 2px; margin-right: 8px; white-space: nowrap;
}

/* ── sticky action bar ── */
.dk-kit-bar {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 400;
  display: flex; align-items: center; gap: 14px;
  padding: 10px 16px calc(10px + env(safe-area-inset-bottom));
  background: var(--bg2); border-top: 1px solid var(--border);
  transform: translateY(110%); transition: transform .22s ease;
}
.dk-kit-bar.is-on { transform: translateY(0); }
.dk-kit-bar__info { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.dk-kit-bar__price {
  font-family: 'JetBrains Mono', monospace; font-size: 17px; font-weight: 600; color: var(--primary);
}
.dk-kit-bar__stock { font-size: 10.5px; color: var(--fg3); overflow-wrap: anywhere; }
.dk-kit-bar__cta { margin-left: auto; flex-shrink: 0; padding: 12px 18px; }
@media (min-width: 1025px) { .dk-kit-bar { display: none; } }

/* ── narrow screens ── */
@media (max-width: 900px) {
  .dk-wire-map { grid-template-columns: 1fr; }
  .dk-wire-map__hub { border-right: none; border-bottom: 1px solid var(--border); }
}
@media (max-width: 620px) {
  .dk-part-row {
    grid-template-columns: 40px 1fr auto;
    grid-template-areas: "thumb body qty" "thumb meta meta";
    row-gap: 6px;
  }
  .dk-part-row__thumb  { grid-area: thumb; width: 40px; height: 40px; align-self: start; }
  .dk-part-row__body   { grid-area: body; }
  .dk-part-row__qty    { grid-area: qty; align-self: start; }
  .dk-part-row__price,
  .dk-part-row__stock  { grid-area: meta; text-align: left; }
  .dk-part-row__price  { display: none; }
  .dk-wire-row { grid-template-columns: 1fr; row-gap: 6px; padding: 10px 14px; }
  .dk-wire-row__line { display: none; }
  .dk-wire-row__role { justify-self: start; }
  .dk-kit-topline__stock { margin-left: 0; }
  .dk-build .dk-build-step { grid-template-columns: 20px 28px 1fr; gap: 9px; padding: 12px 13px; }
}


/* ═══════════════════════════════════════════════════════════════════════
   READABILITY OVER THE DOT FIELD
   Two dot layers sit behind the page: body's own 32px grid and the animated
   .dk-dots canvas at z-index -1. Anything with a transparent background
   therefore has dots running straight through its text. Large headings cope;
   12–13px body copy, monospace part names and table rows do not.

   The rule: every block that carries body text gets a surface. Bordered boxes
   take the near-solid sheet (they already read as cards); loose prose takes a
   softer one with padding so it reads as a panel rather than a box. The field
   stays visible between blocks, which is where it was doing its job anyway.
   ═══════════════════════════════════════════════════════════════════════ */
:root {
  --dk-sheet:      color-mix(in srgb, var(--bg) 92%, transparent);
  --dk-sheet-soft: color-mix(in srgb, var(--bg) 86%, transparent);
}
/* Dark mode needs a touch more cover: the dots are drawn in the accent green,
   which carries further against a dark ground than against a light one. */
:root:not([data-theme="light"]) {
  --dk-sheet:      color-mix(in srgb, var(--bg) 94%, transparent);
  --dk-sheet-soft: color-mix(in srgb, var(--bg) 90%, transparent);
}
:root[data-theme="light"] {
  --dk-sheet:      color-mix(in srgb, var(--bg) 92%, transparent);
  --dk-sheet-soft: color-mix(in srgb, var(--bg) 86%, transparent);
}

/* ── bordered content boxes ── */
.dk-parts-groups,
.dk-parts-table,
.dk-build,
.dk-spec-table,
.dk-compare-scroll,
.dk-kit-also-need,
.dk-addon-card,
.dk-diagram-box,
.dk-wire-map,
.dk-faq-item,
.dk-note,
.dk-kv,
.dk-order-box,
.dk-summary,
.dk-cart-table,
.dk-form,
.dk-auth-card { background-color: var(--dk-sheet); }

/* Rows inside those boxes must not re-introduce transparency. */
.dk-part-row,
.dk-parts-table__row,
.dk-build .dk-build-step,
.dk-spec-row,
.dk-compare td,
.dk-wire-map__rows { background-color: transparent; }

/* ── loose prose ── */
.dk-prose,
.dk-kit-lede,
.dk-wire-notes,
.dk-kit-section__note,
.dk-product-desc,
.dk-rich {
  background-color: var(--dk-sheet-soft);
  border-radius: var(--radius);
}
/* Give the sheet a little room so the text is not flush to its own edge. */
.dk-prose,
.dk-kit-lede,
.dk-product-desc,
.dk-rich { padding: 16px 18px; }
.dk-kit-section__note { padding: 6px 10px; display: inline-block; }
.dk-wire-notes { padding: 12px 16px 12px 18px; }

/* The CTA band and confirmation copy sit on the field too. */
.dk-cta__inner,
.dk-success { background-color: var(--dk-sheet-soft); border-radius: var(--radius); }
.dk-cta__inner { padding: 28px; }

/* Section headings keep the field behind them — at 28px+ the dots read as
   texture, not noise — but the 10px mono kickers above them do not. */
.dk-section-label {
  background-color: var(--dk-sheet-soft);
  padding: 3px 7px; border-radius: 2px; display: inline-block;
}
/* Inside a box the kicker already has a surface under it. */
.dk-addon-card .dk-section-label,
.dk-kit-also-need .dk-section-label,
.dk-wire-notes .dk-section-label,
.dk-learn-card .dk-section-label,
.dk-featured-kit .dk-section-label { background-color: transparent; padding: 0; }

/* Body copy set with inline styles on the about/contact pages, and the two
   small standalone lines that sit outside any box. */
.dk-copy {
  background-color: var(--dk-sheet-soft);
  border-radius: var(--radius);
  padding: 14px 16px;
}
.dk-kit-pill { background-color: var(--dk-sheet); }
.dk-stock-meter__head span {
  background-color: var(--dk-sheet-soft);
  padding: 2px 7px; border-radius: 2px;
}


/* ═══════════════════════════════════════════════════════════════════════
   MOBILE FIRST
   Measured at 375px: the layout holds (no overflow, one column, burger nav)
   but 38 interactive elements came in under 36px tall, and the AI card's
   decorative glow reached 31px past the viewport. Both fixed here.
   ═══════════════════════════════════════════════════════════════════════ */

/* A decorative glow must never be able to widen the page. */
.dk-ai-card, .dk-ai__card, [class*="__glow"] { max-width: 100%; }
.dk-ai-card { overflow: hidden; }

@media (hover: none) and (pointer: coarse) {
  /* Touch targets. The design's chips and icon buttons sit at 24–32px, which
     is comfortable with a mouse and awkward with a thumb. 44px is the figure
     both Apple and Android publish; applied only on touch pointers so the
     desktop rhythm is untouched. */
  .dk-btn, .dk-add-btn, .dk-icon-btn, .dk-cart-btn,
  .dk-filter-tag, .dk-chip, .dk-tag, .dk-part-chip,
  .dk-qty button, .dk-qty input, .dk-tab, .dk-sidebar__item,
  .dk-kit-nav__link, .dk-faq-btn, .dk-pager a, .dk-pagination a {
    min-height: 44px;
  }
  .dk-btn, .dk-add-btn, .dk-icon-btn, .dk-cart-btn,
  .dk-filter-tag, .dk-chip, .dk-tag, .dk-part-chip {
    display: inline-flex;
    align-items: center;
    justify-content: center;
  }
  /* Links in dense lists need room around them rather than a taller box. */
  .dk-nav__links a, .dk-mobile-menu a, .dk-footer a,
  .dk-breadcrumb a, .dk-panel__link, .dk-section-link {
    display: inline-block;
    padding-block: 10px;
  }
  /* Form controls: 16px keeps iOS from zooming the page on focus. */
  .dk-form__input, .dk-form__select, .dk-form__textarea,
  input[type="text"], input[type="email"], input[type="tel"],
  input[type="search"], input[type="password"], select, textarea {
    min-height: 44px;
    font-size: 16px;
  }
}

/* Below 400px the two-up card grids leave ~150px a card, which the padding
   and 12px monospace name cannot fit — one per row instead. */
@media (max-width: 400px) {
  .dk-product-grid, .dk-kit-grid, .dk-cat-grid { grid-template-columns: 1fr !important; }
}


/* ═══════════════════════════════════════════════════════════════════════
   CART — real lines from Cart::buildCartSummary()
   Mobile first: one column, the line laid out as image + body with qty and
   total below. The two-column layout only appears once there is room.
   ═══════════════════════════════════════════════════════════════════════ */
.dk-cart-page { padding: 28px 0 72px; }
.dk-cart-layout { display: grid; grid-template-columns: 1fr; gap: 22px; align-items: start; }
.dk-cart-main, .dk-cart-side { min-width: 0; }

.dk-cart-item {
  display: grid;
  grid-template-columns: 68px 1fr;
  grid-template-areas: "img body" "img qty" "total remove";
  gap: 10px 14px;
  align-items: start;
  padding: 16px 0;
  border-bottom: 1px solid var(--border);
}
.dk-cart-item:first-child { border-top: 1px solid var(--border); }
.dk-cart-item__img {
  grid-area: img;
  width: 68px; height: 68px;
  border: 1px solid var(--border);
  background: var(--bg2);
  display: flex; align-items: center; justify-content: center;
}
.dk-cart-item__img img { max-width: 100%; max-height: 100%; width: auto; height: auto; object-fit: contain; }
.dk-cart-item__body { grid-area: body; display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.dk-cart-item__name {
  font-family: 'JetBrains Mono', monospace; font-size: 12.5px; font-weight: 600;
  color: var(--fg); line-height: 1.45; text-decoration: none; overflow-wrap: anywhere;
}
a.dk-cart-item__name:hover { color: var(--primary); }
.dk-cart-item__sku { font-size: 10px; color: var(--fg3); letter-spacing: .04em; }
.dk-cart-item__qty { grid-area: qty; display: flex; align-items: center; gap: 8px; }
.dk-cart-item__qty .dk-form__input { width: 76px; padding: 7px 9px; }
.dk-cart-item__total { grid-area: total; font-size: 13px; color: var(--fg); align-self: center; }
.dk-cart-item__remove {
  grid-area: remove; justify-self: end; align-self: center;
  background: none; border: none; cursor: pointer; padding: 4px 0;
  font-family: 'JetBrains Mono', monospace; font-size: 10.5px;
  letter-spacing: .08em; text-transform: uppercase; color: var(--fg3);
}
.dk-cart-item__remove:hover { color: #d9534f; }

.dk-cart-actions { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 20px; }
.dk-cart-actions .dk-btn { flex: 1 1 auto; justify-content: center; }

.dk-summary { border: 1px solid var(--border); padding: 18px; background: var(--bg2); }
.dk-summary__row {
  display: flex; justify-content: space-between; gap: 14px;
  padding: 9px 0; font-size: 13px; color: var(--fg2);
  border-bottom: 1px solid var(--border);
}
.dk-summary__row--total {
  border-bottom: none; border-top: 1px solid var(--border);
  margin-top: 4px; padding-top: 14px;
  font-size: 15px; font-weight: 700; color: var(--fg);
}
.dk-summary__note { font-size: 11.5px; color: var(--fg3); padding: 10px 0; line-height: 1.7; }
.dk-meter { display: block; height: 4px; margin-top: 6px; background: color-mix(in srgb, var(--fg) 12%, transparent); }
.dk-meter span { display: block; height: 100%; background: var(--primary); }
.dk-summary__cta { width: 100%; justify-content: center; margin-top: 16px; display: flex; }
.dk-summary__fine { font-size: 11px; color: var(--fg3); line-height: 1.7; margin: 12px 0 0; }
.dk-count { font-size: 13px; color: var(--fg3); font-weight: 400; }
.dk-empty { text-align: center; padding: 64px 16px; }
.dk-empty__icon { font-size: 30px; color: var(--primary); opacity: .55; margin-bottom: 12px; }
.dk-empty p { color: var(--fg3); margin-bottom: 20px; }
.dk-note { border: 1px solid var(--border); border-left: 2px solid var(--primary); padding: 12px 14px; margin-bottom: 16px; font-size: 13px; color: var(--fg2); }
.dk-note--warn { border-left-color: #e0a33e; }

@media (min-width: 720px) {
  .dk-cart-item {
    grid-template-columns: 72px 1fr 120px 130px 90px;
    grid-template-areas: "img body qty total remove";
    align-items: center;
  }
  .dk-cart-item__qty { justify-content: flex-start; }
  .dk-cart-item__total { text-align: right; }
  .dk-cart-actions .dk-btn { flex: 0 0 auto; }
}
@media (min-width: 1000px) {
  .dk-cart-layout { grid-template-columns: minmax(0, 1fr) 330px; gap: 34px; }
  .dk-summary { position: sticky; top: 96px; }
}


/* ── Checkout ───────────────────────────────────────────────────────────
   Reuses the cart's two-column shell; these are the form-side pieces. */
.dk-fieldset { border: 1px solid var(--border); padding: 20px; margin-bottom: 18px; background: var(--bg2); }
.dk-fieldset__title {
  font-family: 'JetBrains Mono', monospace; font-size: 11px; font-weight: 600;
  letter-spacing: .12em; text-transform: uppercase; color: var(--primary);
  margin: 0 0 16px;
}
.dk-form__textarea { min-height: 84px; resize: vertical; line-height: 1.6; }
.dk-form__hint { display: block; font-size: 11px; color: var(--fg3); margin-top: 5px; }
.dk-form__optional { color: var(--fg3); font-weight: 400; text-transform: none; letter-spacing: 0; }

.dk-option--radio { display: flex; align-items: flex-start; gap: 11px; cursor: pointer; }
.dk-option--radio input { margin-top: 3px; flex-shrink: 0; accent-color: var(--primary); }
.dk-option--radio strong { display: block; font-size: 13px; color: var(--fg); font-weight: 600; }
.dk-option--radio .dk-option__meta { display: block; font-size: 11.5px; color: var(--fg3); margin-top: 3px; line-height: 1.6; }

.dk-check { display: flex; align-items: flex-start; gap: 10px; margin-top: 18px; font-size: 12.5px; color: var(--fg2); line-height: 1.7; cursor: pointer; }
.dk-check input { margin-top: 3px; flex-shrink: 0; accent-color: var(--primary); }
.dk-check a { color: var(--primary); }

.dk-summary__head {
  font-size: 10px; letter-spacing: .12em; text-transform: uppercase;
  color: var(--fg3); padding-bottom: 10px; border-bottom: 1px solid var(--border);
}
.dk-summary__line {
  display: grid; grid-template-columns: 1fr auto auto; gap: 10px;
  padding: 9px 0; font-size: 12px; color: var(--fg2);
  border-bottom: 1px solid var(--border);
}
.dk-summary__line-name { overflow-wrap: anywhere; line-height: 1.45; }
.dk-summary__line-qty { color: var(--fg3); }
.dk-summary__back { display: block; text-align: center; margin-top: 12px; font-size: 12px; color: var(--fg3); }
.dk-summary__back:hover { color: var(--primary); }


/* ── Categories index ───────────────────────────────────────────────── */
.dk-cat-page { padding: 28px 0 72px; }
.dk-page-header__sub { color: var(--fg3); font-size: 13px; margin-top: 8px; }
.dk-cat-grid { display: grid; grid-template-columns: 1fr; gap: 14px; }
.dk-cat-card {
  display: block; border: 1px solid var(--border); background: var(--bg2);
  text-decoration: none; transition: border-color .15s;
}
.dk-cat-card:hover { border-color: var(--primary); }
.dk-cat-card__img {
  position: relative; height: 150px; background: var(--bg3);
  display: flex; align-items: center; justify-content: center; overflow: hidden;
}
.dk-cat-card__img img { max-width: 100%; max-height: 100%; width: auto; height: auto; object-fit: contain; }
.dk-cat-card__icon { font-size: 32px; opacity: .6; }
.dk-cat-card__body { padding: 14px 16px; }
.dk-cat-card__name { font-family: 'JetBrains Mono', monospace; font-size: 13px; font-weight: 600; color: var(--fg); line-height: 1.45; overflow-wrap: anywhere; }
.dk-cat-card__count { font-size: 11px; color: var(--fg3); margin-top: 5px; }
@media (min-width: 560px) { .dk-cat-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 900px) { .dk-cat-grid { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 1200px) { .dk-cat-grid { grid-template-columns: repeat(4, 1fr); } }


/* ── Build with Titan (custom kit) ──────────────────────────────────── */
.dk-titan { padding: 8px 0 72px; }
.dk-titan-steps { display: grid; grid-template-columns: 1fr; gap: 2px; background: var(--border);
  border: 1px solid var(--border); margin-bottom: 28px; }
.dk-titan-step { background: var(--bg); padding: 20px; }
.dk-titan-step__num { font-size: 22px; color: var(--primary); opacity: .5; margin-bottom: 8px; }
.dk-titan-step__title { font-family: 'JetBrains Mono', monospace; font-size: 13px; font-weight: 700; color: var(--fg); margin-bottom: 6px; }
.dk-titan-step__text { font-size: 12.5px; color: var(--fg3); line-height: 1.75; margin: 0; }

.dk-titan-layout { display: grid; grid-template-columns: 1fr; gap: 22px; align-items: start; }
.dk-titan-form, .dk-titan-side { min-width: 0; }
.dk-titan-submit { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; margin-top: 18px; }
.dk-titan-status { font-size: 11.5px; color: var(--fg3); }
.dk-titan-status.is-err { color: #d9534f; }
.dk-titan-alt { border: 1px solid var(--border); padding: 18px; margin-top: 16px; background: var(--bg2); }
.dk-titan-alt p { font-size: 12.5px; color: var(--fg3); line-height: 1.7; margin: 10px 0 14px; }
.dk-titan-done { text-align: center; padding: 48px 20px; border: 1px solid var(--border); background: var(--bg2); }
.dk-titan-done__mark { font-size: 30px; color: var(--primary); margin-bottom: 10px; }
.dk-titan-done h2 { font-size: 18px; margin: 0 0 8px; }
.dk-titan-done p { color: var(--fg3); font-size: 13px; line-height: 1.75; margin: 0 0 18px; }
/* Honeypot: off-screen rather than display:none, which some bots skip. */
.dk-hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }

@media (min-width: 700px) { .dk-titan-steps { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 1000px) { .dk-titan-layout { grid-template-columns: minmax(0, 1fr) 330px; gap: 34px; }
  .dk-titan-side .dk-summary { position: sticky; top: 96px; } }


/* ── Auth + account ─────────────────────────────────────────────────── */
.dk-auth { padding: 28px 0 72px; }
.dk-auth-grid { display: grid; grid-template-columns: 1fr; gap: 22px; align-items: start; }
.dk-auth-card { border: 1px solid var(--border); background: var(--bg2); padding: 24px; min-width: 0; }
.dk-auth-card__cta { width: 100%; justify-content: center; display: flex; margin-top: 6px; }
.dk-auth-card__links { display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-top: 16px; font-size: 12px; }
.dk-auth-card__links a { color: var(--fg3); }
.dk-auth-card__links a:hover { color: var(--primary); }
.dk-auth-side { min-width: 0; }

.dk-acct-page { padding: 28px 0 72px; }
.dk-acct-head { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
.dk-tile__value--sm { font-size: 13px; overflow-wrap: anywhere; line-height: 1.5; }
.dk-order-list { border: 1px solid var(--border); }
.dk-order {
  display: grid; grid-template-columns: 1fr auto;
  grid-template-areas: "main status" "total link";
  gap: 8px 14px; align-items: center;
  padding: 14px 16px; border-bottom: 1px solid var(--border);
}
.dk-order:last-child { border-bottom: none; }
.dk-order__main { grid-area: main; display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.dk-order__ref { font-size: 12.5px; font-weight: 600; color: var(--fg); }
.dk-order__date { font-size: 11px; color: var(--fg3); }
.dk-order .dk-status { grid-area: status; justify-self: end; }
.dk-order__total { grid-area: total; font-size: 13px; color: var(--fg); }
.dk-order__link { grid-area: link; justify-self: end; font-size: 12px; color: var(--primary); }
.dk-acct-links { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 26px; }

@media (min-width: 760px) {
  .dk-order { grid-template-columns: 1fr 140px 130px 80px; grid-template-areas: "main status total link"; }
  .dk-order__total { text-align: right; }
}
@media (min-width: 1000px) {
  .dk-auth-grid { grid-template-columns: minmax(0, 1fr) 330px; gap: 34px; }
}


/* ── Pager ──────────────────────────────────────────────────────────── */
.dk-pager { display: flex; flex-direction: column; gap: 12px; align-items: center; padding: 32px 0 64px; }
.dk-pager__count { font-size: 11.5px; color: var(--fg3); }
.dk-pager__links { display: flex; gap: 6px; flex-wrap: wrap; justify-content: center; }
.dk-pager__link {
  min-width: 38px; padding: 9px 11px; text-align: center;
  border: 1px solid var(--border); background: var(--bg2);
  font-family: 'JetBrains Mono', monospace; font-size: 12px;
  color: var(--fg2); text-decoration: none;
}
.dk-pager__link:hover { border-color: var(--primary); color: var(--fg); }
.dk-pager__link.is-on { background: var(--primary); border-color: var(--primary); color: var(--primary-fg); font-weight: 700; }
.dk-pager__gap { align-self: center; color: var(--fg3); padding: 0 2px; }
@media (min-width: 640px) { .dk-pager { flex-direction: row; justify-content: space-between; } }

/* ═══════════════════════════════════════════════════════════════════════
   FOOTER — technical rebuild
   The base sheet gives the footer a plain two-tone block. This restates it
   in the same language as the rest of the build: hairline rules, mono
   labels with an index, a spec strip, and a live-status dot. Selectors are
   bumped past the base sheet by repeating the block class.
   ═══════════════════════════════════════════════════════════════════════ */

.dk-footer.dk-footer {
  position: relative;
  overflow: hidden;
  border-top: 1px solid var(--border);
  background:
    linear-gradient(180deg, var(--bg2) 0%, var(--bg) 100%);
}

/* Faint engineering grid, cut off before it reaches the bottom bar. */
.dk-footer.dk-footer::before {
  content: '';
  position: absolute;
  inset: 0 0 auto 0;
  height: 320px;
  background-image:
    linear-gradient(to right, var(--border) 1px, transparent 1px),
    linear-gradient(to bottom, var(--border) 1px, transparent 1px);
  background-size: 64px 64px;
  opacity: .28;
  -webkit-mask-image: linear-gradient(180deg, rgba(0,0,0,.9), transparent 85%);
          mask-image: linear-gradient(180deg, rgba(0,0,0,.9), transparent 85%);
  pointer-events: none;
}
.dk-footer.dk-footer > .container { position: relative; z-index: 1; }

/* A single accent tick at the top-left corner — the same motif the section
   headers use, so the footer reads as part of the page, not a slab. */
.dk-footer__rule {
  position: absolute;
  top: -1px; left: 0;
  width: 88px; height: 2px;
  background: var(--primary);
  z-index: 2;
}

/* ── Spec strip ─────────────────────────────────────────────────────── */
.dk-footer__spec {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  border-bottom: 1px solid var(--border);
}
.dk-footer__spec-item {
  padding: 20px 24px 20px 0;
  display: flex;
  flex-direction: column;
  gap: 6px;
  border-right: 1px solid var(--border);
}
.dk-footer__spec-item:last-child { border-right: 0; }
.dk-footer__spec-item + .dk-footer__spec-item { padding-left: 24px; }
.dk-footer__spec-key {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 10px;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--primary);
}
.dk-footer__spec-val { font-size: 13px; color: var(--fg2, var(--fg)); line-height: 1.5; }

/* ── Columns ────────────────────────────────────────────────────────── */
.dk-footer__col-title.dk-footer__col-title {
  display: flex;
  align-items: baseline;
  gap: 8px;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--fg);
  padding-bottom: 12px;
  margin-bottom: 14px;
  border-bottom: 1px solid var(--border);
}
.dk-footer__col-idx { color: var(--primary); opacity: .85; }

.dk-footer__col a:not(.dk-footer__email) {
  position: relative;
  padding-left: 0;
  transition: color .18s ease, padding-left .18s ease;
}
.dk-footer__col a:not(.dk-footer__email):hover { padding-left: 10px; }
.dk-footer__col a:not(.dk-footer__email)::before {
  content: '›';
  position: absolute;
  left: 0;
  opacity: 0;
  color: var(--primary);
  transition: opacity .18s ease;
}
.dk-footer__col a:not(.dk-footer__email):hover::before { opacity: 1; }

.dk-footer__email.dk-footer__email {
  display: block;
  margin-bottom: 6px;
  color: var(--fg3);
  text-decoration: none;
  transition: color .18s ease;
}
.dk-footer__email.dk-footer__email:hover { color: var(--primary); }

/* Live-status pill. The dot pulses; reduced-motion users get it static. */
.dk-footer__status {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin: 0 0 16px;
  padding: 6px 12px;
  border: 1px solid var(--border);
  background: var(--bg);
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 10px;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--fg2, var(--fg));
}
.dk-footer__status-dot {
  width: 7px; height: 7px;
  border-radius: 50%;
  background: var(--primary);
  box-shadow: 0 0 0 0 var(--primary);
  animation: dkFooterPulse 2.4s ease-out infinite;
  flex: none;
}
@keyframes dkFooterPulse {
  0%   { box-shadow: 0 0 0 0 rgba(0, 200, 120, .45); }
  70%  { box-shadow: 0 0 0 7px rgba(0, 200, 120, 0); }
  100% { box-shadow: 0 0 0 0 rgba(0, 200, 120, 0); }
}
@media (prefers-reduced-motion: reduce) {
  .dk-footer__status-dot { animation: none; }
}

/* ── Newsletter ─────────────────────────────────────────────────────── */
.dk-footer__note {
  font-size: 12px;
  padding: 8px 10px;
  margin-bottom: 10px;
  border-left: 2px solid var(--primary);
  background: var(--bg);
}
.dk-footer__note--err { border-left-color: #e5484d; }

.dk-newsletter.dk-newsletter { border: 1px solid var(--border); background: var(--bg); }
.dk-newsletter.dk-newsletter:focus-within { border-color: var(--primary); }
.dk-newsletter.dk-newsletter input { background: transparent; }
.dk-newsletter.dk-newsletter button { transition: background .18s ease, color .18s ease; }

.dk-sr-only {
  position: absolute; width: 1px; height: 1px;
  padding: 0; margin: -1px; overflow: hidden;
  clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

/* ── Bottom bar ─────────────────────────────────────────────────────── */
.dk-footer__stamp {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px;
  color: var(--fg3);
  opacity: .7;
}

/* ── Responsive ─────────────────────────────────────────────────────── */
@media (max-width: 1024px) {
  .dk-footer__spec { grid-template-columns: repeat(2, 1fr); }
  .dk-footer__spec-item:nth-child(2n) { border-right: 0; }
  .dk-footer__spec-item:nth-child(-n+2) { border-bottom: 1px solid var(--border); }
}
@media (max-width: 640px) {
  .dk-footer__spec { grid-template-columns: 1fr; }
  .dk-footer__spec-item,
  .dk-footer__spec-item + .dk-footer__spec-item {
    border-right: 0;
    border-bottom: 1px solid var(--border);
    padding: 14px 0;
  }
  .dk-footer__spec-item:last-child { border-bottom: 0; }
  .dk-footer.dk-footer::before { background-size: 44px 44px; }
}
/* Coarse pointers get real tap targets on every footer link. */
@media (hover: none) and (pointer: coarse) {
  .dk-footer__col a { min-height: 40px; display: flex; align-items: center; }
  .dk-footer__col a:not(.dk-footer__email):hover { padding-left: 0; }
}

/* ── Cart: coupon box + success note ─────────────────────────────────── */
.dk-note--ok { border-left-color: var(--primary); }

.dk-coupon { border-top: 1px solid var(--border); margin-top: 16px; padding-top: 16px; }
.dk-coupon__row { display: flex; gap: 8px; align-items: stretch; }
.dk-coupon__row .dk-form__input { flex: 1; min-width: 0; }
.dk-coupon__row .dk-btn { flex: none; white-space: nowrap; }
.dk-coupon__on {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  border: 1px solid var(--border); border-left: 2px solid var(--primary);
  padding: 10px 12px; font-size: 12px;
}
.dk-coupon__drop {
  background: none; border: 0; cursor: pointer; padding: 0;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 10px; letter-spacing: .1em; text-transform: uppercase;
  color: var(--fg3); text-decoration: underline;
}
.dk-coupon__drop:hover { color: var(--fg); }
@media (hover: none) and (pointer: coarse) {
  .dk-coupon__row .dk-form__input, .dk-coupon__row .dk-btn { min-height: 44px; }
  .dk-coupon__drop { min-height: 44px; display: flex; align-items: center; }
}

/* Built-kit low-stock hint above the buy button. */
.dk-kit-lowstock {
  font-size: 11px; letter-spacing: .08em; text-transform: uppercase;
  color: #e0a33e; margin-bottom: 8px;
}

/* "N built · ships now" ribbon — the positive twin of __oos. */
.dk-kit-card__ready {
  position: absolute; left: 0; bottom: 0; z-index: 2;
  padding: 5px 10px;
  font-size: 10px; letter-spacing: .1em; text-transform: uppercase;
  color: var(--primary-fg); background: var(--primary);
}

.dk-coupon__offers { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin-bottom: 10px; }
.dk-coupon__offer {
  border: 1px dashed var(--border); background: none; cursor: pointer;
  padding: 4px 8px; font-size: 11px; letter-spacing: .06em; color: var(--fg2);
}
.dk-coupon__offer:hover { border-color: var(--primary); color: var(--primary); }

/* About: local PCB-plate graphic replacing the external stock photo. */
.dk-about-plate {
  height: 280px;
  background:
    radial-gradient(circle at 20% 30%, color-mix(in srgb, var(--primary) 22%, transparent), transparent 45%),
    radial-gradient(circle at 78% 68%, color-mix(in srgb, var(--primary) 14%, transparent), transparent 42%),
    linear-gradient(to right, var(--border) 1px, transparent 1px) 0 0 / 34px 34px,
    linear-gradient(to bottom, var(--border) 1px, transparent 1px) 0 0 / 34px 34px,
    var(--bg2);
}

.dk-review-summary { font-size: 12px; color: var(--fg2); margin-bottom: 16px; letter-spacing: .06em; }
.dk-review__verified {
  font-size: 9px; letter-spacing: .12em; text-transform: uppercase;
  color: var(--primary); border: 1px solid var(--border); padding: 2px 6px;
}

/* Category rows are anchors now (they were inert buttons). The base rule was
   written for <button>, so restore the box model an <a> does not get. */
a.dk-sidebar__item { box-sizing: border-box; text-decoration: none; }
a.dk-sidebar__item span:first-child { color: inherit; padding-right: 10px; }
a.dk-sidebar__item.active span:first-child { color: var(--primary); }
@media (hover: none) and (pointer: coarse) {
  a.dk-sidebar__item { min-height: 44px; }
}

/* ═══════════════════════════════════════════════════════════════════════
   CUSTOM KIT BUILDER  (figma: diykit-design-with-custom-kit)
   Classes the base sheet does not carry. The advisor is Titan throughout —
   "Root" in the design file is the engine behind it, not the persona.
   ═══════════════════════════════════════════════════════════════════════ */

.dk-ck-hero { padding: 0; }
.dk-ck-hero .dk-hero__content { padding-bottom: 56px; }

.dk-breadcrumb { display: flex; align-items: center; gap: 8px; font-size: 11px; color: var(--fg3); margin-bottom: 24px; }
.dk-breadcrumb a { color: var(--fg3); text-decoration: none; }
.dk-breadcrumb a:hover { color: var(--primary); }
.dk-breadcrumb span { color: var(--border); }
.dk-breadcrumb .is-current { color: var(--fg); }

.dk-ck-pills { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 32px; }
.dk-ck-entries { display: flex; flex-direction: column; gap: 12px; margin-bottom: 16px; max-width: 520px; }
.dk-ck-browse { display: inline-block; font-size: 11px; color: var(--fg3); }
.dk-ck-browse:hover { color: var(--primary); }
.dk-ck-hero .dk-kit-stats { margin-top: 48px; }

.dk-entry-card {
  display: flex; align-items: center; gap: 16px; width: 100%; text-align: left;
  padding: 16px 18px; border: 1px solid var(--border); background: var(--bg2);
  cursor: pointer; transition: border-color .2s, transform .2s, background .2s;
}
.dk-entry-card:hover { border-color: var(--primary); transform: translateX(3px); }
.dk-entry-card--featured { border-color: color-mix(in srgb, var(--primary) 45%, transparent); }
.dk-entry-card__icon {
  flex: none; width: 40px; height: 40px; display: flex; align-items: center; justify-content: center;
  background: var(--primary); color: var(--primary-fg);
  font-family: 'JetBrains Mono', ui-monospace, monospace; font-weight: 700; font-size: 16px;
}
.dk-entry-card__icon--plain { background: var(--bg3, var(--bg)); border: 1px solid var(--border); color: var(--fg3); }
.dk-entry-card__title { font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 14px; font-weight: 700; color: var(--fg); }
.dk-entry-card__sub { font-size: 12px; color: var(--fg3); margin-top: 2px; }
.dk-entry-card__arrow { margin-left: auto; color: var(--fg3); flex: none; }
.dk-entry-card:hover .dk-entry-card__arrow { color: var(--primary); }

.dk-ck-section { padding: 80px 0; border-bottom: 1px solid var(--border); }
.dk-ck-section--alt { background: var(--bg2); }
.dk-ck-lede { color: var(--fg3); font-size: 15px; margin-top: 12px; max-width: 520px; margin-inline: auto; }
.dk-ck-lede--left { margin-inline: 0; color: var(--fg2); line-height: 1.7; margin: 16px 0 24px; }
.dk-ck-split { display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: start; }

/* ── Titan cards ── */
.dk-titan-card {
  border: 1px solid color-mix(in srgb, var(--primary) 25%, transparent);
  background: color-mix(in srgb, var(--primary) 5%, transparent);
  padding: 20px; margin-bottom: 24px;
}
.dk-titan-card__head { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; }
.dk-titan-card__avatar {
  width: 36px; height: 36px; flex: none; display: flex; align-items: center; justify-content: center;
  background: color-mix(in srgb, var(--primary) 15%, transparent);
  border: 1px solid color-mix(in srgb, var(--primary) 30%, transparent);
  font-family: 'JetBrains Mono', ui-monospace, monospace; font-weight: 700; font-size: 14px; color: var(--primary);
}
.dk-titan-card__avatar--sm { width: 28px; height: 28px; font-size: 12px; }
.dk-titan-card__name { font-size: 13px; font-weight: 700; color: var(--fg); }
.dk-titan-card__status { font-size: 10px; color: var(--primary); }
.dk-titan-card__bubble {
  background: var(--bg2); border: 1px solid var(--border); padding: 14px 16px;
  font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 12px; color: var(--fg); line-height: 1.7;
}
.dk-titan-card__fine { font-size: 10px; color: var(--fg3); margin-top: 10px; }

.dk-titan-caps { display: grid; gap: 12px; }
.dk-titan-cap { display: flex; gap: 14px; border: 1px solid var(--border); background: var(--bg); padding: 16px 18px; }
.dk-titan-cap__icon { color: var(--primary); font-size: 16px; flex: none; }
.dk-titan-cap__title { font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 13px; font-weight: 700; color: var(--fg); margin-bottom: 4px; }
.dk-titan-cap__desc { font-size: 13px; color: var(--fg3); line-height: 1.6; }

/* ── Builder shell ── */
.dk-builder-head { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 16px; margin-bottom: 40px; }
.dk-builder-head__right { display: flex; align-items: center; gap: 12px; }
.dk-progress-rail { width: 120px; height: 6px; background: var(--bg3, var(--bg2)); border: 1px solid var(--border); overflow: hidden; }
.dk-progress-rail > div { height: 100%; width: 0; background: var(--primary); transition: width .3s; }
#progress-pct { font-size: 11px; color: var(--primary); font-weight: 700; }
.dk-ask-titan { display: inline-flex; align-items: center; gap: 6px; }
.dk-ask-titan__dot { width: 6px; height: 6px; border-radius: 50%; background: var(--primary); flex: none; }

.dk-step-tabs { display: flex; border-bottom: 1px solid var(--border); margin-bottom: 40px; overflow-x: auto; }
.dk-step-tab {
  display: flex; align-items: center; gap: 8px; padding: 14px 20px; white-space: nowrap;
  background: none; border: 0; border-bottom: 2px solid transparent; cursor: pointer;
  font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 12px; color: var(--fg3);
}
.dk-step-tab:hover { color: var(--fg); }
.dk-step-tab.active { color: var(--primary); border-bottom-color: var(--primary); }
.dk-step-tab__num {
  width: 20px; height: 20px; flex: none; display: flex; align-items: center; justify-content: center;
  border: 1px solid currentColor; font-size: 10px;
}
.dk-step-tab.active .dk-step-tab__num { background: var(--primary); color: var(--primary-fg); border-color: var(--primary); }

.dk-builder-grid { display: grid; grid-template-columns: 1fr 280px; gap: 40px; align-items: start; }
.dk-builder-step { display: none; }
.dk-builder-step.active { display: block; }
.dk-step-eyebrow { font-size: 11px; color: var(--primary); text-transform: uppercase; letter-spacing: .1em; margin-bottom: 4px; }
.dk-step-h { font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 21px; font-weight: 700; color: var(--fg); margin-bottom: 4px; }
.dk-step-sub { color: var(--fg3); font-size: 14px; margin-bottom: 28px; }
.dk-builder-nav { display: flex; gap: 12px; margin-top: 24px; }

/* ── Fields ── */
.dk-field { margin-bottom: 20px; }
.dk-field-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
.dk-label {
  display: block; margin-bottom: 8px;
  font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 11px;
  text-transform: uppercase; letter-spacing: .1em; color: var(--fg2, var(--fg));
}
.dk-input, .dk-select, .dk-textarea {
  width: 100%; box-sizing: border-box; padding: 12px 14px;
  border: 1px solid var(--border); background: var(--bg); color: var(--fg);
  font-family: inherit; font-size: 14px; transition: border-color .2s;
}
.dk-textarea { resize: vertical; line-height: 1.6; }
.dk-input:focus, .dk-select:focus, .dk-textarea:focus { outline: none; border-color: var(--primary); }
.dk-hint { font-size: 12px; color: var(--fg3); margin-top: 6px; line-height: 1.5; }

.dk-type-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 10px; }
.dk-type-card {
  display: flex; flex-direction: column; align-items: flex-start; gap: 8px; text-align: left;
  padding: 14px; border: 1px solid var(--border); background: var(--bg2); cursor: pointer; transition: all .2s;
}
.dk-type-card:hover { border-color: var(--primary); }
.dk-type-card.active { border-color: var(--primary); background: color-mix(in srgb, var(--primary) 8%, transparent); }
.dk-type-card__icon { font-size: 18px; color: var(--primary); }
.dk-type-card__label { font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 12px; color: var(--fg); line-height: 1.4; }

.dk-extras { display: flex; flex-wrap: wrap; gap: 8px; }
.dk-extra {
  display: inline-flex; align-items: center; gap: 8px; cursor: pointer;
  border: 1px solid var(--border); background: var(--bg2); padding: 8px 12px;
  font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 11px; color: var(--fg3);
}
.dk-extra:has(.dk-extra__box:checked) { border-color: var(--primary); color: var(--primary); }
.dk-extra__box { accent-color: var(--primary); }

.dk-addpart { border: 1px solid var(--border); background: var(--bg2); padding: 24px; margin-bottom: 20px; }
.dk-addpart__title { font-size: 11px; color: var(--primary); text-transform: uppercase; letter-spacing: .1em; margin-bottom: 16px; }
.dk-addpart__btn { margin-top: 8px; }
.dk-parts-empty { border: 1px dashed var(--border); padding: 40px; text-align: center; }
.dk-parts-empty__icon { font-size: 28px; color: var(--border); margin-bottom: 8px; }
.dk-parts-empty .mono { font-size: 12px; color: var(--fg3); }
.dk-parts-table { border: 1px solid var(--border); }
.dk-part-line { display: flex; align-items: center; gap: 16px; padding: 14px 18px; border-bottom: 1px solid var(--border); }
.dk-part-line:last-child { border-bottom: 0; }
.dk-part-line__name { font-size: 14px; color: var(--fg); }
.dk-part-line__meta { font-size: 11px; color: var(--fg3); margin-top: 4px; word-break: break-all; }
.dk-part-line__rm {
  margin-left: auto; background: none; border: 0; cursor: pointer; padding: 0;
  font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 10px;
  text-transform: uppercase; letter-spacing: .1em; color: var(--fg3); text-decoration: underline;
}
.dk-part-line__rm:hover { color: #e5484d; }

.dk-titan-quick { margin-bottom: 28px; }
.dk-titan-quick__label { font-size: 10px; color: var(--fg3); text-transform: uppercase; letter-spacing: .1em; margin-bottom: 12px; }
.dk-titan-quick__grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; }
.dk-titan-quick__grid .dk-filter-tag { text-align: center; font-size: 11px; }

.dk-ck-success { text-align: center; padding: 60px 0; }
.dk-ck-success__tick {
  width: 64px; height: 64px; margin: 0 auto 24px; display: flex; align-items: center; justify-content: center;
  background: var(--primary); color: var(--primary-fg); font-size: 28px;
}
.dk-ck-success__title { font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 26px; font-weight: 700; color: var(--fg); margin-bottom: 12px; }
.dk-ck-success__sub { color: var(--fg3); font-size: 14px; max-width: 420px; margin: 0 auto 32px; line-height: 1.7; }
.dk-ck-success__actions { display: flex; gap: 12px; justify-content: center; flex-wrap: wrap; }

/* ── Live summary rail ── */
.dk-ck-summary { position: sticky; top: 96px; border: 1px solid var(--border); background: var(--bg2); }
.dk-ck-summary__head { padding: 16px 20px; border-bottom: 1px solid var(--border); display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.dk-ck-summary__eyebrow { font-size: 10px; color: var(--primary); text-transform: uppercase; letter-spacing: .1em; margin-bottom: 2px; }
.dk-ck-summary__note { font-size: 11px; color: var(--fg3); }
.dk-ck-summary__body { padding: 20px; }
.dk-ck-sr { display: flex; justify-content: space-between; gap: 8px; margin-bottom: 10px; }
.dk-ck-sr__key { font-size: 10px; color: var(--fg3); text-transform: uppercase; letter-spacing: .05em; }
.dk-ck-sr .sr-val { font-size: 11px; color: var(--border); text-align: right; }
.dk-ck-sr .sr-val.is-set { color: var(--fg); }
.dk-ck-summary__foot { border-top: 1px solid var(--border); padding: 16px 20px; }
.dk-ck-summary__ask {
  width: 100%; display: flex; align-items: center; gap: 8px; font-size: 11px;
  color: var(--fg3); background: none; border: 0; cursor: pointer; padding: 0;
}
.dk-ck-summary__ask:hover { color: var(--primary); }
.dk-ck-summary__arrow { margin-left: auto; }
.dk-dial { position: relative; width: 48px; height: 48px; flex: none; }
.dk-dial svg { transform: rotate(-90deg); }
.dk-dial #dial-pct { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; font-size: 10px; font-weight: 700; color: var(--primary); }

/* ── Titan chat surfaces ── */
.dk-titan-modal { position: fixed; inset: 0; z-index: 1000; display: flex; align-items: flex-end; justify-content: center; background: rgba(0,0,0,.6); }
.dk-titan-modal[hidden] { display: none; }
.dk-titan-modal__sheet {
  width: 100%; max-width: 560px; max-height: 84vh; display: flex; flex-direction: column;
  background: var(--bg); border: 1px solid var(--border); border-bottom: 0;
}
.dk-titan-modal__head { display: flex; align-items: center; gap: 12px; padding: 14px 18px; border-bottom: 1px solid var(--border); }
.dk-titan-modal__close { margin-left: auto; background: none; border: 0; cursor: pointer; color: var(--fg3); font-size: 15px; padding: 4px 8px; }
.dk-titan-modal__close:hover { color: var(--fg); }
.dk-titan-msgs { flex: 1; overflow-y: auto; padding: 20px; display: flex; flex-direction: column; gap: 14px; min-height: 220px; }
.dk-titan-msgs--sm { min-height: 0; padding: 16px; gap: 12px; }
.dk-titan-input-row { display: flex; gap: 8px; padding: 12px 16px; border-top: 1px solid var(--border); background: var(--bg); flex-shrink: 0; }
.dk-titan-input-row .dk-input { flex: 1; }

.dk-msg { display: flex; }
.dk-msg--user { justify-content: flex-end; }
.dk-msg__bubble {
  max-width: 90%; padding: 10px 14px; line-height: 1.65;
  font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 12px;
  white-space: pre-wrap; word-break: break-word;
}
.dk-msg--titan .dk-msg__bubble { background: var(--bg2); border: 1px solid var(--border); color: var(--fg); }
.dk-msg--user .dk-msg__bubble { background: var(--primary); color: var(--primary-fg); }

.dk-titan-panel {
  position: fixed; right: 0; top: 0; bottom: 0; width: 340px; z-index: 40;
  background: var(--bg); border-left: 1px solid var(--border);
  display: flex; flex-direction: column;
  transform: translateX(100%); transition: transform .3s;
}
.dk-titan-panel.is-open { transform: translateX(0); }
.dk-titan-panel__head { display: flex; align-items: center; gap: 10px; padding: 14px 16px; border-bottom: 1px solid var(--border); }

/* ── Responsive ── */
@media (max-width: 1024px) {
  .dk-builder-grid { grid-template-columns: 1fr; }
  .dk-ck-summary { position: static; }
  .dk-ck-split { grid-template-columns: 1fr; gap: 40px; }
}
@media (max-width: 720px) {
  .dk-field-grid { grid-template-columns: 1fr; }
  .dk-titan-quick__grid { grid-template-columns: 1fr 1fr; }
  .dk-ck-section { padding: 56px 0; }
  .dk-titan-panel { width: 100%; }
  .dk-titan-modal__sheet { max-height: 92vh; }
  .dk-builder-nav { flex-direction: column; }
  .dk-builder-nav .dk-btn { width: 100%; justify-content: center; }
}
@media (hover: none) and (pointer: coarse) {
  .dk-input, .dk-select, .dk-textarea { font-size: 16px; min-height: 44px; }
  .dk-step-tab, .dk-type-card, .dk-extra, .dk-entry-card { min-height: 44px; }
}

/* ═══════════════════════════════════════════════════════════════════════
   READABILITY PASS
   The design system leans on 9–11px mono for labels, which reads as a
   spec sheet on a large monitor and as unreadable on a phone. Everything
   below lifts a size without touching layout, weight or letter-spacing —
   the type stays technical, it just stops being squinty. Base sheet is
   untouched; these are overrides.
   ═══════════════════════════════════════════════════════════════════════ */

/* Nav — the most-read text on the site, and it was 10px. */
.dk-nav__links a { font-size: 12.5px; letter-spacing: .1em; }
.dk-nav__actions a, .dk-nav__actions button { font-size: 12.5px; }
.dk-logo__text { font-size: 19px; }
.dk-mobile-menu a { font-size: 15px; }

/* Body copy */
body { font-size: 15px; }
.dk-copy, .dk-hero__sub { font-size: 15.5px; line-height: 1.75; }
.dk-section-label { font-size: 12px; }
.dk-step__desc, .dk-cat-card__desc, .dk-kit-card__desc { font-size: 14px; line-height: 1.65; }

/* Mono micro-labels: 9–11px → 11–12px */
.dk-product-card__sku { font-size: 11px; }
.dk-product-meta, .dk-product-tag, .dk-product-price { font-size: 12px; }
.dk-spec-label, .dk-spec-value { font-size: 12px; }
.dk-stat__label, .dk-team-card__role, .dk-testi-card__role { font-size: 12px; }
.dk-cart-item__sku, .dk-cart-summary__title { font-size: 12px; }
.dk-contact-item__label, .dk-form__label, .dk-form__title { font-size: 12px; }
.dk-faq-answer { font-size: 14px; line-height: 1.7; }
.dk-review__date, .dk-stars__count { font-size: 12px; }
.dk-range-labels, .dk-doc-item__dl, .dk-pin-row__pin { font-size: 12px; }
.dk-sidebar__item, .dk-sidebar__title { font-size: 12px; }
.dk-micro-label, .dk-micro-note { font-size: 11.5px; }
.dk-filter-tag, .dk-tag { font-size: 12px; }

/* Footer */
.dk-footer__col a, .dk-footer__col p { font-size: 14px; }
.dk-footer__email.dk-footer__email { font-size: 12.5px; }
.dk-footer__copy, .dk-footer__legal a, .dk-footer__stamp { font-size: 12px; }
.dk-footer__col-title.dk-footer__col-title { font-size: 12px; }
.dk-footer__spec-key { font-size: 11px; }
.dk-footer__spec-val { font-size: 14px; }

/* Tables and pagers */
.dk-table td, .dk-table th { font-size: 14px; }
.dk-pager__count, .dk-pager__link { font-size: 12.5px; }
.dk-note, .dk-note__text { font-size: 13.5px; }

/* Phones get one more step on the smallest text. */
@media (max-width: 640px) {
  body { font-size: 15.5px; }
  .dk-nav__links a { font-size: 13px; }
  .dk-product-card__sku,
  .dk-product-meta,
  .dk-spec-label, .dk-spec-value,
  .dk-micro-label, .dk-micro-note { font-size: 12.5px; }
}

/* ═══════════════════════════════════════════════════════════════════════
   KIT DETAIL — image, pin map, code window
   ═══════════════════════════════════════════════════════════════════════ */

/* The kit photo was object-fit:cover at max-height 420px, so a tall product
   shot was cropped top and bottom and read as "zoomed in". Contain shows the
   whole product; the box keeps its height with a neutral ground behind. */
.dk-kit-img-wrap img {
  object-fit: contain;
  max-height: 380px;
  opacity: 1;
  padding: 18px;
  box-sizing: border-box;
  background: var(--bg2);
}

/* ── Pin connections ─────────────────────────────────────────────────── */
.dk-pinmap { border: 1px solid var(--border); background: var(--bg2); margin-bottom: 20px; }
.dk-pinmap__head {
  display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap;
  padding: 14px 18px; border-bottom: 1px solid var(--border);
}
.dk-pinmap__title {
  font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 11px;
  letter-spacing: .1em; text-transform: uppercase; color: var(--fg3);
}
.dk-pinmap__legend { display: flex; flex-wrap: wrap; gap: 6px; }
.dk-pin-key {
  font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 10px;
  letter-spacing: .06em; padding: 4px 9px; border: 1px solid;
}
.dk-pin-key--i2c   { color: #6aa8ff; border-color: color-mix(in srgb, #6aa8ff 45%, transparent); background: color-mix(in srgb, #6aa8ff 10%, transparent); }
.dk-pin-key--power { color: var(--primary); border-color: color-mix(in srgb, var(--primary) 45%, transparent); background: color-mix(in srgb, var(--primary) 10%, transparent); }
.dk-pin-key--gnd   { color: #e5646a; border-color: color-mix(in srgb, #e5646a 45%, transparent); background: color-mix(in srgb, #e5646a 10%, transparent); }
.dk-pin-key--gpio  { color: #e0b13e; border-color: color-mix(in srgb, #e0b13e 45%, transparent); background: color-mix(in srgb, #e0b13e 10%, transparent); }

.dk-pin-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; padding: 18px; }
.dk-pin-card {
  display: flex; align-items: center; gap: 12px;
  padding: 12px 14px; border: 1px solid var(--border); background: var(--bg);
  border-left-width: 2px;
}
.dk-pin-card__from { min-width: 0; }
.dk-pin-card__part {
  font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 11px;
  color: var(--fg3); margin-bottom: 3px; overflow-wrap: anywhere;
}
.dk-pin-card__pin { font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 14px; font-weight: 700; color: var(--fg); }
.dk-pin-card__wire { flex: 1; height: 1px; background: var(--border); min-width: 16px; }
.dk-pin-card__to {
  display: flex; align-items: center; gap: 8px; flex: none;
  font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 14px; font-weight: 700;
}
.dk-pin-card__shared {
  font-size: 9px; font-weight: 400; letter-spacing: .1em;
  text-transform: uppercase; color: var(--fg3);
}

.dk-pin-card--i2c   { border-left-color: #6aa8ff; background: color-mix(in srgb, #6aa8ff 6%, var(--bg)); }
.dk-pin-card--i2c   .dk-pin-card__to, .dk-pin-card--i2c .dk-pin-card__part { color: #6aa8ff; }
.dk-pin-card--power { border-left-color: var(--primary); background: color-mix(in srgb, var(--primary) 6%, var(--bg)); }
.dk-pin-card--power .dk-pin-card__to { color: var(--primary); }
.dk-pin-card--gnd   { border-left-color: #e5646a; background: color-mix(in srgb, #e5646a 6%, var(--bg)); }
.dk-pin-card--gnd   .dk-pin-card__to, .dk-pin-card--gnd .dk-pin-card__part { color: #e5646a; }
.dk-pin-card--gpio  { border-left-color: #e0b13e; background: color-mix(in srgb, #e0b13e 6%, var(--bg)); }
.dk-pin-card--gpio  .dk-pin-card__to { color: #e0b13e; }

.dk-pinmap__foot {
  border-top: 1px solid var(--border); padding: 14px 18px;
  font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 11px;
  color: var(--fg3); line-height: 1.7;
}

@media (max-width: 720px) {
  .dk-pin-grid { grid-template-columns: 1fr; }
  .dk-pinmap__head { flex-direction: column; align-items: flex-start; gap: 10px; }
}

/* ── Code window ─────────────────────────────────────────────────────── */
.dk-code-block.dk-code-block { border: 1px solid var(--border); background: var(--bg2); margin-bottom: 16px; }
.dk-code-block__header.dk-code-block__header {
  display: flex; align-items: center; gap: 12px;
  padding: 12px 16px; border-bottom: 1px solid var(--border); background: var(--bg2);
}
.dk-code-dots { display: flex; gap: 6px; flex: none; }
.dk-code-dots span { width: 11px; height: 11px; border-radius: 50%; display: block; }
.dk-code-dots span:nth-child(1) { background: #e5646a; }
.dk-code-dots span:nth-child(2) { background: #e0b13e; }
.dk-code-dots span:nth-child(3) { background: var(--primary); }
.dk-code-file {
  font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 12px;
  color: #6aa8ff; overflow-wrap: anywhere;
}
.dk-code-copy.dk-code-copy {
  margin-left: auto; flex: none; cursor: pointer;
  border: 1px solid var(--border); background: var(--bg); color: var(--fg2, var(--fg));
  padding: 6px 14px; font-size: 11px; border-radius: 6px;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
}
.dk-code-copy.dk-code-copy:hover { border-color: var(--primary); color: var(--primary); }
.dk-code-pre.dk-code-pre {
  margin: 0; padding: 20px; overflow-x: auto; background: var(--bg);
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 12.5px; line-height: 1.85; color: var(--fg2, var(--fg));
  max-height: 520px; overflow-y: auto;
}
.dk-code-pre code { font: inherit; color: inherit; white-space: pre; }

.dk-sample-tag {
  display: inline-flex; align-items: center; gap: 6px; margin-left: 10px;
  font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 10px;
  letter-spacing: .1em; text-transform: uppercase;
  color: #e0b13e; border: 1px solid color-mix(in srgb, #e0b13e 45%, transparent);
  background: color-mix(in srgb, #e0b13e 10%, transparent); padding: 3px 8px;
}
@media (hover: none) and (pointer: coarse) {
  .dk-code-copy.dk-code-copy { min-height: 44px; }
}

/* ── Category images from the DB ──────────────────────────────────────── */
/* Sidebar rows carry the category's own picture, falling back to its glyph. */
.dk-sidebar__cat { display: flex; align-items: center; gap: 9px; min-width: 0; }
.dk-sidebar__thumb {
  width: 32px; height: 32px; flex: none;
  object-fit: contain; background: var(--bg); border: 1px solid var(--border);
  padding: 2px; box-sizing: border-box;
}
.dk-sidebar__thumb--glyph {
  display: flex; align-items: center; justify-content: center;
  font-size: 15px; color: var(--fg3); padding: 0;
}
a.dk-sidebar__item.active .dk-sidebar__thumb { border-color: var(--primary); }

/* Home grid uses the same .dk-cat-card as the categories page but without a
   __body wrapper, so it gets its own modifier — an unscoped height here was
   shrinking the categories page's 150px tiles to a thumbnail. */
.dk-cat-card--compact .dk-cat-card__img {
  height: 88px; margin-bottom: 12px; background: none;
}
.dk-cat-card__img img { transition: transform .3s ease; }
.dk-cat-card:hover .dk-cat-card__img img { transform: scale(1.07); }

/* Both grids: bigger pictures — these are the thing being chosen. */
.dk-cat-card__img { height: 190px; }
.dk-cat-card__img img { padding: 10px; box-sizing: border-box; }
.dk-cat-card--compact .dk-cat-card__img img { padding: 0; }

@media (max-width: 640px) {
  .dk-cat-card--compact .dk-cat-card__img { height: 64px; }
  .dk-cat-card__img { height: 150px; }
}

/* ── Homepage builder blocks ──────────────────────────────────────────── */
.dk-featured { padding: 72px 0; border-top: 1px solid var(--border); }
.dk-featured-kit__foot { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; margin-top: 20px; }
.dk-featured-kit__desc { color: var(--fg3); font-size: 14px; line-height: 1.7; margin-top: 10px; }
.dk-featured-kit__name { font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 20px; color: var(--fg); line-height: 1.4; margin-top: 6px; }
.dk-trust--block { border-top: 1px solid var(--border); padding: 40px 0; position: static; }

.dk-bundles { padding: 72px 0; border-top: 1px solid var(--border); }
.dk-bundle { border: 1px solid var(--border); background: var(--bg2); }
.dk-bundle__row {
  display: flex; align-items: center; gap: 14px; padding: 14px 18px;
  border-bottom: 1px solid var(--border); cursor: pointer;
}
.dk-bundle__row:last-of-type { border-bottom: 0; }
.dk-bundle__check { accent-color: var(--primary); flex: none; width: 16px; height: 16px; }
.dk-bundle__img {
  width: 48px; height: 48px; flex: none; border: 1px solid var(--border); background: var(--bg);
  display: flex; align-items: center; justify-content: center; overflow: hidden;
}
.dk-bundle__img img { max-width: 100%; max-height: 100%; object-fit: contain; }
.dk-bundle__body { flex: 1; min-width: 0; }
.dk-bundle__name { font-size: 14px; color: var(--fg); text-decoration: none; display: block; line-height: 1.45; }
.dk-bundle__name:hover { color: var(--primary); }
.dk-bundle__sku { font-size: 11px; color: var(--fg3); display: block; margin-top: 3px; }
.dk-bundle__price { font-size: 13px; color: var(--fg); flex: none; }
.dk-bundle__total { font-size: 12px; color: var(--fg3); }
.dk-bundle__foot {
  display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap;
  border-top: 1px solid var(--border); padding: 16px 18px; background: var(--bg);
}
.dk-bundle__selected { font-size: 13px; color: var(--fg); }
@media (max-width: 640px) {
  .dk-bundle__row { flex-wrap: wrap; }
  .dk-bundle__price { margin-left: auto; }
  .dk-bundle__foot .dk-btn { width: 100%; justify-content: center; }
}
@media (hover: none) and (pointer: coarse) {
  .dk-bundle__row { min-height: 60px; }
}

/* ═══════════════════════════════════════════════════════════════════════
   BOARDS SHOWCASE — a picture and a few figures per board
   ═══════════════════════════════════════════════════════════════════════ */
.dk-base { padding: 80px 0; border-top: 1px solid var(--border); }
.dk-base__count { font-size: 12px; color: var(--fg3); }
.dk-base__grid { display: grid; grid-template-columns: minmax(0, 380px) minmax(0, 1fr); gap: 32px; align-items: start; }

/* ── Board side ── */
.dk-base__board { position: sticky; top: 96px; border: 1px solid var(--border); background: var(--bg2); }
.dk-base__plate { border-bottom: 1px solid var(--border); background: var(--bg); padding: 18px; }
.dk-base__plate img { width: 100%; max-height: 260px; object-fit: contain; display: block; }
/* The picture is the way through to the board's own page. */
.dk-base__plate--link { display: block; text-decoration: none; }
.dk-base__plate--link img { transition: transform .25s ease; }
.dk-base__plate--link:hover img { transform: scale(1.02); }
.dk-base__plate--link:focus-visible { outline: 2px solid var(--primary); outline-offset: -2px; }
@media (prefers-reduced-motion: reduce) { .dk-base__plate--link img { transition: none; } }

.dk-base__meta { padding: 20px; }
.dk-base__name {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 20px; font-weight: 700; letter-spacing: .12em; color: var(--fg);
}
.dk-base__blurb { font-size: 14px; color: var(--fg3); line-height: 1.7; margin: 10px 0 16px; }

.dk-base__foot { display: flex; align-items: center; justify-content: space-between; gap: 14px; flex-wrap: wrap; }

@media (max-width: 1100px) {
  .dk-base__grid { grid-template-columns: 1fr; }
  .dk-base__board { position: static; }
}
@media (max-width: 720px) {
  .dk-base { padding: 56px 0; }
}

/* ── Header overflow between 900 and 1180px ─────────────────────────────
   The base sheet only swaps the nav for the hamburger at 900px. With three
   more nav items (Categories, Kits, Custom Kit) and the larger nav type from
   the readability pass, the bar outgrew its container well before that — every
   /dk page scrolled sideways by ~220px on a small laptop. The links now step
   down and then hand over to the hamburger at 1100px, where they actually
   stop fitting. */
@media (max-width: 1280px) and (min-width: 1101px) {
  .dk-nav__links { gap: 16px; }
  .dk-nav__links a { font-size: 11.5px; letter-spacing: .06em; }
  .dk-nav__actions { gap: 8px; }
}
@media (max-width: 1100px) {
  .dk-nav__links { display: none; }
  .dk-hamburger { display: flex; }
}
/* Nothing in the bar may force the page wider than the viewport. */
.dk-nav__inner { min-width: 0; }
.dk-nav__links, .dk-nav__actions { min-width: 0; }
.dk-logo { min-width: 0; }
.dk-logo__text { white-space: nowrap; }

/* ═══════════════════════════════════════════════════════════════════════
   BASE-1 SHOWCASE — v2
   The section is our own product on a page of other people's, so it gets a
   look no other section has: an inset dark slab, an oversized split headline,
   a marquee of what is onboard, and a board that reacts to the build you
   point at. Contained — the dark ground is on the section, not the page.
   ═══════════════════════════════════════════════════════════════════════ */
.dk-base {
  position: relative; overflow: hidden;
  padding: 84px 0; margin: 72px 0;
  background: #05100c; color: #e8f5ef;
  border-top: 1px solid color-mix(in srgb, var(--primary) 30%, transparent);
  border-bottom: 1px solid color-mix(in srgb, var(--primary) 30%, transparent);
}
.dk-base .dk-section-label { color: var(--primary); }
.dk-base__glow {
  position: absolute; inset: -30% -10% auto -10%; height: 70%;
  background: radial-gradient(50% 60% at 30% 0%, color-mix(in srgb, var(--primary) 22%, transparent), transparent 70%);
  pointer-events: none;
}
.dk-base > .container { position: relative; }

/* ── Split headline ── */
.dk-base__head { margin-bottom: 40px; }
.dk-base__title {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-weight: 800; line-height: .92; letter-spacing: -.02em;
  margin: 14px 0 16px; display: grid;
}
.dk-base__title-l1 { font-size: clamp(30px, 5.2vw, 62px); color: #fff; }
.dk-base__title-l2 { font-size: clamp(30px, 5.2vw, 62px); color: var(--primary); }
.dk-base__title-l2 em {
  font-style: normal; font-size: 1.35em; line-height: .8;
  display: inline-block; transform: translateY(.06em); margin-right: .06em;
}
.dk-base__lede { font-size: 15.5px; line-height: 1.75; color: #bcd6cb; max-width: 54ch; }


/* ── Board panel (dark ground overrides the earlier light styling) ── */
.dk-base .dk-base__board {
  border-color: color-mix(in srgb, var(--primary) 26%, transparent);
  background: #0b1a15;
}
.dk-base .dk-base__plate { background: #071410; border-bottom-color: color-mix(in srgb, var(--primary) 22%, transparent); }
.dk-base .dk-price--quote { color: #8fb3a6; }

@media (max-width: 1100px) {
  .dk-base { padding: 64px 0; margin: 56px 0; }
}
@media (max-width: 640px) {
  .dk-base { padding: 48px 0; margin: 40px 0; }
}

/* ═══════════════════════════════════════════════════════════════════════
   BASE-1 SHOWCASE — legibility pass
   ───────────────────────────────────────────────────────────────────────
   Three things were fighting each other in the original:

   1. Everything was green. Borders, icons, labels, numbers, the chip and the
      idle blocks all used --primary, so nothing could stand out — and worst,
      the "pick a build and the board lights up" interaction had nothing to
      light up FROM. Green now means "active"; at rest everything is neutral.
   2. Everything was JetBrains Mono. Mono with wide tracking is superb for pin
      names and numbers and hard work for reading. Names and prose move to DM
      Sans; mono stays on the data.
   3. Small text was small AND low-contrast — 10px #8fb3a6 on near-black. Sizes
      and tones both come up.

   Appended, so these override the block above by source order without
   touching it — the earlier rules stay readable as the original intent.
   ═══════════════════════════════════════════════════════════════════════ */

.dk-base {
  /* Neutral resting palette, so --primary can mean something again. */
  --nb-line:  #23342e;   /* idle border  */
  --nb-line2: #2f453d;   /* idle border, raised */
  --nb-face:  #0e1c17;   /* idle fill    */
  --nb-text:  #a9c4b9;   /* idle label — was #8fb3a6 */
  --nb-bright:#dcece5;   /* names, values */
}

/* ── Headline ───────────────────────────────────────────────────────────*/
.dk-base .dk-base__lede { font-size: 16px; line-height: 1.8; color: #c8ddd4; max-width: 56ch; }

/* ── Showcase: same size and character pass as the detail page ─────────*/
.dk-base .dk-base__lede { font-size: 17.5px; line-height: 1.75; }

/* ═══════════════════════════════════════════════════════════════════════
   OUR BOARDS — carousel
   A native scroll-snap track: it works with a finger, a touchpad and the
   keyboard with no JavaScript at all, and the arrows and dots only add
   convenience on top. Same neutral-at-rest palette as the showcase above it,
   so green still means "you are here".
   ═══════════════════════════════════════════════════════════════════════ */

.dk-bcar {
  --nb-line:  #23342e;
  --nb-line2: #2f453d;
  --nb-face:  #0e1c17;
  --nb-text:  #a9c4b9;
  padding: 76px 0;
  background: #05100c;
  border-top: 1px solid var(--nb-line);
}

.dk-bcar__head {
  display: flex; align-items: flex-end; justify-content: space-between;
  gap: 28px; flex-wrap: wrap; margin-bottom: 30px;
}
.dk-bcar__title {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: clamp(26px, 3.4vw, 40px); font-weight: 800; letter-spacing: -.02em;
  line-height: 1.1; color: #fff; margin: 12px 0 12px;
}
.dk-bcar__lede { font-size: 17px; line-height: 1.75; color: #c8ddd4; max-width: 52ch; margin: 0; }

.dk-bcar__ctrls { display: flex; align-items: center; gap: 10px; }
.dk-bcar__arrow {
  width: 46px; height: 46px; flex: none; border-radius: 3px;
  border: 1px solid var(--nb-line2); background: var(--nb-face);
  color: #dcece5; font-size: 22px; line-height: 1; cursor: pointer;
  transition: border-color .16s, background .16s, color .16s, opacity .16s;
}
.dk-bcar__arrow:hover:not(:disabled) { border-color: var(--primary); color: var(--primary); }
.dk-bcar__arrow:disabled { opacity: .3; cursor: default; }
.dk-bcar__all { white-space: nowrap; }

/* ── The track ─────────────────────────────────────────────────────────*/
.dk-bcar__track {
  display: grid; grid-auto-flow: column; grid-auto-columns: minmax(300px, 1fr);
  gap: 16px; overflow-x: auto; overscroll-behavior-x: contain;
  scroll-snap-type: x mandatory; scroll-padding-left: 0;
  padding-bottom: 6px;
  scrollbar-width: none;
}
.dk-bcar__track::-webkit-scrollbar { display: none; }
.dk-bcar__track:focus-visible { outline: 2px solid var(--primary); outline-offset: 4px; }

/* Three at a time on a wide screen, and the card width comes from the grid so
   there is no magic number to keep in step with the breakpoints. */
@media (min-width: 900px)  { .dk-bcar__track { grid-auto-columns: calc((100% - 32px) / 3); } }
@media (min-width: 600px) and (max-width: 899px) { .dk-bcar__track { grid-auto-columns: calc((100% - 16px) / 2); } }
@media (max-width: 599px)  { .dk-bcar__track { grid-auto-columns: 86%; } }

.dk-bcar__card {
  scroll-snap-align: start;
  display: flex; flex-direction: column; min-width: 0;
  border: 1px solid var(--nb-line); background: var(--nb-face);
  border-radius: 4px; overflow: hidden;
  transition: border-color .18s, transform .18s;
}
.dk-bcar__card:hover { border-color: var(--primary); transform: translateY(-3px); }

.dk-bcar__media {
  position: relative; display: block; aspect-ratio: 16 / 10;
  background: #071410; overflow: hidden; line-height: 0;
  border-bottom: 1px solid var(--nb-line);
}
.dk-bcar__media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.dk-bcar__noimg {
  display: grid; place-items: center; height: 100%;
  font-size: 40px; color: #23342e;
}
.dk-bcar__flag {
  position: absolute; top: 10px; left: 10px;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 10px; letter-spacing: .14em; text-transform: uppercase;
  color: #04140d; background: #e0b13e; padding: 4px 8px; border-radius: 2px;
}

.dk-bcar__body { padding: 18px 18px 16px; display: flex; flex-direction: column; gap: 10px; flex: 1; }
.dk-bcar__top { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.dk-bcar__name { margin: 0; font-size: 19px; font-weight: 700; letter-spacing: -.01em; line-height: 1.2; }
.dk-bcar__name a { color: #fff; text-decoration: none; }
.dk-bcar__name a:hover { color: var(--primary); }
.dk-bcar__rev {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px; letter-spacing: .1em; color: var(--primary); flex: none;
  border: 1px solid var(--nb-line2); padding: 3px 7px; border-radius: 2px;
}
.dk-bcar__tag { margin: 0; font-size: 15px; line-height: 1.6; color: var(--nb-text); }

.dk-bcar__chips { list-style: none; display: flex; flex-wrap: wrap; gap: 6px; margin: 2px 0 0; padding: 0; }
.dk-bcar__chips li {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 10.5px; letter-spacing: .04em; color: #93aea3;
  border: 1px solid var(--nb-line); padding: 4px 8px; border-radius: 2px;
}

.dk-bcar__foot {
  margin-top: auto; padding-top: 14px; border-top: 1px solid var(--nb-line);
  display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap;
}
.dk-bcar__meta {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 12px; color: #93aea3;
}
.dk-bcar__meta b { color: var(--primary); font-size: 15px; }
.dk-bcar__links { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.dk-bcar__pre {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px; letter-spacing: .06em; text-decoration: none;
  color: #04140d; background: var(--primary); padding: 6px 10px; border-radius: 2px;
}
.dk-bcar__pre:hover { filter: brightness(1.08); }
.dk-bcar__go {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 12px; color: var(--primary); text-decoration: none; white-space: nowrap;
}
.dk-bcar__go:hover { text-decoration: underline; }

/* ── Dots ──────────────────────────────────────────────────────────────*/
.dk-bcar__dots { display: flex; justify-content: center; gap: 8px; margin-top: 22px; }
.dk-bcar__dot {
  width: 26px; height: 3px; border: 0; padding: 0; cursor: pointer;
  background: var(--nb-line2); border-radius: 2px; transition: background .18s, width .18s;
}
.dk-bcar__dot.is-on { background: var(--primary); width: 40px; }

@media (max-width: 720px) {
  .dk-bcar { padding: 56px 0; }
  .dk-bcar__ctrls .dk-bcar__arrow { display: none; }   /* swipe instead */
  .dk-bcar__head { margin-bottom: 22px; }
}
@media (prefers-reduced-motion: reduce) {
  .dk-bcar__card, .dk-bcar__dot { transition: none; }
  .dk-bcar__card:hover { transform: none; }
  .dk-bcar__track { scroll-behavior: auto; }
}

/* ═══════════════════════════════════════════════════════════════════════
   SHOWCASE AS A SLIDER — one board per slide
   The slide contents are the existing .dk-base__* rules untouched; this only
   adds the track, the bar and the tabs around them.
   ═══════════════════════════════════════════════════════════════════════ */

.dk-bs__bar {
  display: flex; align-items: center; gap: 20px; flex-wrap: wrap;
  margin-bottom: 30px; padding-bottom: 18px;
  border-bottom: 1px solid var(--nb-line, #23342e);
}
.dk-bs__bar .dk-section-label { margin: 0; flex: none; }

.dk-bs__tabs { display: flex; gap: 6px; flex-wrap: wrap; flex: 1; min-width: 0; }
.dk-bs__tab {
  display: inline-flex; align-items: baseline; gap: 8px;
  font-family: 'DM Sans', sans-serif; font-size: 14.5px; font-weight: 600;
  letter-spacing: -.005em; color: #a9c4b9; cursor: pointer;
  background: #0e1c17; border: 1px solid #23342e; border-radius: 3px;
  padding: 9px 14px; transition: color .16s, border-color .16s, background .16s;
}
.dk-bs__tab i {
  font-style: normal; font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 10px; letter-spacing: .1em; color: #6f8b81;
}
.dk-bs__tab:hover { color: #fff; border-color: #2f453d; }
.dk-bs__tab.is-on {
  color: #04140d; background: var(--primary); border-color: var(--primary);
}
.dk-bs__tab.is-on i { color: #04140d; opacity: .7; }
.dk-bs__tab:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }

.dk-bs__arrows { display: flex; align-items: center; gap: 10px; flex: none; }
.dk-bs__arrow {
  width: 44px; height: 44px; border-radius: 3px; cursor: pointer;
  border: 1px solid #2f453d; background: #0e1c17; color: #dcece5;
  font-size: 22px; line-height: 1;
  transition: border-color .16s, color .16s, opacity .16s;
}
.dk-bs__arrow:hover:not(:disabled) { border-color: var(--primary); color: var(--primary); }
.dk-bs__arrow:disabled { opacity: .28; cursor: default; }
.dk-bs__count {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 12.5px; color: #7f9d92; min-width: 46px; text-align: center;
}
.dk-bs__count b { color: var(--primary); font-weight: 700; }

/* ── The track ─────────────────────────────────────────────────────────*/
.dk-bs__track {
  display: grid; grid-auto-flow: column; grid-auto-columns: 100%;
  overflow-x: auto; overscroll-behavior-x: contain;
  scroll-snap-type: x mandatory; scrollbar-width: none;
  /* No bleed on either side. The 4px of breathing room this used to carry for
     the lit-block glow (margin: 0 -4px; padding: 0 4px) made the track wider
     than one slide, so a 4px sliver of the NEXT board sat past the right edge
     of every screen - stray letters and a green bar beside the headline. */
}
.dk-bs__track::-webkit-scrollbar { display: none; }
.dk-bs__slide { scroll-snap-align: start; min-width: 0; }

/* Inside a slide the original section spacing would double up. */
.dk-bs__slide .dk-base__head { margin-bottom: 34px; }
.dk-section-label--slim { margin-bottom: 10px; }

@media (max-width: 860px) {
  .dk-bs__bar { gap: 14px; }
  .dk-bs__tabs { order: 3; width: 100%; }
  .dk-bs__arrows { margin-left: auto; }
  .dk-bs__tab { font-size: 13.5px; padding: 8px 12px; }
}
@media (prefers-reduced-motion: reduce) {
  .dk-bs__track { scroll-behavior: auto; }
  .dk-bs__tab, .dk-bs__arrow { transition: none; }
}

/* ═══════════════════════════════════════════════════════════════════════
   SHOWCASE — follow the site theme
   ───────────────────────────────────────────────────────────────────────
   The section used to paint its own near-black ground (#05100c, #0b1a15,
   #071410) whatever the site theme was, so it stayed dark inside a light
   page. Every one of those is now a theme token, which means the whole
   section switches with the light/dark toggle and needs no separate light
   variant of its own.

   The neutral resting palette is kept — it is what lets green mean "active" —
   but it is now DERIVED from the theme rather than hardcoded to the dark one.
   ═══════════════════════════════════════════════════════════════════════ */

.dk-base {
  --nb-line:   var(--border);
  --nb-line2:  var(--border2);
  --nb-face:   var(--bg2);
  --nb-text:   var(--fg2);
  --nb-bright: var(--fg);

  background: var(--bg);
  border-top-color: var(--border);
}

/* Panels */
.dk-base .dk-base__board { background: var(--bg2); border-color: var(--border); }
.dk-base .dk-base__plate { background: var(--bg); border-bottom-color: var(--border); }

/* Type */
.dk-base .dk-base__title-l1 { color: var(--fg); }
.dk-base .dk-base__title-l2 { color: var(--primary); }
.dk-base .dk-base__lede { color: var(--fg2); }

/* Ticker */

/* Slider chrome */
.dk-bs__bar { border-bottom-color: var(--border); }
.dk-bs__tab { background: var(--bg2); border-color: var(--border); color: var(--fg2); }
.dk-bs__tab i { color: var(--fg3); }
.dk-bs__tab:hover { color: var(--fg); border-color: var(--border2); }
.dk-bs__tab.is-on { color: var(--primary-fg); background: var(--primary); border-color: var(--primary); }
.dk-bs__tab.is-on i { color: var(--primary-fg); opacity: .7; }
.dk-bs__arrow { background: var(--bg2); border-color: var(--border); color: var(--fg); }
.dk-bs__arrow:hover:not(:disabled) { border-color: var(--primary); color: var(--primary); }
.dk-bs__count { color: var(--fg3); }
.dk-bs__count b { color: var(--primary); }

/* The glow is a dark-room effect: on a light ground it reads as a smudge. */
[data-theme="light"] .dk-base__glow { display: none; }

/* A board that is not a "one core, many builds" product — the GPIO card, the
   practice board — fills the builds column with what it actually is. */
.dk-bs__facts { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 10px; align-content: start; }
.dk-bs__fact {
  display: flex; align-items: center; min-height: 76px; padding: 16px 18px;
  border: 1px solid var(--border); background: var(--bg2); border-radius: 4px;
  font-family: 'DM Sans', sans-serif; font-size: 15.5px; font-weight: 600;
  color: var(--fg); line-height: 1.35;
}
.dk-bs__fact--n { font-weight: 500; color: var(--fg2); }
.dk-bs__fact--n b { color: var(--primary); font-size: 22px; margin-right: 8px; }
.dk-bs__fact--go {
  text-decoration: none; color: var(--primary); border-color: var(--primary);
  background: color-mix(in srgb, var(--primary) 8%, var(--bg2));
  font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 13px;
}
.dk-bs__fact--go:hover { background: color-mix(in srgb, var(--primary) 15%, var(--bg2)); }


/* ══════════════════════════════════════════════════════════════════════
   PICK-A-BUILD — restored
   ──────────────────────────────────────────────────────────────────────
   The board drawn as labelled blocks, and the grid of builds that lights
   them up. Lifted back out of the pre-removal stylesheet unchanged, so the
   dark-ground and light-theme passes that were tuned for it come with it.
   Its markup is in partials/_base_board.php and the highlighting is in
   assets/dk/js/boards-showcase.js.
   ═════════════════════════════════════════════════════════════════════ */
/* Drawn stand-in for the board: a plate of labelled blocks that light up. */
.dk-base__pcb {
  position: relative; display: grid; gap: 8px;
  grid-template-columns: repeat(3, 1fr);
  padding: 16px;
  background:
    linear-gradient(to right, color-mix(in srgb, var(--primary) 14%, transparent) 1px, transparent 1px) 0 0 / 26px 26px,
    linear-gradient(to bottom, color-mix(in srgb, var(--primary) 14%, transparent) 1px, transparent 1px) 0 0 / 26px 26px,
    color-mix(in srgb, var(--primary) 5%, var(--bg2));
  border: 1px solid color-mix(in srgb, var(--primary) 30%, transparent);
}
.dk-base__chip {
  grid-column: 1 / -1; text-align: center;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 15px; font-weight: 700; letter-spacing: .22em;
  color: var(--primary-fg); background: var(--primary);
  padding: 10px 8px; margin-bottom: 4px;
}
.dk-base__blk {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 10px; line-height: 1.35; text-align: center;
  color: var(--fg3); background: var(--bg);
  border: 1px solid var(--border); padding: 8px 5px;
  transition: color .18s, border-color .18s, background .18s, opacity .18s, transform .18s;
}
.dk-base__blk.is-on {
  color: var(--primary-fg); background: var(--primary);
  border-color: var(--primary); transform: translateY(-1px);
}
.dk-base__blk.is-off { opacity: .32; }
.dk-base__now {
  border: 1px solid var(--border); border-left: 2px solid var(--border);
  background: var(--bg); padding: 12px 14px; margin-bottom: 18px;
  transition: border-color .2s;
}
.dk-base__now.is-live { border-left-color: var(--primary); }
.dk-base__now-label {
  display: block; font-size: 11px; letter-spacing: .1em; text-transform: uppercase;
  color: var(--primary); margin-bottom: 5px;
}
.dk-base__now-text { font-size: 13px; color: var(--fg2, var(--fg)); line-height: 1.6; }
.dk-base__now-text b { color: var(--fg); }
/* ── Project grid ── */
.dk-base__projects { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; }
.dk-base__proj {
  position: relative; display: flex; flex-direction: column; gap: 6px;
  text-align: left; cursor: pointer;
  border: 1px solid var(--border); background: var(--bg2);
  padding: 14px 12px 12px;
  transition: border-color .18s, background .18s, transform .18s;
}
.dk-base__proj:hover, .dk-base__proj:focus-visible, .dk-base__proj.is-on {
  border-color: var(--primary); transform: translateY(-2px);
  background: color-mix(in srgb, var(--primary) 7%, var(--bg2));
}
.dk-base__proj:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.dk-base__proj-n {
  position: absolute; top: 8px; right: 10px;
  font-size: 10px; color: var(--border);
}
.dk-base__proj.is-on .dk-base__proj-n { color: var(--primary); }
.dk-base__proj-icon { font-size: 20px; color: var(--primary); line-height: 1; }
.dk-base__proj-name {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 12.5px; color: var(--fg); line-height: 1.4;
}
.dk-base__proj-adds { font-size: 10.5px; color: var(--fg3); line-height: 1.4; margin-top: auto; }
.dk-base__proj-adds--none { color: var(--primary); opacity: .85; }
@media (max-width: 1100px) {.dk-base__pcb { grid-template-columns: repeat(4, 1fr); }
}
@media (max-width: 720px) {.dk-base__projects { grid-template-columns: repeat(2, 1fr); }
.dk-base__pcb { grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 420px) {.dk-base__projects { grid-template-columns: 1fr; }
}
@media (hover: none) and (pointer: coarse) {.dk-base__proj { min-height: 88px; }
}
@media (prefers-reduced-motion: reduce) {.dk-base__proj, .dk-base__blk { transition: none; }
.dk-base__proj:hover, .dk-base__proj.is-on { transform: none; }
}
.dk-base .dk-base__pcb {
  background:
    linear-gradient(to right, color-mix(in srgb, var(--primary) 16%, transparent) 1px, transparent 1px) 0 0 / 26px 26px,
    linear-gradient(to bottom, color-mix(in srgb, var(--primary) 16%, transparent) 1px, transparent 1px) 0 0 / 26px 26px,
    var(--bg3);
  border-color: color-mix(in srgb, var(--primary) 30%, transparent);
}
.dk-base .dk-base__blk { background: var(--bg2); border-color: color-mix(in srgb, var(--primary) 20%, transparent); color: var(--fg2); }
.dk-base .dk-base__blk.is-on { color: var(--primary-fg); background: var(--primary); border-color: var(--primary); }
.dk-base .dk-base__now { background: var(--bg3); border-color: color-mix(in srgb, var(--primary) 22%, transparent); }
.dk-base .dk-base__now-text { color: var(--fg); }
.dk-base .dk-base__now-text b { color: var(--fg); }
/* ── Project tiles ── */
.dk-base .dk-base__proj {
  background: var(--bg2);
  border-color: color-mix(in srgb, var(--primary) 20%, transparent);
}
.dk-base .dk-base__proj:hover,
.dk-base .dk-base__proj:focus-visible,
.dk-base .dk-base__proj.is-on {
  background: color-mix(in srgb, var(--primary) 12%, var(--bg2));
  border-color: var(--primary);
}
.dk-base .dk-base__proj-name { color: var(--fg); }
.dk-base .dk-base__proj-adds { color: var(--fg2); }
.dk-base .dk-base__proj-adds--none { color: var(--primary); opacity: 1; }
.dk-base .dk-base__proj-n { color: color-mix(in srgb, var(--primary) 45%, transparent); }
@media (max-width: 820px) {.dk-base__projects { grid-template-columns: repeat(2, 1fr); }
}
/* ── The plate ─────────────────────────────────────────────────────────
   A quieter grid so the lit blocks read as lit. */
.dk-base .dk-base__pcb {
  background:
    linear-gradient(to right, rgba(255,255,255,.035) 1px, transparent 1px) 0 0 / 26px 26px,
    linear-gradient(to bottom, rgba(255,255,255,.035) 1px, transparent 1px) 0 0 / 26px 26px,
    var(--bg3);
  border-color: var(--nb-line2);
  gap: 7px;
}
.dk-base .dk-base__blk {
  /* Every cell the same height whatever it holds — "USB / batt / DC" wrapped
     to two lines and dragged its whole row out of alignment, which is most of
     what made the panel look untidy. */
  display: flex; align-items: center; justify-content: center;
  min-height: 42px;
  font-size: 11px; line-height: 1.3; letter-spacing: .01em;
  padding: 7px 6px;
  background: var(--nb-face);
  border-color: var(--nb-line);
  color: var(--nb-text);
  border-radius: 3px;
}
.dk-base .dk-base__blk.is-on {
  color: var(--primary-fg); background: var(--primary); border-color: var(--primary);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary) 18%, transparent);
}
.dk-base .dk-base__blk.is-off { opacity: .28; }
.dk-base .dk-base__chip {
  font-size: 14px; letter-spacing: .28em; padding: 12px 8px;
  margin-bottom: 6px; border-radius: 3px;
  box-shadow: 0 6px 18px -8px color-mix(in srgb, var(--primary) 60%, transparent);
}
/* ── Status line ───────────────────────────────────────────────────────
   Reserves its own height so the panel does not jump as you move across the
   grid, which read as flicker. */
.dk-base .dk-base__now { border-color: var(--nb-line); min-height: 76px; }
.dk-base .dk-base__now-label { font-size: 11.5px; letter-spacing: .12em; }
.dk-base .dk-base__now-text { font-size: 13.5px; line-height: 1.65; color: var(--fg2); }
.dk-base .dk-base__now-text b { color: var(--fg); font-weight: 600; }
.dk-base .dk-base__proj {
  min-height: 104px;                 /* a wrapping name no longer skews the row */
  border-color: var(--nb-line);
  background: var(--nb-face);
  border-radius: 4px;
  padding: 15px 13px 13px;
}
.dk-base .dk-base__proj:hover,
.dk-base .dk-base__proj:focus-visible,
.dk-base .dk-base__proj.is-on {
  border-color: var(--primary);
  background: color-mix(in srgb, var(--primary) 9%, var(--nb-face));
}
.dk-base .dk-base__proj-name {
  font-family: 'DM Sans', sans-serif;
  font-size: 14px; font-weight: 600; letter-spacing: -.005em;
  line-height: 1.35; color: var(--nb-bright);
}
.dk-base .dk-base__proj-icon { font-size: 18px; opacity: .9; }
.dk-base .dk-base__proj-adds {
  font-size: 11.5px; line-height: 1.45; color: var(--fg2); padding-top: 2px;
}
.dk-base .dk-base__proj-adds--none { color: var(--primary); opacity: 1; font-weight: 500; }
.dk-base .dk-base__proj-n { font-size: 10px; color: var(--fg3); }
.dk-base .dk-base__proj:hover .dk-base__proj-n,
.dk-base .dk-base__proj.is-on .dk-base__proj-n { color: var(--primary); }
@media (max-width: 720px) {.dk-base .dk-base__proj { min-height: 96px; }
.dk-base .dk-base__blk { min-height: 38px; font-size: 10.5px; }
}
/* ── Showcase: even rhythm inside the cards ────────────────────────────
   The min-height above evened up the BOXES, but not their contents: with
   `margin-top:auto` on the adds line, a one-line name left a hole and a
   two-line name did not, so the grid still read as ragged. Reserving two
   lines for every name lines all three elements up across the row. */
.dk-base .dk-base__proj-name {
  min-height: 2.7em;              /* two lines at 1.35 line-height */
  display: flex; align-items: flex-start;
  text-wrap: balance;             /* splits "Phone-controlled lamp" evenly */
}
.dk-base .dk-base__proj { gap: 8px; }
.dk-base .dk-base__proj-adds { margin-top: 0; }
/* Same treatment on the plate: "Relay 30 V/2 A" broke after "V/2", which
   reads as a typo rather than a wrap. */
.dk-base .dk-base__blk { text-wrap: balance; hyphens: none; }
.dk-base .dk-base__proj-name { font-size: 15.5px; min-height: 2.7em; }
.dk-base .dk-base__proj-adds { font-size: 12.5px; }
.dk-base .dk-base__blk { font-size: 12px; min-height: 46px; }
.dk-base .dk-base__now-text { font-size: 14.5px; }
.dk-base .dk-base__now-label { font-size: 12.5px; }
.dk-base .dk-base__proj { min-height: 112px; position: relative; overflow: hidden; }
/* The same accent edge on approach, so the two pages share a gesture. */
.dk-base .dk-base__proj::before {
  content: ''; position: absolute; inset: 0 auto auto 0; height: 2px; width: 100%;
  background: var(--primary); transform: scaleX(0); transform-origin: left;
  transition: transform .22s cubic-bezier(.2,.7,.2,1);
}
.dk-base .dk-base__proj:hover::before,
.dk-base .dk-base__proj:focus-visible::before,
.dk-base .dk-base__proj.is-on::before { transform: scaleX(1); }
@media (prefers-reduced-motion: reduce) {.dk-base .dk-base__proj::before { transition: none; }
}
.dk-base .dk-base__pcb {
  background:
    linear-gradient(to right, color-mix(in srgb, var(--fg3) 16%, transparent) 1px, transparent 1px) 0 0 / 26px 26px,
    linear-gradient(to bottom, color-mix(in srgb, var(--fg3) 16%, transparent) 1px, transparent 1px) 0 0 / 26px 26px,
    var(--bg);
  border-color: var(--border2);
}
.dk-base .dk-base__blk {
  background: var(--bg2); border-color: var(--border); color: var(--fg2);
}
.dk-base .dk-base__blk.is-on {
  color: var(--primary-fg); background: var(--primary); border-color: var(--primary);
}
.dk-base .dk-base__now { background: var(--bg); border-color: var(--border); }
.dk-base .dk-base__now-text { color: var(--fg2); }
.dk-base .dk-base__now-text b { color: var(--fg); }
.dk-base .dk-base__now-label { color: var(--primary); }
/* Build cards */
.dk-base .dk-base__proj { background: var(--bg2); border-color: var(--border); }
.dk-base .dk-base__proj:hover,
.dk-base .dk-base__proj:focus-visible,
.dk-base .dk-base__proj.is-on {
  border-color: var(--primary);
  background: color-mix(in srgb, var(--primary) 9%, var(--bg2));
}
.dk-base .dk-base__proj-name { color: var(--fg); }
.dk-base .dk-base__proj-adds { color: var(--fg3); }
.dk-base .dk-base__proj-adds--none { color: var(--primary); }
.dk-base .dk-base__proj-n { color: var(--fg3); opacity: .6; }
.dk-base .dk-base__proj:hover .dk-base__proj-n,
.dk-base .dk-base__proj.is-on .dk-base__proj-n { color: var(--primary); opacity: 1; }

/* ── Kit page: quantity and bulk bands ────────────────────────────────
   An assembled kit buys as a catalogue product, so it carries that
   product's quantity breaks. The sidebar had no qty control at all —
   Add to cart always sent 1, so a break was unreachable from this page. */
.dk-kit-qty { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }
.dk-kit-qty .dk-micro-label { flex: none; }
.dk-kit-bulk { margin-top: 16px; }
.dk-kit-bulk__head {
  font-size: 10px; letter-spacing: .16em; text-transform: uppercase;
  color: var(--fg3); margin-bottom: 8px;
}
/* The sidebar is narrow, so the bands stack rather than squeezing. */
.dk-kit-bulk .dk-bulk { grid-template-columns: repeat(auto-fit, minmax(112px, 1fr)); }
.dk-kit-bulk .dk-bulk__price { font-size: 15px; }
.dk-kit-bulk__note { font-size: 10px; color: var(--fg3); margin-top: 10px; line-height: 1.7; }

/* ══════════════════════════════════════════════════════════════════════
   HOMEPAGE BUILDER BLOCKS
   The eleven types the dk homepage could not draw. Same tokens and rhythm
   as the rest of the design system, so a page assembled in admin looks like
   one page rather than eleven pasted ones.
   ═════════════════════════════════════════════════════════════════════ */
.dk-block          { padding: 72px 0; }
.dk-block--tight   { padding: 44px 0; }

/* ── Promo strip ── */
.dk-promo { padding: 40px 0; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); background: var(--bg2); }
.dk-promo__inner { display: flex; align-items: center; justify-content: space-between; gap: 28px; flex-wrap: wrap; }
.dk-promo__title { font-size: clamp(20px, 2.4vw, 28px); margin: 0 0 6px; color: var(--fg); }
.dk-promo__sub   { color: var(--fg2); margin: 0; max-width: 62ch; line-height: 1.7; }
.dk-promo__points { display: flex; gap: 18px; flex-wrap: wrap; list-style: none; padding: 0; margin: 12px 0 0;
  font-size: 11px; letter-spacing: .1em; text-transform: uppercase; color: var(--fg3); }

/* ── FAQ ── */
.dk-faq { border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
.dk-faq-item + .dk-faq-item { border-top: 1px solid var(--border); }
.dk-faq-btn { cursor: pointer; list-style: none; padding: 18px 22px; font-weight: 600; color: var(--fg); background: var(--bg2); }
.dk-faq-btn::-webkit-details-marker { display: none; }
.dk-faq-btn::after { content: '+'; float: right; color: var(--primary); font-weight: 400; }
.dk-faq-item[open] .dk-faq-btn::after { content: '−'; }
.dk-faq-a { padding: 0 22px 20px; color: var(--fg2); line-height: 1.8; background: var(--bg2); }

/* ── Testimonials ── */
.dk-quotes { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 16px; }
.dk-quote { margin: 0; padding: 24px; border: 1px solid var(--border); background: var(--bg2); border-radius: var(--radius); }
.dk-quote__stars { color: var(--primary); font-size: 13px; letter-spacing: .1em; margin-bottom: 12px; }
.dk-quote blockquote { margin: 0 0 16px; color: var(--fg); line-height: 1.75; }
.dk-quote figcaption { display: flex; flex-direction: column; gap: 2px; font-size: 11px; }
.dk-quote__who  { color: var(--fg); }
.dk-quote__meta { color: var(--fg3); }

/* ── Brands ── */
.dk-brands { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 1px;
  background: var(--border); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
.dk-brand { display: grid; place-items: center; min-height: 84px; padding: 18px; background: var(--bg2);
  text-decoration: none; color: var(--fg3); font-size: 11px; letter-spacing: .1em; text-transform: uppercase; }
.dk-brand img { max-width: 100%; max-height: 44px; object-fit: contain; }
a.dk-brand:hover { background: color-mix(in srgb, var(--primary) 6%, var(--bg2)); color: var(--primary); }

/* ── Banner ── */
.dk-banner { display: block; border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; line-height: 0; }
.dk-banner img { width: 100%; height: auto; display: block; }

/* ── Video ── */
.dk-video { position: relative; display: block; border: 1px solid var(--border); border-radius: var(--radius);
  overflow: hidden; min-height: 220px; background: var(--bg2); text-decoration: none; }
.dk-video img { width: 100%; height: 100%; object-fit: cover; display: block; opacity: .55; }
.dk-video__play { position: absolute; inset: 0; display: grid; place-items: center; font-size: 40px; color: var(--primary); }
.dk-video__copy { position: absolute; left: 0; right: 0; bottom: 0; padding: 20px 24px;
  display: flex; flex-direction: column; gap: 4px;
  background: linear-gradient(to top, color-mix(in srgb, var(--bg) 92%, transparent), transparent); }
.dk-video__title { color: var(--fg); font-weight: 600; font-size: 17px; }
.dk-video__sub   { color: var(--fg2); font-size: 13px; }

/* ── Live momentum ── */
.dk-momentum { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1px;
  background: var(--border); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
.dk-momentum__stat { background: var(--bg2); padding: 22px 18px; display: flex; flex-direction: column; gap: 4px; }
.dk-momentum__stat b { font-size: 26px; color: var(--primary); font-family: 'JetBrains Mono', ui-monospace, monospace; }
.dk-momentum__stat span { font-size: 10px; letter-spacing: .12em; text-transform: uppercase; color: var(--fg3); }

/* ── Audience cards ── */
.dk-aud { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 14px; }
.dk-aud__card { display: flex; flex-direction: column; gap: 8px; padding: 24px; text-decoration: none;
  border: 1px solid var(--border); background: var(--bg2); border-radius: var(--radius);
  transition: border-color .18s, transform .18s; }
.dk-aud__card:hover { border-color: var(--primary); transform: translateY(-2px); }
.dk-aud__eyebrow { font-size: 10px; letter-spacing: .14em; text-transform: uppercase; color: var(--primary); }
.dk-aud__title { font-size: 17px; font-weight: 600; color: var(--fg); line-height: 1.35; }
.dk-aud__desc  { font-size: 14px; color: var(--fg2); line-height: 1.65; }
.dk-aud__go    { font-size: 11px; color: var(--primary); margin-top: auto; padding-top: 10px; }

/* ── Build zones ── */
.dk-zones { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1px;
  background: var(--border); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
.dk-zone { position: relative; display: flex; flex-direction: column; gap: 6px; padding: 24px 20px;
  background: var(--bg2); text-decoration: none; transition: background .18s; }
.dk-zone:hover { background: color-mix(in srgb, var(--primary) 7%, var(--bg2)); }
.dk-zone__n { position: absolute; top: 14px; right: 16px; font-size: 10px; color: var(--border2); }
.dk-zone__title { font-size: 15px; font-weight: 600; color: var(--fg); }
.dk-zone__desc  { font-size: 13px; color: var(--fg2); line-height: 1.6; }

/* ── Workflow steps ── */
.dk-steps { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 14px; }
.dk-step { display: flex; flex-direction: column; gap: 8px; padding: 22px 20px;
  border: 1px solid var(--border); background: var(--bg2); border-radius: var(--radius); }
.dk-step__n { width: 26px; height: 26px; display: grid; place-items: center; border-radius: 50%;
  background: var(--primary); color: var(--primary-fg); font-size: 12px; font-weight: 700; }
.dk-step__t { font-weight: 600; color: var(--fg); }
.dk-step__d { font-size: 13.5px; color: var(--fg2); line-height: 1.65; }

@media (max-width: 640px) {
  .dk-block { padding: 48px 0; }
  .dk-promo__inner { flex-direction: column; align-items: flex-start; }
}

/* ── HOMEPAGE PRODUCT BLOCK: CATALOGUE LINK ─────────────────────────────
   This row used to hold a "Show N more" button beside the catalogue link.
   The button is gone (see blocks/products.php) and so are the .dk-pg-btn
   rules; the row now centres a single link. */
.dk-pg-actions {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 18px;
  flex-wrap: wrap;
  margin-top: 28px;
}

.dk-pg-all {
  font-size: .78rem;
  color: var(--fg3);
  text-decoration: none;
  border-bottom: 1px solid transparent;
  transition: color .15s, border-color .15s;
}

.dk-pg-all:hover {
  color: var(--fg);
  border-bottom-color: var(--border);
}

@media (max-width: 640px) {
  .dk-pg-actions { flex-direction: column; gap: 12px; }
}

/* ── PRODUCT DETAIL: HEADLINE SPECS, LEDE, CONTENTS, BOX PANEL ──────────
   The page already held good data — seven paragraphs, an "Included
   Components" section, published specs — and put nearly all of it behind a
   tab while the visible summary was cut off mid-word. These are the styles
   for surfacing it. */

.dk-pdp-hl {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 1px;
  background: var(--border);
  border: 1px solid var(--border);
  border-radius: 10px;
  overflow: hidden;
  margin: 18px 0 4px;
}

.dk-pdp-hl__item {
  background: var(--bg);
  padding: 12px 14px;
}

.dk-pdp-hl__k {
  font-family: var(--mono, ui-monospace, monospace);
  font-size: .66rem;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--fg3);
  margin-bottom: 5px;
}

.dk-pdp-hl__v {
  font-size: .92rem;
  font-weight: 600;
  color: var(--fg);
  line-height: 1.3;
}

.dk-pdp-readmore {
  display: inline-block;
  margin: -4px 0 14px;
  padding: 0;
  background: none;
  border: 0;
  border-bottom: 1px solid var(--border);
  color: var(--fg2);
  font-size: .76rem;
  letter-spacing: .04em;
  cursor: pointer;
  transition: color .15s, border-color .15s;
}

.dk-pdp-readmore:hover {
  color: var(--fg);
  border-bottom-color: var(--fg3);
}

/* Contents list at the top of the description tab */
.dk-pdp-toc {
  display: flex;
  align-items: center;
  gap: 14px;
  flex-wrap: wrap;
  padding: 0 0 18px;
  margin-bottom: 20px;
  border-bottom: 1px solid var(--border);
}

.dk-pdp-toc__label {
  font-size: .66rem;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--fg3);
}

.dk-pdp-toc a {
  font-size: .82rem;
  color: var(--fg2);
  text-decoration: none;
  border-bottom: 1px solid transparent;
}

.dk-pdp-toc a:hover {
  color: var(--fg);
  border-bottom-color: var(--border);
}

.dk-pdp-sec { margin-top: 28px; }

.dk-pdp-sec__h {
  font-size: 1rem;
  font-weight: 600;
  color: var(--fg);
  margin: 0 0 10px;
}

.dk-pdp-box { margin: 0 0 28px; }

@media (max-width: 520px) {
  .dk-pdp-hl { grid-template-columns: 1fr; }
}

/* ══════════════════════════════════════════════════════════════════════
   PRODUCT PAGE — READABLE BODY TEXT
   ──────────────────────────────────────────────────────────────────────
   The page was set almost entirely in JetBrains Mono at 9.5–12px. That is
   fine for a SKU and wrong for everything a customer actually reads: the
   VAT and shipping strip, the key-facts table, the description and the
   specs were all smaller than the browser's own minimum comfortable size.
   Headings are untouched — only the text under them grows.
   ═════════════════════════════════════════════════════════════════════ */

/* The VAT / free shipping / dispatch strip under the price. */
.dk-price-meta span { font-size: 12.5px; padding: 11px 16px; color: var(--fg2); }
.dk-price-meta b    { font-weight: 700; }

/* Key facts (SKU, category, brand, warranty, MOQ, barcode). */
.dk-kv__k { font-size: 10.5px; letter-spacing: .1em; }
.dk-kv__v { font-size: 13.5px; line-height: 1.5; }

/* The short description under the facts, and the long one in the tab. */
.dk-product-desc { font-size: 15.5px; line-height: 1.8; color: var(--fg2); }
.dk-rich         { font-size: 15.5px; line-height: 1.85; }
.dk-rich li      { margin-bottom: 9px; }

/* The specification rows. */
.dk-spec-label { font-size: 13px; color: var(--fg3); }
.dk-spec-value { font-size: 14px; color: var(--fg); line-height: 1.6; }

/* Tabs, tags, reviews and the small print around them. */
.dk-tabs__btn      { font-size: 13.5px; }
.dk-product-tag    { font-size: 11.5px; }
.dk-stock-badge    { font-size: 13px; }
.dk-review__text   { font-size: 15px; line-height: 1.75; }
.dk-inline-actions button { font-size: 12.5px; }

@media (max-width: 640px) {
  /* Phones get one more step: this is the page people read on a bus. */
  .dk-product-desc, .dk-rich { font-size: 16px; }
  .dk-price-meta span { font-size: 13px; }
  .dk-kv__v { font-size: 14px; }
}

/* ══════════════════════════════════════════════════════════════════════
   PRODUCT GALLERY — CLICK TO ZOOM
   ═════════════════════════════════════════════════════════════════════ */
.dk-gallery__main { cursor: zoom-in; }
.dk-gallery__zoom-hint {
  position: absolute; right: 14px; bottom: 14px; z-index: 2;
  display: flex; align-items: center; gap: 6px;
  padding: 7px 11px; border-radius: 999px;
  background: color-mix(in srgb, var(--bg) 82%, transparent);
  border: 1px solid var(--border);
  font-family: 'JetBrains Mono', monospace; font-size: 11px; color: var(--fg2);
  opacity: 0; transform: translateY(4px); transition: opacity .18s, transform .18s;
  pointer-events: none;
}
.dk-gallery__main:hover .dk-gallery__zoom-hint { opacity: 1; transform: none; }
@media (hover: none) { .dk-gallery__zoom-hint { opacity: .95; transform: none; } }

.dk-lightbox {
  position: fixed; inset: 0; z-index: 9000; display: flex;
  align-items: center; justify-content: center; flex-direction: column; gap: 14px;
  padding: 40px 24px; background: rgba(6, 10, 14, .94); cursor: zoom-out;
}
.dk-lightbox[hidden] { display: none; }
.dk-lightbox img {
  max-width: min(1400px, 94vw); max-height: 82vh; object-fit: contain;
  background: #fff; border-radius: 4px; cursor: default;
}
.dk-lightbox__cap { font-family: 'JetBrains Mono', monospace; font-size: 12px; color: #cfe0d8; margin: 0; text-align: center; }
.dk-lightbox__x, .dk-lightbox__nav {
  position: absolute; z-index: 2; width: 44px; height: 44px; display: grid; place-items: center;
  border-radius: 50%; border: 1px solid rgba(255,255,255,.25); background: rgba(0,0,0,.4);
  color: #fff; font-size: 20px; cursor: pointer;
}
.dk-lightbox__x    { top: 20px; right: 24px; }
.dk-lightbox__nav--prev { left: 24px;  top: 50%; transform: translateY(-50%); }
.dk-lightbox__nav--next { right: 24px; top: 50%; transform: translateY(-50%); }
.dk-lightbox__x:hover, .dk-lightbox__nav:hover { border-color: var(--primary); color: var(--primary); }
@media (max-width: 640px) {
  .dk-lightbox__nav--prev { left: 10px; }
  .dk-lightbox__nav--next { right: 10px; }
  .dk-lightbox__x { top: 12px; right: 12px; }
}

/* One more step for the description itself. Everything above is a label or a
   figure you glance at; this is the only part of the page that gets *read*,
   so it is sized for reading rather than for fitting. */
.dk-product-desc { font-size: 16.5px; line-height: 1.8; }
.dk-rich         { font-size: 17px; line-height: 1.9; max-width: 72ch; }
.dk-rich p       { margin: 0 0 16px; }
.dk-rich li      { margin-bottom: 10px; font-size: 17px; line-height: 1.8; }
.dk-rich h2, .dk-rich h3, .dk-rich h4 { font-size: 17.5px; }
.dk-panel__body.dk-rich { font-size: 16.5px; }

@media (max-width: 640px) {
  .dk-product-desc { font-size: 17px; }
  .dk-rich, .dk-rich li { font-size: 17.5px; line-height: 1.85; }
  .dk-rich { max-width: none; }
}

/* ── The VAT / shipping / dispatch strip ───────────────────────────────
   It was a flex row of three cells at `flex: 1 1 auto` with a divider on
   the right of each. Once the type grew, three no longer fitted across, so
   the last one wrapped onto its own full-width line — two cells and a
   divider on top, one orphan centred underneath.

   A grid fixes the cause rather than the symptom: equal tracks that reflow
   3 → 2 → 1 as the column narrows, and a 1px gap over a border-coloured
   ground, so the dividers are drawn by the layout itself and are always
   right however the cells wrap. */
.dk-price-meta {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
  gap: 1px;
  background: var(--border);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  overflow: hidden;
  margin: -8px 0 20px;
}
.dk-price-meta span {
  /* No per-cell borders at all now — the gap is the divider. */
  border: 0;
  background: var(--bg2);
  padding: 12px 14px;
  text-align: center;
  /* Was nowrap, which is what forced the wrap in the first place. */
  white-space: normal;
  display: flex; align-items: center; justify-content: center; gap: 5px;
}

@media (max-width: 640px) {
  /* One per row on a phone: three 190px tracks cannot fit, and a 2 + 1
     split reads as a mistake. */
  .dk-price-meta { grid-template-columns: 1fr; }
  .dk-price-meta span { justify-content: flex-start; text-align: left; padding: 11px 14px; }
}

/* ══════════════════════════════════════════════════════════════════════
   TITAN — dedicated homepage section
   The ai_tools card introduces it; this section shows what it does. Two
   columns: what you get back, and a picture of the interview.
   ═════════════════════════════════════════════════════════════════════ */
.dk-titan-feature { padding: 76px 0; border-top: 1px solid var(--border); }
.dk-titan-feature__grid {
  display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, .9fr);
  gap: 44px; align-items: center;
}
.dk-titan-feature__lede { color: var(--fg2); font-size: 16px; line-height: 1.8; max-width: 56ch; margin: 14px 0 26px; }

.dk-titan-feature__out { display: grid; gap: 1px; background: var(--border);
  border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
.dk-titan-out { background: var(--bg2); padding: 16px 18px; display: flex; flex-direction: column; gap: 3px; }
.dk-titan-out__t { font-weight: 600; color: var(--fg); font-size: 15px; }
.dk-titan-out__d { color: var(--fg2); font-size: 13.5px; line-height: 1.6; }

.dk-titan-feature__cta { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 26px; }

/* The sample conversation. */
.dk-titan-demo { border: 1px solid var(--border); border-radius: var(--radius);
  background: var(--bg2); overflow: hidden; }
.dk-titan-demo__bar { display: flex; align-items: center; gap: 9px;
  padding: 12px 16px; border-bottom: 1px solid var(--border); background: var(--bg);
  font-size: 11px; color: var(--fg2); }
.dk-titan-demo__dot { width: 7px; height: 7px; border-radius: 50%; background: var(--primary); }
.dk-titan-demo__live { margin-left: auto; color: var(--primary); font-size: 10px;
  letter-spacing: .12em; text-transform: uppercase; }
.dk-titan-demo__body { padding: 18px 16px; display: flex; flex-direction: column; gap: 9px; }
.dk-titan-msg { align-self: flex-start; max-width: 88%;
  padding: 10px 13px; border-radius: 12px 12px 12px 3px;
  background: var(--bg3, var(--bg)); color: var(--fg2); font-size: 13.5px; line-height: 1.55; }
.dk-titan-msg--you { align-self: flex-end; border-radius: 12px 12px 3px 12px;
  background: color-mix(in srgb, var(--primary) 14%, transparent); color: var(--fg); }
.dk-titan-demo__result { margin-top: 6px; padding: 11px 13px; border-radius: var(--radius);
  border: 1px dashed color-mix(in srgb, var(--primary) 45%, var(--border));
  color: var(--primary); font-size: 11.5px; line-height: 1.6; }

@media (max-width: 900px) {
  .dk-titan-feature__grid { grid-template-columns: 1fr; gap: 32px; }
}
@media (max-width: 640px) {
  .dk-titan-feature { padding: 52px 0; }
  .dk-titan-feature__cta .dk-btn { flex: 1 1 100%; text-align: center; }
}

/* ══════════════════════════════════════════════════════════════════════
   CUSTOM KIT PAGE — TIGHTEN THE RHYTHM
   ──────────────────────────────────────────────────────────────────────
   The page ran to several screens of mostly air. It was not one culprit
   but a stack of generous defaults, each reasonable alone: a 72/80px hero,
   three sections at 80px top and bottom (480px of padding before a single
   word), a 64px column gap, and 48px above the stat row. Scoped to this
   page only — the same classes elsewhere keep their spacing.
   ═════════════════════════════════════════════════════════════════════ */

/* Hero: it carries a badge, a headline, a lede and two cards. It does not
   need the full-height treatment the homepage hero gets. */
.dk-ck-hero .dk-hero__content { padding: 44px 0 0; }
.dk-ck-hero .dk-ck-pills   { margin-bottom: 22px; }
.dk-ck-hero .dk-ck-entries { gap: 10px; margin-bottom: 12px; }
.dk-ck-hero .dk-kit-stats  { margin-top: 28px; }

/* Sections: 80 → 52, and the last one loses its rule, which was drawing a
   line under the page above the footer. */
.dk-ck-section { padding: 52px 0; }
.dk-ck-section:last-of-type { border-bottom: 0; }

/* Headings sat 40px clear of the content they introduce. */
.dk-ck-section .dk-centered-head { margin-bottom: 26px; }
.dk-ck-lede { margin-top: 10px; }
.dk-ck-lede--left { margin: 12px 0 18px; }

/* The Titan split: 64px between two columns is a corridor, not a gap. */
.dk-ck-split { gap: 40px; }
.dk-ck-section .dk-titan-card { padding: 18px; margin-bottom: 18px; }

/* The four process steps and the builder's own blocks. */
.dk-ck-section .dk-steps__grid { gap: 12px; }
.dk-ck-section .dk-step { padding: 20px 18px; }

@media (max-width: 900px) {
  .dk-ck-split { gap: 28px; }
}
@media (max-width: 640px) {
  .dk-ck-hero .dk-hero__content { padding: 32px 0 0; }
  .dk-ck-section { padding: 40px 0; }
  .dk-ck-section .dk-centered-head { margin-bottom: 20px; }
}

/* ═══════════════════════════════════════════════════════════════════════
   CLASSIC BUILDER — LEGIBILITY PASS
   The /dk/custom-kit builder was authored at 10–14px throughout: step
   tabs at 12, field labels at 11, inputs at 14, summary-rail keys at 10.
   It is a form people fill in for several minutes, so it needs to read
   like a form, not like a spec sheet. Sizes lift, layout does not move.
   Appended as overrides — nothing above is edited.
   ═══════════════════════════════════════════════════════════════════════ */

/* ── Header + step tabs ── */
#progress-pct { font-size: 13px; }
.dk-step-tab { font-size: 14px; padding: 15px 22px; }
.dk-step-tab__num { width: 24px; height: 24px; font-size: 11.5px; }
.dk-step-chip__label { font-size: 12.5px; }

/* ── Step intro ── */
.dk-step-eyebrow { font-size: 12.5px; }
.dk-step-h { font-size: 26px; margin-bottom: 6px; }
.dk-step-sub { font-size: 16px; line-height: 1.6; color: var(--fg2); }

/* ── Fields ──
   The hint and sub lines moved off --fg3 as well; at this size they are
   instructions people actually need to read, not captions. */
.dk-label { font-size: 12.5px; margin-bottom: 9px; }
.dk-input, .dk-select, .dk-textarea { font-size: 16px; padding: 13px 15px; }
.dk-textarea { line-height: 1.65; }
.dk-hint { font-size: 13.5px; color: var(--fg2); line-height: 1.6; margin-top: 7px; }

/* ── Choice controls ── */
.dk-type-grid { grid-template-columns: repeat(auto-fill, minmax(168px, 1fr)); }
.dk-type-card { padding: 16px; }
.dk-type-card__icon { font-size: 22px; }
.dk-type-card__label { font-size: 14px; }

.dk-option { font-size: 14px; padding: 15px 17px; }
.dk-option__meta { font-size: 11.5px; }
.dk-option--radio strong { font-size: 15px; }
.dk-option--radio .dk-option__meta { font-size: 13px; }

.dk-extra { font-size: 13px; padding: 10px 14px; }

/* ── Custom items (step 3) ── */
.dk-addpart__title { font-size: 12.5px; }
.dk-parts-empty .mono { font-size: 13.5px; }
.dk-part-line__name { font-size: 15.5px; }
.dk-part-line__meta { font-size: 12.5px; color: var(--fg2); }
.dk-part-line__rm { font-size: 11.5px; }

.dk-titan-quick__label { font-size: 12px; }
.dk-titan-quick__grid .dk-filter-tag { font-size: 13px; }

/* ── Success panel ── */
.dk-ck-success__title { font-size: 30px; }
.dk-ck-success__sub { font-size: 16px; color: var(--fg2); max-width: 470px; }

/* ── Live summary rail ──
   The rail was 280px with 10px keys. At the new sizes a key and its value
   collide on one flex row, so the track widens a little to match. The
   value colour was var(--border), which renders the unset placeholder
   invisible rather than merely muted — --fg3 keeps it quiet but present. */
@media (min-width: 1025px) {
  /* Guarded above the existing 1024px stack breakpoint — this block sits
     later in the file, so an unguarded rule here would re-apply the two
     column grid on tablets and undo that stack. */
  .dk-builder-grid { grid-template-columns: minmax(0, 1fr) 310px; }
}
.dk-ck-summary__eyebrow { font-size: 12px; }
.dk-ck-summary__note { font-size: 12.5px; }
.dk-ck-sr { margin-bottom: 12px; }
.dk-ck-sr__key { font-size: 12px; }
.dk-ck-sr .sr-val { font-size: 13.5px; color: var(--fg3); }
.dk-ck-summary__ask { font-size: 13px; color: var(--fg2); }
.dk-dial #dial-pct { font-size: 12px; }

/* ── Page lede + hero links ── */
.dk-ck-lede { font-size: 16.5px; line-height: 1.7; color: var(--fg2); max-width: 600px; }
.dk-ck-browse { font-size: 13px; color: var(--fg2); }

/* ── Narrow screens ──
   Below the grid breakpoint the rail stacks; the form gets one more step
   so it stays comfortable on a phone. 16px on inputs already prevents the
   iOS focus zoom, so those stay put. */
@media (max-width: 640px) {
  .dk-step-h { font-size: 23px; }
  .dk-step-sub { font-size: 15.5px; }
  .dk-step-tab { font-size: 13px; padding: 13px 15px; }
  .dk-option { font-size: 14.5px; }
  .dk-hint { font-size: 14px; }
  .dk-ck-success__title { font-size: 25px; }
}

/* The builder's own buttons (Next / Back / Submit / Add part) still sat at
   the global .dk-btn 11px, which left them the smallest text on a page
   where everything else had just grown. Scoped to the builder so the rest
   of the site's button rhythm is untouched. */
#builder .dk-btn,
.dk-builder-nav .dk-btn,
.dk-addpart .dk-btn,
.dk-ck-success__actions .dk-btn { font-size: 13px; padding: 12px 22px; letter-spacing: .08em; }

/* ═══════════════════════════════════════════════════════════════════════
   AUTH — sign in / create account / reset password
   The /dk sign-in was a bare card in a one-column grid and there was no
   /dk sign-up at all: "create an account" jumped to the old storefront's
   design mid-flow. These three pages now share one layout — form on the
   left, a panel that says what the account is for on the right.
   ═══════════════════════════════════════════════════════════════════════ */

.dk-auth { padding: 40px 0 84px; }
.dk-auth-shell {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 28px;
  align-items: start;
  max-width: 1060px;
  margin: 0 auto;
}
@media (min-width: 950px) {
  .dk-auth-shell { grid-template-columns: minmax(0, 1fr) 330px; gap: 40px; }
  .dk-auth-shell--narrow { grid-template-columns: minmax(0, 1fr); max-width: 560px; }
}
.dk-auth-main { min-width: 0; }
.dk-auth-side { min-width: 0; display: grid; gap: 16px; }

/* ── Sign in / Create account switch ── */
.dk-auth-switch {
  display: flex;
  gap: 4px;
  margin-bottom: -1px;
  position: relative;
  z-index: 1;
}
.dk-auth-switch__tab {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 12.5px; font-weight: 600;
  letter-spacing: .06em;
  padding: 12px 20px;
  border: 1px solid var(--border);
  border-bottom-color: transparent;
  background: var(--bg);
  color: var(--fg2);
  border-radius: var(--radius) var(--radius) 0 0;
  text-decoration: none;
  transition: color .2s, background .2s;
}
.dk-auth-switch__tab:hover { color: var(--fg); }
.dk-auth-switch__tab.is-on {
  background: var(--bg2);
  color: var(--primary);
  box-shadow: inset 0 2px 0 var(--primary);
}

/* ── Card ── */
.dk-auth-card {
  border: 1px solid var(--border);
  background: var(--bg2);
  border-radius: 0 var(--radius) var(--radius) var(--radius);
  padding: 30px 32px 28px;
  min-width: 0;
}
.dk-auth-shell--narrow .dk-auth-card { border-radius: var(--radius); }
.dk-auth-card__head { margin-bottom: 22px; }
.dk-auth-card__title {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 27px; font-weight: 700; color: var(--fg);
  margin: 6px 0 8px; line-height: 1.2;
}
.dk-auth-card__sub { font-size: 15px; line-height: 1.65; color: var(--fg2); max-width: 46ch; }

.dk-auth-card .dk-note { margin-bottom: 18px; }

/* ── Google ── */
.dk-auth-google {
  display: flex; align-items: center; justify-content: center; gap: 10px;
  width: 100%; padding: 13px 18px;
  border: 1px solid var(--border); border-radius: var(--radius);
  background: var(--bg);
  color: var(--fg);
  font-size: 14.5px; font-weight: 600;
  text-decoration: none;
  transition: border-color .2s, background .2s;
}
.dk-auth-google:hover { border-color: var(--fg3); background: var(--bg3, var(--bg2)); }
.dk-auth-google svg { flex: none; }

.dk-auth-or {
  display: flex; align-items: center; gap: 14px;
  margin: 20px 0;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11.5px; letter-spacing: .1em; text-transform: uppercase;
  color: var(--fg3);
}
.dk-auth-or::before, .dk-auth-or::after {
  content: ''; flex: 1; height: 1px; background: var(--border);
}

/* ── Fields ── */
.dk-auth-form .dk-form__group { margin-bottom: 18px; }
.dk-auth-form .dk-form__label { font-size: 12.5px; }
.dk-auth-form .dk-form__input { font-size: 16px; padding: 13px 15px; }
.dk-form__labelrow { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.dk-auth-forgot { font-size: 12.5px; color: var(--fg2); }
.dk-auth-forgot:hover { color: var(--primary); }
.dk-req { color: var(--primary); }
.dk-auth-textarea { line-height: 1.6; resize: vertical; min-height: 84px; }

/* Password reveal. The button sits inside the field's box, so the input
   gets right padding wide enough for the longest label ("Hide"/"Show"). */
.dk-auth-pw { position: relative; }
.dk-auth-pw .dk-form__input { padding-right: 74px; }
.dk-auth-pw__eye {
  position: absolute; top: 50%; right: 8px; transform: translateY(-50%);
  background: none; border: 0; cursor: pointer;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11.5px; letter-spacing: .06em; text-transform: uppercase;
  color: var(--fg2); padding: 8px 10px; border-radius: var(--radius);
}
.dk-auth-pw__eye:hover { color: var(--primary); }

/* Strength hint — advice, not a gate; the server minimum is 6 characters. */
.dk-pw-meter { display: flex; align-items: center; gap: 10px; margin-top: 9px; }
.dk-pw-meter__rail { flex: 1; height: 4px; background: var(--border); border-radius: 2px; overflow: hidden; }
.dk-pw-meter__fill { height: 100%; width: 0; background: var(--fg3); transition: width .2s, background .2s; }
.dk-pw-meter__label { font-size: 11.5px; color: var(--fg2); min-width: 68px; text-align: right; }
.dk-pw-meter[data-level="0"] .dk-pw-meter__fill,
.dk-pw-meter[data-level="1"] .dk-pw-meter__fill { background: #e5484d; }
.dk-pw-meter[data-level="2"] .dk-pw-meter__fill { background: #f0a020; }
.dk-pw-meter[data-level="3"] .dk-pw-meter__fill,
.dk-pw-meter[data-level="4"] .dk-pw-meter__fill { background: var(--primary); }

/* Optional fields fold — phone and address are not required to register,
   so they start collapsed rather than making the form look twice as long. */
.dk-auth-more { border-top: 1px solid var(--border); margin: 4px 0 20px; }
.dk-auth-more > summary {
  cursor: pointer; list-style: none;
  padding: 14px 0;
  font-size: 12.5px; letter-spacing: .05em; color: var(--fg2);
  display: flex; align-items: center; gap: 10px;
}
.dk-auth-more > summary::-webkit-details-marker { display: none; }
.dk-auth-more > summary::before {
  content: '+'; font-size: 15px; line-height: 1; color: var(--primary);
}
.dk-auth-more[open] > summary::before { content: '−'; }
.dk-auth-more__note {
  margin-left: auto;
  font-size: 11px; text-transform: uppercase; letter-spacing: .1em; color: var(--fg3);
}
.dk-auth-more__body { padding-bottom: 4px; }

.dk-auth-cta { width: 100%; justify-content: center; display: flex; margin-top: 4px; font-size: 13.5px; padding: 14px 24px; }
.dk-auth-fine { font-size: 12.5px; line-height: 1.6; color: var(--fg3); margin-top: 14px; text-align: center; }
.dk-auth-fine a, .dk-auth-alt a, .dk-auth-guest a { color: var(--primary); }
.dk-auth-alt {
  margin-top: 22px; padding-top: 18px; border-top: 1px solid var(--border);
  font-size: 14px; color: var(--fg2); text-align: center;
}
.dk-auth-guest { margin-top: 18px; font-size: 13.5px; color: var(--fg3); text-align: center; }

/* Honeypot: off-screen rather than display:none, so a bot that reads
   computed styles to skip hidden inputs still fills it in. */
.dk-auth-hp {
  position: absolute; left: -10000px; top: auto;
  width: 1px; height: 1px; overflow: hidden;
}
.dk-auth-turnstile { margin: 4px 0 18px; }

/* ── Side panels ── */
.dk-auth-panel, .dk-auth-help {
  border: 1px solid var(--border); background: var(--bg2);
  border-radius: var(--radius); padding: 20px;
}
.dk-auth-panel__head, .dk-auth-help__head {
  font-size: 11.5px; text-transform: uppercase; letter-spacing: .1em;
  color: var(--primary); margin-bottom: 16px;
}
.dk-auth-benefit { display: flex; gap: 12px; padding: 12px 0; border-top: 1px solid var(--border2, var(--border)); }
.dk-auth-benefit:first-of-type { border-top: 0; padding-top: 0; }
.dk-auth-benefit__icon {
  flex: none; width: 26px; height: 26px;
  display: flex; align-items: center; justify-content: center;
  color: var(--primary); font-size: 14px;
  border: 1px solid color-mix(in srgb, var(--primary) 35%, transparent);
  border-radius: var(--radius);
}
.dk-auth-benefit__icon--num { font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 12px; font-weight: 700; }
.dk-auth-benefit__title { font-size: 14px; font-weight: 600; color: var(--fg); margin-bottom: 3px; }
.dk-auth-benefit__text { font-size: 13px; line-height: 1.6; color: var(--fg2); }
.dk-auth-help p { font-size: 13px; line-height: 1.65; color: var(--fg2); }
.dk-auth-help__link { display: inline-block; margin-top: 12px; font-size: 13px; color: var(--primary); }

@media (max-width: 640px) {
  .dk-auth { padding: 24px 0 56px; }
  .dk-auth-card { padding: 24px 20px 22px; }
  .dk-auth-card__title { font-size: 23px; }
  .dk-auth-switch__tab { flex: 1; text-align: center; padding: 12px 10px; }
}

/* Footer spec strip is three items now (the "Stock — held locally in Ajman"
   claim was removed), so the desktop track count follows. Left at 4 it drew
   an empty fourth column with a stray divider. */
.dk-footer__spec { grid-template-columns: repeat(3, 1fr); }
@media (max-width: 700px) {
  .dk-footer__spec { grid-template-columns: 1fr; }
  .dk-footer__spec-item { border-right: 0; border-bottom: 1px solid var(--border); padding-left: 0; }
  .dk-footer__spec-item:last-child { border-bottom: 0; }
  .dk-footer__spec-item + .dk-footer__spec-item { padding-left: 0; }
}

/* ═══════════════════════════════════════════════════════════════════════
   WELCOME OFFER MODAL
   First-visit newsletter capture in exchange for a discount code. Shown
   once per browser; see welcome-offer.js for the trigger rules.
   ═══════════════════════════════════════════════════════════════════════ */
.dk-offer {
  position: fixed; inset: 0; z-index: 1200;
  display: flex; align-items: center; justify-content: center;
  padding: 20px;
}
.dk-offer[hidden] { display: none; }
.dk-offer__scrim {
  position: absolute; inset: 0;
  background: color-mix(in srgb, #05090c 72%, transparent);
  opacity: 0; transition: opacity .22s ease;
}
.dk-offer.is-on .dk-offer__scrim { opacity: 1; }

.dk-offer__panel {
  position: relative;
  display: grid; grid-template-columns: 190px minmax(0, 1fr);
  width: 100%; max-width: 660px;
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  box-shadow: 0 24px 70px rgba(0, 0, 0, .38);
  overflow: hidden;
  transform: translateY(14px) scale(.985);
  opacity: 0;
  transition: transform .24s ease, opacity .24s ease;
}
.dk-offer.is-on .dk-offer__panel { transform: none; opacity: 1; }

.dk-offer__x {
  position: absolute; top: 8px; right: 10px; z-index: 2;
  background: none; border: 0; cursor: pointer;
  font-size: 26px; line-height: 1; color: var(--fg3);
  padding: 6px 10px; border-radius: var(--radius);
}
.dk-offer__x:hover { color: var(--fg); }

/* Left panel: the number, large, on the brand green. */
.dk-offer__art {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 8px; padding: 28px 16px;
  background: var(--primary); color: var(--primary-fg);
}
.dk-offer__pct {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 58px; font-weight: 700; line-height: 1; letter-spacing: -.02em;
}
.dk-offer__pct small { font-size: 26px; margin-left: 2px; }
.dk-offer__artlabel { font-size: 11.5px; letter-spacing: .12em; text-transform: uppercase; opacity: .85; }

.dk-offer__body { padding: 30px 30px 26px; min-width: 0; }
.dk-offer__eyebrow {
  font-size: 11.5px; letter-spacing: .12em; text-transform: uppercase;
  color: var(--primary); margin-bottom: 8px;
}
.dk-offer__title {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 24px; font-weight: 700; color: var(--fg);
  line-height: 1.25; margin-bottom: 10px;
}
.dk-offer__sub { font-size: 14.5px; line-height: 1.65; color: var(--fg2); margin-bottom: 20px; }

.dk-offer__row { display: flex; gap: 8px; }
.dk-offer__row .dk-form__input { flex: 1; min-width: 0; font-size: 16px; padding: 13px 14px; }
.dk-offer__row .dk-btn { flex: none; font-size: 13px; padding: 13px 20px; }
.dk-offer__err { font-size: 13px; color: #e5484d; margin-top: 10px; }

.dk-offer__no {
  display: block; width: 100%; margin-top: 16px;
  background: none; border: 0; cursor: pointer;
  font-size: 12.5px; color: var(--fg3); text-align: center;
  padding: 6px;
}
.dk-offer__no:hover { color: var(--fg2); text-decoration: underline; }

/* Revealed code */
.dk-offer__code {
  display: flex; align-items: center; gap: 10px;
  border: 1px dashed color-mix(in srgb, var(--primary) 55%, transparent);
  background: color-mix(in srgb, var(--primary) 8%, transparent);
  border-radius: var(--radius);
  padding: 14px 16px; margin-bottom: 16px;
}
.dk-offer__codeval {
  flex: 1; min-width: 0;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 21px; font-weight: 700; letter-spacing: .08em;
  color: var(--primary);
}
.dk-offer__copy {
  flex: none; cursor: pointer;
  border: 1px solid var(--border); background: var(--bg2); color: var(--fg2);
  border-radius: var(--radius); padding: 9px 14px;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11.5px; letter-spacing: .08em; text-transform: uppercase;
}
.dk-offer__copy:hover { color: var(--primary); border-color: var(--primary); }
.dk-offer__shop { width: 100%; justify-content: center; display: flex; font-size: 13px; padding: 13px 20px; }

.dk-offer__hp { position: absolute; left: -10000px; width: 1px; height: 1px; overflow: hidden; }

@media (max-width: 560px) {
  .dk-offer { padding: 12px; align-items: flex-end; }
  .dk-offer__panel { grid-template-columns: 1fr; max-width: 100%; }
  .dk-offer__art { flex-direction: row; gap: 12px; padding: 18px; }
  .dk-offer__pct { font-size: 40px; }
  .dk-offer__body { padding: 22px 20px 20px; }
  .dk-offer__title { font-size: 21px; }
  .dk-offer__row { flex-direction: column; }
  .dk-offer__row .dk-btn { width: 100%; justify-content: center; }
}

/* Anyone who has asked for less motion gets the panel without the slide. */
@media (prefers-reduced-motion: reduce) {
  .dk-offer__panel, .dk-offer__scrim { transition: none; }
  .dk-offer__panel { transform: none; }
}

/* ═══════════════════════════════════════════════════════════════════════
   HERO — TITAN entry point
   A second, different door out of the hero: the buttons above it answer
   "show me what you have", this answers "I don't know what to buy".
   Typing here carries the sentence into /dk/titan as ?q= and becomes the
   first answer of the interview.
   ═══════════════════════════════════════════════════════════════════════ */
.dk-hero-titan {
  margin-top: 26px;
  max-width: 620px;
  border: 1px solid color-mix(in srgb, var(--primary) 32%, var(--border));
  background: color-mix(in srgb, var(--bg2) 88%, transparent);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  border-radius: var(--radius);
  padding: 16px 18px;
}
.dk-hero-titan__head { display: flex; align-items: flex-start; gap: 12px; margin-bottom: 14px; }
.dk-hero-titan__avatar {
  flex: none; width: 34px; height: 34px;
  display: flex; align-items: center; justify-content: center;
  background: var(--primary); color: var(--primary-fg);
  border-radius: 9px;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 15px; font-weight: 700;
}
.dk-hero-titan__name {
  font-size: 13px; font-weight: 700; letter-spacing: .1em;
  color: var(--fg); margin-bottom: 3px;
}
.dk-hero-titan__tag {
  font-weight: 500; letter-spacing: .06em; text-transform: uppercase;
  font-size: 10.5px; color: var(--primary); margin-left: 6px;
}
.dk-hero-titan__line { font-size: 13.5px; line-height: 1.5; color: var(--fg2); }

.dk-hero-titan__form { display: flex; gap: 8px; }
.dk-hero-titan__input {
  flex: 1; min-width: 0;
  padding: 12px 14px;
  border: 1px solid var(--border);
  background: var(--bg);
  color: var(--fg);
  border-radius: var(--radius);
  font-family: inherit; font-size: 15px;
  transition: border-color .2s;
}
.dk-hero-titan__input::placeholder { color: var(--fg3); }
.dk-hero-titan__input:focus { outline: none; border-color: var(--primary); }
.dk-hero-titan__go { flex: none; font-size: 12.5px; padding: 12px 18px; }

@media (max-width: 620px) {
  .dk-hero-titan { padding: 14px; margin-top: 20px; }
  .dk-hero-titan__form { flex-direction: column; }
  .dk-hero-titan__go { width: 100%; justify-content: center; }
  .dk-hero-titan__input { font-size: 16px; }
}

/* ═══════════════════════════════════════════════════════════════════════
   NAVBAR — Categories dropdown
   "Microcontrollers" and "Sensors" used to be their own top-level items,
   which meant two categories lived outside the Categories menu while the
   rest lived inside it. They are in here now, from the catalogue.
   ═══════════════════════════════════════════════════════════════════════ */
.dk-nav__has-menu { position: relative; }
.dk-nav__cat-trigger { display: inline-flex; align-items: center; gap: 5px; }
.dk-nav__caret { transition: transform .2s ease; opacity: .75; }
.dk-nav__has-menu:hover .dk-nav__caret,
.dk-nav__has-menu:focus-within .dk-nav__caret { transform: rotate(180deg); }

.dk-nav__menu {
  position: absolute;
  top: calc(100% + 14px);
  left: 50%;
  transform: translateX(-50%) translateY(-6px);
  width: min(520px, 78vw);
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  box-shadow: 0 18px 44px rgba(0, 0, 0, .22);
  padding: 10px;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity .16s ease, transform .16s ease, visibility .16s;
  z-index: 120;
}
/* A gap between the trigger and the panel would close the menu as the
   pointer crossed it; this bridges it without being visible. */
.dk-nav__menu::before {
  content: '';
  position: absolute;
  left: 0; right: 0; top: -16px; height: 16px;
}
.dk-nav__has-menu:hover .dk-nav__menu,
.dk-nav__has-menu:focus-within .dk-nav__menu {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  transform: translateX(-50%) translateY(0);
}

.dk-nav__menu-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 2px; }
.dk-nav__menu-grid a {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 10px 12px;
  border-radius: var(--radius);
  color: var(--fg2);
  text-decoration: none;
  transition: background .15s, color .15s;
}
.dk-nav__menu-grid a:hover,
.dk-nav__menu-grid a:focus-visible {
  background: color-mix(in srgb, var(--primary) 9%, transparent);
  color: var(--fg);
}
.dk-nav__menu-name { font-size: 13.5px; font-weight: 500; line-height: 1.4; }
.dk-nav__menu-count { font-size: 11.5px; color: var(--fg3); flex: none; }
.dk-nav__menu-all {
  display: block;
  margin-top: 8px; padding: 11px 12px;
  border-top: 1px solid var(--border);
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 12px; letter-spacing: .06em; text-transform: uppercase;
  color: var(--primary); text-decoration: none;
}
.dk-nav__menu-all:hover { text-decoration: underline; }

/* Drawer version */
.dk-mobile-cats > summary {
  list-style: none; cursor: pointer;
  display: flex; align-items: center; gap: 8px;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 13px; font-weight: 600; letter-spacing: .08em;
  text-transform: uppercase; color: var(--fg);
  padding: 14px 24px;
  border-bottom: 1px solid var(--border);
}
.dk-mobile-cats > summary::-webkit-details-marker { display: none; }
.dk-mobile-cats > summary::after { content: '+'; margin-left: auto; color: var(--primary); font-size: 16px; }
.dk-mobile-cats[open] > summary::after { content: '−'; }
.dk-mobile-cats a {
  padding-left: 40px;
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  text-transform: none; letter-spacing: 0; font-weight: 500;
}
.dk-mobile-cats__n { font-size: 11.5px; color: var(--fg3); }

/* ── Category cards read as navigation, so the name carries the weight ── */
.dk-cat-card__name { font-size: 15.5px; }
.dk-cat-card__count { font-size: 12.5px; color: var(--fg2); }
@media (max-width: 640px) {
  .dk-cat-card__name { font-size: 15px; }
}

/* ═══════════════════════════════════════════════════════════════════════
   SITE-WIDE READABILITY PASS 2
   A sweep of the rendered pages turned up 57 classes still computing under
   13px — badges at 9, buttons and SKUs at 11, form labels and contact
   values at 12. Grouped by what the text IS, because the right size for a
   numeric pip is not the right size for a paragraph:

     · uppercase mono eyebrows/labels → 12–12.5px (they read large for their
       size; pushing them further breaks the technical look)
     · buttons and controls          → 12.5–13px
     · names, values, body copy      → 14–15.5px
     · numeric pips and badges       → 11px

   Everything here is an override; nothing above is edited.
   ═══════════════════════════════════════════════════════════════════════ */

/* ── Buttons and controls ── */
.dk-btn { font-size: 13px; padding: 11px 20px; letter-spacing: .08em; }
.dk-add-btn { font-size: 12.5px; }
.dk-kit-card__cta { font-size: 12.5px; }
.dk-form__submit { font-size: 13px; }
.dk-chip { font-size: 13px; }
.dk-filter-tag { font-size: 12.5px; }
.dk-pager__link, .dk-pager__count { font-size: 13px; }
.dk-cart-item__remove { font-size: 12px; }

/* ── Numeric pips ── */
.dk-badge { font-size: 11px; }
.dk-kit-card__badge, .dk-path-card__badge { font-size: 10.5px; }

/* ── Uppercase mono labels ── */
.dk-section-label { font-size: 12.5px; }
.dk-micro-label, .dk-micro-note { font-size: 12px; }
.dk-live-badge, .dk-status, .dk-footer__status { font-size: 12px; }
.dk-kit-stat__label, .dk-stat__label { font-size: 12px; }
.dk-featured-kit__cat, .dk-kit-pill, .dk-part-chip { font-size: 12px; }
.dk-footer__spec-key, .dk-footer__col-idx { font-size: 11.5px; }
.dk-form__title, .dk-form__label { font-size: 13px; }
.dk-contact-item__label { font-size: 12.5px; }
.dk-team-card__role { font-size: 12.5px; }
.dk-summary__note, .dk-range-labels { font-size: 12.5px; }
.dk-sidebar__title { font-size: 12.5px; }

/* ── Names, values and running text ──
   These are the lines people actually read, and several of them were the
   same size as the labels above them. */
.dk-cart-item__name { font-size: 15px; }
.dk-cart-item__sku, .dk-product-card__sku { font-size: 12.5px; }
.dk-contact-item__value { font-size: 14.5px; }
.dk-faq-q { font-size: 15px; }
.dk-form__select { font-size: 15px; }
.dk-sidebar__item { font-size: 13.5px; }
.dk-shop-count { font-size: 13.5px; }
.dk-trust__label { font-size: 13px; }
.dk-trust__detail { font-size: 12.5px; }
.dk-brand, .dk-brand-name { font-size: 13px; }
.dk-brand-sub { font-size: 13px; }
.dk-summary__fine { font-size: 12.5px; line-height: 1.6; }
.dk-kit-card__oos, .dk-kit-grid__empty { font-size: 13px; }
.dk-footer__copy, .dk-footer__stamp { font-size: 12.5px; }
.dk-footer__col-title { font-size: 12.5px; }
.dk-footer__email { font-size: 13.5px; }
.dk-welcome-kicker, .dk-welcome-assistants-label { font-size: 12px; }
.dk-welcome-bot-cta { font-size: 13px; }

/* Phones get one more step where the text is dense rather than decorative. */
@media (max-width: 640px) {
  .dk-cart-item__name { font-size: 15.5px; }
  .dk-faq-q { font-size: 15.5px; }
  .dk-sidebar__item { font-size: 14px; }
  .dk-contact-item__value { font-size: 15px; }
  .dk-btn { font-size: 13.5px; }
}

/* ═══════════════════════════════════════════════════════════════════════
   SHOP FILTERS
   Bigger, and with real facets. Brand and tags are checkboxes in the form
   now rather than chips that only re-sorted the rendered page.
   ═══════════════════════════════════════════════════════════════════════ */
.dk-sidebar__section { margin-bottom: 26px; }
.dk-sidebar__title {
  font-size: 13px; font-weight: 700; letter-spacing: .09em;
  display: flex; align-items: center; gap: 8px;
  margin-bottom: 12px;
}
.dk-sidebar__n {
  margin-left: auto;
  font-size: 11px; color: var(--primary-fg); background: var(--primary);
  border-radius: 20px; padding: 2px 8px; font-weight: 700;
}
.dk-sidebar__item {
  font-size: 14px;
  padding: 10px 12px;
  min-height: 40px;
  line-height: 1.4;
}
.dk-facet-n { font-size: 11.5px; color: var(--fg3); flex: none; }
.dk-sidebar__item.active .dk-facet-n { color: inherit; }

/* Long facet lists scroll instead of pushing the grid down the page. */
.dk-facet-list { max-height: 264px; overflow-y: auto; margin: -2px -4px; padding: 2px 4px; }
.dk-facet-list--tall { max-height: 320px; }
.dk-facet-list::-webkit-scrollbar { width: 8px; }
.dk-facet-list::-webkit-scrollbar-thumb { background: var(--border); border-radius: 4px; }
.dk-facet-list::-webkit-scrollbar-track { background: transparent; }

.dk-sidebar__applied { padding-bottom: 18px; border-bottom: 1px solid var(--border); }
.dk-filter-clear {
  display: inline-block;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 12px; letter-spacing: .06em;
  color: var(--primary); text-decoration: none;
}
.dk-filter-clear:hover { text-decoration: underline; }

/* Min/max boxes above the slider — the slider alone could not express a
   floor, so anything with a minimum price was unfilterable. */
.dk-price-pair { display: flex; align-items: flex-end; gap: 8px; margin-bottom: 14px; }
.dk-price-pair__f { flex: 1; min-width: 0; display: block; }
.dk-price-pair__f > span {
  display: block; margin-bottom: 5px;
  font-size: 11px; letter-spacing: .1em; text-transform: uppercase; color: var(--fg3);
}
.dk-price-pair__f input {
  width: 100%; box-sizing: border-box;
  padding: 9px 10px;
  border: 1px solid var(--border); background: var(--bg); color: var(--fg);
  border-radius: var(--radius);
  font-family: inherit; font-size: 14px;
}
.dk-price-pair__f input:focus { outline: none; border-color: var(--primary); }
.dk-price-pair__dash { padding-bottom: 10px; color: var(--fg3); }
.dk-range-labels { font-size: 12.5px; }

@media (max-width: 640px) {
  .dk-sidebar__item { font-size: 14.5px; min-height: 44px; }
  .dk-price-pair__f input { font-size: 16px; }
  .dk-facet-list, .dk-facet-list--tall { max-height: 220px; }
}

/* An earlier pass pinned these with doubled selectors, so the sweep above
   could not reach them. Same specificity, one step up. */
.dk-footer__col-title.dk-footer__col-title { font-size: 12.5px; }
.dk-footer__email.dk-footer__email { font-size: 13.5px; }

/* ── Categories dropdown: keep the columns inside the panel ──
   `1fr` is `minmax(auto, 1fr)`, so the longest category name
   ("Arduino and Raspberry Accessories & Modules") set a min-content floor
   the track could not go below. The two tracks measured 452px + 321px
   inside a 520px panel, so the second column rendered 265px past the
   panel's own background — the right-hand list had nothing behind it.
   minmax(0, 1fr) lets the tracks shrink; wrapping lets the names fit. */
.dk-nav__menu { width: min(640px, 92vw); }
.dk-nav__menu-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.dk-nav__menu-grid a { min-width: 0; align-items: flex-start; }
.dk-nav__menu-name {
  min-width: 0;
  white-space: normal;
  overflow-wrap: anywhere;
  line-height: 1.35;
}
.dk-nav__menu-count { align-self: center; }

@media (max-width: 900px) {
  .dk-nav__menu-grid { grid-template-columns: minmax(0, 1fr); }
}

/* The desktop nav appears at 901px, where a 640px panel centred on its
   trigger would hang off the left edge of the window (the trigger is second
   from the left, so half the panel lands at a negative x). Below 1200px the
   panel anchors to the trigger's left edge instead of centring on it. */
@media (max-width: 1200px) {
  .dk-nav__menu {
    left: 0;
    transform: translateX(0) translateY(-6px);
    width: min(560px, calc(100vw - 48px));
  }
  .dk-nav__has-menu:hover .dk-nav__menu,
  .dk-nav__has-menu:focus-within .dk-nav__menu {
    transform: translateX(0) translateY(0);
  }
}

/* ═══════════════════════════════════════════════════════════════════════
   PAGINATION — one design, not two
   Two rule sets were fighting over .dk-pager. An older one styled the nav
   itself as a hairline button group (background: var(--border), gap 1px,
   width: fit-content) and a newer one relaid it as a column with a count
   and a separate links row. The newer layout won, but the older one's
   background, border, radius and fit-content width were never overridden —
   so the pager rendered as a grey slab the colour of --border, shrink-
   wrapped to 390px in the middle of a 980px column.

   The nav is a plain full-width bar now; the hairline-group treatment moves
   onto .dk-pager__links, which is what it was always meant to describe.
   ═══════════════════════════════════════════════════════════════════════ */
.dk-pager {
  background: none;
  border: 0;
  border-top: 1px solid var(--border);
  border-radius: 0;
  overflow: visible;
  width: auto;
  margin: 0;
  padding: 22px 0 72px;
  gap: 16px;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}
@media (min-width: 720px) {
  .dk-pager { flex-direction: row; justify-content: space-between; }
}

.dk-pager__count {
  font-size: 13px;
  color: var(--fg2);
  letter-spacing: .04em;
}

/* The group: one rounded outline, hairline dividers between cells. */
.dk-pager__links {
  display: inline-flex;
  gap: 0;
  flex-wrap: nowrap;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg2);
  overflow: hidden;
  box-shadow: 0 1px 2px var(--shadow, rgba(0,0,0,.05));
}

.dk-pager__link,
.dk-pager__gap {
  min-width: 44px;
  height: 44px;
  padding: 0 14px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 0;
  border-left: 1px solid var(--border);
  border-radius: 0;
  background: var(--bg2);
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 13px;
  font-weight: 600;
  color: var(--fg2);
  text-decoration: none;
  transition: background .16s, color .16s;
}
.dk-pager__links > :first-child { border-left: 0; }

.dk-pager__link:hover {
  background: color-mix(in srgb, var(--primary) 9%, var(--bg2));
  color: var(--fg);
  border-color: var(--border);
}
.dk-pager__link:focus-visible {
  outline: 2px solid var(--primary);
  outline-offset: -2px;
}

/* Current page: the one filled cell, and it should not look clickable. */
.dk-pager__link.is-on,
.dk-pager__link.is-on:hover {
  background: var(--primary);
  color: var(--primary-fg);
  font-weight: 700;
  cursor: default;
}

/* Prev / Next read as words, so they get room and lose the square minimum. */
.dk-pager__link[rel="prev"],
.dk-pager__link[rel="next"] {
  padding: 0 18px;
  letter-spacing: .06em;
  color: var(--fg2);
}

.dk-pager__gap {
  color: var(--fg3);
  cursor: default;
  min-width: 34px;
  padding: 0 4px;
}

@media (max-width: 719px) {
  .dk-pager { padding: 20px 0 56px; }
  .dk-pager__links { max-width: 100%; overflow-x: auto; }
  .dk-pager__link, .dk-pager__gap { min-width: 42px; height: 42px; padding: 0 12px; }
  .dk-pager__link[rel="prev"], .dk-pager__link[rel="next"] { padding: 0 14px; }
}

/* The superseded group styling is written as `.dk-pager a` (0,1,1), which
   outranks the plain `.dk-pager__link` class (0,1,0) — so its 40px height,
   11px type and padding were still winning. Matching the specificity. */
.dk-pager .dk-pager__link,
.dk-pager .dk-pager__gap {
  min-width: 44px;
  height: 44px;
  padding: 0 14px;
  font-size: 13px;
  font-weight: 600;
  color: var(--fg2);
  background: var(--bg2);
}
.dk-pager .dk-pager__link[rel="prev"],
.dk-pager .dk-pager__link[rel="next"] { padding: 0 18px; }
.dk-pager .dk-pager__link:hover {
  background: color-mix(in srgb, var(--primary) 9%, var(--bg2));
  color: var(--fg);
}
.dk-pager .dk-pager__link.is-on,
.dk-pager .dk-pager__link.is-on:hover {
  background: var(--primary);
  color: var(--primary-fg);
  font-weight: 700;
}
.dk-pager .dk-pager__gap { color: var(--fg3); min-width: 34px; padding: 0 4px; }
@media (max-width: 719px) {
  .dk-pager .dk-pager__link,
  .dk-pager .dk-pager__gap { min-width: 42px; height: 42px; padding: 0 12px; }
}

/* ═══════════════════════════════════════════════════════════════════════
   SHOP SIDEBAR — label colour, width, category size

   diykit.css has `.dk-sidebar__item span { color: var(--border); font-size: 10px }`,
   meant for the trailing count. An earlier fix here re-lit the label with
   `span:first-child` — but every row starts with an <input> or is a link
   whose first child is the .dk-sidebar__cat wrapper, so `span:first-child`
   matched nothing and the labels kept rendering at 10px in the BORDER
   colour: pale grey text on a pale grey page.

   Fixed by lighting every span in the row and re-muting only the count,
   which is identified by class rather than by position.
   ═══════════════════════════════════════════════════════════════════════ */
.dk-sidebar .dk-sidebar__item > span,
.dk-sidebar .dk-sidebar__item > span:first-child,
.dk-sidebar .dk-sidebar__item > span:last-child {
  color: inherit;
  font-size: 14px;
  line-height: 1.4;
}
.dk-sidebar .dk-sidebar__cat { font-size: 14px; color: inherit; }

/* The trailing count stays quiet — but readable, not border-coloured. */
.dk-sidebar .dk-sidebar__item > span.dk-facet-n,
.dk-sidebar .dk-sidebar__item > span:last-child:not(:only-child) {
  color: var(--fg3);
  font-size: 12px;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  flex: none;
}
/* On the selected row the count belongs to the row, not to the muted scale. */
.dk-sidebar .dk-sidebar__item.active > span,
.dk-sidebar .dk-sidebar__item.active > span.dk-facet-n { color: inherit; }

.dk-sidebar .dk-sidebar__item {
  color: var(--fg2);
  font-size: 14px;
}
.dk-sidebar .dk-sidebar__item:hover { color: var(--fg); }

/* A 220px rail could not hold a category name and its count on one line
   once either grew, so names wrapped mid-word or the count fell off. */
.dk-sidebar { width: 280px; }
@media (max-width: 900px) { .dk-sidebar { width: 100%; } }

.dk-sidebar__cat { min-width: 0; overflow-wrap: anywhere; }
.dk-sidebar__thumb { flex: none; }
.dk-range-labels { font-size: 12.5px; }

/* ═══════════════════════════════════════════════════════════════════════
   TYPE FLOOR
   A scan of every /dk page — kit detail and product detail included —
   found 118 classes still rendering under 14px. Product names and prices
   were 13px; part rows, spec values, stock lines and order summary lines
   were 12; kit spec labels and stock chips were 9.

   One rule from here on: anything carrying DETAIL OR DATA is at least
   14px (15px on phones). Two narrower groups sit below that on purpose,
   and only these two:

     · controls (buttons, chips, copy/reset links)  13.5px
     · uppercase mono chrome — eyebrows, badges,
       index numbers, key labels in a key/value pair 12.5px

   Uppercase mono at 12.5px reads about the same size as body text at
   14px, and these carry no data of their own; raising them further makes
   the pages look like a large-print edition. Say the word and they go up
   too — it is one number in this block.
   ═══════════════════════════════════════════════════════════════════════ */

/* ── Detail and data: 14px floor ── */
.dk-addon-card__sub,
.dk-addon-card__title,
.dk-build-step__text,
.dk-code-note,
.dk-compare__you,
.dk-footer__copy,
.dk-footer__email,
.dk-footer__stamp,
.dk-form__hint,
.dk-form__label,
.dk-form__optional,
.dk-kit-bar__stock,
.dk-kit-card__name,
.dk-kit-card__oos,
.dk-kit-grid__empty,
.dk-kit-nav__link,
.dk-kit-oos-box__text,
.dk-kit-oos-box__title,
.dk-kit-section__note,
.dk-kit-sidebar__text,
.dk-kit-spec__val,
.dk-kit-topline__stock,
.dk-kv__v,
.dk-learn-card__title,
.dk-nav__menu-name,
.dk-option__meta,
.dk-page-header__sub,
.dk-panel__link,
.dk-part-row__name,
.dk-part-row__price,
.dk-part-row__qty,
.dk-part-row__sku,
.dk-pdp-hl__v,
.dk-pdp-readmore,
.dk-pin-card__part,
.dk-pin-card__shared,
.dk-price,
.dk-product-card__name,
.dk-sample-note,
.dk-section-link,
.dk-spec-row__v,
.dk-stock-badge,
.dk-stock-meter__value,
.dk-summary__back,
.dk-summary__fine,
.dk-summary__line-name,
.dk-summary__line-qty,
.dk-summary__line-total,
.dk-team-card__bio,
.dk-titan-step__text,
.dk-titan-step__title,
.dk-trust__detail,
.dk-trust__label,
.dk-wire-chip,
.dk-wire-map__hub-name {
  font-size: 14px;
  line-height: 1.55;
}

/* ── Controls ── */
.dk-add-btn,
.dk-btn,
.dk-build__reset,
.dk-cart-btn,
.dk-code-copy,
.dk-filter-tag,
.dk-kit-card__cta,
.dk-nav__cat-trigger,
.dk-nav__menu-all,
.dk-offer__copy,
.dk-offer__no,
.dk-tabs__btn {
  font-size: 13.5px;
}

/* ── Uppercase mono chrome ── */
.dk-addon-card__label,
.dk-badge,
.dk-build-step__num,
.dk-build__count,
.dk-code-file,
.dk-featured-kit__cat,
.dk-fieldset__title,
.dk-footer__col-idx,
.dk-footer__col-title,
.dk-footer__spec-key,
.dk-gallery__zoom-hint,
.dk-kit-card__badge,
.dk-kit-img-label,
.dk-kit-pill,
.dk-kit-sidebar__head,
.dk-kit-spec__label,
.dk-kit-stat__label,
.dk-kv__k,
.dk-learn-card__label,
.dk-live-badge,
.dk-micro-label,
.dk-micro-note,
.dk-mobile-cats__n,
.dk-nav__menu-count,
.dk-offer__artlabel,
.dk-offer__eyebrow,
.dk-panel__title,
.dk-part-chip,
.dk-part-row__sku2,
.dk-parts-group__count,
.dk-parts-group__role,
.dk-path-card__badge,
.dk-pdp-hl__k,
.dk-pdp-toc__label,
.dk-pin-key,
.dk-pinmap__foot,
.dk-pinmap__title,
.dk-product-card__badge,
.dk-product-card__sku,
.dk-sample-tag,
.dk-section-label,
.dk-spec-label,
.dk-spec-row__k,
.dk-stat__label,
.dk-status,
.dk-stock-chip,
.dk-stock-meter__count,
.dk-summary__head,
.dk-team-card__role,
.dk-wire-map__hub-label,
.dk-wire-row__role {
  font-size: 12.5px;
}

/* Names and prices are the two things people scan for, so they lead
   rather than merely clearing the floor. */
.dk-product-card__name,
.dk-kit-card__name { font-size: 15px; line-height: 1.45; }
.dk-price { font-size: 16px; font-weight: 700; }

@media (max-width: 640px) {
.dk-addon-card__sub,
.dk-addon-card__title,
.dk-build-step__text,
.dk-code-note,
.dk-compare__you,
.dk-footer__copy,
.dk-footer__email,
.dk-footer__stamp,
.dk-form__hint,
.dk-form__label,
.dk-form__optional,
.dk-kit-bar__stock,
.dk-kit-card__name,
.dk-kit-card__oos,
.dk-kit-grid__empty,
.dk-kit-nav__link,
.dk-kit-oos-box__text,
.dk-kit-oos-box__title,
.dk-kit-section__note,
.dk-kit-sidebar__text,
.dk-kit-spec__val,
.dk-kit-topline__stock,
.dk-kv__v,
.dk-learn-card__title,
.dk-nav__menu-name,
.dk-option__meta,
.dk-page-header__sub,
.dk-panel__link,
.dk-part-row__name,
.dk-part-row__price,
.dk-part-row__qty,
.dk-part-row__sku,
.dk-pdp-hl__v,
.dk-pdp-readmore,
.dk-pin-card__part,
.dk-pin-card__shared,
.dk-price,
.dk-product-card__name,
.dk-sample-note,
.dk-section-link,
.dk-spec-row__v,
.dk-stock-badge,
.dk-stock-meter__value,
.dk-summary__back,
.dk-summary__fine,
.dk-summary__line-name,
.dk-summary__line-qty,
.dk-summary__line-total,
.dk-team-card__bio,
.dk-titan-step__text,
.dk-titan-step__title,
.dk-trust__detail,
.dk-trust__label,
.dk-wire-chip,
.dk-wire-map__hub-name {
    font-size: 15px;
  }
  .dk-product-card__name,
  .dk-kit-card__name { font-size: 15.5px; }
  .dk-price { font-size: 17px; }
}

/* The last few that sat behind higher-specificity rules. Numerals inside
   circles and single-glyph chevrons/arrows are left alone — they are marks,
   not text, and grow into their containers badly. */
.dk-code-copy.dk-code-copy,
.dk-ai-card__btn.dk-ai-card__btn { font-size: 13.5px; }
.dk-ai-card__id.dk-ai-card__id,
.dk-base__proj-n.dk-base__proj-n,
.dk-hero-titan__tag.dk-hero-titan__tag { font-size: 12px; }

/* ═══════════════════════════════════════════════════════════════════════
   "WHAT THIS KIT TEACHES" — and the unclassed text the floor pass missed
   The earlier type floor was applied class by class, so bare <p>, <li> and
   <td> inside a dk container were invisible to it. This section is exactly
   that: the card paragraphs were 13px and the "You'll also need" list 12px
   mono, both in --fg3 — real instructions rendered as fine print.
   ═══════════════════════════════════════════════════════════════════════ */
.dk-learn-card p {
  font-size: 15px;
  line-height: 1.75;
  color: var(--fg2);
}
.dk-learn-card .dk-also-list li,
.dk-also-list li {
  font-size: 14.5px;
  line-height: 1.6;
  color: var(--fg2);
  padding: 9px 0;
}
.dk-learn-card__label { font-size: 12.5px; }
.dk-learn-card { padding: 22px; }
.dk-kit-lede { font-size: 16px; line-height: 1.8; }

@media (max-width: 640px) {
  .dk-learn-card p { font-size: 15.5px; }
  .dk-also-list li { font-size: 15px; }
  .dk-kit-lede { font-size: 16.5px; }
}

/* The rest of the unclassed prose, found by scanning <p>/<li>/<td> carrying
   real sentences rather than by class name. FAQ answers were 11px and the
   Titan disclaimer 10px — the two places on the site where the text most
   needs reading. */
.dk-faq-answer p,
.dk-faq-answer li { font-size: 14.5px; line-height: 1.75; color: var(--fg2); }
.dk-wire-notes p { font-size: 14px; line-height: 1.7; color: var(--fg2); }
.dk-compare td { font-size: 14px; line-height: 1.55; }
.dk-titan-cap__desc p { font-size: 14px; line-height: 1.65; }
.dk-titan-card__fine p,
.dk-titan-card__fine { font-size: 13px; line-height: 1.6; }
.dk-hint p { font-size: 14px; line-height: 1.6; }

@media (max-width: 640px) {
  .dk-faq-answer p, .dk-faq-answer li { font-size: 15px; }
  .dk-wire-notes p, .dk-compare td, .dk-titan-cap__desc p, .dk-hint p { font-size: 14.5px; }
}

/* Final sweep. Scanning by ELEMENT rather than class — every <p>, <li>, <td>
   and <span> holding a real sentence — turned up these last few sitting
   under the 14px floor behind higher-specificity rules. Doubled selectors
   so they land. Genuine chrome (the kit pill, footer status line, stock
   meter count, pin-map title) is deliberately left at 12.5. */
.dk-price-meta.dk-price-meta,
.dk-price-meta.dk-price-meta span { font-size: 14px; }
.dk-base__proj-adds.dk-base__proj-adds { font-size: 14px; line-height: 1.6; }
.dk-extra.dk-extra { font-size: 14px; }
.dk-build-step__text.dk-build-step__text { font-size: 14px; line-height: 1.65; }
.dk-hint.dk-hint,
.dk-hint.dk-hint p { font-size: 14px; line-height: 1.6; }
.dk-titan-cap__desc.dk-titan-cap__desc,
.dk-titan-cap__desc.dk-titan-cap__desc p { font-size: 14px; line-height: 1.65; }
.dk-step__d.dk-step__d { font-size: 14px; line-height: 1.65; }
.dk-breadcrumb__inner.dk-breadcrumb__inner,
.dk-breadcrumb__inner.dk-breadcrumb__inner span,
.dk-breadcrumb__inner.dk-breadcrumb__inner a { font-size: 13px; }
.dk-footer__legal.dk-footer__legal,
.dk-footer__legal.dk-footer__legal span,
.dk-footer__legal.dk-footer__legal a { font-size: 13px; }

@media (max-width: 640px) {
  .dk-price-meta.dk-price-meta,
  .dk-price-meta.dk-price-meta span,
  .dk-build-step__text.dk-build-step__text,
  .dk-hint.dk-hint,
  .dk-hint.dk-hint p,
  .dk-step__d.dk-step__d { font-size: 14.5px; }
}

/* Two more carrying real sentences rather than labels. */
.dk-entry-card__sub.dk-entry-card__sub { font-size: 14px; line-height: 1.5; }
.dk-titan-card__bubble.dk-titan-card__bubble { font-size: 14px; line-height: 1.6; }

/* ═══════════════════════════════════════════════════════════════════════
   FULL-SITE FLOOR — final pass
   Swept all 21 /dk routes, measuring each element's OWN text nodes (so a
   container is not credited with its children's type). 36 classes were
   still under 14px. Everything below carries a sentence, a name or a value
   and goes to 14px; what is left small after this is only uppercase mono
   micro-labels and numeric pips, listed at the end of this file's history.

   Includes the b1-* board-page classes, which no earlier pass touched —
   the component descriptions on /dk/base1 and /dk/solder-school were
   13.33px.
   ═══════════════════════════════════════════════════════════════════════ */
.dk-auth-benefit__text.dk-auth-benefit__text,
.dk-auth-help.dk-auth-help,
.dk-auth-help.dk-auth-help p,
.dk-auth-guest.dk-auth-guest,
.dk-auth-fine.dk-auth-fine,
.dk-ck-browse.dk-ck-browse,
.dk-ck-summary__ask.dk-ck-summary__ask,
.dk-titan-quick__label.dk-titan-quick__label,
.dk-hero-titan__line.dk-hero-titan__line,
.dk-offer__no.dk-offer__no,
.dk-parts-empty.dk-parts-empty,
.dk-parts-empty.dk-parts-empty .mono,
.dk-pinmap__foot.dk-pinmap__foot,
.dk-part-chip.dk-part-chip,
.dk-base__blk.dk-base__blk,
.dk-pg-all.dk-pg-all,
.dk-titan-card__fine.dk-titan-card__fine,
.dk-titan-card__fine.dk-titan-card__fine p,
.dk-kit-card__img.dk-kit-card__img,
.dk-label.dk-label,
.dk-auth-more.dk-auth-more > summary {
  font-size: 14px;
  line-height: 1.6;
}

/* Board pages: part names and the "why it is here" note beside each marker
   are the whole point of those pages and were the smallest text on them. */
.b1 .b1-part__name,
.b1-part__name.b1-part__name { font-size: 14.5px; line-height: 1.45; }
.b1 .b1-part__why,
.b1-part__why.b1-part__why { font-size: 14px; line-height: 1.6; }

/* Code listings keep monospace convention but stop being fine print. */
.dk-code-pre.dk-code-pre,
.dk-code-pre.dk-code-pre code { font-size: 13.5px; line-height: 1.65; }

@media (max-width: 640px) {
  .dk-auth-benefit__text.dk-auth-benefit__text,
  .dk-auth-help.dk-auth-help,
  .dk-auth-help.dk-auth-help p,
  .dk-hero-titan__line.dk-hero-titan__line,
  .dk-pinmap__foot.dk-pinmap__foot,
  .b1-part__why.b1-part__why { font-size: 14.5px; }
  .b1-part__name.b1-part__name { font-size: 15px; }
}

/* Last six. These read as labels by their class names but each holds a
   sentence or a value — "28 parts packed in this kit", "Per project:
   30–60 minutes" — so by the site rule they are data, not chrome. */
.dk-stock-meter__count.dk-stock-meter__count,
.dk-pinmap__title.dk-pinmap__title,
.dk-kit-pill.dk-kit-pill,
.dk-stat__label.dk-stat__label,
.dk-team-card__role.dk-team-card__role,
.dk-ck-summary__note.dk-ck-summary__note,
.dk-footer__status.dk-footer__status { font-size: 14px; line-height: 1.5; }

/* ═══════════════════════════════════════════════════════════════════════
   DESCRIPTIONS — one size, and a bigger one
   Two different rich-text wrappers were in use at two different sizes:
   .dk-rich (product description) at 17px and .dk-prose (kit description)
   at 14.5px, so the same kind of text read smaller on a kit page than on
   a product page for no reason. Both are 17.5px now, with the headings,
   list items and tables inside them scaled to match — those were 12–13px,
   which made a subheading smaller than the paragraph under it.
   ═══════════════════════════════════════════════════════════════════════ */
.dk-rich,
.dk-rich p,
.dk-prose,
.dk-prose p {
  font-size: 17.5px;
  line-height: 1.85;
  color: var(--fg2);
}
.dk-product-desc { font-size: 17.5px; line-height: 1.8; }

.dk-rich li,
.dk-prose li {
  font-size: 17.5px;
  line-height: 1.75;
  margin-bottom: 10px;
}

/* A subheading has to outrank the paragraph it introduces. */
.dk-rich h2, .dk-rich h3, .dk-rich h4,
.dk-prose h2, .dk-prose h3, .dk-prose h4 {
  font-size: 14px;
  letter-spacing: .09em;
  margin: 30px 0 12px;
}
.dk-rich h2, .dk-prose h2 { font-size: 15px; }

.dk-rich table, .dk-prose table { font-size: 15px; }
.dk-rich th, .dk-rich td,
.dk-prose th, .dk-prose td { padding: 10px 12px; font-size: 15px; }

/* The measure grows with the type so lines do not run long. */
.dk-rich { max-width: 74ch; }

@media (max-width: 640px) {
  .dk-rich, .dk-rich p, .dk-prose, .dk-prose p,
  .dk-rich li, .dk-prose li,
  .dk-product-desc { font-size: 17px; }
  .dk-rich table, .dk-prose table,
  .dk-rich th, .dk-rich td,
  .dk-prose th, .dk-prose td { font-size: 14.5px; }
}

/* The description's own section headings were 1rem (16px) while the body
   under them is now 17.5px — a heading smaller than its paragraph, which
   reads as a mistake. Sized to lead the text they introduce. */
.dk-pdp-sec__h {
  font-size: 20px;
  font-weight: 700;
  line-height: 1.3;
  margin: 0 0 12px;
}
.dk-pdp-sec { margin-bottom: 30px; }
@media (max-width: 640px) {
  .dk-pdp-sec__h { font-size: 18.5px; }
}

/* ═══════════════════════════════════════════════════════════════════════
   WISHLIST HEARTS
   The backend existed; nothing called it. These are the two buttons that
   now do — the one beside Add to cart, and one per product card.
   ═══════════════════════════════════════════════════════════════════════ */
.dk-wish-btn {
  cursor: pointer;
  transition: color .18s, border-color .18s, background .18s;
}
.dk-wish-btn.is-on {
  color: #e5484d;
  border-color: color-mix(in srgb, #e5484d 55%, transparent);
  background: color-mix(in srgb, #e5484d 9%, transparent);
}
.dk-wish-btn.is-on svg { fill: currentColor; }
.dk-wish-btn:not(.is-on):hover { color: #e5484d; }

/* Card heart: sits over the image, weight enough to read on a photo. */
.dk-card-wish {
  position: absolute;
  top: 8px; right: 8px;
  z-index: 3;
  width: 32px; height: 32px;
  display: flex; align-items: center; justify-content: center;
  border: 1px solid var(--border);
  border-radius: 50%;
  background: color-mix(in srgb, var(--bg2) 88%, transparent);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  color: var(--fg3);
  cursor: pointer;
  padding: 0;
  opacity: 0;
  transform: scale(.9);
  transition: opacity .18s, transform .18s, color .18s, border-color .18s;
}
/* Revealed on hover with a mouse; always visible on touch, where there is
   no hover to reveal it with. */
.dk-product-card:hover .dk-card-wish,
.dk-card-wish:focus-visible,
.dk-card-wish.is-on { opacity: 1; transform: none; }
@media (hover: none) and (pointer: coarse) {
  .dk-card-wish { opacity: 1; transform: none; width: 36px; height: 36px; }
}
.dk-card-wish:hover { color: #e5484d; border-color: color-mix(in srgb, #e5484d 50%, transparent); }
.dk-card-wish.is-on { color: #e5484d; border-color: color-mix(in srgb, #e5484d 55%, transparent); }
.dk-card-wish.is-on svg { fill: currentColor; }

/* The card image box has to establish the positioning context for it. */
.dk-product-card__img { position: relative; }

/* Feedback line. The save is instant; this says where it went. */
.dk-wish-toast {
  position: fixed;
  left: 50%; bottom: 24px;
  transform: translateX(-50%) translateY(12px);
  z-index: 1300;
  display: flex; align-items: center; gap: 12px;
  max-width: min(460px, calc(100vw - 32px));
  padding: 13px 18px;
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  box-shadow: 0 12px 34px rgba(0, 0, 0, .22);
  font-size: 14px;
  color: var(--fg);
  opacity: 0;
  pointer-events: none;
  transition: opacity .2s ease, transform .2s ease;
}
.dk-wish-toast.is-on { opacity: 1; transform: translateX(-50%); pointer-events: auto; }
.dk-wish-toast a { color: var(--primary); font-weight: 600; white-space: nowrap; }

@media (prefers-reduced-motion: reduce) {
  .dk-wish-toast, .dk-card-wish { transition: none; }
}

/* ═══════════════════════════════════════════════════════════════════════
   MISSING-IMAGE PLACEHOLDER
   Two cases, one look. dk_placeholder_img() covers a row with no image
   path; img-fallback.js covers the commoner case — a path stored in the
   database whose file is not on disk, which the browser otherwise renders
   as its broken-image icon (7 of 61 images on the shop grid).
   ═══════════════════════════════════════════════════════════════════════ */
img.dk-img-standin,
img[data-dk-placeholder] {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  /* Slightly recessive: it is a stand-in, not the product. */
  opacity: .92;
}

/* Where the box is a contain-fit frame (product gallery, featured block) the
   tile should fill rather than letterbox. */
.dk-gallery__main img[data-dk-placeholder],
.dk-gallery__main img.dk-img-standin,
.dk-featured-kit__img img[data-dk-placeholder],
.dk-featured-kit__img img.dk-img-standin { object-fit: cover; }

/* The old text box, kept for any spot still using it. */
.dk-noimg {
  display: flex; align-items: center; justify-content: center;
  width: 100%; height: 100%;
  font-size: 12.5px; letter-spacing: .1em; text-transform: uppercase;
  color: var(--fg3);
  background: var(--bg3, var(--bg2));
}

/* ── Featured block, trimmed ──────────────────────────────────────────────
   "// Pick of the week / Featured" was eating most of a laptop screen: 72px
   of section padding at each end, a 300px minimum on the image and 36px of
   body padding around one product. Everything below is a size — no colour,
   no layout, no type-scale change beyond the product name — so the block
   still reads as part of the same homepage, it just takes less room.

   The section heading keeps its size deliberately: shrinking it here would
   make this one section's title smaller than every other section's.

   This sheet loads after diykit.css, so these win without !important. */
.dk-featured            { padding: 44px 0; }
/* align-items:start in the base sheet let the image cell size itself from the
   photo's natural aspect ratio: measured 817px tall in a 545px column, against
   a 248px text block. THAT was the section's height, not the padding. stretch
   ties the image to the text block instead, so the row is as tall as its
   content and no taller, with min-height as the floor. */
.dk-featured-kit        { gap: 32px; margin-top: 18px; align-items: stretch; }
/* stretch alone was not enough: the <img> is in flow, so its natural aspect
   still set the row height (817px from a 545px-wide column) and the text block
   just stretched to match. Taking the image out of flow leaves the cell with
   no intrinsic height, so the row is sized by the text and the min-height
   floor, and the photo crops to whatever that comes to. */
.dk-featured-kit__img   { position: relative; overflow: hidden; min-height: 240px; height: 100%; }
.dk-featured-kit__img > img {
  position: absolute; inset: 0;
  width: 100%; height: 100%; object-fit: cover;
}
.dk-featured-kit__body  { padding: 24px 24px 24px 0; }
.dk-featured-kit__name  { font-size: 18px; }
.dk-featured-kit__desc  { font-size: 14px; line-height: 1.65; margin-top: 8px; }
.dk-featured-kit__foot  { margin-top: 14px; }

/* Below 1025px the base sheet stacks the grid and pads the body all round;
   keep that behaviour, just less of it. Guarded to the same breakpoint the
   base sheet uses so the stack itself is untouched. */
@media (max-width: 1024px) {
  .dk-featured           { padding: 32px 0; }
  .dk-featured-kit__img  { min-height: 180px; }
  .dk-featured-kit__body { padding: 20px; }
}

/* ── About: the two-column mission block ─────────────────────────────────
   This was an inline style on the div — display:grid, 1fr 1fr, gap 64px, no
   breakpoint. `1fr` is minmax(auto, 1fr), so the tracks could never shrink
   below the copy's min-content: measured 454px of content inside a 374px
   viewport at a 390px device width, i.e. 80px of horizontal scroll on every
   phone. minmax(0, 1fr) removes the floor, and the stack below removes the
   two-column layout entirely where there is no room for it. */
.dk-about-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 64px;
  align-items: start;
}

@media (max-width: 900px) {
  .dk-about-grid { grid-template-columns: minmax(0, 1fr); gap: 36px; }
  .dk-about-plate { height: 200px; }
}

/* ── Rich product copy ────────────────────────────────────────────────────
   dk_html() used to delete images, figures, blockquotes and links before they
   ever reached the page, so none of them had styles. It no longer does —
   measured across the 249 stored descriptions, that was 31 figures, 23 block
   quotes, 8 images and a link being thrown away. Everything below is the
   styling those elements now need.

   No base font-size or line-height here on purpose: the reading size for
   .dk-rich is set earlier in this file and was tuned deliberately. This block
   only adds elements that had no rules at all. */

/* Images and figures. Stored width/height attributes are kept for aspect
   ratio, but must never win over the column: height:auto stops a declared
   height from squashing a scaled-down image. */
.dk-rich img {
  display: block;
  max-width: 100%;
  height: auto;
  margin: 20px 0;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg2);
}
.dk-rich figure { margin: 24px 0; }
.dk-rich figure img { margin: 0; }
.dk-rich figcaption {
  margin-top: 10px;
  font-family: 'JetBrains Mono', ui-monospace, Menlo, Consolas, monospace;
  font-size: 14px;
  line-height: 1.6;
  color: var(--fg3);
}

/* Links inside copy have to be obviously clickable without shouting. */
.dk-rich a {
  color: var(--primary);
  text-decoration: underline;
  text-underline-offset: 3px;
  text-decoration-thickness: 1px;
  overflow-wrap: anywhere;      /* a bare URL must not widen the column */
}
.dk-rich a:hover { text-decoration-thickness: 2px; }

/* A pulled-out line: rule in the accent colour, no quotation marks, because
   these are supplier notes rather than testimonials. */
.dk-rich blockquote {
  margin: 20px 0;
  padding: 4px 0 4px 18px;
  border-left: 3px solid var(--primary);
  color: var(--fg);
}
.dk-rich blockquote > *:first-child { margin-top: 0; }
.dk-rich blockquote > *:last-child  { margin-bottom: 0; }

/* Part numbers, pin names, register values. */
.dk-rich code, .dk-rich kbd {
  font-family: 'JetBrains Mono', ui-monospace, Menlo, Consolas, monospace;
  font-size: .92em;
  background: var(--bg3);
  border: 1px solid var(--border);
  border-radius: 4px;
  padding: 1px 6px;
  color: var(--fg);
}
.dk-rich pre {
  margin: 18px 0;
  padding: 16px 18px;
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  overflow-x: auto;
  font-family: 'JetBrains Mono', ui-monospace, Menlo, Consolas, monospace;
  font-size: 14.5px;
  line-height: 1.7;
}
.dk-rich pre code { background: none; border: 0; padding: 0; font-size: inherit; }

/* Definition lists — what a spec sheet pasted from a supplier often becomes. */
.dk-rich dl { margin: 0 0 16px; }
.dk-rich dt { color: var(--fg); font-weight: 600; margin-top: 12px; }
.dk-rich dd { margin: 4px 0 0; padding-left: 16px; border-left: 1px solid var(--border); }

/* A wide pin table must scroll inside its own box, never widen the page.
   overflow-x on the table itself, since the stored markup has no wrapper to
   hang it on and adding one would mean rewriting the author's HTML. */
.dk-rich table { display: block; overflow-x: auto; max-width: 100%; }
.dk-rich caption {
  caption-side: top;
  text-align: left;
  padding-bottom: 8px;
  color: var(--fg3);
  font-size: 14px;
}

.dk-rich sup, .dk-rich sub { font-size: .72em; line-height: 0; }
.dk-rich small  { font-size: .88em; color: var(--fg3); }
.dk-rich mark   { background: color-mix(in srgb, var(--primary) 22%, transparent); color: var(--fg); padding: 0 3px; }
.dk-rich abbr[title] { text-decoration: underline dotted; text-underline-offset: 3px; cursor: help; }
.dk-rich em, .dk-rich i { color: var(--fg2); }

/* An author's text-align:center on a paragraph should not centre a whole
   pasted block that happens to contain a table. */
.dk-rich table[style*="text-align"] { text-align: left; }

@media (max-width: 640px) {
  .dk-rich img, .dk-rich figure { margin: 16px 0; }
  .dk-rich pre { padding: 12px 14px; font-size: 14px; }
}

/* ── Logo ─────────────────────────────────────────────────────────────────
   Only the ".ae" came off. It read as a web address rather than part of the
   name, and the printed lockup (assets/branding/diykit-logo.png) carries no
   domain either — so the screen now matches the print.

   The .tld rule stays as a belt-and-braces: if any template still emits a
   <span class="tld">, it will not print. Removing the markup is the fix;
   this is the safety net. */
.dk-logo__text .tld { display: none !important; }

/* Set as two words, "DIY KIT", the way the printed lockup sets it. The
   non-breaking space in the markup keeps them on one line; this just gives
   the pair a little air at the larger header size. */
.dk-logo__text { letter-spacing: .01em; }
.dk-logo { transition: opacity .15s ease; }
.dk-logo:hover { opacity: .88; }

.dk-footer .dk-logo { display: inline-flex; }

/* ── Policies page ────────────────────────────────────────────────────────
   A legal page is read in two ways: scanned for one clause, or read straight
   through. The contents strip serves the first, the panelled sections the
   second. Both reuse .dk-panel and .dk-rich, so the type, list markers and
   spacing are the same ones the product descriptions use — a policy page that
   invents its own typography is how a site starts to feel assembled rather
   than designed. */
.dk-pol-head {
  display: flex; flex-wrap: wrap; gap: 24px;
  align-items: flex-start; justify-content: space-between;
}
.dk-pol-lede {
  color: var(--fg2); font-size: 15.5px; line-height: 1.75;
  margin-top: 10px; max-width: 68ch;
}
.dk-pol-updated {
  font-size: 13.5px; line-height: 1.6; color: var(--fg3);
  border: 1px solid var(--border); border-radius: var(--radius);
  padding: 10px 14px; white-space: nowrap;
}
.dk-pol-updated strong { color: var(--fg); font-weight: 600; }

.dk-pol-wrap { padding-bottom: 64px; }

/* Sticky so the clause you are reading never costs you a scroll back up to
   find the next one. Falls back to a normal block where sticky is unsupported. */
.dk-pol-toc {
  position: sticky; top: 0; z-index: 5;
  display: flex; flex-wrap: wrap; gap: 8px; align-items: center;
  padding: 14px 0 16px; margin-bottom: 8px;
  background: var(--bg);
  border-bottom: 1px solid var(--border);
}
.dk-pol-toc__label {
  font-size: 13px; letter-spacing: .12em; text-transform: uppercase;
  color: var(--fg3); margin-right: 4px;
}
.dk-pol-toc a {
  font-size: 14px; text-decoration: none;
  color: var(--fg2); border: 1px solid var(--border);
  border-radius: 999px; padding: 6px 13px;
  transition: border-color .15s ease, color .15s ease;
}
.dk-pol-toc a:hover { color: var(--primary); border-color: var(--primary); }

.dk-pol-sec { margin-top: 22px; }
/* scroll-margin, not padding: the sticky strip would otherwise sit on top of
   the heading you just jumped to. */
.dk-pol-sec { scroll-margin-top: 76px; }
.dk-pol-sec .dk-panel__body { padding: 22px 24px; }
.dk-pol-sec .dk-rich > ul:last-child,
.dk-pol-sec .dk-rich > p:last-child { margin-bottom: 0; }
.dk-pol-note { color: var(--fg3); font-size: 14px; }

@media (max-width: 640px) {
  .dk-pol-updated { white-space: normal; }
  .dk-pol-toc { position: static; }
  .dk-pol-sec .dk-panel__body { padding: 18px 16px; }
}

/* ── BOARD SHOWCASE: PHOTO STRIP ────────────────────────────────────────
   The homepage section showed one image per board while three sat unused in
   Boards Studio, and Solder School showed none at all — it has onboard
   blocks, so it drew the block diagram instead, which cannot light up
   because that board has no builds. Photo now wins whenever the diagram
   would be inert, and this is the strip that turns the board over. */
.dk-base__thumbs {
  display: flex;
  gap: 8px;
  margin-top: 10px;
  flex-wrap: wrap;
}

.dk-base__thumb {
  width: 62px;
  height: 62px;
  padding: 0;
  border: 1px solid var(--border);
  border-radius: 6px;
  background: var(--bg2, #fff);
  cursor: pointer;
  overflow: hidden;
  flex: 0 0 auto;
  opacity: .6;
  transition: opacity .15s, border-color .15s, transform .15s;
}

.dk-base__thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.dk-base__thumb:hover { opacity: 1; transform: translateY(-1px); }

/* The selected shot is the one on the plate — it must not look clickable-
   pending, or people click it expecting a change and get nothing. */
.dk-base__thumb.is-on {
  opacity: 1;
  border-color: var(--accent, #16a34a);
  box-shadow: 0 0 0 1px var(--accent, #16a34a) inset;
  cursor: default;
}

.dk-base__thumb:focus-visible {
  outline: 2px solid var(--accent, #16a34a);
  outline-offset: 2px;
}

@media (max-width: 640px) {
  .dk-base__thumb { width: 52px; height: 52px; }
}

/* ── BOARD SHOWCASE: FACTS ROW ──────────────────────────────────────────
   The counts used to be inert text. They are links now, so they need to
   look clickable — the arrow alone is not enough of a signal when the tile
   beside it is a plain chip that does nothing. */
.dk-bs__fact--go {
  text-decoration: none;
  transition: border-color .15s, background .15s, transform .15s;
}

.dk-bs__fact--go:hover {
  border-color: var(--accent, #16a34a);
  transform: translateY(-1px);
}

/* "Read the board" is the primary route; the counted tiles are shortcuts
   into one part of it. Tinting it keeps that order readable at a glance. */
.dk-bs__fact--read {
  background: var(--accent-soft, #ecfdf3);
  border-color: var(--accent, #16a34a);
  font-weight: 600;
}

/* ═══════════════════════════════════════════════════════════════════════
   NAV SEARCH
   ─────────────────────────────────────────────────────────────────────
   Prefixed .dk-navsearch, NOT .dk-search: .dk-search is already taken by
   the hero search box in diykit.css (display:flex, max-width:540px). The
   first version of this used it and inherited that 540px cap, so the
   panel opened as a narrow box in the top-left corner instead of
   spanning the bar — and it leaked its own border-top and padding back
   onto the hero box. Keep the prefix.
   Why a drop-down panel and not an always-visible input: the navbar is
   already at capacity at 1024px (logo + 6 links + 6 actions). An inline
   field would have forced the links into the hamburger on laptops. The
   button costs 36px, and the panel gets the full container width when
   it opens — a longer field than an inline one could ever have been.

   All colours are theme tokens, so this follows the light/dark toggle
   without a second rule set. The old theme's search hardcoded #0b1220
   and would have been unreadable in dark mode here.
   ═══════════════════════════════════════════════════════════════════ */

.dk-navsearch[hidden] { display: none !important; }

.dk-navsearch {
  border-top: 1px solid var(--border);
  background: var(--bg);
  padding: 12px 0;
  animation: dkSearchIn .18s ease;
}

@keyframes dkSearchIn {
  from { opacity: 0; transform: translateY(-6px); }
  to   { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
  .dk-navsearch { animation: none; }
}

.dk-navsearch__form {
  position: relative;
  display: flex;
  align-items: center;
  gap: 8px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg2, var(--bg));
  padding: 0 8px 0 12px;
  transition: border-color .2s, box-shadow .2s;
}

.dk-navsearch__form:focus-within {
  border-color: var(--primary);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary) 14%, transparent);
}

.dk-navsearch__icon { color: var(--fg3); flex-shrink: 0; }

.dk-navsearch input[type="search"] {
  flex: 1;
  min-width: 0;
  border: 0;
  outline: 0;
  background: transparent;
  color: var(--fg);
  /* 16px on mobile stops iOS Safari zooming the page on focus. */
  font-size: 15px;
  padding: 12px 0;
  font-family: inherit;
}

.dk-navsearch input[type="search"]::placeholder { color: var(--fg3); }
/* Chrome draws its own grey X that collides with our close button. */
.dk-navsearch input[type="search"]::-webkit-search-cancel-button { display: none; }

.dk-navsearch__go {
  font-family: 'JetBrains Mono', monospace;
  font-size: 10px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .1em;
  padding: 9px 16px;
  border: 0;
  border-radius: var(--radius);
  background: var(--primary);
  color: var(--primary-fg);
  cursor: pointer;
  flex-shrink: 0;
}

.dk-navsearch__go:hover { filter: brightness(1.08); }

.dk-navsearch__close {
  width: 32px; height: 32px;
  display: flex; align-items: center; justify-content: center;
  border: 0; background: transparent; color: var(--fg3);
  cursor: pointer; border-radius: var(--radius); flex-shrink: 0;
}

.dk-navsearch__close:hover { color: var(--fg); background: var(--border); }

/* ── Suggestions ─────────────────────────────────────────────────── */

.dk-navsearch__drop[hidden] { display: none !important; }

.dk-navsearch__drop {
  position: absolute;
  top: calc(100% + 6px);
  left: 0; right: 0;
  z-index: 240;                 /* above the page, below the mobile drawer */
  max-height: min(70vh, 520px);
  overflow-y: auto;
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  box-shadow: 0 18px 40px rgba(0,0,0,.16);
  padding: 6px;
}

.dk-sd__label {
  font-family: 'JetBrains Mono', monospace;
  font-size: 9px;
  text-transform: uppercase;
  letter-spacing: .14em;
  color: var(--fg3);
  padding: 10px 10px 6px;
}

.dk-sd__row {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 10px;
  border-radius: var(--radius);
  text-decoration: none;
  color: var(--fg);
}

.dk-sd__row:hover,
.dk-sd__row.is-active {
  background: color-mix(in srgb, var(--primary) 8%, transparent);
}

.dk-sd__thumb {
  width: 40px; height: 40px;
  flex-shrink: 0;
  border-radius: 6px;
  border: 1px solid var(--border);
  background: var(--bg2, var(--bg));
  object-fit: contain;
  padding: 2px;
}

.dk-sd__body { flex: 1; min-width: 0; }

.dk-sd__name {
  font-size: 13px;
  line-height: 1.35;
  /* Two lines then ellipsis: part names here run long ("Li-Po 3.7V
     602040 500mAh with protection"), and one line cut most of them. */
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.dk-sd__meta {
  font-family: 'JetBrains Mono', monospace;
  font-size: 10px;
  color: var(--fg3);
  margin-top: 2px;
}

.dk-sd__price {
  font-family: 'JetBrains Mono', monospace;
  font-size: 12px;
  font-weight: 700;
  color: var(--fg);
  flex-shrink: 0;
  white-space: nowrap;
}

.dk-sd__pills { display: flex; flex-wrap: wrap; gap: 6px; padding: 4px 10px 8px; }

.dk-sd__pill {
  font-size: 11px;
  padding: 5px 10px;
  border: 1px solid var(--border);
  border-radius: 999px;
  color: var(--fg2);
  text-decoration: none;
}

.dk-sd__pill:hover { border-color: var(--primary); color: var(--primary); }

.dk-sd__all {
  display: block;
  text-align: center;
  padding: 11px;
  margin-top: 4px;
  border-top: 1px solid var(--border);
  font-family: 'JetBrains Mono', monospace;
  font-size: 10px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .1em;
  color: var(--primary);
  text-decoration: none;
}

.dk-sd__all:hover { background: color-mix(in srgb, var(--primary) 8%, transparent); }

.dk-sd__state { padding: 22px 14px; text-align: center; color: var(--fg3); font-size: 13px; }
.dk-sd__state strong { display: block; color: var(--fg); margin-bottom: 4px; font-size: 14px; }

.dk-sd__cta {
  display: inline-block;
  margin-top: 10px;
  padding: 8px 16px;
  border-radius: var(--radius);
  background: var(--primary);
  color: var(--primary-fg);
  font-family: 'JetBrains Mono', monospace;
  font-size: 10px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .1em;
  text-decoration: none;
}

.dk-sd__row mark {
  background: color-mix(in srgb, var(--primary) 22%, transparent);
  color: inherit;
  padding: 0 1px;
  border-radius: 2px;
}

/* ── Mobile drawer form ───────────────────────────────────────────── */

.dk-mobile-search {
  display: flex;
  gap: 6px;
  padding: 10px 0 14px;
  border-bottom: 1px solid var(--border);
  margin-bottom: 6px;
}

.dk-mobile-search input {
  flex: 1;
  min-width: 0;
  font-size: 16px;                 /* no iOS zoom-on-focus */
  padding: 10px 12px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg);
  color: var(--fg);
  font-family: inherit;
}

.dk-mobile-search button {
  width: 42px;
  border: 0;
  border-radius: var(--radius);
  background: var(--primary);
  color: var(--primary-fg);
  display: flex; align-items: center; justify-content: center;
  cursor: pointer;
  flex-shrink: 0;
}

/* The panel's own Search/close buttons are wasted width on a phone —
   the on-screen keyboard's Go key already submits. */
@media (max-width: 640px) {
  .dk-navsearch__go { display: none; }
  .dk-sd__thumb { width: 34px; height: 34px; }
}

/* ═══════════════════════════════════════════════════════════════════════
   TRUST BADGES  (dk/partials/_trust_badges.php)
   ─────────────────────────────────────────────────────────────────────
   One strip, three placements: under the buy controls on a product page,
   under Checkout in the cart, and beside Place order at checkout.

   Prefixed .dk-trustbar, NOT .dk-trust: .dk-trust is already the homepage
   trust-cards builder block (blocks/trust.php) and reusing it would
   restyle that block from here. That exact collision cost an hour on the
   nav search — .dk-search was taken by the hero box.

   Card marks are drawn in CSS rather than loaded as image files: no extra
   requests, no logo assets to keep in sync, and they follow the theme.
   ═══════════════════════════════════════════════════════════════════ */

.dk-trustbar {
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin-top: 14px;
  padding: 13px 14px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg2, var(--bg));
}

.dk-trustbar__item {
  display: flex;
  align-items: flex-start;
  gap: 9px;
  font-size: 12.5px;
  line-height: 1.45;
  color: var(--fg);
}

.dk-trustbar__ico {
  flex-shrink: 0;
  margin-top: 2px;
  color: var(--primary);
}

.dk-trustbar__item strong { display: block; font-weight: 600; }

.dk-trustbar__sub {
  display: block;
  color: var(--fg3);
  font-size: 11.5px;
  margin-top: 1px;
}

.dk-trustbar__marks {
  display: flex;
  align-items: center;
  gap: 6px;
  padding-top: 10px;
  border-top: 1px solid var(--border);
}

.dk-mark {
  display: inline-flex;
  align-items: center;
  height: 21px;
  padding: 0 7px;
  border-radius: 4px;
  border: 1px solid var(--border);
  background: #fff;                 /* card marks are brand-fixed, not themed */
  font-family: 'JetBrains Mono', monospace;
  font-size: 10px;
  font-weight: 800;
  letter-spacing: .03em;
  line-height: 1;
}

.dk-mark--visa   { color: #1a1f71; font-style: italic; letter-spacing: .06em; }
.dk-mark--stripe { color: #fff; background: #635bff; border-color: #635bff; text-transform: lowercase; }

/* Mastercard: two interlocking discs, the mark as it is actually drawn. */
.dk-mark--mc { padding: 0 6px; gap: 0; }
.dk-mark--mc i { width: 13px; height: 13px; border-radius: 50%; display: inline-block; }
.dk-mark--mc i:first-child { background: #eb001b; }
.dk-mark--mc i:last-child  { background: #f79e1b; margin-left: -5px; opacity: .9; }

/* In the cart and checkout the strip sits inside the narrow summary rail,
   so it stays one column. On a product page there is width to spare on
   desktop — two columns keeps it from pushing the tabs down the page. */
@media (min-width: 900px) {
  .dk-trustbar--product {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 10px 16px;
  }
  .dk-trustbar--product .dk-trustbar__marks {
    grid-column: 1 / -1;
  }
}

/* ═══════════════════════════════════════════════════════════════════════
   PACK SELECTOR  (product page)
   ─────────────────────────────────────────────────────────────────────
   Turns the existing quantity bands into something a shopper can see and
   press. Prefixed .dk-packs — .dk-bulk is the panel further down the page
   and .dk-btn is the global button; neither is touched from here.
   ═══════════════════════════════════════════════════════════════════ */

.dk-packs { margin-top: 14px; }

.dk-packs__label {
  font-size: 10px;
  text-transform: uppercase;
  letter-spacing: .12em;
  color: var(--fg3);
  margin-bottom: 7px;
}

.dk-packs__row {
  display: grid;
  /* Auto-fit rather than a fixed count: a product may offer two bands or
     five, and both should fill the row without a media query per case. */
  grid-template-columns: repeat(auto-fit, minmax(112px, 1fr));
  gap: 8px;
}

.dk-packs__btn {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 10px 8px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg2, var(--bg));
  color: var(--fg);
  cursor: pointer;
  text-align: left;
  transition: border-color .18s, background .18s, transform .18s;
}

.dk-packs__btn:hover { border-color: var(--primary); transform: translateY(-1px); }

.dk-packs__btn.is-on {
  border-color: var(--primary);
  background: color-mix(in srgb, var(--primary) 9%, transparent);
  box-shadow: inset 0 0 0 1px var(--primary);
}

.dk-packs__n {
  font-family: 'JetBrains Mono', monospace;
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .06em;
}

.dk-packs__tot {
  font-family: 'JetBrains Mono', monospace;
  font-size: 15px;
  font-weight: 700;
}

.dk-packs__ea { font-size: 11px; color: var(--fg3); line-height: 1.4; }

/* The per-piece price, sized up on 2026-09-10. It is the figure that decides
   whether a pack looks worth taking, and at 11px it read as small print next
   to the pack total. Deliberately still below .dk-packs__tot so the total
   stays the headline of the button. */
.dk-packs__each {
  font-family: 'JetBrains Mono', monospace;
  font-size: 13px;
  font-weight: 700;
  color: var(--fg2);
}

.dk-packs__btn.is-on .dk-packs__each { color: var(--fg); }

.dk-packs__btn.is-on .dk-packs__ea { color: var(--fg2); }

/* ═══════════════════════════════════════════════════════════════════════
   PACK TEASER ON THE PRICE LINE  (product page)
   ─────────────────────────────────────────────────────────────────────
   The headline price of a small part is dominated by fixed per-order cost
   (handling, packing, card fee, small-item surcharge), so a 2 AED component
   lists near 13 AED and reads as a rip-off. This line puts the per-piece
   pack price in the same eyeful as the headline, and links down to the
   chooser. Prefixed .dk-price-pack: .dk-packs is the chooser itself and
   .dk-price-meta is the VAT / shipping strip, neither is touched here.
   ═══════════════════════════════════════════════════════════════════ */

.dk-price-pack {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin-top: 6px;
  padding: 5px 10px;
  border: 1px dashed color-mix(in srgb, var(--primary) 45%, transparent);
  border-radius: var(--radius);
  background: color-mix(in srgb, var(--primary) 7%, transparent);
  color: var(--fg2);
  font-size: 13px;
  line-height: 1.3;
  text-decoration: none;
  transition: border-color .18s, background .18s;
}

.dk-price-pack:hover {
  border-style: solid;
  border-color: var(--primary);
  background: color-mix(in srgb, var(--primary) 12%, transparent);
}

.dk-price-pack b {
  font-family: 'JetBrains Mono', monospace;
  color: var(--fg);
}

.dk-price-pack__save {
  font-family: 'JetBrains Mono', monospace;
  font-size: 10px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .08em;
  padding: 2px 6px;
  border-radius: 999px;
  background: var(--primary);
  /* Fixed dark ink rather than var(--bg): --bg flips with the theme, and on
     the light theme white-on-primary was unreadable. */
  color: #061014;
}
