/* =========================================================
   PORTAL — THEME / SKIN
   -----------------------------------------------------------
   Loads AFTER portal-base-style.css. Owns nothing structural:
   tokens, colors, type sizing and the Portal-specific visuals
   (portal glow, core rotator, reaction meters, tech modal).

   Structure/layout lives in portal-base-style.css. Anything in
   the "NOT YET IN BASE" block at the bottom of this file is a
   component that still needs a neutral base definition.
   ========================================================= */

/* ---------------------------------------------------------
   TOKEN OVERRIDES — dark 900 Global skin
--------------------------------------------------------- */
:root {
  --spi-white: #f2edea;
  --spi-black: #f2edea;
  --spi-gray-100: #151019;
  --spi-gray-200: #100d13;
  --spi-gray-300: #0a0810;
  --spi-gray-400: #4a3a52;
  --spi-gray-600: #8e878b;
  --spi-text-muted: #a49da0;
  --spi-border: #241c26;

  --spi-accent: #f5a800;
  --portal-pink: #e8005c;
  --portal-bg: #08070a;
  --portal-panel: #100d13;
  --portal-card: #151019;
  --portal-ink: #f2edea;
  --portal-ink-2: #c9c1c5;
  --portal-dim: #6f686c;

  --spi-radius-sm: 0px;
  --spi-radius-md: 0px;
  --spi-radius-lg: 0px;

  --spi-font-body: 'Barlow', system-ui, sans-serif;
  --spi-font-display: 'Noto Serif TC', Georgia, serif;
  --spi-container-max: 1280px;
  --spi-section-y: 20px;
  --spi-pad-desktop: 40px;
}

body {
  background: var(--portal-bg);
  color: var(--portal-ink);
}

/* ---------------------------------------------------------
   CMS HOSTING
   When this page is injected into a CMS template, its own
   wrapper divs sit between <body> and our markup, and those
   wrappers paint an opaque light background — so the dark
   body colour never shows through and the white display type
   lands on white. Paint the background on our own roots so it
   never depends on <body> being visible.
--------------------------------------------------------- */
.portal-page,
.portal-footer {
  background: var(--portal-bg);
  color: var(--portal-ink);
}

a { color: var(--spi-accent); text-decoration: none; }
a:hover { color: #ffc548; }

/* ---------------------------------------------------------
   TYPE — heavy serif display, larger than base default
--------------------------------------------------------- */
.spi-h1, .spi-h2, .spi-h3 { font-style: normal; font-weight: 900; color: var(--portal-ink); }
.spi-h1 { font-size: clamp(44px, 6vw, 82px); line-height: .95; }
.spi-h2 { font-size: clamp(30px, 3.6vw, 44px); line-height: 1.04; }
.spi-h3 { font-size: 28px; font-weight: 900; line-height: 1.1; }
.spi-h2:last-child { margin-bottom: 0; }

.spi-body { font-size: 16px; line-height: 1.62; color: var(--spi-text-muted); text-wrap: pretty; }
.spi-body-lg { font-size: 17.5px; line-height: 1.62; }

.spi-eyebrow {
  font-family: var(--spi-font-display);
  font-size: 11.5px;
  font-weight: 400;
  letter-spacing: .32em;
  color: var(--spi-accent);
}

/* Section header block: eyebrow stacked over title */
.spi-section-header {
  flex-direction: column;
  align-items: flex-start;
  gap: 12px;
  margin-bottom: 34px;
}

.spi-section-padded { padding-bottom: 110px; }

/* ---------------------------------------------------------
   BUTTONS — ghost gold outline / solid gold
--------------------------------------------------------- */
.btn {
  font-family: var(--spi-font-display);
  font-size: 12px;
  font-weight: 400;
  letter-spacing: .22em;
  text-transform: uppercase;
  border-radius: 0;
  padding: 13px 22px;
}

.btn.default {
  border: 1px solid var(--spi-accent) !important;
  background: transparent !important;
  color: var(--spi-accent) !important;
  box-shadow: none !important;
}

.btn.default:hover {
  transform: none;
  border: 1px solid var(--spi-accent) !important;
  background: var(--spi-accent) !important;
  color: #0b0910 !important;
  box-shadow: none !important;
}

.btn.is-solid {
  border: 1px solid var(--spi-accent) !important;
  background: var(--spi-accent) !important;
  color: #0b0910 !important;
  padding: 16px 30px;
}

.btn.is-solid:hover { background: #ffc548 !important; border-color: #ffc548 !important; }

/* ---------------------------------------------------------
   CARDS
--------------------------------------------------------- */
.ui-card {
  background: var(--portal-card);
  border: 1px solid var(--spi-border);
  padding: 28px 26px 30px;
  display: flex;
  flex-direction: column;
  gap: 16px;
}

.ui-card > * { margin: 0; }
.ui-card .spi-tag { align-self: flex-start; }
.ui-card .ui-list { margin: 0; }
.spi-meta { font-size: 14.5px; line-height: 1.6; color: var(--portal-ink-2); }

.ui-card .spi-h3 { color: var(--portal-ink); }

/* accent rail across the top of a card */
.ui-card.is-railed { position: relative; overflow: hidden; }
.ui-card.is-railed::before {
  content: "";
  position: absolute; left: 0; top: 0;
  width: 100%; height: 2px;
  background: linear-gradient(90deg, var(--portal-pink), rgba(232, 0, 92, 0));
}

.ui-card.is-yes { border-top: 2px solid var(--portal-pink); }
.ui-card.is-no { border-top: 2px solid var(--spi-gray-400); }
.ui-card.is-key { border-top: 2px solid var(--spi-accent); }

/* recommendation card — used by the technology row */
.spi-card-rec {
  background: linear-gradient(180deg, #16121a 0%, var(--portal-panel) 100%);
  border: 1px solid var(--spi-border);
  min-height: 540px;
}

.spi-card-rec-img {
  aspect-ratio: auto;
  height: 210px;
  background: radial-gradient(circle at 50% 55%, #191320, var(--portal-bg));
  border-bottom: 1px solid var(--spi-border);
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  position: relative;
}

.spi-card-rec-img img { width: auto; height: auto; object-fit: contain; }
.spi-card-rec-img .is-core { width: 172px; }
.spi-card-rec-img .is-cover { height: 158px; }

.spi-card-rec-body { padding: 30px 28px 32px; gap: 16px; }

/* article / guide card */
.spi-card-article {
  display: flex;
  flex-direction: column;
  background: linear-gradient(180deg, #16121a 0%, var(--portal-panel) 100%);
  border: 1px solid var(--spi-border);
  color: inherit;
  transition: border-color .2s ease, transform .2s ease;
}

.spi-card-article:hover {
  border-color: var(--spi-accent);
  transform: translateY(-3px);
  color: inherit;
}

.spi-card-article-img {
  aspect-ratio: 2 / 1;
  background: var(--portal-bg);
  border-bottom: 1px solid var(--spi-border);
}

.spi-card-article-body { padding: 24px 26px 28px; gap: 14px; }
.spi-card-article-body .spi-tag { white-space: nowrap; }

.spi-card-article-body h4 {
  font-family: var(--spi-font-display);
  font-weight: 600;
  font-size: 17px;
  letter-spacing: .02em;
  text-transform: none;
  color: var(--portal-ink);
  line-height: 1.35;
}

.spi-card-article:hover h4 { color: var(--spi-accent); }

/* The card is the <div>; this link fills it and carries the click.
   Keeps the whole card clickable without an <a> wrapping block-level
   content, which the CMS HTML filter strips on save. */
.spi-card-article-link {
  display: flex;
  flex-direction: column;
  flex: 1;
  color: inherit;
  text-decoration: none;
}

.spi-read-time {
  white-space: nowrap;
  border-radius: 0;
  border: 1px solid var(--spi-border);
  background: rgba(8, 7, 10, .82);
  font-family: var(--spi-font-display);
  color: var(--spi-accent);
  letter-spacing: .22em;
  font-size: 10px;
  padding: 6px 9px;
}

/* glossary modal */
.spi-glossary-btn { align-self: flex-start; margin-top: 24px; }

.spi-gloss-tabs {
  display: flex;
  gap: 0;
  border-bottom: 1px solid var(--spi-border);
  padding: 0 34px;
}

.spi-gloss-tab {
  background: none;
  border: none;
  border-bottom: 2px solid transparent;
  cursor: pointer;
  padding: 16px 4px;
  margin-right: 30px;
  font-family: var(--spi-font-display);
  font-size: 12px;
  letter-spacing: .2em;
  text-transform: uppercase;
  color: var(--portal-dim);
}

.spi-gloss-tab:hover { color: var(--portal-ink); }
.spi-gloss-tab.is-on { color: var(--spi-accent); border-bottom-color: var(--spi-accent); }

.spi-gloss-body {
  padding: 28px 34px 38px;
  display: flex;
  flex-direction: column;
  gap: 22px;
  max-height: 58vh;
  overflow-y: auto;
}

.spi-gloss-body > .spi-body { max-width: 720px; margin: 0; }

.spi-gloss-table { display: flex; flex-direction: column; }

.spi-gloss-row {
  display: grid;
  grid-template-columns: 1.1fr 1.4fr 1.6fr;
  gap: 24px;
  padding: 15px 0;
  border-bottom: 1px solid var(--spi-border);
  font-size: 14.5px;
  line-height: 1.55;
  color: var(--portal-ink-2);
}

.spi-gloss-row.is-head {
  font-family: var(--spi-font-display);
  font-size: 10.5px;
  letter-spacing: .26em;
  text-transform: uppercase;
  color: var(--spi-accent);
  padding-bottom: 10px;
}

/* a glossary entry can be split into titled groups (motion terminology
   carries three metrics, each with its own column set) */
.spi-gloss-group { display: flex; flex-direction: column; gap: 10px; }
.spi-gloss-group + .spi-gloss-group { margin-top: 34px; }

.spi-gloss-group-title {
  margin: 0;
  font-family: var(--spi-font-display);
  font-weight: 700;
  font-size: 19px;
  line-height: 1.2;
  color: var(--portal-ink);
}

.spi-gloss-group-intro {
  margin: 0 0 6px;
  max-width: 720px;
  font-size: 14.5px;
  line-height: 1.55;
  color: var(--spi-text-muted);
}

@media (max-width: 820px) {
  /* stack every cell; the inline grid-template-columns is overridden here */
  .spi-gloss-row { grid-template-columns: 1fr !important; gap: 4px; }
  .spi-gloss-row.is-head { display: none; }
  .spi-gloss-row { padding: 14px 0; }
}

.spi-gloss-term {
  font-family: var(--spi-font-display);
  font-weight: 600;
  font-size: 15px;
  letter-spacing: .03em;
  text-transform: uppercase;
  color: var(--portal-ink);
}

.spi-gloss-note { color: var(--portal-ink-2); }

/* label above a card title */
.spi-card-label {
  font-family: var(--spi-font-display);
  font-size: 11px;
  letter-spacing: .3em;
  color: var(--spi-accent);
  text-transform: uppercase;
}

/* big stat value inside a card (SHAPE OF MOTION → "Skid-Flip") */
.spi-card-figure {
  font-family: var(--spi-font-display);
  font-weight: 700;
  font-size: 34px;
  line-height: 1;
  text-transform: uppercase;
  font-style: normal;
  font-weight: 900;
  color: var(--portal-pink);
}

.spi-card-subhead {
  font-family: var(--spi-font-display);
  font-weight: 600;
  font-size: 19px;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--portal-ink);
}

.spi-card-subhead.is-pink { color: var(--portal-pink); letter-spacing: .05em; font-size: 18px; }

/* ---------------------------------------------------------
   TICK LIST / TAG
--------------------------------------------------------- */
.ui-list li { color: var(--spi-text-muted); font-size: 14.5px; border-bottom-color: var(--spi-border); }
.ui-list li strong { color: var(--portal-ink); }

.spi-tag {
  background: transparent;
  border-color: var(--spi-border);
  color: var(--spi-gray-600);
  font-family: var(--spi-font-display);
  letter-spacing: .14em;
  border-radius: 0;
  text-transform: uppercase;
}

/* ---------------------------------------------------------
   ACCORDION — the Portal ball guide
--------------------------------------------------------- */
.spi-accordion { max-width: none; margin: 0; gap: 14px; }

.spi-accordion details {
  background: var(--portal-panel);
  border: 1px solid var(--spi-border);
  border-bottom: 1px solid var(--spi-border);
}

/* The whole row is the control: the summary fills the card edge to edge, and
   nothing inside it swallows the click (the title stretches to fill the empty
   space, and the chevron is a ::after so it cannot be a separate target). */
.spi-accordion summary {
  padding: 26px 30px;
  gap: 22px;
  font-size: 23px;
  letter-spacing: .03em;
  color: var(--portal-ink);
  width: 100%;
  box-sizing: border-box;
  cursor: pointer;
  user-select: none;
  -webkit-tap-highlight-color: transparent;
}

.spi-accordion summary * { pointer-events: none; }

.spi-accordion summary:hover { background: #161119; color: var(--portal-ink); }

.spi-accordion summary::after {
  border-right: 2px solid var(--spi-accent);
  border-bottom: 2px solid var(--spi-accent);
  width: 8px; height: 8px;
}

.spi-accordion-num {
  font-family: var(--spi-font-display);
  font-size: 11px;
  letter-spacing: .26em;
  color: var(--spi-accent);
  width: 26px;
  flex-shrink: 0;
}

.spi-accordion summary .spi-accordion-title { flex: 1; }

.spi-accordion .spi-accordion-body {
  border-top: 1px solid var(--spi-border);
  padding: 34px 30px 38px;
  animation: portalPanelIn .26s ease;
}

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

/* ---------------------------------------------------------
   STAT PANEL — spec-by-weight cards
--------------------------------------------------------- */
.ui-card.is-spec {
  background: linear-gradient(180deg, #1c0d13 0%, #140a0f 100%);
  border-color: #33161f;
  padding: 30px 26px 32px;
}

.spi-stat { text-align: left; padding: 0; }

.spi-stat-num { color: #fff; font-size: 40px; font-style: normal; font-weight: 900; }
.spi-stat-num small { font-size: 24px; color: var(--portal-ink-2); font-style: normal; }

.spi-stat-caption { color: var(--spi-accent); letter-spacing: .28em; font-size: 10.5px; font-family: var(--spi-font-display); }

.spi-stat-rows { display: flex; flex-direction: column; gap: 16px; margin-top: 26px; }
.spi-stat-row { display: flex; flex-direction: column; gap: 3px; }
.spi-stat-row b {
  font-family: var(--spi-font-display);
  font-weight: 500;
  font-size: 26px;
  line-height: 1;
  color: var(--portal-ink);
}

/* ---------------------------------------------------------
   PORTAL GLOW + BALL  (hero and arsenal card)
--------------------------------------------------------- */
.portal-hero { display: flex; flex-direction: column; align-items: center; padding-bottom: 90px; }

.portal-stage {
  position: relative;
  width: 1265px;
  max-width: 100%;
  aspect-ratio: 1840 / 1620;
  margin-top: 8px;
  /* .portal-hero-copy is pulled up with a -30% margin, which shortens the hero
     while the stage keeps its aspect-ratio height — so the stage box hangs
     ~180px past the section and sits invisibly on top of the ball guide,
     swallowing clicks on the accordion. Nothing in here is interactive (the
     SVG is aria-hidden and the ball is decorative), so let clicks pass. */
  pointer-events: none;
}

.portal-stage svg {
  position: absolute; left: 0; top: 0;
  width: 100%; display: block;
  pointer-events: none;
  will-change: opacity;
  animation: portalGlowPulse 5.5s ease-in-out 3s infinite;
}

/* wrapper carries a static feathered mask whose edge sits on the ring;
   only the ball's transform/opacity animate, so the reveal composites */
.portal-ball-clip {
  position: absolute;
  left: 50%; top: 12.9%;
  width: 23.6%;
  aspect-ratio: 1 / 2;
  transform: translateX(-50%);
  pointer-events: none;
  -webkit-mask-image: linear-gradient(to bottom, #000 0, #000 51%, transparent 60%);
  mask-image: linear-gradient(to bottom, #000 0, #000 51%, transparent 60%);
}

.portal-ball-clip img {
  position: absolute; left: 0; top: 0;
  /* height:auto is required — the tag carries width/height attributes for CLS,
     and without this the attribute height is used literally and the ball
     stretches into an egg. */
  width: 100%; height: auto; display: block;
  will-change: transform, opacity;
  animation: portalBallRise .8s 2.05s cubic-bezier(.14, .92, .26, 1) both;
}

.portal-hero-copy {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 26px;
  text-align: center;
  margin-top: -30%;
}

.portal-hero-copy .spi-body { max-width: 660px; }

@keyframes portalGlowPulse { 0%, 100% { opacity: .93; } 50% { opacity: 1; } }

/* transform is declared ONLY at 0% and 100% on purpose. CSS applies the timing
   function to each keyframe segment separately, so intermediate transform stops
   made the ball brake to a near-stop at 14% and again at 30% — a three-beat
   stutter on the way up. One segment = one continuous ease-out. Opacity keeps
   its own stops; it resolves early so the ball reads as lit by the portal, and
   stepping opacity is not visible as motion. */
@keyframes portalBallRise {
  0% { opacity: 0; transform: translateY(104%); }
  14% { opacity: .8; }
  30% { opacity: 1; }
  100% { opacity: 1; transform: translateY(0); }
}

/* static (non-animating) portal composition inside a card image slot */
.spi-card-rec-img.is-portal { background: var(--portal-bg); align-items: flex-end; }

.portal-mini {
  position: absolute;
  left: 50%; top: -8px;
  transform: translateX(-50%);
  width: 378px;
  aspect-ratio: 1840 / 1620;
  pointer-events: none;
}

.portal-mini img.is-glow { position: absolute; left: 0; top: 0; width: 100%; display: block; }
.portal-mini img.is-ball { position: absolute; left: 50%; top: 12.9%; transform: translateX(-50%); width: 23.6%; display: block; }

/* ---------------------------------------------------------
   CORE ROTATOR
--------------------------------------------------------- */
/* overflow-x: the decorative bloom below is 1100px wide and would push a
   horizontal scrollbar on narrow viewports. Clipping it is invisible on
   desktop, where the bloom already fits inside the section. */
.portal-core-section { position: relative; overflow: hidden; }

.portal-core-section::before {
  content: "";
  position: absolute;
  left: 50%; top: 40px;
  transform: translateX(-50%);
  width: 1100px; height: 640px;
  background: radial-gradient(ellipse 46% 44% at 50% 50%, rgba(232, 0, 92, .12), rgba(232, 0, 92, 0) 70%);
  pointer-events: none;
}

.portal-core-split { position: relative; gap: 64px; }
.portal-core-split > * { flex: 1 1 0; }

.portal-core-stage {
  display: flex;
  justify-content: center;
  cursor: grab;
  user-select: none;
  touch-action: pan-y;
}

.portal-core-stage.is-dragging { cursor: grabbing; }

.portal-core-frame { width: min(440px, 100%); aspect-ratio: 1 / 1; position: relative; }

.portal-core-frame img {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: contain;
  display: block;
  filter: drop-shadow(0 24px 48px rgba(0, 0, 0, .6));
}

.portal-core-copy { display: flex; flex-direction: column; gap: 20px; }
.portal-core-copy .spi-body { max-width: 44ch; font-size: 17px; line-height: 1.65; }

/* ---------------------------------------------------------
   CTA + FOOTER
--------------------------------------------------------- */
.portal-cta {
  border-top: 1px solid #17131b;
  text-align: center;
  background: radial-gradient(ellipse 50% 120% at 50% 100%, rgba(232, 0, 92, .14), rgba(232, 0, 92, 0) 70%);
  padding-top: 80px;
  padding-bottom: 96px;
}

.portal-cta .spi-body { max-width: 540px; margin: 24px auto; }

.portal-footer {
  border-top: 1px solid #17131b;
  padding: 28px 40px;
  display: flex;
  justify-content: space-between;
  font-family: var(--spi-font-display);
  font-size: 10.5px;
  letter-spacing: .26em;
  text-transform: uppercase;
  color: #5c565a;
}

.spi-footnote { font-size: 13px; color: var(--portal-dim); letter-spacing: .04em; margin-top: 40px; }

/* =========================================================
   NOT YET IN BASE
   These two components have no neutral definition in
   portal-base-style.css yet — structure is declared here for
   now and should be promoted to the base file, leaving only
   the color/skin rules behind.
   ========================================================= */

/* --- 5-up grid (companion to base .spi-grid-2/3/4) --- */
.spi-grid-5 { grid-template-columns: repeat(5, 1fr); }
@media (max-width: 1100px) { .spi-grid-5 { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 700px) { .spi-grid-5 { grid-template-columns: repeat(2, 1fr); } }

/* --- Inline tag row under a section title --- */
.spi-legend-tags { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 6px; }

/* --- Icon spec strip (icon over label over value) --- */
.spi-spec-strip {
  display: flex;
  flex-wrap: wrap;
  gap: 56px;
  margin-bottom: 48px;
}

.spi-spec-item {
  display: flex;
  align-items: center;
  gap: 16px;
}

.spi-spec-item img { height: 86px; width: auto; display: block; }

.spi-spec-text { display: flex; flex-direction: column; gap: 4px; }

.spi-spec-item .spi-stat-caption { letter-spacing: .26em; }

.spi-spec-value {
  font-family: var(--spi-font-display);
  font-weight: 500;
  font-size: 17px;
  line-height: 1.1;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--portal-ink);
}

@media (max-width: 700px) { .spi-spec-strip { gap: 28px 32px; } }

/* --- Feature card without artwork ---------------------------------
   The learn cards are flat images in the comp. Those exports were not in
   the handoff, so `.is-flat` gives the same card a dark ground and centres
   its text. Delete this rule once real <img> artwork is dropped in. */
.spi-card-feature.is-flat {
  background: linear-gradient(180deg, #16191c 0%, #0d1013 100%);
  align-items: center;
  justify-content: center;
  text-align: center;
  transition: transform .2s ease;
}

.spi-card-feature.is-flat::after { content: none; }
.spi-card-feature.is-flat:hover { transform: translateY(-3px); }

.spi-card-feature.is-flat .spi-card-feature-content { padding: 40px 32px; }

.spi-card-feature.is-flat .spi-h3 {
  color: #fff;
  text-transform: uppercase;
  letter-spacing: .02em;
  font-size: 22px;
  line-height: 1.25;
}

.spi-feature-sub {
  margin: 14px 0 0;
  font-family: var(--spi-font-display);
  font-size: 11px;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: #7f8f95;
}

/* --- Segmented meter (reaction profile) ---
   One meter per row at every width. Two-up put unrelated scales side by side,
   so the eye read across the pair instead of down the list. */
.spi-meter-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 16px;
}

.spi-meter { display: flex; flex-direction: column; gap: 12px; }

.spi-meter-label {
  font-family: var(--spi-font-display);
  font-weight: 600;
  font-size: 19px;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--portal-ink);
}

.spi-meter-track { display: flex; gap: 3px; height: 16px; }

.spi-meter-seg { flex: 1; border: 1px solid var(--spi-border); background: #120e16; }

.spi-meter-seg.is-on {
  border-color: rgba(232, 0, 92, .6);
  background: var(--portal-pink);
  box-shadow: 0 0 16px rgba(232, 0, 92, .3);
}

.spi-meter-scale {
  display: flex;
  justify-content: space-between;
  font-family: var(--spi-font-display);
  font-size: 10px;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--portal-dim);
}

/* --- Modal / lightbox --- */
.spi-modal {
  position: fixed; inset: 0;
  z-index: 50;
  display: flex;
  align-items: flex-start;
  justify-content: center;
  padding: 56px 24px;
  overflow: auto;
  background: rgba(4, 3, 6, .86);
  backdrop-filter: blur(6px);
  /* base-web-style.css ships its own .spi-modal that sits at opacity:0 until a
     .is-open class is added. portal.js never adds that class, and portalOvIn
     has fill-mode:none, so the overlay faded in and then snapped back to the
     inherited 0 - invisible, but still fixed and swallowing every click.
     Pin the resting value; the keyframe still handles the fade. */
  opacity: 1;
  animation: portalOvIn .2s ease;
}

.spi-modal-shell {
  position: relative;
  width: 100%;
  max-width: 1120px;
  background: var(--portal-panel);
  border: 1px solid #2a2130;
  box-shadow: 0 40px 120px rgba(232, 0, 92, .14);
  animation: portalShIn .32s cubic-bezier(.2, .7, .2, 1);
}

.spi-modal-close {
  position: absolute; top: 18px; right: 18px;
  z-index: 2;
  width: 40px; height: 40px;
  background: none;
  border: 1px solid #35293c;
  color: var(--spi-text-muted);
  font-size: 18px;
  line-height: 1;
  cursor: pointer;
}

.spi-modal-close:hover { border-color: var(--spi-accent); color: var(--spi-accent); }

.spi-modal-head { padding: 44px 48px 0; }

.spi-modal-head .spi-h3 {
  font-weight: 500;
  font-size: 22px;
  letter-spacing: .02em;
  margin-top: 14px;
}

.spi-modal-body {
  display: grid;
  grid-template-columns: 1.35fr 1fr;
  gap: 36px;
  padding: 28px 48px 40px;
}

.spi-modal-media {
  background: radial-gradient(circle at 50% 45%, #171120, var(--portal-bg));
  border: 1px solid var(--spi-border);
  min-height: 340px;
  position: relative;
  overflow: hidden;
  display: flex;
  align-items: center;
  justify-content: center;
}

.spi-modal-media img { max-width: 74%; max-height: 300px; display: block; }

.spi-modal-media figcaption {
  position: absolute; bottom: 16px; left: 18px;
  font-family: var(--spi-font-display);
  font-size: 10px;
  letter-spacing: .24em;
  text-transform: uppercase;
  color: var(--portal-dim);
}

.spi-modal-foot {
  border-top: 1px solid var(--spi-border);
  background: #0c0910;
  padding: 40px 48px 48px;
  display: grid;
  grid-template-columns: 1fr 1.25fr;
  gap: 40px;
  align-items: start;
}

.spi-modal-foot .spi-h2 { font-size: clamp(26px, 2.6vw, 36px); line-height: 1.02; }
.spi-modal-foot div { display: flex; flex-direction: column; gap: 16px; }

/* stepped disclosure list inside the modal */
.spi-steps { display: flex; flex-direction: column; gap: 10px; }

.spi-step {
  text-align: left;
  background: #141019;
  border: 1px solid var(--spi-border);
  border-left: 2px solid var(--spi-border);
  padding: 16px 18px;
  cursor: pointer;
  display: flex;
  flex-direction: column;
  gap: 5px;
  font-family: var(--spi-font-body);
  transition: border-color .18s, background .18s;
}

.spi-step:hover { border-color: var(--spi-gray-400); }

.spi-step.active {
  border-left-color: var(--portal-pink);
  background: #191320;
  box-shadow: 0 0 34px rgba(232, 0, 92, .12) inset;
}

.spi-step-num { font-family: var(--spi-font-display); font-size: 10px; letter-spacing: .26em; color: var(--spi-accent); }

.spi-step-title {
  font-family: var(--spi-font-display);
  font-size: 17px;
  letter-spacing: .02em;
  text-transform: uppercase;
  color: var(--portal-ink);
}

/* bodies stay mounted for every step; only the active one shows, so
   switching steps is a class toggle rather than a re-render */
.spi-step:not(.active) .spi-step-body { display: none; }

.spi-step-body { font-size: 14.5px; line-height: 1.6; color: var(--spi-text-muted); margin-top: 4px; text-wrap: pretty; }

@keyframes portalOvIn { from { opacity: 0; } to { opacity: 1; } }
@keyframes portalShIn {
  from { opacity: 0; transform: translateY(24px) scale(.985); }
  to { opacity: 1; transform: none; }
}

@media (max-width: 900px) {
  .spi-modal-body, .spi-modal-foot { grid-template-columns: 1fr; }
  .spi-meter-grid { grid-template-columns: 1fr; }
}

/* Spec strip. Equal 1fr columns read as uneven here because the items are not
   equal: FLARE is 111px of content, CORE TYPE is 205px. Each sat left-aligned
   in a 197px column, so the gaps the eye actually sees ran 12px to 106px and
   CORE TYPE overflowed its track. Columns hug their content instead and
   space-between shares out the slack, which evens those optical gaps.
   Six across needs ~1144px of strip; below that it goes 3 x 2 rather than
   orphaning the sixth item. */
@media (min-width: 1100px) {
  .spi-spec-strip {
    display: grid;
    grid-template-columns: repeat(3, max-content);
    justify-content: space-between;
    gap: 28px 20px;
    align-items: center;
  }
  .spi-spec-item { gap: 12px; }
  .spi-spec-item img { height: 74px; }
  .spi-spec-value { font-size: 16px; }
}

@media (min-width: 1240px) {
  .spi-spec-strip { grid-template-columns: repeat(6, max-content); gap: 20px; }
}

/* =========================================================
   MOBILE
   ---------------------------------------------------------
   Portal-specific responsive work. The base file already
   collapses its own grids (.spi-grid-3/-4 and .spi-split);
   what follows is the skin's own: display type that has to
   scale below the desktop clamp floor, the generous desktop
   padding that eats a 375px viewport, tap-target heights,
   and the components declared in this file.
   ========================================================= */

/* --- tablet and down ------------------------------------ */
@media (max-width: 820px) {
  .spi-spec-strip { gap: 26px 24px; margin-bottom: 36px; }

  .spi-modal { padding: 24px 12px; }
  .spi-modal-head { padding: 34px 24px 0; }
  .spi-gloss-body { padding: 20px 24px 30px; max-height: 70vh; }
  .spi-modal-body { padding: 22px 24px 30px; gap: 24px; }
  .spi-modal-foot { padding: 28px 24px 34px; gap: 22px; }
  .spi-modal-close { top: 14px; right: 14px; }
}

/* --- phones --------------------------------------------- */
@media (max-width: 600px) {
  /* Display type: the desktop clamp floors at 44px, which is wider
     than a 375px viewport can carry. Re-clamp against vw instead. */
  .spi-h1 { font-size: clamp(30px, 8.4vw, 44px); line-height: 1; }
  .spi-h2 { font-size: clamp(24px, 6.4vw, 32px); }
  .spi-h3 { font-size: 21px; }
  .spi-body-lg { font-size: 16px; }

  /* Sections carry 110-130px of bottom padding on desktop. */
  .spi-section-padded { padding-bottom: 64px; }
  .spi-section-header { margin-bottom: 24px; }

  .portal-hero { padding: 12px 16px 56px; }
  .portal-hero-copy { gap: 18px; }

  /* Every tappable control clears the 44px minimum. */
  .btn { min-height: 44px; display: inline-flex; align-items: center; justify-content: center; }

  /* Accordion: reclaim the 30px side padding for content. */
  .spi-accordion summary { padding: 18px 16px; gap: 12px; font-size: 18px; }
  .spi-accordion-num { width: auto; min-width: 20px; }
  .spi-accordion-body { padding: 22px 16px 26px; }

  .ui-card { padding: 22px 18px 24px; }
  .spi-card-rec-body { padding: 22px 18px 24px; }
  .spi-card-rec { min-height: 0; }
  .spi-card-article-body { padding: 18px 18px 22px; }

  /* Spec strip: an even 2-up reads better than ragged wrapping. */
  .spi-spec-strip {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 22px 14px;
    margin-bottom: 32px;
  }
  .spi-spec-item { gap: 10px; }
  .spi-spec-item img { height: 62px; }
  .spi-spec-value { font-size: 15px; }

  .spi-meter-track { height: 14px; gap: 2px; }
  .spi-meter-label { font-size: 16px; }
  .spi-meter-scale { font-size: 9px; letter-spacing: .14em; }
  .spi-meter-grid { gap: 30px; }

  .ui-card.is-spec { padding: 22px 18px 24px; }
  .spi-stat-num { font-size: 34px; }
  .spi-stat-rows { gap: 12px; margin-top: 18px; }

  .portal-core-split { gap: 34px; }
  .portal-core-copy .spi-body { font-size: 16px; }

  .portal-cta { padding: 56px 16px 64px; }
  .portal-footer { padding: 22px 16px; gap: 12px; font-size: 9.5px; letter-spacing: .18em; }

  .spi-base-scope { padding-top: 48px; padding-bottom: 48px; }
  .spi-card-feature { min-height: 200px; }
  .spi-card-feature.is-flat .spi-h3 { font-size: 19px; }
  .spi-card-feature.is-flat .spi-card-feature-content { padding: 28px 22px; }

  .spi-modal { padding: 12px 8px; }
  .spi-modal-head { padding: 26px 18px 0; }
  .spi-gloss-body { padding: 16px 18px 24px; max-height: 74vh; }
  .spi-modal-body { padding: 18px 18px 24px; }
  .spi-modal-foot { padding: 24px 18px 28px; }
  .spi-gloss-group + .spi-gloss-group { margin-top: 26px; }
  .spi-gloss-group-title { font-size: 17px; }
  .spi-step { padding: 14px 14px; }
}

/* --- very narrow ---------------------------------------- */
@media (max-width: 380px) {
  .spi-spec-strip { grid-template-columns: 1fr; gap: 16px; }
  .spi-grid-5 { grid-template-columns: 1fr; }
  .spi-meter-track { gap: 2px; }
}

/* ---------------------------------------------------------
   BASE-STYLE ESCAPE HATCH
   .spi-base-scope opts a section out of the Portal skin and
   back onto the plain base system (shared SPI content, etc.)
--------------------------------------------------------- */
.spi-base-scope {
  --spi-white: #ffffff;
  --spi-black: #191c1b;
  --spi-gray-100: #f7f7f7;
  --spi-gray-200: #ececec;
  --spi-gray-300: #d9d9d9;
  --spi-gray-400: #b3b3b3;
  --spi-gray-600: #6b6b6b;
  --spi-text-muted: rgba(25, 28, 27, 0.65);
  --spi-border: #e2e2e2;
  --spi-accent: #191c1b;
  --spi-radius-sm: 8px;
  --spi-radius-md: 16px;
  --spi-radius-lg: 20px;
  --spi-font-body: 'Roboto', system-ui, sans-serif;
  --spi-font-display: 'Oswald', sans-serif;
  color: var(--spi-black);
  font-family: var(--spi-font-body);
  padding-top: 72px;
  padding-bottom: 72px;
}

.spi-base-scope .spi-h1,
.spi-base-scope .spi-h2,
.spi-base-scope .spi-h3 { font-style: normal; color: var(--spi-black); letter-spacing: .02em; }
.spi-base-scope .spi-h1 { font-size: 40px; line-height: 1.1; }
.spi-base-scope .spi-h2 { font-size: 28px; line-height: 1.1; }
.spi-base-scope .spi-h3 { font-size: 18px; font-weight: 700; line-height: 1.2; }

.spi-base-scope .spi-eyebrow {
  font-family: var(--spi-font-body);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: .08em;
  color: var(--spi-text-muted);
}

.spi-base-scope .spi-section-header { gap: 8px; margin-bottom: 28px; }

.spi-base-scope .spi-card-feature { aspect-ratio: 16 / 10; min-height: 0; }
.spi-base-scope .spi-card-feature-content { padding: 20px 24px; }

.spi-base-scope .btn {
  font-family: var(--spi-font-body);
  font-size: 14px;
  font-weight: 600;
  text-transform: none;
  letter-spacing: normal;
  padding: 12px 28px;
}

.spi-base-scope .btn.default {
  border: 2px solid #191c1b !important;
  background: #fafdfa !important;
  color: #191c1b !important;
  box-shadow: 0 4px 16px rgba(0, 0, 0, .18) !important;
  border-radius: 6px;
}

.spi-base-scope .btn.default:hover {
  transform: translateY(-2px);
  border: 2px solid #191c1b !important;
  background: #fafdfa !important;
  color: #191c1b !important;
  box-shadow: 0 1px 2px 3px rgba(0, 0, 0, .08) !important;
}

.spi-base-scope a { color: var(--spi-black); }

/* --- video inside a technology modal -------------------------------
   Sits in the same figure the still used, so the frame does not change
   size when a card has a clip instead of an image. */
.spi-modal-video {
  width: 100%;
  max-width: 100%;
  max-height: 420px;
  display: block;
  background: #08070a;
  object-fit: contain;
}

/* --- CMS header, hidden on scroll ----------------------------------
   The host template's header is sticky and 209px tall, which eats a
   third of the viewport on this page. Slide it away once the reader
   leaves the top and bring it straight back when they return.
   `.portal-header-hidden` is set on <html> by portal.js. */
.header-container {
  transition: transform .28s ease, box-shadow .28s ease;
  will-change: transform;
}

.portal-header-hidden .header-container {
  transform: translateY(-100%);
  box-shadow: none;
  pointer-events: none;
}

@media (prefers-reduced-motion: reduce) {
  .header-container { transition: none; }
}

/* === CMS HARDENING (generated by harden-css.py) === */
/* The host CMS marks typography rules !important, which beats both
   stylesheets. Every value below is the one already declared above — this
   only re-asserts it so the page keeps its own typography when embedded.
   Generated: do not hand-edit. Change the real rule, then re-run
   `python3 harden-css.py`. */

.btn { font-family: var(--spi-font-display) !important; font-size: 12px !important; font-weight: 400 !important; letter-spacing: .22em !important; text-transform: uppercase !important; }
.btn.default { color: var(--spi-accent) !important; }
.btn.default.active { color: #191c1b !important; }
.btn.default:hover { color: #0b0910 !important; }
.btn.is-solid { color: #0b0910 !important; }
.portal-core-copy .spi-body { font-size: 17px !important; line-height: 1.65 !important; }
.portal-footer { color: #5c565a !important; font-family: var(--spi-font-display) !important; font-size: 10.5px !important; letter-spacing: .26em !important; text-transform: uppercase !important; }
.portal-page, .portal-footer { color: var(--portal-ink) !important; }
.spi-accent-text { color: var(--spi-accent) !important; }
.spi-accordion summary { color: var(--portal-ink) !important; font-family: var(--spi-font-display) !important; font-size: 23px !important; font-weight: 600 !important; letter-spacing: .03em !important; text-transform: uppercase !important; }
.spi-accordion summary:hover { color: var(--portal-ink) !important; }
.spi-accordion-num { color: var(--spi-accent) !important; font-family: var(--spi-font-display) !important; font-size: 11px !important; letter-spacing: .26em !important; }
.spi-base-scope { color: var(--spi-black) !important; font-family: var(--spi-font-body) !important; }
.spi-base-scope .btn { font-family: var(--spi-font-body) !important; font-size: 14px !important; font-weight: 600 !important; letter-spacing: normal !important; text-transform: none !important; }
.spi-base-scope .btn.default { color: #191c1b !important; }
.spi-base-scope .btn.default:hover { color: #191c1b !important; }
.spi-base-scope .spi-eyebrow { color: var(--spi-text-muted) !important; font-family: var(--spi-font-body) !important; font-size: 12px !important; font-weight: 600 !important; letter-spacing: .08em !important; }
.spi-base-scope .spi-h1 { font-size: 40px !important; line-height: 1.1 !important; }
.spi-base-scope .spi-h1, .spi-base-scope .spi-h2, .spi-base-scope .spi-h3 { color: var(--spi-black) !important; font-style: normal !important; letter-spacing: .02em !important; }
.spi-base-scope .spi-h2 { font-size: 28px !important; line-height: 1.1 !important; }
.spi-base-scope .spi-h3 { font-size: 18px !important; font-weight: 700 !important; line-height: 1.2 !important; }
.spi-base-scope a { color: var(--spi-black) !important; }
.spi-body { color: var(--spi-text-muted) !important; font-family: var(--spi-font-body) !important; font-size: 16px !important; line-height: 1.62 !important; }
.spi-body-lg { font-size: 17.5px !important; line-height: 1.62 !important; }
.spi-card-article { color: inherit !important; }
.spi-card-article-body h4 { color: var(--portal-ink) !important; font-family: var(--spi-font-display) !important; font-size: 17px !important; font-weight: 600 !important; letter-spacing: .02em !important; line-height: 1.35 !important; text-transform: none !important; }
.spi-card-article-link { color: inherit !important; }
.spi-card-article:hover { color: inherit !important; }
.spi-card-article:hover h4 { color: var(--spi-accent) !important; }
.spi-card-category span { color: #fff !important; font-size: 14px !important; font-weight: 600 !important; }
.spi-card-feature-content { color: #fff !important; }
.spi-card-feature-content h3 { color: #fff !important; }
.spi-card-feature.is-flat .spi-h3 { color: #fff !important; font-size: 22px !important; letter-spacing: .02em !important; line-height: 1.25 !important; text-transform: uppercase !important; }
.spi-card-figure { color: var(--portal-pink) !important; font-family: var(--spi-font-display) !important; font-size: 34px !important; font-style: normal !important; font-weight: 700 !important; line-height: 1 !important; text-transform: uppercase !important; }
.spi-card-label { color: var(--spi-accent) !important; font-family: var(--spi-font-display) !important; font-size: 11px !important; letter-spacing: .3em !important; text-transform: uppercase !important; }
.spi-card-learning-body h4 { font-size: 14px !important; font-weight: 700 !important; }
.spi-card-nav-content { color: #fff !important; }
.spi-card-nav-content h3 { color: #fff !important; }
.spi-card-product-body h4 { font-size: 13px !important; font-weight: 600 !important; }
.spi-card-product-body span { color: var(--spi-text-muted) !important; font-size: 12px !important; }
.spi-card-rec-body dd { color: var(--spi-text-muted) !important; font-size: 13px !important; }
.spi-card-rec-body dt { font-size: 12px !important; font-weight: 700 !important; letter-spacing: 0.03em !important; text-transform: uppercase !important; }
.spi-card-severity .spi-sev-icon { color: var(--sev) !important; }
.spi-card-severity .spi-sev-label { color: var(--sev) !important; font-size: 11px !important; font-weight: 700 !important; letter-spacing: 0.12em !important; text-transform: uppercase !important; }
.spi-card-subhead { color: var(--portal-ink) !important; font-family: var(--spi-font-display) !important; font-size: 19px !important; font-weight: 600 !important; letter-spacing: .04em !important; text-transform: uppercase !important; }
.spi-card-subhead.is-pink { color: var(--portal-pink) !important; font-size: 18px !important; letter-spacing: .05em !important; }
.spi-chip { color: var(--spi-black) !important; font-size: 12px !important; font-weight: 600 !important; }
.spi-chip button { color: var(--spi-text-muted) !important; font-size: 13px !important; line-height: 1 !important; }
.spi-eyebrow { color: var(--spi-accent) !important; font-family: var(--spi-font-display) !important; font-size: 11.5px !important; font-weight: 400 !important; letter-spacing: .32em !important; text-transform: uppercase !important; }
.spi-feature-sub { color: #7f8f95 !important; font-family: var(--spi-font-display) !important; font-size: 11px !important; letter-spacing: .16em !important; text-transform: uppercase !important; }
.spi-footnote { color: var(--portal-dim) !important; font-size: 13px !important; letter-spacing: .04em !important; }
.spi-gloss-group-intro { color: var(--spi-text-muted) !important; font-size: 14.5px !important; line-height: 1.55 !important; }
.spi-gloss-group-title { color: var(--portal-ink) !important; font-family: var(--spi-font-display) !important; font-size: 19px !important; font-weight: 700 !important; line-height: 1.2 !important; }
.spi-gloss-note { color: var(--portal-ink-2) !important; }
.spi-gloss-row { color: var(--portal-ink-2) !important; font-size: 14.5px !important; line-height: 1.55 !important; }
.spi-gloss-row.is-head { color: var(--spi-accent) !important; font-family: var(--spi-font-display) !important; font-size: 10.5px !important; letter-spacing: .26em !important; text-transform: uppercase !important; }
.spi-gloss-tab { color: var(--portal-dim) !important; font-family: var(--spi-font-display) !important; font-size: 12px !important; letter-spacing: .2em !important; text-transform: uppercase !important; }
.spi-gloss-tab.is-on { color: var(--spi-accent) !important; }
.spi-gloss-tab:hover { color: var(--portal-ink) !important; }
.spi-gloss-term { color: var(--portal-ink) !important; font-family: var(--spi-font-display) !important; font-size: 15px !important; font-weight: 600 !important; letter-spacing: .03em !important; text-transform: uppercase !important; }
.spi-h1 { font-size: clamp(44px, 6vw, 82px) !important; line-height: .95 !important; }
.spi-h1, .spi-h2, .spi-h3 { color: var(--portal-ink) !important; font-family: var(--spi-font-display) !important; font-style: normal !important; font-weight: 900 !important; letter-spacing: 0.02em !important; text-transform: uppercase !important; }
.spi-h2 { font-size: clamp(30px, 3.6vw, 44px) !important; line-height: 1.04 !important; }
.spi-h3 { font-size: 28px !important; font-weight: 900 !important; line-height: 1.1 !important; }
.spi-legend span { color: var(--spi-text-muted) !important; font-size: 12px !important; font-weight: 600 !important; letter-spacing: 0.08em !important; text-transform: uppercase !important; }
.spi-meta { color: var(--portal-ink-2) !important; font-size: 14.5px !important; line-height: 1.6 !important; }
.spi-meter-label { color: var(--portal-ink) !important; font-family: var(--spi-font-display) !important; font-size: 19px !important; font-weight: 600 !important; letter-spacing: .06em !important; text-transform: uppercase !important; }
.spi-meter-scale { color: var(--portal-dim) !important; font-family: var(--spi-font-display) !important; font-size: 10px !important; letter-spacing: .22em !important; text-transform: uppercase !important; }
.spi-modal-close { color: var(--spi-text-muted) !important; font-size: 18px !important; line-height: 1 !important; }
.spi-modal-close:hover { color: var(--spi-accent) !important; }
.spi-modal-foot .spi-h2 { font-size: clamp(26px, 2.6vw, 36px) !important; line-height: 1.02 !important; }
.spi-modal-head .spi-h3 { font-size: 22px !important; font-weight: 500 !important; letter-spacing: .02em !important; }
.spi-modal-media figcaption { color: var(--portal-dim) !important; font-family: var(--spi-font-display) !important; font-size: 10px !important; letter-spacing: .24em !important; text-transform: uppercase !important; }
.spi-quote { color: var(--spi-accent) !important; font-size: 19px !important; font-style: italic !important; line-height: 1.6 !important; }
.spi-read-time { color: var(--spi-accent) !important; font-family: var(--spi-font-display) !important; font-size: 10px !important; letter-spacing: .22em !important; }
.spi-scale-label { color: var(--spi-text-muted) !important; font-size: 12px !important; font-weight: 600 !important; letter-spacing: 0.04em !important; }
.spi-spec-item .spi-stat-caption { letter-spacing: .26em !important; }
.spi-spec-value { color: var(--portal-ink) !important; font-family: var(--spi-font-display) !important; font-size: 17px !important; font-weight: 500 !important; letter-spacing: .04em !important; line-height: 1.1 !important; text-transform: uppercase !important; }
.spi-stat-caption { color: var(--spi-accent) !important; font-family: var(--spi-font-display) !important; font-size: 10.5px !important; letter-spacing: .28em !important; text-transform: uppercase !important; }
.spi-stat-num { color: #fff !important; font-family: var(--spi-font-display) !important; font-size: 40px !important; font-style: normal !important; font-weight: 900 !important; line-height: 1 !important; }
.spi-stat-num small { color: var(--portal-ink-2) !important; font-size: 24px !important; font-style: normal !important; }
.spi-stat-row b { color: var(--portal-ink) !important; font-family: var(--spi-font-display) !important; font-size: 26px !important; font-weight: 500 !important; line-height: 1 !important; }
.spi-step { font-family: var(--spi-font-body) !important; }
.spi-step-body { color: var(--spi-text-muted) !important; font-size: 14.5px !important; line-height: 1.6 !important; }
.spi-step-num { color: var(--spi-accent) !important; font-family: var(--spi-font-display) !important; font-size: 10px !important; letter-spacing: .26em !important; }
.spi-step-title { color: var(--portal-ink) !important; font-family: var(--spi-font-display) !important; font-size: 17px !important; letter-spacing: .02em !important; text-transform: uppercase !important; }
.spi-tag { color: var(--spi-gray-600) !important; font-family: var(--spi-font-display) !important; font-size: 11px !important; font-weight: 400 !important; letter-spacing: .14em !important; line-height: 1 !important; text-transform: uppercase !important; }
.spi-tag.accent { color: var(--spi-accent) !important; }
.spi-time { color: #fff !important; font-size: 12px !important; letter-spacing: 0.04em !important; }
.spi-toggle button { color: var(--spi-text-muted) !important; font-family: var(--spi-font-body) !important; font-size: 13px !important; font-weight: 600 !important; }
.spi-toggle button.active { color: var(--spi-white) !important; }
.spi-toggle button:hover { color: var(--spi-black) !important; }
.spi-video-title { color: var(--spi-black) !important; font-size: 13px !important; font-weight: 600 !important; letter-spacing: 0.04em !important; line-height: 1.45 !important; }
.ui-card .spi-h3 { color: var(--portal-ink) !important; }
.ui-list li { color: var(--spi-text-muted) !important; font-size: 14.5px !important; line-height: 1.6 !important; }
.ui-list li strong { color: var(--portal-ink) !important; font-weight: 700 !important; }

@media(max-width: 1024px) {
  .btn { font-size: 10px !important; font-weight: 700 !important; letter-spacing: 0.1px !important; line-height: 20px !important; }
}

@media(max-width: 768px) {
  .spi-h1 { font-size: 26px !important; }
  .spi-h2 { font-size: 20px !important; }
  .spi-h3 { font-size: 16px !important; }
}

@media(max-width: 600px) {
  .portal-core-copy .spi-body { font-size: 16px !important; }
  .portal-footer { font-size: 9.5px !important; letter-spacing: .18em !important; }
  .spi-accordion summary { font-size: 18px !important; }
  .spi-body-lg { font-size: 16px !important; }
  .spi-card-feature.is-flat .spi-h3 { font-size: 19px !important; }
  .spi-gloss-group-title { font-size: 17px !important; }
  .spi-h1 { font-size: clamp(30px, 8.4vw, 44px) !important; line-height: 1 !important; }
  .spi-h2 { font-size: clamp(24px, 6.4vw, 32px) !important; }
  .spi-h3 { font-size: 21px !important; }
  .spi-meter-label { font-size: 16px !important; }
  .spi-meter-scale { font-size: 9px !important; letter-spacing: .14em !important; }
  .spi-spec-value { font-size: 15px !important; }
  .spi-stat-num { font-size: 34px !important; }
}

@media(min-width: 1100px) {
  .spi-spec-value { font-size: 16px !important; }
}
