/* Candidate Portal front end. Every rule is scoped under .ccp-portal so it does not change the theme.
   Design: polling-place signage. Sign yellow, black and white; one teal for text links; party colours only as small marks.
   Phone first: find a race (county, search, list by level), then read it by candidate or by topic.
   From 1100px the race list is a rail on the left and the comparison a table on the right.
   Fonts: nothing is loaded from other servers. Archivo and Atkinson Hyperlegible Next are used when the theme provides them. */
.ccp-portal {
  --bg: #f0f1f2;
  --paper: #ffffff;
  --pm-ink: #ffffff;
  --on-ink: #ffd400; /* the accent on a reversed (ink) field */
  --band: #f0f1f2;
  --ink: #111111;
  --muted: #4a4f55;
  --rule: #c8cbce;
  --sign: #ffd400;
  --sign-ink: #111111;
  --accent: #005a6b;
  --pending: #f0f1f2;
  --rep: #b23a3a; --dem: #2f5ea8; --lib: #8a5f00; --grn: #2e7d32; --np: #5d6368;
  --display: Archivo, "Arial Narrow", "Helvetica Neue", Arial, sans-serif;
  --body: "Atkinson Hyperlegible Next", system-ui, -apple-system, "Segoe UI", sans-serif;
  --i-arrow: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M2 9h11V3l9 9-9 9v-6H2z'/%3E%3C/svg%3E");
  --i-search: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='10' cy='10' r='6.5' fill='none' stroke='%23000' stroke-width='3'/%3E%3Cpath d='M15 15l6.5 6.5' fill='none' stroke='%23000' stroke-width='3.5'/%3E%3C/svg%3E");
  --i-check: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M3.5 12.5l6 6L20.5 6' fill='none' stroke='%23000' stroke-width='4'/%3E%3C/svg%3E");
  --i-cross: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M5 5l14 14M19 5L5 19' fill='none' stroke='%23000' stroke-width='4'/%3E%3C/svg%3E");
  --i-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M4 8.5l8 8 8-8' fill='none' stroke='%23000' stroke-width='4'/%3E%3C/svg%3E");
  color-scheme: light;
}
@media (prefers-color-scheme: dark) { .ccp-portal[data-theme="auto"] {
  --bg: #111111; --paper: #1b1c1e; --band: #232528; --ink: #f4f4f2; --muted: #b4b8bd; --rule: #43474c;
  --accent: #7fd6e4; --pending: #232528;
  --rep: #f08a84; --dem: #8fb4f2; --lib: #cfa26a; --grn: #8fd08a; --np: #b4b8bd; --pm-ink: #111111; --on-ink: #111111; color-scheme: dark } }
.ccp-portal[data-theme="dark"] {
  --bg: #111111; --paper: #1b1c1e; --band: #232528; --ink: #f4f4f2; --muted: #b4b8bd; --rule: #43474c;
  --accent: #7fd6e4; --pending: #232528;
  --rep: #f08a84; --dem: #8fb4f2; --lib: #cfa26a; --grn: #8fd08a; --np: #b4b8bd; --pm-ink: #111111; --on-ink: #111111; color-scheme: dark }

.ccp-portal, .ccp-portal *, .ccp-portal *::before, .ccp-portal *::after { box-sizing: border-box }
.ccp-portal { background: var(--bg); color: var(--ink); font: 400 16px/1.5 var(--body); text-align: left; width: 100%; max-width: none;
  -webkit-text-size-adjust: 100%; font-variant-numeric: lining-nums }
.ccp-portal .wrap { max-width: 1440px; margin: 0 auto; padding: 0 }
.ccp-portal a { color: var(--accent); box-shadow: none; text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 0.18em }
.ccp-portal a:hover { color: var(--ink); text-decoration-thickness: 2px }
.ccp-portal :focus-visible { outline: 3px solid var(--ink); outline-offset: 2px; border-radius: 2px }
.ccp-portal ::selection { background: var(--sign); color: var(--sign-ink) }

/* Keep theme styles for common elements out of the comparison. */
.ccp-portal ul { list-style: disc outside; margin: 0; padding: 0 0 0 20px }
.ccp-portal li { margin: 0; padding: 0; font-size: inherit; line-height: inherit; list-style: inherit }
.ccp-portal li::before { content: none }
.ccp-portal li::marker { color: var(--muted) }
.ccp-portal p { font-size: inherit; line-height: inherit; margin: 0 }
.ccp-portal dl, .ccp-portal dt, .ccp-portal dd { margin: 0; padding: 0; border: 0; float: none; width: auto }
.ccp-portal strong { font-weight: 700; color: inherit }
.ccp-portal label { margin: 0 }
.ccp-portal img { max-width: none; margin: 0; padding: 0; border: 0; border-radius: 0; box-shadow: none }
.ccp-portal button { font: inherit; color: inherit; margin: 0; min-height: 0; height: auto; width: auto; box-shadow: none; text-transform: none; letter-spacing: normal; text-decoration: none; cursor: pointer }
.ccp-portal [hidden] { display: none !important }
.ccp-portal .ccp-h1, .ccp-portal .ccp-h2, .ccp-portal .ccp-h3 { margin: 0; padding: 0; border: 0; color: var(--ink); text-wrap: balance }
.ccp-portal .ccp-h1::before, .ccp-portal .ccp-h1::after, .ccp-portal .ccp-h2::before, .ccp-portal .ccp-h2::after { content: none }

/* Small sign lettering: row labels, group names, chips. */
.ccp-portal .pick-label, .ccp-portal .label, .ccp-portal .card dt, .ccp-portal .topic-label, .ccp-portal .tb-head,
.ccp-portal .group-name, .ccp-portal .chip, .ccp-portal .inc, .ccp-portal .viewby-label {
  font: 750 0.8125rem/1.3 var(--display); font-stretch: 88%; letter-spacing: 0.05em; text-transform: uppercase }

/* Drawn icons (one block arrow, one stroke weight for the rest). */
.ccp-portal .ico { display: inline-block; flex: none; width: 1em; height: 1em; background: currentColor;
  -webkit-mask: var(--i-arrow) center / contain no-repeat; mask: var(--i-arrow) center / contain no-repeat }
.ccp-portal .ico.back { transform: scaleX(-1) }
.ccp-portal .ico.check { -webkit-mask-image: var(--i-check); mask-image: var(--i-check) }

/* ---------- Finder: the sign you start at ---------- */

.ccp-portal .finder { background: var(--sign); color: var(--sign-ink); border-radius: 10px; padding: 22px 20px 24px;
  box-shadow: inset 0 0 0 4px var(--sign), inset 0 0 0 6px var(--sign-ink) }
.ccp-portal .finder-fields { display: grid; gap: 16px }
.ccp-portal .pick { display: grid; gap: 6px; min-width: 0 }
.ccp-portal .pick-label { display: block; color: var(--sign-ink) }
.ccp-portal .select-wrap, .ccp-portal .search-wrap { position: relative; min-width: 0 }
.ccp-portal .select-wrap::after { content: ""; position: absolute; right: 16px; top: 50%; width: 16px; height: 16px; margin-top: -8px; pointer-events: none;
  background: #111; -webkit-mask: var(--i-chevron) center / contain no-repeat; mask: var(--i-chevron) center / contain no-repeat }
.ccp-portal .search-wrap::before { content: ""; position: absolute; left: 15px; top: 50%; width: 20px; height: 20px; margin-top: -10px; pointer-events: none;
  background: #111; -webkit-mask: var(--i-search) center / contain no-repeat; mask: var(--i-search) center / contain no-repeat }
.ccp-portal .finder select, .ccp-portal .finder input[type="search"] { display: block; width: 100%; max-width: none; height: 54px; min-height: 0; margin: 0;
  appearance: none; -webkit-appearance: none; font: 600 1.0625rem/1.2 var(--body); color: #111; background: #fff; background-image: none;
  border: 2px solid #111; border-radius: 6px; box-shadow: none; text-transform: none; letter-spacing: normal; caret-color: #111 }
.ccp-portal .finder select { padding: 0 46px 0 14px; cursor: pointer; text-overflow: ellipsis }
.ccp-portal .finder input[type="search"] { padding: 0 48px 0 46px }
.ccp-portal .finder input[type="search"]::placeholder { color: #4a4f55; font-weight: 400; opacity: 1 }
.ccp-portal .finder input[type="search"]::-webkit-search-cancel-button, .ccp-portal .finder input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; display: none }
.ccp-portal .finder select:hover, .ccp-portal .finder input[type="search"]:hover { background: #fffbe0 }
.ccp-portal .finder select:focus-visible, .ccp-portal .finder input[type="search"]:focus-visible { outline: 3px solid #111; outline-offset: 2px; background: #fff }
.ccp-portal .search-clear { position: absolute; right: 5px; top: 5px; width: 44px; height: 44px; padding: 0; border: 0; border-radius: 4px; background: transparent; color: #111;
  display: grid; place-items: center }
.ccp-portal .search-clear::before { content: ""; width: 16px; height: 16px; background: currentColor; -webkit-mask: var(--i-cross) center / contain no-repeat; mask: var(--i-cross) center / contain no-repeat }
.ccp-portal .search-clear:hover { background: #111; color: var(--sign) }

/* ---------- Body: race list and comparison ---------- */

.ccp-portal .ccp-body { margin-top: 24px; display: grid; grid-template-columns: minmax(0, 1fr); gap: 32px; align-items: start }
.ccp-portal .rail, .ccp-portal .ccp-view { min-width: 0 }
.ccp-portal .rail { display: flex; flex-direction: column }
/* The list and the comparison are white working surfaces on the grey field; on phones they run edge to edge. */
.ccp-portal .rail, .ccp-portal .ccp-view { background: var(--paper); padding: 20px 16px; margin-inline: -16px }
.ccp-portal[data-mode="list"] .ccp-view { display: none }
.ccp-portal[data-mode="race"] .rail { display: none }
/* Phones: the three fields are stacked, each the full width. */

.ccp-portal .rail-title { font: 800 1.5rem/1.1 var(--display); font-stretch: 85%; letter-spacing: -0.005em }
.ccp-portal .rail-count { margin-top: 6px; color: var(--muted); font-size: 0.9375rem }
.ccp-portal .finder .meta { margin-top: 8px; font-size: 0.9375rem; line-height: 1.45; color: #3d3300; max-width: 70ch }
.ccp-portal .finder .meta a { color: var(--sign-ink) }
/* The sample ballot and the voting locations are buttons in their own right: black on the yellow sign, at every width and above an open race. */
.ccp-portal .finder .finder-links { display: flex; flex-wrap: wrap; column-gap: 12px }
.ccp-portal .finder a.ballot-link { display: inline-flex; align-items: center; gap: 10px; margin-top: 16px; min-height: 48px; padding: 0 20px; border: 2px solid #111; border-radius: 6px;
  background: #111; color: var(--sign); font: 700 1rem/1.2 var(--display); font-stretch: 92%; letter-spacing: 0.01em; text-decoration: none }
.ccp-portal .finder a.ballot-link:hover { background: #fff; color: #111 }
.ccp-portal .finder a.ballot-link:focus-visible { outline: 3px solid #111; outline-offset: 3px }
.ccp-portal .finder .ballot-note { margin: 10px 0 0; font-size: 1rem; line-height: 1.4; font-weight: 600; color: var(--sign-ink); max-width: 60ch }
.ccp-portal .finder .ballot-note a { color: var(--sign-ink); text-decoration: underline; text-decoration-thickness: 2px; text-underline-offset: 0.15em }
.ccp-portal .finder .ballot-note + .meta { margin-top: 10px }
.ccp-portal .ballot-link::before { content: ""; flex: none; width: 16px; height: 16px; background: currentColor; transform: rotate(90deg);
  -webkit-mask: var(--i-arrow) center / contain no-repeat; mask: var(--i-arrow) center / contain no-repeat }
.ccp-portal .ballot-link:not([download])::before { transform: rotate(-45deg) }

/* Jump to a level */
/* It stays at the top of the list while you scroll, so any level is one tap away from anywhere. */
.ccp-portal .levels { position: sticky; top: 0; z-index: 2; margin-top: 10px; padding: 8px 0; background: var(--paper); display: flex; flex-wrap: wrap; gap: 8px }
.ccp-portal .levels:empty { display: none }
.ccp-portal .levels button { display: inline-flex; align-items: baseline; gap: 6px; padding: 9px 12px; min-height: 44px; border: 2px solid var(--ink); border-radius: 6px;
  background: var(--paper); color: var(--ink); font: 750 0.875rem/1.2 var(--display); font-stretch: 88%; letter-spacing: 0.04em; text-transform: uppercase }
.ccp-portal .levels button span { font: 400 0.8125rem/1.2 var(--body); letter-spacing: 0; color: var(--muted) }
.ccp-portal .levels button:hover { background: var(--ink); color: var(--bg) }
.ccp-portal .levels button:hover span { color: inherit }

.ccp-portal .race-list { margin-top: 8px }
.ccp-portal .group { padding-top: 12px; scroll-margin-top: 64px }
.ccp-portal .group-name:focus-visible { outline-offset: 2px }
.ccp-portal .group-name:focus { outline: 0 }
.ccp-portal .group-name:focus-visible { outline: 3px solid var(--ink) }
.ccp-portal .group-name { margin: 0; padding: 9px 12px 8px; border-radius: 4px; background: var(--ink); color: var(--bg); font-size: 0.9375rem; display: flex; justify-content: space-between; align-items: baseline; gap: 12px }
.ccp-portal .group-name span { font: 400 0.8125rem/1.3 var(--body); letter-spacing: 0; text-transform: none; color: var(--on-ink) }
.ccp-portal .group ul { list-style: none; margin: 0; padding: 0 }
.ccp-portal .group li { border-bottom: 1px solid var(--rule) }
.ccp-portal a.race-row { position: relative; display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 2px 14px; align-items: center; padding: 14px 8px 14px 0;
  color: var(--ink); text-decoration: none; min-height: 56px }
.ccp-portal .race-office { font: 700 1.0625rem/1.25 var(--display); font-stretch: 92% }
.ccp-portal .race-where { display: block; font: 400 0.875rem/1.35 var(--body); color: var(--muted) }
.ccp-portal .race-cands { grid-column: 1; display: flex; flex-wrap: wrap; gap: 2px 12px; margin-top: 3px; font-size: 0.875rem; line-height: 1.4; color: var(--muted) }
.ccp-portal .race-cands > span { display: inline-flex; align-items: center; gap: 5px; white-space: nowrap }
/* Party mark: colour and the party's initial, never colour alone. */
.ccp-portal .pm { flex: none; display: inline-grid; place-items: center; width: 15px; height: 15px; border-radius: 3px; background: var(--pc, var(--np)); color: var(--pm-ink);
  font: 800 10px/1 var(--display); font-style: normal; letter-spacing: 0; text-transform: uppercase }
.ccp-portal .race-go { grid-column: 2; grid-row: 1 / span 2; width: 34px; height: 34px; border-radius: 6px; background: var(--sign); color: var(--sign-ink); display: grid; place-items: center; font-size: 16px }
.ccp-portal .race-flags { white-space: nowrap; display: inline-flex; gap: 6px; align-items: center; margin-left: 8px; vertical-align: 0.1em }
.ccp-portal .seen { display: inline-grid; place-items: center; width: 16px; height: 16px; border-radius: 50%; background: var(--ink); color: var(--bg); font-size: 9px }
.ccp-portal .race-flags .last { font: 750 0.6875rem/1 var(--display); font-stretch: 88%; letter-spacing: 0.05em; text-transform: uppercase; padding: 3px 6px 2px; border-radius: 3px; background: var(--sign); color: var(--sign-ink) }
.ccp-portal a.race-row:hover .race-office { text-decoration: underline; text-decoration-thickness: 2px; text-underline-offset: 0.15em }
.ccp-portal a.race-row:hover .race-go { background: var(--ink); color: var(--on-ink) }
.ccp-portal a.race-row:focus-visible { outline-offset: -3px }
.ccp-portal .no-match { margin-top: 20px; padding: 20px 0; border-top: 3px solid var(--ink); font-size: 1.0625rem }
.ccp-portal .no-match button { display: block; margin-top: 12px; padding: 0; border: 0; background: none; color: var(--accent); font-weight: 600; text-decoration: underline; text-underline-offset: 0.18em }

/* ---------- One race ---------- */

.ccp-portal .back { display: inline-flex; align-items: center; gap: 10px; min-height: 44px; margin: 0 0 12px; font: 700 0.9375rem/1.2 var(--display); font-stretch: 92%;
  color: var(--ink); text-decoration: none }
.ccp-portal .back .ico { font-size: 15px }
.ccp-portal .back:hover span:last-child { text-decoration: underline; text-decoration-thickness: 2px; text-underline-offset: 0.15em }

.ccp-portal .race-head { display: flex; flex-wrap: wrap; gap: 16px 24px; align-items: flex-end; justify-content: space-between; padding-bottom: 18px; border-bottom: 4px solid var(--ink) }
.ccp-portal .race-head .title { display: grid; gap: 6px; min-width: 0 }
.ccp-portal .race-head .ccp-h2 { order: 1; font: 850 clamp(1.75rem, 1.3rem + 2.2vw, 2.75rem)/1 var(--display); font-stretch: 78%; letter-spacing: 0; text-transform: uppercase }
.ccp-portal .race-head .ccp-h2 a { color: inherit; text-decoration-thickness: 2px }
.ccp-portal .race-head .where { order: 2; font-size: 1rem; color: var(--muted) }
.ccp-portal .chips { order: 3; display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px }
.ccp-portal .chip { display: inline-flex; align-items: center; gap: 6px; font-size: 0.75rem; line-height: 1; padding: 6px 8px 5px; border-radius: 4px; border: 1.5px solid var(--ink); color: var(--ink); background: transparent }
.ccp-portal .chip.ok { background: var(--ink); color: var(--bg) }
.ccp-portal .chip.ok::before { content: ""; width: 11px; height: 11px; background: var(--on-ink); -webkit-mask: var(--i-check) center / contain no-repeat; mask: var(--i-check) center / contain no-repeat }

/* Compare by candidate or by topic (phones, and races with many candidates) */
.ccp-portal .viewby { display: flex; align-items: center; gap: 10px; flex-wrap: wrap }
.ccp-portal .viewby-label { color: var(--muted); font-size: 0.75rem }
.ccp-portal .seg { display: inline-flex; gap: 2px; background: var(--ink); border: 2px solid var(--ink); border-radius: 6px; overflow: hidden }
.ccp-portal .seg button { padding: 0 16px; min-height: 44px; border: 0; border-radius: 0; background: var(--paper); color: var(--ink); font: 750 0.875rem/1 var(--display); font-stretch: 88%; letter-spacing: 0.04em; text-transform: uppercase }
.ccp-portal .seg button[aria-pressed="true"] { background: var(--ink); color: var(--bg) }
.ccp-portal .seg button:not([aria-pressed="true"]):hover { background: var(--sign); color: var(--sign-ink) }
.ccp-portal .seg button:focus-visible { outline-offset: -5px; outline-color: var(--sign) }

.ccp-portal .stepper { display: flex; gap: 8px }
.ccp-portal .stepper button, .ccp-portal .stepper a { display: inline-flex; align-items: center; justify-content: center; gap: 8px; min-height: 44px; padding: 0 14px; border: 2px solid var(--ink); border-radius: 6px;
  background: var(--paper); color: var(--ink); font: 750 0.875rem/1 var(--display); font-stretch: 88%; letter-spacing: 0.04em; text-transform: uppercase; text-decoration: none }
.ccp-portal .stepper .ico { font-size: 13px }
.ccp-portal .stepper button:not(:disabled):hover, .ccp-portal .stepper a:hover { background: var(--ink); color: var(--on-ink) }
.ccp-portal .stepper button:disabled { opacity: 0.35; cursor: default }

/* Jump to a candidate (phones, by candidate) */
.ccp-portal .jump { display: flex; flex-wrap: wrap; gap: 6px 8px; margin-top: 16px }
.ccp-portal .jump a { display: inline-flex; align-items: center; gap: 7px; min-height: 44px; padding: 0 12px; border: 1.5px solid var(--ink); border-radius: 20px; color: var(--ink); text-decoration: none; font-weight: 600; font-size: 0.9375rem }
.ccp-portal .jump a:hover { background: var(--ink); color: var(--bg) }

/* Candidate identity: the same block for everyone */
.ccp-portal .cand-name { margin: 0; padding: 0; color: var(--ink); font: 800 1.375rem/1.1 var(--display); font-stretch: 90%; letter-spacing: 0; text-transform: none; overflow-wrap: break-word }
.ccp-portal .party { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 7px; font-size: 0.9375rem; font-weight: 600 }
.ccp-portal .party::before { content: ""; width: 12px; height: 12px; border-radius: 3px; background: var(--pc) }
.ccp-portal .inc { font-size: 0.6875rem; line-height: 1; padding: 4px 6px 3px; border: 1.5px solid var(--ink); border-radius: 3px; color: var(--ink) }
.ccp-portal .photo { width: 72px; height: 72px; border-radius: 8px; overflow: hidden; display: grid; place-items: center; background: var(--band); flex: none; padding: 0 }
.ccp-portal a.photo:hover { outline: 3px solid var(--sign); outline-offset: 0 }
.ccp-portal .photo img { width: 100%; height: 100%; object-fit: cover; object-position: center 20%; display: block }
.ccp-portal .initials { font: 800 1.5rem/1 var(--display); font-stretch: 85%; color: var(--muted); letter-spacing: 0.02em }

/* Values */
.ccp-portal .val { font-size: 1rem; line-height: 1.5; overflow-wrap: anywhere }
.ccp-portal .val ul { margin: 0; padding-left: 20px; display: grid; gap: 6px }
.ccp-portal .more { margin-top: 8px; padding: 0; border: 0; background: none }
.ccp-portal .more summary { display: inline-flex; align-items: center; gap: 8px; cursor: pointer; color: var(--accent); font-size: 0.9375rem; font-weight: 600; list-style: none; padding: 6px 0;
  text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 0.18em }
.ccp-portal .more summary::-webkit-details-marker { display: none }
.ccp-portal .more summary::after { content: ""; width: 11px; height: 11px; background: currentColor; -webkit-mask: var(--i-chevron) center / contain no-repeat; mask: var(--i-chevron) center / contain no-repeat }
.ccp-portal .more[open] summary { display: none }
.ccp-portal .more ul { margin-top: 6px }
/* Source links are small type with a finger-sized line: 7px above and below each. */
.ccp-portal .src { margin-top: 4px; font-size: 0.8125rem; line-height: 1.5; color: var(--muted) }
.ccp-portal .src a { display: inline-block; padding: 7px 0 }
.ccp-portal .tb-src { display: inline-block; padding: 7px 0; margin-block: -7px; font-size: 0.8125rem; line-height: 1.5; white-space: nowrap }
.ccp-portal .tb-head { margin: 16px 0 8px; padding-top: 12px; border-top: 1px solid var(--rule); color: var(--ink) }
.ccp-portal .none { color: var(--muted) }
.ccp-portal p.none { margin: 0; padding: 20px 0 }
.ccp-portal .pending { display: inline-block; border: 1.5px dashed var(--muted); border-radius: 4px; padding: 5px 10px; font-size: 0.9375rem; color: var(--muted) }

/* Wide screens: one table, label column plus equal candidate columns */
.ccp-portal .grid { display: none; margin-top: 0; grid-template-columns: 136px repeat(var(--cols), minmax(0, 1fr)); gap: 0; max-width: calc(136px + var(--cols) * 560px); padding: 0 }
/* Each .grow is a table row for assistive technology; for layout its cells sit straight on the grid. */
.ccp-portal .grid > .grow { display: contents }
.ccp-portal .grid > .grow > * { padding: 16px 20px 18px 0; border-bottom: 1px solid var(--rule); min-width: 0; margin: 0 }
.ccp-portal .grid > .grow > .cand-cell { padding-left: 20px; border-left: 1px solid var(--rule) }
.ccp-portal .grid > .grow > .last { border-bottom: 0 }
.ccp-portal .grid .label { color: var(--ink); padding-top: 19px }
.ccp-portal .grid .head { display: grid; gap: 10px; align-content: start; padding-top: 20px; border-bottom: 3px solid var(--ink); position: sticky; top: 0; z-index: 2; background: var(--paper) }
.ccp-portal .grid > .grow:first-child > .label { border-bottom: 3px solid var(--ink); position: sticky; top: 0; z-index: 2; background: var(--paper) }
.ccp-portal .grid .val { font-size: 0.9375rem }

/* Phones: one block per candidate ... */
.ccp-portal .cards { display: grid; gap: 0; margin-top: 4px }
.ccp-portal .card { display: grid; gap: 16px; min-width: 0; margin: 0; padding: 24px 0 28px; border-bottom: 4px solid var(--ink); background: none; box-shadow: none; max-width: none; scroll-margin-top: 12px }
.ccp-portal .card .head { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 6px 16px; align-items: center }
.ccp-portal .card .head .photo { grid-row: span 2 }
.ccp-portal .card .head .cand-name { align-self: end }
.ccp-portal .card .head .party { align-self: start }
.ccp-portal .card dl { margin: 0; display: grid; gap: 0 }
.ccp-portal .card dl > div { padding: 14px 0; border-top: 1px solid var(--rule) }
.ccp-portal .card dt { color: var(--ink) }
.ccp-portal .card dd { margin: 6px 0 0 }

/* ... or one block per topic, every candidate's answer together */
.ccp-portal .topics { display: none; margin-top: 4px }
.ccp-portal .topic { padding: 22px 0 8px; border-bottom: 4px solid var(--ink) }
.ccp-portal .topic-label { margin: 0 0 4px; font-size: 1rem; color: var(--ink) }
.ccp-portal .topic-row { padding: 14px 0; border-top: 1px solid var(--rule) }
.ccp-portal .topic-who { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; font: 750 1rem/1.2 var(--display); font-stretch: 92% }
.ccp-portal .ccp-view[data-by="topic"] .topics { display: block }
.ccp-portal .ccp-view[data-by="topic"] .cards, .ccp-portal .ccp-view[data-by="topic"] .jump { display: none }

/* Phone footer bar: previous, all races, next */
.ccp-portal .stepbar { position: sticky; bottom: 0; z-index: 3; margin: 24px -16px -20px; padding: 10px 16px calc(10px + env(safe-area-inset-bottom, 0px)); background: #111;
  display: grid; grid-template-columns: 1fr auto 1fr; gap: 8px }
.ccp-portal .stepbar button, .ccp-portal .stepbar a { display: inline-flex; align-items: center; justify-content: center; gap: 8px; min-height: 46px; padding: 0 12px; border: 0; border-radius: 6px;
  background: transparent; color: #fff; font: 750 0.875rem/1 var(--display); font-stretch: 88%; letter-spacing: 0.04em; text-transform: uppercase; text-decoration: none }
.ccp-portal .stepbar .ico { font-size: 13px; color: var(--sign) }
.ccp-portal .stepbar a { background: var(--sign); color: var(--sign-ink); padding: 0 16px }
.ccp-portal .stepbar button:first-of-type { justify-content: flex-start }
.ccp-portal .stepbar button:last-of-type { justify-content: flex-end }
.ccp-portal .stepbar button:disabled { opacity: 0.35; cursor: default }
.ccp-portal .stepbar button:not(:disabled):hover { color: var(--sign) }
.ccp-portal .stepbar :focus-visible { outline-color: var(--sign) }

.ccp-portal .race-head .stepper { display: none }
/* Where you are in the list, and what Next leads to. */
.ccp-portal .step-where { display: flex; gap: 4px 14px; align-items: baseline; min-width: 0; font-size: 0.875rem; line-height: 1.3 }
.ccp-portal .pos { flex: none; font: 750 0.8125rem/1.3 var(--display); font-stretch: 88%; letter-spacing: 0.05em; text-transform: uppercase }
.ccp-portal .pos-next { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap }
.ccp-portal .stepbar .step-where { grid-column: 1 / -1; justify-content: space-between; padding: 0 2px 2px; color: #d9dbdd }
.ccp-portal .stepbar .pos { color: #fff }
.ccp-portal .race-head .step-where { align-self: center; margin-right: 6px; max-width: 320px; color: var(--muted) }
.ccp-portal .race-head .pos { color: var(--ink) }

/* Claims and the record, folded behind its heading and a count on phones. */
.ccp-portal .fold { margin: 14px 0 0; padding: 0; border: 0; border-top: 1px solid var(--rule); background: none }
.ccp-portal .fold summary { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 46px; cursor: pointer; list-style: none; color: var(--ink);
  font: 750 0.8125rem/1.3 var(--display); font-stretch: 88%; letter-spacing: 0.05em; text-transform: uppercase }
.ccp-portal .fold summary::-webkit-details-marker { display: none }
.ccp-portal .fold summary::after { content: ""; flex: none; width: 13px; height: 13px; background: currentColor; -webkit-mask: var(--i-chevron) center / contain no-repeat; mask: var(--i-chevron) center / contain no-repeat }
.ccp-portal .fold[open] summary::after { transform: rotate(180deg) }
.ccp-portal .fold ul { margin-bottom: 4px }
.ccp-portal .topic-row > .val > .fold:first-child { margin-top: 0; border-top: 0 }

/* By topic: one block per issue, every candidate's words on it together. */
.ccp-portal .issue { margin-top: 14px; padding: 4px 14px 2px; background: var(--band); border-radius: 6px }
.ccp-portal .issue-name { margin: 0; padding: 12px 0 2px; color: var(--ink); font: 800 1.125rem/1.2 var(--display); font-stretch: 90%; letter-spacing: 0; text-transform: none }
.ccp-portal .issue .topic-row:first-of-type { border-top: 0; padding-top: 8px }

/* Read out, not shown. */
.ccp-portal .ccp-sr { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap }
.ccp-portal .search-status { min-height: 1.3em; margin-top: 2px; font-size: 0.875rem; font-weight: 600; color: var(--sign-ink) }
.ccp-portal .search-status:empty { display: none }

/* [candidate_portal_offices]: the county election offices as a plain table-like list. */
.ccp-portal.ccp-offices { background: none }
.ccp-portal.ccp-offices ul { list-style: none; margin: 0; padding: 0; border-top: 4px solid var(--ink) }
.ccp-portal.ccp-offices li { display: grid; grid-template-columns: minmax(0, 1fr); gap: 2px 24px; padding: 12px 0; border-bottom: 1px solid var(--rule) }
.ccp-portal.ccp-offices li strong { font: 750 1.0625rem/1.35 var(--display); font-stretch: 90% }
.ccp-portal.ccp-offices li span { display: flex; flex-wrap: wrap; gap: 2px 18px }
.ccp-portal.ccp-offices li a { display: inline-block; padding: 5px 0 }
@media (min-width: 560px) { .ccp-portal.ccp-offices li { grid-template-columns: 12rem minmax(0, 1fr); align-items: baseline } }

/* [candidate_portal_counties]: the way in from another page. Counties with every contested race are arrow rows
   under a group bar; every other Texas county (statewide races only) is one select, so 200 names stay compact. */
.ccp-portal.ccp-counties { background: none; display: grid; grid-template-columns: minmax(0, 1fr); gap: 32px }
.ccp-portal.ccp-counties .group { padding-top: 0; min-width: 0 }
.ccp-portal.ccp-counties ul.county-index { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 264px), 1fr)); gap: 0 32px }
.ccp-portal.ccp-counties .county-index li { border-bottom: 1px solid var(--rule) }
.ccp-portal a.county-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 2px 14px; align-items: center; min-height: 72px; padding: 15px 2px 15px 0;
  color: var(--muted); text-decoration: none; font-size: 0.9375rem; line-height: 1.4 }
.ccp-portal .county-name { font: 800 1.3125rem/1.15 var(--display); font-stretch: 88%; color: var(--ink) }
.ccp-portal .county-races { grid-column: 1 }
.ccp-portal a.county-row .race-go { width: 38px; height: 38px; font-size: 18px }
.ccp-portal a.county-row:hover .county-name { text-decoration: underline; text-decoration-thickness: 2px; text-underline-offset: 0.15em }
.ccp-portal a.county-row:hover .race-go { background: var(--ink); color: var(--on-ink) }
.ccp-portal a.county-row:focus-visible { outline-offset: -3px }
.ccp-portal .counties-note { margin-top: 14px; max-width: 62ch; color: var(--muted); font-size: 1rem; line-height: 1.5 }
.ccp-portal .county-jump { margin-top: 16px; display: grid; grid-template-columns: minmax(0, 1fr); gap: 12px; max-width: 640px }
.ccp-portal .county-jump select { display: block; width: 100%; max-width: none; height: 54px; min-height: 0; margin: 0; padding: 0 46px 0 14px;
  appearance: none; -webkit-appearance: none; font: 600 1.0625rem/1.2 var(--body); color: #111; background: #fff; background-image: none;
  border: 2px solid #111; border-radius: 6px; box-shadow: none; text-transform: none; letter-spacing: normal; cursor: pointer; text-overflow: ellipsis }
.ccp-portal .county-jump select:hover { background: #fffbe0 }
.ccp-portal .county-jump select:focus-visible { outline: 3px solid #111; outline-offset: 2px; background: #fff }
.ccp-portal .county-jump .jump-go { display: inline-flex; align-items: center; justify-content: center; gap: 10px; height: 54px; padding: 0 20px; border: 2px solid var(--ink); border-radius: 6px;
  background: var(--paper); color: var(--ink); font: 750 0.875rem/1 var(--display); font-stretch: 88%; letter-spacing: 0.04em; text-transform: uppercase; white-space: nowrap }
.ccp-portal .county-jump .jump-go .ico { font-size: 13px }
.ccp-portal .county-jump .jump-go:hover { background: var(--ink); color: var(--on-ink) }
@media (min-width: 560px) { .ccp-portal .county-jump { grid-template-columns: minmax(0, 1fr) auto; align-items: end } }

.ccp-portal .ccp-footer { margin-top: 32px; padding-top: 16px; border-top: 1px solid var(--rule); font-size: 0.875rem; line-height: 1.55; color: var(--muted); max-width: 90ch }
.ccp-portal .ccp-disclaimer { margin-top: 8px }

/* Separate race and candidate pages (rendered by the server, no script). */
.ccp-portal.ccp-single .race-head { align-items: flex-start }
.ccp-portal.ccp-single .ccp-footer { margin-top: 24px }
.ccp-portal.ccp-single .ccp-links { margin: 20px 0 0; font-size: 1rem }
.ccp-portal.ccp-single-candidate .race-head .ccp-h2 { font-size: clamp(1.375rem, 1.2rem + 0.9vw, 1.75rem) }
.ccp-portal.ccp-single-candidate .card { max-width: 720px }

/* The comparison table needs room: it appears when the comparison itself is at least 700px wide. */
.ccp-portal .ccp-view { container-type: inline-size; container-name: ccpview }
@container ccpview (min-width: 700px) {
  .ccp-portal .ccp-view:not(.many) .grid { display: grid }
  .ccp-portal .ccp-view:not(.many) .cards, .ccp-portal .ccp-view:not(.many) .topics, .ccp-portal .ccp-view:not(.many) .jump, .ccp-portal .ccp-view:not(.many) .viewby { display: none }
  .ccp-portal .ccp-view.many .cards { grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 0 32px }
}

.ccp-portal.ccp-single-candidate .ccp-view .cards { display: grid }
/* Phones: keep the stack above the first race short. */
@media (max-width: 719px) {
  .ccp-portal .finder { padding: 16px 16px 18px }
  .ccp-portal .finder-fields { gap: 12px }
  .ccp-portal .finder select, .ccp-portal .finder input[type="search"] { height: 50px }
  .ccp-portal .finder .finder-links { flex-direction: column }
  .ccp-portal .finder a.ballot-link { margin-top: 12px; display: flex; justify-content: center; text-align: center; padding: 8px 14px }
  .ccp-portal .finder .meta { font-size: 0.875rem }
  .ccp-portal .ccp-body { margin-top: 16px }
  .ccp-portal .rail { padding-top: 16px }
  .ccp-portal .rail-title { font-size: 1.3125rem }
  .ccp-portal .rail-count { margin-top: 4px; font-size: 0.875rem }
  .ccp-portal .levels { gap: 6px; display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr) }
  .ccp-portal .levels button { min-height: 44px; padding: 0 2px; justify-content: center; gap: 4px; font-size: 0.8125rem; letter-spacing: 0.02em }
  .ccp-portal .finder.searching .meta { display: none }
  /* Above an open race the bar is only the three fields, so the race starts high on the screen. */
  .ccp-portal[data-mode="race"] .finder .meta { display: none }
  .ccp-portal[data-mode="race"] .finder { padding: 12px 12px 14px }
  .ccp-portal .race-list { margin-top: 0 }
  .ccp-portal .group { padding-top: 10px }
}
.ccp-portal a.race-row .race-main { min-width: 0 }

@media (min-width: 720px) {
  .ccp-portal .finder { padding: 26px 28px 28px }
  .ccp-portal .finder-fields { grid-template-columns: minmax(180px, 280px) minmax(0, 1fr) minmax(0, 1fr); gap: 20px }
  .ccp-portal .rail, .ccp-portal .ccp-view { margin-inline: 0; padding: 24px; border-radius: 10px }
  .ccp-portal .stepbar { margin: 24px -24px -24px; border-radius: 0 0 10px 10px }
}

/* Wide screens: no side list. The race menu sits in the yellow bar and the comparison takes the full width;
   the list of races takes its place while a search is typed. */
@media (min-width: 1100px) {
  .ccp-portal .ccp-body { margin-top: 32px }
  .ccp-portal[data-mode] .finder { display: block }
  .ccp-portal[data-mode="race"] .ccp-body { margin-top: 32px }
  .ccp-portal .back, .ccp-portal .stepbar { display: none }
  .ccp-portal .race-head .stepper { display: flex }
  .ccp-portal .levels { position: static }
  .ccp-portal .levels button { min-height: 36px; padding: 6px 10px }
  .ccp-portal .group ul { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 40px }
  .ccp-portal .race-go { width: 28px; height: 28px; font-size: 13px }
}

@media (prefers-reduced-motion: no-preference) {
  .ccp-portal .ccp-view > *, .ccp-portal .race-list > * { animation: ccp-in 0.24s cubic-bezier(0.16, 1, 0.3, 1) }
  .ccp-portal .stepbar { animation: none }
  .ccp-portal .race-go .ico, .ccp-portal .stepper .ico, .ccp-portal .stepbar .ico, .ccp-portal .jump-go .ico { transition: transform 0.18s cubic-bezier(0.16, 1, 0.3, 1) }
  .ccp-portal a.county-row:hover .race-go .ico, .ccp-portal .jump-go:hover .ico { transform: translateX(3px) }
  .ccp-portal a.race-row:hover .race-go .ico, .ccp-portal .stepper button:not(:disabled):hover .ico:not(.back), .ccp-portal .stepbar button:not(:disabled):hover .ico:not(.back) { transform: translateX(3px) }
  .ccp-portal .stepper button:not(:disabled):hover .ico.back, .ccp-portal .stepbar button:not(:disabled):hover .ico.back { transform: scaleX(-1) translateX(3px) }
  @keyframes ccp-in { from { opacity: 0.35; transform: translateY(6px) } to { opacity: 1; transform: none } }
}

@media print {
  .ccp-portal .finder, .ccp-portal .rail, .ccp-portal .back, .ccp-portal .stepbar, .ccp-portal .stepper, .ccp-portal .viewby, .ccp-portal .jump { display: none !important }
  .ccp-portal .ccp-view { display: block !important }
  .ccp-portal .grid .head, .ccp-portal .grid > .grow:first-child > .label, .ccp-portal .levels { position: static }
  .ccp-portal .grid > .grow > *, .ccp-portal .card, .ccp-portal .topic-row { break-inside: avoid }
  .ccp-portal .more summary { display: none }
}
