@empoweredvote/ev-ui 0.9.5 → 0.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/RadarChartCore.jsx","../src/useTheme.js","../src/PlaceholderRadar.jsx","../src/tokens.js","../src/Header.jsx","../src/useMediaQuery.js","../src/SiteHeader.jsx","../src/FeedbackButton.jsx","../src/FilterSidebar.jsx","../src/PoliticianCard.jsx","../src/CompassCardHorizontal.jsx","../src/CompassCardHorizontalMeta.jsx","../src/IconOverlay.jsx","../src/icons.js","../src/compassHelpers.js","../src/CompassCardVertical.jsx","../src/CompassKey.jsx","../src/evContext.js","../src/CategorySection.jsx","../src/SubGroupSection.jsx","../src/GovernmentBodySection.jsx","../src/SocialLinks.jsx","../src/IssueTags.jsx","../src/CommitteeTable.jsx","../src/PoliticianProfile.jsx","../src/LegislativeInlineSummary.jsx","../src/JudicialScorecard.jsx","../src/judicialUtils.js","../src/LegislativeRecord.jsx","../src/JudicialRecordDetail.jsx","../src/AuthForm.jsx","../src/TopicTierBadge.jsx","../src/CompassCoverageCallout.jsx","../src/ExpandCompassNudge.jsx","../src/computeTierCoverage.js","../src/useEvContextPromotion.js","../src/StanceAccordion.jsx","../src/Favicon.jsx"],"sourcesContent":["import React from \"react\";\nimport { animated, useSpring } from \"@react-spring/web\";\nimport { useRef, useEffect } from \"react\";\nimport { useTheme } from \"./useTheme\";\n\nexport default function RadarChartCore({\n topics,\n data,\n compareData = {},\n invertedSpokes = {},\n unansweredSpokes = {},\n onToggleInversion = () => {},\n onReplaceTopic = () => {},\n size = 400,\n labelFontSize = 18,\n padding = 80,\n labelOffset = 20,\n tightFit = false,\n maxLabelLines = 2,\n showLabels = true,\n dotRadius = 5,\n}) {\n const { isDark } = useTheme();\n const radius = size / 2 - 40;\n const centerX = size / 2;\n const centerY = size / 2;\n\n const spokes = Object.entries(data);\n const numSpokes = Math.max(spokes.length, 1);\n\n const prevCountRef = useRef(numSpokes);\n const countChanged = numSpokes !== prevCountRef.current;\n useEffect(() => {\n prevCountRef.current = numSpokes;\n }, [numSpokes]);\n\n const pointsArr = spokes.map(([shortTitle, value], index) => {\n const topic = topics.find((t) => t.short_title === shortTitle);\n const max = topic?.stances?.length || 10;\n const pct = Math.min((value / max) * 10, 10);\n const angle = (2 * Math.PI * index) / numSpokes;\n const adjusted =\n value === 0 ? 0 : invertedSpokes[shortTitle] ? 11 - pct : pct;\n const r = (adjusted / 10) * radius;\n const x = centerX + r * Math.sin(angle);\n const y = centerY - r * Math.cos(angle);\n return [x, y];\n });\n\n const targetPoints = pointsArr.map((p) => p.join(\",\")).join(\" \");\n const spring = useSpring({\n to: { points: targetPoints },\n immediate: countChanged,\n reset: countChanged,\n config: { tension: 300, friction: 30 },\n });\n\n const hasCompareData = Object.keys(compareData).length > 0;\n const centerPoints = spokes.map(() => `${centerX},${centerY}`).join(\" \");\n let comparePoints = null;\n let compareCoords = null;\n if (hasCompareData) {\n const ccoords = spokes.map(([shortTitle], index) => {\n const value = compareData[shortTitle] ?? 0;\n const topic = topics.find((t) => t.short_title === shortTitle);\n const max = topic?.stances?.length || 10;\n const pct = Math.min((value / max) * 10, 10);\n const angle = (2 * Math.PI * index) / numSpokes;\n const adjusted =\n value === 0 ? 0 : invertedSpokes[shortTitle] ? 11 - pct : pct;\n const r = (adjusted / 10) * radius;\n const x = centerX + r * Math.sin(angle);\n const y = centerY - r * Math.cos(angle);\n return [x, y];\n });\n compareCoords = ccoords;\n comparePoints = ccoords.map((p) => p.join(\",\")).join(\" \");\n }\n\n // Track whether compareData was present in the previous render.\n // When a new politician is first selected, skip animation so the polygon\n // appears immediately rather than flying in from center.\n const hadCompareDataRef = useRef(false);\n const compareJustAppeared = hasCompareData && !hadCompareDataRef.current;\n useEffect(() => {\n hadCompareDataRef.current = hasCompareData;\n }, [hasCompareData]);\n\n // Animate on shape changes (spoke inversion) but be immediate on new entry\n // or spoke count changes to avoid fly-in artifacts.\n const compareSpring = useSpring({\n to: { points: comparePoints || centerPoints || `${centerX},${centerY}` },\n immediate: countChanged || compareJustAppeared,\n reset: countChanged || compareJustAppeared,\n config: { tension: 300, friction: 30 },\n });\n\n // Pre-compute label metadata for dynamic horizontal padding\n const labelMeta = spokes.map(([shortTitle], i) => {\n const angle = (2 * Math.PI * i) / numSpokes;\n const sinA = Math.sin(angle);\n const side = sinA < -0.1 ? \"left\" : sinA > 0.1 ? \"right\" : \"center\";\n if (!showLabels) return { estimatedWidth: 0, side };\n const baseFSize = labelFontSize;\n const lines = wrapLabel(shortTitle, 12, maxLabelLines);\n const longestLineLen = lines.reduce(\n (max, ln) => (ln.length > max ? ln.length : max),\n 0,\n );\n const fSize = adaptiveFontSize(longestLineLen, baseFSize);\n const estimatedWidth = longestLineLen * fSize * 0.6;\n return { estimatedWidth, side };\n });\n\n const leftLabelWidths = labelMeta\n .filter((m) => m.side === \"left\")\n .map((m) => m.estimatedWidth);\n const rightLabelWidths = labelMeta\n .filter((m) => m.side === \"right\")\n .map((m) => m.estimatedWidth);\n\n // No labels → need only a small margin for dot radius / visual breathing room\n const minPadding = showLabels ? 40 : 10;\n const maxPadding = padding * 2;\n const rawLeftPadding = Math.min(\n Math.max(\n leftLabelWidths.length ? Math.max(...leftLabelWidths) + labelOffset : 0,\n minPadding,\n ),\n maxPadding,\n );\n const rawRightPadding = Math.min(\n Math.max(\n rightLabelWidths.length ? Math.max(...rightLabelWidths) + labelOffset : 0,\n minPadding,\n ),\n maxPadding,\n );\n // Use symmetric padding so the chart center aligns with the SVG center\n const symmetricPadding = Math.max(rawLeftPadding, rawRightPadding);\n const leftPadding = symmetricPadding;\n const rightPadding = symmetricPadding;\n const verticalPadding = padding;\n\n // tightFit: shrink viewBox vertically to actual content extent so sparse-spoke\n // charts (e.g., 3-topic radar) don't render with large empty space below.\n let tightTop = -verticalPadding;\n let tightHeight = size + verticalPadding * 2;\n if (tightFit && numSpokes > 0) {\n let yMin = Infinity, yMax = -Infinity;\n for (let i = 0; i < numSpokes; i++) {\n const angle = (2 * Math.PI * i) / numSpokes;\n const y = centerY - radius * Math.cos(angle);\n if (y < yMin) yMin = y;\n if (y > yMax) yMax = y;\n }\n // Reserve room for label text (or just a small breathing margin when labels are hidden).\n const effLabelFSize = adaptiveFontSize(12, labelFontSize);\n const labelMargin = showLabels\n ? labelOffset + effLabelFSize * 1.1 * maxLabelLines\n : 8;\n tightTop = yMin - labelMargin;\n tightHeight = (yMax + labelMargin) - tightTop;\n }\n\n const guidePolygons = [];\n for (let level = 1; level <= 5; level++) {\n const scale = level / 5;\n const ring = [];\n for (let i = 0; i < numSpokes; i++) {\n const angle = (2 * Math.PI * i) / numSpokes;\n const x = centerX + radius * scale * Math.sin(angle);\n const y = centerY - radius * scale * Math.cos(angle);\n ring.push(`${x},${y}`);\n }\n guidePolygons.push(\n <polygon key={level} points={ring.join(\" \")} fill=\"none\" stroke={isDark ? \"#374151\" : \"#ccc\"} />,\n );\n }\n\n return (\n <svg\n className=\"w-full h-auto max-h-full\"\n viewBox={`-${leftPadding} ${tightTop} ${size + leftPadding + rightPadding} ${tightHeight}`}\n preserveAspectRatio=\"xMidYMid meet\"\n >\n {guidePolygons}\n\n {spokes.map(([shortTitle], i) => {\n const angle = (2 * Math.PI * i) / numSpokes;\n const x = centerX + radius * Math.sin(angle);\n const y = centerY - radius * Math.cos(angle);\n const isUnanswered = !!unansweredSpokes[shortTitle];\n return (\n <line\n key={`line-${shortTitle}`}\n x1={centerX}\n y1={centerY}\n x2={x}\n y2={y}\n stroke={isUnanswered ? (isDark ? \"#6b7280\" : \"#9ca3af\") : (isDark ? \"#d1d5db\" : \"black\")}\n strokeDasharray={isUnanswered ? \"4 3\" : undefined}\n opacity={isUnanswered ? 0.6 : 1}\n />\n );\n })}\n\n {showLabels && spokes.map(([shortTitle], i) => {\n const angle = (2 * Math.PI * i) / numSpokes;\n const anchor =\n angle > Math.PI\n ? \"end\"\n : angle < Math.PI && angle > 0\n ? \"start\"\n : \"middle\";\n\n const cosA = Math.cos(angle);\n const isTop = cosA > 0.5;\n const isBottom = cosA < -0.5;\n const baseFSize = labelFontSize;\n // Single pass wrap at ~12 chars, then pick font size based on longest line\n const lines = wrapLabel(shortTitle, 12, maxLabelLines);\n const longestLine = lines.reduce(\n (max, ln) => (ln.length > max ? ln.length : max),\n 0,\n );\n const fSize = adaptiveFontSize(longestLine, baseFSize);\n const lineHeight = fSize * 1.1;\n const dynamicLabelOffset = lines.length > 1 ? labelOffset + 8 : labelOffset;\n const offset = radius + dynamicLabelOffset;\n const labelX = centerX + offset * Math.sin(angle);\n let labelY = centerY - offset * Math.cos(angle);\n\n // For top labels, shift up so multi-line text grows away from chart\n if (isTop && lines.length > 1) {\n labelY -= (lines.length - 1) * lineHeight;\n }\n // For bottom labels with multiple lines, no shift needed (text grows downward, away from chart)\n\n const isUnansweredLabel = !!unansweredSpokes[shortTitle];\n return (\n <text\n key={`label-${shortTitle}`}\n x={labelX}\n y={labelY}\n textAnchor={anchor}\n dominantBaseline={isBottom ? \"hanging\" : \"auto\"}\n onClick={() => onReplaceTopic(shortTitle)}\n className=\"text-xl font-medium mb-1 md:text-base md:font-normal\"\n fill={isUnansweredLabel ? (isDark ? \"#6b7280\" : \"#9ca3af\") : (isDark ? \"#d1d5db\" : undefined)}\n style={{ cursor: \"pointer\", userSelect: \"none\", fontSize: fSize }}\n >\n {isUnansweredLabel && <title>No stance on file for this topic.</title>}\n {lines.map((ln, idx) => (\n <tspan key={idx} x={labelX} dy={idx === 0 ? \"0\" : `${lineHeight}`}>\n {ln}\n </tspan>\n ))}\n </text>\n );\n })}\n\n {countChanged ? (\n <polygon\n key=\"user-static\"\n points={targetPoints}\n style={{\n fill: \"rgba(124, 107, 158, 0.4)\",\n stroke: \"#7C6B9E\",\n strokeWidth: 3,\n }}\n />\n ) : (\n <animated.polygon\n key=\"user-animated\"\n points={spring.points}\n style={{\n fill: \"rgba(124, 107, 158, 0.4)\",\n stroke: \"#7C6B9E\",\n strokeWidth: 3,\n }}\n />\n )}\n\n {pointsArr.map(([cx, cy], i) => {\n const shortTitle = spokes[i][0];\n const userVal = spokes[i][1];\n if (!userVal || Number(userVal) === 0) return null; // unanswered — don't draw a dot at center\n const compareVal = compareData[shortTitle];\n const matches = hasCompareData\n && userVal !== 0 && compareVal !== 0 && compareVal != null\n && Number(userVal) === Number(compareVal);\n return (\n <circle\n key={`user-dot-${i}`}\n cx={cx}\n cy={cy}\n r={matches ? dotRadius * (8 / 7) : dotRadius}\n fill={matches ? '#fed12e' : '#7C6B9E'}\n stroke={matches ? '#fed12e' : '#7C6B9E'}\n strokeWidth={3}\n />\n );\n })}\n\n {hasCompareData && comparePoints ? (\n countChanged || compareJustAppeared ? (\n <polygon\n key=\"compare-static\"\n points={comparePoints}\n style={{\n fill: \"rgba(90, 154, 110, 0.3)\",\n stroke: \"#5A9A6E\",\n strokeWidth: 2,\n }}\n />\n ) : (\n <animated.polygon\n key=\"compare-animated\"\n points={compareSpring.points}\n style={{\n fill: \"rgba(90, 154, 110, 0.3)\",\n stroke: \"#5A9A6E\",\n strokeWidth: 2,\n }}\n />\n )\n ) : null}\n\n {hasCompareData && compareCoords && compareCoords.map(([cx, cy], i) => {\n const shortTitle = spokes[i][0];\n const userVal = spokes[i][1];\n const compareVal = compareData[shortTitle];\n if (!compareVal || Number(compareVal) === 0) return null; // politician unanswered — skip dot\n const matches = userVal !== 0 && compareVal !== 0 && compareVal != null\n && Number(userVal) === Number(compareVal);\n return (\n <circle\n key={`compare-dot-${i}`}\n cx={cx}\n cy={cy}\n r={matches ? dotRadius * (8 / 7) : dotRadius}\n fill={matches ? '#fed12e' : '#5A9A6E'}\n stroke={matches ? '#fed12e' : '#5A9A6E'}\n strokeWidth={3}\n />\n );\n })}\n\n {spokes.map(([shortTitle], i) => {\n const angle = (2 * Math.PI * i) / numSpokes;\n const x = centerX + radius * Math.sin(angle);\n const y = centerY - radius * Math.cos(angle);\n const isUnansweredHitbox = !!unansweredSpokes[shortTitle];\n return (\n <line\n key={`hitbox-${shortTitle}`}\n x1={centerX}\n y1={centerY}\n x2={x}\n y2={y}\n stroke=\"transparent\"\n strokeWidth={14}\n onClick={() =>\n isUnansweredHitbox\n ? onReplaceTopic(shortTitle)\n : onToggleInversion(shortTitle)\n }\n style={{ cursor: \"pointer\" }}\n />\n );\n })}\n </svg>\n );\n}\n\nfunction adaptiveFontSize(longestLineLen, baseFSize) {\n return Math.max(baseFSize, 10);\n}\n\nfunction wrapLabel(label, maxChars = 12, maxLines = 2) {\n const str = String(label);\n // Split on \"/\" first (handles \"Medicare/Medicaid\" → [\"Medicare/\", \"Medicaid\"])\n let rawWords;\n if (str.includes(\"/\")) {\n rawWords = str.split(\"/\").reduce((acc, segment, idx, arr) => {\n const part = idx < arr.length - 1 ? segment + \"/\" : segment;\n if (part.trim()) acc.push(part.trim());\n return acc;\n }, []);\n } else {\n rawWords = str.split(/\\s+/);\n }\n // Build lines wrapping at maxChars; enforce hard max of 2 lines without truncation\n const lines = [];\n let line = \"\";\n for (const word of rawWords) {\n if (line === \"\") {\n line = word;\n } else if ((line + \" \" + word).length <= maxChars) {\n line += \" \" + word;\n } else {\n lines.push(line);\n line = word;\n }\n }\n if (line) lines.push(line);\n // Enforce max lines: combine any overflow onto the last allowed line\n if (lines.length > maxLines) {\n const overflow = lines.splice(maxLines).join(\" \");\n lines[maxLines - 1] = lines[maxLines - 1] + \" \" + overflow;\n }\n return lines;\n}\n","import { useState, useEffect } from 'react';\n\n/**\n * useTheme — reports whether the host app is in dark mode.\n *\n * Dark mode is OPT-IN: a consumer signals it by adding a `dark` class or a\n * `data-theme=\"dark\"` attribute to the document root (or <body>). This mirrors\n * the opt-in `darkMode` prop on PoliticianProfile/SocialLinks (which defaults to\n * false) so a light-themed consumer never gets dark chart colors unexpectedly.\n *\n * Deliberately does NOT read `prefers-color-scheme` — a user's OS dark setting\n * should not override a consumer app that is rendering a light UI.\n *\n * SSR-safe: returns { isDark: false } when there's no document.\n *\n * @returns {{ isDark: boolean }}\n */\nexport function useTheme() {\n const read = () => {\n if (typeof document === 'undefined') return false;\n const root = document.documentElement;\n const body = document.body;\n const hasDarkClass = (el) => el && el.classList && el.classList.contains('dark');\n const hasDarkAttr = (el) => el && el.getAttribute && el.getAttribute('data-theme') === 'dark';\n return hasDarkClass(root) || hasDarkAttr(root) || hasDarkClass(body) || hasDarkAttr(body);\n };\n\n const [isDark, setIsDark] = useState(read);\n\n useEffect(() => {\n if (typeof document === 'undefined' || typeof MutationObserver === 'undefined') return;\n const update = () => setIsDark(read());\n update();\n const observer = new MutationObserver(update);\n const opts = { attributes: true, attributeFilter: ['class', 'data-theme'] };\n observer.observe(document.documentElement, opts);\n if (document.body) observer.observe(document.body, opts);\n return () => observer.disconnect();\n }, []);\n\n return { isDark };\n}\n\nexport default useTheme;\n","import React from 'react';\nimport { colorScales, borderRadius } from './tokens';\n\nexport default function PlaceholderRadar({ size = 250, name = '', darkMode = false }) {\n const cx = size / 2;\n const cy = size / 2;\n const r = (size / 2) * 0.65;\n const n = 8;\n\n // Surface + stroke tuned per theme so the ghost radar reads on either a white\n // card or the essentials ev-navy-card dark surface.\n const surface = darkMode ? '#1e2a3a' : colorScales.teal['050'];\n const stroke = darkMode ? 'rgba(255,255,255,0.22)' : colorScales.gray['200'];\n\n const vertices = Array.from({ length: n }, (_, i) => {\n const a = (2 * Math.PI * i) / n;\n return [cx + r * Math.sin(a), cy - r * Math.cos(a)];\n });\n\n const outerPts = vertices.map(([x, y]) => `${x},${y}`).join(' ');\n const midPts = vertices.map(([x, y]) => `${cx + (x - cx) * 0.6},${cy + (y - cy) * 0.6}`).join(' ');\n const innerPts = vertices.map(([x, y]) => `${cx + (x - cx) * 0.3},${cy + (y - cy) * 0.3}`).join(' ');\n\n return (\n <svg\n width={size}\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n role=\"img\"\n aria-label={name ? `${name} — compass data unavailable` : 'compass data unavailable'}\n style={{\n backgroundColor: surface,\n borderRadius: borderRadius.sm,\n flexShrink: 0,\n }}\n >\n {/* Spokes from center to each vertex */}\n {vertices.map(([x, y], i) => (\n <line\n key={i}\n x1={cx} y1={cy} x2={x} y2={y}\n stroke={stroke}\n strokeWidth=\"1\"\n strokeDasharray=\"2 3\"\n opacity=\"0.6\"\n />\n ))}\n {/* Inner ring (30%) */}\n <polygon\n points={innerPts}\n fill=\"none\"\n stroke={stroke}\n strokeWidth=\"1\"\n strokeDasharray=\"2 3\"\n opacity=\"0.5\"\n />\n {/* Mid ring (60%) */}\n <polygon\n points={midPts}\n fill=\"none\"\n stroke={stroke}\n strokeWidth=\"1\"\n strokeDasharray=\"3 3\"\n opacity=\"0.6\"\n />\n {/* Outer ring (100%) */}\n <polygon\n points={outerPts}\n fill=\"none\"\n stroke={stroke}\n strokeWidth=\"1.5\"\n strokeDasharray=\"4 3\"\n />\n </svg>\n );\n}\n","/**\n * Empowered Vote Design Tokens\n * Single source of truth for the EV design system.\n * Synced to Penpot via /sync-design-tokens\n *\n * WCAG AA compliance notes:\n * Brand colors have limited contrast on white backgrounds.\n * Use the `accessibleText` map below for body-text alternatives\n * that pass AA (4.5:1) while staying on-brand.\n *\n * Brand color | On white | AA-safe text alternative\n * ───────────────── | ──────── | ────────────────────────\n * Coral #FF5740 | 3.14:1 | coral-700 #E61B00 (4.64:1)\n * Muted Blue #00657C | 6.66:1 | (already AA — use directly)\n * Light Blue #59B0C4 | 2.49:1 | skyblue-700 #327E8F (4.65:1)\n * Yellow #FED12E | 1.46:1 | yellow-900 #7B640E (5.72:1)\n *\n * Coral is AA for large text only (>=18px bold or >=24px).\n * Yellow and Light Blue should never be used as text on white.\n */\n\n// ──────────────────────────────────────────────\n// Color Scales (050–950 per hue)\n// ──────────────────────────────────────────────\n\nexport const colorScales = {\n coral: {\n '050': '#FAF6F5', '100': '#F6E6E4', '200': '#F2C6C0', '300': '#F2988C',\n '400': '#F66855', '500': '#FF5740', '600': '#FF2B0F', '700': '#E61B00',\n '800': '#B31D09', '900': '#8E1F10', '950': '#6C1E13',\n },\n teal: {\n // Smoothed scale — original 400→500 had a ~45 lightness jump.\n // 400 now bridges the light wash into the deep brand muted-blue.\n '050': '#F5F9FA', '100': '#E4F3F6', '200': '#C0E8F2', '300': '#7DD4E8',\n '400': '#3AABB8', '500': '#00657C', '600': '#005366', '700': '#003E4D',\n '800': '#03303A', '900': '#05262E', '950': '#051A1E',\n },\n skyblue: {\n '050': '#F6F8F8', '100': '#E9F0F1', '200': '#CDE0E5', '300': '#A7CFD8',\n '400': '#7FBECC', '500': '#59B0C4', '600': '#3A9BB0', '700': '#327E8F',\n '800': '#2B616E', '900': '#264C55', '950': '#1E383D',\n },\n yellow: {\n '050': '#FAF9F5', '100': '#F6F2E4', '200': '#F1E7C0', '300': '#F2DC8D',\n '400': '#F5D356', '500': '#FED12E', '600': '#FAC400', '700': '#D0A301',\n '800': '#9F7F09', '900': '#7B640E', '950': '#5B4B10',\n },\n gray: {\n '050': '#F7F7F8', '100': '#EBEDEF', '200': '#D3D7DE', '300': '#B3BBCC',\n '400': '#8F9EBC', '500': '#6B7280', '600': '#535964', '700': '#41454E',\n '800': '#2F3237', '900': '#212326', '950': '#131416',\n },\n};\n\n// ──────────────────────────────────────────────\n// Tier Colors (teal-scale shade variation)\n// ──────────────────────────────────────────────\n\nexport const tierColors = {\n federal: {\n bg: '#FFFFFF', // white — lightest tier\n accent: colorScales.teal['700'], // #003E4D\n text: colorScales.teal['700'], // #003E4D — 7.5:1 on white, AA\n },\n state: {\n bg: '#F7FBFC', // gentle teal wash — midpoint between white and 050\n accent: colorScales.teal['500'], // #00657C\n text: colorScales.teal['500'], // #00657C — 6.66:1 on white, AA\n },\n local: {\n bg: '#EDF6F8', // #EDF6F8 — between 050 and 100, darkest tier\n accent: colorScales.teal['200'], // #C0E8F2 — decorative only\n text: colorScales.teal['600'], // #005366 — 8.1:1 on white, AA\n },\n};\n\n// ──────────────────────────────────────────────\n// Brand Colors (flat references for convenience)\n// Canonical values — DO NOT change without updating all apps.\n// ──────────────────────────────────────────────\n\nexport const colors = {\n // Primary brand (locked)\n evCoral: '#FF5740', // 3.14:1 on white — large text / UI only\n evMutedBlue: '#00657C', // 6.66:1 on white — AA body text safe\n evLightBlue: '#59B0C4', // 2.49:1 on white — decorative / dark bg only\n evYellow: '#FED12E', // 1.46:1 on white — accent / dark bg only\n evYellowLight:'#FEF3C7',\n evYellowDark: '#D0A301',\n black: '#1C1C1C',\n white: '#FFFFFF',\n\n // Legacy aliases (deprecated — use evMutedBlue / evLightBlue instead)\n evTeal: '#00657C',\n evTealDark: '#003E4D',\n evTealLight: '#59B0C4',\n\n // Backgrounds\n bgLight: '#F0F8FA',\n bgWhite: '#FFFFFF',\n\n // Text\n textPrimary: '#00657C', // Muted Blue — 6.66:1 on white ✓ AA\n textSecondary: '#4A5568', // ~6.0:1 on white ✓ AA\n textMuted: '#718096', // ~4.6:1 on white ✓ AA\n textWhite: '#FFFFFF',\n\n // Borders\n borderLight: '#E2EBEF',\n borderMedium: '#C9CFD1',\n\n // State\n error: '#EF4444',\n errorLight: '#FEF2F2',\n success: '#22C55E',\n successLight: '#F0FDF4',\n warning: '#F59E0B',\n warningLight: '#FFFBEB',\n info: '#3A9BB0',\n infoLight: '#F5F9FA',\n};\n\n// ──────────────────────────────────────────────\n// AA-Safe Text Colors (per brand hue)\n// Use these when a brand color must appear as readable text.\n// Each passes WCAG AA (4.5:1+) on white and bgLight.\n// ──────────────────────────────────────────────\n\nexport const accessibleText = {\n coral: '#E61B00', // coral-700, 4.64:1 on white\n teal: '#00657C', // teal-500 (brand muted blue), 6.66:1\n skyblue: '#327E8F', // skyblue-700, 4.65:1 on white\n yellow: '#7B640E', // yellow-900, 5.72:1 on white\n};\n\n// ──────────────────────────────────────────────\n// Pillar Themes\n// ──────────────────────────────────────────────\n\nexport const pillars = {\n inform: {\n name: 'Inform', accent: 'yellow',\n color: '#FED12E', dark: '#D0A301', light: '#FAF9F5',\n textColor: '#7B640E', // AA-safe text — yellow-900\n darkMode: { color: '#FED12E', dark: '#FEE88A', textOnAccent: '#1C1C1C' },\n },\n empower: {\n name: 'Empower', accent: 'coral',\n color: '#FF5740', dark: '#E61B00', light: '#FAF6F5',\n textColor: '#E61B00', // AA-safe text — coral-700\n darkMode: { color: '#FF5740', dark: '#F66855', textOnAccent: '#FFFFFF' },\n },\n connect: {\n name: 'Connect', accent: 'teal',\n color: '#00657C', dark: '#003E4D', light: '#F5F9FA',\n textColor: '#00657C', // Already AA — muted blue\n darkMode: { color: '#3A9BB0', dark: '#59B0C4', textOnAccent: '#FFFFFF' },\n },\n};\n\n// ──────────────────────────────────────────────\n// Semantic Tokens (Light / Dark)\n// All text-on-background pairings verified AA (4.5:1+).\n// ──────────────────────────────────────────────\n\nexport const semanticTokens = {\n light: {\n layerBase: { background: '#F7F7F8', text: '#535964', icon: '#535964', border: '#D3D7DE' }, // 6.58:1\n layerOne: { background: '#EBEDEF', text: '#41454E', icon: '#41454E', border: '#D3D7DE' }, // 7.23:1\n layerTwo: { background: '#D3D7DE', text: '#2F3237', icon: '#2F3237', border: '#B3BBCC' }, // 7.60:1\n heading: { text: '#2F3237' }, // 12.02:1 on gray-050\n divider: '#D3D7DE',\n link: { default: '#00657C', hovered: '#003E4D', focused: '#003E4D', pressed: '#003E4D' },\n input: { background: '#F7F7F8', text: '#41454E', border: '#41454E', icon: '#6B7280' }, // text bumped from gray-500 to gray-700 for AA\n buttonPrimary: {\n background: { default: '#005366', hovered: '#003E4D', pressed: '#03303A', focused: '#005366', disabled: '#D3D7DE' },\n text: { default: '#FFFFFF', disabled: '#8F9EBC' },\n },\n buttonSecondary: {\n background: { default: '#F7F7F8', hovered: '#EBEDEF', pressed: '#D3D7DE', focused: '#EBEDEF', disabled: '#F7F7F8' },\n text: { default: '#003E4D', disabled: '#8F9EBC' },\n border: { default: '#003E4D', disabled: '#D3D7DE' },\n },\n // Feedback states\n badge: { background: '#EBEDEF', text: '#41454E', border: '#D3D7DE' },\n tooltip: { background: '#2F3237', text: '#EBEDEF' },\n overlay: 'rgba(19, 20, 22, 0.5)',\n skeleton: { from: '#EBEDEF', to: '#D3D7DE' },\n },\n dark: {\n layerBase: { background: '#131416', text: '#B3BBCC', icon: '#B3BBCC', border: '#41454E' }, // 9.56:1 ✓ AAA\n layerOne: { background: '#2F3237', text: '#D3D7DE', icon: '#D3D7DE', border: '#41454E' }, // 8.91:1 ✓ AAA\n layerTwo: { background: '#41454E', text: '#EBEDEF', icon: '#EBEDEF', border: '#535964' }, // 8.18:1 ✓ AAA\n heading: { text: '#EBEDEF' }, // 15.70:1 on layerBase ✓ AAA\n divider: '#41454E',\n link: { default: '#59B0C4', hovered: '#7FBECC', focused: '#7FBECC', pressed: '#3A9BB0' }, // 7.40:1 on layerBase ✓ AAA\n input: { background: '#1E2024', text: '#D3D7DE', border: '#6B7280', icon: '#B3BBCC' }, // border bumped to gray-500 for 3.37:1 UI ✓\n buttonPrimary: {\n // Darkened from skyblue to teal for white-text AA compliance\n background: { default: '#005366', hovered: '#327E8F', pressed: '#003E4D', focused: '#005366', disabled: '#2F3237' },\n text: { default: '#FFFFFF', disabled: '#535964' }, // 8.64:1 / 4.65:1 / 11.69:1 ✓ AA+\n },\n buttonSecondary: {\n background: { default: '#131416', hovered: '#2F3237', pressed: '#41454E', focused: '#2F3237', disabled: '#131416' },\n text: { default: '#59B0C4', disabled: '#535964' }, // 7.40:1 ✓ AAA\n border: { default: '#59B0C4', disabled: '#41454E' },\n },\n // Feedback states\n badge: { background: '#41454E', text: '#EBEDEF', border: '#535964' },\n tooltip: { background: '#EBEDEF', text: '#2F3237' },\n overlay: 'rgba(19, 20, 22, 0.75)',\n skeleton: { from: '#2F3237', to: '#41454E' },\n },\n};\n\n// ──────────────────────────────────────────────\n// Data Visualization Palette\n// ──────────────────────────────────────────────\n\n// 10 hues derived from the EV brand palette.\n// Core 4 (teal, sky blue, coral, yellow) + 6 harmonious neighbors.\n// Each has 5 shades: [100-light, 300, 400, base-500, 700-dark]\nexport const dataVizPalette = [\n { name: 'Teal', base: '#00657C', shades: ['#C0E8F2', '#55D9F6', '#3AABB8', '#00657C', '#003E4D'] },\n { name: 'Sky Blue', base: '#59B0C4', shades: ['#CDE0E5', '#A7CFD8', '#7FBECC', '#59B0C4', '#327E8F'] },\n { name: 'Ocean', base: '#2563A0', shades: ['#CDDCED', '#7BADD4', '#4D8FC2', '#2563A0', '#193F68'] },\n { name: 'Coral', base: '#FF5740', shades: ['#F6E6E4', '#F2988C', '#F66855', '#FF5740', '#B31D09'] },\n { name: 'Terracotta', base: '#C2674A', shades: ['#F0DCD4', '#D9A48E', '#CF8568', '#C2674A', '#7A3D2C'] },\n { name: 'Yellow', base: '#FED12E', shades: ['#F6F2E4', '#F2DC8D', '#F5D356', '#FED12E', '#9F7F09'] },\n { name: 'Honey', base: '#D4940B', shades: ['#F5EACE', '#E8C563', '#DCA930', '#D4940B', '#805A06'] },\n { name: 'Sage', base: '#5A9A6E', shades: ['#D4E8DA', '#9ACBAA', '#74B589', '#5A9A6E', '#376043'] },\n { name: 'Dusk', base: '#7C6B9E', shades: ['#E4DFF0', '#B5A8CF', '#9788B8', '#7C6B9E', '#4D4263'] },\n { name: 'Stone', base: '#6B7280', shades: ['#EBEDEF', '#B3BBCC', '#8F9EBC', '#6B7280', '#41454E'] },\n];\n\n// ──────────────────────────────────────────────\n// Typography\n// ──────────────────────────────────────────────\n\nexport const fonts = {\n primary: \"'Manrope', sans-serif\",\n fallback: \"system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n};\n\nexport const fontWeights = {\n regular: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n extrabold: 800,\n};\n\nexport const fontSizes = {\n xs: '12px',\n sm: '14px',\n base: '16px',\n lg: '18px',\n xl: '20px',\n '2xl': '24px',\n '3xl': '30px',\n '4xl': '36px',\n '5xl': '48px',\n};\n\nexport const lineHeights = {\n tight: 1.25,\n normal: 1.5,\n relaxed: 1.75,\n};\n\nexport const letterSpacing = {\n tight: '-0.02em',\n normal: '0',\n wide: '0.05em',\n};\n\n// Composite text styles — combine size, weight, line-height, and letter-spacing\n// into ready-to-spread objects for inline styles: style={{ ...textStyles.displayTitle }}\nexport const textStyles = {\n displayTitle: { fontSize: '48px', fontWeight: 800, lineHeight: 1.1, letterSpacing: '-0.03em' },\n displaySub: { fontSize: '36px', fontWeight: 700, lineHeight: 1.15, letterSpacing: '-0.02em' },\n h1: { fontSize: '30px', fontWeight: 700, lineHeight: 1.25, letterSpacing: '-0.02em' },\n h2: { fontSize: '24px', fontWeight: 700, lineHeight: 1.3, letterSpacing: '-0.01em' },\n h3: { fontSize: '20px', fontWeight: 600, lineHeight: 1.35, letterSpacing: '0' },\n h4: { fontSize: '18px', fontWeight: 600, lineHeight: 1.4, letterSpacing: '0' },\n bodyLg: { fontSize: '18px', fontWeight: 400, lineHeight: 1.6, letterSpacing: '0' },\n body: { fontSize: '16px', fontWeight: 400, lineHeight: 1.5, letterSpacing: '0' },\n bodySm: { fontSize: '14px', fontWeight: 400, lineHeight: 1.5, letterSpacing: '0' },\n label: { fontSize: '14px', fontWeight: 500, lineHeight: 1.4, letterSpacing: '0.01em' },\n labelSm: { fontSize: '12px', fontWeight: 500, lineHeight: 1.4, letterSpacing: '0.02em' },\n caption: { fontSize: '12px', fontWeight: 400, lineHeight: 1.4, letterSpacing: '0.01em' },\n overline: { fontSize: '11px', fontWeight: 700, lineHeight: 1.4, letterSpacing: '0.08em', textTransform: 'uppercase' },\n};\n\n// ──────────────────────────────────────────────\n// Spacing (4px base unit)\n// ──────────────────────────────────────────────\n\nexport const spacing = {\n 0: '0',\n '050': '2px',\n 1: '4px',\n '150': '6px',\n 2: '8px',\n 3: '12px',\n 4: '16px',\n 5: '20px',\n 6: '24px',\n 8: '32px',\n 10: '40px',\n 12: '48px',\n 16: '64px',\n 20: '80px',\n 24: '96px',\n};\n\n// ──────────────────────────────────────────────\n// Border Radius\n// ──────────────────────────────────────────────\n\nexport const borderRadius = {\n none: '0',\n sm: '4px',\n md: '8px',\n lg: '10px',\n xl: '12px',\n '2xl': '16px',\n full: '9999px',\n};\n\n// ──────────────────────────────────────────────\n// Shadows & Elevation\n// ──────────────────────────────────────────────\n\nexport const shadows = {\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\n md: '0 4px 6px -1px rgba(0, 0, 0, 0.1)',\n lg: '0 10px 25px -3px rgba(0, 0, 0, 0.1), 0 4px 10px -4px rgba(0, 0, 0, 0.05)',\n xl: '0 20px 40px -8px rgba(0, 0, 0, 0.12), 0 8px 16px -6px rgba(0, 0, 0, 0.06)',\n inner: 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)',\n glowCoral: '0 0 0 3px rgba(255, 87, 64, 0.25)',\n glowTeal: '0 0 0 3px rgba(0, 101, 124, 0.2)',\n cardHover: '0 12px 32px -4px rgba(0, 0, 0, 0.12), 0 4px 8px -2px rgba(0, 0, 0, 0.04)',\n none: 'none',\n};\n\n// ──────────────────────────────────────────────\n// Motion\n// ──────────────────────────────────────────────\n\nexport const duration = {\n instant: '50ms',\n fast: '120ms', // Micro-interactions: toggles, checkboxes\n normal: '200ms', // Buttons, inputs, small transitions\n slow: '350ms', // Panels, cards, modals\n slower: '500ms', // Page transitions, complex orchestration\n};\n\nexport const easing = {\n default: 'cubic-bezier(0.2, 0, 0, 1)', // General-purpose (Material 3 standard)\n enter: 'cubic-bezier(0, 0, 0.2, 1)', // Elements appearing (decelerate)\n exit: 'cubic-bezier(0.4, 0, 1, 1)', // Elements leaving (accelerate)\n spring: 'cubic-bezier(0.34, 1.56, 0.64, 1)', // Playful overshoot — buttons, badges\n linear: 'linear',\n};\n\n// ──────────────────────────────────────────────\n// Focus Ring\n// ──────────────────────────────────────────────\n\nexport const focus = {\n ring: '0 0 0 2px #FFFFFF, 0 0 0 4px #00657C', // White gap + brand muted blue (6.66:1 on white)\n ringDark: '0 0 0 2px #131416, 0 0 0 4px #59B0C4', // Dark gap + light blue (6.84:1 on dark)\n ringCoral: '0 0 0 2px #FFFFFF, 0 0 0 4px #FF5740', // Coral variant for pillar contexts\n offset: '2px',\n};\n\n// ──────────────────────────────────────────────\n// Z-Index Scale\n// ──────────────────────────────────────────────\n\nexport const zIndex = {\n hide: -1,\n base: 0,\n dropdown: 10,\n sticky: 20,\n header: 30,\n overlay: 40,\n modal: 50,\n toast: 60,\n tooltip: 70,\n};\n\n// ──────────────────────────────────────────────\n// Opacity\n// ──────────────────────────────────────────────\n\nexport const opacity = {\n disabled: 0.4,\n muted: 0.6,\n subtle: 0.8,\n full: 1,\n};\n\n// ──────────────────────────────────────────────\n// Breakpoints\n// ──────────────────────────────────────────────\n\nexport const breakpoints = {\n sm: '640px',\n md: '768px',\n lg: '1024px',\n xl: '1280px',\n};\n","import React, { useState, useRef, useEffect } from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius, semanticTokens } from './tokens';\nimport useMediaQuery from './useMediaQuery';\n\n/**\n * Header component for Empowered Vote applications\n *\n * @param {Object} props\n * @param {string} props.logoSrc - URL for the logo image\n * @param {string} props.logoAlt - Alt text for logo (default: \"Empowered Vote\")\n * @param {Array} props.navItems - Navigation items [{label, href, dropdown?}]\n * @param {Object} props.ctaButton - Primary CTA button config {label, href}\n * @param {React.ReactNode|Object} props.secondaryAction - Secondary action rendered next to CTA.\n * Either a React node (e.g. <FeedbackButton />) or a config object {label, href, target, rel}\n * that renders as a small ghost-style pill button.\n * @param {string} props.currentPath - Current path for active state\n * @param {Function} props.onNavigate - SPA navigation handler\n * @param {Object} props.style - Additional styles for the header container\n */\nexport default function Header({\n logoSrc,\n logoAlt = 'Empowered Vote',\n logoHref = 'https://empowered.vote',\n navItems = [],\n ctaButton,\n secondaryAction,\n currentPath,\n onNavigate,\n profileMenu,\n darkMode = false,\n navCollapseBreakpoint = 1024,\n style = {},\n}) {\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false);\n const [openDropdown, setOpenDropdown] = useState(null);\n const [profileOpen, setProfileOpen] = useState(false);\n const isMobile = useMediaQuery(`(max-width: ${navCollapseBreakpoint}px)`);\n const profileRef = useRef(null);\n\n useEffect(() => {\n if (!profileOpen) return;\n const handleClickOutside = (e) => {\n if (profileRef.current && !profileRef.current.contains(e.target)) {\n setProfileOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [profileOpen]);\n\n const handleNavClick = (e, href) => {\n if (onNavigate) {\n e.preventDefault();\n onNavigate(href);\n }\n };\n\n // Theme palette — darkMode switches the inline style colors. Mirrors the\n // darkMode-prop pattern used by PoliticianProfile. Defaults to light so any\n // consumer that doesn't pass darkMode renders exactly as before.\n const t = darkMode\n ? {\n surface: semanticTokens.dark.layerBase.background, // #131416\n raised: semanticTokens.dark.layerOne.background, // #2F3237 (dropdowns)\n text: colors.evLightBlue, // #59B0C4 — AA on dark\n itemText: semanticTokens.dark.layerOne.text, // #D3D7DE (dropdown items)\n muted: semanticTokens.dark.layerBase.text, // #B3BBCC\n border: semanticTokens.dark.divider, // #41454E\n hoverBg: semanticTokens.dark.layerTwo.background, // #41454E\n ctaBg: semanticTokens.dark.buttonPrimary.background.default, // #005366\n ctaBgHover: semanticTokens.dark.buttonPrimary.background.hovered,\n ctaText: '#FFFFFF',\n shadow: '0 10px 40px rgba(0,0,0,0.5)',\n }\n : {\n surface: colors.bgWhite,\n raised: colors.bgWhite,\n text: colors.evTeal,\n itemText: colors.evTeal,\n muted: colors.textMuted,\n border: colors.borderLight,\n hoverBg: colors.bgLight,\n ctaBg: colors.evTeal,\n ctaBgHover: colors.evTealDark,\n ctaText: colors.textWhite,\n shadow: '0 10px 40px rgba(0,0,0,0.1)',\n };\n\n const styles = {\n header: {\n backgroundColor: t.surface,\n position: 'sticky',\n top: 0,\n zIndex: 50,\n width: '100%',\n ...style,\n },\n container: {\n maxWidth: '1512px',\n margin: '0 auto',\n padding: isMobile ? `${spacing[3]} ${spacing[3]}` : `${spacing[4]} ${spacing[6]}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: spacing[6],\n },\n logo: {\n height: '43px',\n cursor: 'pointer',\n },\n nav: {\n display: isMobile ? 'none' : 'flex',\n flex: '1 1 auto',\n alignItems: 'center',\n justifyContent: 'center',\n flexWrap: 'nowrap',\n gap: spacing[8],\n },\n navItem: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.base,\n color: t.text,\n textDecoration: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: spacing[2],\n position: 'relative',\n whiteSpace: 'nowrap',\n },\n navItemActive: {\n textDecoration: 'underline',\n },\n dropdownIcon: {\n width: '16px',\n height: '9px',\n },\n dropdown: {\n position: 'absolute',\n top: '100%',\n left: 0,\n paddingTop: spacing[2],\n zIndex: 100,\n },\n dropdownInner: {\n backgroundColor: t.raised,\n borderRadius: borderRadius.lg,\n boxShadow: t.shadow,\n minWidth: '200px',\n padding: spacing[2],\n },\n dropdownItem: {\n display: 'block',\n padding: `${spacing[3]} ${spacing[4]}`,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.base,\n color: t.itemText,\n textDecoration: 'none',\n borderRadius: borderRadius.md,\n cursor: 'pointer',\n },\n ctaButton: {\n backgroundColor: t.ctaBg,\n color: t.ctaText,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: fontSizes.xl,\n padding: `${spacing[3]} ${spacing[8]}`,\n borderRadius: borderRadius.lg,\n border: 'none',\n cursor: 'pointer',\n textDecoration: 'none',\n display: 'inline-block',\n },\n secondaryAction: {\n display: 'inline-flex',\n alignItems: 'center',\n backgroundColor: 'transparent',\n color: t.text,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: fontSizes.base,\n padding: `${spacing[2]} ${spacing[5]}`,\n borderRadius: borderRadius.full || '999px',\n border: `1.5px solid ${t.text}`,\n cursor: 'pointer',\n textDecoration: 'none',\n lineHeight: 1.2,\n transition: 'background-color 0.15s ease, color 0.15s ease',\n },\n mobileMenuButton: {\n display: isMobile ? 'block' : 'none',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: spacing[2],\n },\n hamburger: {\n width: '24px',\n height: '2px',\n backgroundColor: t.text,\n position: 'relative',\n },\n mobileMenu: {\n display: mobileMenuOpen ? 'flex' : 'none',\n flexDirection: 'column',\n position: 'absolute',\n top: '100%',\n left: 0,\n right: 0,\n backgroundColor: t.surface,\n padding: spacing[4],\n boxShadow: t.shadow,\n },\n mobileNavItem: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.base,\n color: t.text,\n textDecoration: 'none',\n padding: `${spacing[3]} 0`,\n borderBottom: `1px solid ${t.border}`,\n },\n profileButton: {\n width: '40px',\n height: '40px',\n borderRadius: borderRadius.full,\n border: `2px solid ${t.text}`,\n backgroundColor: darkMode ? t.raised : colors.bgLight,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 0,\n },\n profileDropdown: {\n position: 'absolute',\n top: '100%',\n right: 0,\n paddingTop: spacing[2],\n zIndex: 100,\n },\n profileDropdownInner: {\n backgroundColor: t.raised,\n borderRadius: borderRadius.lg,\n boxShadow: t.shadow,\n minWidth: '160px',\n padding: spacing[2],\n },\n profileDropdownItem: {\n display: 'block',\n width: '100%',\n padding: `${spacing[3]} ${spacing[4]}`,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.base,\n color: t.itemText,\n textDecoration: 'none',\n borderRadius: borderRadius.md,\n cursor: 'pointer',\n border: 'none',\n backgroundColor: 'transparent',\n textAlign: 'left',\n },\n mobileDivider: {\n height: '1px',\n backgroundColor: t.border,\n margin: `${spacing[3]} 0`,\n },\n profileLabel: {\n padding: `${spacing[2]} ${spacing[4]} ${spacing[3]}`,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.semibold,\n fontSize: fontSizes.sm,\n color: t.muted,\n borderBottom: `1px solid ${t.border}`,\n marginBottom: spacing[1],\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n };\n\n // Responsive styles via media query in a style tag would be better,\n // but for simplicity we'll use CSS classes that consumers can override\n const NavLink = ({ item }) => {\n // Cross-app links are absolute URLs, so a pathname currentPath never equals\n // them — also treat a link as active when its hostname matches this app's.\n const isActive =\n currentPath === item.href ||\n (typeof window !== 'undefined' &&\n /^https?:\\/\\//.test(item.href) &&\n (() => {\n try {\n return new URL(item.href).hostname === window.location.hostname;\n } catch {\n return false;\n }\n })());\n const hasDropdown = item.dropdown && item.dropdown.length > 0;\n const isOpen = openDropdown === item.label;\n\n return (\n <div\n style={{ position: 'relative' }}\n onMouseEnter={() => hasDropdown && setOpenDropdown(item.label)}\n onMouseLeave={() => hasDropdown && setOpenDropdown(null)}\n >\n <a\n href={item.href}\n onClick={(e) => handleNavClick(e, item.href)}\n style={{\n ...styles.navItem,\n ...(isActive ? styles.navItemActive : {}),\n }}\n >\n {item.label}\n {hasDropdown && (\n <svg\n style={styles.dropdownIcon}\n viewBox=\"0 0 16 9\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M1 1L8 8L15 1\"\n stroke={t.text}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </a>\n {hasDropdown && isOpen && (\n <div style={styles.dropdown}>\n <div style={styles.dropdownInner}>\n {item.dropdown.map((dropdownItem, idx) => (\n <a\n key={idx}\n href={dropdownItem.href}\n onClick={(e) => handleNavClick(e, dropdownItem.href)}\n style={styles.dropdownItem}\n onMouseEnter={(e) => {\n e.target.style.backgroundColor = t.hoverBg;\n }}\n onMouseLeave={(e) => {\n e.target.style.backgroundColor = 'transparent';\n }}\n >\n {dropdownItem.label}\n </a>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n };\n\n return (\n <header style={styles.header}>\n <div style={styles.container}>\n {/* Logo */}\n <a\n href={logoHref}\n onClick={(e) => handleNavClick(e, logoHref)}\n style={{ display: 'flex', alignItems: 'center', flexShrink: 0 }}\n >\n {logoSrc ? (\n <img src={logoSrc} alt={logoAlt} style={styles.logo} />\n ) : (\n <span\n style={{\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: fontSizes['2xl'],\n color: t.text,\n }}\n >\n empowered.vote\n </span>\n )}\n </a>\n\n {/* Desktop Navigation */}\n <nav style={styles.nav} className=\"ev-header-nav\">\n {navItems.map((item, idx) => (\n <NavLink key={idx} item={item} />\n ))}\n </nav>\n\n {/* Right side: secondary action + CTA + Profile */}\n <div style={{ display: isMobile ? 'none' : 'flex', alignItems: 'center', gap: spacing[3], flexShrink: 0 }}>\n {secondaryAction && React.isValidElement(secondaryAction) && secondaryAction}\n {secondaryAction && !React.isValidElement(secondaryAction) && (\n <a\n href={secondaryAction.href}\n target={secondaryAction.target || '_self'}\n rel={secondaryAction.target === '_blank' ? 'noopener noreferrer' : (secondaryAction.rel || undefined)}\n onClick={(e) => {\n if (secondaryAction.target !== '_blank') {\n handleNavClick(e, secondaryAction.href);\n }\n }}\n style={styles.secondaryAction}\n className=\"ev-header-secondary\"\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = t.text;\n e.currentTarget.style.color = darkMode ? t.surface : colors.textWhite;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = t.text;\n }}\n >\n {secondaryAction.label}\n </a>\n )}\n {ctaButton && (\n <a\n href={ctaButton.href}\n onClick={(e) => handleNavClick(e, ctaButton.href)}\n style={styles.ctaButton}\n className=\"ev-header-cta\"\n onMouseEnter={(e) => {\n e.target.style.backgroundColor = t.ctaBgHover;\n }}\n onMouseLeave={(e) => {\n e.target.style.backgroundColor = t.ctaBg;\n }}\n >\n {ctaButton.label}\n </a>\n )}\n\n {/* Profile Menu (Desktop) */}\n {profileMenu && (\n <div ref={profileRef} style={{ position: 'relative' }}>\n <button\n style={styles.profileButton}\n onClick={() => setProfileOpen(!profileOpen)}\n aria-label=\"Profile menu\"\n aria-expanded={profileOpen}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={t.text}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\" />\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\n </svg>\n </button>\n {profileOpen && (\n <div style={styles.profileDropdown}>\n <div style={styles.profileDropdownInner}>\n {profileMenu.label && (\n <div style={styles.profileLabel}>{profileMenu.label}</div>\n )}\n {profileMenu.items.map((item, idx) => {\n if (item.href) {\n return (\n <a\n key={idx}\n href={item.href}\n onClick={(e) => {\n setProfileOpen(false);\n if (onNavigate) {\n e.preventDefault();\n onNavigate(item.href);\n }\n }}\n style={styles.profileDropdownItem}\n onMouseEnter={(e) => {\n e.target.style.backgroundColor = t.hoverBg;\n }}\n onMouseLeave={(e) => {\n e.target.style.backgroundColor = 'transparent';\n }}\n >\n {item.label}\n </a>\n );\n }\n return (\n <button\n key={idx}\n onClick={() => {\n setProfileOpen(false);\n item.onClick?.();\n }}\n style={styles.profileDropdownItem}\n onMouseEnter={(e) => {\n e.target.style.backgroundColor = t.hoverBg;\n }}\n onMouseLeave={(e) => {\n e.target.style.backgroundColor = 'transparent';\n }}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Mobile Menu Button */}\n <button\n style={styles.mobileMenuButton}\n className=\"ev-header-mobile-toggle\"\n onClick={() => setMobileMenuOpen(!mobileMenuOpen)}\n aria-label=\"Toggle menu\"\n aria-expanded={mobileMenuOpen}\n >\n <div style={styles.hamburger}>\n <span\n style={{\n position: 'absolute',\n top: '-8px',\n left: 0,\n width: '100%',\n height: '2px',\n backgroundColor: t.text,\n }}\n />\n <span\n style={{\n position: 'absolute',\n top: '8px',\n left: 0,\n width: '100%',\n height: '2px',\n backgroundColor: t.text,\n }}\n />\n </div>\n </button>\n </div>\n\n {/* Mobile Menu */}\n <div style={styles.mobileMenu} className=\"ev-header-mobile-menu\">\n {navItems.map((item, idx) => {\n const hasDropdown = item.dropdown && item.dropdown.length > 0;\n return (\n <React.Fragment key={idx}>\n {hasDropdown ? (\n <>\n <span\n style={{\n ...styles.mobileNavItem,\n cursor: 'default',\n display: 'block',\n }}\n >\n {item.label}\n </span>\n {item.dropdown.map((sub, subIdx) => (\n <a\n key={subIdx}\n href={sub.href}\n onClick={(e) => {\n handleNavClick(e, sub.href);\n setMobileMenuOpen(false);\n }}\n style={{\n ...styles.mobileNavItem,\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.base,\n paddingLeft: spacing[4],\n }}\n >\n {sub.label}\n </a>\n ))}\n </>\n ) : (\n <a\n href={item.href}\n onClick={(e) => {\n handleNavClick(e, item.href);\n setMobileMenuOpen(false);\n }}\n style={styles.mobileNavItem}\n >\n {item.label}\n </a>\n )}\n </React.Fragment>\n );\n })}\n {secondaryAction && React.isValidElement(secondaryAction) && (\n <div style={{ marginTop: spacing[4], textAlign: 'center' }}>\n {secondaryAction}\n </div>\n )}\n {secondaryAction && !React.isValidElement(secondaryAction) && (\n <a\n href={secondaryAction.href}\n target={secondaryAction.target || '_self'}\n rel={secondaryAction.target === '_blank' ? 'noopener noreferrer' : (secondaryAction.rel || undefined)}\n onClick={(e) => {\n if (secondaryAction.target !== '_blank') {\n handleNavClick(e, secondaryAction.href);\n }\n setMobileMenuOpen(false);\n }}\n style={{ ...styles.secondaryAction, marginTop: spacing[4], textAlign: 'center', justifyContent: 'center' }}\n >\n {secondaryAction.label}\n </a>\n )}\n {ctaButton && (\n <a\n href={ctaButton.href}\n onClick={(e) => {\n handleNavClick(e, ctaButton.href);\n setMobileMenuOpen(false);\n }}\n style={{ ...styles.ctaButton, marginTop: spacing[4], textAlign: 'center' }}\n >\n {ctaButton.label}\n </a>\n )}\n\n {/* Profile items in mobile menu */}\n {profileMenu && (\n <>\n <div style={styles.mobileDivider} />\n {profileMenu.label && (\n <span\n style={{\n ...styles.mobileNavItem,\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.sm,\n color: t.muted,\n cursor: 'default',\n display: 'block',\n borderBottom: 'none',\n }}\n >\n {profileMenu.label}\n </span>\n )}\n {profileMenu.items.map((item, idx) => {\n if (item.href) {\n return (\n <a\n key={idx}\n href={item.href}\n onClick={(e) => {\n setMobileMenuOpen(false);\n if (onNavigate) {\n e.preventDefault();\n onNavigate(item.href);\n }\n }}\n style={styles.mobileNavItem}\n >\n {item.label}\n </a>\n );\n }\n return (\n <button\n key={idx}\n onClick={() => {\n setMobileMenuOpen(false);\n item.onClick?.();\n }}\n style={{\n ...styles.mobileNavItem,\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n width: '100%',\n textAlign: 'left',\n }}\n >\n {item.label}\n </button>\n );\n })}\n </>\n )}\n </div>\n </header>\n );\n}\n","import { useState, useEffect } from 'react';\n\n/**\n * Hook that listens to a CSS media query and returns whether it matches.\n *\n * @param {string} query - A valid CSS media query string, e.g. '(max-width: 768px)'\n * @returns {boolean} Whether the media query currently matches\n */\nexport default function useMediaQuery(query) {\n const [matches, setMatches] = useState(() => {\n if (typeof window === 'undefined') return false;\n return window.matchMedia(query).matches;\n });\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const mql = window.matchMedia(query);\n const handler = (e) => setMatches(e.matches);\n mql.addEventListener('change', handler);\n setMatches(mql.matches);\n return () => mql.removeEventListener('change', handler);\n }, [query]);\n\n return matches;\n}\n","import React from 'react';\nimport Header from './Header.jsx';\nimport FeedbackButton from './FeedbackButton.jsx';\n\n/**\n * Pre-configured site header for Empowered Vote applications\n *\n * Provides consistent navigation across all EV apps. Wraps the base Header\n * with standard nav items, a Donate CTA, and a Feedback button (auto-detects\n * the current tool from window.location.hostname).\n *\n * @param {Object} props\n * @param {string} props.logoSrc - URL for the logo image (defaults to /EVLogo.svg)\n * @param {string} props.currentPath - Current path for active state highlighting\n * @param {Function} props.onNavigate - Navigation handler (receives href string)\n * @param {Object} [props.profileMenu] - Optional profile dropdown config\n * @param {React.ReactNode|Object|false} [props.secondaryAction] - Override the\n * default Feedback button. Pass `false` to hide. Pass a React node or a\n * {label, href, target} config to replace it.\n * @param {string} [props.feedbackFeature] - Override auto-detected feature slug\n * for the default Feedback button (e.g. \"compass\" if you want to force it).\n * @param {Object} props.style - Additional styles for the header container\n */\n\nconst defaultNavItems = [\n {\n label: 'Features',\n href: '#',\n dropdown: [\n { label: 'Political Compass', href: 'https://compass.empowered.vote' },\n { label: 'Find Representatives', href: 'https://essentials.empowered.vote' },\n { label: 'Read & Rank', href: 'https://readrank.empowered.vote' },\n { label: 'Treasury Tracker', href: 'https://treasurytracker.empowered.vote' },\n { label: 'Civic Trivia', href: 'https://ctc.empowered.vote' },\n { label: 'Empowered Badges', href: 'https://badges.empowered.vote' },\n ],\n },\n];\n\n/**\n * Canonical inline cross-app nav links for the EV header.\n *\n * Pass to `<Header navItems={evAppLinks} />` to render one top-level link per\n * app (no dropdown). The Header marks the current app active by matching the\n * link hostname against window.location.hostname. Labels are short to fit the\n * bar; the current app stays visible (and underlined) rather than hidden.\n */\nconst evAppLinks = [\n { label: 'Compass', href: 'https://compass.empowered.vote' },\n { label: 'Find Representatives', href: 'https://essentials.empowered.vote' },\n { label: 'Treasury Tracker', href: 'https://treasurytracker.empowered.vote' },\n { label: 'Civic Trivia', href: 'https://ctc.empowered.vote' },\n];\n\nconst defaultCtaButton = {\n label: 'Donate',\n href: 'https://empowered.vote/donate',\n};\n\nexport default function SiteHeader({\n logoSrc = '/EVLogo.svg',\n currentPath,\n onNavigate,\n profileMenu,\n secondaryAction,\n feedbackFeature,\n style = {},\n}) {\n const handleNavigate = (href) => {\n if (onNavigate) {\n onNavigate(href);\n } else {\n window.location.href = href;\n }\n };\n\n // secondaryAction === false → hide. undefined → default Feedback button.\n // anything else → caller-provided override.\n let resolvedSecondary;\n if (secondaryAction === false) {\n resolvedSecondary = undefined;\n } else if (secondaryAction === undefined) {\n resolvedSecondary = <FeedbackButton feature={feedbackFeature} />;\n } else {\n resolvedSecondary = secondaryAction;\n }\n\n return (\n <Header\n logoSrc={logoSrc}\n logoAlt=\"Empowered Vote\"\n navItems={defaultNavItems}\n ctaButton={defaultCtaButton}\n secondaryAction={resolvedSecondary}\n currentPath={currentPath}\n onNavigate={handleNavigate}\n profileMenu={profileMenu}\n style={style}\n />\n );\n}\n\nexport { defaultNavItems, defaultCtaButton, evAppLinks };\n","import React from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius } from './tokens';\n\n/**\n * FeedbackButton — links to the ev-landing feedback form.\n *\n * Auto-detects which EV tool the user is on from window.location.hostname\n * and pre-fills the ?feature= query param. Also passes the current page URL\n * as ?url= so the report has context. Both can be overridden via props.\n *\n * @param {Object} props\n * @param {string} [props.feature] - explicit feature override (skips auto-detect)\n * @param {string} [props.baseUrl] - feedback form URL (default: empowered.vote/feedback)\n * @param {string} [props.label] - button text (default: \"Feedback\")\n * @param {'pill'|'link'} [props.variant] - visual style (default: 'pill')\n * @param {boolean} [props.includeUrl] - pass current href as ?url= (default: true)\n * @param {string} [props.className] - additional class names\n * @param {Object} [props.style] - additional inline styles\n */\n\nconst FEEDBACK_BASE_DEFAULT = 'https://empowered.vote/feedback';\n\n// Hostname → feature slug. Slugs MUST match the backend Zod enum:\n// compass | essentials | readrank | treasury | badges | trivia | landing | other\nexport const HOST_FEATURE_MAP = {\n 'compass.empowered.vote': 'compass',\n 'essentials.empowered.vote': 'essentials',\n 'readrank.empowered.vote': 'readrank',\n 'treasurytracker.empowered.vote': 'treasury',\n 'badges.empowered.vote': 'badges',\n 'ctc.empowered.vote': 'trivia',\n 'alpha.empowered.vote': 'landing',\n 'ev-landing.empowered.vote': 'landing',\n 'ev-landing.onrender.com': 'landing',\n 'empowered.vote': 'landing',\n};\n\nexport function detectFeature() {\n if (typeof window === 'undefined') return undefined;\n const host = window.location.hostname;\n\n // Exact host match (production subdomains)\n if (HOST_FEATURE_MAP[host]) return HOST_FEATURE_MAP[host];\n\n // Subdomain prefix match — handles previews/staging like\n // compass-pr-12.onrender.com or compass.staging.empowered.vote\n const firstLabel = host.split('.')[0];\n for (const [knownHost, feature] of Object.entries(HOST_FEATURE_MAP)) {\n const knownPrefix = knownHost.split('.')[0];\n if (firstLabel === knownPrefix || firstLabel.startsWith(`${knownPrefix}-`)) {\n return feature;\n }\n }\n\n // Localhost / unknown\n return 'other';\n}\n\n/**\n * Build the canonical feedback URL.\n * @param {Object} [opts]\n * @param {string} [opts.feature] - explicit feature slug (skips auto-detect)\n * @param {string} [opts.baseUrl] - feedback form URL (default: empowered.vote/feedback)\n * @param {boolean} [opts.includeUrl] - append current href as ?url= (default: true)\n * @returns {string}\n */\nexport function getFeedbackUrl({ feature, baseUrl = FEEDBACK_BASE_DEFAULT, includeUrl = true } = {}) {\n const resolvedFeature = feature ?? detectFeature();\n const params = new URLSearchParams();\n if (resolvedFeature) params.set('feature', resolvedFeature);\n if (includeUrl && typeof window !== 'undefined') {\n params.set('url', window.location.href);\n }\n const qs = params.toString();\n return qs ? `${baseUrl}?${qs}` : baseUrl;\n}\n\nexport default function FeedbackButton({\n feature: featureProp,\n baseUrl = FEEDBACK_BASE_DEFAULT,\n label = 'Feedback',\n variant = 'pill',\n includeUrl = true,\n className = '',\n style = {},\n}) {\n const href = getFeedbackUrl({ feature: featureProp, baseUrl, includeUrl });\n\n const pillStyle = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: spacing[1],\n padding: `${spacing[2]} ${spacing[4]}`,\n backgroundColor: 'transparent',\n color: colors.evTeal,\n border: `1.5px solid ${colors.evTeal}`,\n borderRadius: borderRadius.full || '999px',\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: fontSizes.base,\n lineHeight: 1.2,\n textDecoration: 'none',\n cursor: 'pointer',\n transition: 'background-color 0.15s ease, color 0.15s ease',\n };\n\n const linkStyle = {\n color: colors.evTeal,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n textDecoration: 'underline',\n cursor: 'pointer',\n };\n\n const baseStyle = variant === 'link' ? linkStyle : pillStyle;\n\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={`ev-feedback-button ${className}`.trim()}\n style={{ ...baseStyle, ...style }}\n aria-label=\"Send feedback\"\n onMouseEnter={(e) => {\n if (variant === 'pill') {\n e.currentTarget.style.backgroundColor = colors.evTeal;\n e.currentTarget.style.color = colors.textWhite || '#ffffff';\n }\n }}\n onMouseLeave={(e) => {\n if (variant === 'pill') {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = colors.evTeal;\n }\n }}\n >\n {label}\n </a>\n );\n}\n","import React from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius, shadows } from './tokens';\nimport useMediaQuery from './useMediaQuery';\n\n/**\n * FilterSidebar component for filtering politicians by level\n *\n * @param {Object} props\n * @param {string} props.title - Sidebar title (default: \"Filter by\")\n * @param {string} props.zipCode - Current ZIP code value\n * @param {Function} props.onZipChange - Handler for ZIP input changes\n * @param {Function} props.onZipClear - Handler for clearing ZIP\n * @param {Function} props.onZipSubmit - Handler for ZIP submission (Enter key)\n * @param {Array} props.filterOptions - Filter options [{value, label}]\n * @param {string} props.selectedFilter - Currently selected filter value\n * @param {Function} props.onFilterChange - Handler for filter changes\n * @param {string} props.locationLabel - Location display text (e.g., \"Bloomington, Indiana\")\n * @param {string} props.buildingImageSrc - URL for the building image\n * @param {Object} props.style - Additional styles\n */\nexport default function FilterSidebar({\n title = 'Filter by',\n zipCode = '',\n onZipChange,\n onZipClear,\n onZipSubmit,\n filterOptions = [\n { value: 'All', label: 'All' },\n { value: 'Local', label: 'Local' },\n { value: 'State', label: 'State' },\n { value: 'Federal', label: 'Federal' },\n ],\n selectedFilter = 'All',\n onFilterChange,\n locationLabel,\n buildingImageSrc,\n zipInputRef,\n autocompleteContainerRef,\n style = {},\n}) {\n const isMobile = useMediaQuery('(max-width: 768px)');\n\n const handleKeyDown = (e) => {\n if (e.key === 'Enter' && onZipSubmit) {\n onZipSubmit();\n }\n };\n\n const styles = {\n sidebar: isMobile\n ? {\n width: '100%',\n padding: `${spacing[3]} ${spacing[4]}`,\n backgroundColor: colors.bgWhite,\n borderBottom: `1px solid ${colors.borderLight}`,\n ...style,\n }\n : {\n width: '300px',\n flexShrink: 0,\n padding: spacing[6],\n backgroundColor: colors.bgWhite,\n borderRight: `1px solid ${colors.borderLight}`,\n position: 'sticky',\n top: 0,\n height: 'calc(100vh - 75px)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n ...style,\n },\n title: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: fontSizes.lg,\n color: colors.textPrimary,\n marginBottom: spacing[4],\n },\n section: {\n marginBottom: spacing[6],\n },\n sectionLabel: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.sm,\n color: colors.textSecondary,\n marginBottom: spacing[2],\n },\n contentTop: {\n flexShrink: 0,\n },\n zipInputWrapper: {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n },\n zipInput: {\n width: '100%',\n padding: `${spacing[2]} ${spacing[3]}`,\n paddingRight: spacing[8],\n fontFamily: fonts.primary,\n fontSize: fontSizes.base,\n color: colors.textPrimary,\n border: `1px solid ${colors.evTeal}`,\n borderRadius: borderRadius.md,\n outline: 'none',\n },\n clearButton: {\n position: 'absolute',\n right: spacing[2],\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: spacing[1],\n color: colors.evTeal,\n fontSize: fontSizes.lg,\n lineHeight: 1,\n display: zipCode ? 'block' : 'none',\n },\n radioGroup: {\n display: 'flex',\n flexDirection: isMobile ? 'row' : 'column',\n flexWrap: isMobile ? 'wrap' : 'nowrap',\n gap: spacing[2],\n },\n radioLabel: {\n display: 'flex',\n alignItems: 'center',\n gap: spacing[2],\n cursor: 'pointer',\n fontFamily: fonts.primary,\n fontSize: fontSizes.base,\n color: colors.textPrimary,\n },\n radioInput: {\n width: '16px',\n height: '16px',\n accentColor: colors.evTeal,\n cursor: 'pointer',\n },\n imageSection: {\n flexGrow: 1,\n flexShrink: 1,\n minHeight: 0,\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n },\n locationLabel: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: fontSizes.base,\n color: colors.textPrimary,\n marginBottom: spacing[3],\n },\n buildingImage: {\n width: '100%',\n borderRadius: borderRadius.lg,\n objectFit: 'cover',\n aspectRatio: '1/2.25',\n flexShrink: 1,\n minHeight: 0,\n overflow: 'hidden',\n },\n buildingPlaceholder: {\n width: '100%',\n aspectRatio: '1/2.25',\n backgroundColor: colors.bgLight,\n borderRadius: borderRadius.lg,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: colors.textMuted,\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n },\n };\n\n return (\n <aside style={styles.sidebar} className=\"ev-filter-sidebar\">\n {!isMobile && <h2 style={styles.title}>{title}</h2>}\n\n <div style={isMobile ? undefined : styles.contentTop}>\n {/* Location Input */}\n <div style={isMobile ? { marginBottom: spacing[3] } : styles.section}>\n {!isMobile && <label style={styles.sectionLabel}>Location</label>}\n {autocompleteContainerRef ? (\n <div\n ref={autocompleteContainerRef}\n style={styles.zipInputWrapper}\n className=\"ev-autocomplete-container\"\n />\n ) : (\n <div style={styles.zipInputWrapper}>\n <input\n ref={zipInputRef}\n type=\"text\"\n value={zipCode}\n onChange={(e) => onZipChange?.(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"ZIP or address\"\n style={styles.zipInput}\n aria-label=\"Search location\"\n />\n <button\n type=\"button\"\n onClick={onZipClear}\n style={styles.clearButton}\n aria-label=\"Clear ZIP code\"\n >\n &times;\n </button>\n </div>\n )}\n </div>\n\n {/* Filter Radio Buttons */}\n <div style={isMobile ? {} : styles.section}>\n {!isMobile && <label style={styles.sectionLabel}>Group</label>}\n <div style={styles.radioGroup} role=\"radiogroup\" aria-label=\"Filter by group\">\n {filterOptions.map((option) => (\n <label key={option.value} style={styles.radioLabel}>\n <input\n type=\"radio\"\n name=\"filter\"\n value={option.value}\n checked={selectedFilter === option.value}\n onChange={() => onFilterChange?.(option.value)}\n style={styles.radioInput}\n />\n {option.label}\n </label>\n ))}\n </div>\n </div>\n </div>\n\n {/* Building image section — fills remaining space, shrinks on short viewports */}\n {!isMobile && (\n <div style={styles.imageSection}>\n {locationLabel && (\n <div style={styles.locationLabel}>{locationLabel}</div>\n )}\n {buildingImageSrc ? (\n <img\n src={buildingImageSrc}\n alt={`${selectedFilter} government building`}\n style={styles.buildingImage}\n />\n ) : (\n <div style={styles.buildingPlaceholder}>\n No image\n </div>\n )}\n </div>\n )}\n </aside>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius, shadows } from './tokens';\n\n/**\n * PoliticianCard component for displaying politician info\n *\n * @param {Object} props\n * @param {string} props.id - Politician ID\n * @param {string} props.imageSrc - Profile image URL\n * @param {string} props.name - Politician name\n * @param {string} props.title - Politician title/position\n * @param {string} [props.subtitle] - Optional 3rd line (e.g., chamber + district)\n * @param {Function} props.onClick - Handler for card click\n * @param {Function} props.onCompassClick - Handler for compass button click\n * @param {'horizontal' | 'vertical'} props.variant - Card layout variant\n * @param {Object} props.style - Additional styles\n * @param {string} props.badge - Optional badge label (e.g., \"Candidate\") shown as coral pill\n * @param {React.ReactNode} [props.footer] - Optional content rendered below subtitle (e.g., icon badges)\n * @param {string} [props.imageWidth] - Photo column width for the horizontal variant (default '90px')\n */\nexport default function PoliticianCard({\n id,\n imageSrc,\n name,\n title,\n subtitle,\n onClick,\n onCompassClick,\n variant = 'horizontal',\n style = {},\n badge,\n imageFocalPoint,\n footer,\n imageWidth = '90px',\n contentStyle = {},\n}) {\n const isHorizontal = variant === 'horizontal';\n // Compute the natural 3:4 height for the image column so the photo is always portrait\n const imageWidthPx = parseInt(imageWidth, 10) || 90;\n const imageMinHeight = isHorizontal ? Math.ceil(imageWidthPx * 4 / 3) : undefined;\n\n const handleCardClick = (e) => {\n // Don't trigger card click if compass button was clicked\n if (e.target.closest('.ev-compass-button')) return;\n onClick?.();\n };\n\n const handleCompassClick = (e) => {\n e.stopPropagation();\n onCompassClick?.();\n };\n\n const styles = {\n card: {\n display: 'flex',\n flexDirection: isHorizontal ? 'row' : 'column',\n alignItems: 'stretch',\n backgroundColor: colors.bgWhite,\n borderRadius: borderRadius.lg,\n border: `1px solid ${colors.borderLight}`,\n overflow: 'hidden',\n cursor: onClick ? 'pointer' : 'default',\n transition: 'box-shadow 0.2s ease, transform 0.2s ease',\n position: 'relative',\n minHeight: imageMinHeight,\n height: '100%',\n ...style,\n },\n imageWrapper: {\n // Horizontal: fixed width with 3:4 aspect ratio so portrait photos look\n // consistent regardless of card content height.\n position: 'relative',\n width: isHorizontal ? imageWidth : '100%',\n height: isHorizontal ? '100%' : 'auto',\n aspectRatio: isHorizontal ? undefined : '4/5',\n flexShrink: 0,\n overflow: 'hidden',\n },\n image: {\n ...(isHorizontal ? { position: 'absolute', top: 0, left: 0 } : {}),\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n objectPosition: imageFocalPoint ?? 'center 20%',\n },\n imagePlaceholder: {\n ...(isHorizontal ? { position: 'absolute', top: 0, left: 0 } : {}),\n width: '100%',\n height: '100%',\n backgroundColor: colors.evTeal,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#ffffff',\n fontFamily: fonts.primary,\n fontSize: isHorizontal ? fontSizes.base : fontSizes.xl,\n fontWeight: fontWeights.bold,\n borderRadius: 0,\n },\n content: {\n flex: 1,\n padding: isHorizontal ? `${spacing[2]} ${spacing[3]}` : spacing[3],\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n ...contentStyle,\n },\n name: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: isHorizontal ? fontSizes.sm : fontSizes.base,\n color: colors.evTeal,\n margin: 0,\n marginBottom: spacing[1],\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: isHorizontal ? 'nowrap' : 'normal',\n display: isHorizontal ? 'block' : '-webkit-box',\n WebkitLineClamp: isHorizontal ? undefined : 2,\n WebkitBoxOrient: 'vertical',\n },\n title: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.regular,\n fontSize: isHorizontal ? fontSizes.xs : fontSizes.sm,\n color: colors.textSecondary,\n margin: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n },\n subtitle: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.regular,\n fontSize: isHorizontal ? '11px' : fontSizes.xs,\n color: colors.textMuted,\n margin: 0,\n marginTop: spacing[1],\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n compassButton: {\n width: isHorizontal ? '28px' : '36px',\n height: isHorizontal ? '28px' : '36px',\n borderRadius: '50%',\n backgroundColor: colors.evTeal,\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n alignSelf: 'center',\n marginRight: isHorizontal ? spacing[3] : 0,\n marginTop: isHorizontal ? 0 : spacing[2],\n position: isHorizontal ? 'relative' : 'absolute',\n bottom: isHorizontal ? 'auto' : spacing[3],\n right: isHorizontal ? 'auto' : spacing[3],\n transition: 'background-color 0.2s ease',\n },\n compassIcon: {\n width: isHorizontal ? '20px' : '24px',\n height: isHorizontal ? '20px' : '24px',\n color: colors.textWhite,\n },\n badge: {\n position: 'absolute',\n bottom: spacing[1],\n right: spacing[1],\n backgroundColor: colors.evCoral,\n color: colors.textWhite,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.semibold,\n fontSize: '10px',\n lineHeight: 1,\n padding: `${spacing[1]} ${spacing[2]}`,\n borderRadius: borderRadius.full,\n zIndex: 1,\n letterSpacing: '0.02em',\n textTransform: 'uppercase',\n },\n };\n\n // Mini radar chart icon SVG — represents the compass radar chart feature\n const CompassIcon = () => (\n <svg\n style={styles.compassIcon}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n {/* Outer hexagon border */}\n <polygon\n points=\"12,1 21.5,6.5 21.5,17.5 12,23 2.5,17.5 2.5,6.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n {/* 6 spokes from center */}\n <line x1=\"12\" y1=\"12\" x2=\"12\" y2=\"1\" stroke=\"currentColor\" strokeWidth=\"1\" />\n <line x1=\"12\" y1=\"12\" x2=\"21.5\" y2=\"6.5\" stroke=\"currentColor\" strokeWidth=\"1\" />\n <line x1=\"12\" y1=\"12\" x2=\"21.5\" y2=\"17.5\" stroke=\"currentColor\" strokeWidth=\"1\" />\n <line x1=\"12\" y1=\"12\" x2=\"12\" y2=\"23\" stroke=\"currentColor\" strokeWidth=\"1\" />\n <line x1=\"12\" y1=\"12\" x2=\"2.5\" y2=\"17.5\" stroke=\"currentColor\" strokeWidth=\"1\" />\n <line x1=\"12\" y1=\"12\" x2=\"2.5\" y2=\"6.5\" stroke=\"currentColor\" strokeWidth=\"1\" />\n {/* Filled radar data polygon */}\n <polygon\n points=\"12,4 18,7.5 18,16 12,19.5 7,15 5,8\"\n fill=\"currentColor\"\n opacity=\"0.35\"\n />\n <polygon\n points=\"12,4 18,7.5 18,16 12,19.5 7,15 5,8\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // Track broken image URLs so we can fall back to initials\n const [imgError, setImgError] = useState(false);\n useEffect(() => { setImgError(false); }, [imageSrc]);\n\n // Extract initials from name for placeholder avatar\n const getInitials = (n) => {\n const parts = (n || '').split(' ').filter(Boolean);\n const initials = parts.length >= 2\n ? parts[0][0] + parts[parts.length - 1][0]\n : parts[0]?.[0] || '?';\n return initials.toUpperCase();\n };\n\n return (\n <div\n style={styles.card}\n className=\"ev-politician-card\"\n onClick={handleCardClick}\n onMouseEnter={(e) => {\n if (onClick) {\n e.currentTarget.style.boxShadow = shadows.md;\n e.currentTarget.style.transform = 'translateY(-2px)';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.boxShadow = 'none';\n e.currentTarget.style.transform = 'none';\n }}\n role={onClick ? 'button' : undefined}\n tabIndex={onClick ? 0 : undefined}\n onKeyDown={(e) => {\n if (onClick && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onClick();\n }\n }}\n >\n {/* Badge */}\n {badge && <span style={styles.badge}>{badge}</span>}\n\n {/* Image */}\n <div style={styles.imageWrapper}>\n {imageSrc && !imgError ? (\n <img\n src={imageSrc}\n alt={`${name} portrait`}\n style={styles.image}\n onError={() => setImgError(true)}\n />\n ) : (\n <div style={styles.imagePlaceholder}>\n {getInitials(name)}\n </div>\n )}\n </div>\n\n {/* Content */}\n <div style={styles.content}>\n <h3 style={styles.name}>{name}</h3>\n <p style={styles.title}>{title}</p>\n {subtitle && (\n <p style={styles.subtitle}>{subtitle}</p>\n )}\n {footer && (\n <div style={{ marginTop: 'auto', marginLeft: '-5px' }}>\n {footer}\n </div>\n )}\n </div>\n\n {/* Compass Button */}\n {onCompassClick && (\n <button\n type=\"button\"\n style={styles.compassButton}\n className=\"ev-compass-button\"\n onClick={handleCompassClick}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = colors.evTealDark;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = colors.evTeal;\n }}\n aria-label={`View ${name}'s compass`}\n >\n <CompassIcon />\n </button>\n )}\n </div>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport {\n colors, fonts, fontWeights, fontSizes,\n spacing, borderRadius, shadows, focus, duration,\n semanticTokens,\n colorScales,\n} from './tokens';\nimport RadarChartCore from './RadarChartCore.jsx';\nimport PlaceholderRadar from './PlaceholderRadar.jsx';\nimport CompassCardHorizontalMeta from './CompassCardHorizontalMeta.jsx';\nimport { buildAnswerMapByShortTitle } from './compassHelpers.js';\n\n/**\n * CompassCardHorizontal — Variant C horizontal card with radar-left / meta-right layout.\n * Ported from essentials/src/components/CompassFirstCard.jsx (variant C branch).\n *\n * Fully controlled — consumer owns view and surface state (D-03).\n * Router-agnostic and context-agnostic. No router or context imports.\n *\n * Props:\n * politician {object} — required politician data\n * userAnswers {Array|null} — user compass answers; null/[] → PlaceholderRadar\n * tierVisuals {object|null} — { bg, accent, text } for tier-specific card background\n * view {string} — 'compass' | 'portrait' (default: 'compass')\n * surface {string} — 'representatives' | 'elections' (default: 'representatives')\n * variant {string} — 'compass' | 'empty' | 'administrative' | 'judicial' | 'no-stances' (default: 'compass')\n * onBuildCompass {Function|null} — called when empty-variant CTA clicked; parent owns deep-link URL\n * onClick {Function} — optional click handler (replaces internal navigate)\n */\n\nconst RADAR_SIZE = 400;\nconst SLOT_WIDTH = 420; // RADAR_SIZE + label-bleed wrapper (Pitfall 1)\n\nexport default function CompassCardHorizontal({\n politician,\n userAnswers = null,\n invertedSpokes = {},\n tierVisuals = null,\n view = 'compass',\n surface = 'representatives',\n variant = 'compass',\n onBuildCompass = null,\n onClick,\n}) {\n const [hovered, setHovered] = useState(false);\n const [focused, setFocused] = useState(false);\n const [imgError, setImgError] = useState(false);\n const [emptyCtaHovered, setEmptyCtaHovered] = useState(false);\n\n useEffect(() => { setImgError(false); }, [politician?.photo_origin_url]);\n\n const cardStyle = {\n position: 'relative',\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: tierVisuals?.bg ?? colors.bgWhite,\n border: `1px solid ${colors.borderLight}`,\n borderRadius: borderRadius.xl,\n overflow: 'hidden', // clips slot corners via card border-radius — no padding needed\n boxShadow: focused ? focus.ring : hovered ? shadows.cardHover : shadows.md,\n transform: hovered ? 'translateY(-2px)' : 'none',\n transition: `box-shadow ${duration.normal} ease, transform ${duration.normal} ease`,\n cursor: onClick ? 'pointer' : 'default',\n fontFamily: fonts.primary,\n outline: 'none',\n };\n\n // fixed square slot — portrait and compass render at same 260×260 dimensions\n const slotStyle = { width: SLOT_WIDTH, height: SLOT_WIDTH, flexShrink: 0, overflow: 'hidden', position: 'relative' };\n\n function renderCompass() {\n if (!userAnswers || userAnswers.length === 0) {\n return <PlaceholderRadar size={RADAR_SIZE} name={politician?.full_name || ''} />;\n }\n\n // Shape userAnswers into topics/data arrays for RadarChartCore.\n // Use short_title keys from the answers directly since userAnswers may already\n // be a map or an array with topic_id references.\n // We build a simple topics list from the answers array and extract values.\n let topics = [];\n let data = {};\n let compareData = {};\n\n try {\n if (Array.isArray(userAnswers) && userAnswers.length > 0) {\n // userAnswers is an array of { topic_id, value, topic?: { short_title, title, id } }\n // If topics are embedded in userAnswers, use them; otherwise build minimal topic stubs\n const hasEmbeddedTopics = userAnswers[0]?.topic?.short_title;\n if (hasEmbeddedTopics) {\n const allowedShorts = userAnswers.map(a => a.topic.short_title);\n const allTopics = userAnswers.map(a => a.topic);\n const { topicsFiltered, answersByShort } = buildAnswerMapByShortTitle(\n allTopics,\n userAnswers,\n allowedShorts\n );\n topics = topicsFiltered;\n data = answersByShort;\n } else {\n // Minimal: treat userAnswers as pre-shaped { short_title: value } map or\n // array with short_title directly\n if (!Array.isArray(userAnswers[0])) {\n // Try treating as array of { short_title, value }\n topics = userAnswers\n .filter(a => a.short_title)\n .map(a => ({ id: a.topic_id || a.short_title, short_title: a.short_title, title: a.short_title }));\n data = {};\n for (const a of userAnswers) {\n if (a.short_title) data[a.short_title] = a.value ?? 0;\n }\n }\n }\n }\n\n // Build compareData from politician stances if available\n if (politician?.stances && typeof politician.stances === 'object') {\n compareData = Array.isArray(politician.stances)\n ? politician.stances.reduce((acc, s) => {\n if (s.short_title) acc[s.short_title] = s.value ?? 0;\n return acc;\n }, {})\n : politician.stances;\n }\n\n // Fallback: if we couldn't shape topics, render placeholder\n if (topics.length === 0) {\n return <PlaceholderRadar size={RADAR_SIZE} name={politician?.full_name || ''} />;\n }\n } catch (err) {\n // T-127-06: malformed userAnswers guard — render placeholder instead of throwing\n return <PlaceholderRadar size={RADAR_SIZE} name={politician?.full_name || ''} />;\n }\n\n return (\n <RadarChartCore\n topics={topics}\n data={data}\n compareData={compareData}\n invertedSpokes={invertedSpokes || {}}\n onToggleInversion={() => {}}\n onReplaceTopic={() => {}}\n size={RADAR_SIZE}\n padding={20}\n labelOffset={5}\n labelFontSize={12}\n />\n );\n }\n\n function renderPortrait() {\n const imageSrc = politician?.photo_origin_url\n || (politician?.images && politician.images[0]?.url)\n || null;\n\n if (imageSrc && !imgError) {\n return (\n <img\n src={imageSrc}\n alt={`${politician.full_name} portrait`}\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n objectPosition: politician.imageFocalPoint ?? 'center 20%',\n display: 'block',\n }}\n onError={() => setImgError(true)}\n />\n );\n }\n\n // Initials fallback — evMutedBlue bg, white text, fills slot\n const parts = (politician?.full_name || '').split(' ').filter(Boolean);\n const initials = (parts.length >= 2\n ? parts[0][0] + parts[parts.length - 1][0]\n : parts[0]?.[0] || '?').toUpperCase();\n\n return (\n <div style={{\n width: '100%',\n height: '100%',\n backgroundColor: colors.evMutedBlue,\n color: colors.textWhite,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: fontSizes['4xl'],\n }}>\n {initials}\n </div>\n );\n }\n\n function renderEmptyVariant() {\n return (\n <div style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n padding: '12px 14px',\n boxSizing: 'border-box',\n backgroundColor: colorScales.teal['050'],\n }}>\n <PlaceholderRadar size={140} name={politician?.full_name || ''} />\n <p style={{\n margin: 0,\n fontSize: fontSizes.xs,\n color: colors.textMuted,\n textAlign: 'center',\n lineHeight: 1.4,\n fontFamily: fonts.primary,\n }}>\n Calibrate your compass to see how you align with {politician?.full_name || 'this official'}\n </p>\n <button\n type=\"button\"\n onClick={onBuildCompass || undefined}\n onMouseEnter={() => setEmptyCtaHovered(true)}\n onMouseLeave={() => setEmptyCtaHovered(false)}\n style={{\n minWidth: '160px',\n height: '40px',\n padding: '0 16px',\n backgroundColor: emptyCtaHovered\n ? semanticTokens.light.buttonPrimary.background.hovered\n : semanticTokens.light.buttonPrimary.background.default,\n color: colors.textWhite,\n fontSize: fontSizes.xs,\n fontWeight: fontWeights.semibold,\n fontFamily: fonts.primary,\n borderRadius: borderRadius.full,\n border: 'none',\n cursor: onBuildCompass ? 'pointer' : 'default',\n whiteSpace: 'nowrap',\n transition: `background ${duration.normal} ease`,\n flexShrink: 0,\n }}\n >\n Calibrate your compass\n </button>\n </div>\n );\n }\n\n function renderUnavailablePlate(message = 'Compass currently unavailable for this role.') {\n return (\n <div style={{\n width: '100%',\n height: '100%',\n backgroundColor: colorScales.teal['050'],\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: spacing[4],\n boxSizing: 'border-box',\n }}>\n <p style={{\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.semibold,\n lineHeight: 1.4,\n color: colors.textMuted,\n textAlign: 'center',\n maxWidth: '180px',\n margin: 0,\n fontFamily: fonts.primary,\n }}>\n {message}\n </p>\n </div>\n );\n }\n\n function renderSlotContent() {\n if (view === 'portrait') return renderPortrait();\n if (variant === 'empty') return renderEmptyVariant();\n if (variant === 'administrative' || variant === 'judicial') return renderUnavailablePlate();\n if (variant === 'no-stances') {\n const name = politician?.full_name || 'this official';\n return renderUnavailablePlate(`No compass stances on file for ${name} yet.`);\n }\n return (\n <div style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: spacing[3],\n boxSizing: 'border-box',\n }}>\n {renderCompass()}\n </div>\n );\n }\n\n return (\n <div\n role=\"article\"\n aria-label={`${politician.full_name}, ${politician.office_title || ''}`}\n tabIndex={0}\n style={cardStyle}\n onClick={onClick}\n onKeyDown={(e) => {\n if (onClick && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onClick();\n }\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n >\n <div style={slotStyle}>\n {renderSlotContent()}\n {surface === 'elections' && politician.running_unopposed && (\n <div style={{\n position: 'absolute',\n bottom: '15px',\n left: 0,\n width: '100%',\n backgroundColor: 'rgba(0,0,0,0.35)',\n color: '#fff',\n fontSize: '12px',\n fontWeight: 700,\n letterSpacing: '0.4px',\n textAlign: 'center',\n textTransform: 'uppercase',\n padding: '6px 0',\n pointerEvents: 'none',\n }}>\n {typeof politician.running_unopposed === 'string' ? politician.running_unopposed : 'Running Unopposed'}\n </div>\n )}\n </div>\n <div style={{ flex: 1, minWidth: 0, padding: spacing[4], paddingLeft: spacing[3] }}>\n <CompassCardHorizontalMeta\n politician={politician}\n surface={surface}\n userAnswers={userAnswers}\n />\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius } from './tokens';\nimport IconOverlay from './IconOverlay.jsx';\n\n/**\n * CompassCardHorizontalMeta — meta column renderer for CompassCardHorizontal.\n * Renders politician name, title (surface-switched), district label, affordance icons,\n * and the \"Running unopposed\" banner on elections surface.\n *\n * Internal to ev-ui — NOT exported from barrel.\n *\n * Props:\n * politician {object} — politician data object\n * surface {string} — 'representatives' | 'elections' (default: 'representatives')\n * userAnswers {Array|null} — user answers for affordance icon logic\n */\nexport default function CompassCardHorizontalMeta({\n politician,\n surface = 'representatives',\n userAnswers,\n}) {\n const titleText = surface === 'elections'\n ? politician.office_running_for\n : politician.office_title;\n\n return (\n <div style={{\n flex: 1,\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: spacing[1],\n }}>\n {/* Name — 18px semibold, evMutedBlue */}\n <p style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.lg,\n fontWeight: fontWeights.semibold,\n lineHeight: 1.4,\n color: colors.evMutedBlue,\n margin: 0,\n }}>\n {politician.full_name}\n </p>\n\n {/* Title — 14px semibold, textSecondary, 2-line clamp */}\n <p style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.semibold,\n lineHeight: 1.4,\n color: colors.textSecondary,\n margin: 0,\n overflow: 'hidden',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n }}>\n {titleText || ''}\n </p>\n\n {/* Subtitle — 14px regular, textMuted, ellipsis single line */}\n {politician.district_label && (\n <p style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.regular,\n lineHeight: 1.5,\n color: colors.textMuted,\n margin: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}>\n {politician.district_label}\n </p>\n )}\n\n {/* Affordance icon strip */}\n <IconOverlay\n ballot={politician.ballot || null}\n hasStances={false}\n branch={politician.branch || null}\n />\n\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport {\n useFloating,\n useHover,\n useFocus,\n useDismiss,\n useRole,\n useInteractions,\n FloatingPortal,\n offset,\n flip,\n shift,\n autoUpdate,\n} from '@floating-ui/react';\nimport { BallotIcon, CompassIcon, BranchIcon } from './icons.js';\nimport { colors, semanticTokens, spacing } from './tokens';\n\n/**\n * A single icon wrapped in an accessible tooltip using @floating-ui/react.\n *\n * @param {{ IconComponent: React.ComponentType, color: string, tooltip: string, size: number, onClick: Function }} props\n */\nfunction IconWithTooltip({ IconComponent, color, tooltip, size = 14, extraProps = {}, onClick }) {\n const [isOpen, setIsOpen] = useState(false);\n\n const { refs, floatingStyles, context } = useFloating({\n open: isOpen,\n onOpenChange: setIsOpen,\n middleware: [offset(8), flip(), shift({ padding: 4 })],\n whileElementsMounted: autoUpdate,\n });\n\n const hover = useHover(context);\n const focus = useFocus(context);\n const dismiss = useDismiss(context);\n const role = useRole(context, { role: 'tooltip' });\n\n const { getReferenceProps, getFloatingProps } = useInteractions([\n hover,\n focus,\n dismiss,\n role,\n ]);\n\n return (\n <>\n <span\n ref={refs.setReference}\n aria-label={tooltip}\n tabIndex={0}\n style={{ display: 'inline-flex', padding: spacing[1], ...(onClick ? { cursor: 'pointer' } : {}) }}\n {...getReferenceProps()}\n onClick={onClick ? (e) => { e.stopPropagation(); onClick(e); } : undefined}\n >\n <IconComponent size={size} color={color} {...extraProps} />\n </span>\n\n {isOpen && (\n <FloatingPortal>\n <div\n ref={refs.setFloating}\n style={{\n ...floatingStyles,\n zIndex: 70,\n background: semanticTokens.light.tooltip.background,\n color: semanticTokens.light.tooltip.text,\n padding: '4px 8px',\n borderRadius: '6px',\n fontSize: '14px',\n fontFamily: \"'Manrope', sans-serif\",\n pointerEvents: 'none',\n whiteSpace: 'nowrap',\n }}\n {...getFloatingProps()}\n >\n {tooltip}\n </div>\n </FloatingPortal>\n )}\n </>\n );\n}\n\n/**\n * IconOverlay — renders a row of icon badges with accessible tooltips below\n * politician card text content (static flow, left-aligned, no background).\n *\n * @param {{\n * ballot: { onBallot: boolean, termEndDate: Date, electionDate: Date, electionLabel: string } | null,\n * hasStances: boolean,\n * branch: 'Executive' | 'Legislative' | 'Judicial' | null,\n * onCompassClick: (e: React.MouseEvent) => void,\n * }} props\n */\nexport default function IconOverlay({ ballot, hasStances, branch, onCompassClick }) {\n if (!ballot && !hasStances && !branch) return null;\n\n const ballotTooltip = ballot\n ? `This seat is on your ballot \\u2014 ${ballot.electionLabel}: ${new Date(ballot.electionDate).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })}`\n : null;\n\n return (\n <div\n style={{\n display: 'flex',\n gap: 4,\n alignItems: 'center',\n justifyContent: 'flex-start',\n padding: 0,\n marginLeft: '-4px', // offset icon wrapper padding so icons align flush-left with text\n }}\n >\n {ballot && (\n <IconWithTooltip\n IconComponent={BallotIcon}\n color={colors.evMutedBlue}\n tooltip={ballotTooltip}\n size={14}\n />\n )}\n {hasStances && (\n <IconWithTooltip\n IconComponent={CompassIcon}\n color={colors.evMutedBlue}\n tooltip=\"Compare your views\"\n size={14}\n onClick={onCompassClick}\n />\n )}\n {branch && (\n <IconWithTooltip\n IconComponent={BranchIcon}\n color={colors.evMutedBlue}\n tooltip={`${branch} branch`}\n size={14}\n extraProps={{ branch: branch.toLowerCase() }}\n />\n )}\n </div>\n );\n}\n","import React from 'react';\n\n/**\n * BallotIcon — represents a ballot / voting form (Lucide \"vote\" pattern)\n * @param {{ size?: number, color?: string }} props\n */\nexport function BallotIcon({ size = 16, color = 'currentColor' }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"m9 12 2 2 4-4\" />\n <path d=\"M5 7c0-1.1.9-2 2-2h10a2 2 0 0 1 2 2v12H5V7Z\" />\n <path d=\"M22 19H2\" />\n </svg>\n );\n}\n\n/**\n * CompassIcon — represents a compass / political compass (Lucide \"compass\" pattern)\n * @param {{ size?: number, color?: string }} props\n */\nexport function CompassIcon({ size = 16, color = 'currentColor' }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m16.24 7.76-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z\" />\n </svg>\n );\n}\n\n/**\n * BranchIcon — represents a government branch with branch-specific SVG\n * @param {{ size?: number, color?: string, branch?: 'executive'|'legislative'|'judicial' }} props\n */\nexport function BranchIcon({ size = 16, color = 'currentColor', branch }) {\n let paths;\n switch (branch) {\n case 'executive':\n paths = (\n <>\n <path d=\"M3 21h18\" />\n <path d=\"M5 21V7l8-4v18\" />\n <path d=\"M19 21V11l-6-4\" />\n <path d=\"M9 9v.01\" />\n <path d=\"M9 12v.01\" />\n <path d=\"M9 15v.01\" />\n <path d=\"M9 18v.01\" />\n <path d=\"M5 21h14\" />\n <line x1=\"13\" y1=\"5\" x2=\"13\" y2=\"3\" />\n <line x1=\"13\" y1=\"3\" x2=\"15\" y2=\"4\" />\n </>\n );\n break;\n case 'legislative':\n paths = (\n <>\n <path d=\"M8 21h12a2 2 0 0 0 2-2v-2H10v2a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v3h4\" />\n <path d=\"M19 17V5a2 2 0 0 0-2-2H4\" />\n <path d=\"M15 8h-5\" />\n <path d=\"M15 12h-5\" />\n </>\n );\n break;\n case 'judicial':\n paths = (\n <>\n <path d=\"M12 3v19\" />\n <path d=\"M5 8l7-5 7 5\" />\n <path d=\"M3 13l2-5 2 5a3 3 0 0 1-4 0z\" />\n <path d=\"M17 13l2-5 2 5a3 3 0 0 1-4 0z\" />\n <path d=\"M8 21h8\" />\n </>\n );\n break;\n default:\n // Landmark fallback — preserves backward compatibility\n paths = (\n <>\n <path d=\"M10 18v-7\" />\n <path d=\"M11.12 2.198a2 2 0 0 1 1.76.006l7.866 3.847c.476.233.31.949-.22.949H3.474c-.53 0-.695-.716-.22-.949z\" />\n <path d=\"M14 18v-7\" />\n <path d=\"M18 18v-7\" />\n <path d=\"M3 22h18\" />\n <path d=\"M6 18v-7\" />\n </>\n );\n break;\n }\n\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n {paths}\n </svg>\n );\n}\n","// Ported verbatim from essentials/src/lib/compass.js.\n// Private util — NOT exported from ev-ui barrel.\n\n/**\n * Build { [short_title]: value } only for the allowed short titles.\n * Any missing answers default to 0.\n */\nexport function buildAnswerMapByShortTitle(\n allTopics,\n allAnswers,\n allowedShorts\n) {\n const allowed = new Set(allowedShorts.map((s) => s.toLowerCase()));\n const topicById = new Map(allTopics.map((t) => [t.id, t]));\n const shortById = new Map(allTopics.map((t) => [t.id, t.short_title]));\n\n // Initialize with 0 for each allowed short title (in allowedShorts order to preserve spoke layout)\n const out = {};\n const topicByShortLower = new Map(allTopics.map((t) => [t.short_title.toLowerCase(), t]));\n for (const s of allowedShorts) {\n const t = topicByShortLower.get(s.toLowerCase());\n if (t) out[t.short_title] = 0;\n }\n\n // Fill in any provided answers that match our allowed set\n for (const a of allAnswers) {\n const st = shortById.get(a.topic_id);\n if (!st) continue;\n if (allowed.has(String(st).toLowerCase())) {\n out[st] = a.value ?? 0;\n }\n }\n\n // Return topics in the same order as allowedShorts (preserves user's spoke layout)\n const topicByShort = new Map(allTopics.map((t) => [t.short_title.toLowerCase(), t]));\n const topicsFiltered = allowedShorts\n .map((s) => topicByShort.get(s.toLowerCase()))\n .filter(Boolean);\n\n return { topicsFiltered, answersByShort: out };\n}\n","import React, { useState, useEffect } from 'react';\nimport {\n colors, fonts, fontWeights, fontSizes,\n spacing, borderRadius, shadows, focus, duration,\n semanticTokens,\n colorScales,\n} from './tokens';\nimport RadarChartCore from './RadarChartCore.jsx';\nimport PlaceholderRadar from './PlaceholderRadar.jsx';\nimport IconOverlay from './IconOverlay.jsx';\nimport { buildAnswerMapByShortTitle } from './compassHelpers.js';\n\n/**\n * CompassCardVertical — meta-on-top, large-radar-below layout.\n * Same prop contract as CompassCardHorizontal.\n */\n\nconst RADAR_SIZE = 400;\n\nexport default function CompassCardVertical({\n politician,\n userAnswers = null,\n invertedSpokes = {},\n tierVisuals = null,\n view = 'compass',\n surface = 'representatives',\n variant = 'compass',\n onBuildCompass = null,\n onClick,\n}) {\n const [hovered, setHovered] = useState(false);\n const [focused, setFocused] = useState(false);\n const [imgError, setImgError] = useState(false);\n const [emptyCtaHovered, setEmptyCtaHovered] = useState(false);\n\n useEffect(() => { setImgError(false); }, [politician?.photo_origin_url]);\n\n const cardStyle = {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n backgroundColor: tierVisuals?.bg ?? colors.bgWhite,\n border: `1px solid ${colors.borderLight}`,\n borderRadius: borderRadius.xl,\n overflow: 'hidden',\n boxShadow: focused ? focus.ring : hovered ? shadows.cardHover : shadows.md,\n transform: hovered ? 'translateY(-2px)' : 'none',\n transition: `box-shadow ${duration.normal} ease, transform ${duration.normal} ease`,\n cursor: onClick ? 'pointer' : 'default',\n fontFamily: fonts.primary,\n outline: 'none',\n };\n\n const titleText = surface === 'elections'\n ? politician.office_running_for\n : politician.office_title;\n\n function renderCompass() {\n if (!userAnswers || userAnswers.length === 0) {\n return <PlaceholderRadar size={RADAR_SIZE} name={politician?.full_name || ''} />;\n }\n let topics = [];\n let data = {};\n let compareData = {};\n try {\n if (Array.isArray(userAnswers) && userAnswers.length > 0) {\n const hasEmbeddedTopics = userAnswers[0]?.topic?.short_title;\n if (hasEmbeddedTopics) {\n const allowedShorts = userAnswers.map(a => a.topic.short_title);\n const allTopics = userAnswers.map(a => a.topic);\n const { topicsFiltered, answersByShort } = buildAnswerMapByShortTitle(\n allTopics, userAnswers, allowedShorts\n );\n topics = topicsFiltered;\n data = answersByShort;\n } else {\n if (!Array.isArray(userAnswers[0])) {\n topics = userAnswers\n .filter(a => a.short_title)\n .map(a => ({ id: a.topic_id || a.short_title, short_title: a.short_title, title: a.short_title }));\n data = {};\n for (const a of userAnswers) {\n if (a.short_title) data[a.short_title] = a.value ?? 0;\n }\n }\n }\n }\n if (politician?.stances && typeof politician.stances === 'object') {\n compareData = Array.isArray(politician.stances)\n ? politician.stances.reduce((acc, s) => {\n if (s.short_title) acc[s.short_title] = s.value ?? 0;\n return acc;\n }, {})\n : politician.stances;\n }\n if (topics.length === 0) {\n return <PlaceholderRadar size={RADAR_SIZE} name={politician?.full_name || ''} />;\n }\n } catch {\n return <PlaceholderRadar size={RADAR_SIZE} name={politician?.full_name || ''} />;\n }\n // Mark a spoke as \"unanswered\" when the politician has no value on it.\n // Dims the axis line and label so sparse-data politicians read more clearly.\n const unansweredSpokes = {};\n for (const t of topics) {\n const v = compareData[t.short_title];\n if (!v || Number(v) === 0) unansweredSpokes[t.short_title] = true;\n }\n return (\n <div style={{ width: RADAR_SIZE + 240, maxWidth: '100%', flexShrink: 0 }}>\n <RadarChartCore\n topics={topics}\n data={data}\n compareData={compareData}\n invertedSpokes={invertedSpokes || {}}\n unansweredSpokes={unansweredSpokes}\n onToggleInversion={() => {}}\n onReplaceTopic={() => {}}\n size={RADAR_SIZE}\n padding={40}\n labelOffset={5}\n labelFontSize={18}\n tightFit={true}\n />\n </div>\n );\n }\n\n function renderAvatar() {\n const imageSrc = politician?.photo_origin_url\n || (politician?.images && politician.images[0]?.url)\n || null;\n const baseStyle = {\n width: 88, height: 110,\n flexShrink: 0, overflow: 'hidden',\n borderRadius: borderRadius.md,\n backgroundColor: colors.evMutedBlue,\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n };\n if (imageSrc && !imgError) {\n return (\n <div style={baseStyle}>\n <img\n src={imageSrc}\n alt={`${politician.full_name} portrait`}\n onError={() => setImgError(true)}\n style={{\n width: '100%', height: '100%',\n objectFit: 'cover',\n objectPosition: politician.imageFocalPoint ?? 'center 20%',\n display: 'block',\n }}\n />\n </div>\n );\n }\n const parts = (politician?.full_name || '').split(' ').filter(Boolean);\n const initials = (parts.length >= 2\n ? parts[0][0] + parts[parts.length - 1][0]\n : parts[0]?.[0] || '?').toUpperCase();\n return (\n <div style={baseStyle}>\n <span style={{\n color: colors.textWhite,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: fontSizes['2xl'],\n }}>{initials}</span>\n </div>\n );\n }\n\n function renderPortrait() {\n const imageSrc = politician?.photo_origin_url\n || (politician?.images && politician.images[0]?.url)\n || null;\n if (imageSrc && !imgError) {\n return (\n <img\n src={imageSrc}\n alt={`${politician.full_name} portrait`}\n style={{\n width: RADAR_SIZE,\n height: RADAR_SIZE,\n objectFit: 'cover',\n objectPosition: politician.imageFocalPoint ?? 'center 20%',\n display: 'block',\n borderRadius: borderRadius.md,\n }}\n onError={() => setImgError(true)}\n />\n );\n }\n const parts = (politician?.full_name || '').split(' ').filter(Boolean);\n const initials = (parts.length >= 2\n ? parts[0][0] + parts[parts.length - 1][0]\n : parts[0]?.[0] || '?').toUpperCase();\n return (\n <div style={{\n width: RADAR_SIZE,\n height: RADAR_SIZE,\n backgroundColor: colors.evMutedBlue,\n color: colors.textWhite,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: fontSizes['5xl'],\n borderRadius: borderRadius.md,\n }}>\n {initials}\n </div>\n );\n }\n\n function renderEmptyVariant() {\n return (\n <div style={{\n width: '100%', height: '100%', flex: 1,\n display: 'flex', flexDirection: 'column',\n alignItems: 'center', justifyContent: 'center',\n gap: '12px', padding: '20px', boxSizing: 'border-box',\n backgroundColor: colorScales.teal['050'],\n borderRadius: borderRadius.md,\n }}>\n <PlaceholderRadar size={220} name={politician?.full_name || ''} />\n <p style={{\n margin: 0, fontSize: fontSizes.sm, color: colors.textMuted,\n textAlign: 'center', lineHeight: 1.4, fontFamily: fonts.primary,\n }}>\n Calibrate your compass to see how you align with {politician?.full_name || 'this official'}\n </p>\n <button\n type=\"button\"\n onClick={onBuildCompass || undefined}\n onMouseEnter={() => setEmptyCtaHovered(true)}\n onMouseLeave={() => setEmptyCtaHovered(false)}\n style={{\n minWidth: '180px', height: '44px', padding: '0 20px',\n backgroundColor: emptyCtaHovered\n ? semanticTokens.light.buttonPrimary.background.hovered\n : semanticTokens.light.buttonPrimary.background.default,\n color: colors.textWhite,\n fontSize: fontSizes.sm, fontWeight: fontWeights.semibold,\n fontFamily: fonts.primary, borderRadius: borderRadius.full,\n border: 'none', cursor: onBuildCompass ? 'pointer' : 'default',\n transition: `background ${duration.normal} ease`,\n }}\n >\n Calibrate your compass\n </button>\n </div>\n );\n }\n\n function renderUnavailablePlate(message) {\n return (\n <div style={{\n width: '100%', height: '100%', flex: 1,\n backgroundColor: colorScales.teal['050'],\n borderRadius: borderRadius.md,\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n padding: spacing[6], boxSizing: 'border-box',\n }}>\n <p style={{\n fontSize: fontSizes.base, fontWeight: fontWeights.semibold,\n lineHeight: 1.4, color: colors.textMuted, textAlign: 'center',\n margin: 0, fontFamily: fonts.primary,\n }}>\n {message}\n </p>\n </div>\n );\n }\n\n function renderSlotContent() {\n if (view === 'portrait') return renderPortrait();\n if (variant === 'empty') return renderEmptyVariant();\n if (variant === 'administrative' || variant === 'judicial') {\n return renderUnavailablePlate('Compass currently unavailable for this role.');\n }\n if (variant === 'no-stances') {\n return renderUnavailablePlate(`No compass stances on file for ${politician?.full_name || 'this official'} yet.`);\n }\n return renderCompass();\n }\n\n return (\n <div\n role=\"article\"\n aria-label={`${politician.full_name}, ${politician.office_title || ''}`}\n tabIndex={0}\n style={cardStyle}\n onClick={onClick}\n onKeyDown={(e) => {\n if (onClick && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onClick();\n }\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n >\n {/* Meta block on top: portrait left, text/icons right.\n flexShrink: 0 so the meta never gets squeezed by the compass slot —\n long names / wrapped titles always render in full. */}\n <div style={{ padding: spacing[4], paddingBottom: spacing[3], display: 'flex', alignItems: 'stretch', gap: spacing[3], flexShrink: 0 }}>\n {renderAvatar()}\n <div style={{ display: 'flex', flexDirection: 'column', gap: spacing[1], minWidth: 0, flex: 1 }}>\n <p style={{\n fontFamily: fonts.primary, fontSize: fontSizes.xl,\n fontWeight: fontWeights.semibold, lineHeight: 1.3,\n color: colors.evMutedBlue, margin: 0,\n }}>\n {politician.full_name}\n </p>\n <p style={{\n fontFamily: fonts.primary, fontSize: fontSizes.sm,\n fontWeight: fontWeights.semibold, lineHeight: 1.4,\n color: colors.textSecondary, margin: 0,\n }}>\n {titleText || ''}\n </p>\n {politician.district_label && (\n <p style={{\n fontFamily: fonts.primary, fontSize: fontSizes.sm,\n fontWeight: fontWeights.regular, lineHeight: 1.5,\n color: colors.textMuted, margin: 0,\n overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap',\n }}>\n {politician.district_label}\n </p>\n )}\n <div style={{ marginTop: 'auto' }}>\n <IconOverlay\n ballot={politician.ballot || null}\n hasStances={false}\n branch={politician.branch || null}\n />\n </div>\n </div>\n </div>\n\n {/* Status banner — sits between meta and compass on elections surface.\n Withdrawn takes precedence over running_unopposed. */}\n {surface === 'elections' && politician.withdrawn && (\n <div style={{\n margin: `0 ${spacing[4]} ${spacing[3]}`,\n backgroundColor: 'rgba(120,0,0,0.85)',\n color: '#fff', fontSize: '12px', fontWeight: 700,\n letterSpacing: '0.4px', textAlign: 'center',\n textTransform: 'uppercase', padding: '6px 0',\n borderRadius: borderRadius.sm,\n }}>\n Withdrawn\n </div>\n )}\n {surface === 'elections' && !politician.withdrawn && politician.running_unopposed && (\n <div style={{\n margin: `0 ${spacing[4]} ${spacing[3]}`,\n backgroundColor: 'rgba(0,0,0,0.75)',\n color: '#fff', fontSize: '12px', fontWeight: 700,\n letterSpacing: '0.4px', textAlign: 'center',\n textTransform: 'uppercase', padding: '6px 0',\n borderRadius: borderRadius.sm,\n }}>\n {typeof politician.running_unopposed === 'string' ? politician.running_unopposed : 'Running Unopposed'}\n </div>\n )}\n\n {/* Compass slot */}\n <div style={{\n flex: 1,\n padding: spacing[4],\n paddingTop: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n minHeight: 0,\n }}>\n {renderSlotContent()}\n </div>\n </div>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius } from './tokens';\nimport { evContext } from './evContext.js';\n\n/**\n * CompassKey — small page-level legend that decodes the radar's colors.\n *\n * Renders an expanded legend strip by default. The user can dismiss it via the\n * × button; the dismissed flag persists to the cross-subdomain ev-context, so\n * once they dismiss it on essentials they won't see it again on compass /\n * read-rank / etc. either. After dismiss it collapses to a small \"?\" pill that\n * re-expands on click.\n *\n * Drop one anywhere above the cards section. Render-cost is trivial; legend\n * isn't tied to a specific card.\n */\nexport default function CompassKey({ compact = false } = {}) {\n const [dismissed, setDismissed] = useState(false);\n const [loaded, setLoaded] = useState(false);\n\n useEffect(() => {\n let cancelled = false;\n evContext.get().then((shared) => {\n if (cancelled) return;\n setDismissed(Boolean(shared?.compassKeyDismissed));\n setLoaded(true);\n }).catch(() => { if (!cancelled) setLoaded(true); });\n return () => { cancelled = true; };\n }, []);\n\n function persistDismissed(value) {\n evContext.get().then((current) => {\n const next = { ...(current || {}), compassKeyDismissed: value };\n evContext.set(next).catch(() => {});\n }).catch(() => {});\n }\n\n function handleDismiss() {\n setDismissed(true);\n persistDismissed(true);\n }\n\n function handleReopen() {\n setDismissed(false);\n persistDismissed(false);\n }\n\n if (!loaded) return null;\n\n const Swatch = ({ color, label, ring }) => (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: spacing[1] }}>\n <span style={{\n display: 'inline-block', width: 12, height: 12, borderRadius: '50%',\n background: color, border: `2px solid ${ring || '#fff'}`,\n boxShadow: '0 0 0 1px rgba(0,0,0,0.08)',\n }} />\n <span style={{ fontSize: fontSizes.xs, color: colors.textSecondary, fontFamily: fonts.primary }}>\n {label}\n </span>\n </span>\n );\n\n if (dismissed) {\n return (\n <button\n type=\"button\"\n onClick={handleReopen}\n aria-label=\"Show compass legend\"\n style={{\n display: 'inline-flex', alignItems: 'center', gap: spacing[1],\n padding: '4px 10px', borderRadius: borderRadius.full,\n background: 'transparent', border: `1px solid ${colors.borderLight}`,\n color: colors.textMuted, fontFamily: fonts.primary,\n fontSize: fontSizes.xs, fontWeight: fontWeights.semibold,\n cursor: 'pointer',\n }}\n >\n <span aria-hidden=\"true\">?</span> Compass key\n </button>\n );\n }\n\n return (\n <div\n role=\"region\"\n aria-label=\"Compass legend\"\n style={{\n display: 'inline-flex', alignItems: 'center',\n flexWrap: 'wrap',\n gap: compact ? spacing[2] : spacing[3],\n padding: compact ? `${spacing[1]} ${spacing[2]}` : `${spacing[2]} ${spacing[3]}`,\n background: '#fff', border: `1px solid ${colors.borderLight}`,\n borderRadius: borderRadius.md, fontFamily: fonts.primary,\n maxWidth: '100%', boxSizing: 'border-box',\n }}\n >\n {!compact && (\n <span style={{\n fontSize: fontSizes.xs, fontWeight: fontWeights.semibold,\n color: colors.textMuted, textTransform: 'uppercase', letterSpacing: '0.5px',\n }}>\n Compass key\n </span>\n )}\n <Swatch color=\"#7C6B9E\" label=\"You\" />\n <Swatch color=\"#5A9A6E\" label=\"Politician\" />\n <Swatch color=\"#fed12e\" label=\"Match\" />\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: spacing[1] }}>\n <span style={{\n fontSize: fontSizes.xs, fontWeight: fontWeights.semibold,\n color: '#9ca3af', fontFamily: fonts.primary,\n textDecoration: 'underline', textDecorationStyle: 'dashed',\n textUnderlineOffset: '3px',\n }}>\n Topic\n </span>\n <span style={{ fontSize: fontSizes.xs, color: colors.textSecondary, fontFamily: fonts.primary }}>\n = no stance\n </span>\n </span>\n <button\n type=\"button\"\n onClick={handleDismiss}\n aria-label=\"Hide compass legend\"\n style={{\n marginLeft: spacing[2], padding: '2px 6px', border: 'none',\n background: 'transparent', color: colors.textMuted,\n fontSize: '16px', lineHeight: 1, cursor: 'pointer',\n }}\n >\n ×\n </button>\n </div>\n );\n}\n","/**\n * evContext — cross-subdomain shared client state for EV apps.\n *\n * Mounts a hidden iframe pointing at the ev-context broker (origin:\n * https://context.empowered.vote in prod, configurable in dev).\n * The broker owns the canonical localStorage on its own origin and bridges\n * read/write/subscribe over postMessage. Every EV subdomain\n * (compass.*, essentials.*, readrank.*, etc.) sees the same data, regardless\n * of which one the user lands on first.\n *\n * Schemaless — store anything serializable. By convention EV apps namespace\n * their data under top-level keys (compass, address, verdicts, etc.).\n *\n * Usage:\n * import { evContext } from '@empoweredvote/ev-ui';\n * evContext.configure({ brokerUrl: 'https://context.empowered.vote' });\n * const state = await evContext.get();\n * await evContext.set({ ...state, address: '123 Main St' });\n * const unsubscribe = evContext.subscribe(state => console.log('updated', state));\n */\n\nconst DEFAULT_BROKER_URL = 'https://ev-context.empowered.vote/';\n\nlet brokerUrl = DEFAULT_BROKER_URL;\nlet iframe = null;\nlet readyPromise = null;\nlet pendingRequests = new Map(); // requestId -> { resolve, reject, timeout }\nlet subscribers = new Set();\nlet lastValue = null;\nlet nextRequestId = 1;\n\nfunction brokerOrigin() {\n try { return new URL(brokerUrl).origin; } catch { return ''; }\n}\n\nfunction ensureMounted() {\n if (typeof window === 'undefined' || typeof document === 'undefined') return null;\n if (iframe) return iframe;\n\n iframe = document.createElement('iframe');\n iframe.src = brokerUrl;\n iframe.setAttribute('aria-hidden', 'true');\n iframe.setAttribute('tabindex', '-1');\n iframe.style.position = 'absolute';\n iframe.style.width = '1px';\n iframe.style.height = '1px';\n iframe.style.border = '0';\n iframe.style.opacity = '0';\n iframe.style.pointerEvents = 'none';\n iframe.style.top = '-9999px';\n iframe.style.left = '-9999px';\n\n window.addEventListener('message', onMessage);\n (document.body || document.documentElement).appendChild(iframe);\n\n readyPromise = new Promise((resolve) => {\n const onReady = (e) => {\n if (e.origin !== brokerOrigin()) return;\n if (!e.data || e.data.type !== 'ev-context:ready') return;\n window.removeEventListener('message', onReady);\n resolve();\n };\n window.addEventListener('message', onReady);\n\n iframe.addEventListener('load', () => {\n setTimeout(() => resolve(), 50);\n });\n });\n\n return iframe;\n}\n\nfunction onMessage(event) {\n if (event.origin !== brokerOrigin()) return;\n const data = event.data;\n if (!data || typeof data !== 'object') return;\n\n if (data.type === 'ev-context:value' || data.type === 'ev-context:ack') {\n const id = data.requestId;\n const wasPending = id && pendingRequests.has(id);\n if (wasPending) {\n const { resolve, timeout } = pendingRequests.get(id);\n clearTimeout(timeout);\n pendingRequests.delete(id);\n resolve(data.type === 'ev-context:value' ? (data.value ?? null) : data.ok);\n }\n // Only notify subscribers for unsolicited value broadcasts, not replies to our own get()\n if (data.type === 'ev-context:value' && !wasPending) {\n lastValue = data.value ?? null;\n notifySubscribers();\n }\n } else if (data.type === 'ev-context:update') {\n lastValue = data.value ?? null;\n notifySubscribers();\n }\n}\n\nfunction notifySubscribers() {\n for (const fn of subscribers) {\n try { fn(lastValue); } catch { /* swallow subscriber errors */ }\n }\n}\n\nfunction send(message, { expectReply = true, timeoutMs = 4000 } = {}) {\n ensureMounted();\n return readyPromise.then(() => new Promise((resolve, reject) => {\n if (!iframe || !iframe.contentWindow) {\n reject(new Error('evContext broker iframe not ready'));\n return;\n }\n const requestId = expectReply ? `req-${nextRequestId++}` : undefined;\n if (expectReply) {\n const timeout = setTimeout(() => {\n pendingRequests.delete(requestId);\n reject(new Error('evContext request timed out'));\n }, timeoutMs);\n pendingRequests.set(requestId, { resolve, reject, timeout });\n }\n try {\n iframe.contentWindow.postMessage({ ...message, requestId }, brokerOrigin());\n if (!expectReply) resolve(true);\n } catch (err) {\n if (expectReply) {\n const entry = pendingRequests.get(requestId);\n if (entry) { clearTimeout(entry.timeout); pendingRequests.delete(requestId); }\n }\n reject(err);\n }\n }));\n}\n\nexport const evContext = {\n /**\n * Override the broker URL. Call once at app startup before any get/set.\n * Defaults to https://ev-context.empowered.vote/ for prod.\n */\n configure({ brokerUrl: url } = {}) {\n if (url) brokerUrl = url;\n },\n\n /** Mount the iframe immediately (optional — get/set will mount lazily). */\n preload() {\n ensureMounted();\n return readyPromise;\n },\n\n /** Read the current shared context. Resolves to the stored value or null. */\n async get() {\n return send({ type: 'ev-context:get' });\n },\n\n /** Overwrite the shared context. */\n async set(value) {\n return send({ type: 'ev-context:set', value });\n },\n\n /** Clear the shared context. */\n async clear() {\n return send({ type: 'ev-context:clear' });\n },\n\n /**\n * Read the userId-stamped authed slice for the given user.\n *\n * Stored shape:\n * { compass?, address?, verdicts?, authed?: { userId, compass?, address?, verdicts? } }\n *\n * - Returns null if there is no stored value, no `authed` body, or the stored\n * `authed.userId` does not match the requested `userId` (mismatch = inert).\n * - Otherwise returns `{ compass, address, verdicts }` with undefined keys\n * omitted.\n *\n * Used by logged-in consumers to do SWR-style hydration: render this slice\n * synchronously on mount, then replace silently when the API responds.\n */\n async getAuthedSlice(userId) {\n if (!userId) return null;\n const current = await this.get();\n if (!current || !current.authed || typeof current.authed !== 'object') return null;\n if (current.authed.userId !== userId) return null;\n const out = {};\n if (current.authed.compass !== undefined) out.compass = current.authed.compass;\n if (current.authed.address !== undefined) out.address = current.authed.address;\n if (current.authed.verdicts !== undefined) out.verdicts = current.authed.verdicts;\n if (current.authed.promotionDismissed !== undefined) {\n out.promotionDismissed = current.authed.promotionDismissed;\n }\n return out;\n },\n\n /**\n * Mirror an authed write into the userId-stamped `authed` slice.\n *\n * - `patch` may contain any subset of `{ compass, address, verdicts }`.\n * Unrecognized keys are dropped.\n * - If the existing `authed.userId` matches `userId`, the patch is merged\n * with the prior authed body (per-domain shallow merge — the patch's\n * compass/address/verdicts replace the prior values).\n * - If it does not match (user switch), the prior authed body is stomped.\n * - Guest top-level keys (compass, address, verdicts at the root) are\n * preserved untouched.\n *\n * Returns false on falsy `userId` or empty patch; otherwise returns the\n * underlying `set()` result.\n */\n async setAuthedSlice(userId, patch) {\n if (!userId) return false;\n if (!patch || typeof patch !== 'object') return false;\n const allowed = {};\n if (patch.compass !== undefined) allowed.compass = patch.compass;\n if (patch.address !== undefined) allowed.address = patch.address;\n if (patch.verdicts !== undefined) allowed.verdicts = patch.verdicts;\n // 260426-mw6: promotionDismissed is a per-userId per-domain dismissal stamp\n // used by useEvContextPromotion. Allowed alongside the mirror keys so the\n // hook can write through the same helper. Patch values are deep-merged\n // into the prior promotionDismissed map (per-domain replace).\n if (patch.promotionDismissed !== undefined) {\n allowed.promotionDismissed = patch.promotionDismissed;\n }\n if (Object.keys(allowed).length === 0) return false;\n\n const current = (await this.get()) || {};\n const priorAuthed = current.authed && current.authed.userId === userId\n ? current.authed\n : null;\n const nextAuthed = { userId };\n if (priorAuthed) {\n if (priorAuthed.compass !== undefined) nextAuthed.compass = priorAuthed.compass;\n if (priorAuthed.address !== undefined) nextAuthed.address = priorAuthed.address;\n if (priorAuthed.verdicts !== undefined) nextAuthed.verdicts = priorAuthed.verdicts;\n if (priorAuthed.promotionDismissed !== undefined) {\n nextAuthed.promotionDismissed = priorAuthed.promotionDismissed;\n }\n }\n if (allowed.compass !== undefined) nextAuthed.compass = allowed.compass;\n if (allowed.address !== undefined) nextAuthed.address = allowed.address;\n if (allowed.verdicts !== undefined) nextAuthed.verdicts = allowed.verdicts;\n // promotionDismissed: deep-merge per-domain so writing { compass: true }\n // does not clobber an earlier { address: true } stamp.\n if (allowed.promotionDismissed !== undefined && allowed.promotionDismissed !== null\n && typeof allowed.promotionDismissed === 'object') {\n const prior = (priorAuthed && priorAuthed.promotionDismissed && typeof priorAuthed.promotionDismissed === 'object')\n ? priorAuthed.promotionDismissed\n : {};\n nextAuthed.promotionDismissed = { ...prior, ...allowed.promotionDismissed };\n }\n\n return this.set({ ...current, authed: nextAuthed });\n },\n\n /**\n * Remove the `authed` slice entirely (preserving guest top-level keys).\n *\n * Provided for completeness — consumers in the v2026.4.5 wiring plan must\n * NOT call this on logout. The slice is intended to go inert via userId\n * mismatch, so a re-login as the same user can rehydrate from cache.\n */\n async clearAuthedSlice() {\n const current = await this.get();\n if (!current || typeof current !== 'object') return true;\n if (!('authed' in current)) return true;\n const { authed: _omit, ...rest } = current;\n return this.set(rest);\n },\n\n /**\n * Subscribe to live updates. Fires when this tab or any other tab\n * (any subdomain) writes to the store. Returns an unsubscribe function.\n */\n subscribe(fn) {\n subscribers.add(fn);\n send({ type: 'ev-context:subscribe' }).then((value) => {\n lastValue = value ?? lastValue;\n try { fn(lastValue); } catch {}\n }).catch(() => {});\n return () => { subscribers.delete(fn); };\n },\n};\n","import React, { useState } from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius, tierColors } from './tokens';\n\n/**\n * CategorySection component for grouping politicians by category\n *\n * @param {Object} props\n * @param {string} props.title - Category title (e.g., \"Mayor\", \"Council\")\n * @param {string} props.infoTooltip - Tooltip text for info icon\n * @param {string} [props.websiteUrl] - Optional URL for external website link\n * @param {React.ReactNode} props.children - Card grid content\n * @param {Object} props.style - Additional styles\n */\nexport default function CategorySection({\n title,\n infoTooltip,\n websiteUrl,\n children,\n style = {},\n tier,\n}) {\n const [showTooltip, setShowTooltip] = useState(false);\n\n const tierStyle = tier ? tierColors[tier] : null;\n\n const styles = {\n section: {\n marginBottom: spacing[8],\n ...style,\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n gap: spacing[2],\n marginBottom: spacing[4],\n },\n titlePill: {\n display: 'inline-flex',\n alignItems: 'center',\n padding: `${spacing[2]} ${spacing[4]}`,\n backgroundColor: colors.bgWhite,\n border: `1px solid ${tierStyle?.accent ?? colors.borderMedium}`,\n borderRadius: borderRadius.lg,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.base,\n color: tierStyle?.text ?? colors.textPrimary,\n },\n infoButton: {\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n border: `1px solid ${colors.borderMedium}`,\n backgroundColor: colors.bgWhite,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontFamily: fonts.primary,\n fontSize: fontSizes.xs,\n color: colors.textMuted,\n position: 'relative',\n },\n tooltip: {\n position: 'absolute',\n top: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginTop: spacing[2],\n padding: `${spacing[2]} ${spacing[3]}`,\n backgroundColor: colors.textPrimary,\n color: colors.textWhite,\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n borderRadius: borderRadius.md,\n whiteSpace: 'nowrap',\n zIndex: 100,\n },\n externalLink: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: colors.textMuted,\n textDecoration: 'none',\n },\n grid: {\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(min(250px, 100%), 1fr))',\n gap: spacing[4],\n },\n };\n\n return (\n <section style={styles.section} className=\"ev-category-section\">\n <div style={styles.header}>\n <span style={styles.titlePill}>{title}</span>\n {infoTooltip && (\n <button\n type=\"button\"\n style={styles.infoButton}\n onMouseEnter={() => setShowTooltip(true)}\n onMouseLeave={() => setShowTooltip(false)}\n onFocus={() => setShowTooltip(true)}\n onBlur={() => setShowTooltip(false)}\n aria-label={`Info about ${title}`}\n >\n i\n {showTooltip && (\n <div style={styles.tooltip} role=\"tooltip\">\n {infoTooltip}\n </div>\n )}\n </button>\n )}\n {websiteUrl && (\n <a\n href={websiteUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={styles.externalLink}\n aria-label={`Visit official website for ${title}`}\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ width: '14px', height: '14px' }}\n >\n <path\n d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </a>\n )}\n </div>\n <div style={styles.grid} className=\"ev-category-grid\">\n {children}\n </div>\n </section>\n );\n}\n","import React from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing } from './tokens';\n\n/**\n * SubGroupSection — a sub-group label + card grid inside a GovernmentBodySection.\n *\n * @param {Object} props\n * @param {string} props.title - Sub-group label (e.g., \"Bloomington Common Council\")\n * @param {string} [props.websiteUrl] - Optional inline link after label\n * @param {React.ReactNode} props.children - PoliticianCard components\n */\nexport default function SubGroupSection({ title, websiteUrl, children, gridTemplateColumns, gap, justifyContent }) {\n const styles = {\n section: {\n marginBottom: spacing[4],\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n gap: spacing[2],\n marginBottom: spacing[2],\n },\n label: {\n fontSize: fontSizes.xs,\n fontWeight: fontWeights.semibold,\n textTransform: 'uppercase',\n letterSpacing: '0.8px',\n color: colors.textMuted,\n fontFamily: fonts.primary,\n },\n link: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: colors.textMuted,\n textDecoration: 'none',\n },\n grid: {\n display: 'grid',\n gridTemplateColumns: gridTemplateColumns || 'repeat(auto-fill, minmax(min(250px, 100%), 1fr))',\n gap: gap || spacing[2],\n justifyContent: justifyContent || undefined,\n width: '100%',\n },\n };\n\n return (\n <div style={styles.section}>\n {title && (\n <div style={styles.header}>\n <span style={styles.label}>{title}</span>\n {websiteUrl && (\n <a\n href={websiteUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={styles.link}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={{ width: '12px', height: '12px' }}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M2 12h20M12 2a15.3 15.3 0 014 10 15.3 15.3 0 01-4 10 15.3 15.3 0 01-4-10 15.3 15.3 0 014-10z\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n </a>\n )}\n </div>\n )}\n <div style={styles.grid} className=\"ev-subgroup-grid\">\n {children}\n </div>\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, tierColors } from './tokens';\n\n/**\n * GovernmentBodySection — collapsible accordion for a government body.\n *\n * @param {Object} props\n * @param {string} props.title - Accordion header (e.g., \"City of Bloomington\")\n * @param {string} [props.websiteUrl] - Top-level website link at far right\n * @param {string} [props.tier] - \"local\" | \"state\" | \"federal\"\n * @param {boolean} [props.defaultExpanded=true] - Initial expand state\n * @param {React.ReactNode} props.children - SubGroupSection components\n */\nexport default function GovernmentBodySection({\n title,\n websiteUrl,\n tier,\n defaultExpanded = true,\n children,\n}) {\n const [expanded, setExpanded] = useState(defaultExpanded);\n\n const tierStyle = tier ? tierColors[tier] : null;\n const accentColor = tierStyle?.accent ?? colors.borderMedium;\n\n const styles = {\n section: {\n marginBottom: spacing[5],\n borderLeft: `3px solid ${accentColor}`,\n paddingLeft: spacing[4],\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n gap: spacing[2],\n marginBottom: expanded ? spacing[3] : 0,\n cursor: 'pointer',\n userSelect: 'none',\n },\n title: {\n fontSize: fontSizes.base,\n fontWeight: fontWeights.bold,\n color: colors.textPrimary,\n fontFamily: fonts.primary,\n },\n toggle: {\n fontSize: fontSizes.xs,\n color: colors.textMuted,\n transition: 'transform 0.2s',\n transform: expanded ? 'rotate(0deg)' : 'rotate(-90deg)',\n },\n link: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: colors.textMuted,\n textDecoration: 'none',\n },\n content: {\n display: expanded ? 'block' : 'none',\n },\n };\n\n return (\n <section style={styles.section} className=\"ev-gov-body-section\">\n <div\n style={styles.header}\n onClick={() => setExpanded((prev) => !prev)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setExpanded((prev) => !prev);\n }\n }}\n aria-expanded={expanded}\n aria-label={`${expanded ? 'Collapse' : 'Expand'} ${title}`}\n >\n <span style={styles.title}>{title}</span>\n {websiteUrl && (\n <a\n href={websiteUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={styles.link}\n onClick={(e) => e.stopPropagation()}\n aria-label={`Visit ${title} website`}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={{ width: '14px', height: '14px' }}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M2 12h20M12 2a15.3 15.3 0 014 10 15.3 15.3 0 01-4 10 15.3 15.3 0 01-4-10 15.3 15.3 0 014-10z\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n </a>\n )}\n <span style={styles.toggle} aria-hidden=\"true\">▼</span>\n </div>\n <div style={styles.content}>\n {children}\n </div>\n </section>\n );\n}\n","import React from 'react';\nimport { colors, spacing } from './tokens';\n\n// Platform detection patterns (duplicated from PoliticianProfile for standalone use)\nconst SOCIAL_PLATFORMS = [\n { test: /facebook\\.com/i, platform: 'facebook' },\n { test: /twitter\\.com|x\\.com/i, platform: 'twitter' },\n { test: /instagram\\.com/i, platform: 'instagram' },\n { test: /linkedin\\.com/i, platform: 'linkedin' },\n { test: /youtube\\.com|youtu\\.be/i, platform: 'youtube' },\n];\n\n/**\n * SocialLinks component for displaying politician social media links\n *\n * @param {Object} props\n * @param {string} props.website - Website URL\n * @param {string} props.twitter - Twitter/X handle or URL\n * @param {string} props.facebook - Facebook handle or URL\n * @param {string} props.instagram - Instagram handle or URL\n * @param {string} props.linkedin - LinkedIn URL or handle\n * @param {string[]} props.extraLinks - Additional social platform URLs detected from websites list\n * @param {'sm' | 'md' | 'lg'} props.size - Icon size\n * @param {Object} props.style - Additional styles\n */\nexport default function SocialLinks({\n website,\n twitter,\n facebook,\n instagram,\n linkedin,\n extraLinks = [],\n size = 'md',\n darkMode = false,\n style = {},\n}) {\n const iconSizes = {\n sm: '16px',\n md: '18px',\n lg: '20px',\n };\n\n const boxSizes = {\n sm: '32px',\n md: '36px',\n lg: '40px',\n };\n\n const iconSize = iconSizes[size];\n const boxSize = boxSizes[size];\n\n const styles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n gap: spacing[2],\n flexWrap: 'wrap',\n ...style,\n },\n link: {\n color: darkMode ? '#9ca3af' : '#6A7282',\n transition: 'color 0.2s ease, border-color 0.2s ease',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: boxSize,\n height: boxSize,\n border: `1px solid ${darkMode ? 'rgba(255,255,255,0.15)' : '#E5E7EB'}`,\n borderRadius: '10px',\n },\n icon: {\n width: iconSize,\n height: iconSize,\n },\n };\n\n // Helper to format URLs\n const formatUrl = (value, platform) => {\n if (!value) return null;\n if (value.startsWith('http')) return value;\n\n switch (platform) {\n case 'twitter':\n return `https://twitter.com/${value.replace('@', '')}`;\n case 'facebook':\n return `https://facebook.com/${value}`;\n case 'instagram':\n return `https://instagram.com/${value.replace('@', '')}`;\n case 'linkedin':\n return `https://linkedin.com/in/${value}`;\n default:\n return value;\n }\n };\n\n const platformIconMap = {\n twitter: (\n <svg style={styles.icon} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M4 4L10.5 12.5M20 20L13.5 11.5M10.5 12.5L4 20H8L13.5 11.5M10.5 12.5L16 4H20L13.5 11.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ),\n facebook: (\n <svg style={styles.icon} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M18 2H15C13.6739 2 12.4021 2.52678 11.4645 3.46447C10.5268 4.40215 10 5.67392 10 7V10H7V14H10V22H14V14H17L18 10H14V7C14 6.73478 14.1054 6.48043 14.2929 6.29289C14.4804 6.10536 14.7348 6 15 6H18V2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ),\n instagram: (\n <svg style={styles.icon} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"5\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <circle cx=\"12\" cy=\"12\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <circle cx=\"18\" cy=\"6\" r=\"1\" fill=\"currentColor\" />\n </svg>\n ),\n linkedin: (\n <svg style={styles.icon} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M16 8C17.5913 8 19.1174 8.63214 20.2426 9.75736C21.3679 10.8826 22 12.4087 22 14V21H18V14C18 13.4696 17.7893 12.9609 17.4142 12.5858C17.0391 12.2107 16.5304 12 16 12C15.4696 12 14.9609 12.2107 14.5858 12.5858C14.2107 12.9609 14 13.4696 14 14V21H10V14C10 12.4087 10.6321 10.8826 11.7574 9.75736C12.8826 8.63214 14.4087 8 16 8Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <rect x=\"2\" y=\"9\" width=\"4\" height=\"12\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <circle cx=\"4\" cy=\"4\" r=\"2\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n youtube: (\n <svg style={styles.icon} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2\" y=\"5\" width=\"20\" height=\"14\" rx=\"3\" stroke=\"currentColor\" strokeWidth=\"2\"/>\n <polygon points=\"10,9 16,12 10,15\" fill=\"currentColor\"/>\n </svg>\n ),\n };\n\n const links = [\n {\n href: formatUrl(twitter, 'twitter'),\n label: 'X (Twitter)',\n icon: platformIconMap.twitter,\n },\n {\n href: formatUrl(facebook, 'facebook'),\n label: 'Facebook',\n icon: platformIconMap.facebook,\n },\n {\n href: formatUrl(instagram, 'instagram'),\n label: 'Instagram',\n icon: platformIconMap.instagram,\n },\n {\n href: formatUrl(linkedin, 'linkedin'),\n label: 'LinkedIn',\n icon: platformIconMap.linkedin,\n },\n {\n href: website,\n label: 'Website',\n icon: (\n <svg style={styles.icon} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path\n d=\"M2 12H22M12 2C14.5 4.5 16 8 16 12C16 16 14.5 19.5 12 22C9.5 19.5 8 16 8 12C8 8 9.5 4.5 12 2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ),\n },\n ].filter((link) => link.href);\n\n // Append extraLinks mapped to platform icons, skipping duplicates\n extraLinks.forEach((url) => {\n const detected = SOCIAL_PLATFORMS.find(({ test }) => test.test(url));\n if (detected && platformIconMap[detected.platform]) {\n const alreadyPresent = links.some(\n (l) => l.href === url || (l.href && l.href.includes(detected.platform))\n );\n if (!alreadyPresent) {\n links.push({\n href: url,\n label: detected.platform.charAt(0).toUpperCase() + detected.platform.slice(1),\n icon: platformIconMap[detected.platform],\n });\n }\n }\n });\n\n if (links.length === 0) {\n return null;\n }\n\n return (\n <div style={styles.container} className=\"ev-social-links\">\n {links.map((link) => (\n <a\n key={link.label}\n href={link.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={styles.link}\n aria-label={link.label}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = colors.evTeal;\n e.currentTarget.style.borderColor = colors.evTeal;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = darkMode ? '#9ca3af' : '#6A7282';\n e.currentTarget.style.borderColor = darkMode ? 'rgba(255,255,255,0.15)' : '#E5E7EB';\n }}\n >\n {link.icon}\n </a>\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius } from './tokens';\n\n/**\n * IssueTags component for displaying topic/issue tags\n *\n * @param {Object} props\n * @param {Array} props.tags - Tag items [{label, value}]\n * @param {Array} props.selectedTags - Selected tag values (for selectable variant)\n * @param {Function} props.onTagClick - Handler for tag clicks\n * @param {'default' | 'selectable'} props.variant - Tag interaction variant\n * @param {Object} props.style - Additional styles\n */\nexport default function IssueTags({\n tags = [],\n selectedTags = [],\n onTagClick,\n variant = 'default',\n style = {},\n}) {\n const isSelectable = variant === 'selectable';\n\n const styles = {\n container: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: spacing[2],\n ...style,\n },\n tag: (isSelected) => ({\n display: 'inline-flex',\n alignItems: 'center',\n padding: `${spacing[2]} ${spacing[4]}`,\n borderRadius: borderRadius.full,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.sm,\n border: `1px solid ${isSelected ? colors.evTeal : colors.borderMedium}`,\n backgroundColor: isSelected ? colors.evTeal : colors.bgWhite,\n color: isSelected ? colors.textWhite : colors.textPrimary,\n cursor: onTagClick ? 'pointer' : 'default',\n transition: 'all 0.2s ease',\n userSelect: 'none',\n }),\n };\n\n const handleTagClick = (tag) => {\n if (onTagClick) {\n onTagClick(tag.value);\n }\n };\n\n const handleKeyDown = (e, tag) => {\n if (onTagClick && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onTagClick(tag.value);\n }\n };\n\n return (\n <div style={styles.container} className=\"ev-issue-tags\" role=\"list\">\n {tags.map((tag) => {\n const isSelected = selectedTags.includes(tag.value);\n return (\n <span\n key={tag.value}\n style={styles.tag(isSelected)}\n onClick={() => handleTagClick(tag)}\n onKeyDown={(e) => handleKeyDown(e, tag)}\n onMouseEnter={(e) => {\n if (onTagClick && !isSelected) {\n e.currentTarget.style.borderColor = colors.evTeal;\n e.currentTarget.style.color = colors.evTeal;\n }\n }}\n onMouseLeave={(e) => {\n if (onTagClick && !isSelected) {\n e.currentTarget.style.borderColor = colors.borderMedium;\n e.currentTarget.style.color = colors.textPrimary;\n }\n }}\n role=\"listitem\"\n tabIndex={onTagClick ? 0 : undefined}\n aria-pressed={isSelectable ? isSelected : undefined}\n >\n {tag.label}\n </span>\n );\n })}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { fonts, fontWeights, spacing } from './tokens';\n\nconst ROLE_ORDER = {\n 'chair': 0,\n 'co-chair': 1,\n 'vice chair': 2,\n 'vice-chair': 2,\n 'ranking member': 3,\n 'member': 4,\n};\n\nfunction getRoleRank(position) {\n if (!position) return 99;\n const lower = formatPosition(position).toLowerCase();\n for (const [key, rank] of Object.entries(ROLE_ORDER)) {\n if (lower.includes(key)) return rank;\n }\n return 99;\n}\n\n/** Convert snake_case/kebab-case position to Title Case (e.g. \"ranking_member\" → \"Ranking Member\") */\nfunction formatPosition(position) {\n if (!position) return '';\n return position\n .replace(/[_-]/g, ' ')\n .replace(/\\b\\w/g, c => c.toUpperCase())\n .trim();\n}\n\n/**\n * CommitteeTable component for displaying committee memberships\n *\n * @param {Object} props\n * @param {Array} props.committees - Committee items [{name, position, url?}]\n * @param {string} props.title - Table title (default: \"Committee Memberships\")\n * @param {number} props.maxVisible - Max rows to show before \"Show all\" (default: 6)\n * @param {Object} props.style - Additional styles\n */\nexport default function CommitteeTable({\n committees = [],\n title = 'Committee Memberships',\n maxVisible = 6,\n style = {},\n}) {\n const [showAll, setShowAll] = useState(false);\n\n if (committees.length === 0) {\n return null;\n }\n\n // Sort: chairs first, then vice chairs, then ranking members, then members\n const sorted = [...committees].sort((a, b) => getRoleRank(a.position) - getRoleRank(b.position));\n const visible = showAll ? sorted : sorted.slice(0, maxVisible);\n const hasMore = sorted.length > maxVisible;\n\n const styles = {\n container: {\n ...style,\n },\n heading: {\n display: 'flex',\n alignItems: 'center',\n gap: spacing[2],\n fontFamily: fonts.primary,\n fontWeight: fontWeights.semibold,\n fontSize: '18px',\n color: '#101828',\n margin: 0,\n marginBottom: spacing[3],\n },\n table: {\n width: '100%',\n borderCollapse: 'collapse',\n },\n row: {\n borderBottom: '1px solid #F3F4F6',\n },\n cell: {\n padding: `${spacing[2]} 0`,\n fontFamily: fonts.primary,\n fontSize: '14px',\n verticalAlign: 'top',\n },\n nameCell: {\n color: '#364153',\n paddingRight: spacing[4],\n },\n positionCell: {\n color: '#6A7282',\n textAlign: 'right',\n whiteSpace: 'nowrap',\n },\n link: {\n color: '#364153',\n textDecoration: 'none',\n },\n toggle: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: spacing[1],\n fontFamily: fonts.primary,\n fontSize: '14px',\n fontWeight: fontWeights.medium,\n color: '#6A7282',\n background: 'none',\n border: 'none',\n padding: `${spacing[2]} 0`,\n cursor: 'pointer',\n },\n };\n\n return (\n <div style={styles.container} className=\"ev-committee-table\">\n <h4 style={styles.heading}>\n {/* Users icon */}\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2\" />\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\n <path d=\"M23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75\" />\n </svg>\n {title}\n </h4>\n <table style={styles.table}>\n <tbody>\n {visible.map((committee, index) => (\n <tr key={index} style={styles.row}>\n <td style={{ ...styles.cell, ...styles.nameCell }}>\n {committee.url ? (\n <a\n href={committee.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={styles.link}\n onMouseEnter={(e) => {\n e.currentTarget.style.textDecoration = 'underline';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.textDecoration = 'none';\n }}\n >\n {committee.name}\n </a>\n ) : (\n committee.name\n )}\n </td>\n <td style={{ ...styles.cell, ...styles.positionCell }}>\n {formatPosition(committee.position)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n {hasMore && (\n <button\n type=\"button\"\n style={styles.toggle}\n onClick={() => setShowAll(!showAll)}\n >\n {showAll ? 'Show less' : `Show all ${sorted.length} committees`}\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ transform: showAll ? 'rotate(180deg)' : 'none', transition: 'transform 0.2s' }}\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n )}\n </div>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius, shadows } from './tokens';\nimport useMediaQuery from './useMediaQuery';\nimport SocialLinks from './SocialLinks.jsx';\nimport CommitteeTable from './CommitteeTable.jsx';\nimport LegislativeInlineSummary from './LegislativeInlineSummary.jsx';\nimport JudicialScorecard from './JudicialScorecard.jsx';\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\nfunction formatTermDate(dateStr, precision) {\n if (!dateStr) return null;\n if (precision === 'year') {\n const year = parseInt(dateStr, 10);\n if (!isNaN(year) && year > 1900 && year < 2100) return String(year);\n }\n const d = new Date(dateStr);\n if (isNaN(d.getTime())) return null;\n return d.toLocaleDateString('en-US', { month: 'short', year: 'numeric' });\n}\n\nfunction getTermLine(pol) {\n const precision = pol.term_date_precision;\n const start = formatTermDate(pol.term_start, precision);\n if (!start) return null;\n const end = formatTermDate(pol.term_end, precision);\n if (!end) return `Since ${start}`;\n return `${start} \\u2013 ${end}`;\n}\n\nfunction stripRetain(s) {\n return (s || '').replace(/\\s*\\(Retain\\s+.+?\\?\\)/, '');\n}\n\nfunction qualifyLocalTitle(baseTitle, pol) {\n if (!baseTitle) return baseTitle;\n const dt = pol.district_type || '';\n if (!dt.startsWith('LOCAL') && dt !== 'COUNTY') return baseTitle;\n // Use government_name if set; fall back to representing_city for loaders that\n // don't create a chamber→government record (e.g. Utah at-large city councils).\n const govRaw = pol.government_name || pol.representing_city || '';\n if (!govRaw) return baseTitle;\n const gov = govRaw.split(',')[0].trim();\n const govCore = gov.replace(/^City of\\s+/i, '').replace(/\\s+County$/i, '').trim();\n if (govCore && baseTitle.toLowerCase().includes(govCore.toLowerCase())) return baseTitle;\n let prefix = dt === 'COUNTY' ? gov : gov.replace(/^City of\\s+/i, '');\n if (prefix.endsWith('County') && baseTitle.startsWith('County'))\n prefix = prefix.replace(/\\s+County$/, '');\n return `${prefix} ${baseTitle}`;\n}\n\n/**\n * Derive a card subtitle from the seat designation embedded in the office title,\n * scoped to local offices. Returns \"Ward N\" | \"District N\" | \"At-Large\" | null.\n * Keeps each jurisdiction's own term (e.g. SLC councils say \"Ward\", Ogden says\n * \"District\") rather than normalizing, and surfaces at-large seats that carry the\n * marker in their title (e.g. \"Council At-Large Seat A\") regardless of district_id.\n */\nfunction deriveSeatSubtitle(pol, cleanTitle) {\n const dt = pol.district_type || '';\n if (!dt.startsWith('LOCAL') && dt !== 'COUNTY') return null;\n const t = cleanTitle || '';\n if (/\\bat[- ]large\\b/i.test(t)) return 'At-Large';\n let m = t.match(/\\bward\\s+(\\d+)/i);\n if (m) return `Ward ${m[1]}`;\n m = t.match(/\\bdistrict\\s+(\\d+)/i);\n if (m) return `District ${m[1]}`;\n return null;\n}\n\nfunction buildTitleAndSubtitle(pol) {\n const cleanTitle = stripRetain(pol.office_title);\n const cleanChamber = stripRetain(pol.chamber_name);\n const dashIdx = cleanTitle.lastIndexOf(' - ');\n\n const title = (() => {\n if (dashIdx > 0) return qualifyLocalTitle(cleanTitle.slice(0, dashIdx), pol);\n // NATIONAL_JUDICIAL: show role as title (e.g. \"Chief Justice\"), chamber as subtitle\n if (pol.district_type === 'NATIONAL_JUDICIAL')\n return cleanTitle || cleanChamber;\n if (pol.district_type === 'SCHOOL' && pol.government_name) {\n const schoolName = pol.government_name.split(',')[0];\n return cleanChamber ? `${schoolName} ${cleanChamber}` : schoolName;\n }\n if (/(_EXEC)$/.test(pol.district_type) || pol.district_type === 'COUNTY')\n return qualifyLocalTitle(cleanTitle || cleanChamber, pol);\n return qualifyLocalTitle(cleanChamber || cleanTitle, pol);\n })();\n\n const subtitle = (() => {\n if (dashIdx > 0) return normalizeDistrictSubtitle(cleanTitle.slice(dashIdx + 3));\n // NATIONAL_JUDICIAL: show court name as subtitle (e.g. \"Supreme Court of the United States\")\n if (pol.district_type === 'NATIONAL_JUDICIAL')\n return cleanChamber || null;\n // Seat designation embedded in the office title takes priority for local offices,\n // so each jurisdiction's own term wins (SLC \"Ward 3\", Ogden \"District 2\", at-large\n // seats \"At-Large\") even when district_id is null or shared across seats.\n const seatFromTitle = deriveSeatSubtitle(pol, cleanTitle);\n if (seatFromTitle) return seatFromTitle;\n if (pol.district_id && /^[1-9]\\d*$/.test(pol.district_id))\n return `District ${pol.district_id}`;\n if (pol.district_id === '0' && !/(_EXEC)$/.test(pol.district_type))\n return 'At-Large';\n return null;\n })();\n\n return { title, subtitle };\n}\n\n/** Map district_type prefix to tier label */\nfunction getTierLabel(districtType, officeTitle) {\n if (!districtType) return null;\n if (districtType.startsWith('NATIONAL')) return 'FEDERAL';\n if (districtType.startsWith('STATE')) return 'STATE';\n // Judicial districts: classify by court level\n if (districtType === 'JUDICIAL' && officeTitle) {\n const t = officeTitle.toLowerCase();\n if (t.includes('supreme court') || t.includes('appeals') || t.includes('tax court')) return 'STATE';\n }\n return 'LOCAL';\n}\n\n/** Tier badge colors */\nfunction getTierColors(tier, darkMode) {\n if (darkMode) {\n switch (tier) {\n case 'FEDERAL': return { bg: 'rgba(30,64,175,0.25)', text: '#93c5fd' };\n case 'STATE': return { bg: 'rgba(22,101,52,0.25)', text: '#86efac' };\n default: return { bg: 'rgba(126,34,206,0.25)', text: '#d8b4fe' };\n }\n }\n switch (tier) {\n case 'FEDERAL': return { bg: '#EFF6FF', text: '#1E40AF' };\n case 'STATE': return { bg: '#F0FDF4', text: '#166534' };\n default: return { bg: '#FDF4FF', text: '#7E22CE' };\n }\n}\n\n/** Check if a URL is LinkedIn */\nfunction isLinkedInUrl(url) {\n if (!url) return false;\n try {\n const hostname = new URL(url).hostname.toLowerCase();\n return hostname.includes('linkedin.com');\n } catch {\n return url.toLowerCase().includes('linkedin.com');\n }\n}\n\n/** Social platform detection */\nconst SOCIAL_PLATFORMS = [\n { test: /facebook\\.com/i, platform: 'facebook' },\n { test: /twitter\\.com|x\\.com/i, platform: 'twitter' },\n { test: /instagram\\.com/i, platform: 'instagram' },\n { test: /linkedin\\.com/i, platform: 'linkedin' },\n { test: /youtube\\.com|youtu\\.be/i, platform: 'youtube' },\n];\n\nfunction detectSocialPlatform(url) {\n if (!url) return null;\n for (const { test, platform } of SOCIAL_PLATFORMS) {\n if (test.test(url)) return platform;\n }\n return null;\n}\n\n/** Extract just the domain from a URL for display */\nfunction extractDomain(url) {\n try {\n return new URL(url).hostname.replace(/^www\\./, '');\n } catch {\n return url.replace(/^https?:\\/\\/(www\\.)?/, '').split('/')[0];\n }\n}\n\n/** Extract LinkedIn URL from politician data, and return non-LinkedIn websites */\nfunction extractLinkedIn(pol) {\n let linkedinUrl = null;\n const websites = [];\n\n // Check urls[] (person-level from BallotReady)\n (pol.urls || []).forEach(url => {\n if (isLinkedInUrl(url)) {\n if (!linkedinUrl) linkedinUrl = url;\n } else {\n websites.push(url);\n }\n });\n\n // Check contacts[].website_url\n (pol.contacts || []).forEach(c => {\n if (c.website_url && c.website_url.trim()) {\n if (isLinkedInUrl(c.website_url)) {\n if (!linkedinUrl) linkedinUrl = c.website_url;\n }\n // websites from contacts are handled separately in contact section\n }\n });\n\n return { linkedinUrl, personWebsites: websites };\n}\n\n/** Format an address object for display */\n/** Capitalize first letter of each word (for contact_type display) */\nfunction capitalize(str) {\n if (!str) return str;\n return str.replace(/\\b\\w/g, c => c.toUpperCase());\n}\n\n/** Normalize district subtitle for consistent display\n * e.g. \"Indiana 9th Congressional District\" → \"District 9\" */\nfunction normalizeDistrictSubtitle(raw) {\n if (!raw) return raw;\n // Match patterns like \"Indiana 9th Congressional District\" or \"California 33rd Congressional District\"\n const match = raw.match(/(\\d+)(?:st|nd|rd|th)\\s+Congressional\\s+District/i);\n if (match) return `District ${match[1]}`;\n return raw;\n}\n\nfunction formatAddress(addr) {\n const lines = [addr.address_1, addr.address_2, addr.address_3].filter(Boolean);\n const cityState = [addr.city, addr.state].filter(Boolean).join(', ');\n const cityStateZip = [cityState, addr.postal_code].filter(Boolean).join(' ');\n if (cityStateZip) lines.push(cityStateZip);\n return lines;\n}\n\n// ── SVG Icons ────────────────────────────────────────────────────────\n\nconst CalendarIcon = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\" />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\" />\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" />\n </svg>\n);\n\nconst ClockIcon = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n);\n\nconst MapPinIcon = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z\" />\n <circle cx=\"12\" cy=\"10\" r=\"3\" />\n </svg>\n);\n\nconst PhoneIcon = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 16.92v3a2 2 0 01-2.18 2 19.79 19.79 0 01-8.63-3.07A19.5 19.5 0 013.07 10.8 19.79 19.79 0 01.07 2.18 2 2 0 012.02 0h3a2 2 0 012 1.72c.127.96.361 1.903.7 2.81a2 2 0 01-.45 2.11L6.09 7.91a16 16 0 006 6l1.27-1.27a2 2 0 012.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0122 16.92z\" />\n </svg>\n);\n\nconst MailIcon = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 4H20C21.1 4 22 4.9 22 6V18C22 19.1 21.1 20 20 20H4C2.9 20 2 19.1 2 18V6C2 4.9 2.9 4 4 4Z\" />\n <path d=\"M22 6L12 13L2 6\" />\n </svg>\n);\n\nconst GlobeIcon = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M2 12H22M12 2C14.5 4.5 16 8 16 12C16 16 14.5 19.5 12 22C9.5 19.5 8 16 8 12C8 8 9.5 4.5 12 2Z\" />\n </svg>\n);\n\nconst DollarIcon = ({ size = 20 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"23\" />\n <path d=\"M17 5H9.5a3.5 3.5 0 000 7h5a3.5 3.5 0 010 7H6\" />\n </svg>\n);\n\nconst ExternalLinkIcon = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </svg>\n);\n\n// ── Component ────────────────────────────────────────────────────────\n\n/**\n * PoliticianProfile - Reusable politician profile layout component.\n */\nexport default function PoliticianProfile({\n politician = {},\n onBack,\n backLabel,\n children,\n banner, // slot for injecting content inside the card after heroRow\n style = {},\n legislativeSummary,\n judicialRecord,\n politicianId,\n onNavigateToRecord,\n imageFocalPoint,\n darkMode = false,\n}) {\n const isMobile = useMediaQuery('(max-width: 768px)');\n const pol = politician;\n\n // ── Derived data ───────────────────────────────────────────────────\n\n const displayName = pol.full_name ||\n [pol.first_name, pol.last_name].filter(Boolean).join(' ') ||\n 'Unknown';\n\n const label = backLabel || displayName;\n\n const profileImageUrl = (() => {\n if (pol.images && pol.images.length > 0) {\n const defaultImg = pol.images.find(img => img.type === 'default');\n return defaultImg ? defaultImg.url : pol.images[0].url;\n }\n return pol.photo_origin_url;\n })();\n\n const initials = [pol.first_name, pol.last_name]\n .filter(Boolean)\n .map((n) => n[0])\n .join('');\n\n const [imgError, setImgError] = useState(false);\n useEffect(() => { setImgError(false); }, [profileImageUrl]);\n\n // Social handles\n const getSocialHandle = (type) => {\n const identifier = pol.identifiers?.find(\n (i) => i.identifier_type?.toUpperCase() === type.toUpperCase()\n );\n return identifier?.identifier_value;\n };\n\n const twitter = getSocialHandle('TWITTER');\n const facebook = getSocialHandle('FACEBOOK');\n const instagram = getSocialHandle('INSTAGRAM');\n\n // LinkedIn detection\n const { linkedinUrl, personWebsites } = extractLinkedIn(pol);\n\n // Tier badge\n const tier = getTierLabel(pol.district_type, pol.office_title);\n const tierColors = tier ? getTierColors(tier, darkMode) : null;\n\n // Title & subtitle (no party)\n const { title: roleTitle, subtitle: roleSubtitle } = buildTitleAndSubtitle(pol);\n const roleLine = [roleTitle, roleSubtitle].filter(Boolean).join(' \\u2013 ');\n\n // Term\n const termLine = getTermLine(pol);\n\n // Committees\n const committees = (pol.committees || []).map((c) => ({\n name: c.name,\n position: c.position,\n url: c.urls?.[0],\n }));\n\n // ── Contact data (grouped by type) ────────────────────────────────\n\n // Group addresses\n const addresses = (pol.addresses || []).map(addr => ({\n type: capitalize(addr.contact_type || addr.type || 'office'),\n lines: formatAddress(addr),\n })).filter(a => a.lines.length > 0);\n\n // Group phones, emails, websites by contact_type\n const phonesByType = {};\n const emailsByType = {};\n const allWebsites = []; // non-social websites only\n const socialWebsiteUrls = []; // social platform URLs detected from websites list\n\n (pol.contacts || []).forEach(c => {\n const cType = capitalize(c.contact_type || 'office');\n if (c.phone && c.phone.trim()) {\n if (!phonesByType[cType]) phonesByType[cType] = [];\n phonesByType[cType].push(c.phone.trim());\n }\n if (c.email && c.email.trim()) {\n if (!emailsByType[cType]) emailsByType[cType] = [];\n emailsByType[cType].push(c.email.trim());\n }\n if (c.website_url && c.website_url.trim() && !isLinkedInUrl(c.website_url)) {\n const url = c.website_url.trim();\n if (detectSocialPlatform(url)) {\n if (!socialWebsiteUrls.includes(url)) socialWebsiteUrls.push(url);\n } else {\n allWebsites.push(url);\n }\n }\n });\n\n // Add BallotReady person-level emails\n (pol.email_addresses || []).forEach(email => {\n if (email && email.trim()) {\n if (!emailsByType['General']) emailsByType['General'] = [];\n if (!Object.values(emailsByType).flat().includes(email.trim())) {\n emailsByType['General'].push(email.trim());\n }\n }\n });\n\n // Add person-level websites (non-LinkedIn), deduplicated, splitting social vs plain\n personWebsites.forEach(url => {\n if (detectSocialPlatform(url)) {\n if (!socialWebsiteUrls.includes(url)) socialWebsiteUrls.push(url);\n } else {\n if (!allWebsites.includes(url)) allWebsites.push(url);\n }\n });\n\n const hasAddresses = addresses.length > 0;\n const hasPhones = Object.keys(phonesByType).length > 0;\n const hasEmails = Object.values(emailsByType).some(emails => emails.some(e => e && e.trim()));\n const hasWebsites = allWebsites.length > 0;\n const hasWebsitesCol = hasWebsites || twitter || facebook || instagram || linkedinUrl || socialWebsiteUrls.length > 0;\n const hasContactInfo = hasAddresses || hasPhones || hasEmails || hasWebsitesCol;\n const hasSocial = twitter || facebook || instagram || linkedinUrl;\n\n // ── Styles ─────────────────────────────────────────────────────────\n\n const divider = {\n borderTop: `1px solid ${darkMode ? '#374151' : '#E5E7EB'}`,\n margin: `${spacing[6]} 0`,\n };\n\n const sectionHeading = {\n display: 'flex',\n alignItems: 'center',\n gap: spacing[2],\n fontFamily: fonts.primary,\n fontWeight: fontWeights.semibold,\n fontSize: '18px',\n color: darkMode ? '#f3f4f6' : '#101828',\n margin: 0,\n marginBottom: spacing[4],\n };\n\n const styles = {\n container: {\n fontFamily: fonts.primary,\n ...style,\n },\n backLink: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: spacing[2],\n color: colors.evTeal,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.base,\n textDecoration: 'none',\n cursor: 'pointer',\n marginBottom: spacing[6],\n background: 'none',\n border: 'none',\n padding: 0,\n },\n card: {\n background: darkMode ? '#1a2235' : colors.bgWhite,\n borderRadius: borderRadius.lg,\n boxShadow: shadows.lg,\n padding: isMobile ? spacing[4] : spacing[8],\n marginBottom: spacing[8],\n },\n\n // Hero row\n heroRow: {\n display: 'flex',\n flexDirection: isMobile ? 'column' : 'row',\n gap: isMobile ? spacing[4] : spacing[8],\n alignItems: isMobile ? 'center' : 'flex-start',\n },\n photoWrap: {\n width: isMobile ? '150px' : '192px',\n height: isMobile ? '150px' : '240px',\n flexShrink: 0,\n },\n photo: {\n width: '100%',\n height: '100%',\n borderRadius: borderRadius.lg,\n objectFit: 'cover',\n objectPosition: imageFocalPoint ?? 'center 20%',\n background: colors.borderLight,\n },\n placeholder: {\n width: '100%',\n height: '100%',\n borderRadius: borderRadius.lg,\n background: colors.evTeal,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#ffffff',\n fontSize: isMobile ? fontSizes.xl : fontSizes['3xl'],\n fontWeight: fontWeights.bold,\n },\n infoCol: {\n flex: 1,\n minWidth: 0,\n textAlign: isMobile ? 'center' : 'left',\n },\n tierBadge: tierColors ? {\n display: 'inline-block',\n fontFamily: fonts.primary,\n fontWeight: fontWeights.semibold,\n fontSize: '11px',\n letterSpacing: '0.05em',\n color: tierColors.text,\n background: tierColors.bg,\n padding: '3px 10px',\n borderRadius: borderRadius.full,\n marginBottom: spacing[2],\n } : null,\n name: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: isMobile ? fontSizes['2xl'] : '30px',\n color: darkMode ? '#f3f4f6' : '#101828',\n margin: 0,\n marginBottom: spacing[1],\n lineHeight: 1.2,\n },\n roleLine: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.regular,\n fontSize: isMobile ? fontSizes.base : fontSizes.lg,\n color: darkMode ? '#d1d5db' : '#364153',\n margin: 0,\n marginBottom: spacing[1],\n },\n officeDesc: {\n fontFamily: fonts.primary,\n fontSize: fontSizes.base,\n color: darkMode ? '#9ca3af' : '#6A7282',\n margin: 0,\n marginBottom: spacing[3],\n lineHeight: 1.5,\n },\n bioText: {\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n color: darkMode ? '#9ca3af' : '#6A7282',\n margin: 0,\n marginTop: spacing[1],\n marginBottom: spacing[3],\n lineHeight: 1.5,\n },\n metaRow: {\n display: 'flex',\n alignItems: 'center',\n gap: spacing[4],\n flexWrap: 'wrap',\n marginBottom: spacing[4],\n justifyContent: isMobile ? 'center' : 'flex-start',\n },\n metaItem: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: spacing[1],\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n color: darkMode ? '#9ca3af' : '#6A7282',\n },\n submitBtn: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: spacing[2],\n fontFamily: fonts.primary,\n fontWeight: fontWeights.semibold,\n fontSize: fontSizes.sm,\n color: '#ffffff',\n background: colors.evTeal,\n border: 'none',\n borderRadius: borderRadius.md,\n padding: `${spacing[2]} ${spacing[5]}`,\n cursor: 'pointer',\n textDecoration: 'none',\n transition: 'background 0.2s',\n marginBottom: spacing[3],\n },\n\n // Contact section\n contactGrid: {\n display: 'grid',\n gridTemplateColumns: isMobile\n ? '1fr'\n : (() => {\n const cols = [];\n if (hasAddresses) cols.push('1fr');\n if (hasPhones) cols.push('140px');\n if (hasEmails) cols.push('minmax(180px, 1fr)');\n if (hasWebsitesCol) cols.push('1fr');\n return cols.join(' ');\n })(),\n gap: isMobile ? spacing[4] : spacing[6],\n },\n contactGroup: {\n minWidth: 0,\n },\n contactLabel: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.semibold,\n fontSize: '11px',\n letterSpacing: '0.05em',\n textTransform: 'uppercase',\n color: darkMode ? '#9ca3af' : '#6A7282',\n margin: 0,\n marginBottom: spacing[1],\n display: 'flex',\n alignItems: 'center',\n gap: spacing[1],\n },\n contactValue: {\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n color: darkMode ? '#d1d5db' : '#364153',\n lineHeight: 1.6,\n margin: 0,\n marginBottom: spacing[2],\n },\n contactLink: {\n color: darkMode ? '#59b0c4' : '#364153',\n textDecoration: 'none',\n wordBreak: 'break-all',\n },\n contactSubLabel: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n fontSize: '12px',\n color: darkMode ? '#6b7280' : '#9CA3AF',\n margin: 0,\n marginBottom: spacing[1],\n },\n\n // Coming soon\n comingSoon: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: spacing[1],\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n color: '#6A7282',\n background: '#F3F4F6',\n padding: `${spacing[1]} ${spacing[3]}`,\n borderRadius: borderRadius.full,\n },\n };\n\n // ── Render ─────────────────────────────────────────────────────────\n\n return (\n <div style={styles.container} className=\"ev-politician-profile\">\n {/* Back link */}\n {onBack && (\n <button\n type=\"button\"\n style={styles.backLink}\n onClick={onBack}\n onMouseEnter={(e) => { e.currentTarget.style.textDecoration = 'underline'; }}\n onMouseLeave={(e) => { e.currentTarget.style.textDecoration = 'none'; }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M15 19l-7-7 7-7\" />\n </svg>\n {label}\n </button>\n )}\n\n {/* Main card */}\n <div style={styles.card}>\n\n {/* ── Section 1: Hero Row ── */}\n <div style={styles.heroRow}>\n {/* Photo */}\n <div style={styles.photoWrap}>\n {profileImageUrl && !imgError ? (\n <img\n src={profileImageUrl}\n alt={`${displayName} portrait`}\n style={styles.photo}\n onError={() => setImgError(true)}\n />\n ) : (\n <div style={styles.placeholder}>{initials || '?'}</div>\n )}\n </div>\n\n {/* Info */}\n <div style={styles.infoCol}>\n {styles.tierBadge && (\n <div style={styles.tierBadge}>{tier}</div>\n )}\n <h1 style={styles.name}>{displayName}</h1>\n {banner}\n <p style={styles.roleLine}>{roleLine}</p>\n\n {pol.office_description && (\n <p style={styles.officeDesc}>{pol.office_description}</p>\n )}\n\n {pol.bio_text && (\n <p style={styles.bioText}>{pol.bio_text}</p>\n )}\n\n {/* Term + Years in Office */}\n {(termLine || pol.total_years_in_office > 0) && (\n <div style={styles.metaRow}>\n {termLine && (\n <span style={styles.metaItem}>\n <CalendarIcon size={14} />\n {termLine}\n </span>\n )}\n {pol.total_years_in_office > 0 && (\n <span style={styles.metaItem}>\n <ClockIcon size={14} />\n {pol.total_years_in_office} {pol.total_years_in_office === 1 ? 'year' : 'years'} in office\n </span>\n )}\n </div>\n )}\n\n {/* Submit a Message button */}\n {pol.web_form_url && (\n <a\n href={pol.web_form_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={styles.submitBtn}\n onMouseEnter={(e) => { e.currentTarget.style.background = colors.evTealDark; }}\n onMouseLeave={(e) => { e.currentTarget.style.background = colors.evTeal; }}\n >\n <ExternalLinkIcon size={14} />\n Submit a Message\n </a>\n )}\n\n {/* Social icons moved to bottom of websites column in contact section */}\n </div>\n </div>\n\n {/* ── Section 2: Contact Info ── */}\n {hasContactInfo && (\n <>\n <div style={divider} />\n <div style={sectionHeading}>\n <MailIcon size={20} />\n Contact Information\n </div>\n <div style={styles.contactGrid}>\n {/* Addresses column */}\n {hasAddresses && (\n <div style={styles.contactGroup}>\n <p style={styles.contactLabel}>\n <MapPinIcon size={12} />\n Addresses\n </p>\n {addresses.map((addr, i) => (\n <div key={`addr-${i}`}>\n <p style={{ ...styles.contactSubLabel, ...(i === 0 ? { marginTop: 0 } : { marginTop: spacing[2] }) }}>\n {addr.type}\n </p>\n <p style={styles.contactValue}>\n {addr.lines.map((line, j) => (\n <React.Fragment key={j}>\n {line}\n {j < addr.lines.length - 1 && <br />}\n </React.Fragment>\n ))}\n </p>\n </div>\n ))}\n </div>\n )}\n\n {/* Phones column */}\n {hasPhones && (\n <div style={styles.contactGroup}>\n <p style={styles.contactLabel}>\n <PhoneIcon size={12} />\n Phone\n </p>\n {Object.entries(phonesByType).map(([type, phones], i) => (\n <div key={`phone-${type}`}>\n <p style={{ ...styles.contactSubLabel, ...(i === 0 ? { marginTop: 0 } : { marginTop: spacing[2] }) }}>\n {type}\n </p>\n {phones.map((phone, j) => (\n <p key={j} style={styles.contactValue}>\n <a\n href={`tel:${phone}`}\n style={styles.contactLink}\n onMouseEnter={(e) => { e.currentTarget.style.textDecoration = 'underline'; }}\n onMouseLeave={(e) => { e.currentTarget.style.textDecoration = 'none'; }}\n >\n {phone}\n </a>\n </p>\n ))}\n </div>\n ))}\n </div>\n )}\n\n {/* Emails column */}\n {hasEmails && (\n <div style={styles.contactGroup}>\n <p style={styles.contactLabel}>\n <MailIcon size={12} />\n Email\n </p>\n {Object.entries(emailsByType).filter(([, emails]) => emails.some(e => e && e.trim())).map(([type, emails], i) => (\n <div key={`email-${type}`}>\n <p style={{ ...styles.contactSubLabel, ...(i === 0 ? { marginTop: 0 } : { marginTop: spacing[2] }) }}>\n {type}\n </p>\n {emails.filter(e => e && e.trim()).map((email, j) => (\n <p key={j} style={styles.contactValue}>\n <a\n href={`mailto:${email}`}\n style={styles.contactLink}\n onMouseEnter={(e) => { e.currentTarget.style.textDecoration = 'underline'; }}\n onMouseLeave={(e) => { e.currentTarget.style.textDecoration = 'none'; }}\n >\n {email}\n </a>\n </p>\n ))}\n </div>\n ))}\n </div>\n )}\n\n {/* Websites column */}\n {hasWebsitesCol && (\n <div style={styles.contactGroup}>\n <p style={styles.contactLabel}>\n <GlobeIcon size={12} />\n Websites\n </p>\n {allWebsites.map((url, i) => (\n <p key={i} style={styles.contactValue}>\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={styles.contactLink}\n onMouseEnter={(e) => { e.currentTarget.style.textDecoration = 'underline'; }}\n onMouseLeave={(e) => { e.currentTarget.style.textDecoration = 'none'; }}\n >\n {extractDomain(url)}\n </a>\n </p>\n ))}\n {/* Social icon-only links at bottom of websites column */}\n {(hasSocial || socialWebsiteUrls.length > 0) && (\n <SocialLinks\n twitter={twitter}\n facebook={facebook}\n instagram={instagram}\n linkedin={linkedinUrl}\n extraLinks={socialWebsiteUrls}\n size=\"sm\"\n darkMode={darkMode}\n style={{ marginTop: allWebsites.length > 0 ? '8px' : 0 }}\n />\n )}\n </div>\n )}\n </div>\n </>\n )}\n\n {/* ── Section 3: Committee Memberships ── */}\n {committees.length > 0 && (\n <>\n <div style={divider} />\n <CommitteeTable committees={committees} />\n </>\n )}\n\n {/* ── Section 4: Who is Funding? ── (commented out until ready)\n <div style={divider} />\n <div style={sectionHeading}>\n <DollarIcon size={20} />\n Who is Funding?\n </div>\n <div style={styles.comingSoon}>\n Coming soon\n </div>\n */}\n\n {/* ── Section 5: Legislative Summary / Judicial Scorecard ── */}\n {pol.is_judicial ? (\n <JudicialScorecard\n judicialRecord={judicialRecord}\n politicianId={politicianId}\n onNavigateToRecord={onNavigateToRecord}\n />\n ) : (\n <LegislativeInlineSummary\n summary={legislativeSummary}\n politicianId={politicianId}\n onNavigateToRecord={onNavigateToRecord}\n />\n )}\n </div>\n\n {/* Children slot (compass/radar chart section) */}\n {children}\n </div>\n );\n}\n","import React from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius, shadows } from './tokens';\nimport useMediaQuery from './useMediaQuery';\n\n/**\n * Normalize a position string: replace underscores with spaces, title-case each word.\n * \"not_voting\" -> \"Not Voting\"\n */\nfunction normalizePosition(pos) {\n if (!pos) return '';\n return pos\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/**\n * Derive attendance percentage from votes array.\n * Present = position is NOT \"Not Voting\" and NOT \"Absent\" (after normalizing).\n * Returns null if totalVotes === 0.\n */\nfunction deriveAttendance(votes) {\n if (!votes || votes.length === 0) return null;\n const present = votes.filter((v) => {\n const norm = normalizePosition(v.position);\n return norm !== 'Not Voting' && norm !== 'Absent';\n }).length;\n return Math.round((present / votes.length) * 100);\n}\n\n/**\n * Build a one-line most-recent-action string.\n * Picks the most recent item from bills or votes by date.\n */\nfunction getMostRecentAction(bills, votes) {\n const items = [];\n\n (bills || []).forEach((b) => {\n if (b.introduced_at) {\n items.push({\n date: b.introduced_at,\n text: `${b.number}: ${b.title} \\u2014 ${b.status_label}`,\n });\n }\n });\n\n (votes || []).forEach((v) => {\n if (v.vote_date) {\n const topic = v.bill_title || v.vote_question;\n const normPos = normalizePosition(v.position);\n items.push({\n date: v.vote_date,\n text: `Voted ${normPos} on ${topic} \\u2014 ${v.result}`,\n });\n }\n });\n\n if (items.length === 0) return null;\n items.sort((a, b) => (a.date < b.date ? 1 : -1));\n return items[0].text;\n}\n\n/**\n * LegislativeInlineSummary - Inline legislative activity card embedded in the profile.\n *\n * @param {Object} props\n * @param {Object} props.summary - { recent_bills: [], recent_votes: [] }\n * @param {string} props.politicianId - Opaque ID string for building the /record link\n */\nexport default function LegislativeInlineSummary({ summary, politicianId, onNavigateToRecord }) {\n const isMobile = useMediaQuery('(max-width: 768px)');\n\n // Guard: render nothing when no legislative data exists (local politicians, etc.)\n if (!summary) return null;\n const bills = summary.recent_bills || [];\n const votes = summary.recent_votes || [];\n if (bills.length === 0 && votes.length === 0) return null;\n\n // Derive stats — only show stats with real values\n const attendancePct = deriveAttendance(votes);\n const billsAdvanced = bills.length > 0 ? bills.length : null;\n\n const mostRecentAction = getMostRecentAction(bills, votes);\n\n const stats = [];\n if (attendancePct !== null) {\n stats.push({ value: `Voted in ${attendancePct}% of roll calls`, label: null });\n }\n if (billsAdvanced !== null) {\n const billLabel = billsAdvanced === 1\n ? 'Authored 1 bill that advanced past introduction'\n : `Authored ${billsAdvanced} bills that advanced past introduction`;\n stats.push({ value: billLabel, label: null });\n }\n\n const recordHref = '/politician/' + politicianId + '/record';\n\n const card = {\n borderTop: `1px solid ${colors.borderLight}`,\n padding: `${spacing[4]} ${spacing[4]} 0`,\n marginTop: spacing[4],\n fontFamily: fonts.primary,\n };\n\n const statsRow = {\n display: 'flex',\n flexDirection: isMobile ? 'column' : 'row',\n gap: isMobile ? spacing[2] : spacing[6],\n marginBottom: mostRecentAction ? spacing[3] : spacing[2],\n alignItems: isMobile ? 'flex-start' : 'center',\n };\n\n const statItem = {\n display: 'inline-flex',\n alignItems: 'baseline',\n gap: spacing[1],\n };\n\n const statValue = {\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.semibold,\n color: colors.evTeal,\n };\n\n const statLabel = {\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.regular,\n color: colors.textSecondary,\n };\n\n const actionLine = {\n fontFamily: fonts.primary,\n fontSize: fontSizes.xs,\n color: colors.textSecondary,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n marginBottom: spacing[3],\n };\n\n const footerRow = {\n display: 'flex',\n justifyContent: 'flex-end',\n };\n\n const recordLink = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: spacing[1],\n color: colors.evTeal,\n textDecoration: 'none',\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.medium,\n };\n\n return (\n <div style={card}>\n {/* Stats row */}\n {stats.length > 0 && (\n <div style={statsRow}>\n {stats.map((s, i) => (\n <div key={i} style={statItem}>\n <span style={statValue}>{s.value}</span>\n {s.label && <span style={statLabel}>{s.label}</span>}\n </div>\n ))}\n </div>\n )}\n\n {/* Most recent action */}\n {mostRecentAction && (\n <div style={actionLine} title={mostRecentAction}>\n {mostRecentAction}\n </div>\n )}\n\n {/* Topic tags — populated when mapping table ships */}\n <div>{/* Topic tags placeholder — deferred */}</div>\n\n {/* View Full Legislative Record link */}\n <div style={footerRow}>\n <button\n onClick={() => {\n if (onNavigateToRecord) {\n onNavigateToRecord(recordHref);\n } else {\n window.location.href = recordHref;\n }\n }}\n style={{\n ...recordLink,\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n padding: 0,\n }}\n onMouseEnter={(e) => { e.currentTarget.style.textDecoration = 'underline'; }}\n onMouseLeave={(e) => { e.currentTarget.style.textDecoration = 'none'; }}\n >\n View Full Legislative Record\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M9 18l6-6-6-6\" />\n </svg>\n </button>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { METRIC_LABELS, formatMetricValue, formatDate } from './judicialUtils.js';\n\nconst sectionStyle = {\n fontFamily: \"'Manrope', sans-serif\",\n borderTop: '1px solid #e2e8f0',\n paddingTop: '24px',\n marginTop: '24px',\n};\n\nconst headingStyle = {\n fontSize: '16px',\n fontWeight: 700,\n color: '#2d3748',\n marginBottom: '16px',\n};\n\nconst cardGridStyle = {\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(180px, 1fr))',\n gap: '12px',\n marginBottom: '16px',\n};\n\nconst metricCardStyle = {\n backgroundColor: '#f7fafc',\n borderRadius: '8px',\n padding: '14px 16px',\n border: '1px solid #e2e8f0',\n};\n\nconst metricValueStyle = {\n fontSize: '22px',\n fontWeight: 700,\n color: '#2d3748',\n lineHeight: 1.2,\n};\n\nconst metricLabelStyle = {\n fontSize: '12px',\n fontWeight: 600,\n color: '#718096',\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n marginBottom: '4px',\n};\n\nconst metricContextStyle = {\n fontSize: '12px',\n color: '#a0aec0',\n marginTop: '4px',\n};\n\nconst evalChipStyle = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '6px',\n backgroundColor: '#ebf8ff',\n color: '#2b6cb0',\n borderRadius: '6px',\n padding: '6px 12px',\n fontSize: '13px',\n fontWeight: 600,\n marginRight: '8px',\n marginBottom: '8px',\n};\n\nconst disciplinaryStyle = {\n borderLeft: '3px solid #fc8181',\n backgroundColor: '#fff5f5',\n borderRadius: '0 6px 6px 0',\n padding: '10px 14px',\n marginBottom: '8px',\n fontSize: '13px',\n color: '#742a2a',\n};\n\nconst linkStyle = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n color: '#319795',\n fontSize: '14px',\n fontWeight: 600,\n textDecoration: 'none',\n marginTop: '8px',\n cursor: 'pointer',\n};\n\n/**\n * JudicialScorecard — compact scorecard for judge profiles.\n * Renders in the same slot as LegislativeInlineSummary for legislators.\n *\n * Props:\n * judicialRecord: { judge_detail, evaluations[], metrics[], disciplinary_records[] }\n * politicianId: string (for building the detail link)\n * onNavigateToRecord: (href) => void\n */\nexport default function JudicialScorecard({ judicialRecord, politicianId, onNavigateToRecord }) {\n if (!judicialRecord) return null;\n\n const { evaluations = [], metrics = [], disciplinary_records: disciplinary = [] } = judicialRecord;\n\n // Don't render if there's no data at all\n if (evaluations.length === 0 && metrics.length === 0 && disciplinary.length === 0) {\n return null;\n }\n\n const handleNavigate = (e) => {\n e.preventDefault();\n if (onNavigateToRecord) {\n onNavigateToRecord(`/politician/${politicianId}/judicial-record`);\n }\n };\n\n return (\n <section style={sectionStyle}>\n <h3 style={headingStyle}>Judicial Record</h3>\n\n {/* Evaluation chips */}\n {evaluations.length > 0 && (\n <div style={{ marginBottom: '16px' }}>\n {evaluations.slice(0, 3).map((ev, i) => (\n <span key={i} style={evalChipStyle}>\n {ev.rating}\n <span style={{ fontWeight: 400, color: '#4a90a4', fontSize: '11px' }}>\n — {ev.source}\n </span>\n </span>\n ))}\n </div>\n )}\n\n {/* Metric cards */}\n {metrics.length > 0 && (\n <div style={cardGridStyle}>\n {metrics.slice(0, 4).map((m, i) => (\n <div key={i} style={metricCardStyle}>\n <div style={metricLabelStyle}>\n {METRIC_LABELS[m.metric_type] || m.metric_type.replace(/_/g, ' ')}\n </div>\n <div style={metricValueStyle}>\n {formatMetricValue(m.metric_type, m.value)}\n </div>\n {m.context_label && (\n <div style={metricContextStyle}>{m.context_label}</div>\n )}\n </div>\n ))}\n </div>\n )}\n\n {/* Disciplinary flag (if any) */}\n {disciplinary.length > 0 && (\n <div style={{ marginBottom: '12px' }}>\n {disciplinary.slice(0, 2).map((d, i) => (\n <div key={i} style={disciplinaryStyle}>\n <strong>{d.record_type}</strong> — {formatDate(d.record_date)}\n {d.description && <div style={{ marginTop: '4px' }}>{d.description}</div>}\n </div>\n ))}\n </div>\n )}\n\n {/* Link to full record */}\n <a href={`/politician/${politicianId}/judicial-record`} onClick={handleNavigate} style={linkStyle}>\n View Full Judicial Record →\n </a>\n </section>\n );\n}\n","/** Format a date string (ISO or YYYY-MM-DD or YYYY-MM) into readable form like \"November 7, 2012\". */\nexport function formatDate(dateStr) {\n if (!dateStr) return '';\n // Strip any time/timezone portion: \"2012-11-07T00:00:00Z\" → \"2012-11-07\"\n const cleaned = dateStr.replace(/T.*$/, '');\n const parts = cleaned.split('-');\n // Handle YYYY-MM (no day)\n if (parts.length === 2) {\n const d = new Date(`${cleaned}-01T12:00:00`);\n if (isNaN(d.getTime())) return dateStr;\n return d.toLocaleDateString('en-US', { month: 'long', year: 'numeric' });\n }\n const d = new Date(`${cleaned}T12:00:00`);\n if (isNaN(d.getTime())) return dateStr;\n return d.toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric' });\n}\n\nexport const METRIC_LABELS = {\n reversal_rate: 'Reversal Rate',\n caseload_volume: 'Cases Handled',\n avg_disposition_days: 'Avg. Days to Resolve',\n retention_vote_pct: 'Last Retention Vote',\n};\n\nexport function formatMetricValue(type, value) {\n if (type === 'reversal_rate' || type === 'retention_vote_pct') return `${value}%`;\n if (type === 'avg_disposition_days') return `${Math.round(value)} days`;\n if (type === 'caseload_volume') return Math.round(value).toLocaleString();\n return String(value);\n}\n","import React, { useState } from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius } from './tokens';\nimport useMediaQuery from './useMediaQuery';\n\nconst DEFAULT_LIMIT = 25;\n\n/**\n * Normalize a position or role string: replace underscores with spaces, title-case each word.\n */\nfunction normalizeText(str) {\n if (!str) return '';\n return str\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/**\n * Extract 4-digit year from a date string safely using slice (not new Date() to avoid timezone bugs).\n * Returns null if dateStr is falsy or doesn't start with 4 digits.\n */\nfunction extractYear(dateStr) {\n if (!dateStr || typeof dateStr !== 'string') return null;\n const year = dateStr.slice(0, 4);\n return /^\\d{4}$/.test(year) ? year : null;\n}\n\n/**\n * Get unique sorted years (descending) from an array of items using a date key.\n */\nfunction getYears(items, dateKey) {\n const yearSet = new Set();\n items.forEach((item) => {\n const y = extractYear(item[dateKey]);\n if (y) yearSet.add(y);\n });\n return Array.from(yearSet).sort((a, b) => b.localeCompare(a));\n}\n\n/**\n * Format a date string \"YYYY-MM-DD\" to \"Mar 15, 2024\" for display.\n * Uses slice to extract parts safely.\n */\nfunction formatDate(dateStr) {\n if (!dateStr) return '';\n const year = extractYear(dateStr);\n if (!year) return dateStr;\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const monthIdx = parseInt(dateStr.slice(5, 7), 10) - 1;\n const day = parseInt(dateStr.slice(8, 10), 10);\n if (isNaN(monthIdx) || monthIdx < 0 || monthIdx > 11) return year;\n if (isNaN(day)) return `${monthNames[monthIdx]} ${year}`;\n return `${monthNames[monthIdx]} ${day}, ${year}`;\n}\n\n// ─── Role badge config ────────────────────────────────────────────────────────\n\nconst ROLE_BADGE_CONFIG = {\n chair: { label: 'Chair', bg: colors.evCoral, text: colors.textWhite },\n vice_chair: { label: 'Vice Chair', bg: colors.evTealLight, text: colors.textWhite },\n ranking_member: { label: 'Ranking Member', bg: colors.evTeal, text: colors.textWhite },\n ex_officio: { label: 'Ex Officio', bg: colors.textMuted, text: colors.textWhite },\n member: { label: 'Member', bg: colors.borderMedium, text: colors.textSecondary },\n};\n\nfunction getRoleBadge(role) {\n const key = (role || 'member').toLowerCase().replace(/\\s+/g, '_');\n return ROLE_BADGE_CONFIG[key] || ROLE_BADGE_CONFIG.member;\n}\n\n// ─── Status badge config ──────────────────────────────────────────────────────\n\nfunction getStatusBadge(statusLabel) {\n const s = (statusLabel || '').toLowerCase();\n if (s === 'became law') {\n return { bg: '#dcfce7', text: colors.success };\n }\n if (s === 'vetoed') {\n return { bg: '#fee2e2', text: colors.error };\n }\n if (s === 'passed house' || s === 'passed senate') {\n return { bg: colors.bgLight, text: colors.evTeal };\n }\n if (s === 'failed') {\n return { bg: colors.borderLight, text: colors.textMuted };\n }\n if (s === 'introduced') {\n return { bg: colors.borderLight, text: colors.textMuted };\n }\n // Default fallback\n return { bg: colors.borderLight, text: colors.textSecondary };\n}\n\n// ─── Position badge config ────────────────────────────────────────────────────\n\nfunction getPositionBadge(position) {\n const norm = normalizeText(position);\n if (norm === 'Yea') {\n return { bg: '#bbf7d0', text: colors.success };\n }\n if (norm === 'Nay') {\n return { bg: '#fecaca', text: colors.error };\n }\n if (norm === 'Not Voting') {\n return { bg: colors.borderLight, text: colors.textMuted };\n }\n if (norm === 'Abstain') {\n return { bg: colors.evYellowLight, text: colors.evYellowDark };\n }\n if (norm === 'Absent') {\n return { bg: colors.borderLight, text: colors.textMuted };\n }\n return { bg: colors.borderLight, text: colors.textSecondary };\n}\n\n// ─── Shared sub-components ────────────────────────────────────────────────────\n\nfunction Badge({ label, bg, text }) {\n return (\n <span style={{\n display: 'inline-block',\n background: bg,\n color: text,\n borderRadius: borderRadius.full,\n fontSize: fontSizes.xs,\n fontWeight: fontWeights.semibold,\n fontFamily: fonts.primary,\n padding: `${spacing[1]} ${spacing[3]}`,\n whiteSpace: 'nowrap',\n }}>\n {label}\n </span>\n );\n}\n\nfunction SectionHeader({ title, yearFilter, years, onYearChange }) {\n return (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: spacing[4],\n }}>\n <h2 style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.xl,\n fontWeight: fontWeights.bold,\n color: colors.evTeal,\n margin: 0,\n }}>\n {title}\n </h2>\n {years && years.length > 0 && (\n <select\n value={yearFilter}\n onChange={(e) => onYearChange(e.target.value)}\n style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n color: colors.textSecondary,\n border: `1px solid ${colors.borderLight}`,\n borderRadius: borderRadius.md,\n padding: `${spacing[1]} ${spacing[2]}`,\n background: colors.bgWhite,\n cursor: 'pointer',\n }}\n >\n <option value=\"All\">All years</option>\n {years.map((y) => (\n <option key={y} value={y}>{y}</option>\n ))}\n </select>\n )}\n </div>\n );\n}\n\nfunction ShowAllLink({ totalCount, visibleCount, onClick }) {\n if (totalCount <= visibleCount) return null;\n return (\n <div style={{ textAlign: 'center', marginTop: spacing[3] }}>\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n background: 'none',\n border: 'none',\n color: colors.evTeal,\n fontSize: fontSizes.sm,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n cursor: 'pointer',\n padding: `${spacing[1]} ${spacing[2]}`,\n }}\n onMouseEnter={(e) => { e.currentTarget.style.textDecoration = 'underline'; }}\n onMouseLeave={(e) => { e.currentTarget.style.textDecoration = 'none'; }}\n >\n Show all {totalCount} items\n </button>\n </div>\n );\n}\n\nfunction EmptyState({ message }) {\n return (\n <p style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n color: colors.textMuted,\n fontStyle: 'italic',\n margin: 0,\n padding: `${spacing[3]} 0`,\n }}>\n {message}\n </p>\n );\n}\n\nfunction Spinner() {\n return (\n <div style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: spacing[10],\n }}>\n <div style={{\n width: '40px',\n height: '40px',\n borderRadius: borderRadius.full,\n border: `3px solid ${colors.borderLight}`,\n borderTopColor: colors.evTeal,\n animation: 'ev-spin 0.8s linear infinite',\n }} />\n <style>{`@keyframes ev-spin { to { transform: rotate(360deg); } }`}</style>\n </div>\n );\n}\n\n// ─── Section 1: Committees & Leadership ──────────────────────────────────────\n\nfunction CommitteesSection({ committees, leadership }) {\n const [showAll, setShowAll] = useState(false);\n\n const visible = showAll ? committees : committees.slice(0, DEFAULT_LIMIT);\n\n return (\n <div style={{ marginBottom: spacing[8] }}>\n <SectionHeader title=\"Committees & Leadership\" />\n\n {/* Leadership badges */}\n {leadership && leadership.length > 0 && (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: spacing[2], marginBottom: spacing[4] }}>\n {leadership.map((role, i) => (\n <div key={i} style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: spacing[1],\n background: colors.evCoral,\n color: colors.textWhite,\n borderRadius: borderRadius.md,\n padding: `${spacing[1]} ${spacing[3]}`,\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.semibold,\n }}>\n {role.title}\n {role.chamber && (\n <span style={{ fontWeight: fontWeights.regular, opacity: 0.85 }}>\n ({role.chamber})\n </span>\n )}\n </div>\n ))}\n </div>\n )}\n\n {committees.length === 0 ? (\n <EmptyState message=\"Committee information is not available for this office.\" />\n ) : (\n <>\n <div>\n {visible.map((c, i) => {\n const badge = getRoleBadge(c.role);\n return (\n <div key={i} style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: `${spacing[3]} 0`,\n borderBottom: `1px solid ${colors.borderLight}`,\n gap: spacing[3],\n }}>\n <span style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n color: colors.textSecondary,\n flex: 1,\n minWidth: 0,\n }}>\n {c.committee_name}\n {c.parent_name && (\n <span style={{ color: colors.textMuted, marginLeft: spacing[1] }}>\n ({c.parent_name})\n </span>\n )}\n </span>\n <Badge label={badge.label} bg={badge.bg} text={badge.text} />\n </div>\n );\n })}\n </div>\n {!showAll && (\n <ShowAllLink\n totalCount={committees.length}\n visibleCount={DEFAULT_LIMIT}\n onClick={() => setShowAll(true)}\n />\n )}\n </>\n )}\n </div>\n );\n}\n\n// ─── Section 2: Sponsored Legislation ────────────────────────────────────────\n\nfunction LegislationSection({ bills, isMobile }) {\n const years = getYears(bills, 'introduced_at');\n const [yearFilter, setYearFilter] = useState('All');\n const [showAll, setShowAll] = useState(false);\n\n // Reset showAll when year filter changes\n const handleYearChange = (y) => {\n setYearFilter(y);\n setShowAll(false);\n };\n\n const filtered = yearFilter === 'All'\n ? bills\n : bills.filter((b) => extractYear(b.introduced_at) === yearFilter);\n\n const visible = showAll ? filtered : filtered.slice(0, DEFAULT_LIMIT);\n\n return (\n <div style={{ marginBottom: spacing[8] }}>\n <SectionHeader\n title=\"Sponsored Legislation\"\n yearFilter={yearFilter}\n years={years}\n onYearChange={handleYearChange}\n />\n\n {bills.length === 0 ? (\n <EmptyState message=\"Sponsored legislation data is not available for this office.\" />\n ) : (\n <>\n <div>\n {visible.map((bill, i) => {\n const statusBadge = getStatusBadge(bill.status_label);\n return (\n <div key={i} style={{\n display: 'flex',\n flexDirection: isMobile ? 'column' : 'row',\n alignItems: isMobile ? 'flex-start' : 'center',\n gap: isMobile ? spacing[1] : spacing[3],\n padding: `${spacing[3]} 0`,\n borderBottom: `1px solid ${colors.borderLight}`,\n }}>\n {/* Bill number + title */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <span style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.xs,\n fontWeight: fontWeights.bold,\n color: colors.textSecondary,\n marginRight: spacing[2],\n }}>\n {bill.number}\n </span>\n <span style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n color: colors.textSecondary,\n }}>\n {bill.title}\n </span>\n </div>\n\n {/* Right side: status + date + sponsor indicator */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: spacing[2],\n flexShrink: 0,\n flexWrap: 'wrap',\n }}>\n <Badge label={bill.status_label || 'Unknown'} bg={statusBadge.bg} text={statusBadge.text} />\n {bill.introduced_at && (\n <span style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.xs,\n color: colors.textMuted,\n }}>\n {formatDate(bill.introduced_at)}\n </span>\n )}\n <span style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.xs,\n color: colors.textMuted,\n fontStyle: 'italic',\n }}>\n {bill.is_sponsor ? 'Sponsored' : 'Cosponsored'}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n {!showAll && (\n <ShowAllLink\n totalCount={filtered.length}\n visibleCount={DEFAULT_LIMIT}\n onClick={() => setShowAll(true)}\n />\n )}\n </>\n )}\n </div>\n );\n}\n\n// ─── Section 3: Voting Record ─────────────────────────────────────────────────\n\nfunction VotingSection({ votes, isMobile }) {\n const years = getYears(votes, 'vote_date');\n const [yearFilter, setYearFilter] = useState('All');\n const [showAll, setShowAll] = useState(false);\n\n const handleYearChange = (y) => {\n setYearFilter(y);\n setShowAll(false);\n };\n\n const filtered = yearFilter === 'All'\n ? votes\n : votes.filter((v) => extractYear(v.vote_date) === yearFilter);\n\n const visible = showAll ? filtered : filtered.slice(0, DEFAULT_LIMIT);\n\n return (\n <div style={{ marginBottom: spacing[8] }}>\n <SectionHeader\n title=\"Voting Record\"\n yearFilter={yearFilter}\n years={years}\n onYearChange={handleYearChange}\n />\n\n {votes.length === 0 ? (\n <EmptyState message=\"Voting records are not available for this office.\" />\n ) : (\n <>\n <div>\n {visible.map((vote, i) => {\n const positionBadge = getPositionBadge(vote.position);\n const normPosition = normalizeText(vote.position);\n const topic = vote.bill_title || vote.vote_question;\n const sourceUrl = vote.bill_url;\n return (\n <div key={i} style={{\n display: 'flex',\n flexDirection: isMobile ? 'column' : 'row',\n alignItems: isMobile ? 'flex-start' : 'center',\n gap: isMobile ? spacing[1] : spacing[3],\n padding: `${spacing[3]} 0`,\n borderBottom: `1px solid ${colors.borderLight}`,\n }}>\n {/* Topic */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <span style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n color: colors.textSecondary,\n }}>\n {topic}\n </span>\n </div>\n\n {/* Right side: date + position + outcome + source */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: spacing[2],\n flexShrink: 0,\n flexWrap: 'wrap',\n }}>\n {vote.vote_date && (\n <span style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.xs,\n color: colors.textMuted,\n }}>\n {formatDate(vote.vote_date)}\n </span>\n )}\n <Badge label={normPosition || 'Unknown'} bg={positionBadge.bg} text={positionBadge.text} />\n {vote.result && (\n <span style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.xs,\n color: vote.result === 'Passed' ? colors.success : colors.textMuted,\n fontWeight: fontWeights.medium,\n }}>\n {vote.result}\n </span>\n )}\n {sourceUrl && (\n <a\n href={sourceUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.xs,\n color: colors.evTeal,\n textDecoration: 'none',\n }}\n onMouseEnter={(e) => { e.currentTarget.style.textDecoration = 'underline'; }}\n onMouseLeave={(e) => { e.currentTarget.style.textDecoration = 'none'; }}\n >\n Source\n </a>\n )}\n </div>\n </div>\n );\n })}\n </div>\n {!showAll && (\n <ShowAllLink\n totalCount={filtered.length}\n visibleCount={DEFAULT_LIMIT}\n onClick={() => setShowAll(true)}\n />\n )}\n </>\n )}\n </div>\n );\n}\n\n// ─── Main export ──────────────────────────────────────────────────────────────\n\n/**\n * LegislativeRecord - Full legislative record content component.\n * Headless: no Header, no routing, no data fetching.\n * The page wrapper in essentials handles those concerns.\n *\n * @param {Object} props\n * @param {Array} props.committees - Committee memberships\n * @param {Array} props.leadership - Leadership roles\n * @param {Array} props.bills - Sponsored/cosponsored legislation\n * @param {Array} props.votes - Roll-call vote records\n * @param {boolean} props.loading - Loading state\n * @param {string} props.politicianName - Display name for heading\n */\nexport default function LegislativeRecord({\n committees = [],\n leadership = [],\n bills = [],\n votes = [],\n loading = false,\n politicianName = '',\n}) {\n const isMobile = useMediaQuery('(max-width: 768px)');\n\n if (loading) {\n return <Spinner />;\n }\n\n return (\n <div style={{ fontFamily: fonts.primary }}>\n {politicianName && (\n <h1 style={{\n fontFamily: fonts.primary,\n fontSize: isMobile ? fontSizes['2xl'] : fontSizes['4xl'],\n fontWeight: fontWeights.bold,\n color: colors.evTeal,\n marginBottom: spacing[8],\n marginTop: 0,\n }}>\n Legislative Record: {politicianName}\n </h1>\n )}\n\n <CommitteesSection committees={committees} leadership={leadership} />\n <LegislationSection bills={bills} isMobile={isMobile} />\n <VotingSection votes={votes} isMobile={isMobile} />\n </div>\n );\n}\n","import React from 'react';\nimport { METRIC_LABELS, formatMetricValue, formatDate } from './judicialUtils.js';\n\nconst containerStyle = {\n fontFamily: \"'Manrope', sans-serif\",\n maxWidth: '800px',\n};\n\nconst backBtnStyle = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n color: '#718096',\n fontSize: '14px',\n fontWeight: 600,\n cursor: 'pointer',\n background: 'none',\n border: 'none',\n padding: '8px 0',\n marginBottom: '16px',\n};\n\nconst nameStyle = {\n fontSize: '24px',\n fontWeight: 700,\n color: '#2d3748',\n marginBottom: '4px',\n};\n\nconst roleStyle = {\n fontSize: '15px',\n color: '#718096',\n marginBottom: '24px',\n};\n\nconst sectionHeadingStyle = {\n fontSize: '18px',\n fontWeight: 700,\n color: '#2d3748',\n marginTop: '32px',\n marginBottom: '12px',\n paddingBottom: '8px',\n borderBottom: '2px solid #e2e8f0',\n};\n\nconst tableStyle = {\n width: '100%',\n borderCollapse: 'collapse',\n fontSize: '14px',\n};\n\nconst thStyle = {\n textAlign: 'left',\n padding: '8px 12px',\n fontWeight: 600,\n color: '#718096',\n borderBottom: '1px solid #e2e8f0',\n fontSize: '12px',\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n};\n\nconst tdStyle = {\n padding: '10px 12px',\n borderBottom: '1px solid #f7fafc',\n color: '#2d3748',\n};\n\nconst detailRowStyle = {\n display: 'flex',\n gap: '8px',\n padding: '8px 0',\n borderBottom: '1px solid #f7fafc',\n};\n\nconst detailLabelStyle = {\n fontWeight: 600,\n color: '#718096',\n minWidth: '160px',\n fontSize: '14px',\n};\n\nconst detailValueStyle = {\n color: '#2d3748',\n fontSize: '14px',\n};\n\nconst emptyStateStyle = {\n padding: '24px',\n backgroundColor: '#f7fafc',\n borderRadius: '8px',\n color: '#a0aec0',\n fontSize: '14px',\n textAlign: 'center',\n};\n\n/**\n * JudicialRecordDetail — full-page judicial record view.\n *\n * Props:\n * politician: { full_name, first_name, last_name, office_title, ... }\n * judicialRecord: { judge_detail, evaluations[], metrics[], disciplinary_records[] }\n * onBack: () => void\n */\nexport function JudicialRecordDetail({ politician = {}, judicialRecord, onBack }) {\n if (!judicialRecord) {\n return (\n <div style={containerStyle}>\n <button style={backBtnStyle} onClick={onBack}>&larr; Back to Profile</button>\n <div style={emptyStateStyle}>No judicial record data available.</div>\n </div>\n );\n }\n\n const {\n judge_detail: detail,\n evaluations = [],\n metrics = [],\n disciplinary_records: disciplinary = [],\n } = judicialRecord;\n\n const displayName = politician.full_name || `${politician.first_name || ''} ${politician.last_name || ''}`.trim();\n\n return (\n <div style={containerStyle}>\n <button style={backBtnStyle} onClick={onBack}>&larr; Back to Profile</button>\n\n <h1 style={nameStyle}>{displayName}</h1>\n <p style={roleStyle}>\n {detail?.court_role || politician.office_title}\n {detail?.date_seated && ` · Seated ${formatDate(detail.date_seated)}`}\n </p>\n\n {/* Judge Background */}\n {detail && (\n <>\n <h2 style={sectionHeadingStyle}>Background</h2>\n {detail.appointed_by && (\n <div style={detailRowStyle}>\n <span style={detailLabelStyle}>Appointed by</span>\n <span style={detailValueStyle}>{detail.appointed_by} ({detail.appointing_president_party})</span>\n </div>\n )}\n {detail.confirmation_vote && (\n <div style={detailRowStyle}>\n <span style={detailLabelStyle}>Confirmation Vote</span>\n <span style={detailValueStyle}>{detail.confirmation_vote}</span>\n </div>\n )}\n {detail.election_type && (\n <div style={detailRowStyle}>\n <span style={detailLabelStyle}>Election Type</span>\n <span style={detailValueStyle}>{detail.election_type === 'retention' ? 'Retention (Yes/No)' : 'Contested Election'}</span>\n </div>\n )}\n {detail.areas_of_focus?.length > 0 && (\n <div style={detailRowStyle}>\n <span style={detailLabelStyle}>Areas of Focus</span>\n <span style={detailValueStyle}>{detail.areas_of_focus.join(', ')}</span>\n </div>\n )}\n </>\n )}\n\n {/* Evaluations */}\n <h2 style={sectionHeadingStyle}>Performance Evaluations</h2>\n {evaluations.length === 0 ? (\n <div style={emptyStateStyle}>No evaluation data available yet.</div>\n ) : (\n <table style={tableStyle}>\n <thead>\n <tr>\n <th style={thStyle}>Source</th>\n <th style={thStyle}>Rating</th>\n <th style={thStyle}>Date</th>\n </tr>\n </thead>\n <tbody>\n {evaluations.map((ev, i) => (\n <tr key={i}>\n <td style={tdStyle}>\n {ev.source_url ? (\n <a href={ev.source_url} target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: '#319795' }}>\n {ev.source}\n </a>\n ) : ev.source}\n </td>\n <td style={{ ...tdStyle, fontWeight: 600 }}>{ev.rating}</td>\n <td style={tdStyle}>{formatDate(ev.rating_date)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n\n {/* Metrics */}\n <h2 style={sectionHeadingStyle}>Performance Metrics</h2>\n {metrics.length === 0 ? (\n <div style={emptyStateStyle}>No performance metric data available yet.</div>\n ) : (\n <table style={tableStyle}>\n <thead>\n <tr>\n <th style={thStyle}>Metric</th>\n <th style={thStyle}>Value</th>\n <th style={thStyle}>Context</th>\n <th style={thStyle}>Period</th>\n </tr>\n </thead>\n <tbody>\n {metrics.map((m, i) => (\n <tr key={i}>\n <td style={{ ...tdStyle, fontWeight: 600 }}>\n {METRIC_LABELS[m.metric_type] || m.metric_type.replace(/_/g, ' ')}\n </td>\n <td style={tdStyle}>{formatMetricValue(m.metric_type, m.value)}</td>\n <td style={{ ...tdStyle, color: '#718096', fontSize: '13px' }}>{m.context_label}</td>\n <td style={tdStyle}>{m.time_period}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n\n {/* Disciplinary Records */}\n {disciplinary.length > 0 && (\n <>\n <h2 style={sectionHeadingStyle}>Disciplinary History</h2>\n {disciplinary.map((d, i) => (\n <div key={i} style={{\n borderLeft: '3px solid #fc8181',\n backgroundColor: '#fff5f5',\n borderRadius: '0 6px 6px 0',\n padding: '12px 16px',\n marginBottom: '10px',\n }}>\n <div style={{ fontWeight: 700, color: '#742a2a', fontSize: '14px' }}>\n {d.record_type} — {formatDate(d.record_date)}\n </div>\n {d.description && (\n <div style={{ color: '#9b2c2c', fontSize: '13px', marginTop: '4px' }}>{d.description}</div>\n )}\n {d.source_url && (\n <a href={d.source_url} target=\"_blank\" rel=\"noopener noreferrer\"\n style={{ color: '#c53030', fontSize: '12px', marginTop: '4px', display: 'inline-block' }}>\n View source &rarr;\n </a>\n )}\n </div>\n ))}\n </>\n )}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius, shadows } from './tokens';\n\n/**\n * Reusable authentication form for Empowered Vote applications.\n * Supports login and register modes with consistent branding.\n *\n * @param {Object} props\n * @param {string} props.logoSrc - URL for the logo image (default: \"/EVLogo.svg\")\n * @param {string} props.appName - App name shown under logo (default: \"Empowered Vote\")\n * @param {string} props.appSubtitle - Subtitle under app name (optional)\n * @param {\"login\"|\"register\"} props.mode - Current form mode\n * @param {Function} props.onSubmit - async (username, password) => void\n * @param {Function} props.onModeSwitch - Called when user clicks the mode toggle link\n * @param {string|null} props.error - Error message to display\n * @param {boolean} props.submitting - Whether the form is currently submitting\n */\nexport default function AuthForm({\n logoSrc = '/EVLogo.svg',\n appName = 'Empowered Vote',\n appSubtitle,\n mode = 'login',\n onSubmit,\n onModeSwitch,\n error = null,\n submitting = false,\n}) {\n const [username, setUsername] = useState('');\n const [password, setPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n const [showPasswords, setShowPasswords] = useState(false);\n const [passwordMismatch, setPasswordMismatch] = useState(false);\n\n const isLogin = mode === 'login';\n\n const handleSubmit = (e) => {\n e.preventDefault();\n if (!username.trim() || !password) return;\n\n if (!isLogin && password !== confirmPassword) {\n setPasswordMismatch(true);\n return;\n }\n setPasswordMismatch(false);\n onSubmit?.(username.trim(), password);\n };\n\n const EyeOpen = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n strokeWidth={1.5} stroke=\"currentColor\" style={{ width: '20px', height: '20px' }}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\"\n d=\"M2.036 12.322a1.012 1.012 0 0 1 0-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178Z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\"\n d=\"M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\" />\n </svg>\n );\n\n const EyeClosed = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n strokeWidth={1.5} stroke=\"currentColor\" style={{ width: '20px', height: '20px' }}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\"\n d=\"M3.98 8.223A10.477 10.477 0 0 0 1.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.451 10.451 0 0 1 12 4.5c4.756 0 8.773 3.162 10.065 7.498a10.522 10.522 0 0 1-4.293 5.774M6.228 6.228 3 3m3.228 3.228 3.65 3.65m7.894 7.894L21 21m-3.228-3.228-3.65-3.65m0 0a3 3 0 1 0-4.243-4.243m4.242 4.242L9.88 9.88\" />\n </svg>\n );\n\n const PasswordToggle = () => (\n <button\n type=\"button\"\n onClick={() => setShowPasswords((prev) => !prev)}\n style={styles.passwordToggle}\n >\n {showPasswords ? <EyeOpen /> : <EyeClosed />}\n </button>\n );\n\n const displayError = passwordMismatch ? 'Passwords do not match.' : error;\n\n return (\n <div style={styles.wrapper}>\n <div style={styles.container}>\n {/* Logo and Title */}\n <div style={styles.header}>\n {logoSrc && (\n <img src={logoSrc} alt={appName} style={styles.logo} />\n )}\n {appName && (\n <h1 style={styles.appName}>{appName}</h1>\n )}\n {appSubtitle && (\n <p style={styles.appSubtitle}>{appSubtitle}</p>\n )}\n </div>\n\n {/* Form Card */}\n <form onSubmit={handleSubmit} style={styles.card}>\n <h2 style={styles.cardTitle}>\n {isLogin ? 'Welcome Back' : 'Create Account'}\n </h2>\n\n {/* Username */}\n <div style={styles.fieldGroup}>\n <label style={styles.label}>Username</label>\n <input\n type=\"text\"\n name=\"username\"\n autoComplete=\"off\"\n style={styles.input}\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n onFocus={(e) => Object.assign(e.target.style, styles.inputFocus)}\n onBlur={(e) => {\n e.target.style.outline = 'none';\n e.target.style.boxShadow = 'none';\n e.target.style.borderColor = colors.borderLight;\n }}\n required\n />\n </div>\n\n {/* Password */}\n <div style={styles.fieldGroup}>\n <label style={styles.label}>Password</label>\n <div style={styles.passwordWrapper}>\n <input\n type={showPasswords ? 'text' : 'password'}\n name=\"password\"\n style={{ ...styles.input, paddingRight: '40px' }}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n onFocus={(e) => Object.assign(e.target.style, styles.inputFocus)}\n onBlur={(e) => {\n e.target.style.outline = 'none';\n e.target.style.boxShadow = 'none';\n e.target.style.borderColor = colors.borderLight;\n }}\n required\n />\n <PasswordToggle />\n </div>\n </div>\n\n {/* Confirm Password (register only) */}\n {!isLogin && (\n <div style={styles.fieldGroup}>\n <label style={styles.label}>Confirm Password</label>\n <div style={styles.passwordWrapper}>\n <input\n type={showPasswords ? 'text' : 'password'}\n name=\"confirmPassword\"\n style={{ ...styles.input, paddingRight: '40px' }}\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n onFocus={(e) => Object.assign(e.target.style, styles.inputFocus)}\n onBlur={(e) => {\n e.target.style.outline = 'none';\n e.target.style.boxShadow = 'none';\n e.target.style.borderColor = colors.borderLight;\n }}\n required\n />\n <PasswordToggle />\n </div>\n </div>\n )}\n\n {/* Error Message */}\n {displayError && (\n <div style={styles.errorBox}>\n <p style={styles.errorText}>{displayError}</p>\n </div>\n )}\n\n {/* Submit Button */}\n <button\n type=\"submit\"\n disabled={submitting || !username.trim() || !password}\n style={{\n ...styles.submitButton,\n opacity: (submitting || !username.trim() || !password) ? 0.6 : 1,\n cursor: (submitting || !username.trim() || !password) ? 'not-allowed' : 'pointer',\n }}\n onMouseEnter={(e) => {\n if (!submitting) e.target.style.backgroundColor = '#e64d38';\n }}\n onMouseLeave={(e) => {\n e.target.style.backgroundColor = colors.evCoral;\n }}\n >\n {submitting\n ? (isLogin ? 'Signing In...' : 'Creating Account...')\n : (isLogin ? 'Sign In' : 'Create Account')}\n </button>\n\n {/* Mode Switch */}\n {onModeSwitch && (\n <div style={styles.modeSwitch}>\n <p style={styles.modeSwitchText}>\n {isLogin ? \"Don't have an account?\" : 'Already have an account?'}\n </p>\n <button\n type=\"button\"\n onClick={onModeSwitch}\n style={styles.modeSwitchButton}\n onMouseEnter={(e) => {\n e.target.style.backgroundColor = colors.evTeal;\n e.target.style.color = colors.textWhite;\n }}\n onMouseLeave={(e) => {\n e.target.style.backgroundColor = 'transparent';\n e.target.style.color = colors.evTeal;\n }}\n >\n {isLogin ? 'Create Account' : 'Sign In'}\n </button>\n </div>\n )}\n </form>\n </div>\n </div>\n );\n}\n\nconst styles = {\n wrapper: {\n minHeight: '100vh',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#f8f9fa',\n padding: `0 ${spacing[4]}`,\n fontFamily: fonts.primary,\n },\n container: {\n width: '100%',\n maxWidth: '384px',\n },\n header: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n marginBottom: spacing[8],\n },\n logo: {\n height: '64px',\n width: 'auto',\n marginBottom: spacing[4],\n },\n appName: {\n fontSize: fontSizes['2xl'],\n fontWeight: fontWeights.semibold,\n color: colors.evTeal,\n margin: 0,\n fontFamily: fonts.primary,\n },\n appSubtitle: {\n color: colors.textMuted,\n fontSize: fontSizes.sm,\n marginTop: spacing[1],\n margin: `${spacing[1]} 0 0 0`,\n fontFamily: fonts.primary,\n },\n card: {\n backgroundColor: colors.bgWhite,\n padding: spacing[8],\n borderRadius: '16px',\n boxShadow: '0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)',\n border: `1px solid ${colors.borderLight}`,\n },\n cardTitle: {\n fontSize: fontSizes.xl,\n fontWeight: fontWeights.semibold,\n marginBottom: spacing[6],\n textAlign: 'center',\n color: colors.textSecondary,\n margin: `0 0 ${spacing[6]} 0`,\n fontFamily: fonts.primary,\n },\n fieldGroup: {\n marginBottom: spacing[4],\n },\n label: {\n display: 'block',\n marginBottom: spacing[1],\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.medium,\n color: colors.textMuted,\n fontFamily: fonts.primary,\n },\n input: {\n width: '100%',\n border: `1px solid ${colors.borderLight}`,\n borderRadius: borderRadius.lg,\n padding: `10px ${spacing[4]}`,\n fontSize: fontSizes.base,\n fontFamily: fonts.primary,\n outline: 'none',\n transition: 'border-color 0.2s, box-shadow 0.2s',\n boxSizing: 'border-box',\n },\n inputFocus: {\n outline: 'none',\n boxShadow: `0 0 0 2px ${colors.evTealLight}`,\n borderColor: 'transparent',\n },\n passwordWrapper: {\n position: 'relative',\n },\n passwordToggle: {\n position: 'absolute',\n top: 0,\n right: '12px',\n bottom: 0,\n display: 'flex',\n alignItems: 'center',\n background: 'none',\n border: 'none',\n color: colors.textMuted,\n cursor: 'pointer',\n padding: 0,\n },\n errorBox: {\n marginBottom: spacing[4],\n padding: spacing[3],\n backgroundColor: '#fef2f2',\n border: '1px solid #fecaca',\n borderRadius: borderRadius.lg,\n },\n errorText: {\n color: colors.error,\n fontSize: fontSizes.sm,\n textAlign: 'center',\n margin: 0,\n fontFamily: fonts.primary,\n },\n submitButton: {\n width: '100%',\n backgroundColor: colors.evCoral,\n color: colors.textWhite,\n padding: '10px 0',\n borderRadius: borderRadius.lg,\n border: 'none',\n fontWeight: fontWeights.semibold,\n fontSize: fontSizes.base,\n fontFamily: fonts.primary,\n cursor: 'pointer',\n transition: 'background-color 0.2s',\n boxShadow: shadows.sm,\n },\n modeSwitch: {\n marginTop: spacing[6],\n paddingTop: spacing[6],\n borderTop: `1px solid ${colors.borderLight}`,\n },\n modeSwitchText: {\n textAlign: 'center',\n fontSize: fontSizes.sm,\n color: colors.textMuted,\n marginBottom: spacing[3],\n margin: `0 0 ${spacing[3]} 0`,\n fontFamily: fonts.primary,\n },\n modeSwitchButton: {\n width: '100%',\n padding: '10px 0',\n border: `2px solid ${colors.evTeal}`,\n color: colors.evTeal,\n borderRadius: borderRadius.lg,\n backgroundColor: 'transparent',\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.base,\n fontFamily: fonts.primary,\n cursor: 'pointer',\n transition: 'background-color 0.2s, color 0.2s',\n },\n};\n","import React from 'react';\nimport { tierColors, fonts, fontWeights, fontSizes, spacing, borderRadius } from './tokens';\n\n// ────────────────────────────────────────────────────────────────────\n// Tier icons — Lucide-style inline SVGs, 24x24 viewBox, stroke-based\n// ────────────────────────────────────────────────────────────────────\n\nfunction LandmarkIcon({ size = 14 }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M10 18v-7\" />\n <path d=\"M11.12 2.198a2 2 0 0 1 1.76.006l7.866 3.847c.476.233.31.949-.22.949H3.474c-.53 0-.695-.716-.22-.949z\" />\n <path d=\"M14 18v-7\" />\n <path d=\"M18 18v-7\" />\n <path d=\"M3 22h18\" />\n <path d=\"M6 18v-7\" />\n </svg>\n );\n}\n\nfunction Building2Icon({ size = 14 }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z\" />\n <path d=\"M6 12H4a2 2 0 0 0-2 2v8h4\" />\n <path d=\"M18 9h2a2 2 0 0 1 2 2v11h-4\" />\n <path d=\"M10 6h4\" />\n <path d=\"M10 10h4\" />\n <path d=\"M10 14h4\" />\n <path d=\"M10 18h4\" />\n </svg>\n );\n}\n\nfunction HomeIcon({ size = 14 }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\n <polyline points=\"9 22 9 12 15 12 15 22\" />\n </svg>\n );\n}\n\nconst TIER_INFO = {\n federal: { label: 'Federal', Icon: LandmarkIcon },\n state: { label: 'State', Icon: Building2Icon },\n local: { label: 'Local', Icon: HomeIcon },\n};\n\n// ────────────────────────────────────────────────────────────────────\n// Size presets\n// ────────────────────────────────────────────────────────────────────\n\nconst SIZE_STYLES = {\n xs: {\n iconSize: 12,\n fontSize: fontSizes.xs,\n pillPadding: `${spacing[1]} ${spacing[2]}`,\n gap: spacing[1],\n iconGap: '3px',\n },\n sm: {\n iconSize: 14,\n fontSize: fontSizes.xs,\n pillPadding: `${spacing[1]} ${spacing[2]}`,\n gap: spacing[2],\n iconGap: '4px',\n },\n};\n\n// ────────────────────────────────────────────────────────────────────\n// Component\n// ────────────────────────────────────────────────────────────────────\n\n/**\n * TopicTierBadge — small icon + label badges showing which tiers of\n * government have real jurisdiction on a compass topic.\n *\n * Uses Lucide-style SVG icons:\n * Federal → Landmark (classical building with columns)\n * State → Building2 (office building)\n * Local → Home (house)\n *\n * Tier flags are purely informational — they don't gate compass\n * rendering or filter politician comparisons. This badge helps voters\n * pick topics with good cross-tier coverage when building their compass.\n *\n * @param {Object} props\n * @param {Object} [props.topic] - Topic object with applies_federal/state/local booleans\n * @param {Array<'federal'|'state'|'local'>} [props.tiers] - Explicit tier list (overrides topic)\n * @param {'xs'|'sm'} [props.size='sm'] - Icon + text size\n * @param {boolean} [props.iconOnly=false] - Hide text labels, show icons only (saves space)\n * @param {'tinted'|'muted'} [props.variant='tinted'] - 'tinted' uses tier-specific colors; 'muted' uses neutral gray for subtler presentation\n * @param {Object} [props.style] - Additional container styles\n */\nexport default function TopicTierBadge({\n topic,\n tiers,\n size = 'sm',\n iconOnly = false,\n variant = 'tinted',\n style = {},\n}) {\n // Derive tiers from topic if not explicitly passed\n const effectiveTiers = tiers ?? (\n topic\n ? [\n topic.applies_federal ? 'federal' : null,\n topic.applies_state ? 'state' : null,\n topic.applies_local ? 'local' : null,\n ].filter(Boolean)\n : []\n );\n\n if (effectiveTiers.length === 0) return null;\n\n const sizeStyle = SIZE_STYLES[size] || SIZE_STYLES.sm;\n\n const containerStyle = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: sizeStyle.gap,\n flexWrap: 'wrap',\n ...style,\n };\n\n const itemStyle = (tier) => {\n const color = variant === 'muted' ? '#6B7280' : tierColors[tier].text;\n return {\n display: 'inline-flex',\n alignItems: 'center',\n gap: sizeStyle.iconGap,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n fontSize: sizeStyle.fontSize,\n color,\n lineHeight: 1,\n userSelect: 'none',\n };\n };\n\n return (\n <span\n className=\"ev-topic-tier-badge\"\n style={containerStyle}\n role=\"group\"\n aria-label={`Applies at: ${effectiveTiers.map(t => TIER_INFO[t].label).join(', ')}`}\n >\n {effectiveTiers.map((tier) => {\n const { label, Icon } = TIER_INFO[tier];\n return (\n <span key={tier} style={itemStyle(tier)}>\n <Icon size={sizeStyle.iconSize} />\n {!iconOnly && <span>{label}</span>}\n </span>\n );\n })}\n </span>\n );\n}\n","import React, { useState } from 'react';\nimport { tierColors, fonts, fontWeights, fontSizes, spacing, borderRadius } from './tokens';\n\nconst TIER_LABELS = {\n federal: 'federal',\n state: 'state',\n local: 'local',\n};\n\n/**\n * CompassCoverageCallout — non-blocking banner shown on results pages when\n * the voter's compass has poor tier coverage for politicians in the current\n * results. Suggests adding more tier-applicable topics, with a CTA that\n * deep-links to the compass builder.\n *\n * The callout is purely informational. It does not change what politicians\n * are shown, reshape any compass radar, or filter results. It's a hint.\n *\n * @param {Object} props\n * @param {'federal'|'state'|'local'} props.tier - The tier that's under-covered\n * @param {number} props.count - How many of the voter's compass topics apply at this tier\n * @param {number} [props.totalSelected] - Total compass size (for context in the message)\n * @param {string} props.compassUrl - URL to open the compass builder (absolute or relative)\n * @param {Function} [props.onDismiss] - Optional dismiss handler; if provided, a close button renders\n */\nexport default function CompassCoverageCallout({\n tier,\n count,\n totalSelected,\n compassUrl,\n onDismiss,\n}) {\n const [dismissed, setDismissed] = useState(false);\n if (dismissed) return null;\n\n const tierLabel = TIER_LABELS[tier] || tier;\n const tierStyle = tierColors[tier] || tierColors.federal;\n\n const containerStyle = {\n display: 'flex',\n alignItems: 'flex-start',\n gap: spacing[3],\n padding: `${spacing[3]} ${spacing[4]}`,\n borderLeft: `4px solid ${tierStyle.text}`,\n backgroundColor: tierStyle.bg,\n borderRadius: `0 ${borderRadius.md} ${borderRadius.md} 0`,\n fontFamily: fonts.primary,\n margin: `${spacing[3]} 0`,\n };\n\n const textStyle = {\n flex: 1,\n fontSize: fontSizes.sm,\n color: '#2d3748',\n lineHeight: 1.5,\n };\n\n const headlineStyle = {\n fontWeight: fontWeights.semibold,\n marginBottom: spacing[1],\n color: tierStyle.text,\n };\n\n const ctaStyle = {\n display: 'inline-block',\n marginTop: spacing[2],\n padding: `${spacing[2]} ${spacing[4]}`,\n backgroundColor: tierStyle.text,\n color: '#ffffff',\n borderRadius: borderRadius.full,\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.semibold,\n textDecoration: 'none',\n cursor: 'pointer',\n };\n\n const closeStyle = {\n background: 'none',\n border: 'none',\n padding: spacing[1],\n cursor: 'pointer',\n color: '#718096',\n fontSize: fontSizes.lg,\n lineHeight: 1,\n };\n\n const handleDismiss = () => {\n setDismissed(true);\n if (onDismiss) onDismiss();\n };\n\n return (\n <div\n className=\"ev-compass-coverage-callout\"\n role=\"status\"\n style={containerStyle}\n >\n <div style={textStyle}>\n <div style={headlineStyle}>Your compass covers {tierLabel} issues lightly</div>\n <div>\n {count === 0\n ? `None of your ${totalSelected ?? 'selected'} compass topics apply at the ${tierLabel} level. `\n : `Only ${count} of your ${totalSelected ?? 'selected'} compass topics apply at the ${tierLabel} level. `}\n Add more {tierLabel}-applicable topics to get better comparisons with {tierLabel} officials.\n </div>\n <a href={compassUrl} style={ctaStyle}>\n Add {tierLabel} topics →\n </a>\n </div>\n {onDismiss !== undefined && (\n <button\n onClick={handleDismiss}\n style={closeStyle}\n aria-label=\"Dismiss coverage callout\"\n >\n ×\n </button>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { fonts, fontWeights, fontSizes, spacing, borderRadius } from './tokens';\n\n/**\n * ExpandCompassNudge — card-style prompt shown below the deep stance view\n * on a politician profile. Tells the voter how many topics the politician\n * has stances on that the voter hasn't answered yet, and offers a CTA to\n * expand the compass.\n *\n * Only useful to render when missingCount > 0. Caller should handle the\n * zero-missing case by not rendering this component at all.\n *\n * @param {Object} props\n * @param {string} props.politicianName - Display name for the CTA text\n * @param {number} props.missingCount - How many topics the politician has stances on that the voter hasn't answered\n * @param {string} props.compassUrl - URL to deep-link into the compass builder (should include a return param)\n * @param {Object} [props.style] - Additional styles to merge\n */\nexport default function ExpandCompassNudge({\n politicianName,\n missingCount,\n compassUrl,\n style = {},\n}) {\n if (!missingCount || missingCount <= 0) return null;\n\n const containerStyle = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: spacing[2],\n padding: spacing[4],\n marginTop: spacing[4],\n backgroundColor: '#F5F9FA',\n borderRadius: borderRadius.lg,\n border: '1px solid #e0e6eb',\n fontFamily: fonts.primary,\n ...style,\n };\n\n const headlineStyle = {\n fontSize: fontSizes.base,\n fontWeight: fontWeights.semibold,\n color: '#2d3748',\n margin: 0,\n };\n\n const bodyStyle = {\n fontSize: fontSizes.sm,\n color: '#4a5568',\n lineHeight: 1.5,\n margin: 0,\n };\n\n const ctaStyle = {\n display: 'inline-block',\n marginTop: spacing[2],\n padding: `${spacing[2]} ${spacing[4]}`,\n backgroundColor: '#00657c',\n color: '#ffffff',\n borderRadius: borderRadius.full,\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.semibold,\n textDecoration: 'none',\n cursor: 'pointer',\n };\n\n const topicsLabel = missingCount === 1 ? 'topic' : 'topics';\n const speakerName = politicianName || 'This politician';\n\n return (\n <div className=\"ev-expand-compass-nudge\" style={containerStyle} role=\"region\">\n <p style={headlineStyle}>Want a richer comparison?</p>\n <p style={bodyStyle}>\n {speakerName} has stances on {missingCount} more {topicsLabel} you haven't\n answered yet. Expand your compass to see where you stand on all of them.\n </p>\n <a href={compassUrl} style={ctaStyle}>\n Expand my compass →\n </a>\n </div>\n );\n}\n","/**\n * computeTierCoverage\n *\n * Counts how many topics apply at each tier of government. A topic with\n * `applies_federal`, `applies_state`, `applies_local` booleans contributes\n * to each tier it's marked for; cross-cutting topics contribute to all three.\n *\n * Topics missing tier flag fields (e.g., from an older API response) are\n * treated as cross-cutting (all three tiers = true). This matches the\n * backend default behavior in getCompassTopics/getCompassCategories.\n *\n * @param {Array<{applies_federal?: boolean, applies_state?: boolean, applies_local?: boolean}>} topics\n * @returns {{ federal: number, state: number, local: number }}\n *\n * @example\n * computeTierCoverage([\n * { applies_federal: true, applies_state: true, applies_local: true }, // housing\n * { applies_federal: true, applies_state: false, applies_local: false }, // tariffs\n * ])\n * // → { federal: 2, state: 1, local: 1 }\n */\nexport function computeTierCoverage(topics) {\n const counts = { federal: 0, state: 0, local: 0 };\n if (!Array.isArray(topics)) return counts;\n\n for (const t of topics) {\n if (!t) continue;\n // Default to cross-cutting if tier fields are missing entirely.\n const hasFlags =\n 'applies_federal' in t || 'applies_state' in t || 'applies_local' in t;\n const f = hasFlags ? Boolean(t.applies_federal) : true;\n const s = hasFlags ? Boolean(t.applies_state) : true;\n const l = hasFlags ? Boolean(t.applies_local) : true;\n if (f) counts.federal++;\n if (s) counts.state++;\n if (l) counts.local++;\n }\n\n return counts;\n}\n","import { useEffect, useState, useCallback, useRef } from 'react';\nimport { evContext } from './evContext.js';\n\n/**\n * 260426-mw6 — Detects the \"I signed up later\" gap.\n *\n * When a logged-in user lands on a page where the API has no data for a domain\n * (compass / address / verdicts) but ev-context has guest data captured before\n * signup, this hook returns shouldPrompt=true so the consumer can render an\n * inline \"Save this to your account?\" banner.\n *\n * On `promote()`:\n * 1. Calls the consumer-supplied `apiWriter(payload)` with the guest body.\n * 2. On success, mirrors into the userId-stamped authed slice via\n * `setAuthedSlice(userId, { [domain]: payload })` so subsequent loads\n * hydrate instantly (matches 260426-mc5 SWR semantics).\n * 3. Clears any prior promotionDismissed flag for this domain.\n *\n * On `dismiss()`: stamps `authed.promotionDismissed[domain] = true` so the\n * banner stays suppressed for this user on this domain until either a\n * successful promote or `clearAuthedSlice()` runs.\n *\n * Banners NEVER appear for guests, when the API already has data, or when the\n * dismissal stamp is set.\n *\n * @param {object} args\n * @param {'compass'|'address'|'verdicts'} args.domain\n * @param {boolean} args.isLoggedIn\n * @param {string|null|undefined} args.userId\n * @param {unknown} args.apiData API state for the domain; falsy / empty treated as \"API empty\"\n * @param {(payload: unknown) => Promise<unknown>} args.apiWriter\n * @param {boolean} [args.enabled=true]\n *\n * @returns {{\n * shouldPrompt: boolean,\n * payload: unknown,\n * promote: () => Promise<void>,\n * dismiss: () => Promise<void>,\n * status: 'idle'|'saving'|'saved'|'error',\n * error: Error|null\n * }}\n */\nexport function useEvContextPromotion({\n domain,\n isLoggedIn,\n userId,\n apiData,\n apiWriter,\n enabled = true,\n}) {\n const [shouldPrompt, setShouldPrompt] = useState(false);\n const [payload, setPayload] = useState(null);\n const [status, setStatus] = useState('idle');\n const [error, setError] = useState(null);\n\n // Refs for callbacks/inputs so subscribe handler always reads current values\n const apiDataRef = useRef(apiData);\n apiDataRef.current = apiData;\n const userIdRef = useRef(userId);\n userIdRef.current = userId;\n const isLoggedInRef = useRef(isLoggedIn);\n isLoggedInRef.current = isLoggedIn;\n const enabledRef = useRef(enabled);\n enabledRef.current = enabled;\n const domainRef = useRef(domain);\n domainRef.current = domain;\n const apiWriterRef = useRef(apiWriter);\n apiWriterRef.current = apiWriter;\n\n const detect = useCallback(async () => {\n const _enabled = enabledRef.current;\n const _isLoggedIn = isLoggedInRef.current;\n const _userId = userIdRef.current;\n const _apiData = apiDataRef.current;\n const _domain = domainRef.current;\n\n if (!_enabled || !_isLoggedIn || !_userId) {\n setShouldPrompt(false);\n setPayload(null);\n return;\n }\n if (!isApiEmpty(_domain, _apiData)) {\n setShouldPrompt(false);\n setPayload(null);\n return;\n }\n\n try {\n const slice = await evContext.getAuthedSlice(_userId);\n if (slice && slice.promotionDismissed && slice.promotionDismissed[_domain] === true) {\n setShouldPrompt(false);\n setPayload(null);\n return;\n }\n } catch { /* broker offline — treat as no dismissal */ }\n\n let guest = null;\n try { guest = await evContext.get(); } catch { guest = null; }\n\n if (isGuestPopulated(_domain, guest)) {\n setShouldPrompt(true);\n setPayload(guest[_domain]);\n } else {\n setShouldPrompt(false);\n setPayload(null);\n }\n }, []);\n\n // Re-run detection when inputs change.\n useEffect(() => {\n detect();\n }, [detect, isLoggedIn, userId, apiData, enabled, domain]);\n\n // Live updates: dismissals/promotes from another tab/subdomain re-trigger\n // detection. The subscribe callback is fired on every broker update.\n useEffect(() => {\n const unsub = evContext.subscribe(() => { detect(); });\n return unsub;\n }, [detect]);\n\n const promote = useCallback(async () => {\n const _userId = userIdRef.current;\n const _domain = domainRef.current;\n const _writer = apiWriterRef.current;\n const _payload = payload;\n if (!_userId || !_payload || typeof _writer !== 'function') return;\n\n setStatus('saving');\n setError(null);\n try {\n await _writer(_payload);\n // Seed mirror cache so next mount hydrates instantly.\n try {\n await evContext.setAuthedSlice(_userId, { [_domain]: _payload });\n } catch { /* non-fatal */ }\n // Clear any prior dismissal flag for this domain.\n try {\n await evContext.setAuthedSlice(_userId, {\n promotionDismissed: { [_domain]: false },\n });\n } catch { /* non-fatal */ }\n setStatus('saved');\n setShouldPrompt(false);\n } catch (err) {\n setStatus('error');\n setError(err instanceof Error ? err : new Error(String(err)));\n // Leave shouldPrompt as-is so the user can retry.\n }\n }, [payload]);\n\n const dismiss = useCallback(async () => {\n const _userId = userIdRef.current;\n const _domain = domainRef.current;\n if (!_userId) return;\n try {\n await evContext.setAuthedSlice(_userId, {\n promotionDismissed: { [_domain]: true },\n });\n } catch { /* non-fatal */ }\n setShouldPrompt(false);\n }, []);\n\n return { shouldPrompt, payload, promote, dismiss, status, error };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers (exported for unit-spot-checking; pure functions).\n// ---------------------------------------------------------------------------\n\n/**\n * Returns true when `apiData` is \"empty\" for the given domain. Conservative —\n * when in doubt, returns false (don't prompt).\n */\nexport function isApiEmpty(domain, apiData) {\n if (apiData === null || apiData === undefined) return true;\n if (domain === 'compass') {\n if (typeof apiData !== 'object') return false;\n if (Array.isArray(apiData)) return apiData.length === 0;\n if (apiData.answers && typeof apiData.answers === 'object') {\n return Object.keys(apiData.answers).length === 0;\n }\n return Object.keys(apiData).length === 0;\n }\n if (domain === 'address') {\n if (typeof apiData === 'string') return apiData.trim().length === 0;\n if (typeof apiData !== 'object') return false;\n // Object form: needs at least formatted/addr/lat to be non-empty\n const a = apiData;\n const hasAddr = typeof a.formatted === 'string' && a.formatted.length > 0;\n const hasAddrAlt = typeof a.addr === 'string' && a.addr.length > 0;\n const hasLat = typeof a.lat === 'number' || typeof a.latitude === 'number';\n return !(hasAddr || hasAddrAlt || hasLat);\n }\n if (domain === 'verdicts') {\n if (typeof apiData !== 'object') return false;\n if (Array.isArray(apiData)) return apiData.length === 0;\n return Object.keys(apiData).length === 0;\n }\n return false;\n}\n\n/**\n * Returns true when the ev-context guest top-level slice for `domain` has\n * meaningful data worth promoting.\n */\nexport function isGuestPopulated(domain, fullEvContext) {\n if (!fullEvContext || typeof fullEvContext !== 'object') return false;\n const slice = fullEvContext[domain];\n if (!slice || typeof slice !== 'object') return false;\n if (domain === 'compass') {\n // CompassV2/essentials use { a: {answers}, ... } where `a` is the answers map.\n const ans = slice.answers || slice.a;\n if (ans && typeof ans === 'object') return Object.keys(ans).length > 0;\n return false;\n }\n if (domain === 'address') {\n return (typeof slice.formatted === 'string' && slice.formatted.length > 0)\n || (typeof slice.addr === 'string' && slice.addr.length > 0);\n }\n if (domain === 'verdicts') {\n return Object.keys(slice).length > 0;\n }\n return false;\n}\n","import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport Favicon from './Favicon';\n\n/**\n * Truncate a URL for display (hostname + path, max 60 chars).\n */\nfunction getDisplayUrl(url) {\n try {\n const u = new URL(url);\n let host = u.hostname.replace(/^www\\./, '');\n const path = u.pathname === '/' ? '' : u.pathname;\n const display = host + path;\n return display.length > 60 ? display.slice(0, 57) + '...' : display;\n } catch {\n return url.length > 60 ? url.slice(0, 57) + '...' : url;\n }\n}\n\n// Comparison dot colors — from the EV dataViz palette (tokens.js).\n// Antipartisan: neutral dusk/sage pairing, never party colors.\nconst USER_DOT = '#7C6B9E'; // Dusk — \"You\"\nconst POL_DOT_LIGHT = '#5A9A6E'; // Sage — politician (light)\nconst POL_DOT_DARK = '#6DD28C'; // brighter sage for dark surfaces\n\n/**\n * Resolve the color palette for the current theme. Drives every color from the\n * `darkMode` prop (mirrors RadarChartCore) so the component is self-contained and\n * does not depend on consumer `!important` overrides.\n */\nfunction palette(darkMode) {\n return darkMode\n ? {\n rowBorder: 'rgba(255,255,255,0.08)',\n rowHover: '#1e2a3a', // ev-navy-elevated\n title: '#f3f4f6',\n chipLabel: '#d1d5db',\n sectionLabel: '#9ca3af', // 6.24:1 on #1a2235 ✓ AA\n reasoning: '#d1d5db',\n chevron: '#9ca3af', // 6.24:1 — bumped from #6b7280 (3.28) for clarity\n pillActiveBg: '#1e2a3a',\n pillActiveBorder: 'rgba(255,255,255,0.14)',\n pillIdleText: '#9ca3af', // 6.24:1 ✓ AA\n pillActiveText: '#f3f4f6',\n link: '#59b0c4', // 6.37:1 ✓ AA\n sourceText: '#9ca3af',\n quoteText: '#d1d5db',\n quoteBorder: 'rgba(255,255,255,0.14)',\n emptyText: '#9ca3af', // 6.24:1 — bumped from #6b7280 (3.28, failed AA)\n spinnerTrack: '#374151',\n polDot: POL_DOT_DARK,\n agreedBg: 'rgba(14,116,144,0.18)',\n agreedText: '#67e8f9',\n disagreedBg: 'rgba(180,83,9,0.18)',\n disagreedText: '#fbbf24',\n }\n : {\n rowBorder: '#f1f1f1',\n rowHover: '#f9fafb',\n title: '#262626',\n chipLabel: '#525252',\n sectionLabel: '#6b7280', // 4.83:1 on white — bumped from #a3a3a3 (2.52, failed AA)\n reasoning: '#404040',\n chevron: '#6b7280', // 4.83:1 — bumped from #a3a3a3 (2.52, failed 3:1)\n pillActiveBg: '#fafafa',\n pillActiveBorder: '#e5e5e5',\n pillIdleText: '#737373', // 4.74:1 ✓ AA\n pillActiveText: '#171717',\n link: '#00657c',\n sourceText: '#737373',\n quoteText: '#374151',\n quoteBorder: '#e2e8f0',\n emptyText: '#6b7280', // 4.83:1 — bumped from #a3a3a3 (2.52, failed AA)\n spinnerTrack: '#e2e8f0',\n polDot: POL_DOT_LIGHT,\n agreedBg: '#ecfeff',\n agreedText: '#0e7490',\n disagreedBg: '#fffbeb',\n disagreedText: '#b45309',\n };\n}\n\n/**\n * StanceAccordion — vertical list of topic rows showing politician stance labels.\n * Expanding a row reveals the full stance spectrum (with You / politician dots),\n * lazy-fetched reasoning + source links, and the politician's quotes for the topic.\n * True accordion: only one row open at a time.\n *\n * Props:\n * topics — filtered intersection topics (from CompassCard's topicsFiltered)\n * polAnswers — array of { topic_id, value }\n * userAnswerMap — Record<topic_id, value> — the viewer's own answers (for the \"You\" dot)\n * politicianId — politician UUID\n * allTopics — full topic objects with stances arrays\n * expandedTopics — full set of topics for \"show all\" toggle\n * darkMode — boolean — drives the color palette\n * verdictsByTopic — DEPRECATED (kept for backward compat, no longer used in render)\n * verdictsByQuote — Record<quote_id, 'agreed' | 'disagreed'> | undefined — per-quote verdicts\n * initialExpandedTopicId — topic ID to auto-open on mount (e.g. deep-linked from ReadRank)\n * apiUrl — API base URL (default: 'https://api.empowered.vote')\n */\nexport default function StanceAccordion({\n topics,\n polAnswers,\n userAnswerMap = {},\n politicianId,\n allTopics,\n expandedTopics,\n darkMode = false,\n verdictsByTopic, // DEPRECATED, no longer rendered\n verdictsByQuote, // Record<quote_id, 'agreed' | 'disagreed'> | undefined\n initialExpandedTopicId,\n apiUrl = 'https://api.empowered.vote',\n}) {\n const [expandedTopicId, setExpandedTopicId] = useState(null);\n const [loadingId, setLoadingId] = useState(null);\n const [showAll, setShowAll] = useState(false);\n const contextCache = useRef(new Map());\n const quotesCache = useRef(null); // null = unfetched, array = fetched (may be empty)\n\n const c = palette(darkMode);\n\n // Build lookup: topic_id -> polAnswer value\n const polAnswerMap = {};\n if (polAnswers) {\n polAnswers.forEach((a) => {\n polAnswerMap[String(a.topic_id)] = a.value;\n });\n }\n\n // Build lookup: topic id -> full topic (for stance label resolution)\n const topicById = {};\n if (allTopics) {\n allTopics.forEach((t) => {\n topicById[String(t.id)] = t;\n });\n }\n\n /**\n * Resolve stance label from answer value.\n * topic.stances[value - 1].text -> e.g., \"Strongly Support\"\n */\n function getStanceLabel(topicId, value) {\n const topic = topicById[String(topicId)];\n if (!topic || !topic.stances || !value) return 'No position';\n const idx = value - 1;\n if (idx < 0 || idx >= topic.stances.length) return 'No position';\n return topic.stances[idx].text || 'No position';\n }\n\n /**\n * Fetch context for a topic (reasoning + sources). Returns after caching.\n */\n async function fetchContext(topicId) {\n if (contextCache.current.has(topicId)) return;\n try {\n const res = await fetch(\n `${apiUrl}/api/compass/politicians/${politicianId}/${topicId}/context`,\n { credentials: 'include' }\n );\n if (res.status === 404) {\n contextCache.current.set(topicId, { reasoning: '', sources: [] });\n } else if (res.ok) {\n const data = await res.json();\n contextCache.current.set(topicId, {\n reasoning: data.reasoning || '',\n sources: data.sources || [],\n });\n } else {\n contextCache.current.set(topicId, { reasoning: '', sources: [] });\n }\n } catch {\n contextCache.current.set(topicId, { reasoning: '', sources: [] });\n }\n }\n\n /**\n * Fetch quotes for this politician once and store in quotesCache.\n * The backend filters by politician_id when provided; this client-side\n * cache holds only quotes for the current politician.\n * Subsequent calls return immediately (no-op).\n */\n async function ensureQuotesFetched() {\n if (quotesCache.current !== null) return;\n try {\n const res = await fetch(\n `${apiUrl}/api/essentials/quotes?politician_id=${politicianId}`,\n { credentials: 'include' }\n );\n if (res.ok) {\n const data = await res.json();\n quotesCache.current = data.quotes || [];\n } else {\n quotesCache.current = [];\n }\n } catch {\n quotesCache.current = [];\n }\n }\n\n /**\n * Toggle accordion row. Lazy-fetch context + quotes in parallel if not cached.\n */\n const handleToggle = useCallback(\n async (topicId) => {\n if (expandedTopicId === topicId) {\n setExpandedTopicId(null);\n return;\n }\n\n setExpandedTopicId(topicId);\n\n // Check if context already cached (quotes fetched separately)\n if (contextCache.current.has(topicId) && quotesCache.current !== null) return;\n\n // Fetch context and quotes in parallel\n setLoadingId(topicId);\n try {\n await Promise.all([fetchContext(topicId), ensureQuotesFetched()]);\n } finally {\n setLoadingId(null);\n }\n },\n [expandedTopicId, politicianId, apiUrl]\n );\n\n // Auto-open the deep-linked topic once both topics and initialExpandedTopicId are available.\n // Depends on both so it fires whether topics or the ID arrives last.\n useEffect(() => {\n if (initialExpandedTopicId && topics && topics.length > 0) {\n handleToggle(String(initialExpandedTopicId));\n }\n // handleToggle is stable per render cycle; omitting avoids infinite loop\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialExpandedTopicId, topics?.length]);\n\n if (!topics || topics.length === 0) return null;\n\n const hasToggle = expandedTopics && expandedTopics.length > topics.length;\n const baseTopics = hasToggle && showAll ? expandedTopics : topics;\n\n // Pin the deep-linked topic to the top so it's always visible without \"show all\"\n let visibleTopics = baseTopics;\n if (initialExpandedTopicId) {\n const fullList = expandedTopics || topics;\n const pinned = fullList.find((t) => String(t.id) === String(initialExpandedTopicId));\n if (pinned && String(baseTopics[0]?.id) !== String(initialExpandedTopicId)) {\n visibleTopics = [pinned, ...baseTopics.filter((t) => String(t.id) !== String(initialExpandedTopicId))];\n }\n }\n\n const sectionLabelStyle = {\n fontSize: '11px',\n fontWeight: 600,\n color: c.sectionLabel,\n textTransform: 'uppercase',\n letterSpacing: '0.06em',\n };\n\n return (\n <div\n className=\"ev-stance-panel flex flex-col\"\n style={{ fontFamily: \"'Manrope', sans-serif\" }}\n >\n <h3 style={{ ...sectionLabelStyle, marginBottom: '8px' }}>\n Stance Breakdown\n </h3>\n\n {visibleTopics.map((topic) => {\n const topicId = String(topic.id);\n const polValue = polAnswerMap[topicId];\n const userValue = userAnswerMap[topicId];\n const label = getStanceLabel(topicId, polValue);\n const isExpanded = expandedTopicId === topicId;\n const isLoading = loadingId === topicId;\n const cached = contextCache.current.get(topicId);\n const fullTopic = topicById[topicId];\n const questionText = fullTopic?.question_text;\n const titleText = questionText || topic.short_title;\n const stances = fullTopic?.stances || topic.stances || [];\n\n // Filter quotes for this politician and topic.\n // candidateId guard is a defensive check — the backend already filters by\n // politician_id, but this ensures correctness if the cache is ever shared.\n const topicQuotes = quotesCache.current\n ? quotesCache.current.filter((q) => {\n if (!q.issue) return false;\n if (q.candidateId && q.candidateId !== politicianId) return false;\n if (topic.topic_key) return q.issue === topic.topic_key;\n return topic.short_title && q.issue.toLowerCase() === topic.short_title.toLowerCase();\n })\n : [];\n\n return (\n <div\n key={topicId}\n style={{ borderBottom: `1px solid ${c.rowBorder}` }}\n >\n {/* Collapsed row — question-led title + politician stance chip */}\n <button\n type=\"button\"\n onClick={() => handleToggle(topicId)}\n className=\"w-full flex items-start justify-between text-left cursor-pointer\"\n style={{\n padding: '12px 8px',\n background: 'transparent',\n border: 'none',\n transition: 'background 0.15s ease',\n borderRadius: '8px',\n }}\n onMouseEnter={(e) => { e.currentTarget.style.background = c.rowHover; }}\n onMouseLeave={(e) => { e.currentTarget.style.background = 'transparent'; }}\n >\n <div className=\"flex flex-col min-w-0\" style={{ gap: '5px' }}>\n <span\n style={{\n fontSize: '14px',\n fontWeight: 600,\n color: c.title,\n lineHeight: 1.4,\n }}\n >\n {titleText}\n </span>\n {/* Stance chip: sage dot + politician's current position.\n Wraps to full lines so the whole stance reads before expanding. */}\n <span style={{ display: 'flex', alignItems: 'flex-start', gap: '8px' }}>\n <span\n style={{\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: c.polDot,\n flexShrink: 0,\n marginTop: '6px',\n }}\n />\n <span\n style={{\n fontSize: '13px',\n color: c.chipLabel,\n lineHeight: 1.45,\n }}\n >\n {label}\n </span>\n </span>\n </div>\n\n {/* Chevron */}\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={c.chevron}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"flex-shrink-0 ml-2\"\n style={{\n marginTop: '3px',\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease',\n }}\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </button>\n\n {/* Expanded content */}\n <div\n style={{\n display: 'grid',\n gridTemplateRows: isExpanded ? '1fr' : '0fr',\n transition: 'grid-template-rows 0.25s ease',\n }}\n >\n <div style={{ overflow: 'hidden' }}>\n <div style={{ padding: '4px 8px 16px' }}>\n {/* Stance spectrum — full scale with You / politician dots.\n Read-only on the profile (editing belongs to the compass tool). */}\n {stances.length > 0 && (\n <>\n {/* Legend */}\n {(userValue > 0 || polValue > 0) && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '14px',\n marginBottom: '8px',\n fontSize: '12px',\n color: c.sourceText,\n }}\n >\n {userValue > 0 && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: '6px' }}>\n <span style={{ width: '9px', height: '9px', borderRadius: '50%', backgroundColor: USER_DOT }} />\n You\n </span>\n )}\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: '6px' }}>\n <span style={{ width: '9px', height: '9px', borderRadius: '50%', backgroundColor: c.polDot }} />\n Their stance\n </span>\n </div>\n )}\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', marginBottom: '14px' }}>\n {stances.map((stance, i) => {\n const stanceNum = i + 1;\n const isUser = userValue === stanceNum;\n const isPol = polValue === stanceNum;\n const isActive = isUser || isPol;\n return (\n <div\n key={i}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: '10px',\n padding: '10px 12px',\n borderRadius: '12px',\n fontSize: '13px',\n lineHeight: 1.4,\n border: `1px solid ${isActive ? c.pillActiveBorder : 'transparent'}`,\n backgroundColor: isActive ? c.pillActiveBg : 'transparent',\n }}\n >\n {/* Left dot rail — fixed width so every stance's text\n aligns and the You / their-stance markers scan vertically. */}\n <span\n style={{\n flexShrink: 0,\n width: '30px',\n display: 'flex',\n alignItems: 'center',\n gap: '5px',\n paddingTop: '3px',\n }}\n >\n {isUser && (\n <span style={{ width: '9px', height: '9px', borderRadius: '50%', backgroundColor: USER_DOT, boxShadow: `0 0 0 3px ${USER_DOT}33` }} />\n )}\n {isPol && (\n <span style={{ width: '9px', height: '9px', borderRadius: '50%', backgroundColor: c.polDot, boxShadow: `0 0 0 3px ${c.polDot}33` }} />\n )}\n </span>\n <span\n style={{\n flex: 1,\n color: isActive ? c.pillActiveText : c.pillIdleText,\n fontWeight: isActive ? 500 : 400,\n }}\n >\n {stance.text}\n </span>\n </div>\n );\n })}\n </div>\n </>\n )}\n\n {isLoading && (\n <div className=\"flex items-center\" style={{ padding: '12px 0' }}>\n <div\n style={{\n width: '20px',\n height: '20px',\n border: `2px solid ${c.spinnerTrack}`,\n borderTopColor: '#00657c',\n borderRadius: '50%',\n animation: 'ev-spin 0.8s linear infinite',\n }}\n />\n </div>\n )}\n\n {!isLoading && cached && (\n <>\n {cached.reasoning ? (\n <p\n style={{\n fontSize: '14px',\n color: c.reasoning,\n marginBottom: '12px',\n whiteSpace: 'pre-wrap',\n lineHeight: 1.6,\n }}\n >\n {cached.reasoning}\n </p>\n ) : null}\n\n {cached.sources && cached.sources.length > 0 && (\n <div style={{ marginTop: '8px' }}>\n <p style={{ ...sectionLabelStyle, marginBottom: '6px' }}>\n References\n </p>\n <ol style={{ listStyle: 'decimal', listStylePosition: 'inside', display: 'flex', flexDirection: 'column', gap: '4px' }}>\n {cached.sources.map((src, i) => (\n <li key={i} style={{ fontSize: '12px', color: c.sourceText }}>\n <a\n href={src}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1.5\"\n style={{ color: c.link }}\n >\n <Favicon url={src} />\n <span style={{ textDecoration: 'underline', textUnderlineOffset: '2px' }}>\n {getDisplayUrl(src)}\n </span>\n </a>\n </li>\n ))}\n </ol>\n </div>\n )}\n\n {topicQuotes.length > 0 && (\n <div style={{ marginTop: '14px' }}>\n <p style={{ ...sectionLabelStyle, marginBottom: '8px' }}>\n Quotes\n </p>\n {topicQuotes.map((quote) => {\n const verdict = verdictsByQuote ? verdictsByQuote[quote.id] : undefined;\n const borderColor =\n verdict === 'agreed'\n ? c.agreedText\n : verdict === 'disagreed'\n ? c.disagreedText\n : c.quoteBorder;\n const sourceName = quote.source_name || quote.sourceName;\n return (\n <div\n key={quote.id}\n style={{\n borderLeft: `3px solid ${borderColor}`,\n paddingLeft: '10px',\n paddingTop: '6px',\n paddingBottom: '6px',\n marginBottom: '8px',\n }}\n >\n <p\n style={{\n fontSize: '13px',\n fontStyle: 'italic',\n color: c.quoteText,\n margin: 0,\n lineHeight: 1.5,\n }}\n >\n {quote.text}\n </p>\n {verdict === 'agreed' && (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n backgroundColor: c.agreedBg,\n color: c.agreedText,\n padding: '2px 8px',\n borderRadius: '9999px',\n fontSize: '11px',\n fontWeight: 500,\n marginTop: '4px',\n flexShrink: 0,\n }}\n >\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M5 13l4 4L19 7\" />\n </svg>\n Agreed\n </span>\n )}\n {verdict === 'disagreed' && (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n backgroundColor: c.disagreedBg,\n color: c.disagreedText,\n padding: '2px 8px',\n borderRadius: '9999px',\n fontSize: '11px',\n fontWeight: 500,\n marginTop: '4px',\n flexShrink: 0,\n }}\n >\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n Disagreed\n </span>\n )}\n {sourceName && (\n <a\n href={quote.source_url || quote.sourceUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{\n display: 'block',\n fontSize: '11px',\n color: c.link,\n marginTop: '3px',\n textDecoration: 'none',\n }}\n >\n {sourceName}\n </a>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {!cached.reasoning &&\n (!cached.sources || cached.sources.length === 0) &&\n topicQuotes.length === 0 && (\n <p style={{ fontSize: '14px', color: c.emptyText, fontStyle: 'italic', padding: '8px 0' }}>\n No detailed reasoning available for this topic.\n </p>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n })}\n\n {hasToggle && (\n <button\n type=\"button\"\n onClick={() => setShowAll((v) => !v)}\n className=\"text-sm font-medium mt-2 px-2 py-1 self-start cursor-pointer hover:underline\"\n style={{ color: c.link }}\n >\n {showAll ? 'Show fewer' : `Show all ${expandedTopics.length} topics`}\n </button>\n )}\n </div>\n );\n}\n","import React from 'react';\n\n/**\n * Favicon — renders a site's favicon via Google's favicon service.\n * Default size=16 for inline source link display.\n */\nexport default function Favicon({ url, size = 16 }) {\n try {\n const domain = new URL(url).hostname;\n return (\n <img\n src={`https://www.google.com/s2/favicons?sz=${size}&domain=${domain}`}\n alt=\"\"\n width={size}\n height={size}\n style={{ verticalAlign: 'middle', flexShrink: 0 }}\n />\n );\n } catch {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n style={{ verticalAlign: 'middle', flexShrink: 0 }}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M2 12h20M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\" />\n </svg>\n );\n }\n}\n"],"mappings":"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","names":["useEffect","useEffect","offset","React","React","React","useState","useRef","useEffect","useState","useEffect","useState","useRef","useEffect","styles","React","React","React","linkStyle","React","React","React","styles","React","React","useState","useEffect","styles","CompassIcon","React","useState","useEffect","React","useState","useEffect","React","React","useState","React","useState","focus","React","React","useState","useEffect","_a","React","React","useState","useEffect","RADAR_SIZE","useState","useEffect","_a","React","React","useEffect","useState","useState","useEffect","React","React","useState","useState","styles","React","React","styles","React","React","useState","useState","styles","React","React","styles","React","React","styles","React","React","useState","useState","styles","React","React","useState","useEffect","React","React","React","d","React","SOCIAL_PLATFORMS","React","React","useState","useEffect","_a","tierColors","styles","React","useState","formatDate","React","useState","React","React","React","useState","useState","React","React","React","containerStyle","React","useState","useState","containerStyle","React","React","containerStyle","React","useEffect","useState","useRef","useState","useRef","useEffect","React","useState","useRef","useCallback","useEffect","React","useState","useRef","useCallback","useEffect","React"]}
1
+ {"version":3,"sources":["../src/RadarChartCore.jsx","../src/useTheme.js","../src/PlaceholderRadar.jsx","../src/tokens.js","../src/Header.jsx","../src/useMediaQuery.js","../src/SiteHeader.jsx","../src/FeedbackButton.jsx","../src/FilterSidebar.jsx","../src/PoliticianCard.jsx","../src/CompassCardHorizontal.jsx","../src/CompassCardHorizontalMeta.jsx","../src/IconOverlay.jsx","../src/icons.js","../src/compassHelpers.js","../src/CompassCardVertical.jsx","../src/CompassKey.jsx","../src/evContext.js","../src/CategorySection.jsx","../src/SubGroupSection.jsx","../src/GovernmentBodySection.jsx","../src/SocialLinks.jsx","../src/IssueTags.jsx","../src/CommitteeTable.jsx","../src/PoliticianProfile.jsx","../src/LegislativeInlineSummary.jsx","../src/JudicialScorecard.jsx","../src/judicialUtils.js","../src/LegislativeRecord.jsx","../src/JudicialRecordDetail.jsx","../src/AuthForm.jsx","../src/TopicTierBadge.jsx","../src/CompassCoverageCallout.jsx","../src/ExpandCompassNudge.jsx","../src/computeTierCoverage.js","../src/useEvContextPromotion.js","../src/StanceAccordion.jsx","../src/Favicon.jsx"],"sourcesContent":["import React from \"react\";\nimport { animated, useSpring } from \"@react-spring/web\";\nimport { useRef, useEffect } from \"react\";\nimport { useTheme } from \"./useTheme\";\n\nexport default function RadarChartCore({\n topics,\n data,\n compareData = {},\n invertedSpokes = {},\n unansweredSpokes = {},\n onToggleInversion = () => {},\n onReplaceTopic = () => {},\n size = 400,\n labelFontSize = 18,\n padding = 80,\n labelOffset = 20,\n tightFit = false,\n maxLabelLines = 2,\n showLabels = true,\n dotRadius = 5,\n}) {\n const { isDark } = useTheme();\n const radius = size / 2 - 40;\n const centerX = size / 2;\n const centerY = size / 2;\n\n const spokes = Object.entries(data);\n const numSpokes = Math.max(spokes.length, 1);\n\n const prevCountRef = useRef(numSpokes);\n const countChanged = numSpokes !== prevCountRef.current;\n useEffect(() => {\n prevCountRef.current = numSpokes;\n }, [numSpokes]);\n\n const pointsArr = spokes.map(([shortTitle, value], index) => {\n const topic = topics.find((t) => t.short_title === shortTitle);\n const max = topic?.stances?.length || 10;\n const pct = Math.min((value / max) * 10, 10);\n const angle = (2 * Math.PI * index) / numSpokes;\n const adjusted =\n value === 0 ? 0 : invertedSpokes[shortTitle] ? 11 - pct : pct;\n const r = (adjusted / 10) * radius;\n const x = centerX + r * Math.sin(angle);\n const y = centerY - r * Math.cos(angle);\n return [x, y];\n });\n\n const targetPoints = pointsArr.map((p) => p.join(\",\")).join(\" \");\n const spring = useSpring({\n to: { points: targetPoints },\n immediate: countChanged,\n reset: countChanged,\n config: { tension: 300, friction: 30 },\n });\n\n const hasCompareData = Object.keys(compareData).length > 0;\n const centerPoints = spokes.map(() => `${centerX},${centerY}`).join(\" \");\n let comparePoints = null;\n let compareCoords = null;\n if (hasCompareData) {\n const ccoords = spokes.map(([shortTitle], index) => {\n const value = compareData[shortTitle] ?? 0;\n const topic = topics.find((t) => t.short_title === shortTitle);\n const max = topic?.stances?.length || 10;\n const pct = Math.min((value / max) * 10, 10);\n const angle = (2 * Math.PI * index) / numSpokes;\n const adjusted =\n value === 0 ? 0 : invertedSpokes[shortTitle] ? 11 - pct : pct;\n const r = (adjusted / 10) * radius;\n const x = centerX + r * Math.sin(angle);\n const y = centerY - r * Math.cos(angle);\n return [x, y];\n });\n compareCoords = ccoords;\n comparePoints = ccoords.map((p) => p.join(\",\")).join(\" \");\n }\n\n // Track whether compareData was present in the previous render.\n // When a new politician is first selected, skip animation so the polygon\n // appears immediately rather than flying in from center.\n const hadCompareDataRef = useRef(false);\n const compareJustAppeared = hasCompareData && !hadCompareDataRef.current;\n useEffect(() => {\n hadCompareDataRef.current = hasCompareData;\n }, [hasCompareData]);\n\n // Animate on shape changes (spoke inversion) but be immediate on new entry\n // or spoke count changes to avoid fly-in artifacts.\n const compareSpring = useSpring({\n to: { points: comparePoints || centerPoints || `${centerX},${centerY}` },\n immediate: countChanged || compareJustAppeared,\n reset: countChanged || compareJustAppeared,\n config: { tension: 300, friction: 30 },\n });\n\n // Pre-compute label metadata for dynamic horizontal padding\n const labelMeta = spokes.map(([shortTitle], i) => {\n const angle = (2 * Math.PI * i) / numSpokes;\n const sinA = Math.sin(angle);\n const side = sinA < -0.1 ? \"left\" : sinA > 0.1 ? \"right\" : \"center\";\n if (!showLabels) return { estimatedWidth: 0, side };\n const baseFSize = labelFontSize;\n const lines = wrapLabel(shortTitle, 12, maxLabelLines);\n const longestLineLen = lines.reduce(\n (max, ln) => (ln.length > max ? ln.length : max),\n 0,\n );\n const fSize = adaptiveFontSize(longestLineLen, baseFSize);\n const estimatedWidth = longestLineLen * fSize * 0.6;\n return { estimatedWidth, side };\n });\n\n const leftLabelWidths = labelMeta\n .filter((m) => m.side === \"left\")\n .map((m) => m.estimatedWidth);\n const rightLabelWidths = labelMeta\n .filter((m) => m.side === \"right\")\n .map((m) => m.estimatedWidth);\n\n // No labels → need only a small margin for dot radius / visual breathing room\n const minPadding = showLabels ? 40 : 10;\n const maxPadding = padding * 2;\n const rawLeftPadding = Math.min(\n Math.max(\n leftLabelWidths.length ? Math.max(...leftLabelWidths) + labelOffset : 0,\n minPadding,\n ),\n maxPadding,\n );\n const rawRightPadding = Math.min(\n Math.max(\n rightLabelWidths.length ? Math.max(...rightLabelWidths) + labelOffset : 0,\n minPadding,\n ),\n maxPadding,\n );\n // Use symmetric padding so the chart center aligns with the SVG center\n const symmetricPadding = Math.max(rawLeftPadding, rawRightPadding);\n const leftPadding = symmetricPadding;\n const rightPadding = symmetricPadding;\n const verticalPadding = padding;\n\n // tightFit: shrink viewBox vertically to actual content extent so sparse-spoke\n // charts (e.g., 3-topic radar) don't render with large empty space below.\n let tightTop = -verticalPadding;\n let tightHeight = size + verticalPadding * 2;\n if (tightFit && numSpokes > 0) {\n let yMin = Infinity, yMax = -Infinity;\n for (let i = 0; i < numSpokes; i++) {\n const angle = (2 * Math.PI * i) / numSpokes;\n const y = centerY - radius * Math.cos(angle);\n if (y < yMin) yMin = y;\n if (y > yMax) yMax = y;\n }\n // Reserve room for label text (or just a small breathing margin when labels are hidden).\n const effLabelFSize = adaptiveFontSize(12, labelFontSize);\n const labelMargin = showLabels\n ? labelOffset + effLabelFSize * 1.1 * maxLabelLines\n : 8;\n tightTop = yMin - labelMargin;\n tightHeight = (yMax + labelMargin) - tightTop;\n }\n\n const guidePolygons = [];\n for (let level = 1; level <= 5; level++) {\n const scale = level / 5;\n const ring = [];\n for (let i = 0; i < numSpokes; i++) {\n const angle = (2 * Math.PI * i) / numSpokes;\n const x = centerX + radius * scale * Math.sin(angle);\n const y = centerY - radius * scale * Math.cos(angle);\n ring.push(`${x},${y}`);\n }\n guidePolygons.push(\n <polygon key={level} points={ring.join(\" \")} fill=\"none\" stroke={isDark ? \"#374151\" : \"#ccc\"} />,\n );\n }\n\n return (\n <svg\n className=\"w-full h-auto max-h-full\"\n viewBox={`-${leftPadding} ${tightTop} ${size + leftPadding + rightPadding} ${tightHeight}`}\n preserveAspectRatio=\"xMidYMid meet\"\n >\n {guidePolygons}\n\n {spokes.map(([shortTitle], i) => {\n const angle = (2 * Math.PI * i) / numSpokes;\n const x = centerX + radius * Math.sin(angle);\n const y = centerY - radius * Math.cos(angle);\n const isUnanswered = !!unansweredSpokes[shortTitle];\n return (\n <line\n key={`line-${shortTitle}`}\n x1={centerX}\n y1={centerY}\n x2={x}\n y2={y}\n stroke={isUnanswered ? (isDark ? \"#6b7280\" : \"#9ca3af\") : (isDark ? \"#d1d5db\" : \"black\")}\n strokeDasharray={isUnanswered ? \"4 3\" : undefined}\n opacity={isUnanswered ? 0.6 : 1}\n />\n );\n })}\n\n {showLabels && spokes.map(([shortTitle], i) => {\n const angle = (2 * Math.PI * i) / numSpokes;\n const anchor =\n angle > Math.PI\n ? \"end\"\n : angle < Math.PI && angle > 0\n ? \"start\"\n : \"middle\";\n\n const cosA = Math.cos(angle);\n const isTop = cosA > 0.5;\n const isBottom = cosA < -0.5;\n const baseFSize = labelFontSize;\n // Single pass wrap at ~12 chars, then pick font size based on longest line\n const lines = wrapLabel(shortTitle, 12, maxLabelLines);\n const longestLine = lines.reduce(\n (max, ln) => (ln.length > max ? ln.length : max),\n 0,\n );\n const fSize = adaptiveFontSize(longestLine, baseFSize);\n const lineHeight = fSize * 1.1;\n const dynamicLabelOffset = lines.length > 1 ? labelOffset + 8 : labelOffset;\n const offset = radius + dynamicLabelOffset;\n const labelX = centerX + offset * Math.sin(angle);\n let labelY = centerY - offset * Math.cos(angle);\n\n // For top labels, shift up so multi-line text grows away from chart\n if (isTop && lines.length > 1) {\n labelY -= (lines.length - 1) * lineHeight;\n }\n // For bottom labels with multiple lines, no shift needed (text grows downward, away from chart)\n\n const isUnansweredLabel = !!unansweredSpokes[shortTitle];\n return (\n <text\n key={`label-${shortTitle}`}\n x={labelX}\n y={labelY}\n textAnchor={anchor}\n dominantBaseline={isBottom ? \"hanging\" : \"auto\"}\n onClick={() => onReplaceTopic(shortTitle)}\n className=\"text-xl font-medium mb-1 md:text-base md:font-normal\"\n fill={isUnansweredLabel ? (isDark ? \"#6b7280\" : \"#9ca3af\") : (isDark ? \"#d1d5db\" : undefined)}\n style={{ cursor: \"pointer\", userSelect: \"none\", fontSize: fSize }}\n >\n {isUnansweredLabel && <title>No stance on file for this topic.</title>}\n {lines.map((ln, idx) => (\n <tspan key={idx} x={labelX} dy={idx === 0 ? \"0\" : `${lineHeight}`}>\n {ln}\n </tspan>\n ))}\n </text>\n );\n })}\n\n {countChanged ? (\n <polygon\n key=\"user-static\"\n points={targetPoints}\n style={{\n fill: \"rgba(124, 107, 158, 0.4)\",\n stroke: \"#7C6B9E\",\n strokeWidth: 3,\n }}\n />\n ) : (\n <animated.polygon\n key=\"user-animated\"\n points={spring.points}\n style={{\n fill: \"rgba(124, 107, 158, 0.4)\",\n stroke: \"#7C6B9E\",\n strokeWidth: 3,\n }}\n />\n )}\n\n {pointsArr.map(([cx, cy], i) => {\n const shortTitle = spokes[i][0];\n const userVal = spokes[i][1];\n if (!userVal || Number(userVal) === 0) return null; // unanswered — don't draw a dot at center\n const compareVal = compareData[shortTitle];\n const matches = hasCompareData\n && userVal !== 0 && compareVal !== 0 && compareVal != null\n && Number(userVal) === Number(compareVal);\n return (\n <circle\n key={`user-dot-${i}`}\n cx={cx}\n cy={cy}\n r={matches ? dotRadius * (8 / 7) : dotRadius}\n fill={matches ? '#fed12e' : '#7C6B9E'}\n stroke={matches ? '#fed12e' : '#7C6B9E'}\n strokeWidth={3}\n />\n );\n })}\n\n {hasCompareData && comparePoints ? (\n countChanged || compareJustAppeared ? (\n <polygon\n key=\"compare-static\"\n points={comparePoints}\n style={{\n fill: \"rgba(90, 154, 110, 0.3)\",\n stroke: \"#5A9A6E\",\n strokeWidth: 2,\n }}\n />\n ) : (\n <animated.polygon\n key=\"compare-animated\"\n points={compareSpring.points}\n style={{\n fill: \"rgba(90, 154, 110, 0.3)\",\n stroke: \"#5A9A6E\",\n strokeWidth: 2,\n }}\n />\n )\n ) : null}\n\n {hasCompareData && compareCoords && compareCoords.map(([cx, cy], i) => {\n const shortTitle = spokes[i][0];\n const userVal = spokes[i][1];\n const compareVal = compareData[shortTitle];\n if (!compareVal || Number(compareVal) === 0) return null; // politician unanswered — skip dot\n const matches = userVal !== 0 && compareVal !== 0 && compareVal != null\n && Number(userVal) === Number(compareVal);\n return (\n <circle\n key={`compare-dot-${i}`}\n cx={cx}\n cy={cy}\n r={matches ? dotRadius * (8 / 7) : dotRadius}\n fill={matches ? '#fed12e' : '#5A9A6E'}\n stroke={matches ? '#fed12e' : '#5A9A6E'}\n strokeWidth={3}\n />\n );\n })}\n\n {spokes.map(([shortTitle], i) => {\n const angle = (2 * Math.PI * i) / numSpokes;\n const x = centerX + radius * Math.sin(angle);\n const y = centerY - radius * Math.cos(angle);\n const isUnansweredHitbox = !!unansweredSpokes[shortTitle];\n return (\n <line\n key={`hitbox-${shortTitle}`}\n x1={centerX}\n y1={centerY}\n x2={x}\n y2={y}\n stroke=\"transparent\"\n strokeWidth={14}\n onClick={() =>\n isUnansweredHitbox\n ? onReplaceTopic(shortTitle)\n : onToggleInversion(shortTitle)\n }\n style={{ cursor: \"pointer\" }}\n />\n );\n })}\n </svg>\n );\n}\n\nfunction adaptiveFontSize(longestLineLen, baseFSize) {\n return Math.max(baseFSize, 10);\n}\n\nfunction wrapLabel(label, maxChars = 12, maxLines = 2) {\n const str = String(label);\n // Split on \"/\" first (handles \"Medicare/Medicaid\" → [\"Medicare/\", \"Medicaid\"])\n let rawWords;\n if (str.includes(\"/\")) {\n rawWords = str.split(\"/\").reduce((acc, segment, idx, arr) => {\n const part = idx < arr.length - 1 ? segment + \"/\" : segment;\n if (part.trim()) acc.push(part.trim());\n return acc;\n }, []);\n } else {\n rawWords = str.split(/\\s+/);\n }\n // Build lines wrapping at maxChars; enforce hard max of 2 lines without truncation\n const lines = [];\n let line = \"\";\n for (const word of rawWords) {\n if (line === \"\") {\n line = word;\n } else if ((line + \" \" + word).length <= maxChars) {\n line += \" \" + word;\n } else {\n lines.push(line);\n line = word;\n }\n }\n if (line) lines.push(line);\n // Enforce max lines: combine any overflow onto the last allowed line\n if (lines.length > maxLines) {\n const overflow = lines.splice(maxLines).join(\" \");\n lines[maxLines - 1] = lines[maxLines - 1] + \" \" + overflow;\n }\n return lines;\n}\n","import { useState, useEffect } from 'react';\n\n/**\n * useTheme — reports whether the host app is in dark mode.\n *\n * Dark mode is OPT-IN: a consumer signals it by adding a `dark` class or a\n * `data-theme=\"dark\"` attribute to the document root (or <body>). This mirrors\n * the opt-in `darkMode` prop on PoliticianProfile/SocialLinks (which defaults to\n * false) so a light-themed consumer never gets dark chart colors unexpectedly.\n *\n * Deliberately does NOT read `prefers-color-scheme` — a user's OS dark setting\n * should not override a consumer app that is rendering a light UI.\n *\n * SSR-safe: returns { isDark: false } when there's no document.\n *\n * @returns {{ isDark: boolean }}\n */\nexport function useTheme() {\n const read = () => {\n if (typeof document === 'undefined') return false;\n const root = document.documentElement;\n const body = document.body;\n const hasDarkClass = (el) => el && el.classList && el.classList.contains('dark');\n const hasDarkAttr = (el) => el && el.getAttribute && el.getAttribute('data-theme') === 'dark';\n return hasDarkClass(root) || hasDarkAttr(root) || hasDarkClass(body) || hasDarkAttr(body);\n };\n\n const [isDark, setIsDark] = useState(read);\n\n useEffect(() => {\n if (typeof document === 'undefined' || typeof MutationObserver === 'undefined') return;\n const update = () => setIsDark(read());\n update();\n const observer = new MutationObserver(update);\n const opts = { attributes: true, attributeFilter: ['class', 'data-theme'] };\n observer.observe(document.documentElement, opts);\n if (document.body) observer.observe(document.body, opts);\n return () => observer.disconnect();\n }, []);\n\n return { isDark };\n}\n\nexport default useTheme;\n","import React from 'react';\nimport { colorScales, borderRadius } from './tokens';\n\nexport default function PlaceholderRadar({ size = 250, name = '', darkMode = false }) {\n const cx = size / 2;\n const cy = size / 2;\n const r = (size / 2) * 0.65;\n const n = 8;\n\n // Surface + stroke tuned per theme so the ghost radar reads on either a white\n // card or the essentials ev-navy-card dark surface.\n const surface = darkMode ? '#1e2a3a' : colorScales.teal['050'];\n const stroke = darkMode ? 'rgba(255,255,255,0.22)' : colorScales.gray['200'];\n\n const vertices = Array.from({ length: n }, (_, i) => {\n const a = (2 * Math.PI * i) / n;\n return [cx + r * Math.sin(a), cy - r * Math.cos(a)];\n });\n\n const outerPts = vertices.map(([x, y]) => `${x},${y}`).join(' ');\n const midPts = vertices.map(([x, y]) => `${cx + (x - cx) * 0.6},${cy + (y - cy) * 0.6}`).join(' ');\n const innerPts = vertices.map(([x, y]) => `${cx + (x - cx) * 0.3},${cy + (y - cy) * 0.3}`).join(' ');\n\n return (\n <svg\n width={size}\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n role=\"img\"\n aria-label={name ? `${name} — compass data unavailable` : 'compass data unavailable'}\n style={{\n backgroundColor: surface,\n borderRadius: borderRadius.sm,\n flexShrink: 0,\n }}\n >\n {/* Spokes from center to each vertex */}\n {vertices.map(([x, y], i) => (\n <line\n key={i}\n x1={cx} y1={cy} x2={x} y2={y}\n stroke={stroke}\n strokeWidth=\"1\"\n strokeDasharray=\"2 3\"\n opacity=\"0.6\"\n />\n ))}\n {/* Inner ring (30%) */}\n <polygon\n points={innerPts}\n fill=\"none\"\n stroke={stroke}\n strokeWidth=\"1\"\n strokeDasharray=\"2 3\"\n opacity=\"0.5\"\n />\n {/* Mid ring (60%) */}\n <polygon\n points={midPts}\n fill=\"none\"\n stroke={stroke}\n strokeWidth=\"1\"\n strokeDasharray=\"3 3\"\n opacity=\"0.6\"\n />\n {/* Outer ring (100%) */}\n <polygon\n points={outerPts}\n fill=\"none\"\n stroke={stroke}\n strokeWidth=\"1.5\"\n strokeDasharray=\"4 3\"\n />\n </svg>\n );\n}\n","/**\n * Empowered Vote Design Tokens\n * Single source of truth for the EV design system.\n * Synced to Penpot via /sync-design-tokens\n *\n * WCAG AA compliance notes:\n * Brand colors have limited contrast on white backgrounds.\n * Use the `accessibleText` map below for body-text alternatives\n * that pass AA (4.5:1) while staying on-brand.\n *\n * Brand color | On white | AA-safe text alternative\n * ───────────────── | ──────── | ────────────────────────\n * Coral #FF5740 | 3.14:1 | coral-700 #E61B00 (4.64:1)\n * Muted Blue #00657C | 6.66:1 | (already AA — use directly)\n * Light Blue #59B0C4 | 2.49:1 | skyblue-700 #327E8F (4.65:1)\n * Yellow #FED12E | 1.46:1 | yellow-900 #7B640E (5.72:1)\n *\n * Coral is AA for large text only (>=18px bold or >=24px).\n * Yellow and Light Blue should never be used as text on white.\n */\n\n// ──────────────────────────────────────────────\n// Color Scales (050–950 per hue)\n// ──────────────────────────────────────────────\n\nexport const colorScales = {\n coral: {\n '050': '#FAF6F5', '100': '#F6E6E4', '200': '#F2C6C0', '300': '#F2988C',\n '400': '#F66855', '500': '#FF5740', '600': '#FF2B0F', '700': '#E61B00',\n '800': '#B31D09', '900': '#8E1F10', '950': '#6C1E13',\n },\n teal: {\n // Smoothed scale — original 400→500 had a ~45 lightness jump.\n // 400 now bridges the light wash into the deep brand muted-blue.\n '050': '#F5F9FA', '100': '#E4F3F6', '200': '#C0E8F2', '300': '#7DD4E8',\n '400': '#3AABB8', '500': '#00657C', '600': '#005366', '700': '#003E4D',\n '800': '#03303A', '900': '#05262E', '950': '#051A1E',\n },\n skyblue: {\n '050': '#F6F8F8', '100': '#E9F0F1', '200': '#CDE0E5', '300': '#A7CFD8',\n '400': '#7FBECC', '500': '#59B0C4', '600': '#3A9BB0', '700': '#327E8F',\n '800': '#2B616E', '900': '#264C55', '950': '#1E383D',\n },\n yellow: {\n '050': '#FAF9F5', '100': '#F6F2E4', '200': '#F1E7C0', '300': '#F2DC8D',\n '400': '#F5D356', '500': '#FED12E', '600': '#FAC400', '700': '#D0A301',\n '800': '#9F7F09', '900': '#7B640E', '950': '#5B4B10',\n },\n gray: {\n '050': '#F7F7F8', '100': '#EBEDEF', '200': '#D3D7DE', '300': '#B3BBCC',\n '400': '#8F9EBC', '500': '#6B7280', '600': '#535964', '700': '#41454E',\n '800': '#2F3237', '900': '#212326', '950': '#131416',\n },\n};\n\n// ──────────────────────────────────────────────\n// Tier Colors (teal-scale shade variation)\n// ──────────────────────────────────────────────\n\nexport const tierColors = {\n federal: {\n bg: '#FFFFFF', // white — lightest tier\n accent: colorScales.teal['700'], // #003E4D\n text: colorScales.teal['700'], // #003E4D — 7.5:1 on white, AA\n },\n state: {\n bg: '#F7FBFC', // gentle teal wash — midpoint between white and 050\n accent: colorScales.teal['500'], // #00657C\n text: colorScales.teal['500'], // #00657C — 6.66:1 on white, AA\n },\n local: {\n bg: '#EDF6F8', // #EDF6F8 — between 050 and 100, darkest tier\n accent: colorScales.teal['200'], // #C0E8F2 — decorative only\n text: colorScales.teal['600'], // #005366 — 8.1:1 on white, AA\n },\n};\n\n// ──────────────────────────────────────────────\n// Brand Colors (flat references for convenience)\n// Canonical values — DO NOT change without updating all apps.\n// ──────────────────────────────────────────────\n\nexport const colors = {\n // Primary brand (locked)\n evCoral: '#FF5740', // 3.14:1 on white — large text / UI only\n evMutedBlue: '#00657C', // 6.66:1 on white — AA body text safe\n evLightBlue: '#59B0C4', // 2.49:1 on white — decorative / dark bg only\n evYellow: '#FED12E', // 1.46:1 on white — accent / dark bg only\n evYellowLight:'#FEF3C7',\n evYellowDark: '#D0A301',\n black: '#1C1C1C',\n white: '#FFFFFF',\n\n // Legacy aliases (deprecated — use evMutedBlue / evLightBlue instead)\n evTeal: '#00657C',\n evTealDark: '#003E4D',\n evTealLight: '#59B0C4',\n\n // Backgrounds\n bgLight: '#F0F8FA',\n bgWhite: '#FFFFFF',\n\n // Text\n textPrimary: '#00657C', // Muted Blue — 6.66:1 on white ✓ AA\n textSecondary: '#4A5568', // ~6.0:1 on white ✓ AA\n textMuted: '#718096', // ~4.6:1 on white ✓ AA\n textWhite: '#FFFFFF',\n\n // Borders\n borderLight: '#E2EBEF',\n borderMedium: '#C9CFD1',\n\n // State\n error: '#EF4444',\n errorLight: '#FEF2F2',\n success: '#22C55E',\n successLight: '#F0FDF4',\n warning: '#F59E0B',\n warningLight: '#FFFBEB',\n info: '#3A9BB0',\n infoLight: '#F5F9FA',\n};\n\n// ──────────────────────────────────────────────\n// AA-Safe Text Colors (per brand hue)\n// Use these when a brand color must appear as readable text.\n// Each passes WCAG AA (4.5:1+) on white and bgLight.\n// ──────────────────────────────────────────────\n\nexport const accessibleText = {\n coral: '#E61B00', // coral-700, 4.64:1 on white\n teal: '#00657C', // teal-500 (brand muted blue), 6.66:1\n skyblue: '#327E8F', // skyblue-700, 4.65:1 on white\n yellow: '#7B640E', // yellow-900, 5.72:1 on white\n};\n\n// ──────────────────────────────────────────────\n// Pillar Themes\n// ──────────────────────────────────────────────\n\nexport const pillars = {\n inform: {\n name: 'Inform', accent: 'yellow',\n color: '#FED12E', dark: '#D0A301', light: '#FAF9F5',\n textColor: '#7B640E', // AA-safe text — yellow-900\n darkMode: { color: '#FED12E', dark: '#FEE88A', textOnAccent: '#1C1C1C' },\n },\n empower: {\n name: 'Empower', accent: 'coral',\n color: '#FF5740', dark: '#E61B00', light: '#FAF6F5',\n textColor: '#E61B00', // AA-safe text — coral-700\n darkMode: { color: '#FF5740', dark: '#F66855', textOnAccent: '#FFFFFF' },\n },\n connect: {\n name: 'Connect', accent: 'teal',\n color: '#00657C', dark: '#003E4D', light: '#F5F9FA',\n textColor: '#00657C', // Already AA — muted blue\n darkMode: { color: '#3A9BB0', dark: '#59B0C4', textOnAccent: '#FFFFFF' },\n },\n};\n\n// ──────────────────────────────────────────────\n// Semantic Tokens (Light / Dark)\n// All text-on-background pairings verified AA (4.5:1+).\n// ──────────────────────────────────────────────\n\nexport const semanticTokens = {\n light: {\n layerBase: { background: '#F7F7F8', text: '#535964', icon: '#535964', border: '#D3D7DE' }, // 6.58:1\n layerOne: { background: '#EBEDEF', text: '#41454E', icon: '#41454E', border: '#D3D7DE' }, // 7.23:1\n layerTwo: { background: '#D3D7DE', text: '#2F3237', icon: '#2F3237', border: '#B3BBCC' }, // 7.60:1\n heading: { text: '#2F3237' }, // 12.02:1 on gray-050\n divider: '#D3D7DE',\n link: { default: '#00657C', hovered: '#003E4D', focused: '#003E4D', pressed: '#003E4D' },\n input: { background: '#F7F7F8', text: '#41454E', border: '#41454E', icon: '#6B7280' }, // text bumped from gray-500 to gray-700 for AA\n buttonPrimary: {\n background: { default: '#005366', hovered: '#003E4D', pressed: '#03303A', focused: '#005366', disabled: '#D3D7DE' },\n text: { default: '#FFFFFF', disabled: '#8F9EBC' },\n },\n buttonSecondary: {\n background: { default: '#F7F7F8', hovered: '#EBEDEF', pressed: '#D3D7DE', focused: '#EBEDEF', disabled: '#F7F7F8' },\n text: { default: '#003E4D', disabled: '#8F9EBC' },\n border: { default: '#003E4D', disabled: '#D3D7DE' },\n },\n // Feedback states\n badge: { background: '#EBEDEF', text: '#41454E', border: '#D3D7DE' },\n tooltip: { background: '#2F3237', text: '#EBEDEF' },\n overlay: 'rgba(19, 20, 22, 0.5)',\n skeleton: { from: '#EBEDEF', to: '#D3D7DE' },\n },\n dark: {\n layerBase: { background: '#131416', text: '#B3BBCC', icon: '#B3BBCC', border: '#41454E' }, // 9.56:1 ✓ AAA\n layerOne: { background: '#2F3237', text: '#D3D7DE', icon: '#D3D7DE', border: '#41454E' }, // 8.91:1 ✓ AAA\n layerTwo: { background: '#41454E', text: '#EBEDEF', icon: '#EBEDEF', border: '#535964' }, // 8.18:1 ✓ AAA\n heading: { text: '#EBEDEF' }, // 15.70:1 on layerBase ✓ AAA\n divider: '#41454E',\n link: { default: '#59B0C4', hovered: '#7FBECC', focused: '#7FBECC', pressed: '#3A9BB0' }, // 7.40:1 on layerBase ✓ AAA\n input: { background: '#1E2024', text: '#D3D7DE', border: '#6B7280', icon: '#B3BBCC' }, // border bumped to gray-500 for 3.37:1 UI ✓\n buttonPrimary: {\n // Darkened from skyblue to teal for white-text AA compliance\n background: { default: '#005366', hovered: '#327E8F', pressed: '#003E4D', focused: '#005366', disabled: '#2F3237' },\n text: { default: '#FFFFFF', disabled: '#535964' }, // 8.64:1 / 4.65:1 / 11.69:1 ✓ AA+\n },\n buttonSecondary: {\n background: { default: '#131416', hovered: '#2F3237', pressed: '#41454E', focused: '#2F3237', disabled: '#131416' },\n text: { default: '#59B0C4', disabled: '#535964' }, // 7.40:1 ✓ AAA\n border: { default: '#59B0C4', disabled: '#41454E' },\n },\n // Feedback states\n badge: { background: '#41454E', text: '#EBEDEF', border: '#535964' },\n tooltip: { background: '#EBEDEF', text: '#2F3237' },\n overlay: 'rgba(19, 20, 22, 0.75)',\n skeleton: { from: '#2F3237', to: '#41454E' },\n },\n};\n\n// ──────────────────────────────────────────────\n// Data Visualization Palette\n// ──────────────────────────────────────────────\n\n// 10 hues derived from the EV brand palette.\n// Core 4 (teal, sky blue, coral, yellow) + 6 harmonious neighbors.\n// Each has 5 shades: [100-light, 300, 400, base-500, 700-dark]\nexport const dataVizPalette = [\n { name: 'Teal', base: '#00657C', shades: ['#C0E8F2', '#55D9F6', '#3AABB8', '#00657C', '#003E4D'] },\n { name: 'Sky Blue', base: '#59B0C4', shades: ['#CDE0E5', '#A7CFD8', '#7FBECC', '#59B0C4', '#327E8F'] },\n { name: 'Ocean', base: '#2563A0', shades: ['#CDDCED', '#7BADD4', '#4D8FC2', '#2563A0', '#193F68'] },\n { name: 'Coral', base: '#FF5740', shades: ['#F6E6E4', '#F2988C', '#F66855', '#FF5740', '#B31D09'] },\n { name: 'Terracotta', base: '#C2674A', shades: ['#F0DCD4', '#D9A48E', '#CF8568', '#C2674A', '#7A3D2C'] },\n { name: 'Yellow', base: '#FED12E', shades: ['#F6F2E4', '#F2DC8D', '#F5D356', '#FED12E', '#9F7F09'] },\n { name: 'Honey', base: '#D4940B', shades: ['#F5EACE', '#E8C563', '#DCA930', '#D4940B', '#805A06'] },\n { name: 'Sage', base: '#5A9A6E', shades: ['#D4E8DA', '#9ACBAA', '#74B589', '#5A9A6E', '#376043'] },\n { name: 'Dusk', base: '#7C6B9E', shades: ['#E4DFF0', '#B5A8CF', '#9788B8', '#7C6B9E', '#4D4263'] },\n { name: 'Stone', base: '#6B7280', shades: ['#EBEDEF', '#B3BBCC', '#8F9EBC', '#6B7280', '#41454E'] },\n];\n\n// ──────────────────────────────────────────────\n// Typography\n// ──────────────────────────────────────────────\n\nexport const fonts = {\n primary: \"'Manrope', sans-serif\",\n fallback: \"system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n};\n\nexport const fontWeights = {\n regular: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n extrabold: 800,\n};\n\nexport const fontSizes = {\n xs: '12px',\n sm: '14px',\n base: '16px',\n lg: '18px',\n xl: '20px',\n '2xl': '24px',\n '3xl': '30px',\n '4xl': '36px',\n '5xl': '48px',\n};\n\nexport const lineHeights = {\n tight: 1.25,\n normal: 1.5,\n relaxed: 1.75,\n};\n\nexport const letterSpacing = {\n tight: '-0.02em',\n normal: '0',\n wide: '0.05em',\n};\n\n// Composite text styles — combine size, weight, line-height, and letter-spacing\n// into ready-to-spread objects for inline styles: style={{ ...textStyles.displayTitle }}\nexport const textStyles = {\n displayTitle: { fontSize: '48px', fontWeight: 800, lineHeight: 1.1, letterSpacing: '-0.03em' },\n displaySub: { fontSize: '36px', fontWeight: 700, lineHeight: 1.15, letterSpacing: '-0.02em' },\n h1: { fontSize: '30px', fontWeight: 700, lineHeight: 1.25, letterSpacing: '-0.02em' },\n h2: { fontSize: '24px', fontWeight: 700, lineHeight: 1.3, letterSpacing: '-0.01em' },\n h3: { fontSize: '20px', fontWeight: 600, lineHeight: 1.35, letterSpacing: '0' },\n h4: { fontSize: '18px', fontWeight: 600, lineHeight: 1.4, letterSpacing: '0' },\n bodyLg: { fontSize: '18px', fontWeight: 400, lineHeight: 1.6, letterSpacing: '0' },\n body: { fontSize: '16px', fontWeight: 400, lineHeight: 1.5, letterSpacing: '0' },\n bodySm: { fontSize: '14px', fontWeight: 400, lineHeight: 1.5, letterSpacing: '0' },\n label: { fontSize: '14px', fontWeight: 500, lineHeight: 1.4, letterSpacing: '0.01em' },\n labelSm: { fontSize: '12px', fontWeight: 500, lineHeight: 1.4, letterSpacing: '0.02em' },\n caption: { fontSize: '12px', fontWeight: 400, lineHeight: 1.4, letterSpacing: '0.01em' },\n overline: { fontSize: '11px', fontWeight: 700, lineHeight: 1.4, letterSpacing: '0.08em', textTransform: 'uppercase' },\n};\n\n// ──────────────────────────────────────────────\n// Spacing (4px base unit)\n// ──────────────────────────────────────────────\n\nexport const spacing = {\n 0: '0',\n '050': '2px',\n 1: '4px',\n '150': '6px',\n 2: '8px',\n 3: '12px',\n 4: '16px',\n 5: '20px',\n 6: '24px',\n 8: '32px',\n 10: '40px',\n 12: '48px',\n 16: '64px',\n 20: '80px',\n 24: '96px',\n};\n\n// ──────────────────────────────────────────────\n// Border Radius\n// ──────────────────────────────────────────────\n\nexport const borderRadius = {\n none: '0',\n sm: '4px',\n md: '8px',\n lg: '10px',\n xl: '12px',\n '2xl': '16px',\n full: '9999px',\n};\n\n// ──────────────────────────────────────────────\n// Shadows & Elevation\n// ──────────────────────────────────────────────\n\nexport const shadows = {\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\n md: '0 4px 6px -1px rgba(0, 0, 0, 0.1)',\n lg: '0 10px 25px -3px rgba(0, 0, 0, 0.1), 0 4px 10px -4px rgba(0, 0, 0, 0.05)',\n xl: '0 20px 40px -8px rgba(0, 0, 0, 0.12), 0 8px 16px -6px rgba(0, 0, 0, 0.06)',\n inner: 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)',\n glowCoral: '0 0 0 3px rgba(255, 87, 64, 0.25)',\n glowTeal: '0 0 0 3px rgba(0, 101, 124, 0.2)',\n cardHover: '0 12px 32px -4px rgba(0, 0, 0, 0.12), 0 4px 8px -2px rgba(0, 0, 0, 0.04)',\n none: 'none',\n};\n\n// ──────────────────────────────────────────────\n// Motion\n// ──────────────────────────────────────────────\n\nexport const duration = {\n instant: '50ms',\n fast: '120ms', // Micro-interactions: toggles, checkboxes\n normal: '200ms', // Buttons, inputs, small transitions\n slow: '350ms', // Panels, cards, modals\n slower: '500ms', // Page transitions, complex orchestration\n};\n\nexport const easing = {\n default: 'cubic-bezier(0.2, 0, 0, 1)', // General-purpose (Material 3 standard)\n enter: 'cubic-bezier(0, 0, 0.2, 1)', // Elements appearing (decelerate)\n exit: 'cubic-bezier(0.4, 0, 1, 1)', // Elements leaving (accelerate)\n spring: 'cubic-bezier(0.34, 1.56, 0.64, 1)', // Playful overshoot — buttons, badges\n linear: 'linear',\n};\n\n// ──────────────────────────────────────────────\n// Focus Ring\n// ──────────────────────────────────────────────\n\nexport const focus = {\n ring: '0 0 0 2px #FFFFFF, 0 0 0 4px #00657C', // White gap + brand muted blue (6.66:1 on white)\n ringDark: '0 0 0 2px #131416, 0 0 0 4px #59B0C4', // Dark gap + light blue (6.84:1 on dark)\n ringCoral: '0 0 0 2px #FFFFFF, 0 0 0 4px #FF5740', // Coral variant for pillar contexts\n offset: '2px',\n};\n\n// ──────────────────────────────────────────────\n// Z-Index Scale\n// ──────────────────────────────────────────────\n\nexport const zIndex = {\n hide: -1,\n base: 0,\n dropdown: 10,\n sticky: 20,\n header: 30,\n overlay: 40,\n modal: 50,\n toast: 60,\n tooltip: 70,\n};\n\n// ──────────────────────────────────────────────\n// Opacity\n// ──────────────────────────────────────────────\n\nexport const opacity = {\n disabled: 0.4,\n muted: 0.6,\n subtle: 0.8,\n full: 1,\n};\n\n// ──────────────────────────────────────────────\n// Breakpoints\n// ──────────────────────────────────────────────\n\nexport const breakpoints = {\n sm: '640px',\n md: '768px',\n lg: '1024px',\n xl: '1280px',\n};\n","import React, { useState, useRef, useEffect } from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius, semanticTokens } from './tokens';\nimport useMediaQuery from './useMediaQuery';\n\n/**\n * Header component for Empowered Vote applications\n *\n * @param {Object} props\n * @param {string} props.logoSrc - URL for the logo image\n * @param {string} props.logoAlt - Alt text for logo (default: \"Empowered Vote\")\n * @param {Array} props.navItems - Navigation items [{label, href, dropdown?}]\n * @param {Object} props.ctaButton - Primary CTA button config {label, href}\n * @param {React.ReactNode|Object} props.secondaryAction - Secondary action rendered next to CTA.\n * Either a React node (e.g. <FeedbackButton />) or a config object {label, href, target, rel}\n * that renders as a small ghost-style pill button.\n * @param {string} props.currentPath - Current path for active state\n * @param {Function} props.onNavigate - SPA navigation handler\n * @param {Object} props.style - Additional styles for the header container\n */\nexport default function Header({\n logoSrc,\n logoAlt = 'Empowered Vote',\n logoHref = 'https://empowered.vote',\n navItems = [],\n ctaButton,\n secondaryAction,\n currentPath,\n onNavigate,\n profileMenu,\n darkMode = false,\n navCollapseBreakpoint = 1024,\n style = {},\n}) {\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false);\n const [openDropdown, setOpenDropdown] = useState(null);\n const [profileOpen, setProfileOpen] = useState(false);\n const isMobile = useMediaQuery(`(max-width: ${navCollapseBreakpoint}px)`);\n const profileRef = useRef(null);\n\n useEffect(() => {\n if (!profileOpen) return;\n const handleClickOutside = (e) => {\n if (profileRef.current && !profileRef.current.contains(e.target)) {\n setProfileOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [profileOpen]);\n\n const handleNavClick = (e, href) => {\n if (onNavigate) {\n e.preventDefault();\n onNavigate(href);\n }\n };\n\n // Theme palette — darkMode switches the inline style colors. Mirrors the\n // darkMode-prop pattern used by PoliticianProfile. Defaults to light so any\n // consumer that doesn't pass darkMode renders exactly as before.\n const t = darkMode\n ? {\n surface: semanticTokens.dark.layerBase.background, // #131416\n raised: semanticTokens.dark.layerOne.background, // #2F3237 (dropdowns)\n text: colors.evLightBlue, // #59B0C4 — AA on dark\n itemText: semanticTokens.dark.layerOne.text, // #D3D7DE (dropdown items)\n muted: semanticTokens.dark.layerBase.text, // #B3BBCC\n border: semanticTokens.dark.divider, // #41454E\n hoverBg: semanticTokens.dark.layerTwo.background, // #41454E\n ctaBg: semanticTokens.dark.buttonPrimary.background.default, // #005366\n ctaBgHover: semanticTokens.dark.buttonPrimary.background.hovered,\n ctaText: '#FFFFFF',\n shadow: '0 10px 40px rgba(0,0,0,0.5)',\n }\n : {\n surface: colors.bgWhite,\n raised: colors.bgWhite,\n text: colors.evTeal,\n itemText: colors.evTeal,\n muted: colors.textMuted,\n border: colors.borderLight,\n hoverBg: colors.bgLight,\n ctaBg: colors.evTeal,\n ctaBgHover: colors.evTealDark,\n ctaText: colors.textWhite,\n shadow: '0 10px 40px rgba(0,0,0,0.1)',\n };\n\n const styles = {\n header: {\n backgroundColor: t.surface,\n position: 'sticky',\n top: 0,\n zIndex: 50,\n width: '100%',\n ...style,\n },\n container: {\n maxWidth: '1512px',\n margin: '0 auto',\n padding: isMobile ? `${spacing[3]} ${spacing[3]}` : `${spacing[4]} ${spacing[6]}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: spacing[6],\n },\n logo: {\n height: '43px',\n cursor: 'pointer',\n },\n nav: {\n display: isMobile ? 'none' : 'flex',\n flex: '1 1 auto',\n alignItems: 'center',\n justifyContent: 'center',\n flexWrap: 'nowrap',\n gap: spacing[8],\n },\n navItem: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.base,\n color: t.text,\n textDecoration: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: spacing[2],\n position: 'relative',\n whiteSpace: 'nowrap',\n },\n navItemActive: {\n textDecoration: 'underline',\n },\n dropdownIcon: {\n width: '16px',\n height: '9px',\n },\n dropdown: {\n position: 'absolute',\n top: '100%',\n left: 0,\n paddingTop: spacing[2],\n zIndex: 100,\n },\n dropdownInner: {\n backgroundColor: t.raised,\n borderRadius: borderRadius.lg,\n boxShadow: t.shadow,\n minWidth: '200px',\n padding: spacing[2],\n },\n dropdownItem: {\n display: 'block',\n padding: `${spacing[3]} ${spacing[4]}`,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.base,\n color: t.itemText,\n textDecoration: 'none',\n borderRadius: borderRadius.md,\n cursor: 'pointer',\n },\n ctaButton: {\n backgroundColor: t.ctaBg,\n color: t.ctaText,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: fontSizes.xl,\n padding: `${spacing[3]} ${spacing[8]}`,\n borderRadius: borderRadius.lg,\n border: 'none',\n cursor: 'pointer',\n textDecoration: 'none',\n display: 'inline-block',\n },\n secondaryAction: {\n display: 'inline-flex',\n alignItems: 'center',\n backgroundColor: 'transparent',\n color: t.text,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: fontSizes.base,\n padding: `${spacing[2]} ${spacing[5]}`,\n borderRadius: borderRadius.full || '999px',\n border: `1.5px solid ${t.text}`,\n cursor: 'pointer',\n textDecoration: 'none',\n lineHeight: 1.2,\n transition: 'background-color 0.15s ease, color 0.15s ease',\n },\n mobileMenuButton: {\n display: isMobile ? 'block' : 'none',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: spacing[2],\n },\n hamburger: {\n width: '24px',\n height: '2px',\n backgroundColor: t.text,\n position: 'relative',\n },\n mobileMenu: {\n // Compact dropdown panel anchored under the hamburger (right edge), rather\n // than a full-bleed left:0/right:0 bar across the whole viewport.\n display: mobileMenuOpen ? 'flex' : 'none',\n flexDirection: 'column',\n position: 'absolute',\n top: '100%',\n right: spacing[3],\n left: 'auto',\n width: 'min(300px, calc(100vw - 24px))',\n maxWidth: 'calc(100vw - 24px)',\n backgroundColor: t.surface,\n padding: spacing[3],\n boxShadow: t.shadow,\n borderRadius: borderRadius.lg,\n border: `1px solid ${t.border}`,\n marginTop: spacing[2],\n zIndex: 100,\n },\n mobileNavItem: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.base,\n color: t.text,\n textDecoration: 'none',\n padding: `${spacing[3]} 0`,\n borderBottom: `1px solid ${t.border}`,\n },\n profileButton: {\n width: '40px',\n height: '40px',\n borderRadius: borderRadius.full,\n border: `2px solid ${t.text}`,\n backgroundColor: darkMode ? t.raised : colors.bgLight,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 0,\n },\n profileDropdown: {\n position: 'absolute',\n top: '100%',\n right: 0,\n paddingTop: spacing[2],\n zIndex: 100,\n },\n profileDropdownInner: {\n backgroundColor: t.raised,\n borderRadius: borderRadius.lg,\n boxShadow: t.shadow,\n minWidth: '160px',\n padding: spacing[2],\n },\n profileDropdownItem: {\n display: 'block',\n width: '100%',\n padding: `${spacing[3]} ${spacing[4]}`,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.base,\n color: t.itemText,\n textDecoration: 'none',\n borderRadius: borderRadius.md,\n cursor: 'pointer',\n border: 'none',\n backgroundColor: 'transparent',\n textAlign: 'left',\n },\n mobileDivider: {\n height: '1px',\n backgroundColor: t.border,\n margin: `${spacing[3]} 0`,\n },\n profileLabel: {\n padding: `${spacing[2]} ${spacing[4]} ${spacing[3]}`,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.semibold,\n fontSize: fontSizes.sm,\n color: t.muted,\n borderBottom: `1px solid ${t.border}`,\n marginBottom: spacing[1],\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n };\n\n // Responsive styles via media query in a style tag would be better,\n // but for simplicity we'll use CSS classes that consumers can override\n const NavLink = ({ item }) => {\n // Cross-app links are absolute URLs, so a pathname currentPath never equals\n // them — also treat a link as active when its hostname matches this app's.\n const isActive =\n currentPath === item.href ||\n (typeof window !== 'undefined' &&\n /^https?:\\/\\//.test(item.href) &&\n (() => {\n try {\n return new URL(item.href).hostname === window.location.hostname;\n } catch {\n return false;\n }\n })());\n const hasDropdown = item.dropdown && item.dropdown.length > 0;\n const isOpen = openDropdown === item.label;\n\n return (\n <div\n style={{ position: 'relative' }}\n onMouseEnter={() => hasDropdown && setOpenDropdown(item.label)}\n onMouseLeave={() => hasDropdown && setOpenDropdown(null)}\n >\n <a\n href={item.href}\n onClick={(e) => handleNavClick(e, item.href)}\n style={{\n ...styles.navItem,\n ...(isActive ? styles.navItemActive : {}),\n }}\n >\n {item.label}\n {hasDropdown && (\n <svg\n style={styles.dropdownIcon}\n viewBox=\"0 0 16 9\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M1 1L8 8L15 1\"\n stroke={t.text}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </a>\n {hasDropdown && isOpen && (\n <div style={styles.dropdown}>\n <div style={styles.dropdownInner}>\n {item.dropdown.map((dropdownItem, idx) => (\n <a\n key={idx}\n href={dropdownItem.href}\n onClick={(e) => handleNavClick(e, dropdownItem.href)}\n style={styles.dropdownItem}\n onMouseEnter={(e) => {\n e.target.style.backgroundColor = t.hoverBg;\n }}\n onMouseLeave={(e) => {\n e.target.style.backgroundColor = 'transparent';\n }}\n >\n {dropdownItem.label}\n </a>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n };\n\n return (\n <header style={styles.header}>\n <div style={styles.container}>\n {/* Logo */}\n <a\n href={logoHref}\n onClick={(e) => handleNavClick(e, logoHref)}\n style={{ display: 'flex', alignItems: 'center', flexShrink: 0 }}\n >\n {logoSrc ? (\n <img src={logoSrc} alt={logoAlt} style={styles.logo} />\n ) : (\n <span\n style={{\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: fontSizes['2xl'],\n color: t.text,\n }}\n >\n empowered.vote\n </span>\n )}\n </a>\n\n {/* Desktop Navigation */}\n <nav style={styles.nav} className=\"ev-header-nav\">\n {navItems.map((item, idx) => (\n <NavLink key={idx} item={item} />\n ))}\n </nav>\n\n {/* Right side: secondary action + CTA + Profile */}\n <div style={{ display: isMobile ? 'none' : 'flex', alignItems: 'center', gap: spacing[3], flexShrink: 0 }}>\n {secondaryAction && React.isValidElement(secondaryAction) && secondaryAction}\n {secondaryAction && !React.isValidElement(secondaryAction) && (\n <a\n href={secondaryAction.href}\n target={secondaryAction.target || '_self'}\n rel={secondaryAction.target === '_blank' ? 'noopener noreferrer' : (secondaryAction.rel || undefined)}\n onClick={(e) => {\n if (secondaryAction.target !== '_blank') {\n handleNavClick(e, secondaryAction.href);\n }\n }}\n style={styles.secondaryAction}\n className=\"ev-header-secondary\"\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = t.text;\n e.currentTarget.style.color = darkMode ? t.surface : colors.textWhite;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = t.text;\n }}\n >\n {secondaryAction.label}\n </a>\n )}\n {ctaButton && (\n <a\n href={ctaButton.href}\n onClick={(e) => handleNavClick(e, ctaButton.href)}\n style={styles.ctaButton}\n className=\"ev-header-cta\"\n onMouseEnter={(e) => {\n e.target.style.backgroundColor = t.ctaBgHover;\n }}\n onMouseLeave={(e) => {\n e.target.style.backgroundColor = t.ctaBg;\n }}\n >\n {ctaButton.label}\n </a>\n )}\n\n {/* Profile Menu (Desktop) */}\n {profileMenu && (\n <div ref={profileRef} style={{ position: 'relative' }}>\n <button\n style={styles.profileButton}\n onClick={() => setProfileOpen(!profileOpen)}\n aria-label=\"Profile menu\"\n aria-expanded={profileOpen}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={t.text}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\" />\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\n </svg>\n </button>\n {profileOpen && (\n <div style={styles.profileDropdown}>\n <div style={styles.profileDropdownInner}>\n {profileMenu.label && (\n <div style={styles.profileLabel}>{profileMenu.label}</div>\n )}\n {profileMenu.items.map((item, idx) => {\n if (item.href) {\n return (\n <a\n key={idx}\n href={item.href}\n onClick={(e) => {\n setProfileOpen(false);\n if (onNavigate) {\n e.preventDefault();\n onNavigate(item.href);\n }\n }}\n style={styles.profileDropdownItem}\n onMouseEnter={(e) => {\n e.target.style.backgroundColor = t.hoverBg;\n }}\n onMouseLeave={(e) => {\n e.target.style.backgroundColor = 'transparent';\n }}\n >\n {item.label}\n </a>\n );\n }\n return (\n <button\n key={idx}\n onClick={() => {\n setProfileOpen(false);\n item.onClick?.();\n }}\n style={styles.profileDropdownItem}\n onMouseEnter={(e) => {\n e.target.style.backgroundColor = t.hoverBg;\n }}\n onMouseLeave={(e) => {\n e.target.style.backgroundColor = 'transparent';\n }}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Mobile Menu Button */}\n <button\n style={styles.mobileMenuButton}\n className=\"ev-header-mobile-toggle\"\n onClick={() => setMobileMenuOpen(!mobileMenuOpen)}\n aria-label=\"Toggle menu\"\n aria-expanded={mobileMenuOpen}\n >\n <div style={styles.hamburger}>\n <span\n style={{\n position: 'absolute',\n top: '-8px',\n left: 0,\n width: '100%',\n height: '2px',\n backgroundColor: t.text,\n }}\n />\n <span\n style={{\n position: 'absolute',\n top: '8px',\n left: 0,\n width: '100%',\n height: '2px',\n backgroundColor: t.text,\n }}\n />\n </div>\n </button>\n </div>\n\n {/* Mobile Menu */}\n <div style={styles.mobileMenu} className=\"ev-header-mobile-menu\">\n {navItems.map((item, idx) => {\n const hasDropdown = item.dropdown && item.dropdown.length > 0;\n return (\n <React.Fragment key={idx}>\n {hasDropdown ? (\n <>\n <span\n style={{\n ...styles.mobileNavItem,\n cursor: 'default',\n display: 'block',\n }}\n >\n {item.label}\n </span>\n {item.dropdown.map((sub, subIdx) => (\n <a\n key={subIdx}\n href={sub.href}\n onClick={(e) => {\n handleNavClick(e, sub.href);\n setMobileMenuOpen(false);\n }}\n style={{\n ...styles.mobileNavItem,\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.base,\n paddingLeft: spacing[4],\n }}\n >\n {sub.label}\n </a>\n ))}\n </>\n ) : (\n <a\n href={item.href}\n onClick={(e) => {\n handleNavClick(e, item.href);\n setMobileMenuOpen(false);\n }}\n style={styles.mobileNavItem}\n >\n {item.label}\n </a>\n )}\n </React.Fragment>\n );\n })}\n {secondaryAction && React.isValidElement(secondaryAction) && (\n <div style={{ marginTop: spacing[4], textAlign: 'center' }}>\n {secondaryAction}\n </div>\n )}\n {secondaryAction && !React.isValidElement(secondaryAction) && (\n <a\n href={secondaryAction.href}\n target={secondaryAction.target || '_self'}\n rel={secondaryAction.target === '_blank' ? 'noopener noreferrer' : (secondaryAction.rel || undefined)}\n onClick={(e) => {\n if (secondaryAction.target !== '_blank') {\n handleNavClick(e, secondaryAction.href);\n }\n setMobileMenuOpen(false);\n }}\n style={{ ...styles.secondaryAction, marginTop: spacing[4], textAlign: 'center', justifyContent: 'center' }}\n >\n {secondaryAction.label}\n </a>\n )}\n {ctaButton && (\n <a\n href={ctaButton.href}\n onClick={(e) => {\n handleNavClick(e, ctaButton.href);\n setMobileMenuOpen(false);\n }}\n style={{ ...styles.ctaButton, marginTop: spacing[4], textAlign: 'center' }}\n >\n {ctaButton.label}\n </a>\n )}\n\n {/* Profile items in mobile menu */}\n {profileMenu && (\n <>\n <div style={styles.mobileDivider} />\n {profileMenu.label && (\n <span\n style={{\n ...styles.mobileNavItem,\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.sm,\n color: t.muted,\n cursor: 'default',\n display: 'block',\n borderBottom: 'none',\n }}\n >\n {profileMenu.label}\n </span>\n )}\n {profileMenu.items.map((item, idx) => {\n if (item.href) {\n return (\n <a\n key={idx}\n href={item.href}\n onClick={(e) => {\n setMobileMenuOpen(false);\n if (onNavigate) {\n e.preventDefault();\n onNavigate(item.href);\n }\n }}\n style={styles.mobileNavItem}\n >\n {item.label}\n </a>\n );\n }\n return (\n <button\n key={idx}\n onClick={() => {\n setMobileMenuOpen(false);\n item.onClick?.();\n }}\n style={{\n ...styles.mobileNavItem,\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n width: '100%',\n textAlign: 'left',\n }}\n >\n {item.label}\n </button>\n );\n })}\n </>\n )}\n </div>\n </header>\n );\n}\n","import { useState, useEffect } from 'react';\n\n/**\n * Hook that listens to a CSS media query and returns whether it matches.\n *\n * @param {string} query - A valid CSS media query string, e.g. '(max-width: 768px)'\n * @returns {boolean} Whether the media query currently matches\n */\nexport default function useMediaQuery(query) {\n const [matches, setMatches] = useState(() => {\n if (typeof window === 'undefined') return false;\n return window.matchMedia(query).matches;\n });\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const mql = window.matchMedia(query);\n const handler = (e) => setMatches(e.matches);\n mql.addEventListener('change', handler);\n setMatches(mql.matches);\n return () => mql.removeEventListener('change', handler);\n }, [query]);\n\n return matches;\n}\n","import React from 'react';\nimport Header from './Header.jsx';\nimport FeedbackButton from './FeedbackButton.jsx';\n\n/**\n * Pre-configured site header for Empowered Vote applications\n *\n * Provides consistent navigation across all EV apps. Wraps the base Header\n * with standard nav items, a Donate CTA, and a Feedback button (auto-detects\n * the current tool from window.location.hostname).\n *\n * @param {Object} props\n * @param {string} props.logoSrc - URL for the logo image (defaults to /EVLogo.svg)\n * @param {string} props.currentPath - Current path for active state highlighting\n * @param {Function} props.onNavigate - Navigation handler (receives href string)\n * @param {Object} [props.profileMenu] - Optional profile dropdown config\n * @param {React.ReactNode|Object|false} [props.secondaryAction] - Override the\n * default Feedback button. Pass `false` to hide. Pass a React node or a\n * {label, href, target} config to replace it.\n * @param {string} [props.feedbackFeature] - Override auto-detected feature slug\n * for the default Feedback button (e.g. \"compass\" if you want to force it).\n * @param {Object} props.style - Additional styles for the header container\n */\n\nconst defaultNavItems = [\n {\n label: 'Features',\n href: '#',\n dropdown: [\n { label: 'Political Compass', href: 'https://compass.empowered.vote' },\n { label: 'Find Representatives', href: 'https://essentials.empowered.vote' },\n { label: 'Read & Rank', href: 'https://readrank.empowered.vote' },\n { label: 'Treasury Tracker', href: 'https://treasurytracker.empowered.vote' },\n { label: 'Civic Trivia', href: 'https://ctc.empowered.vote' },\n { label: 'Empowered Badges', href: 'https://badges.empowered.vote' },\n ],\n },\n];\n\n/**\n * Canonical inline cross-app nav links for the EV header.\n *\n * Pass to `<Header navItems={evAppLinks} />` to render one top-level link per\n * app (no dropdown). The Header marks the current app active by matching the\n * link hostname against window.location.hostname. Labels are short to fit the\n * bar; the current app stays visible (and underlined) rather than hidden.\n */\nconst evAppLinks = [\n { label: 'Compass', href: 'https://compass.empowered.vote' },\n { label: 'Find Representatives', href: 'https://essentials.empowered.vote' },\n { label: 'Treasury Tracker', href: 'https://treasurytracker.empowered.vote' },\n { label: 'Civic Trivia', href: 'https://ctc.empowered.vote' },\n];\n\nconst defaultCtaButton = {\n label: 'Donate',\n href: 'https://empowered.vote/donate',\n};\n\nexport default function SiteHeader({\n logoSrc = '/EVLogo.svg',\n currentPath,\n onNavigate,\n profileMenu,\n secondaryAction,\n feedbackFeature,\n style = {},\n}) {\n const handleNavigate = (href) => {\n if (onNavigate) {\n onNavigate(href);\n } else {\n window.location.href = href;\n }\n };\n\n // secondaryAction === false → hide. undefined → default Feedback button.\n // anything else → caller-provided override.\n let resolvedSecondary;\n if (secondaryAction === false) {\n resolvedSecondary = undefined;\n } else if (secondaryAction === undefined) {\n resolvedSecondary = <FeedbackButton feature={feedbackFeature} />;\n } else {\n resolvedSecondary = secondaryAction;\n }\n\n return (\n <Header\n logoSrc={logoSrc}\n logoAlt=\"Empowered Vote\"\n navItems={defaultNavItems}\n ctaButton={defaultCtaButton}\n secondaryAction={resolvedSecondary}\n currentPath={currentPath}\n onNavigate={handleNavigate}\n profileMenu={profileMenu}\n style={style}\n />\n );\n}\n\nexport { defaultNavItems, defaultCtaButton, evAppLinks };\n","import React from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius } from './tokens';\n\n/**\n * FeedbackButton — links to the ev-landing feedback form.\n *\n * Auto-detects which EV tool the user is on from window.location.hostname\n * and pre-fills the ?feature= query param. Also passes the current page URL\n * as ?url= so the report has context. Both can be overridden via props.\n *\n * @param {Object} props\n * @param {string} [props.feature] - explicit feature override (skips auto-detect)\n * @param {string} [props.baseUrl] - feedback form URL (default: empowered.vote/feedback)\n * @param {string} [props.label] - button text (default: \"Feedback\")\n * @param {'pill'|'link'} [props.variant] - visual style (default: 'pill')\n * @param {boolean} [props.includeUrl] - pass current href as ?url= (default: true)\n * @param {string} [props.className] - additional class names\n * @param {Object} [props.style] - additional inline styles\n */\n\nconst FEEDBACK_BASE_DEFAULT = 'https://empowered.vote/feedback';\n\n// Hostname → feature slug. Slugs MUST match the backend Zod enum:\n// compass | essentials | readrank | treasury | badges | trivia | landing | other\nexport const HOST_FEATURE_MAP = {\n 'compass.empowered.vote': 'compass',\n 'essentials.empowered.vote': 'essentials',\n 'readrank.empowered.vote': 'readrank',\n 'treasurytracker.empowered.vote': 'treasury',\n 'badges.empowered.vote': 'badges',\n 'ctc.empowered.vote': 'trivia',\n 'alpha.empowered.vote': 'landing',\n 'ev-landing.empowered.vote': 'landing',\n 'ev-landing.onrender.com': 'landing',\n 'empowered.vote': 'landing',\n};\n\nexport function detectFeature() {\n if (typeof window === 'undefined') return undefined;\n const host = window.location.hostname;\n\n // Exact host match (production subdomains)\n if (HOST_FEATURE_MAP[host]) return HOST_FEATURE_MAP[host];\n\n // Subdomain prefix match — handles previews/staging like\n // compass-pr-12.onrender.com or compass.staging.empowered.vote\n const firstLabel = host.split('.')[0];\n for (const [knownHost, feature] of Object.entries(HOST_FEATURE_MAP)) {\n const knownPrefix = knownHost.split('.')[0];\n if (firstLabel === knownPrefix || firstLabel.startsWith(`${knownPrefix}-`)) {\n return feature;\n }\n }\n\n // Localhost / unknown\n return 'other';\n}\n\n/**\n * Build the canonical feedback URL.\n * @param {Object} [opts]\n * @param {string} [opts.feature] - explicit feature slug (skips auto-detect)\n * @param {string} [opts.baseUrl] - feedback form URL (default: empowered.vote/feedback)\n * @param {boolean} [opts.includeUrl] - append current href as ?url= (default: true)\n * @returns {string}\n */\nexport function getFeedbackUrl({ feature, baseUrl = FEEDBACK_BASE_DEFAULT, includeUrl = true } = {}) {\n const resolvedFeature = feature ?? detectFeature();\n const params = new URLSearchParams();\n if (resolvedFeature) params.set('feature', resolvedFeature);\n if (includeUrl && typeof window !== 'undefined') {\n params.set('url', window.location.href);\n }\n const qs = params.toString();\n return qs ? `${baseUrl}?${qs}` : baseUrl;\n}\n\nexport default function FeedbackButton({\n feature: featureProp,\n baseUrl = FEEDBACK_BASE_DEFAULT,\n label = 'Feedback',\n variant = 'pill',\n includeUrl = true,\n className = '',\n style = {},\n}) {\n const href = getFeedbackUrl({ feature: featureProp, baseUrl, includeUrl });\n\n const pillStyle = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: spacing[1],\n padding: `${spacing[2]} ${spacing[4]}`,\n backgroundColor: 'transparent',\n color: colors.evTeal,\n border: `1.5px solid ${colors.evTeal}`,\n borderRadius: borderRadius.full || '999px',\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: fontSizes.base,\n lineHeight: 1.2,\n textDecoration: 'none',\n cursor: 'pointer',\n transition: 'background-color 0.15s ease, color 0.15s ease',\n };\n\n const linkStyle = {\n color: colors.evTeal,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n textDecoration: 'underline',\n cursor: 'pointer',\n };\n\n const baseStyle = variant === 'link' ? linkStyle : pillStyle;\n\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={`ev-feedback-button ${className}`.trim()}\n style={{ ...baseStyle, ...style }}\n aria-label=\"Send feedback\"\n onMouseEnter={(e) => {\n if (variant === 'pill') {\n e.currentTarget.style.backgroundColor = colors.evTeal;\n e.currentTarget.style.color = colors.textWhite || '#ffffff';\n }\n }}\n onMouseLeave={(e) => {\n if (variant === 'pill') {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = colors.evTeal;\n }\n }}\n >\n {label}\n </a>\n );\n}\n","import React from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius, shadows } from './tokens';\nimport useMediaQuery from './useMediaQuery';\n\n/**\n * FilterSidebar component for filtering politicians by level\n *\n * @param {Object} props\n * @param {string} props.title - Sidebar title (default: \"Filter by\")\n * @param {string} props.zipCode - Current ZIP code value\n * @param {Function} props.onZipChange - Handler for ZIP input changes\n * @param {Function} props.onZipClear - Handler for clearing ZIP\n * @param {Function} props.onZipSubmit - Handler for ZIP submission (Enter key)\n * @param {Array} props.filterOptions - Filter options [{value, label}]\n * @param {string} props.selectedFilter - Currently selected filter value\n * @param {Function} props.onFilterChange - Handler for filter changes\n * @param {string} props.locationLabel - Location display text (e.g., \"Bloomington, Indiana\")\n * @param {string} props.buildingImageSrc - URL for the building image\n * @param {Object} props.style - Additional styles\n */\nexport default function FilterSidebar({\n title = 'Filter by',\n zipCode = '',\n onZipChange,\n onZipClear,\n onZipSubmit,\n filterOptions = [\n { value: 'All', label: 'All' },\n { value: 'Local', label: 'Local' },\n { value: 'State', label: 'State' },\n { value: 'Federal', label: 'Federal' },\n ],\n selectedFilter = 'All',\n onFilterChange,\n locationLabel,\n buildingImageSrc,\n zipInputRef,\n autocompleteContainerRef,\n style = {},\n}) {\n const isMobile = useMediaQuery('(max-width: 768px)');\n\n const handleKeyDown = (e) => {\n if (e.key === 'Enter' && onZipSubmit) {\n onZipSubmit();\n }\n };\n\n const styles = {\n sidebar: isMobile\n ? {\n width: '100%',\n padding: `${spacing[3]} ${spacing[4]}`,\n backgroundColor: colors.bgWhite,\n borderBottom: `1px solid ${colors.borderLight}`,\n ...style,\n }\n : {\n width: '300px',\n flexShrink: 0,\n padding: spacing[6],\n backgroundColor: colors.bgWhite,\n borderRight: `1px solid ${colors.borderLight}`,\n position: 'sticky',\n top: 0,\n height: 'calc(100vh - 75px)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n ...style,\n },\n title: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: fontSizes.lg,\n color: colors.textPrimary,\n marginBottom: spacing[4],\n },\n section: {\n marginBottom: spacing[6],\n },\n sectionLabel: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.sm,\n color: colors.textSecondary,\n marginBottom: spacing[2],\n },\n contentTop: {\n flexShrink: 0,\n },\n zipInputWrapper: {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n },\n zipInput: {\n width: '100%',\n padding: `${spacing[2]} ${spacing[3]}`,\n paddingRight: spacing[8],\n fontFamily: fonts.primary,\n fontSize: fontSizes.base,\n color: colors.textPrimary,\n border: `1px solid ${colors.evTeal}`,\n borderRadius: borderRadius.md,\n outline: 'none',\n },\n clearButton: {\n position: 'absolute',\n right: spacing[2],\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: spacing[1],\n color: colors.evTeal,\n fontSize: fontSizes.lg,\n lineHeight: 1,\n display: zipCode ? 'block' : 'none',\n },\n radioGroup: {\n display: 'flex',\n flexDirection: isMobile ? 'row' : 'column',\n flexWrap: isMobile ? 'wrap' : 'nowrap',\n gap: spacing[2],\n },\n radioLabel: {\n display: 'flex',\n alignItems: 'center',\n gap: spacing[2],\n cursor: 'pointer',\n fontFamily: fonts.primary,\n fontSize: fontSizes.base,\n color: colors.textPrimary,\n },\n radioInput: {\n width: '16px',\n height: '16px',\n accentColor: colors.evTeal,\n cursor: 'pointer',\n },\n imageSection: {\n flexGrow: 1,\n flexShrink: 1,\n minHeight: 0,\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n },\n locationLabel: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: fontSizes.base,\n color: colors.textPrimary,\n marginBottom: spacing[3],\n },\n buildingImage: {\n width: '100%',\n borderRadius: borderRadius.lg,\n objectFit: 'cover',\n aspectRatio: '1/2.25',\n flexShrink: 1,\n minHeight: 0,\n overflow: 'hidden',\n },\n buildingPlaceholder: {\n width: '100%',\n aspectRatio: '1/2.25',\n backgroundColor: colors.bgLight,\n borderRadius: borderRadius.lg,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: colors.textMuted,\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n },\n };\n\n return (\n <aside style={styles.sidebar} className=\"ev-filter-sidebar\">\n {!isMobile && <h2 style={styles.title}>{title}</h2>}\n\n <div style={isMobile ? undefined : styles.contentTop}>\n {/* Location Input */}\n <div style={isMobile ? { marginBottom: spacing[3] } : styles.section}>\n {!isMobile && <label style={styles.sectionLabel}>Location</label>}\n {autocompleteContainerRef ? (\n <div\n ref={autocompleteContainerRef}\n style={styles.zipInputWrapper}\n className=\"ev-autocomplete-container\"\n />\n ) : (\n <div style={styles.zipInputWrapper}>\n <input\n ref={zipInputRef}\n type=\"text\"\n value={zipCode}\n onChange={(e) => onZipChange?.(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"ZIP or address\"\n style={styles.zipInput}\n aria-label=\"Search location\"\n />\n <button\n type=\"button\"\n onClick={onZipClear}\n style={styles.clearButton}\n aria-label=\"Clear ZIP code\"\n >\n &times;\n </button>\n </div>\n )}\n </div>\n\n {/* Filter Radio Buttons */}\n <div style={isMobile ? {} : styles.section}>\n {!isMobile && <label style={styles.sectionLabel}>Group</label>}\n <div style={styles.radioGroup} role=\"radiogroup\" aria-label=\"Filter by group\">\n {filterOptions.map((option) => (\n <label key={option.value} style={styles.radioLabel}>\n <input\n type=\"radio\"\n name=\"filter\"\n value={option.value}\n checked={selectedFilter === option.value}\n onChange={() => onFilterChange?.(option.value)}\n style={styles.radioInput}\n />\n {option.label}\n </label>\n ))}\n </div>\n </div>\n </div>\n\n {/* Building image section — fills remaining space, shrinks on short viewports */}\n {!isMobile && (\n <div style={styles.imageSection}>\n {locationLabel && (\n <div style={styles.locationLabel}>{locationLabel}</div>\n )}\n {buildingImageSrc ? (\n <img\n src={buildingImageSrc}\n alt={`${selectedFilter} government building`}\n style={styles.buildingImage}\n />\n ) : (\n <div style={styles.buildingPlaceholder}>\n No image\n </div>\n )}\n </div>\n )}\n </aside>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius, shadows } from './tokens';\n\n/**\n * PoliticianCard component for displaying politician info\n *\n * @param {Object} props\n * @param {string} props.id - Politician ID\n * @param {string} props.imageSrc - Profile image URL\n * @param {string} props.name - Politician name\n * @param {string} props.title - Politician title/position\n * @param {string} [props.subtitle] - Optional 3rd line (e.g., chamber + district)\n * @param {Function} props.onClick - Handler for card click\n * @param {Function} props.onCompassClick - Handler for compass button click\n * @param {'horizontal' | 'vertical'} props.variant - Card layout variant\n * @param {Object} props.style - Additional styles\n * @param {string} props.badge - Optional badge label (e.g., \"Candidate\") shown as coral pill\n * @param {React.ReactNode} [props.footer] - Optional content rendered below subtitle (e.g., icon badges)\n * @param {string} [props.imageWidth] - Photo column width for the horizontal variant (default '90px')\n */\nexport default function PoliticianCard({\n id,\n imageSrc,\n name,\n title,\n subtitle,\n onClick,\n onCompassClick,\n variant = 'horizontal',\n style = {},\n badge,\n imageFocalPoint,\n footer,\n imageWidth = '90px',\n contentStyle = {},\n}) {\n const isHorizontal = variant === 'horizontal';\n // Compute the natural 3:4 height for the image column so the photo is always portrait\n const imageWidthPx = parseInt(imageWidth, 10) || 90;\n const imageMinHeight = isHorizontal ? Math.ceil(imageWidthPx * 4 / 3) : undefined;\n\n const handleCardClick = (e) => {\n // Don't trigger card click if compass button was clicked\n if (e.target.closest('.ev-compass-button')) return;\n onClick?.();\n };\n\n const handleCompassClick = (e) => {\n e.stopPropagation();\n onCompassClick?.();\n };\n\n const styles = {\n card: {\n display: 'flex',\n flexDirection: isHorizontal ? 'row' : 'column',\n alignItems: 'stretch',\n backgroundColor: colors.bgWhite,\n borderRadius: borderRadius.lg,\n border: `1px solid ${colors.borderLight}`,\n overflow: 'hidden',\n cursor: onClick ? 'pointer' : 'default',\n transition: 'box-shadow 0.2s ease, transform 0.2s ease',\n position: 'relative',\n minHeight: imageMinHeight,\n height: '100%',\n ...style,\n },\n imageWrapper: {\n // Horizontal: fixed width with 3:4 aspect ratio so portrait photos look\n // consistent regardless of card content height.\n position: 'relative',\n width: isHorizontal ? imageWidth : '100%',\n height: isHorizontal ? '100%' : 'auto',\n aspectRatio: isHorizontal ? undefined : '4/5',\n flexShrink: 0,\n overflow: 'hidden',\n },\n image: {\n ...(isHorizontal ? { position: 'absolute', top: 0, left: 0 } : {}),\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n objectPosition: imageFocalPoint ?? 'center 20%',\n },\n imagePlaceholder: {\n ...(isHorizontal ? { position: 'absolute', top: 0, left: 0 } : {}),\n width: '100%',\n height: '100%',\n backgroundColor: colors.evTeal,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#ffffff',\n fontFamily: fonts.primary,\n fontSize: isHorizontal ? fontSizes.base : fontSizes.xl,\n fontWeight: fontWeights.bold,\n borderRadius: 0,\n },\n content: {\n flex: 1,\n padding: isHorizontal ? `${spacing[2]} ${spacing[3]}` : spacing[3],\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n ...contentStyle,\n },\n name: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: isHorizontal ? fontSizes.sm : fontSizes.base,\n color: colors.evTeal,\n margin: 0,\n marginBottom: spacing[1],\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: isHorizontal ? 'nowrap' : 'normal',\n display: isHorizontal ? 'block' : '-webkit-box',\n WebkitLineClamp: isHorizontal ? undefined : 2,\n WebkitBoxOrient: 'vertical',\n },\n title: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.regular,\n fontSize: isHorizontal ? fontSizes.xs : fontSizes.sm,\n color: colors.textSecondary,\n margin: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n display: '-webkit-box',\n // Wrap to 3 lines so a qualified title with a trailing parenthetical\n // (e.g. \"Clark County Commissioner (District A)\") drops the parenthetical\n // to its own line instead of truncating (\"…(Distric…\") — important when the\n // compass overlay narrows the content column. 3 short lines still fit within\n // the image-driven card height, so the tile does not grow.\n WebkitLineClamp: 3,\n WebkitBoxOrient: 'vertical',\n // Let a long unbroken segment wrap rather than overflow under the compass.\n overflowWrap: 'anywhere',\n },\n subtitle: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.regular,\n fontSize: isHorizontal ? '11px' : fontSizes.xs,\n color: colors.textMuted,\n margin: 0,\n marginTop: spacing[1],\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n compassButton: {\n width: isHorizontal ? '28px' : '36px',\n height: isHorizontal ? '28px' : '36px',\n borderRadius: '50%',\n backgroundColor: colors.evTeal,\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n alignSelf: 'center',\n marginRight: isHorizontal ? spacing[3] : 0,\n marginTop: isHorizontal ? 0 : spacing[2],\n position: isHorizontal ? 'relative' : 'absolute',\n bottom: isHorizontal ? 'auto' : spacing[3],\n right: isHorizontal ? 'auto' : spacing[3],\n transition: 'background-color 0.2s ease',\n },\n compassIcon: {\n width: isHorizontal ? '20px' : '24px',\n height: isHorizontal ? '20px' : '24px',\n color: colors.textWhite,\n },\n badge: {\n position: 'absolute',\n bottom: spacing[1],\n right: spacing[1],\n backgroundColor: colors.evCoral,\n color: colors.textWhite,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.semibold,\n fontSize: '10px',\n lineHeight: 1,\n padding: `${spacing[1]} ${spacing[2]}`,\n borderRadius: borderRadius.full,\n zIndex: 1,\n letterSpacing: '0.02em',\n textTransform: 'uppercase',\n },\n };\n\n // Mini radar chart icon SVG — represents the compass radar chart feature\n const CompassIcon = () => (\n <svg\n style={styles.compassIcon}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n {/* Outer hexagon border */}\n <polygon\n points=\"12,1 21.5,6.5 21.5,17.5 12,23 2.5,17.5 2.5,6.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n {/* 6 spokes from center */}\n <line x1=\"12\" y1=\"12\" x2=\"12\" y2=\"1\" stroke=\"currentColor\" strokeWidth=\"1\" />\n <line x1=\"12\" y1=\"12\" x2=\"21.5\" y2=\"6.5\" stroke=\"currentColor\" strokeWidth=\"1\" />\n <line x1=\"12\" y1=\"12\" x2=\"21.5\" y2=\"17.5\" stroke=\"currentColor\" strokeWidth=\"1\" />\n <line x1=\"12\" y1=\"12\" x2=\"12\" y2=\"23\" stroke=\"currentColor\" strokeWidth=\"1\" />\n <line x1=\"12\" y1=\"12\" x2=\"2.5\" y2=\"17.5\" stroke=\"currentColor\" strokeWidth=\"1\" />\n <line x1=\"12\" y1=\"12\" x2=\"2.5\" y2=\"6.5\" stroke=\"currentColor\" strokeWidth=\"1\" />\n {/* Filled radar data polygon */}\n <polygon\n points=\"12,4 18,7.5 18,16 12,19.5 7,15 5,8\"\n fill=\"currentColor\"\n opacity=\"0.35\"\n />\n <polygon\n points=\"12,4 18,7.5 18,16 12,19.5 7,15 5,8\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // Track broken image URLs so we can fall back to initials\n const [imgError, setImgError] = useState(false);\n useEffect(() => { setImgError(false); }, [imageSrc]);\n\n // Extract initials from name for placeholder avatar\n const getInitials = (n) => {\n const parts = (n || '').split(' ').filter(Boolean);\n const initials = parts.length >= 2\n ? parts[0][0] + parts[parts.length - 1][0]\n : parts[0]?.[0] || '?';\n return initials.toUpperCase();\n };\n\n return (\n <div\n style={styles.card}\n className=\"ev-politician-card\"\n onClick={handleCardClick}\n onMouseEnter={(e) => {\n if (onClick) {\n e.currentTarget.style.boxShadow = shadows.md;\n e.currentTarget.style.transform = 'translateY(-2px)';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.boxShadow = 'none';\n e.currentTarget.style.transform = 'none';\n }}\n role={onClick ? 'button' : undefined}\n tabIndex={onClick ? 0 : undefined}\n onKeyDown={(e) => {\n if (onClick && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onClick();\n }\n }}\n >\n {/* Badge */}\n {badge && <span style={styles.badge}>{badge}</span>}\n\n {/* Image */}\n <div style={styles.imageWrapper}>\n {imageSrc && !imgError ? (\n <img\n src={imageSrc}\n alt={`${name} portrait`}\n style={styles.image}\n onError={() => setImgError(true)}\n />\n ) : (\n <div style={styles.imagePlaceholder}>\n {getInitials(name)}\n </div>\n )}\n </div>\n\n {/* Content */}\n <div style={styles.content}>\n <h3 style={styles.name}>{name}</h3>\n <p style={styles.title}>{title}</p>\n {subtitle && (\n <p style={styles.subtitle}>{subtitle}</p>\n )}\n {footer && (\n <div style={{ marginTop: 'auto', marginLeft: '-5px' }}>\n {footer}\n </div>\n )}\n </div>\n\n {/* Compass Button */}\n {onCompassClick && (\n <button\n type=\"button\"\n style={styles.compassButton}\n className=\"ev-compass-button\"\n onClick={handleCompassClick}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = colors.evTealDark;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = colors.evTeal;\n }}\n aria-label={`View ${name}'s compass`}\n >\n <CompassIcon />\n </button>\n )}\n </div>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport {\n colors, fonts, fontWeights, fontSizes,\n spacing, borderRadius, shadows, focus, duration,\n semanticTokens,\n colorScales,\n} from './tokens';\nimport RadarChartCore from './RadarChartCore.jsx';\nimport PlaceholderRadar from './PlaceholderRadar.jsx';\nimport CompassCardHorizontalMeta from './CompassCardHorizontalMeta.jsx';\nimport { buildAnswerMapByShortTitle } from './compassHelpers.js';\n\n/**\n * CompassCardHorizontal — Variant C horizontal card with radar-left / meta-right layout.\n * Ported from essentials/src/components/CompassFirstCard.jsx (variant C branch).\n *\n * Fully controlled — consumer owns view and surface state (D-03).\n * Router-agnostic and context-agnostic. No router or context imports.\n *\n * Props:\n * politician {object} — required politician data\n * userAnswers {Array|null} — user compass answers; null/[] → PlaceholderRadar\n * tierVisuals {object|null} — { bg, accent, text } for tier-specific card background\n * view {string} — 'compass' | 'portrait' (default: 'compass')\n * surface {string} — 'representatives' | 'elections' (default: 'representatives')\n * variant {string} — 'compass' | 'empty' | 'administrative' | 'judicial' | 'no-stances' (default: 'compass')\n * onBuildCompass {Function|null} — called when empty-variant CTA clicked; parent owns deep-link URL\n * onClick {Function} — optional click handler (replaces internal navigate)\n */\n\nconst RADAR_SIZE = 400;\nconst SLOT_WIDTH = 420; // RADAR_SIZE + label-bleed wrapper (Pitfall 1)\n\nexport default function CompassCardHorizontal({\n politician,\n userAnswers = null,\n invertedSpokes = {},\n tierVisuals = null,\n view = 'compass',\n surface = 'representatives',\n variant = 'compass',\n onBuildCompass = null,\n onClick,\n}) {\n const [hovered, setHovered] = useState(false);\n const [focused, setFocused] = useState(false);\n const [imgError, setImgError] = useState(false);\n const [emptyCtaHovered, setEmptyCtaHovered] = useState(false);\n\n useEffect(() => { setImgError(false); }, [politician?.photo_origin_url]);\n\n const cardStyle = {\n position: 'relative',\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: tierVisuals?.bg ?? colors.bgWhite,\n border: `1px solid ${colors.borderLight}`,\n borderRadius: borderRadius.xl,\n overflow: 'hidden', // clips slot corners via card border-radius — no padding needed\n boxShadow: focused ? focus.ring : hovered ? shadows.cardHover : shadows.md,\n transform: hovered ? 'translateY(-2px)' : 'none',\n transition: `box-shadow ${duration.normal} ease, transform ${duration.normal} ease`,\n cursor: onClick ? 'pointer' : 'default',\n fontFamily: fonts.primary,\n outline: 'none',\n };\n\n // fixed square slot — portrait and compass render at same 260×260 dimensions\n const slotStyle = { width: SLOT_WIDTH, height: SLOT_WIDTH, flexShrink: 0, overflow: 'hidden', position: 'relative' };\n\n function renderCompass() {\n if (!userAnswers || userAnswers.length === 0) {\n return <PlaceholderRadar size={RADAR_SIZE} name={politician?.full_name || ''} />;\n }\n\n // Shape userAnswers into topics/data arrays for RadarChartCore.\n // Use short_title keys from the answers directly since userAnswers may already\n // be a map or an array with topic_id references.\n // We build a simple topics list from the answers array and extract values.\n let topics = [];\n let data = {};\n let compareData = {};\n\n try {\n if (Array.isArray(userAnswers) && userAnswers.length > 0) {\n // userAnswers is an array of { topic_id, value, topic?: { short_title, title, id } }\n // If topics are embedded in userAnswers, use them; otherwise build minimal topic stubs\n const hasEmbeddedTopics = userAnswers[0]?.topic?.short_title;\n if (hasEmbeddedTopics) {\n const allowedShorts = userAnswers.map(a => a.topic.short_title);\n const allTopics = userAnswers.map(a => a.topic);\n const { topicsFiltered, answersByShort } = buildAnswerMapByShortTitle(\n allTopics,\n userAnswers,\n allowedShorts\n );\n topics = topicsFiltered;\n data = answersByShort;\n } else {\n // Minimal: treat userAnswers as pre-shaped { short_title: value } map or\n // array with short_title directly\n if (!Array.isArray(userAnswers[0])) {\n // Try treating as array of { short_title, value }\n topics = userAnswers\n .filter(a => a.short_title)\n .map(a => ({ id: a.topic_id || a.short_title, short_title: a.short_title, title: a.short_title }));\n data = {};\n for (const a of userAnswers) {\n if (a.short_title) data[a.short_title] = a.value ?? 0;\n }\n }\n }\n }\n\n // Build compareData from politician stances if available\n if (politician?.stances && typeof politician.stances === 'object') {\n compareData = Array.isArray(politician.stances)\n ? politician.stances.reduce((acc, s) => {\n if (s.short_title) acc[s.short_title] = s.value ?? 0;\n return acc;\n }, {})\n : politician.stances;\n }\n\n // Fallback: if we couldn't shape topics, render placeholder\n if (topics.length === 0) {\n return <PlaceholderRadar size={RADAR_SIZE} name={politician?.full_name || ''} />;\n }\n } catch (err) {\n // T-127-06: malformed userAnswers guard — render placeholder instead of throwing\n return <PlaceholderRadar size={RADAR_SIZE} name={politician?.full_name || ''} />;\n }\n\n return (\n <RadarChartCore\n topics={topics}\n data={data}\n compareData={compareData}\n invertedSpokes={invertedSpokes || {}}\n onToggleInversion={() => {}}\n onReplaceTopic={() => {}}\n size={RADAR_SIZE}\n padding={20}\n labelOffset={5}\n labelFontSize={12}\n />\n );\n }\n\n function renderPortrait() {\n const imageSrc = politician?.photo_origin_url\n || (politician?.images && politician.images[0]?.url)\n || null;\n\n if (imageSrc && !imgError) {\n return (\n <img\n src={imageSrc}\n alt={`${politician.full_name} portrait`}\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n objectPosition: politician.imageFocalPoint ?? 'center 20%',\n display: 'block',\n }}\n onError={() => setImgError(true)}\n />\n );\n }\n\n // Initials fallback — evMutedBlue bg, white text, fills slot\n const parts = (politician?.full_name || '').split(' ').filter(Boolean);\n const initials = (parts.length >= 2\n ? parts[0][0] + parts[parts.length - 1][0]\n : parts[0]?.[0] || '?').toUpperCase();\n\n return (\n <div style={{\n width: '100%',\n height: '100%',\n backgroundColor: colors.evMutedBlue,\n color: colors.textWhite,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: fontSizes['4xl'],\n }}>\n {initials}\n </div>\n );\n }\n\n function renderEmptyVariant() {\n return (\n <div style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n padding: '12px 14px',\n boxSizing: 'border-box',\n backgroundColor: colorScales.teal['050'],\n }}>\n <PlaceholderRadar size={140} name={politician?.full_name || ''} />\n <p style={{\n margin: 0,\n fontSize: fontSizes.xs,\n color: colors.textMuted,\n textAlign: 'center',\n lineHeight: 1.4,\n fontFamily: fonts.primary,\n }}>\n Calibrate your compass to see how you align with {politician?.full_name || 'this official'}\n </p>\n <button\n type=\"button\"\n onClick={onBuildCompass || undefined}\n onMouseEnter={() => setEmptyCtaHovered(true)}\n onMouseLeave={() => setEmptyCtaHovered(false)}\n style={{\n minWidth: '160px',\n height: '40px',\n padding: '0 16px',\n backgroundColor: emptyCtaHovered\n ? semanticTokens.light.buttonPrimary.background.hovered\n : semanticTokens.light.buttonPrimary.background.default,\n color: colors.textWhite,\n fontSize: fontSizes.xs,\n fontWeight: fontWeights.semibold,\n fontFamily: fonts.primary,\n borderRadius: borderRadius.full,\n border: 'none',\n cursor: onBuildCompass ? 'pointer' : 'default',\n whiteSpace: 'nowrap',\n transition: `background ${duration.normal} ease`,\n flexShrink: 0,\n }}\n >\n Calibrate your compass\n </button>\n </div>\n );\n }\n\n function renderUnavailablePlate(message = 'Compass currently unavailable for this role.') {\n return (\n <div style={{\n width: '100%',\n height: '100%',\n backgroundColor: colorScales.teal['050'],\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: spacing[4],\n boxSizing: 'border-box',\n }}>\n <p style={{\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.semibold,\n lineHeight: 1.4,\n color: colors.textMuted,\n textAlign: 'center',\n maxWidth: '180px',\n margin: 0,\n fontFamily: fonts.primary,\n }}>\n {message}\n </p>\n </div>\n );\n }\n\n function renderSlotContent() {\n if (view === 'portrait') return renderPortrait();\n if (variant === 'empty') return renderEmptyVariant();\n if (variant === 'administrative' || variant === 'judicial') return renderUnavailablePlate();\n if (variant === 'no-stances') {\n const name = politician?.full_name || 'this official';\n return renderUnavailablePlate(`No compass stances on file for ${name} yet.`);\n }\n return (\n <div style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: spacing[3],\n boxSizing: 'border-box',\n }}>\n {renderCompass()}\n </div>\n );\n }\n\n return (\n <div\n role=\"article\"\n aria-label={`${politician.full_name}, ${politician.office_title || ''}`}\n tabIndex={0}\n style={cardStyle}\n onClick={onClick}\n onKeyDown={(e) => {\n if (onClick && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onClick();\n }\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n >\n <div style={slotStyle}>\n {renderSlotContent()}\n {surface === 'elections' && politician.running_unopposed && (\n <div style={{\n position: 'absolute',\n bottom: '15px',\n left: 0,\n width: '100%',\n backgroundColor: 'rgba(0,0,0,0.35)',\n color: '#fff',\n fontSize: '12px',\n fontWeight: 700,\n letterSpacing: '0.4px',\n textAlign: 'center',\n textTransform: 'uppercase',\n padding: '6px 0',\n pointerEvents: 'none',\n }}>\n {typeof politician.running_unopposed === 'string' ? politician.running_unopposed : 'Running Unopposed'}\n </div>\n )}\n </div>\n <div style={{ flex: 1, minWidth: 0, padding: spacing[4], paddingLeft: spacing[3] }}>\n <CompassCardHorizontalMeta\n politician={politician}\n surface={surface}\n userAnswers={userAnswers}\n />\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius } from './tokens';\nimport IconOverlay from './IconOverlay.jsx';\n\n/**\n * CompassCardHorizontalMeta — meta column renderer for CompassCardHorizontal.\n * Renders politician name, title (surface-switched), district label, affordance icons,\n * and the \"Running unopposed\" banner on elections surface.\n *\n * Internal to ev-ui — NOT exported from barrel.\n *\n * Props:\n * politician {object} — politician data object\n * surface {string} — 'representatives' | 'elections' (default: 'representatives')\n * userAnswers {Array|null} — user answers for affordance icon logic\n */\nexport default function CompassCardHorizontalMeta({\n politician,\n surface = 'representatives',\n userAnswers,\n}) {\n const titleText = surface === 'elections'\n ? politician.office_running_for\n : politician.office_title;\n\n return (\n <div style={{\n flex: 1,\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: spacing[1],\n }}>\n {/* Name — 18px semibold, evMutedBlue */}\n <p style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.lg,\n fontWeight: fontWeights.semibold,\n lineHeight: 1.4,\n color: colors.evMutedBlue,\n margin: 0,\n }}>\n {politician.full_name}\n </p>\n\n {/* Title — 14px semibold, textSecondary, 2-line clamp */}\n <p style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.semibold,\n lineHeight: 1.4,\n color: colors.textSecondary,\n margin: 0,\n overflow: 'hidden',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n }}>\n {titleText || ''}\n </p>\n\n {/* Subtitle — 14px regular, textMuted, ellipsis single line */}\n {politician.district_label && (\n <p style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.regular,\n lineHeight: 1.5,\n color: colors.textMuted,\n margin: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}>\n {politician.district_label}\n </p>\n )}\n\n {/* Affordance icon strip */}\n <IconOverlay\n ballot={politician.ballot || null}\n hasStances={false}\n branch={politician.branch || null}\n />\n\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport {\n useFloating,\n useHover,\n useFocus,\n useDismiss,\n useRole,\n useInteractions,\n FloatingPortal,\n offset,\n flip,\n shift,\n autoUpdate,\n} from '@floating-ui/react';\nimport { BallotIcon, CompassIcon, BranchIcon } from './icons.js';\nimport { colors, semanticTokens, spacing } from './tokens';\n\n/**\n * A single icon wrapped in an accessible tooltip using @floating-ui/react.\n *\n * @param {{ IconComponent: React.ComponentType, color: string, tooltip: string, size: number, onClick: Function }} props\n */\nfunction IconWithTooltip({ IconComponent, color, tooltip, size = 14, extraProps = {}, onClick }) {\n const [isOpen, setIsOpen] = useState(false);\n\n const { refs, floatingStyles, context } = useFloating({\n open: isOpen,\n onOpenChange: setIsOpen,\n middleware: [offset(8), flip(), shift({ padding: 4 })],\n whileElementsMounted: autoUpdate,\n });\n\n const hover = useHover(context);\n const focus = useFocus(context);\n const dismiss = useDismiss(context);\n const role = useRole(context, { role: 'tooltip' });\n\n const { getReferenceProps, getFloatingProps } = useInteractions([\n hover,\n focus,\n dismiss,\n role,\n ]);\n\n return (\n <>\n <span\n ref={refs.setReference}\n aria-label={tooltip}\n tabIndex={0}\n style={{ display: 'inline-flex', padding: spacing[1], ...(onClick ? { cursor: 'pointer' } : {}) }}\n {...getReferenceProps()}\n onClick={onClick ? (e) => { e.stopPropagation(); onClick(e); } : undefined}\n >\n <IconComponent size={size} color={color} {...extraProps} />\n </span>\n\n {isOpen && (\n <FloatingPortal>\n <div\n ref={refs.setFloating}\n style={{\n ...floatingStyles,\n zIndex: 70,\n background: semanticTokens.light.tooltip.background,\n color: semanticTokens.light.tooltip.text,\n padding: '4px 8px',\n borderRadius: '6px',\n fontSize: '14px',\n fontFamily: \"'Manrope', sans-serif\",\n pointerEvents: 'none',\n whiteSpace: 'nowrap',\n }}\n {...getFloatingProps()}\n >\n {tooltip}\n </div>\n </FloatingPortal>\n )}\n </>\n );\n}\n\n/**\n * IconOverlay — renders a row of icon badges with accessible tooltips below\n * politician card text content (static flow, left-aligned, no background).\n *\n * @param {{\n * ballot: { onBallot: boolean, termEndDate: Date, electionDate: Date, electionLabel: string } | null,\n * hasStances: boolean,\n * branch: 'Executive' | 'Legislative' | 'Judicial' | null,\n * onCompassClick: (e: React.MouseEvent) => void,\n * }} props\n */\nexport default function IconOverlay({ ballot, hasStances, branch, onCompassClick }) {\n if (!ballot && !hasStances && !branch) return null;\n\n const ballotTooltip = ballot\n ? `This seat is on your ballot \\u2014 ${ballot.electionLabel}: ${new Date(ballot.electionDate).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })}`\n : null;\n\n return (\n <div\n style={{\n display: 'flex',\n gap: 4,\n alignItems: 'center',\n justifyContent: 'flex-start',\n padding: 0,\n marginLeft: '-4px', // offset icon wrapper padding so icons align flush-left with text\n }}\n >\n {ballot && (\n <IconWithTooltip\n IconComponent={BallotIcon}\n color={colors.evMutedBlue}\n tooltip={ballotTooltip}\n size={14}\n />\n )}\n {hasStances && (\n <IconWithTooltip\n IconComponent={CompassIcon}\n color={colors.evMutedBlue}\n tooltip=\"Compare your views\"\n size={14}\n onClick={onCompassClick}\n />\n )}\n {branch && (\n <IconWithTooltip\n IconComponent={BranchIcon}\n color={colors.evMutedBlue}\n tooltip={`${branch} branch`}\n size={14}\n extraProps={{ branch: branch.toLowerCase() }}\n />\n )}\n </div>\n );\n}\n","import React from 'react';\n\n/**\n * BallotIcon — represents a ballot / voting form (Lucide \"vote\" pattern)\n * @param {{ size?: number, color?: string }} props\n */\nexport function BallotIcon({ size = 16, color = 'currentColor' }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"m9 12 2 2 4-4\" />\n <path d=\"M5 7c0-1.1.9-2 2-2h10a2 2 0 0 1 2 2v12H5V7Z\" />\n <path d=\"M22 19H2\" />\n </svg>\n );\n}\n\n/**\n * CompassIcon — represents a compass / political compass (Lucide \"compass\" pattern)\n * @param {{ size?: number, color?: string }} props\n */\nexport function CompassIcon({ size = 16, color = 'currentColor' }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m16.24 7.76-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z\" />\n </svg>\n );\n}\n\n/**\n * BranchIcon — represents a government branch with branch-specific SVG\n * @param {{ size?: number, color?: string, branch?: 'executive'|'legislative'|'judicial' }} props\n */\nexport function BranchIcon({ size = 16, color = 'currentColor', branch }) {\n let paths;\n switch (branch) {\n case 'executive':\n paths = (\n <>\n <path d=\"M3 21h18\" />\n <path d=\"M5 21V7l8-4v18\" />\n <path d=\"M19 21V11l-6-4\" />\n <path d=\"M9 9v.01\" />\n <path d=\"M9 12v.01\" />\n <path d=\"M9 15v.01\" />\n <path d=\"M9 18v.01\" />\n <path d=\"M5 21h14\" />\n <line x1=\"13\" y1=\"5\" x2=\"13\" y2=\"3\" />\n <line x1=\"13\" y1=\"3\" x2=\"15\" y2=\"4\" />\n </>\n );\n break;\n case 'legislative':\n paths = (\n <>\n <path d=\"M8 21h12a2 2 0 0 0 2-2v-2H10v2a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v3h4\" />\n <path d=\"M19 17V5a2 2 0 0 0-2-2H4\" />\n <path d=\"M15 8h-5\" />\n <path d=\"M15 12h-5\" />\n </>\n );\n break;\n case 'judicial':\n paths = (\n <>\n <path d=\"M12 3v19\" />\n <path d=\"M5 8l7-5 7 5\" />\n <path d=\"M3 13l2-5 2 5a3 3 0 0 1-4 0z\" />\n <path d=\"M17 13l2-5 2 5a3 3 0 0 1-4 0z\" />\n <path d=\"M8 21h8\" />\n </>\n );\n break;\n default:\n // Landmark fallback — preserves backward compatibility\n paths = (\n <>\n <path d=\"M10 18v-7\" />\n <path d=\"M11.12 2.198a2 2 0 0 1 1.76.006l7.866 3.847c.476.233.31.949-.22.949H3.474c-.53 0-.695-.716-.22-.949z\" />\n <path d=\"M14 18v-7\" />\n <path d=\"M18 18v-7\" />\n <path d=\"M3 22h18\" />\n <path d=\"M6 18v-7\" />\n </>\n );\n break;\n }\n\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n {paths}\n </svg>\n );\n}\n","// Ported verbatim from essentials/src/lib/compass.js.\n// Private util — NOT exported from ev-ui barrel.\n\n/**\n * Build { [short_title]: value } only for the allowed short titles.\n * Any missing answers default to 0.\n */\nexport function buildAnswerMapByShortTitle(\n allTopics,\n allAnswers,\n allowedShorts\n) {\n const allowed = new Set(allowedShorts.map((s) => s.toLowerCase()));\n const topicById = new Map(allTopics.map((t) => [t.id, t]));\n const shortById = new Map(allTopics.map((t) => [t.id, t.short_title]));\n\n // Initialize with 0 for each allowed short title (in allowedShorts order to preserve spoke layout)\n const out = {};\n const topicByShortLower = new Map(allTopics.map((t) => [t.short_title.toLowerCase(), t]));\n for (const s of allowedShorts) {\n const t = topicByShortLower.get(s.toLowerCase());\n if (t) out[t.short_title] = 0;\n }\n\n // Fill in any provided answers that match our allowed set\n for (const a of allAnswers) {\n const st = shortById.get(a.topic_id);\n if (!st) continue;\n if (allowed.has(String(st).toLowerCase())) {\n out[st] = a.value ?? 0;\n }\n }\n\n // Return topics in the same order as allowedShorts (preserves user's spoke layout)\n const topicByShort = new Map(allTopics.map((t) => [t.short_title.toLowerCase(), t]));\n const topicsFiltered = allowedShorts\n .map((s) => topicByShort.get(s.toLowerCase()))\n .filter(Boolean);\n\n return { topicsFiltered, answersByShort: out };\n}\n","import React, { useState, useEffect } from 'react';\nimport {\n colors, fonts, fontWeights, fontSizes,\n spacing, borderRadius, shadows, focus, duration,\n semanticTokens,\n colorScales,\n} from './tokens';\nimport RadarChartCore from './RadarChartCore.jsx';\nimport PlaceholderRadar from './PlaceholderRadar.jsx';\nimport IconOverlay from './IconOverlay.jsx';\nimport { buildAnswerMapByShortTitle } from './compassHelpers.js';\n\n/**\n * CompassCardVertical — meta-on-top, large-radar-below layout.\n * Same prop contract as CompassCardHorizontal.\n */\n\nconst RADAR_SIZE = 400;\n\nexport default function CompassCardVertical({\n politician,\n userAnswers = null,\n invertedSpokes = {},\n tierVisuals = null,\n view = 'compass',\n surface = 'representatives',\n variant = 'compass',\n onBuildCompass = null,\n onClick,\n}) {\n const [hovered, setHovered] = useState(false);\n const [focused, setFocused] = useState(false);\n const [imgError, setImgError] = useState(false);\n const [emptyCtaHovered, setEmptyCtaHovered] = useState(false);\n\n useEffect(() => { setImgError(false); }, [politician?.photo_origin_url]);\n\n const cardStyle = {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n backgroundColor: tierVisuals?.bg ?? colors.bgWhite,\n border: `1px solid ${colors.borderLight}`,\n borderRadius: borderRadius.xl,\n overflow: 'hidden',\n boxShadow: focused ? focus.ring : hovered ? shadows.cardHover : shadows.md,\n transform: hovered ? 'translateY(-2px)' : 'none',\n transition: `box-shadow ${duration.normal} ease, transform ${duration.normal} ease`,\n cursor: onClick ? 'pointer' : 'default',\n fontFamily: fonts.primary,\n outline: 'none',\n };\n\n const titleText = surface === 'elections'\n ? politician.office_running_for\n : politician.office_title;\n\n function renderCompass() {\n if (!userAnswers || userAnswers.length === 0) {\n return <PlaceholderRadar size={RADAR_SIZE} name={politician?.full_name || ''} />;\n }\n let topics = [];\n let data = {};\n let compareData = {};\n try {\n if (Array.isArray(userAnswers) && userAnswers.length > 0) {\n const hasEmbeddedTopics = userAnswers[0]?.topic?.short_title;\n if (hasEmbeddedTopics) {\n const allowedShorts = userAnswers.map(a => a.topic.short_title);\n const allTopics = userAnswers.map(a => a.topic);\n const { topicsFiltered, answersByShort } = buildAnswerMapByShortTitle(\n allTopics, userAnswers, allowedShorts\n );\n topics = topicsFiltered;\n data = answersByShort;\n } else {\n if (!Array.isArray(userAnswers[0])) {\n topics = userAnswers\n .filter(a => a.short_title)\n .map(a => ({ id: a.topic_id || a.short_title, short_title: a.short_title, title: a.short_title }));\n data = {};\n for (const a of userAnswers) {\n if (a.short_title) data[a.short_title] = a.value ?? 0;\n }\n }\n }\n }\n if (politician?.stances && typeof politician.stances === 'object') {\n compareData = Array.isArray(politician.stances)\n ? politician.stances.reduce((acc, s) => {\n if (s.short_title) acc[s.short_title] = s.value ?? 0;\n return acc;\n }, {})\n : politician.stances;\n }\n if (topics.length === 0) {\n return <PlaceholderRadar size={RADAR_SIZE} name={politician?.full_name || ''} />;\n }\n } catch {\n return <PlaceholderRadar size={RADAR_SIZE} name={politician?.full_name || ''} />;\n }\n // Mark a spoke as \"unanswered\" when the politician has no value on it.\n // Dims the axis line and label so sparse-data politicians read more clearly.\n const unansweredSpokes = {};\n for (const t of topics) {\n const v = compareData[t.short_title];\n if (!v || Number(v) === 0) unansweredSpokes[t.short_title] = true;\n }\n return (\n <div style={{ width: RADAR_SIZE + 240, maxWidth: '100%', flexShrink: 0 }}>\n <RadarChartCore\n topics={topics}\n data={data}\n compareData={compareData}\n invertedSpokes={invertedSpokes || {}}\n unansweredSpokes={unansweredSpokes}\n onToggleInversion={() => {}}\n onReplaceTopic={() => {}}\n size={RADAR_SIZE}\n padding={40}\n labelOffset={5}\n labelFontSize={18}\n tightFit={true}\n />\n </div>\n );\n }\n\n function renderAvatar() {\n const imageSrc = politician?.photo_origin_url\n || (politician?.images && politician.images[0]?.url)\n || null;\n const baseStyle = {\n width: 88, height: 110,\n flexShrink: 0, overflow: 'hidden',\n borderRadius: borderRadius.md,\n backgroundColor: colors.evMutedBlue,\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n };\n if (imageSrc && !imgError) {\n return (\n <div style={baseStyle}>\n <img\n src={imageSrc}\n alt={`${politician.full_name} portrait`}\n onError={() => setImgError(true)}\n style={{\n width: '100%', height: '100%',\n objectFit: 'cover',\n objectPosition: politician.imageFocalPoint ?? 'center 20%',\n display: 'block',\n }}\n />\n </div>\n );\n }\n const parts = (politician?.full_name || '').split(' ').filter(Boolean);\n const initials = (parts.length >= 2\n ? parts[0][0] + parts[parts.length - 1][0]\n : parts[0]?.[0] || '?').toUpperCase();\n return (\n <div style={baseStyle}>\n <span style={{\n color: colors.textWhite,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: fontSizes['2xl'],\n }}>{initials}</span>\n </div>\n );\n }\n\n function renderPortrait() {\n const imageSrc = politician?.photo_origin_url\n || (politician?.images && politician.images[0]?.url)\n || null;\n if (imageSrc && !imgError) {\n return (\n <img\n src={imageSrc}\n alt={`${politician.full_name} portrait`}\n style={{\n width: RADAR_SIZE,\n height: RADAR_SIZE,\n objectFit: 'cover',\n objectPosition: politician.imageFocalPoint ?? 'center 20%',\n display: 'block',\n borderRadius: borderRadius.md,\n }}\n onError={() => setImgError(true)}\n />\n );\n }\n const parts = (politician?.full_name || '').split(' ').filter(Boolean);\n const initials = (parts.length >= 2\n ? parts[0][0] + parts[parts.length - 1][0]\n : parts[0]?.[0] || '?').toUpperCase();\n return (\n <div style={{\n width: RADAR_SIZE,\n height: RADAR_SIZE,\n backgroundColor: colors.evMutedBlue,\n color: colors.textWhite,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: fontSizes['5xl'],\n borderRadius: borderRadius.md,\n }}>\n {initials}\n </div>\n );\n }\n\n function renderEmptyVariant() {\n return (\n <div style={{\n width: '100%', height: '100%', flex: 1,\n display: 'flex', flexDirection: 'column',\n alignItems: 'center', justifyContent: 'center',\n gap: '12px', padding: '20px', boxSizing: 'border-box',\n backgroundColor: colorScales.teal['050'],\n borderRadius: borderRadius.md,\n }}>\n <PlaceholderRadar size={220} name={politician?.full_name || ''} />\n <p style={{\n margin: 0, fontSize: fontSizes.sm, color: colors.textMuted,\n textAlign: 'center', lineHeight: 1.4, fontFamily: fonts.primary,\n }}>\n Calibrate your compass to see how you align with {politician?.full_name || 'this official'}\n </p>\n <button\n type=\"button\"\n onClick={onBuildCompass || undefined}\n onMouseEnter={() => setEmptyCtaHovered(true)}\n onMouseLeave={() => setEmptyCtaHovered(false)}\n style={{\n minWidth: '180px', height: '44px', padding: '0 20px',\n backgroundColor: emptyCtaHovered\n ? semanticTokens.light.buttonPrimary.background.hovered\n : semanticTokens.light.buttonPrimary.background.default,\n color: colors.textWhite,\n fontSize: fontSizes.sm, fontWeight: fontWeights.semibold,\n fontFamily: fonts.primary, borderRadius: borderRadius.full,\n border: 'none', cursor: onBuildCompass ? 'pointer' : 'default',\n transition: `background ${duration.normal} ease`,\n }}\n >\n Calibrate your compass\n </button>\n </div>\n );\n }\n\n function renderUnavailablePlate(message) {\n return (\n <div style={{\n width: '100%', height: '100%', flex: 1,\n backgroundColor: colorScales.teal['050'],\n borderRadius: borderRadius.md,\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n padding: spacing[6], boxSizing: 'border-box',\n }}>\n <p style={{\n fontSize: fontSizes.base, fontWeight: fontWeights.semibold,\n lineHeight: 1.4, color: colors.textMuted, textAlign: 'center',\n margin: 0, fontFamily: fonts.primary,\n }}>\n {message}\n </p>\n </div>\n );\n }\n\n function renderSlotContent() {\n if (view === 'portrait') return renderPortrait();\n if (variant === 'empty') return renderEmptyVariant();\n if (variant === 'administrative' || variant === 'judicial') {\n return renderUnavailablePlate('Compass currently unavailable for this role.');\n }\n if (variant === 'no-stances') {\n return renderUnavailablePlate(`No compass stances on file for ${politician?.full_name || 'this official'} yet.`);\n }\n return renderCompass();\n }\n\n return (\n <div\n role=\"article\"\n aria-label={`${politician.full_name}, ${politician.office_title || ''}`}\n tabIndex={0}\n style={cardStyle}\n onClick={onClick}\n onKeyDown={(e) => {\n if (onClick && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onClick();\n }\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n >\n {/* Meta block on top: portrait left, text/icons right.\n flexShrink: 0 so the meta never gets squeezed by the compass slot —\n long names / wrapped titles always render in full. */}\n <div style={{ padding: spacing[4], paddingBottom: spacing[3], display: 'flex', alignItems: 'stretch', gap: spacing[3], flexShrink: 0 }}>\n {renderAvatar()}\n <div style={{ display: 'flex', flexDirection: 'column', gap: spacing[1], minWidth: 0, flex: 1 }}>\n <p style={{\n fontFamily: fonts.primary, fontSize: fontSizes.xl,\n fontWeight: fontWeights.semibold, lineHeight: 1.3,\n color: colors.evMutedBlue, margin: 0,\n }}>\n {politician.full_name}\n </p>\n <p style={{\n fontFamily: fonts.primary, fontSize: fontSizes.sm,\n fontWeight: fontWeights.semibold, lineHeight: 1.4,\n color: colors.textSecondary, margin: 0,\n }}>\n {titleText || ''}\n </p>\n {politician.district_label && (\n <p style={{\n fontFamily: fonts.primary, fontSize: fontSizes.sm,\n fontWeight: fontWeights.regular, lineHeight: 1.5,\n color: colors.textMuted, margin: 0,\n overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap',\n }}>\n {politician.district_label}\n </p>\n )}\n <div style={{ marginTop: 'auto' }}>\n <IconOverlay\n ballot={politician.ballot || null}\n hasStances={false}\n branch={politician.branch || null}\n />\n </div>\n </div>\n </div>\n\n {/* Status banner — sits between meta and compass on elections surface.\n Withdrawn takes precedence over running_unopposed. */}\n {surface === 'elections' && politician.withdrawn && (\n <div style={{\n margin: `0 ${spacing[4]} ${spacing[3]}`,\n backgroundColor: 'rgba(120,0,0,0.85)',\n color: '#fff', fontSize: '12px', fontWeight: 700,\n letterSpacing: '0.4px', textAlign: 'center',\n textTransform: 'uppercase', padding: '6px 0',\n borderRadius: borderRadius.sm,\n }}>\n Withdrawn\n </div>\n )}\n {surface === 'elections' && !politician.withdrawn && politician.running_unopposed && (\n <div style={{\n margin: `0 ${spacing[4]} ${spacing[3]}`,\n backgroundColor: 'rgba(0,0,0,0.75)',\n color: '#fff', fontSize: '12px', fontWeight: 700,\n letterSpacing: '0.4px', textAlign: 'center',\n textTransform: 'uppercase', padding: '6px 0',\n borderRadius: borderRadius.sm,\n }}>\n {typeof politician.running_unopposed === 'string' ? politician.running_unopposed : 'Running Unopposed'}\n </div>\n )}\n\n {/* Compass slot */}\n <div style={{\n flex: 1,\n padding: spacing[4],\n paddingTop: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n minHeight: 0,\n }}>\n {renderSlotContent()}\n </div>\n </div>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius } from './tokens';\nimport { evContext } from './evContext.js';\n\n/**\n * CompassKey — small page-level legend that decodes the radar's colors.\n *\n * Renders an expanded legend strip by default. The user can dismiss it via the\n * × button; the dismissed flag persists to the cross-subdomain ev-context, so\n * once they dismiss it on essentials they won't see it again on compass /\n * read-rank / etc. either. After dismiss it collapses to a small \"?\" pill that\n * re-expands on click.\n *\n * Drop one anywhere above the cards section. Render-cost is trivial; legend\n * isn't tied to a specific card.\n */\nexport default function CompassKey({ compact = false } = {}) {\n const [dismissed, setDismissed] = useState(false);\n const [loaded, setLoaded] = useState(false);\n\n useEffect(() => {\n let cancelled = false;\n evContext.get().then((shared) => {\n if (cancelled) return;\n setDismissed(Boolean(shared?.compassKeyDismissed));\n setLoaded(true);\n }).catch(() => { if (!cancelled) setLoaded(true); });\n return () => { cancelled = true; };\n }, []);\n\n function persistDismissed(value) {\n evContext.get().then((current) => {\n const next = { ...(current || {}), compassKeyDismissed: value };\n evContext.set(next).catch(() => {});\n }).catch(() => {});\n }\n\n function handleDismiss() {\n setDismissed(true);\n persistDismissed(true);\n }\n\n function handleReopen() {\n setDismissed(false);\n persistDismissed(false);\n }\n\n if (!loaded) return null;\n\n const Swatch = ({ color, label, ring }) => (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: spacing[1] }}>\n <span style={{\n display: 'inline-block', width: 12, height: 12, borderRadius: '50%',\n background: color, border: `2px solid ${ring || '#fff'}`,\n boxShadow: '0 0 0 1px rgba(0,0,0,0.08)',\n }} />\n <span style={{ fontSize: fontSizes.xs, color: colors.textSecondary, fontFamily: fonts.primary }}>\n {label}\n </span>\n </span>\n );\n\n if (dismissed) {\n return (\n <button\n type=\"button\"\n onClick={handleReopen}\n aria-label=\"Show compass legend\"\n style={{\n display: 'inline-flex', alignItems: 'center', gap: spacing[1],\n padding: '4px 10px', borderRadius: borderRadius.full,\n background: 'transparent', border: `1px solid ${colors.borderLight}`,\n color: colors.textMuted, fontFamily: fonts.primary,\n fontSize: fontSizes.xs, fontWeight: fontWeights.semibold,\n cursor: 'pointer',\n }}\n >\n <span aria-hidden=\"true\">?</span> Compass key\n </button>\n );\n }\n\n return (\n <div\n role=\"region\"\n aria-label=\"Compass legend\"\n style={{\n display: 'inline-flex', alignItems: 'center',\n flexWrap: 'wrap',\n gap: compact ? spacing[2] : spacing[3],\n padding: compact ? `${spacing[1]} ${spacing[2]}` : `${spacing[2]} ${spacing[3]}`,\n background: '#fff', border: `1px solid ${colors.borderLight}`,\n borderRadius: borderRadius.md, fontFamily: fonts.primary,\n maxWidth: '100%', boxSizing: 'border-box',\n }}\n >\n {!compact && (\n <span style={{\n fontSize: fontSizes.xs, fontWeight: fontWeights.semibold,\n color: colors.textMuted, textTransform: 'uppercase', letterSpacing: '0.5px',\n }}>\n Compass key\n </span>\n )}\n <Swatch color=\"#7C6B9E\" label=\"You\" />\n <Swatch color=\"#5A9A6E\" label=\"Politician\" />\n <Swatch color=\"#fed12e\" label=\"Match\" />\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: spacing[1] }}>\n <span style={{\n fontSize: fontSizes.xs, fontWeight: fontWeights.semibold,\n color: '#9ca3af', fontFamily: fonts.primary,\n textDecoration: 'underline', textDecorationStyle: 'dashed',\n textUnderlineOffset: '3px',\n }}>\n Topic\n </span>\n <span style={{ fontSize: fontSizes.xs, color: colors.textSecondary, fontFamily: fonts.primary }}>\n = no stance\n </span>\n </span>\n <button\n type=\"button\"\n onClick={handleDismiss}\n aria-label=\"Hide compass legend\"\n style={{\n marginLeft: spacing[2], padding: '2px 6px', border: 'none',\n background: 'transparent', color: colors.textMuted,\n fontSize: '16px', lineHeight: 1, cursor: 'pointer',\n }}\n >\n ×\n </button>\n </div>\n );\n}\n","/**\n * evContext — cross-subdomain shared client state for EV apps.\n *\n * Mounts a hidden iframe pointing at the ev-context broker (origin:\n * https://context.empowered.vote in prod, configurable in dev).\n * The broker owns the canonical localStorage on its own origin and bridges\n * read/write/subscribe over postMessage. Every EV subdomain\n * (compass.*, essentials.*, readrank.*, etc.) sees the same data, regardless\n * of which one the user lands on first.\n *\n * Schemaless — store anything serializable. By convention EV apps namespace\n * their data under top-level keys (compass, address, verdicts, etc.).\n *\n * Usage:\n * import { evContext } from '@empoweredvote/ev-ui';\n * evContext.configure({ brokerUrl: 'https://context.empowered.vote' });\n * const state = await evContext.get();\n * await evContext.set({ ...state, address: '123 Main St' });\n * const unsubscribe = evContext.subscribe(state => console.log('updated', state));\n */\n\nconst DEFAULT_BROKER_URL = 'https://ev-context.empowered.vote/';\n\nlet brokerUrl = DEFAULT_BROKER_URL;\nlet iframe = null;\nlet readyPromise = null;\nlet pendingRequests = new Map(); // requestId -> { resolve, reject, timeout }\nlet subscribers = new Set();\nlet lastValue = null;\nlet nextRequestId = 1;\n\nfunction brokerOrigin() {\n try { return new URL(brokerUrl).origin; } catch { return ''; }\n}\n\nfunction ensureMounted() {\n if (typeof window === 'undefined' || typeof document === 'undefined') return null;\n if (iframe) return iframe;\n\n iframe = document.createElement('iframe');\n iframe.src = brokerUrl;\n iframe.setAttribute('aria-hidden', 'true');\n iframe.setAttribute('tabindex', '-1');\n iframe.style.position = 'absolute';\n iframe.style.width = '1px';\n iframe.style.height = '1px';\n iframe.style.border = '0';\n iframe.style.opacity = '0';\n iframe.style.pointerEvents = 'none';\n iframe.style.top = '-9999px';\n iframe.style.left = '-9999px';\n\n window.addEventListener('message', onMessage);\n (document.body || document.documentElement).appendChild(iframe);\n\n readyPromise = new Promise((resolve) => {\n const onReady = (e) => {\n if (e.origin !== brokerOrigin()) return;\n if (!e.data || e.data.type !== 'ev-context:ready') return;\n window.removeEventListener('message', onReady);\n resolve();\n };\n window.addEventListener('message', onReady);\n\n iframe.addEventListener('load', () => {\n setTimeout(() => resolve(), 50);\n });\n });\n\n return iframe;\n}\n\nfunction onMessage(event) {\n if (event.origin !== brokerOrigin()) return;\n const data = event.data;\n if (!data || typeof data !== 'object') return;\n\n if (data.type === 'ev-context:value' || data.type === 'ev-context:ack') {\n const id = data.requestId;\n const wasPending = id && pendingRequests.has(id);\n if (wasPending) {\n const { resolve, timeout } = pendingRequests.get(id);\n clearTimeout(timeout);\n pendingRequests.delete(id);\n resolve(data.type === 'ev-context:value' ? (data.value ?? null) : data.ok);\n }\n // Only notify subscribers for unsolicited value broadcasts, not replies to our own get()\n if (data.type === 'ev-context:value' && !wasPending) {\n lastValue = data.value ?? null;\n notifySubscribers();\n }\n } else if (data.type === 'ev-context:update') {\n lastValue = data.value ?? null;\n notifySubscribers();\n }\n}\n\nfunction notifySubscribers() {\n for (const fn of subscribers) {\n try { fn(lastValue); } catch { /* swallow subscriber errors */ }\n }\n}\n\nfunction send(message, { expectReply = true, timeoutMs = 4000 } = {}) {\n ensureMounted();\n return readyPromise.then(() => new Promise((resolve, reject) => {\n if (!iframe || !iframe.contentWindow) {\n reject(new Error('evContext broker iframe not ready'));\n return;\n }\n const requestId = expectReply ? `req-${nextRequestId++}` : undefined;\n if (expectReply) {\n const timeout = setTimeout(() => {\n pendingRequests.delete(requestId);\n reject(new Error('evContext request timed out'));\n }, timeoutMs);\n pendingRequests.set(requestId, { resolve, reject, timeout });\n }\n try {\n iframe.contentWindow.postMessage({ ...message, requestId }, brokerOrigin());\n if (!expectReply) resolve(true);\n } catch (err) {\n if (expectReply) {\n const entry = pendingRequests.get(requestId);\n if (entry) { clearTimeout(entry.timeout); pendingRequests.delete(requestId); }\n }\n reject(err);\n }\n }));\n}\n\nexport const evContext = {\n /**\n * Override the broker URL. Call once at app startup before any get/set.\n * Defaults to https://ev-context.empowered.vote/ for prod.\n */\n configure({ brokerUrl: url } = {}) {\n if (url) brokerUrl = url;\n },\n\n /** Mount the iframe immediately (optional — get/set will mount lazily). */\n preload() {\n ensureMounted();\n return readyPromise;\n },\n\n /** Read the current shared context. Resolves to the stored value or null. */\n async get() {\n return send({ type: 'ev-context:get' });\n },\n\n /** Overwrite the shared context. */\n async set(value) {\n return send({ type: 'ev-context:set', value });\n },\n\n /** Clear the shared context. */\n async clear() {\n return send({ type: 'ev-context:clear' });\n },\n\n /**\n * Read the userId-stamped authed slice for the given user.\n *\n * Stored shape:\n * { compass?, address?, verdicts?, authed?: { userId, compass?, address?, verdicts? } }\n *\n * - Returns null if there is no stored value, no `authed` body, or the stored\n * `authed.userId` does not match the requested `userId` (mismatch = inert).\n * - Otherwise returns `{ compass, address, verdicts }` with undefined keys\n * omitted.\n *\n * Used by logged-in consumers to do SWR-style hydration: render this slice\n * synchronously on mount, then replace silently when the API responds.\n */\n async getAuthedSlice(userId) {\n if (!userId) return null;\n const current = await this.get();\n if (!current || !current.authed || typeof current.authed !== 'object') return null;\n if (current.authed.userId !== userId) return null;\n const out = {};\n if (current.authed.compass !== undefined) out.compass = current.authed.compass;\n if (current.authed.address !== undefined) out.address = current.authed.address;\n if (current.authed.verdicts !== undefined) out.verdicts = current.authed.verdicts;\n if (current.authed.promotionDismissed !== undefined) {\n out.promotionDismissed = current.authed.promotionDismissed;\n }\n return out;\n },\n\n /**\n * Mirror an authed write into the userId-stamped `authed` slice.\n *\n * - `patch` may contain any subset of `{ compass, address, verdicts }`.\n * Unrecognized keys are dropped.\n * - If the existing `authed.userId` matches `userId`, the patch is merged\n * with the prior authed body (per-domain shallow merge — the patch's\n * compass/address/verdicts replace the prior values).\n * - If it does not match (user switch), the prior authed body is stomped.\n * - Guest top-level keys (compass, address, verdicts at the root) are\n * preserved untouched.\n *\n * Returns false on falsy `userId` or empty patch; otherwise returns the\n * underlying `set()` result.\n */\n async setAuthedSlice(userId, patch) {\n if (!userId) return false;\n if (!patch || typeof patch !== 'object') return false;\n const allowed = {};\n if (patch.compass !== undefined) allowed.compass = patch.compass;\n if (patch.address !== undefined) allowed.address = patch.address;\n if (patch.verdicts !== undefined) allowed.verdicts = patch.verdicts;\n // 260426-mw6: promotionDismissed is a per-userId per-domain dismissal stamp\n // used by useEvContextPromotion. Allowed alongside the mirror keys so the\n // hook can write through the same helper. Patch values are deep-merged\n // into the prior promotionDismissed map (per-domain replace).\n if (patch.promotionDismissed !== undefined) {\n allowed.promotionDismissed = patch.promotionDismissed;\n }\n if (Object.keys(allowed).length === 0) return false;\n\n const current = (await this.get()) || {};\n const priorAuthed = current.authed && current.authed.userId === userId\n ? current.authed\n : null;\n const nextAuthed = { userId };\n if (priorAuthed) {\n if (priorAuthed.compass !== undefined) nextAuthed.compass = priorAuthed.compass;\n if (priorAuthed.address !== undefined) nextAuthed.address = priorAuthed.address;\n if (priorAuthed.verdicts !== undefined) nextAuthed.verdicts = priorAuthed.verdicts;\n if (priorAuthed.promotionDismissed !== undefined) {\n nextAuthed.promotionDismissed = priorAuthed.promotionDismissed;\n }\n }\n if (allowed.compass !== undefined) nextAuthed.compass = allowed.compass;\n if (allowed.address !== undefined) nextAuthed.address = allowed.address;\n if (allowed.verdicts !== undefined) nextAuthed.verdicts = allowed.verdicts;\n // promotionDismissed: deep-merge per-domain so writing { compass: true }\n // does not clobber an earlier { address: true } stamp.\n if (allowed.promotionDismissed !== undefined && allowed.promotionDismissed !== null\n && typeof allowed.promotionDismissed === 'object') {\n const prior = (priorAuthed && priorAuthed.promotionDismissed && typeof priorAuthed.promotionDismissed === 'object')\n ? priorAuthed.promotionDismissed\n : {};\n nextAuthed.promotionDismissed = { ...prior, ...allowed.promotionDismissed };\n }\n\n return this.set({ ...current, authed: nextAuthed });\n },\n\n /**\n * Remove the `authed` slice entirely (preserving guest top-level keys).\n *\n * Provided for completeness — consumers in the v2026.4.5 wiring plan must\n * NOT call this on logout. The slice is intended to go inert via userId\n * mismatch, so a re-login as the same user can rehydrate from cache.\n */\n async clearAuthedSlice() {\n const current = await this.get();\n if (!current || typeof current !== 'object') return true;\n if (!('authed' in current)) return true;\n const { authed: _omit, ...rest } = current;\n return this.set(rest);\n },\n\n /**\n * Subscribe to live updates. Fires when this tab or any other tab\n * (any subdomain) writes to the store. Returns an unsubscribe function.\n */\n subscribe(fn) {\n subscribers.add(fn);\n send({ type: 'ev-context:subscribe' }).then((value) => {\n lastValue = value ?? lastValue;\n try { fn(lastValue); } catch {}\n }).catch(() => {});\n return () => { subscribers.delete(fn); };\n },\n};\n","import React, { useState } from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius, tierColors } from './tokens';\n\n/**\n * CategorySection component for grouping politicians by category\n *\n * @param {Object} props\n * @param {string} props.title - Category title (e.g., \"Mayor\", \"Council\")\n * @param {string} props.infoTooltip - Tooltip text for info icon\n * @param {string} [props.websiteUrl] - Optional URL for external website link\n * @param {React.ReactNode} props.children - Card grid content\n * @param {Object} props.style - Additional styles\n */\nexport default function CategorySection({\n title,\n infoTooltip,\n websiteUrl,\n children,\n style = {},\n tier,\n}) {\n const [showTooltip, setShowTooltip] = useState(false);\n\n const tierStyle = tier ? tierColors[tier] : null;\n\n const styles = {\n section: {\n marginBottom: spacing[8],\n ...style,\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n gap: spacing[2],\n marginBottom: spacing[4],\n },\n titlePill: {\n display: 'inline-flex',\n alignItems: 'center',\n padding: `${spacing[2]} ${spacing[4]}`,\n backgroundColor: colors.bgWhite,\n border: `1px solid ${tierStyle?.accent ?? colors.borderMedium}`,\n borderRadius: borderRadius.lg,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.base,\n color: tierStyle?.text ?? colors.textPrimary,\n },\n infoButton: {\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n border: `1px solid ${colors.borderMedium}`,\n backgroundColor: colors.bgWhite,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontFamily: fonts.primary,\n fontSize: fontSizes.xs,\n color: colors.textMuted,\n position: 'relative',\n },\n tooltip: {\n position: 'absolute',\n top: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginTop: spacing[2],\n padding: `${spacing[2]} ${spacing[3]}`,\n backgroundColor: colors.textPrimary,\n color: colors.textWhite,\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n borderRadius: borderRadius.md,\n whiteSpace: 'nowrap',\n zIndex: 100,\n },\n externalLink: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: colors.textMuted,\n textDecoration: 'none',\n },\n grid: {\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(min(250px, 100%), 1fr))',\n gap: spacing[4],\n },\n };\n\n return (\n <section style={styles.section} className=\"ev-category-section\">\n <div style={styles.header}>\n <span style={styles.titlePill}>{title}</span>\n {infoTooltip && (\n <button\n type=\"button\"\n style={styles.infoButton}\n onMouseEnter={() => setShowTooltip(true)}\n onMouseLeave={() => setShowTooltip(false)}\n onFocus={() => setShowTooltip(true)}\n onBlur={() => setShowTooltip(false)}\n aria-label={`Info about ${title}`}\n >\n i\n {showTooltip && (\n <div style={styles.tooltip} role=\"tooltip\">\n {infoTooltip}\n </div>\n )}\n </button>\n )}\n {websiteUrl && (\n <a\n href={websiteUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={styles.externalLink}\n aria-label={`Visit official website for ${title}`}\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ width: '14px', height: '14px' }}\n >\n <path\n d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </a>\n )}\n </div>\n <div style={styles.grid} className=\"ev-category-grid\">\n {children}\n </div>\n </section>\n );\n}\n","import React from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing } from './tokens';\n\n/**\n * SubGroupSection — a sub-group label + card grid inside a GovernmentBodySection.\n *\n * @param {Object} props\n * @param {string} props.title - Sub-group label (e.g., \"Bloomington Common Council\")\n * @param {string} [props.websiteUrl] - Optional inline link after label\n * @param {React.ReactNode} props.children - PoliticianCard components\n */\nexport default function SubGroupSection({ title, websiteUrl, children, gridTemplateColumns, gap, justifyContent }) {\n const styles = {\n section: {\n marginBottom: spacing[4],\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n gap: spacing[2],\n marginBottom: spacing[2],\n },\n label: {\n fontSize: fontSizes.xs,\n fontWeight: fontWeights.semibold,\n textTransform: 'uppercase',\n letterSpacing: '0.8px',\n color: colors.textMuted,\n fontFamily: fonts.primary,\n },\n link: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: colors.textMuted,\n textDecoration: 'none',\n },\n grid: {\n display: 'grid',\n gridTemplateColumns: gridTemplateColumns || 'repeat(auto-fill, minmax(min(250px, 100%), 1fr))',\n gap: gap || spacing[2],\n justifyContent: justifyContent || undefined,\n width: '100%',\n },\n };\n\n return (\n <div style={styles.section}>\n {title && (\n <div style={styles.header}>\n <span style={styles.label}>{title}</span>\n {websiteUrl && (\n <a\n href={websiteUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={styles.link}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={{ width: '12px', height: '12px' }}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M2 12h20M12 2a15.3 15.3 0 014 10 15.3 15.3 0 01-4 10 15.3 15.3 0 01-4-10 15.3 15.3 0 014-10z\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n </a>\n )}\n </div>\n )}\n <div style={styles.grid} className=\"ev-subgroup-grid\">\n {children}\n </div>\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, tierColors } from './tokens';\n\n/**\n * GovernmentBodySection — collapsible accordion for a government body.\n *\n * @param {Object} props\n * @param {string} props.title - Accordion header (e.g., \"City of Bloomington\")\n * @param {string} [props.websiteUrl] - Top-level website link at far right\n * @param {string} [props.tier] - \"local\" | \"state\" | \"federal\"\n * @param {boolean} [props.defaultExpanded=true] - Initial expand state\n * @param {React.ReactNode} props.children - SubGroupSection components\n */\nexport default function GovernmentBodySection({\n title,\n websiteUrl,\n tier,\n defaultExpanded = true,\n children,\n}) {\n const [expanded, setExpanded] = useState(defaultExpanded);\n\n const tierStyle = tier ? tierColors[tier] : null;\n const accentColor = tierStyle?.accent ?? colors.borderMedium;\n\n const styles = {\n section: {\n marginBottom: spacing[5],\n borderLeft: `3px solid ${accentColor}`,\n paddingLeft: spacing[4],\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n gap: spacing[2],\n marginBottom: expanded ? spacing[3] : 0,\n cursor: 'pointer',\n userSelect: 'none',\n },\n title: {\n fontSize: fontSizes.base,\n fontWeight: fontWeights.bold,\n color: colors.textPrimary,\n fontFamily: fonts.primary,\n },\n toggle: {\n fontSize: fontSizes.xs,\n color: colors.textMuted,\n transition: 'transform 0.2s',\n transform: expanded ? 'rotate(0deg)' : 'rotate(-90deg)',\n },\n link: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: colors.textMuted,\n textDecoration: 'none',\n },\n content: {\n display: expanded ? 'block' : 'none',\n },\n };\n\n return (\n <section style={styles.section} className=\"ev-gov-body-section\">\n <div\n style={styles.header}\n onClick={() => setExpanded((prev) => !prev)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setExpanded((prev) => !prev);\n }\n }}\n aria-expanded={expanded}\n aria-label={`${expanded ? 'Collapse' : 'Expand'} ${title}`}\n >\n <span style={styles.title}>{title}</span>\n {websiteUrl && (\n <a\n href={websiteUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={styles.link}\n onClick={(e) => e.stopPropagation()}\n aria-label={`Visit ${title} website`}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={{ width: '14px', height: '14px' }}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M2 12h20M12 2a15.3 15.3 0 014 10 15.3 15.3 0 01-4 10 15.3 15.3 0 01-4-10 15.3 15.3 0 014-10z\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n </a>\n )}\n <span style={styles.toggle} aria-hidden=\"true\">▼</span>\n </div>\n <div style={styles.content}>\n {children}\n </div>\n </section>\n );\n}\n","import React from 'react';\nimport { colors, spacing } from './tokens';\n\n// Platform detection patterns (duplicated from PoliticianProfile for standalone use)\nconst SOCIAL_PLATFORMS = [\n { test: /facebook\\.com/i, platform: 'facebook' },\n { test: /twitter\\.com|x\\.com/i, platform: 'twitter' },\n { test: /instagram\\.com/i, platform: 'instagram' },\n { test: /linkedin\\.com/i, platform: 'linkedin' },\n { test: /youtube\\.com|youtu\\.be/i, platform: 'youtube' },\n];\n\n/**\n * SocialLinks component for displaying politician social media links\n *\n * @param {Object} props\n * @param {string} props.website - Website URL\n * @param {string} props.twitter - Twitter/X handle or URL\n * @param {string} props.facebook - Facebook handle or URL\n * @param {string} props.instagram - Instagram handle or URL\n * @param {string} props.linkedin - LinkedIn URL or handle\n * @param {string[]} props.extraLinks - Additional social platform URLs detected from websites list\n * @param {'sm' | 'md' | 'lg'} props.size - Icon size\n * @param {Object} props.style - Additional styles\n */\nexport default function SocialLinks({\n website,\n twitter,\n facebook,\n instagram,\n linkedin,\n extraLinks = [],\n size = 'md',\n darkMode = false,\n style = {},\n}) {\n const iconSizes = {\n sm: '16px',\n md: '18px',\n lg: '20px',\n };\n\n const boxSizes = {\n sm: '32px',\n md: '36px',\n lg: '40px',\n };\n\n const iconSize = iconSizes[size];\n const boxSize = boxSizes[size];\n\n const styles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n gap: spacing[2],\n flexWrap: 'wrap',\n ...style,\n },\n link: {\n color: darkMode ? '#9ca3af' : '#6A7282',\n transition: 'color 0.2s ease, border-color 0.2s ease',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: boxSize,\n height: boxSize,\n border: `1px solid ${darkMode ? 'rgba(255,255,255,0.15)' : '#E5E7EB'}`,\n borderRadius: '10px',\n },\n icon: {\n width: iconSize,\n height: iconSize,\n },\n };\n\n // Helper to format URLs\n const formatUrl = (value, platform) => {\n if (!value) return null;\n if (value.startsWith('http')) return value;\n\n switch (platform) {\n case 'twitter':\n return `https://twitter.com/${value.replace('@', '')}`;\n case 'facebook':\n return `https://facebook.com/${value}`;\n case 'instagram':\n return `https://instagram.com/${value.replace('@', '')}`;\n case 'linkedin':\n return `https://linkedin.com/in/${value}`;\n default:\n return value;\n }\n };\n\n const platformIconMap = {\n twitter: (\n <svg style={styles.icon} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M4 4L10.5 12.5M20 20L13.5 11.5M10.5 12.5L4 20H8L13.5 11.5M10.5 12.5L16 4H20L13.5 11.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ),\n facebook: (\n <svg style={styles.icon} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M18 2H15C13.6739 2 12.4021 2.52678 11.4645 3.46447C10.5268 4.40215 10 5.67392 10 7V10H7V14H10V22H14V14H17L18 10H14V7C14 6.73478 14.1054 6.48043 14.2929 6.29289C14.4804 6.10536 14.7348 6 15 6H18V2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ),\n instagram: (\n <svg style={styles.icon} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"5\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <circle cx=\"12\" cy=\"12\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <circle cx=\"18\" cy=\"6\" r=\"1\" fill=\"currentColor\" />\n </svg>\n ),\n linkedin: (\n <svg style={styles.icon} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M16 8C17.5913 8 19.1174 8.63214 20.2426 9.75736C21.3679 10.8826 22 12.4087 22 14V21H18V14C18 13.4696 17.7893 12.9609 17.4142 12.5858C17.0391 12.2107 16.5304 12 16 12C15.4696 12 14.9609 12.2107 14.5858 12.5858C14.2107 12.9609 14 13.4696 14 14V21H10V14C10 12.4087 10.6321 10.8826 11.7574 9.75736C12.8826 8.63214 14.4087 8 16 8Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <rect x=\"2\" y=\"9\" width=\"4\" height=\"12\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <circle cx=\"4\" cy=\"4\" r=\"2\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n youtube: (\n <svg style={styles.icon} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2\" y=\"5\" width=\"20\" height=\"14\" rx=\"3\" stroke=\"currentColor\" strokeWidth=\"2\"/>\n <polygon points=\"10,9 16,12 10,15\" fill=\"currentColor\"/>\n </svg>\n ),\n };\n\n const links = [\n {\n href: formatUrl(twitter, 'twitter'),\n label: 'X (Twitter)',\n icon: platformIconMap.twitter,\n },\n {\n href: formatUrl(facebook, 'facebook'),\n label: 'Facebook',\n icon: platformIconMap.facebook,\n },\n {\n href: formatUrl(instagram, 'instagram'),\n label: 'Instagram',\n icon: platformIconMap.instagram,\n },\n {\n href: formatUrl(linkedin, 'linkedin'),\n label: 'LinkedIn',\n icon: platformIconMap.linkedin,\n },\n {\n href: website,\n label: 'Website',\n icon: (\n <svg style={styles.icon} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path\n d=\"M2 12H22M12 2C14.5 4.5 16 8 16 12C16 16 14.5 19.5 12 22C9.5 19.5 8 16 8 12C8 8 9.5 4.5 12 2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ),\n },\n ].filter((link) => link.href);\n\n // Append extraLinks mapped to platform icons, skipping duplicates\n extraLinks.forEach((url) => {\n const detected = SOCIAL_PLATFORMS.find(({ test }) => test.test(url));\n if (detected && platformIconMap[detected.platform]) {\n const alreadyPresent = links.some(\n (l) => l.href === url || (l.href && l.href.includes(detected.platform))\n );\n if (!alreadyPresent) {\n links.push({\n href: url,\n label: detected.platform.charAt(0).toUpperCase() + detected.platform.slice(1),\n icon: platformIconMap[detected.platform],\n });\n }\n }\n });\n\n if (links.length === 0) {\n return null;\n }\n\n return (\n <div style={styles.container} className=\"ev-social-links\">\n {links.map((link) => (\n <a\n key={link.label}\n href={link.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={styles.link}\n aria-label={link.label}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = colors.evTeal;\n e.currentTarget.style.borderColor = colors.evTeal;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = darkMode ? '#9ca3af' : '#6A7282';\n e.currentTarget.style.borderColor = darkMode ? 'rgba(255,255,255,0.15)' : '#E5E7EB';\n }}\n >\n {link.icon}\n </a>\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius } from './tokens';\n\n/**\n * IssueTags component for displaying topic/issue tags\n *\n * @param {Object} props\n * @param {Array} props.tags - Tag items [{label, value}]\n * @param {Array} props.selectedTags - Selected tag values (for selectable variant)\n * @param {Function} props.onTagClick - Handler for tag clicks\n * @param {'default' | 'selectable'} props.variant - Tag interaction variant\n * @param {Object} props.style - Additional styles\n */\nexport default function IssueTags({\n tags = [],\n selectedTags = [],\n onTagClick,\n variant = 'default',\n style = {},\n}) {\n const isSelectable = variant === 'selectable';\n\n const styles = {\n container: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: spacing[2],\n ...style,\n },\n tag: (isSelected) => ({\n display: 'inline-flex',\n alignItems: 'center',\n padding: `${spacing[2]} ${spacing[4]}`,\n borderRadius: borderRadius.full,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.sm,\n border: `1px solid ${isSelected ? colors.evTeal : colors.borderMedium}`,\n backgroundColor: isSelected ? colors.evTeal : colors.bgWhite,\n color: isSelected ? colors.textWhite : colors.textPrimary,\n cursor: onTagClick ? 'pointer' : 'default',\n transition: 'all 0.2s ease',\n userSelect: 'none',\n }),\n };\n\n const handleTagClick = (tag) => {\n if (onTagClick) {\n onTagClick(tag.value);\n }\n };\n\n const handleKeyDown = (e, tag) => {\n if (onTagClick && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onTagClick(tag.value);\n }\n };\n\n return (\n <div style={styles.container} className=\"ev-issue-tags\" role=\"list\">\n {tags.map((tag) => {\n const isSelected = selectedTags.includes(tag.value);\n return (\n <span\n key={tag.value}\n style={styles.tag(isSelected)}\n onClick={() => handleTagClick(tag)}\n onKeyDown={(e) => handleKeyDown(e, tag)}\n onMouseEnter={(e) => {\n if (onTagClick && !isSelected) {\n e.currentTarget.style.borderColor = colors.evTeal;\n e.currentTarget.style.color = colors.evTeal;\n }\n }}\n onMouseLeave={(e) => {\n if (onTagClick && !isSelected) {\n e.currentTarget.style.borderColor = colors.borderMedium;\n e.currentTarget.style.color = colors.textPrimary;\n }\n }}\n role=\"listitem\"\n tabIndex={onTagClick ? 0 : undefined}\n aria-pressed={isSelectable ? isSelected : undefined}\n >\n {tag.label}\n </span>\n );\n })}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { fonts, fontWeights, spacing } from './tokens';\n\nconst ROLE_ORDER = {\n 'chair': 0,\n 'co-chair': 1,\n 'vice chair': 2,\n 'vice-chair': 2,\n 'ranking member': 3,\n 'member': 4,\n};\n\nfunction getRoleRank(position) {\n if (!position) return 99;\n const lower = formatPosition(position).toLowerCase();\n for (const [key, rank] of Object.entries(ROLE_ORDER)) {\n if (lower.includes(key)) return rank;\n }\n return 99;\n}\n\n/** Convert snake_case/kebab-case position to Title Case (e.g. \"ranking_member\" → \"Ranking Member\") */\nfunction formatPosition(position) {\n if (!position) return '';\n return position\n .replace(/[_-]/g, ' ')\n .replace(/\\b\\w/g, c => c.toUpperCase())\n .trim();\n}\n\n/**\n * CommitteeTable component for displaying committee memberships\n *\n * @param {Object} props\n * @param {Array} props.committees - Committee items [{name, position, url?}]\n * @param {string} props.title - Table title (default: \"Committee Memberships\")\n * @param {number} props.maxVisible - Max rows to show before \"Show all\" (default: 6)\n * @param {Object} props.style - Additional styles\n */\nexport default function CommitteeTable({\n committees = [],\n title = 'Committee Memberships',\n maxVisible = 6,\n style = {},\n}) {\n const [showAll, setShowAll] = useState(false);\n\n if (committees.length === 0) {\n return null;\n }\n\n // Sort: chairs first, then vice chairs, then ranking members, then members\n const sorted = [...committees].sort((a, b) => getRoleRank(a.position) - getRoleRank(b.position));\n const visible = showAll ? sorted : sorted.slice(0, maxVisible);\n const hasMore = sorted.length > maxVisible;\n\n const styles = {\n container: {\n ...style,\n },\n heading: {\n display: 'flex',\n alignItems: 'center',\n gap: spacing[2],\n fontFamily: fonts.primary,\n fontWeight: fontWeights.semibold,\n fontSize: '18px',\n color: '#101828',\n margin: 0,\n marginBottom: spacing[3],\n },\n table: {\n width: '100%',\n borderCollapse: 'collapse',\n },\n row: {\n borderBottom: '1px solid #F3F4F6',\n },\n cell: {\n padding: `${spacing[2]} 0`,\n fontFamily: fonts.primary,\n fontSize: '14px',\n verticalAlign: 'top',\n },\n nameCell: {\n color: '#364153',\n paddingRight: spacing[4],\n },\n positionCell: {\n color: '#6A7282',\n textAlign: 'right',\n whiteSpace: 'nowrap',\n },\n link: {\n color: '#364153',\n textDecoration: 'none',\n },\n toggle: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: spacing[1],\n fontFamily: fonts.primary,\n fontSize: '14px',\n fontWeight: fontWeights.medium,\n color: '#6A7282',\n background: 'none',\n border: 'none',\n padding: `${spacing[2]} 0`,\n cursor: 'pointer',\n },\n };\n\n return (\n <div style={styles.container} className=\"ev-committee-table\">\n <h4 style={styles.heading}>\n {/* Users icon */}\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2\" />\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\n <path d=\"M23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75\" />\n </svg>\n {title}\n </h4>\n <table style={styles.table}>\n <tbody>\n {visible.map((committee, index) => (\n <tr key={index} style={styles.row}>\n <td style={{ ...styles.cell, ...styles.nameCell }}>\n {committee.url ? (\n <a\n href={committee.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={styles.link}\n onMouseEnter={(e) => {\n e.currentTarget.style.textDecoration = 'underline';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.textDecoration = 'none';\n }}\n >\n {committee.name}\n </a>\n ) : (\n committee.name\n )}\n </td>\n <td style={{ ...styles.cell, ...styles.positionCell }}>\n {formatPosition(committee.position)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n {hasMore && (\n <button\n type=\"button\"\n style={styles.toggle}\n onClick={() => setShowAll(!showAll)}\n >\n {showAll ? 'Show less' : `Show all ${sorted.length} committees`}\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ transform: showAll ? 'rotate(180deg)' : 'none', transition: 'transform 0.2s' }}\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n )}\n </div>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius, shadows } from './tokens';\nimport useMediaQuery from './useMediaQuery';\nimport SocialLinks from './SocialLinks.jsx';\nimport CommitteeTable from './CommitteeTable.jsx';\nimport LegislativeInlineSummary from './LegislativeInlineSummary.jsx';\nimport JudicialScorecard from './JudicialScorecard.jsx';\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\nfunction formatTermDate(dateStr, precision) {\n if (!dateStr) return null;\n if (precision === 'year') {\n const year = parseInt(dateStr, 10);\n if (!isNaN(year) && year > 1900 && year < 2100) return String(year);\n }\n const d = new Date(dateStr);\n if (isNaN(d.getTime())) return null;\n return d.toLocaleDateString('en-US', { month: 'short', year: 'numeric' });\n}\n\nfunction getTermLine(pol) {\n const precision = pol.term_date_precision;\n const start = formatTermDate(pol.term_start, precision);\n if (!start) return null;\n const end = formatTermDate(pol.term_end, precision);\n if (!end) return `Since ${start}`;\n return `${start} \\u2013 ${end}`;\n}\n\nfunction stripRetain(s) {\n return (s || '').replace(/\\s*\\(Retain\\s+.+?\\?\\)/, '');\n}\n\nfunction qualifyLocalTitle(baseTitle, pol) {\n if (!baseTitle) return baseTitle;\n const dt = pol.district_type || '';\n if (!dt.startsWith('LOCAL') && dt !== 'COUNTY') return baseTitle;\n // Use government_name if set; fall back to representing_city for loaders that\n // don't create a chamber→government record (e.g. Utah at-large city councils).\n const govRaw = pol.government_name || pol.representing_city || '';\n if (!govRaw) return baseTitle;\n const gov = govRaw.split(',')[0].trim();\n const govCore = gov.replace(/^City of\\s+/i, '').replace(/\\s+County$/i, '').trim();\n if (govCore && baseTitle.toLowerCase().includes(govCore.toLowerCase())) return baseTitle;\n let prefix = dt === 'COUNTY' ? gov : gov.replace(/^City of\\s+/i, '');\n if (prefix.endsWith('County') && baseTitle.startsWith('County'))\n prefix = prefix.replace(/\\s+County$/, '');\n return `${prefix} ${baseTitle}`;\n}\n\n/**\n * Derive a card subtitle from the seat designation embedded in the office title,\n * scoped to local offices. Returns \"Ward N\" | \"District N\" | \"At-Large\" | null.\n * Keeps each jurisdiction's own term (e.g. SLC councils say \"Ward\", Ogden says\n * \"District\") rather than normalizing, and surfaces at-large seats that carry the\n * marker in their title (e.g. \"Council At-Large Seat A\") regardless of district_id.\n */\nfunction deriveSeatSubtitle(pol, cleanTitle) {\n const dt = pol.district_type || '';\n if (!dt.startsWith('LOCAL') && dt !== 'COUNTY') return null;\n const t = cleanTitle || '';\n if (/\\bat[- ]large\\b/i.test(t)) return 'At-Large';\n let m = t.match(/\\bward\\s+(\\d+)/i);\n if (m) return `Ward ${m[1]}`;\n m = t.match(/\\bdistrict\\s+(\\d+)/i);\n if (m) return `District ${m[1]}`;\n return null;\n}\n\nfunction buildTitleAndSubtitle(pol) {\n const cleanTitle = stripRetain(pol.office_title);\n const cleanChamber = stripRetain(pol.chamber_name);\n const dashIdx = cleanTitle.lastIndexOf(' - ');\n\n const title = (() => {\n if (dashIdx > 0) return qualifyLocalTitle(cleanTitle.slice(0, dashIdx), pol);\n // NATIONAL_JUDICIAL: show role as title (e.g. \"Chief Justice\"), chamber as subtitle\n if (pol.district_type === 'NATIONAL_JUDICIAL')\n return cleanTitle || cleanChamber;\n if (pol.district_type === 'SCHOOL' && pol.government_name) {\n const schoolName = pol.government_name.split(',')[0];\n return cleanChamber ? `${schoolName} ${cleanChamber}` : schoolName;\n }\n if (/(_EXEC)$/.test(pol.district_type) || pol.district_type === 'COUNTY')\n return qualifyLocalTitle(cleanTitle || cleanChamber, pol);\n return qualifyLocalTitle(cleanChamber || cleanTitle, pol);\n })();\n\n const subtitle = (() => {\n if (dashIdx > 0) return normalizeDistrictSubtitle(cleanTitle.slice(dashIdx + 3));\n // NATIONAL_JUDICIAL: show court name as subtitle (e.g. \"Supreme Court of the United States\")\n if (pol.district_type === 'NATIONAL_JUDICIAL')\n return cleanChamber || null;\n // Seat designation embedded in the office title takes priority for local offices,\n // so each jurisdiction's own term wins (SLC \"Ward 3\", Ogden \"District 2\", at-large\n // seats \"At-Large\") even when district_id is null or shared across seats.\n const seatFromTitle = deriveSeatSubtitle(pol, cleanTitle);\n if (seatFromTitle) return seatFromTitle;\n if (pol.district_id && /^[1-9]\\d*$/.test(pol.district_id))\n return `District ${pol.district_id}`;\n if (pol.district_id === '0' && !/(_EXEC)$/.test(pol.district_type))\n return 'At-Large';\n return null;\n })();\n\n return { title, subtitle };\n}\n\n/** Map district_type prefix to tier label */\nfunction getTierLabel(districtType, officeTitle) {\n if (!districtType) return null;\n if (districtType.startsWith('NATIONAL')) return 'FEDERAL';\n if (districtType.startsWith('STATE')) return 'STATE';\n // Judicial districts: classify by court level\n if (districtType === 'JUDICIAL' && officeTitle) {\n const t = officeTitle.toLowerCase();\n if (t.includes('supreme court') || t.includes('appeals') || t.includes('tax court')) return 'STATE';\n }\n return 'LOCAL';\n}\n\n/** Tier badge colors */\nfunction getTierColors(tier, darkMode) {\n if (darkMode) {\n switch (tier) {\n case 'FEDERAL': return { bg: 'rgba(30,64,175,0.25)', text: '#93c5fd' };\n case 'STATE': return { bg: 'rgba(22,101,52,0.25)', text: '#86efac' };\n default: return { bg: 'rgba(126,34,206,0.25)', text: '#d8b4fe' };\n }\n }\n switch (tier) {\n case 'FEDERAL': return { bg: '#EFF6FF', text: '#1E40AF' };\n case 'STATE': return { bg: '#F0FDF4', text: '#166534' };\n default: return { bg: '#FDF4FF', text: '#7E22CE' };\n }\n}\n\n/** Check if a URL is LinkedIn */\nfunction isLinkedInUrl(url) {\n if (!url) return false;\n try {\n const hostname = new URL(url).hostname.toLowerCase();\n return hostname.includes('linkedin.com');\n } catch {\n return url.toLowerCase().includes('linkedin.com');\n }\n}\n\n/** Social platform detection */\nconst SOCIAL_PLATFORMS = [\n { test: /facebook\\.com/i, platform: 'facebook' },\n { test: /twitter\\.com|x\\.com/i, platform: 'twitter' },\n { test: /instagram\\.com/i, platform: 'instagram' },\n { test: /linkedin\\.com/i, platform: 'linkedin' },\n { test: /youtube\\.com|youtu\\.be/i, platform: 'youtube' },\n];\n\nfunction detectSocialPlatform(url) {\n if (!url) return null;\n for (const { test, platform } of SOCIAL_PLATFORMS) {\n if (test.test(url)) return platform;\n }\n return null;\n}\n\n/** Extract just the domain from a URL for display */\nfunction extractDomain(url) {\n try {\n return new URL(url).hostname.replace(/^www\\./, '');\n } catch {\n return url.replace(/^https?:\\/\\/(www\\.)?/, '').split('/')[0];\n }\n}\n\n/** Extract LinkedIn URL from politician data, and return non-LinkedIn websites */\nfunction extractLinkedIn(pol) {\n let linkedinUrl = null;\n const websites = [];\n\n // Check urls[] (person-level from BallotReady)\n (pol.urls || []).forEach(url => {\n if (isLinkedInUrl(url)) {\n if (!linkedinUrl) linkedinUrl = url;\n } else {\n websites.push(url);\n }\n });\n\n // Check contacts[].website_url\n (pol.contacts || []).forEach(c => {\n if (c.website_url && c.website_url.trim()) {\n if (isLinkedInUrl(c.website_url)) {\n if (!linkedinUrl) linkedinUrl = c.website_url;\n }\n // websites from contacts are handled separately in contact section\n }\n });\n\n return { linkedinUrl, personWebsites: websites };\n}\n\n/** Format an address object for display */\n/** Capitalize first letter of each word (for contact_type display) */\nfunction capitalize(str) {\n if (!str) return str;\n return str.replace(/\\b\\w/g, c => c.toUpperCase());\n}\n\n/** Normalize district subtitle for consistent display\n * e.g. \"Indiana 9th Congressional District\" → \"District 9\" */\nfunction normalizeDistrictSubtitle(raw) {\n if (!raw) return raw;\n // Match patterns like \"Indiana 9th Congressional District\" or \"California 33rd Congressional District\"\n const match = raw.match(/(\\d+)(?:st|nd|rd|th)\\s+Congressional\\s+District/i);\n if (match) return `District ${match[1]}`;\n return raw;\n}\n\nfunction formatAddress(addr) {\n const lines = [addr.address_1, addr.address_2, addr.address_3].filter(Boolean);\n const cityState = [addr.city, addr.state].filter(Boolean).join(', ');\n const cityStateZip = [cityState, addr.postal_code].filter(Boolean).join(' ');\n if (cityStateZip) lines.push(cityStateZip);\n return lines;\n}\n\n// ── SVG Icons ────────────────────────────────────────────────────────\n\nconst CalendarIcon = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\" />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\" />\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" />\n </svg>\n);\n\nconst ClockIcon = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n);\n\nconst MapPinIcon = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z\" />\n <circle cx=\"12\" cy=\"10\" r=\"3\" />\n </svg>\n);\n\nconst PhoneIcon = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 16.92v3a2 2 0 01-2.18 2 19.79 19.79 0 01-8.63-3.07A19.5 19.5 0 013.07 10.8 19.79 19.79 0 01.07 2.18 2 2 0 012.02 0h3a2 2 0 012 1.72c.127.96.361 1.903.7 2.81a2 2 0 01-.45 2.11L6.09 7.91a16 16 0 006 6l1.27-1.27a2 2 0 012.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0122 16.92z\" />\n </svg>\n);\n\nconst MailIcon = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 4H20C21.1 4 22 4.9 22 6V18C22 19.1 21.1 20 20 20H4C2.9 20 2 19.1 2 18V6C2 4.9 2.9 4 4 4Z\" />\n <path d=\"M22 6L12 13L2 6\" />\n </svg>\n);\n\nconst GlobeIcon = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M2 12H22M12 2C14.5 4.5 16 8 16 12C16 16 14.5 19.5 12 22C9.5 19.5 8 16 8 12C8 8 9.5 4.5 12 2Z\" />\n </svg>\n);\n\nconst DollarIcon = ({ size = 20 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"23\" />\n <path d=\"M17 5H9.5a3.5 3.5 0 000 7h5a3.5 3.5 0 010 7H6\" />\n </svg>\n);\n\nconst ExternalLinkIcon = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </svg>\n);\n\n// ── Component ────────────────────────────────────────────────────────\n\n/**\n * PoliticianProfile - Reusable politician profile layout component.\n */\nexport default function PoliticianProfile({\n politician = {},\n onBack,\n backLabel,\n children,\n banner, // slot for injecting content inside the card after heroRow\n style = {},\n legislativeSummary,\n judicialRecord,\n politicianId,\n onNavigateToRecord,\n imageFocalPoint,\n darkMode = false,\n}) {\n const isMobile = useMediaQuery('(max-width: 768px)');\n const pol = politician;\n\n // ── Derived data ───────────────────────────────────────────────────\n\n const displayName = pol.full_name ||\n [pol.first_name, pol.last_name].filter(Boolean).join(' ') ||\n 'Unknown';\n\n const label = backLabel || displayName;\n\n const profileImageUrl = (() => {\n if (pol.images && pol.images.length > 0) {\n const defaultImg = pol.images.find(img => img.type === 'default');\n return defaultImg ? defaultImg.url : pol.images[0].url;\n }\n return pol.photo_origin_url;\n })();\n\n const initials = [pol.first_name, pol.last_name]\n .filter(Boolean)\n .map((n) => n[0])\n .join('');\n\n const [imgError, setImgError] = useState(false);\n useEffect(() => { setImgError(false); }, [profileImageUrl]);\n\n // Social handles\n const getSocialHandle = (type) => {\n const identifier = pol.identifiers?.find(\n (i) => i.identifier_type?.toUpperCase() === type.toUpperCase()\n );\n return identifier?.identifier_value;\n };\n\n const twitter = getSocialHandle('TWITTER');\n const facebook = getSocialHandle('FACEBOOK');\n const instagram = getSocialHandle('INSTAGRAM');\n\n // LinkedIn detection\n const { linkedinUrl, personWebsites } = extractLinkedIn(pol);\n\n // Tier badge\n const tier = getTierLabel(pol.district_type, pol.office_title);\n const tierColors = tier ? getTierColors(tier, darkMode) : null;\n\n // Title & subtitle (no party)\n const { title: roleTitle, subtitle: roleSubtitle } = buildTitleAndSubtitle(pol);\n const roleLine = [roleTitle, roleSubtitle].filter(Boolean).join(' \\u2013 ');\n\n // Term\n const termLine = getTermLine(pol);\n\n // Committees\n const committees = (pol.committees || []).map((c) => ({\n name: c.name,\n position: c.position,\n url: c.urls?.[0],\n }));\n\n // ── Contact data (grouped by type) ────────────────────────────────\n\n // Group addresses\n const addresses = (pol.addresses || []).map(addr => ({\n type: capitalize(addr.contact_type || addr.type || 'office'),\n lines: formatAddress(addr),\n })).filter(a => a.lines.length > 0);\n\n // Group phones, emails, websites by contact_type\n const phonesByType = {};\n const emailsByType = {};\n const allWebsites = []; // non-social websites only\n const socialWebsiteUrls = []; // social platform URLs detected from websites list\n\n (pol.contacts || []).forEach(c => {\n const cType = capitalize(c.contact_type || 'office');\n if (c.phone && c.phone.trim()) {\n if (!phonesByType[cType]) phonesByType[cType] = [];\n phonesByType[cType].push(c.phone.trim());\n }\n if (c.email && c.email.trim()) {\n if (!emailsByType[cType]) emailsByType[cType] = [];\n emailsByType[cType].push(c.email.trim());\n }\n if (c.website_url && c.website_url.trim() && !isLinkedInUrl(c.website_url)) {\n const url = c.website_url.trim();\n if (detectSocialPlatform(url)) {\n if (!socialWebsiteUrls.includes(url)) socialWebsiteUrls.push(url);\n } else {\n allWebsites.push(url);\n }\n }\n });\n\n // Add BallotReady person-level emails\n (pol.email_addresses || []).forEach(email => {\n if (email && email.trim()) {\n if (!emailsByType['General']) emailsByType['General'] = [];\n if (!Object.values(emailsByType).flat().includes(email.trim())) {\n emailsByType['General'].push(email.trim());\n }\n }\n });\n\n // Add person-level websites (non-LinkedIn), deduplicated, splitting social vs plain\n personWebsites.forEach(url => {\n if (detectSocialPlatform(url)) {\n if (!socialWebsiteUrls.includes(url)) socialWebsiteUrls.push(url);\n } else {\n if (!allWebsites.includes(url)) allWebsites.push(url);\n }\n });\n\n const hasAddresses = addresses.length > 0;\n const hasPhones = Object.keys(phonesByType).length > 0;\n const hasEmails = Object.values(emailsByType).some(emails => emails.some(e => e && e.trim()));\n const hasWebsites = allWebsites.length > 0;\n const hasWebsitesCol = hasWebsites || twitter || facebook || instagram || linkedinUrl || socialWebsiteUrls.length > 0;\n const hasContactInfo = hasAddresses || hasPhones || hasEmails || hasWebsitesCol;\n const hasSocial = twitter || facebook || instagram || linkedinUrl;\n\n // ── Styles ─────────────────────────────────────────────────────────\n\n const divider = {\n borderTop: `1px solid ${darkMode ? '#374151' : '#E5E7EB'}`,\n margin: `${spacing[6]} 0`,\n };\n\n const sectionHeading = {\n display: 'flex',\n alignItems: 'center',\n gap: spacing[2],\n fontFamily: fonts.primary,\n fontWeight: fontWeights.semibold,\n fontSize: '18px',\n color: darkMode ? '#f3f4f6' : '#101828',\n margin: 0,\n marginBottom: spacing[4],\n };\n\n const styles = {\n container: {\n fontFamily: fonts.primary,\n ...style,\n },\n backLink: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: spacing[2],\n color: colors.evTeal,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.base,\n textDecoration: 'none',\n cursor: 'pointer',\n marginBottom: spacing[6],\n background: 'none',\n border: 'none',\n padding: 0,\n },\n card: {\n background: darkMode ? '#1a2235' : colors.bgWhite,\n borderRadius: borderRadius.lg,\n boxShadow: shadows.lg,\n padding: isMobile ? spacing[4] : spacing[8],\n marginBottom: spacing[8],\n },\n\n // Hero row\n heroRow: {\n display: 'flex',\n flexDirection: isMobile ? 'column' : 'row',\n gap: isMobile ? spacing[4] : spacing[8],\n alignItems: isMobile ? 'center' : 'flex-start',\n },\n photoWrap: {\n width: isMobile ? '150px' : '192px',\n height: isMobile ? '150px' : '240px',\n flexShrink: 0,\n },\n photo: {\n width: '100%',\n height: '100%',\n borderRadius: borderRadius.lg,\n objectFit: 'cover',\n objectPosition: imageFocalPoint ?? 'center 20%',\n background: colors.borderLight,\n },\n placeholder: {\n width: '100%',\n height: '100%',\n borderRadius: borderRadius.lg,\n background: colors.evTeal,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#ffffff',\n fontSize: isMobile ? fontSizes.xl : fontSizes['3xl'],\n fontWeight: fontWeights.bold,\n },\n infoCol: {\n flex: 1,\n minWidth: 0,\n textAlign: isMobile ? 'center' : 'left',\n },\n tierBadge: tierColors ? {\n display: 'inline-block',\n fontFamily: fonts.primary,\n fontWeight: fontWeights.semibold,\n fontSize: '11px',\n letterSpacing: '0.05em',\n color: tierColors.text,\n background: tierColors.bg,\n padding: '3px 10px',\n borderRadius: borderRadius.full,\n marginBottom: spacing[2],\n } : null,\n name: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.bold,\n fontSize: isMobile ? fontSizes['2xl'] : '30px',\n color: darkMode ? '#f3f4f6' : '#101828',\n margin: 0,\n marginBottom: spacing[1],\n lineHeight: 1.2,\n },\n roleLine: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.regular,\n fontSize: isMobile ? fontSizes.base : fontSizes.lg,\n color: darkMode ? '#d1d5db' : '#364153',\n margin: 0,\n marginBottom: spacing[1],\n },\n officeDesc: {\n fontFamily: fonts.primary,\n fontSize: fontSizes.base,\n color: darkMode ? '#9ca3af' : '#6A7282',\n margin: 0,\n marginBottom: spacing[3],\n lineHeight: 1.5,\n },\n bioText: {\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n color: darkMode ? '#9ca3af' : '#6A7282',\n margin: 0,\n marginTop: spacing[1],\n marginBottom: spacing[3],\n lineHeight: 1.5,\n },\n metaRow: {\n display: 'flex',\n alignItems: 'center',\n gap: spacing[4],\n flexWrap: 'wrap',\n marginBottom: spacing[4],\n justifyContent: isMobile ? 'center' : 'flex-start',\n },\n metaItem: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: spacing[1],\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n color: darkMode ? '#9ca3af' : '#6A7282',\n },\n submitBtn: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: spacing[2],\n fontFamily: fonts.primary,\n fontWeight: fontWeights.semibold,\n fontSize: fontSizes.sm,\n color: '#ffffff',\n background: colors.evTeal,\n border: 'none',\n borderRadius: borderRadius.md,\n padding: `${spacing[2]} ${spacing[5]}`,\n cursor: 'pointer',\n textDecoration: 'none',\n transition: 'background 0.2s',\n marginBottom: spacing[3],\n },\n\n // Contact section\n contactGrid: {\n display: 'grid',\n gridTemplateColumns: isMobile\n ? '1fr'\n : (() => {\n const cols = [];\n if (hasAddresses) cols.push('1fr');\n if (hasPhones) cols.push('140px');\n if (hasEmails) cols.push('minmax(180px, 1fr)');\n if (hasWebsitesCol) cols.push('1fr');\n return cols.join(' ');\n })(),\n gap: isMobile ? spacing[4] : spacing[6],\n },\n contactGroup: {\n minWidth: 0,\n },\n contactLabel: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.semibold,\n fontSize: '11px',\n letterSpacing: '0.05em',\n textTransform: 'uppercase',\n color: darkMode ? '#9ca3af' : '#6A7282',\n margin: 0,\n marginBottom: spacing[1],\n display: 'flex',\n alignItems: 'center',\n gap: spacing[1],\n },\n contactValue: {\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n color: darkMode ? '#d1d5db' : '#364153',\n lineHeight: 1.6,\n margin: 0,\n marginBottom: spacing[2],\n },\n contactLink: {\n color: darkMode ? '#59b0c4' : '#364153',\n textDecoration: 'none',\n wordBreak: 'break-all',\n },\n contactSubLabel: {\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n fontSize: '12px',\n color: darkMode ? '#6b7280' : '#9CA3AF',\n margin: 0,\n marginBottom: spacing[1],\n },\n\n // Coming soon\n comingSoon: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: spacing[1],\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n color: '#6A7282',\n background: '#F3F4F6',\n padding: `${spacing[1]} ${spacing[3]}`,\n borderRadius: borderRadius.full,\n },\n };\n\n // ── Render ─────────────────────────────────────────────────────────\n\n return (\n <div style={styles.container} className=\"ev-politician-profile\">\n {/* Back link */}\n {onBack && (\n <button\n type=\"button\"\n style={styles.backLink}\n onClick={onBack}\n onMouseEnter={(e) => { e.currentTarget.style.textDecoration = 'underline'; }}\n onMouseLeave={(e) => { e.currentTarget.style.textDecoration = 'none'; }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M15 19l-7-7 7-7\" />\n </svg>\n {label}\n </button>\n )}\n\n {/* Main card */}\n <div style={styles.card}>\n\n {/* ── Section 1: Hero Row ── */}\n <div style={styles.heroRow}>\n {/* Photo */}\n <div style={styles.photoWrap}>\n {profileImageUrl && !imgError ? (\n <img\n src={profileImageUrl}\n alt={`${displayName} portrait`}\n style={styles.photo}\n onError={() => setImgError(true)}\n />\n ) : (\n <div style={styles.placeholder}>{initials || '?'}</div>\n )}\n </div>\n\n {/* Info */}\n <div style={styles.infoCol}>\n {styles.tierBadge && (\n <div style={styles.tierBadge}>{tier}</div>\n )}\n <h1 style={styles.name}>{displayName}</h1>\n {banner}\n <p style={styles.roleLine}>{roleLine}</p>\n\n {pol.office_description && (\n <p style={styles.officeDesc}>{pol.office_description}</p>\n )}\n\n {pol.bio_text && (\n <p style={styles.bioText}>{pol.bio_text}</p>\n )}\n\n {/* Term + Years in Office */}\n {(termLine || pol.total_years_in_office > 0) && (\n <div style={styles.metaRow}>\n {termLine && (\n <span style={styles.metaItem}>\n <CalendarIcon size={14} />\n {termLine}\n </span>\n )}\n {pol.total_years_in_office > 0 && (\n <span style={styles.metaItem}>\n <ClockIcon size={14} />\n {pol.total_years_in_office} {pol.total_years_in_office === 1 ? 'year' : 'years'} in office\n </span>\n )}\n </div>\n )}\n\n {/* Submit a Message button */}\n {pol.web_form_url && (\n <a\n href={pol.web_form_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={styles.submitBtn}\n onMouseEnter={(e) => { e.currentTarget.style.background = colors.evTealDark; }}\n onMouseLeave={(e) => { e.currentTarget.style.background = colors.evTeal; }}\n >\n <ExternalLinkIcon size={14} />\n Submit a Message\n </a>\n )}\n\n {/* Social icons moved to bottom of websites column in contact section */}\n </div>\n </div>\n\n {/* ── Section 2: Contact Info ── */}\n {hasContactInfo && (\n <>\n <div style={divider} />\n <div style={sectionHeading}>\n <MailIcon size={20} />\n Contact Information\n </div>\n <div style={styles.contactGrid}>\n {/* Addresses column */}\n {hasAddresses && (\n <div style={styles.contactGroup}>\n <p style={styles.contactLabel}>\n <MapPinIcon size={12} />\n Addresses\n </p>\n {addresses.map((addr, i) => (\n <div key={`addr-${i}`}>\n <p style={{ ...styles.contactSubLabel, ...(i === 0 ? { marginTop: 0 } : { marginTop: spacing[2] }) }}>\n {addr.type}\n </p>\n <p style={styles.contactValue}>\n {addr.lines.map((line, j) => (\n <React.Fragment key={j}>\n {line}\n {j < addr.lines.length - 1 && <br />}\n </React.Fragment>\n ))}\n </p>\n </div>\n ))}\n </div>\n )}\n\n {/* Phones column */}\n {hasPhones && (\n <div style={styles.contactGroup}>\n <p style={styles.contactLabel}>\n <PhoneIcon size={12} />\n Phone\n </p>\n {Object.entries(phonesByType).map(([type, phones], i) => (\n <div key={`phone-${type}`}>\n <p style={{ ...styles.contactSubLabel, ...(i === 0 ? { marginTop: 0 } : { marginTop: spacing[2] }) }}>\n {type}\n </p>\n {phones.map((phone, j) => (\n <p key={j} style={styles.contactValue}>\n <a\n href={`tel:${phone}`}\n style={styles.contactLink}\n onMouseEnter={(e) => { e.currentTarget.style.textDecoration = 'underline'; }}\n onMouseLeave={(e) => { e.currentTarget.style.textDecoration = 'none'; }}\n >\n {phone}\n </a>\n </p>\n ))}\n </div>\n ))}\n </div>\n )}\n\n {/* Emails column */}\n {hasEmails && (\n <div style={styles.contactGroup}>\n <p style={styles.contactLabel}>\n <MailIcon size={12} />\n Email\n </p>\n {Object.entries(emailsByType).filter(([, emails]) => emails.some(e => e && e.trim())).map(([type, emails], i) => (\n <div key={`email-${type}`}>\n <p style={{ ...styles.contactSubLabel, ...(i === 0 ? { marginTop: 0 } : { marginTop: spacing[2] }) }}>\n {type}\n </p>\n {emails.filter(e => e && e.trim()).map((email, j) => (\n <p key={j} style={styles.contactValue}>\n <a\n href={`mailto:${email}`}\n style={styles.contactLink}\n onMouseEnter={(e) => { e.currentTarget.style.textDecoration = 'underline'; }}\n onMouseLeave={(e) => { e.currentTarget.style.textDecoration = 'none'; }}\n >\n {email}\n </a>\n </p>\n ))}\n </div>\n ))}\n </div>\n )}\n\n {/* Websites column */}\n {hasWebsitesCol && (\n <div style={styles.contactGroup}>\n <p style={styles.contactLabel}>\n <GlobeIcon size={12} />\n Websites\n </p>\n {allWebsites.map((url, i) => (\n <p key={i} style={styles.contactValue}>\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={styles.contactLink}\n onMouseEnter={(e) => { e.currentTarget.style.textDecoration = 'underline'; }}\n onMouseLeave={(e) => { e.currentTarget.style.textDecoration = 'none'; }}\n >\n {extractDomain(url)}\n </a>\n </p>\n ))}\n {/* Social icon-only links at bottom of websites column */}\n {(hasSocial || socialWebsiteUrls.length > 0) && (\n <SocialLinks\n twitter={twitter}\n facebook={facebook}\n instagram={instagram}\n linkedin={linkedinUrl}\n extraLinks={socialWebsiteUrls}\n size=\"sm\"\n darkMode={darkMode}\n style={{ marginTop: allWebsites.length > 0 ? '8px' : 0 }}\n />\n )}\n </div>\n )}\n </div>\n </>\n )}\n\n {/* ── Section 3: Committee Memberships ── */}\n {committees.length > 0 && (\n <>\n <div style={divider} />\n <CommitteeTable committees={committees} />\n </>\n )}\n\n {/* ── Section 4: Who is Funding? ── (commented out until ready)\n <div style={divider} />\n <div style={sectionHeading}>\n <DollarIcon size={20} />\n Who is Funding?\n </div>\n <div style={styles.comingSoon}>\n Coming soon\n </div>\n */}\n\n {/* ── Section 5: Legislative Summary / Judicial Scorecard ── */}\n {pol.is_judicial ? (\n <JudicialScorecard\n judicialRecord={judicialRecord}\n politicianId={politicianId}\n onNavigateToRecord={onNavigateToRecord}\n />\n ) : (\n <LegislativeInlineSummary\n summary={legislativeSummary}\n politicianId={politicianId}\n onNavigateToRecord={onNavigateToRecord}\n />\n )}\n </div>\n\n {/* Children slot (compass/radar chart section) */}\n {children}\n </div>\n );\n}\n","import React from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius, shadows } from './tokens';\nimport useMediaQuery from './useMediaQuery';\n\n/**\n * Normalize a position string: replace underscores with spaces, title-case each word.\n * \"not_voting\" -> \"Not Voting\"\n */\nfunction normalizePosition(pos) {\n if (!pos) return '';\n return pos\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/**\n * Derive attendance percentage from votes array.\n * Present = position is NOT \"Not Voting\" and NOT \"Absent\" (after normalizing).\n * Returns null if totalVotes === 0.\n */\nfunction deriveAttendance(votes) {\n if (!votes || votes.length === 0) return null;\n const present = votes.filter((v) => {\n const norm = normalizePosition(v.position);\n return norm !== 'Not Voting' && norm !== 'Absent';\n }).length;\n return Math.round((present / votes.length) * 100);\n}\n\n/**\n * Build a one-line most-recent-action string.\n * Picks the most recent item from bills or votes by date.\n */\nfunction getMostRecentAction(bills, votes) {\n const items = [];\n\n (bills || []).forEach((b) => {\n if (b.introduced_at) {\n items.push({\n date: b.introduced_at,\n text: `${b.number}: ${b.title} \\u2014 ${b.status_label}`,\n });\n }\n });\n\n (votes || []).forEach((v) => {\n if (v.vote_date) {\n const topic = v.bill_title || v.vote_question;\n const normPos = normalizePosition(v.position);\n items.push({\n date: v.vote_date,\n text: `Voted ${normPos} on ${topic} \\u2014 ${v.result}`,\n });\n }\n });\n\n if (items.length === 0) return null;\n items.sort((a, b) => (a.date < b.date ? 1 : -1));\n return items[0].text;\n}\n\n/**\n * LegislativeInlineSummary - Inline legislative activity card embedded in the profile.\n *\n * @param {Object} props\n * @param {Object} props.summary - { recent_bills: [], recent_votes: [] }\n * @param {string} props.politicianId - Opaque ID string for building the /record link\n */\nexport default function LegislativeInlineSummary({ summary, politicianId, onNavigateToRecord }) {\n const isMobile = useMediaQuery('(max-width: 768px)');\n\n // Guard: render nothing when no legislative data exists (local politicians, etc.)\n if (!summary) return null;\n const bills = summary.recent_bills || [];\n const votes = summary.recent_votes || [];\n if (bills.length === 0 && votes.length === 0) return null;\n\n // Derive stats — only show stats with real values\n const attendancePct = deriveAttendance(votes);\n const billsAdvanced = bills.length > 0 ? bills.length : null;\n\n const mostRecentAction = getMostRecentAction(bills, votes);\n\n const stats = [];\n if (attendancePct !== null) {\n stats.push({ value: `Voted in ${attendancePct}% of roll calls`, label: null });\n }\n if (billsAdvanced !== null) {\n const billLabel = billsAdvanced === 1\n ? 'Authored 1 bill that advanced past introduction'\n : `Authored ${billsAdvanced} bills that advanced past introduction`;\n stats.push({ value: billLabel, label: null });\n }\n\n const recordHref = '/politician/' + politicianId + '/record';\n\n const card = {\n borderTop: `1px solid ${colors.borderLight}`,\n padding: `${spacing[4]} ${spacing[4]} 0`,\n marginTop: spacing[4],\n fontFamily: fonts.primary,\n };\n\n const statsRow = {\n display: 'flex',\n flexDirection: isMobile ? 'column' : 'row',\n gap: isMobile ? spacing[2] : spacing[6],\n marginBottom: mostRecentAction ? spacing[3] : spacing[2],\n alignItems: isMobile ? 'flex-start' : 'center',\n };\n\n const statItem = {\n display: 'inline-flex',\n alignItems: 'baseline',\n gap: spacing[1],\n };\n\n const statValue = {\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.semibold,\n color: colors.evTeal,\n };\n\n const statLabel = {\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.regular,\n color: colors.textSecondary,\n };\n\n const actionLine = {\n fontFamily: fonts.primary,\n fontSize: fontSizes.xs,\n color: colors.textSecondary,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n marginBottom: spacing[3],\n };\n\n const footerRow = {\n display: 'flex',\n justifyContent: 'flex-end',\n };\n\n const recordLink = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: spacing[1],\n color: colors.evTeal,\n textDecoration: 'none',\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.medium,\n };\n\n return (\n <div style={card}>\n {/* Stats row */}\n {stats.length > 0 && (\n <div style={statsRow}>\n {stats.map((s, i) => (\n <div key={i} style={statItem}>\n <span style={statValue}>{s.value}</span>\n {s.label && <span style={statLabel}>{s.label}</span>}\n </div>\n ))}\n </div>\n )}\n\n {/* Most recent action */}\n {mostRecentAction && (\n <div style={actionLine} title={mostRecentAction}>\n {mostRecentAction}\n </div>\n )}\n\n {/* Topic tags — populated when mapping table ships */}\n <div>{/* Topic tags placeholder — deferred */}</div>\n\n {/* View Full Legislative Record link */}\n <div style={footerRow}>\n <button\n onClick={() => {\n if (onNavigateToRecord) {\n onNavigateToRecord(recordHref);\n } else {\n window.location.href = recordHref;\n }\n }}\n style={{\n ...recordLink,\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n padding: 0,\n }}\n onMouseEnter={(e) => { e.currentTarget.style.textDecoration = 'underline'; }}\n onMouseLeave={(e) => { e.currentTarget.style.textDecoration = 'none'; }}\n >\n View Full Legislative Record\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M9 18l6-6-6-6\" />\n </svg>\n </button>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { METRIC_LABELS, formatMetricValue, formatDate } from './judicialUtils.js';\n\nconst sectionStyle = {\n fontFamily: \"'Manrope', sans-serif\",\n borderTop: '1px solid #e2e8f0',\n paddingTop: '24px',\n marginTop: '24px',\n};\n\nconst headingStyle = {\n fontSize: '16px',\n fontWeight: 700,\n color: '#2d3748',\n marginBottom: '16px',\n};\n\nconst cardGridStyle = {\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(180px, 1fr))',\n gap: '12px',\n marginBottom: '16px',\n};\n\nconst metricCardStyle = {\n backgroundColor: '#f7fafc',\n borderRadius: '8px',\n padding: '14px 16px',\n border: '1px solid #e2e8f0',\n};\n\nconst metricValueStyle = {\n fontSize: '22px',\n fontWeight: 700,\n color: '#2d3748',\n lineHeight: 1.2,\n};\n\nconst metricLabelStyle = {\n fontSize: '12px',\n fontWeight: 600,\n color: '#718096',\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n marginBottom: '4px',\n};\n\nconst metricContextStyle = {\n fontSize: '12px',\n color: '#a0aec0',\n marginTop: '4px',\n};\n\nconst evalChipStyle = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '6px',\n backgroundColor: '#ebf8ff',\n color: '#2b6cb0',\n borderRadius: '6px',\n padding: '6px 12px',\n fontSize: '13px',\n fontWeight: 600,\n marginRight: '8px',\n marginBottom: '8px',\n};\n\nconst disciplinaryStyle = {\n borderLeft: '3px solid #fc8181',\n backgroundColor: '#fff5f5',\n borderRadius: '0 6px 6px 0',\n padding: '10px 14px',\n marginBottom: '8px',\n fontSize: '13px',\n color: '#742a2a',\n};\n\nconst linkStyle = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n color: '#319795',\n fontSize: '14px',\n fontWeight: 600,\n textDecoration: 'none',\n marginTop: '8px',\n cursor: 'pointer',\n};\n\n/**\n * JudicialScorecard — compact scorecard for judge profiles.\n * Renders in the same slot as LegislativeInlineSummary for legislators.\n *\n * Props:\n * judicialRecord: { judge_detail, evaluations[], metrics[], disciplinary_records[] }\n * politicianId: string (for building the detail link)\n * onNavigateToRecord: (href) => void\n */\nexport default function JudicialScorecard({ judicialRecord, politicianId, onNavigateToRecord }) {\n if (!judicialRecord) return null;\n\n const { evaluations = [], metrics = [], disciplinary_records: disciplinary = [] } = judicialRecord;\n\n // Don't render if there's no data at all\n if (evaluations.length === 0 && metrics.length === 0 && disciplinary.length === 0) {\n return null;\n }\n\n const handleNavigate = (e) => {\n e.preventDefault();\n if (onNavigateToRecord) {\n onNavigateToRecord(`/politician/${politicianId}/judicial-record`);\n }\n };\n\n return (\n <section style={sectionStyle}>\n <h3 style={headingStyle}>Judicial Record</h3>\n\n {/* Evaluation chips */}\n {evaluations.length > 0 && (\n <div style={{ marginBottom: '16px' }}>\n {evaluations.slice(0, 3).map((ev, i) => (\n <span key={i} style={evalChipStyle}>\n {ev.rating}\n <span style={{ fontWeight: 400, color: '#4a90a4', fontSize: '11px' }}>\n — {ev.source}\n </span>\n </span>\n ))}\n </div>\n )}\n\n {/* Metric cards */}\n {metrics.length > 0 && (\n <div style={cardGridStyle}>\n {metrics.slice(0, 4).map((m, i) => (\n <div key={i} style={metricCardStyle}>\n <div style={metricLabelStyle}>\n {METRIC_LABELS[m.metric_type] || m.metric_type.replace(/_/g, ' ')}\n </div>\n <div style={metricValueStyle}>\n {formatMetricValue(m.metric_type, m.value)}\n </div>\n {m.context_label && (\n <div style={metricContextStyle}>{m.context_label}</div>\n )}\n </div>\n ))}\n </div>\n )}\n\n {/* Disciplinary flag (if any) */}\n {disciplinary.length > 0 && (\n <div style={{ marginBottom: '12px' }}>\n {disciplinary.slice(0, 2).map((d, i) => (\n <div key={i} style={disciplinaryStyle}>\n <strong>{d.record_type}</strong> — {formatDate(d.record_date)}\n {d.description && <div style={{ marginTop: '4px' }}>{d.description}</div>}\n </div>\n ))}\n </div>\n )}\n\n {/* Link to full record */}\n <a href={`/politician/${politicianId}/judicial-record`} onClick={handleNavigate} style={linkStyle}>\n View Full Judicial Record →\n </a>\n </section>\n );\n}\n","/** Format a date string (ISO or YYYY-MM-DD or YYYY-MM) into readable form like \"November 7, 2012\". */\nexport function formatDate(dateStr) {\n if (!dateStr) return '';\n // Strip any time/timezone portion: \"2012-11-07T00:00:00Z\" → \"2012-11-07\"\n const cleaned = dateStr.replace(/T.*$/, '');\n const parts = cleaned.split('-');\n // Handle YYYY-MM (no day)\n if (parts.length === 2) {\n const d = new Date(`${cleaned}-01T12:00:00`);\n if (isNaN(d.getTime())) return dateStr;\n return d.toLocaleDateString('en-US', { month: 'long', year: 'numeric' });\n }\n const d = new Date(`${cleaned}T12:00:00`);\n if (isNaN(d.getTime())) return dateStr;\n return d.toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric' });\n}\n\nexport const METRIC_LABELS = {\n reversal_rate: 'Reversal Rate',\n caseload_volume: 'Cases Handled',\n avg_disposition_days: 'Avg. Days to Resolve',\n retention_vote_pct: 'Last Retention Vote',\n};\n\nexport function formatMetricValue(type, value) {\n if (type === 'reversal_rate' || type === 'retention_vote_pct') return `${value}%`;\n if (type === 'avg_disposition_days') return `${Math.round(value)} days`;\n if (type === 'caseload_volume') return Math.round(value).toLocaleString();\n return String(value);\n}\n","import React, { useState } from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius } from './tokens';\nimport useMediaQuery from './useMediaQuery';\n\nconst DEFAULT_LIMIT = 25;\n\n/**\n * Normalize a position or role string: replace underscores with spaces, title-case each word.\n */\nfunction normalizeText(str) {\n if (!str) return '';\n return str\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/**\n * Extract 4-digit year from a date string safely using slice (not new Date() to avoid timezone bugs).\n * Returns null if dateStr is falsy or doesn't start with 4 digits.\n */\nfunction extractYear(dateStr) {\n if (!dateStr || typeof dateStr !== 'string') return null;\n const year = dateStr.slice(0, 4);\n return /^\\d{4}$/.test(year) ? year : null;\n}\n\n/**\n * Get unique sorted years (descending) from an array of items using a date key.\n */\nfunction getYears(items, dateKey) {\n const yearSet = new Set();\n items.forEach((item) => {\n const y = extractYear(item[dateKey]);\n if (y) yearSet.add(y);\n });\n return Array.from(yearSet).sort((a, b) => b.localeCompare(a));\n}\n\n/**\n * Format a date string \"YYYY-MM-DD\" to \"Mar 15, 2024\" for display.\n * Uses slice to extract parts safely.\n */\nfunction formatDate(dateStr) {\n if (!dateStr) return '';\n const year = extractYear(dateStr);\n if (!year) return dateStr;\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const monthIdx = parseInt(dateStr.slice(5, 7), 10) - 1;\n const day = parseInt(dateStr.slice(8, 10), 10);\n if (isNaN(monthIdx) || monthIdx < 0 || monthIdx > 11) return year;\n if (isNaN(day)) return `${monthNames[monthIdx]} ${year}`;\n return `${monthNames[monthIdx]} ${day}, ${year}`;\n}\n\n// ─── Role badge config ────────────────────────────────────────────────────────\n\nconst ROLE_BADGE_CONFIG = {\n chair: { label: 'Chair', bg: colors.evCoral, text: colors.textWhite },\n vice_chair: { label: 'Vice Chair', bg: colors.evTealLight, text: colors.textWhite },\n ranking_member: { label: 'Ranking Member', bg: colors.evTeal, text: colors.textWhite },\n ex_officio: { label: 'Ex Officio', bg: colors.textMuted, text: colors.textWhite },\n member: { label: 'Member', bg: colors.borderMedium, text: colors.textSecondary },\n};\n\nfunction getRoleBadge(role) {\n const key = (role || 'member').toLowerCase().replace(/\\s+/g, '_');\n return ROLE_BADGE_CONFIG[key] || ROLE_BADGE_CONFIG.member;\n}\n\n// ─── Status badge config ──────────────────────────────────────────────────────\n\nfunction getStatusBadge(statusLabel) {\n const s = (statusLabel || '').toLowerCase();\n if (s === 'became law') {\n return { bg: '#dcfce7', text: colors.success };\n }\n if (s === 'vetoed') {\n return { bg: '#fee2e2', text: colors.error };\n }\n if (s === 'passed house' || s === 'passed senate') {\n return { bg: colors.bgLight, text: colors.evTeal };\n }\n if (s === 'failed') {\n return { bg: colors.borderLight, text: colors.textMuted };\n }\n if (s === 'introduced') {\n return { bg: colors.borderLight, text: colors.textMuted };\n }\n // Default fallback\n return { bg: colors.borderLight, text: colors.textSecondary };\n}\n\n// ─── Position badge config ────────────────────────────────────────────────────\n\nfunction getPositionBadge(position) {\n const norm = normalizeText(position);\n if (norm === 'Yea') {\n return { bg: '#bbf7d0', text: colors.success };\n }\n if (norm === 'Nay') {\n return { bg: '#fecaca', text: colors.error };\n }\n if (norm === 'Not Voting') {\n return { bg: colors.borderLight, text: colors.textMuted };\n }\n if (norm === 'Abstain') {\n return { bg: colors.evYellowLight, text: colors.evYellowDark };\n }\n if (norm === 'Absent') {\n return { bg: colors.borderLight, text: colors.textMuted };\n }\n return { bg: colors.borderLight, text: colors.textSecondary };\n}\n\n// ─── Shared sub-components ────────────────────────────────────────────────────\n\nfunction Badge({ label, bg, text }) {\n return (\n <span style={{\n display: 'inline-block',\n background: bg,\n color: text,\n borderRadius: borderRadius.full,\n fontSize: fontSizes.xs,\n fontWeight: fontWeights.semibold,\n fontFamily: fonts.primary,\n padding: `${spacing[1]} ${spacing[3]}`,\n whiteSpace: 'nowrap',\n }}>\n {label}\n </span>\n );\n}\n\nfunction SectionHeader({ title, yearFilter, years, onYearChange }) {\n return (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: spacing[4],\n }}>\n <h2 style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.xl,\n fontWeight: fontWeights.bold,\n color: colors.evTeal,\n margin: 0,\n }}>\n {title}\n </h2>\n {years && years.length > 0 && (\n <select\n value={yearFilter}\n onChange={(e) => onYearChange(e.target.value)}\n style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n color: colors.textSecondary,\n border: `1px solid ${colors.borderLight}`,\n borderRadius: borderRadius.md,\n padding: `${spacing[1]} ${spacing[2]}`,\n background: colors.bgWhite,\n cursor: 'pointer',\n }}\n >\n <option value=\"All\">All years</option>\n {years.map((y) => (\n <option key={y} value={y}>{y}</option>\n ))}\n </select>\n )}\n </div>\n );\n}\n\nfunction ShowAllLink({ totalCount, visibleCount, onClick }) {\n if (totalCount <= visibleCount) return null;\n return (\n <div style={{ textAlign: 'center', marginTop: spacing[3] }}>\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n background: 'none',\n border: 'none',\n color: colors.evTeal,\n fontSize: fontSizes.sm,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n cursor: 'pointer',\n padding: `${spacing[1]} ${spacing[2]}`,\n }}\n onMouseEnter={(e) => { e.currentTarget.style.textDecoration = 'underline'; }}\n onMouseLeave={(e) => { e.currentTarget.style.textDecoration = 'none'; }}\n >\n Show all {totalCount} items\n </button>\n </div>\n );\n}\n\nfunction EmptyState({ message }) {\n return (\n <p style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n color: colors.textMuted,\n fontStyle: 'italic',\n margin: 0,\n padding: `${spacing[3]} 0`,\n }}>\n {message}\n </p>\n );\n}\n\nfunction Spinner() {\n return (\n <div style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: spacing[10],\n }}>\n <div style={{\n width: '40px',\n height: '40px',\n borderRadius: borderRadius.full,\n border: `3px solid ${colors.borderLight}`,\n borderTopColor: colors.evTeal,\n animation: 'ev-spin 0.8s linear infinite',\n }} />\n <style>{`@keyframes ev-spin { to { transform: rotate(360deg); } }`}</style>\n </div>\n );\n}\n\n// ─── Section 1: Committees & Leadership ──────────────────────────────────────\n\nfunction CommitteesSection({ committees, leadership }) {\n const [showAll, setShowAll] = useState(false);\n\n const visible = showAll ? committees : committees.slice(0, DEFAULT_LIMIT);\n\n return (\n <div style={{ marginBottom: spacing[8] }}>\n <SectionHeader title=\"Committees & Leadership\" />\n\n {/* Leadership badges */}\n {leadership && leadership.length > 0 && (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: spacing[2], marginBottom: spacing[4] }}>\n {leadership.map((role, i) => (\n <div key={i} style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: spacing[1],\n background: colors.evCoral,\n color: colors.textWhite,\n borderRadius: borderRadius.md,\n padding: `${spacing[1]} ${spacing[3]}`,\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.semibold,\n }}>\n {role.title}\n {role.chamber && (\n <span style={{ fontWeight: fontWeights.regular, opacity: 0.85 }}>\n ({role.chamber})\n </span>\n )}\n </div>\n ))}\n </div>\n )}\n\n {committees.length === 0 ? (\n <EmptyState message=\"Committee information is not available for this office.\" />\n ) : (\n <>\n <div>\n {visible.map((c, i) => {\n const badge = getRoleBadge(c.role);\n return (\n <div key={i} style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: `${spacing[3]} 0`,\n borderBottom: `1px solid ${colors.borderLight}`,\n gap: spacing[3],\n }}>\n <span style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n color: colors.textSecondary,\n flex: 1,\n minWidth: 0,\n }}>\n {c.committee_name}\n {c.parent_name && (\n <span style={{ color: colors.textMuted, marginLeft: spacing[1] }}>\n ({c.parent_name})\n </span>\n )}\n </span>\n <Badge label={badge.label} bg={badge.bg} text={badge.text} />\n </div>\n );\n })}\n </div>\n {!showAll && (\n <ShowAllLink\n totalCount={committees.length}\n visibleCount={DEFAULT_LIMIT}\n onClick={() => setShowAll(true)}\n />\n )}\n </>\n )}\n </div>\n );\n}\n\n// ─── Section 2: Sponsored Legislation ────────────────────────────────────────\n\nfunction LegislationSection({ bills, isMobile }) {\n const years = getYears(bills, 'introduced_at');\n const [yearFilter, setYearFilter] = useState('All');\n const [showAll, setShowAll] = useState(false);\n\n // Reset showAll when year filter changes\n const handleYearChange = (y) => {\n setYearFilter(y);\n setShowAll(false);\n };\n\n const filtered = yearFilter === 'All'\n ? bills\n : bills.filter((b) => extractYear(b.introduced_at) === yearFilter);\n\n const visible = showAll ? filtered : filtered.slice(0, DEFAULT_LIMIT);\n\n return (\n <div style={{ marginBottom: spacing[8] }}>\n <SectionHeader\n title=\"Sponsored Legislation\"\n yearFilter={yearFilter}\n years={years}\n onYearChange={handleYearChange}\n />\n\n {bills.length === 0 ? (\n <EmptyState message=\"Sponsored legislation data is not available for this office.\" />\n ) : (\n <>\n <div>\n {visible.map((bill, i) => {\n const statusBadge = getStatusBadge(bill.status_label);\n return (\n <div key={i} style={{\n display: 'flex',\n flexDirection: isMobile ? 'column' : 'row',\n alignItems: isMobile ? 'flex-start' : 'center',\n gap: isMobile ? spacing[1] : spacing[3],\n padding: `${spacing[3]} 0`,\n borderBottom: `1px solid ${colors.borderLight}`,\n }}>\n {/* Bill number + title */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <span style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.xs,\n fontWeight: fontWeights.bold,\n color: colors.textSecondary,\n marginRight: spacing[2],\n }}>\n {bill.number}\n </span>\n <span style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n color: colors.textSecondary,\n }}>\n {bill.title}\n </span>\n </div>\n\n {/* Right side: status + date + sponsor indicator */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: spacing[2],\n flexShrink: 0,\n flexWrap: 'wrap',\n }}>\n <Badge label={bill.status_label || 'Unknown'} bg={statusBadge.bg} text={statusBadge.text} />\n {bill.introduced_at && (\n <span style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.xs,\n color: colors.textMuted,\n }}>\n {formatDate(bill.introduced_at)}\n </span>\n )}\n <span style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.xs,\n color: colors.textMuted,\n fontStyle: 'italic',\n }}>\n {bill.is_sponsor ? 'Sponsored' : 'Cosponsored'}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n {!showAll && (\n <ShowAllLink\n totalCount={filtered.length}\n visibleCount={DEFAULT_LIMIT}\n onClick={() => setShowAll(true)}\n />\n )}\n </>\n )}\n </div>\n );\n}\n\n// ─── Section 3: Voting Record ─────────────────────────────────────────────────\n\nfunction VotingSection({ votes, isMobile }) {\n const years = getYears(votes, 'vote_date');\n const [yearFilter, setYearFilter] = useState('All');\n const [showAll, setShowAll] = useState(false);\n\n const handleYearChange = (y) => {\n setYearFilter(y);\n setShowAll(false);\n };\n\n const filtered = yearFilter === 'All'\n ? votes\n : votes.filter((v) => extractYear(v.vote_date) === yearFilter);\n\n const visible = showAll ? filtered : filtered.slice(0, DEFAULT_LIMIT);\n\n return (\n <div style={{ marginBottom: spacing[8] }}>\n <SectionHeader\n title=\"Voting Record\"\n yearFilter={yearFilter}\n years={years}\n onYearChange={handleYearChange}\n />\n\n {votes.length === 0 ? (\n <EmptyState message=\"Voting records are not available for this office.\" />\n ) : (\n <>\n <div>\n {visible.map((vote, i) => {\n const positionBadge = getPositionBadge(vote.position);\n const normPosition = normalizeText(vote.position);\n const topic = vote.bill_title || vote.vote_question;\n const sourceUrl = vote.bill_url;\n return (\n <div key={i} style={{\n display: 'flex',\n flexDirection: isMobile ? 'column' : 'row',\n alignItems: isMobile ? 'flex-start' : 'center',\n gap: isMobile ? spacing[1] : spacing[3],\n padding: `${spacing[3]} 0`,\n borderBottom: `1px solid ${colors.borderLight}`,\n }}>\n {/* Topic */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <span style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.sm,\n color: colors.textSecondary,\n }}>\n {topic}\n </span>\n </div>\n\n {/* Right side: date + position + outcome + source */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: spacing[2],\n flexShrink: 0,\n flexWrap: 'wrap',\n }}>\n {vote.vote_date && (\n <span style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.xs,\n color: colors.textMuted,\n }}>\n {formatDate(vote.vote_date)}\n </span>\n )}\n <Badge label={normPosition || 'Unknown'} bg={positionBadge.bg} text={positionBadge.text} />\n {vote.result && (\n <span style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.xs,\n color: vote.result === 'Passed' ? colors.success : colors.textMuted,\n fontWeight: fontWeights.medium,\n }}>\n {vote.result}\n </span>\n )}\n {sourceUrl && (\n <a\n href={sourceUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n fontFamily: fonts.primary,\n fontSize: fontSizes.xs,\n color: colors.evTeal,\n textDecoration: 'none',\n }}\n onMouseEnter={(e) => { e.currentTarget.style.textDecoration = 'underline'; }}\n onMouseLeave={(e) => { e.currentTarget.style.textDecoration = 'none'; }}\n >\n Source\n </a>\n )}\n </div>\n </div>\n );\n })}\n </div>\n {!showAll && (\n <ShowAllLink\n totalCount={filtered.length}\n visibleCount={DEFAULT_LIMIT}\n onClick={() => setShowAll(true)}\n />\n )}\n </>\n )}\n </div>\n );\n}\n\n// ─── Main export ──────────────────────────────────────────────────────────────\n\n/**\n * LegislativeRecord - Full legislative record content component.\n * Headless: no Header, no routing, no data fetching.\n * The page wrapper in essentials handles those concerns.\n *\n * @param {Object} props\n * @param {Array} props.committees - Committee memberships\n * @param {Array} props.leadership - Leadership roles\n * @param {Array} props.bills - Sponsored/cosponsored legislation\n * @param {Array} props.votes - Roll-call vote records\n * @param {boolean} props.loading - Loading state\n * @param {string} props.politicianName - Display name for heading\n */\nexport default function LegislativeRecord({\n committees = [],\n leadership = [],\n bills = [],\n votes = [],\n loading = false,\n politicianName = '',\n}) {\n const isMobile = useMediaQuery('(max-width: 768px)');\n\n if (loading) {\n return <Spinner />;\n }\n\n return (\n <div style={{ fontFamily: fonts.primary }}>\n {politicianName && (\n <h1 style={{\n fontFamily: fonts.primary,\n fontSize: isMobile ? fontSizes['2xl'] : fontSizes['4xl'],\n fontWeight: fontWeights.bold,\n color: colors.evTeal,\n marginBottom: spacing[8],\n marginTop: 0,\n }}>\n Legislative Record: {politicianName}\n </h1>\n )}\n\n <CommitteesSection committees={committees} leadership={leadership} />\n <LegislationSection bills={bills} isMobile={isMobile} />\n <VotingSection votes={votes} isMobile={isMobile} />\n </div>\n );\n}\n","import React from 'react';\nimport { METRIC_LABELS, formatMetricValue, formatDate } from './judicialUtils.js';\n\nconst containerStyle = {\n fontFamily: \"'Manrope', sans-serif\",\n maxWidth: '800px',\n};\n\nconst backBtnStyle = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n color: '#718096',\n fontSize: '14px',\n fontWeight: 600,\n cursor: 'pointer',\n background: 'none',\n border: 'none',\n padding: '8px 0',\n marginBottom: '16px',\n};\n\nconst nameStyle = {\n fontSize: '24px',\n fontWeight: 700,\n color: '#2d3748',\n marginBottom: '4px',\n};\n\nconst roleStyle = {\n fontSize: '15px',\n color: '#718096',\n marginBottom: '24px',\n};\n\nconst sectionHeadingStyle = {\n fontSize: '18px',\n fontWeight: 700,\n color: '#2d3748',\n marginTop: '32px',\n marginBottom: '12px',\n paddingBottom: '8px',\n borderBottom: '2px solid #e2e8f0',\n};\n\nconst tableStyle = {\n width: '100%',\n borderCollapse: 'collapse',\n fontSize: '14px',\n};\n\nconst thStyle = {\n textAlign: 'left',\n padding: '8px 12px',\n fontWeight: 600,\n color: '#718096',\n borderBottom: '1px solid #e2e8f0',\n fontSize: '12px',\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n};\n\nconst tdStyle = {\n padding: '10px 12px',\n borderBottom: '1px solid #f7fafc',\n color: '#2d3748',\n};\n\nconst detailRowStyle = {\n display: 'flex',\n gap: '8px',\n padding: '8px 0',\n borderBottom: '1px solid #f7fafc',\n};\n\nconst detailLabelStyle = {\n fontWeight: 600,\n color: '#718096',\n minWidth: '160px',\n fontSize: '14px',\n};\n\nconst detailValueStyle = {\n color: '#2d3748',\n fontSize: '14px',\n};\n\nconst emptyStateStyle = {\n padding: '24px',\n backgroundColor: '#f7fafc',\n borderRadius: '8px',\n color: '#a0aec0',\n fontSize: '14px',\n textAlign: 'center',\n};\n\n/**\n * JudicialRecordDetail — full-page judicial record view.\n *\n * Props:\n * politician: { full_name, first_name, last_name, office_title, ... }\n * judicialRecord: { judge_detail, evaluations[], metrics[], disciplinary_records[] }\n * onBack: () => void\n */\nexport function JudicialRecordDetail({ politician = {}, judicialRecord, onBack }) {\n if (!judicialRecord) {\n return (\n <div style={containerStyle}>\n <button style={backBtnStyle} onClick={onBack}>&larr; Back to Profile</button>\n <div style={emptyStateStyle}>No judicial record data available.</div>\n </div>\n );\n }\n\n const {\n judge_detail: detail,\n evaluations = [],\n metrics = [],\n disciplinary_records: disciplinary = [],\n } = judicialRecord;\n\n const displayName = politician.full_name || `${politician.first_name || ''} ${politician.last_name || ''}`.trim();\n\n return (\n <div style={containerStyle}>\n <button style={backBtnStyle} onClick={onBack}>&larr; Back to Profile</button>\n\n <h1 style={nameStyle}>{displayName}</h1>\n <p style={roleStyle}>\n {detail?.court_role || politician.office_title}\n {detail?.date_seated && ` · Seated ${formatDate(detail.date_seated)}`}\n </p>\n\n {/* Judge Background */}\n {detail && (\n <>\n <h2 style={sectionHeadingStyle}>Background</h2>\n {detail.appointed_by && (\n <div style={detailRowStyle}>\n <span style={detailLabelStyle}>Appointed by</span>\n <span style={detailValueStyle}>{detail.appointed_by} ({detail.appointing_president_party})</span>\n </div>\n )}\n {detail.confirmation_vote && (\n <div style={detailRowStyle}>\n <span style={detailLabelStyle}>Confirmation Vote</span>\n <span style={detailValueStyle}>{detail.confirmation_vote}</span>\n </div>\n )}\n {detail.election_type && (\n <div style={detailRowStyle}>\n <span style={detailLabelStyle}>Election Type</span>\n <span style={detailValueStyle}>{detail.election_type === 'retention' ? 'Retention (Yes/No)' : 'Contested Election'}</span>\n </div>\n )}\n {detail.areas_of_focus?.length > 0 && (\n <div style={detailRowStyle}>\n <span style={detailLabelStyle}>Areas of Focus</span>\n <span style={detailValueStyle}>{detail.areas_of_focus.join(', ')}</span>\n </div>\n )}\n </>\n )}\n\n {/* Evaluations */}\n <h2 style={sectionHeadingStyle}>Performance Evaluations</h2>\n {evaluations.length === 0 ? (\n <div style={emptyStateStyle}>No evaluation data available yet.</div>\n ) : (\n <table style={tableStyle}>\n <thead>\n <tr>\n <th style={thStyle}>Source</th>\n <th style={thStyle}>Rating</th>\n <th style={thStyle}>Date</th>\n </tr>\n </thead>\n <tbody>\n {evaluations.map((ev, i) => (\n <tr key={i}>\n <td style={tdStyle}>\n {ev.source_url ? (\n <a href={ev.source_url} target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: '#319795' }}>\n {ev.source}\n </a>\n ) : ev.source}\n </td>\n <td style={{ ...tdStyle, fontWeight: 600 }}>{ev.rating}</td>\n <td style={tdStyle}>{formatDate(ev.rating_date)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n\n {/* Metrics */}\n <h2 style={sectionHeadingStyle}>Performance Metrics</h2>\n {metrics.length === 0 ? (\n <div style={emptyStateStyle}>No performance metric data available yet.</div>\n ) : (\n <table style={tableStyle}>\n <thead>\n <tr>\n <th style={thStyle}>Metric</th>\n <th style={thStyle}>Value</th>\n <th style={thStyle}>Context</th>\n <th style={thStyle}>Period</th>\n </tr>\n </thead>\n <tbody>\n {metrics.map((m, i) => (\n <tr key={i}>\n <td style={{ ...tdStyle, fontWeight: 600 }}>\n {METRIC_LABELS[m.metric_type] || m.metric_type.replace(/_/g, ' ')}\n </td>\n <td style={tdStyle}>{formatMetricValue(m.metric_type, m.value)}</td>\n <td style={{ ...tdStyle, color: '#718096', fontSize: '13px' }}>{m.context_label}</td>\n <td style={tdStyle}>{m.time_period}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n\n {/* Disciplinary Records */}\n {disciplinary.length > 0 && (\n <>\n <h2 style={sectionHeadingStyle}>Disciplinary History</h2>\n {disciplinary.map((d, i) => (\n <div key={i} style={{\n borderLeft: '3px solid #fc8181',\n backgroundColor: '#fff5f5',\n borderRadius: '0 6px 6px 0',\n padding: '12px 16px',\n marginBottom: '10px',\n }}>\n <div style={{ fontWeight: 700, color: '#742a2a', fontSize: '14px' }}>\n {d.record_type} — {formatDate(d.record_date)}\n </div>\n {d.description && (\n <div style={{ color: '#9b2c2c', fontSize: '13px', marginTop: '4px' }}>{d.description}</div>\n )}\n {d.source_url && (\n <a href={d.source_url} target=\"_blank\" rel=\"noopener noreferrer\"\n style={{ color: '#c53030', fontSize: '12px', marginTop: '4px', display: 'inline-block' }}>\n View source &rarr;\n </a>\n )}\n </div>\n ))}\n </>\n )}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { colors, fonts, fontWeights, fontSizes, spacing, borderRadius, shadows } from './tokens';\n\n/**\n * Reusable authentication form for Empowered Vote applications.\n * Supports login and register modes with consistent branding.\n *\n * @param {Object} props\n * @param {string} props.logoSrc - URL for the logo image (default: \"/EVLogo.svg\")\n * @param {string} props.appName - App name shown under logo (default: \"Empowered Vote\")\n * @param {string} props.appSubtitle - Subtitle under app name (optional)\n * @param {\"login\"|\"register\"} props.mode - Current form mode\n * @param {Function} props.onSubmit - async (username, password) => void\n * @param {Function} props.onModeSwitch - Called when user clicks the mode toggle link\n * @param {string|null} props.error - Error message to display\n * @param {boolean} props.submitting - Whether the form is currently submitting\n */\nexport default function AuthForm({\n logoSrc = '/EVLogo.svg',\n appName = 'Empowered Vote',\n appSubtitle,\n mode = 'login',\n onSubmit,\n onModeSwitch,\n error = null,\n submitting = false,\n}) {\n const [username, setUsername] = useState('');\n const [password, setPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n const [showPasswords, setShowPasswords] = useState(false);\n const [passwordMismatch, setPasswordMismatch] = useState(false);\n\n const isLogin = mode === 'login';\n\n const handleSubmit = (e) => {\n e.preventDefault();\n if (!username.trim() || !password) return;\n\n if (!isLogin && password !== confirmPassword) {\n setPasswordMismatch(true);\n return;\n }\n setPasswordMismatch(false);\n onSubmit?.(username.trim(), password);\n };\n\n const EyeOpen = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n strokeWidth={1.5} stroke=\"currentColor\" style={{ width: '20px', height: '20px' }}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\"\n d=\"M2.036 12.322a1.012 1.012 0 0 1 0-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178Z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\"\n d=\"M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\" />\n </svg>\n );\n\n const EyeClosed = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n strokeWidth={1.5} stroke=\"currentColor\" style={{ width: '20px', height: '20px' }}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\"\n d=\"M3.98 8.223A10.477 10.477 0 0 0 1.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.451 10.451 0 0 1 12 4.5c4.756 0 8.773 3.162 10.065 7.498a10.522 10.522 0 0 1-4.293 5.774M6.228 6.228 3 3m3.228 3.228 3.65 3.65m7.894 7.894L21 21m-3.228-3.228-3.65-3.65m0 0a3 3 0 1 0-4.243-4.243m4.242 4.242L9.88 9.88\" />\n </svg>\n );\n\n const PasswordToggle = () => (\n <button\n type=\"button\"\n onClick={() => setShowPasswords((prev) => !prev)}\n style={styles.passwordToggle}\n >\n {showPasswords ? <EyeOpen /> : <EyeClosed />}\n </button>\n );\n\n const displayError = passwordMismatch ? 'Passwords do not match.' : error;\n\n return (\n <div style={styles.wrapper}>\n <div style={styles.container}>\n {/* Logo and Title */}\n <div style={styles.header}>\n {logoSrc && (\n <img src={logoSrc} alt={appName} style={styles.logo} />\n )}\n {appName && (\n <h1 style={styles.appName}>{appName}</h1>\n )}\n {appSubtitle && (\n <p style={styles.appSubtitle}>{appSubtitle}</p>\n )}\n </div>\n\n {/* Form Card */}\n <form onSubmit={handleSubmit} style={styles.card}>\n <h2 style={styles.cardTitle}>\n {isLogin ? 'Welcome Back' : 'Create Account'}\n </h2>\n\n {/* Username */}\n <div style={styles.fieldGroup}>\n <label style={styles.label}>Username</label>\n <input\n type=\"text\"\n name=\"username\"\n autoComplete=\"off\"\n style={styles.input}\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n onFocus={(e) => Object.assign(e.target.style, styles.inputFocus)}\n onBlur={(e) => {\n e.target.style.outline = 'none';\n e.target.style.boxShadow = 'none';\n e.target.style.borderColor = colors.borderLight;\n }}\n required\n />\n </div>\n\n {/* Password */}\n <div style={styles.fieldGroup}>\n <label style={styles.label}>Password</label>\n <div style={styles.passwordWrapper}>\n <input\n type={showPasswords ? 'text' : 'password'}\n name=\"password\"\n style={{ ...styles.input, paddingRight: '40px' }}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n onFocus={(e) => Object.assign(e.target.style, styles.inputFocus)}\n onBlur={(e) => {\n e.target.style.outline = 'none';\n e.target.style.boxShadow = 'none';\n e.target.style.borderColor = colors.borderLight;\n }}\n required\n />\n <PasswordToggle />\n </div>\n </div>\n\n {/* Confirm Password (register only) */}\n {!isLogin && (\n <div style={styles.fieldGroup}>\n <label style={styles.label}>Confirm Password</label>\n <div style={styles.passwordWrapper}>\n <input\n type={showPasswords ? 'text' : 'password'}\n name=\"confirmPassword\"\n style={{ ...styles.input, paddingRight: '40px' }}\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n onFocus={(e) => Object.assign(e.target.style, styles.inputFocus)}\n onBlur={(e) => {\n e.target.style.outline = 'none';\n e.target.style.boxShadow = 'none';\n e.target.style.borderColor = colors.borderLight;\n }}\n required\n />\n <PasswordToggle />\n </div>\n </div>\n )}\n\n {/* Error Message */}\n {displayError && (\n <div style={styles.errorBox}>\n <p style={styles.errorText}>{displayError}</p>\n </div>\n )}\n\n {/* Submit Button */}\n <button\n type=\"submit\"\n disabled={submitting || !username.trim() || !password}\n style={{\n ...styles.submitButton,\n opacity: (submitting || !username.trim() || !password) ? 0.6 : 1,\n cursor: (submitting || !username.trim() || !password) ? 'not-allowed' : 'pointer',\n }}\n onMouseEnter={(e) => {\n if (!submitting) e.target.style.backgroundColor = '#e64d38';\n }}\n onMouseLeave={(e) => {\n e.target.style.backgroundColor = colors.evCoral;\n }}\n >\n {submitting\n ? (isLogin ? 'Signing In...' : 'Creating Account...')\n : (isLogin ? 'Sign In' : 'Create Account')}\n </button>\n\n {/* Mode Switch */}\n {onModeSwitch && (\n <div style={styles.modeSwitch}>\n <p style={styles.modeSwitchText}>\n {isLogin ? \"Don't have an account?\" : 'Already have an account?'}\n </p>\n <button\n type=\"button\"\n onClick={onModeSwitch}\n style={styles.modeSwitchButton}\n onMouseEnter={(e) => {\n e.target.style.backgroundColor = colors.evTeal;\n e.target.style.color = colors.textWhite;\n }}\n onMouseLeave={(e) => {\n e.target.style.backgroundColor = 'transparent';\n e.target.style.color = colors.evTeal;\n }}\n >\n {isLogin ? 'Create Account' : 'Sign In'}\n </button>\n </div>\n )}\n </form>\n </div>\n </div>\n );\n}\n\nconst styles = {\n wrapper: {\n minHeight: '100vh',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#f8f9fa',\n padding: `0 ${spacing[4]}`,\n fontFamily: fonts.primary,\n },\n container: {\n width: '100%',\n maxWidth: '384px',\n },\n header: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n marginBottom: spacing[8],\n },\n logo: {\n height: '64px',\n width: 'auto',\n marginBottom: spacing[4],\n },\n appName: {\n fontSize: fontSizes['2xl'],\n fontWeight: fontWeights.semibold,\n color: colors.evTeal,\n margin: 0,\n fontFamily: fonts.primary,\n },\n appSubtitle: {\n color: colors.textMuted,\n fontSize: fontSizes.sm,\n marginTop: spacing[1],\n margin: `${spacing[1]} 0 0 0`,\n fontFamily: fonts.primary,\n },\n card: {\n backgroundColor: colors.bgWhite,\n padding: spacing[8],\n borderRadius: '16px',\n boxShadow: '0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)',\n border: `1px solid ${colors.borderLight}`,\n },\n cardTitle: {\n fontSize: fontSizes.xl,\n fontWeight: fontWeights.semibold,\n marginBottom: spacing[6],\n textAlign: 'center',\n color: colors.textSecondary,\n margin: `0 0 ${spacing[6]} 0`,\n fontFamily: fonts.primary,\n },\n fieldGroup: {\n marginBottom: spacing[4],\n },\n label: {\n display: 'block',\n marginBottom: spacing[1],\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.medium,\n color: colors.textMuted,\n fontFamily: fonts.primary,\n },\n input: {\n width: '100%',\n border: `1px solid ${colors.borderLight}`,\n borderRadius: borderRadius.lg,\n padding: `10px ${spacing[4]}`,\n fontSize: fontSizes.base,\n fontFamily: fonts.primary,\n outline: 'none',\n transition: 'border-color 0.2s, box-shadow 0.2s',\n boxSizing: 'border-box',\n },\n inputFocus: {\n outline: 'none',\n boxShadow: `0 0 0 2px ${colors.evTealLight}`,\n borderColor: 'transparent',\n },\n passwordWrapper: {\n position: 'relative',\n },\n passwordToggle: {\n position: 'absolute',\n top: 0,\n right: '12px',\n bottom: 0,\n display: 'flex',\n alignItems: 'center',\n background: 'none',\n border: 'none',\n color: colors.textMuted,\n cursor: 'pointer',\n padding: 0,\n },\n errorBox: {\n marginBottom: spacing[4],\n padding: spacing[3],\n backgroundColor: '#fef2f2',\n border: '1px solid #fecaca',\n borderRadius: borderRadius.lg,\n },\n errorText: {\n color: colors.error,\n fontSize: fontSizes.sm,\n textAlign: 'center',\n margin: 0,\n fontFamily: fonts.primary,\n },\n submitButton: {\n width: '100%',\n backgroundColor: colors.evCoral,\n color: colors.textWhite,\n padding: '10px 0',\n borderRadius: borderRadius.lg,\n border: 'none',\n fontWeight: fontWeights.semibold,\n fontSize: fontSizes.base,\n fontFamily: fonts.primary,\n cursor: 'pointer',\n transition: 'background-color 0.2s',\n boxShadow: shadows.sm,\n },\n modeSwitch: {\n marginTop: spacing[6],\n paddingTop: spacing[6],\n borderTop: `1px solid ${colors.borderLight}`,\n },\n modeSwitchText: {\n textAlign: 'center',\n fontSize: fontSizes.sm,\n color: colors.textMuted,\n marginBottom: spacing[3],\n margin: `0 0 ${spacing[3]} 0`,\n fontFamily: fonts.primary,\n },\n modeSwitchButton: {\n width: '100%',\n padding: '10px 0',\n border: `2px solid ${colors.evTeal}`,\n color: colors.evTeal,\n borderRadius: borderRadius.lg,\n backgroundColor: 'transparent',\n fontWeight: fontWeights.medium,\n fontSize: fontSizes.base,\n fontFamily: fonts.primary,\n cursor: 'pointer',\n transition: 'background-color 0.2s, color 0.2s',\n },\n};\n","import React from 'react';\nimport { tierColors, fonts, fontWeights, fontSizes, spacing, borderRadius } from './tokens';\n\n// ────────────────────────────────────────────────────────────────────\n// Tier icons — Lucide-style inline SVGs, 24x24 viewBox, stroke-based\n// ────────────────────────────────────────────────────────────────────\n\nfunction LandmarkIcon({ size = 14 }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M10 18v-7\" />\n <path d=\"M11.12 2.198a2 2 0 0 1 1.76.006l7.866 3.847c.476.233.31.949-.22.949H3.474c-.53 0-.695-.716-.22-.949z\" />\n <path d=\"M14 18v-7\" />\n <path d=\"M18 18v-7\" />\n <path d=\"M3 22h18\" />\n <path d=\"M6 18v-7\" />\n </svg>\n );\n}\n\nfunction Building2Icon({ size = 14 }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z\" />\n <path d=\"M6 12H4a2 2 0 0 0-2 2v8h4\" />\n <path d=\"M18 9h2a2 2 0 0 1 2 2v11h-4\" />\n <path d=\"M10 6h4\" />\n <path d=\"M10 10h4\" />\n <path d=\"M10 14h4\" />\n <path d=\"M10 18h4\" />\n </svg>\n );\n}\n\nfunction HomeIcon({ size = 14 }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\n <polyline points=\"9 22 9 12 15 12 15 22\" />\n </svg>\n );\n}\n\nconst TIER_INFO = {\n federal: { label: 'Federal', Icon: LandmarkIcon },\n state: { label: 'State', Icon: Building2Icon },\n local: { label: 'Local', Icon: HomeIcon },\n};\n\n// ────────────────────────────────────────────────────────────────────\n// Size presets\n// ────────────────────────────────────────────────────────────────────\n\nconst SIZE_STYLES = {\n xs: {\n iconSize: 12,\n fontSize: fontSizes.xs,\n pillPadding: `${spacing[1]} ${spacing[2]}`,\n gap: spacing[1],\n iconGap: '3px',\n },\n sm: {\n iconSize: 14,\n fontSize: fontSizes.xs,\n pillPadding: `${spacing[1]} ${spacing[2]}`,\n gap: spacing[2],\n iconGap: '4px',\n },\n};\n\n// ────────────────────────────────────────────────────────────────────\n// Component\n// ────────────────────────────────────────────────────────────────────\n\n/**\n * TopicTierBadge — small icon + label badges showing which tiers of\n * government have real jurisdiction on a compass topic.\n *\n * Uses Lucide-style SVG icons:\n * Federal → Landmark (classical building with columns)\n * State → Building2 (office building)\n * Local → Home (house)\n *\n * Tier flags are purely informational — they don't gate compass\n * rendering or filter politician comparisons. This badge helps voters\n * pick topics with good cross-tier coverage when building their compass.\n *\n * @param {Object} props\n * @param {Object} [props.topic] - Topic object with applies_federal/state/local booleans\n * @param {Array<'federal'|'state'|'local'>} [props.tiers] - Explicit tier list (overrides topic)\n * @param {'xs'|'sm'} [props.size='sm'] - Icon + text size\n * @param {boolean} [props.iconOnly=false] - Hide text labels, show icons only (saves space)\n * @param {'tinted'|'muted'} [props.variant='tinted'] - 'tinted' uses tier-specific colors; 'muted' uses neutral gray for subtler presentation\n * @param {Object} [props.style] - Additional container styles\n */\nexport default function TopicTierBadge({\n topic,\n tiers,\n size = 'sm',\n iconOnly = false,\n variant = 'tinted',\n style = {},\n}) {\n // Derive tiers from topic if not explicitly passed\n const effectiveTiers = tiers ?? (\n topic\n ? [\n topic.applies_federal ? 'federal' : null,\n topic.applies_state ? 'state' : null,\n topic.applies_local ? 'local' : null,\n ].filter(Boolean)\n : []\n );\n\n if (effectiveTiers.length === 0) return null;\n\n const sizeStyle = SIZE_STYLES[size] || SIZE_STYLES.sm;\n\n const containerStyle = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: sizeStyle.gap,\n flexWrap: 'wrap',\n ...style,\n };\n\n const itemStyle = (tier) => {\n const color = variant === 'muted' ? '#6B7280' : tierColors[tier].text;\n return {\n display: 'inline-flex',\n alignItems: 'center',\n gap: sizeStyle.iconGap,\n fontFamily: fonts.primary,\n fontWeight: fontWeights.medium,\n fontSize: sizeStyle.fontSize,\n color,\n lineHeight: 1,\n userSelect: 'none',\n };\n };\n\n return (\n <span\n className=\"ev-topic-tier-badge\"\n style={containerStyle}\n role=\"group\"\n aria-label={`Applies at: ${effectiveTiers.map(t => TIER_INFO[t].label).join(', ')}`}\n >\n {effectiveTiers.map((tier) => {\n const { label, Icon } = TIER_INFO[tier];\n return (\n <span key={tier} style={itemStyle(tier)}>\n <Icon size={sizeStyle.iconSize} />\n {!iconOnly && <span>{label}</span>}\n </span>\n );\n })}\n </span>\n );\n}\n","import React, { useState } from 'react';\nimport { tierColors, fonts, fontWeights, fontSizes, spacing, borderRadius } from './tokens';\n\nconst TIER_LABELS = {\n federal: 'federal',\n state: 'state',\n local: 'local',\n};\n\n/**\n * CompassCoverageCallout — non-blocking banner shown on results pages when\n * the voter's compass has poor tier coverage for politicians in the current\n * results. Suggests adding more tier-applicable topics, with a CTA that\n * deep-links to the compass builder.\n *\n * The callout is purely informational. It does not change what politicians\n * are shown, reshape any compass radar, or filter results. It's a hint.\n *\n * @param {Object} props\n * @param {'federal'|'state'|'local'} props.tier - The tier that's under-covered\n * @param {number} props.count - How many of the voter's compass topics apply at this tier\n * @param {number} [props.totalSelected] - Total compass size (for context in the message)\n * @param {string} props.compassUrl - URL to open the compass builder (absolute or relative)\n * @param {Function} [props.onDismiss] - Optional dismiss handler; if provided, a close button renders\n */\nexport default function CompassCoverageCallout({\n tier,\n count,\n totalSelected,\n compassUrl,\n onDismiss,\n}) {\n const [dismissed, setDismissed] = useState(false);\n if (dismissed) return null;\n\n const tierLabel = TIER_LABELS[tier] || tier;\n const tierStyle = tierColors[tier] || tierColors.federal;\n\n const containerStyle = {\n display: 'flex',\n alignItems: 'flex-start',\n gap: spacing[3],\n padding: `${spacing[3]} ${spacing[4]}`,\n borderLeft: `4px solid ${tierStyle.text}`,\n backgroundColor: tierStyle.bg,\n borderRadius: `0 ${borderRadius.md} ${borderRadius.md} 0`,\n fontFamily: fonts.primary,\n margin: `${spacing[3]} 0`,\n };\n\n const textStyle = {\n flex: 1,\n fontSize: fontSizes.sm,\n color: '#2d3748',\n lineHeight: 1.5,\n };\n\n const headlineStyle = {\n fontWeight: fontWeights.semibold,\n marginBottom: spacing[1],\n color: tierStyle.text,\n };\n\n const ctaStyle = {\n display: 'inline-block',\n marginTop: spacing[2],\n padding: `${spacing[2]} ${spacing[4]}`,\n backgroundColor: tierStyle.text,\n color: '#ffffff',\n borderRadius: borderRadius.full,\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.semibold,\n textDecoration: 'none',\n cursor: 'pointer',\n };\n\n const closeStyle = {\n background: 'none',\n border: 'none',\n padding: spacing[1],\n cursor: 'pointer',\n color: '#718096',\n fontSize: fontSizes.lg,\n lineHeight: 1,\n };\n\n const handleDismiss = () => {\n setDismissed(true);\n if (onDismiss) onDismiss();\n };\n\n return (\n <div\n className=\"ev-compass-coverage-callout\"\n role=\"status\"\n style={containerStyle}\n >\n <div style={textStyle}>\n <div style={headlineStyle}>Your compass covers {tierLabel} issues lightly</div>\n <div>\n {count === 0\n ? `None of your ${totalSelected ?? 'selected'} compass topics apply at the ${tierLabel} level. `\n : `Only ${count} of your ${totalSelected ?? 'selected'} compass topics apply at the ${tierLabel} level. `}\n Add more {tierLabel}-applicable topics to get better comparisons with {tierLabel} officials.\n </div>\n <a href={compassUrl} style={ctaStyle}>\n Add {tierLabel} topics →\n </a>\n </div>\n {onDismiss !== undefined && (\n <button\n onClick={handleDismiss}\n style={closeStyle}\n aria-label=\"Dismiss coverage callout\"\n >\n ×\n </button>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { fonts, fontWeights, fontSizes, spacing, borderRadius } from './tokens';\n\n/**\n * ExpandCompassNudge — card-style prompt shown below the deep stance view\n * on a politician profile. Tells the voter how many topics the politician\n * has stances on that the voter hasn't answered yet, and offers a CTA to\n * expand the compass.\n *\n * Only useful to render when missingCount > 0. Caller should handle the\n * zero-missing case by not rendering this component at all.\n *\n * @param {Object} props\n * @param {string} props.politicianName - Display name for the CTA text\n * @param {number} props.missingCount - How many topics the politician has stances on that the voter hasn't answered\n * @param {string} props.compassUrl - URL to deep-link into the compass builder (should include a return param)\n * @param {Object} [props.style] - Additional styles to merge\n */\nexport default function ExpandCompassNudge({\n politicianName,\n missingCount,\n compassUrl,\n style = {},\n}) {\n if (!missingCount || missingCount <= 0) return null;\n\n const containerStyle = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: spacing[2],\n padding: spacing[4],\n marginTop: spacing[4],\n backgroundColor: '#F5F9FA',\n borderRadius: borderRadius.lg,\n border: '1px solid #e0e6eb',\n fontFamily: fonts.primary,\n ...style,\n };\n\n const headlineStyle = {\n fontSize: fontSizes.base,\n fontWeight: fontWeights.semibold,\n color: '#2d3748',\n margin: 0,\n };\n\n const bodyStyle = {\n fontSize: fontSizes.sm,\n color: '#4a5568',\n lineHeight: 1.5,\n margin: 0,\n };\n\n const ctaStyle = {\n display: 'inline-block',\n marginTop: spacing[2],\n padding: `${spacing[2]} ${spacing[4]}`,\n backgroundColor: '#00657c',\n color: '#ffffff',\n borderRadius: borderRadius.full,\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.semibold,\n textDecoration: 'none',\n cursor: 'pointer',\n };\n\n const topicsLabel = missingCount === 1 ? 'topic' : 'topics';\n const speakerName = politicianName || 'This politician';\n\n return (\n <div className=\"ev-expand-compass-nudge\" style={containerStyle} role=\"region\">\n <p style={headlineStyle}>Want a richer comparison?</p>\n <p style={bodyStyle}>\n {speakerName} has stances on {missingCount} more {topicsLabel} you haven't\n answered yet. Expand your compass to see where you stand on all of them.\n </p>\n <a href={compassUrl} style={ctaStyle}>\n Expand my compass →\n </a>\n </div>\n );\n}\n","/**\n * computeTierCoverage\n *\n * Counts how many topics apply at each tier of government. A topic with\n * `applies_federal`, `applies_state`, `applies_local` booleans contributes\n * to each tier it's marked for; cross-cutting topics contribute to all three.\n *\n * Topics missing tier flag fields (e.g., from an older API response) are\n * treated as cross-cutting (all three tiers = true). This matches the\n * backend default behavior in getCompassTopics/getCompassCategories.\n *\n * @param {Array<{applies_federal?: boolean, applies_state?: boolean, applies_local?: boolean}>} topics\n * @returns {{ federal: number, state: number, local: number }}\n *\n * @example\n * computeTierCoverage([\n * { applies_federal: true, applies_state: true, applies_local: true }, // housing\n * { applies_federal: true, applies_state: false, applies_local: false }, // tariffs\n * ])\n * // → { federal: 2, state: 1, local: 1 }\n */\nexport function computeTierCoverage(topics) {\n const counts = { federal: 0, state: 0, local: 0 };\n if (!Array.isArray(topics)) return counts;\n\n for (const t of topics) {\n if (!t) continue;\n // Default to cross-cutting if tier fields are missing entirely.\n const hasFlags =\n 'applies_federal' in t || 'applies_state' in t || 'applies_local' in t;\n const f = hasFlags ? Boolean(t.applies_federal) : true;\n const s = hasFlags ? Boolean(t.applies_state) : true;\n const l = hasFlags ? Boolean(t.applies_local) : true;\n if (f) counts.federal++;\n if (s) counts.state++;\n if (l) counts.local++;\n }\n\n return counts;\n}\n","import { useEffect, useState, useCallback, useRef } from 'react';\nimport { evContext } from './evContext.js';\n\n/**\n * 260426-mw6 — Detects the \"I signed up later\" gap.\n *\n * When a logged-in user lands on a page where the API has no data for a domain\n * (compass / address / verdicts) but ev-context has guest data captured before\n * signup, this hook returns shouldPrompt=true so the consumer can render an\n * inline \"Save this to your account?\" banner.\n *\n * On `promote()`:\n * 1. Calls the consumer-supplied `apiWriter(payload)` with the guest body.\n * 2. On success, mirrors into the userId-stamped authed slice via\n * `setAuthedSlice(userId, { [domain]: payload })` so subsequent loads\n * hydrate instantly (matches 260426-mc5 SWR semantics).\n * 3. Clears any prior promotionDismissed flag for this domain.\n *\n * On `dismiss()`: stamps `authed.promotionDismissed[domain] = true` so the\n * banner stays suppressed for this user on this domain until either a\n * successful promote or `clearAuthedSlice()` runs.\n *\n * Banners NEVER appear for guests, when the API already has data, or when the\n * dismissal stamp is set.\n *\n * @param {object} args\n * @param {'compass'|'address'|'verdicts'} args.domain\n * @param {boolean} args.isLoggedIn\n * @param {string|null|undefined} args.userId\n * @param {unknown} args.apiData API state for the domain; falsy / empty treated as \"API empty\"\n * @param {(payload: unknown) => Promise<unknown>} args.apiWriter\n * @param {boolean} [args.enabled=true]\n *\n * @returns {{\n * shouldPrompt: boolean,\n * payload: unknown,\n * promote: () => Promise<void>,\n * dismiss: () => Promise<void>,\n * status: 'idle'|'saving'|'saved'|'error',\n * error: Error|null\n * }}\n */\nexport function useEvContextPromotion({\n domain,\n isLoggedIn,\n userId,\n apiData,\n apiWriter,\n enabled = true,\n}) {\n const [shouldPrompt, setShouldPrompt] = useState(false);\n const [payload, setPayload] = useState(null);\n const [status, setStatus] = useState('idle');\n const [error, setError] = useState(null);\n\n // Refs for callbacks/inputs so subscribe handler always reads current values\n const apiDataRef = useRef(apiData);\n apiDataRef.current = apiData;\n const userIdRef = useRef(userId);\n userIdRef.current = userId;\n const isLoggedInRef = useRef(isLoggedIn);\n isLoggedInRef.current = isLoggedIn;\n const enabledRef = useRef(enabled);\n enabledRef.current = enabled;\n const domainRef = useRef(domain);\n domainRef.current = domain;\n const apiWriterRef = useRef(apiWriter);\n apiWriterRef.current = apiWriter;\n\n const detect = useCallback(async () => {\n const _enabled = enabledRef.current;\n const _isLoggedIn = isLoggedInRef.current;\n const _userId = userIdRef.current;\n const _apiData = apiDataRef.current;\n const _domain = domainRef.current;\n\n if (!_enabled || !_isLoggedIn || !_userId) {\n setShouldPrompt(false);\n setPayload(null);\n return;\n }\n if (!isApiEmpty(_domain, _apiData)) {\n setShouldPrompt(false);\n setPayload(null);\n return;\n }\n\n try {\n const slice = await evContext.getAuthedSlice(_userId);\n if (slice && slice.promotionDismissed && slice.promotionDismissed[_domain] === true) {\n setShouldPrompt(false);\n setPayload(null);\n return;\n }\n } catch { /* broker offline — treat as no dismissal */ }\n\n let guest = null;\n try { guest = await evContext.get(); } catch { guest = null; }\n\n if (isGuestPopulated(_domain, guest)) {\n setShouldPrompt(true);\n setPayload(guest[_domain]);\n } else {\n setShouldPrompt(false);\n setPayload(null);\n }\n }, []);\n\n // Re-run detection when inputs change.\n useEffect(() => {\n detect();\n }, [detect, isLoggedIn, userId, apiData, enabled, domain]);\n\n // Live updates: dismissals/promotes from another tab/subdomain re-trigger\n // detection. The subscribe callback is fired on every broker update.\n useEffect(() => {\n const unsub = evContext.subscribe(() => { detect(); });\n return unsub;\n }, [detect]);\n\n const promote = useCallback(async () => {\n const _userId = userIdRef.current;\n const _domain = domainRef.current;\n const _writer = apiWriterRef.current;\n const _payload = payload;\n if (!_userId || !_payload || typeof _writer !== 'function') return;\n\n setStatus('saving');\n setError(null);\n try {\n await _writer(_payload);\n // Seed mirror cache so next mount hydrates instantly.\n try {\n await evContext.setAuthedSlice(_userId, { [_domain]: _payload });\n } catch { /* non-fatal */ }\n // Clear any prior dismissal flag for this domain.\n try {\n await evContext.setAuthedSlice(_userId, {\n promotionDismissed: { [_domain]: false },\n });\n } catch { /* non-fatal */ }\n setStatus('saved');\n setShouldPrompt(false);\n } catch (err) {\n setStatus('error');\n setError(err instanceof Error ? err : new Error(String(err)));\n // Leave shouldPrompt as-is so the user can retry.\n }\n }, [payload]);\n\n const dismiss = useCallback(async () => {\n const _userId = userIdRef.current;\n const _domain = domainRef.current;\n if (!_userId) return;\n try {\n await evContext.setAuthedSlice(_userId, {\n promotionDismissed: { [_domain]: true },\n });\n } catch { /* non-fatal */ }\n setShouldPrompt(false);\n }, []);\n\n return { shouldPrompt, payload, promote, dismiss, status, error };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers (exported for unit-spot-checking; pure functions).\n// ---------------------------------------------------------------------------\n\n/**\n * Returns true when `apiData` is \"empty\" for the given domain. Conservative —\n * when in doubt, returns false (don't prompt).\n */\nexport function isApiEmpty(domain, apiData) {\n if (apiData === null || apiData === undefined) return true;\n if (domain === 'compass') {\n if (typeof apiData !== 'object') return false;\n if (Array.isArray(apiData)) return apiData.length === 0;\n if (apiData.answers && typeof apiData.answers === 'object') {\n return Object.keys(apiData.answers).length === 0;\n }\n return Object.keys(apiData).length === 0;\n }\n if (domain === 'address') {\n if (typeof apiData === 'string') return apiData.trim().length === 0;\n if (typeof apiData !== 'object') return false;\n // Object form: needs at least formatted/addr/lat to be non-empty\n const a = apiData;\n const hasAddr = typeof a.formatted === 'string' && a.formatted.length > 0;\n const hasAddrAlt = typeof a.addr === 'string' && a.addr.length > 0;\n const hasLat = typeof a.lat === 'number' || typeof a.latitude === 'number';\n return !(hasAddr || hasAddrAlt || hasLat);\n }\n if (domain === 'verdicts') {\n if (typeof apiData !== 'object') return false;\n if (Array.isArray(apiData)) return apiData.length === 0;\n return Object.keys(apiData).length === 0;\n }\n return false;\n}\n\n/**\n * Returns true when the ev-context guest top-level slice for `domain` has\n * meaningful data worth promoting.\n */\nexport function isGuestPopulated(domain, fullEvContext) {\n if (!fullEvContext || typeof fullEvContext !== 'object') return false;\n const slice = fullEvContext[domain];\n if (!slice || typeof slice !== 'object') return false;\n if (domain === 'compass') {\n // CompassV2/essentials use { a: {answers}, ... } where `a` is the answers map.\n const ans = slice.answers || slice.a;\n if (ans && typeof ans === 'object') return Object.keys(ans).length > 0;\n return false;\n }\n if (domain === 'address') {\n return (typeof slice.formatted === 'string' && slice.formatted.length > 0)\n || (typeof slice.addr === 'string' && slice.addr.length > 0);\n }\n if (domain === 'verdicts') {\n return Object.keys(slice).length > 0;\n }\n return false;\n}\n","import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport Favicon from './Favicon';\n\n/**\n * Truncate a URL for display (hostname + path, max 60 chars).\n */\nfunction getDisplayUrl(url) {\n try {\n const u = new URL(url);\n let host = u.hostname.replace(/^www\\./, '');\n const path = u.pathname === '/' ? '' : u.pathname;\n const display = host + path;\n return display.length > 60 ? display.slice(0, 57) + '...' : display;\n } catch {\n return url.length > 60 ? url.slice(0, 57) + '...' : url;\n }\n}\n\n// Comparison dot colors — from the EV dataViz palette (tokens.js).\n// Antipartisan: neutral dusk/sage pairing, never party colors.\nconst USER_DOT = '#7C6B9E'; // Dusk — \"You\"\nconst POL_DOT_LIGHT = '#5A9A6E'; // Sage — politician (light)\nconst POL_DOT_DARK = '#6DD28C'; // brighter sage for dark surfaces\n\n/**\n * Resolve the color palette for the current theme. Drives every color from the\n * `darkMode` prop (mirrors RadarChartCore) so the component is self-contained and\n * does not depend on consumer `!important` overrides.\n */\nfunction palette(darkMode) {\n return darkMode\n ? {\n rowBorder: 'rgba(255,255,255,0.08)',\n rowHover: '#1e2a3a', // ev-navy-elevated\n title: '#f3f4f6',\n chipLabel: '#d1d5db',\n sectionLabel: '#9ca3af', // 6.24:1 on #1a2235 ✓ AA\n reasoning: '#d1d5db',\n chevron: '#9ca3af', // 6.24:1 — bumped from #6b7280 (3.28) for clarity\n pillActiveBg: '#1e2a3a',\n pillActiveBorder: 'rgba(255,255,255,0.14)',\n pillIdleText: '#9ca3af', // 6.24:1 ✓ AA\n pillActiveText: '#f3f4f6',\n link: '#59b0c4', // 6.37:1 ✓ AA\n sourceText: '#9ca3af',\n quoteText: '#d1d5db',\n quoteBorder: 'rgba(255,255,255,0.14)',\n emptyText: '#9ca3af', // 6.24:1 — bumped from #6b7280 (3.28, failed AA)\n spinnerTrack: '#374151',\n polDot: POL_DOT_DARK,\n agreedBg: 'rgba(14,116,144,0.18)',\n agreedText: '#67e8f9',\n disagreedBg: 'rgba(180,83,9,0.18)',\n disagreedText: '#fbbf24',\n }\n : {\n rowBorder: '#f1f1f1',\n rowHover: '#f9fafb',\n title: '#262626',\n chipLabel: '#525252',\n sectionLabel: '#6b7280', // 4.83:1 on white — bumped from #a3a3a3 (2.52, failed AA)\n reasoning: '#404040',\n chevron: '#6b7280', // 4.83:1 — bumped from #a3a3a3 (2.52, failed 3:1)\n pillActiveBg: '#fafafa',\n pillActiveBorder: '#e5e5e5',\n pillIdleText: '#737373', // 4.74:1 ✓ AA\n pillActiveText: '#171717',\n link: '#00657c',\n sourceText: '#737373',\n quoteText: '#374151',\n quoteBorder: '#e2e8f0',\n emptyText: '#6b7280', // 4.83:1 — bumped from #a3a3a3 (2.52, failed AA)\n spinnerTrack: '#e2e8f0',\n polDot: POL_DOT_LIGHT,\n agreedBg: '#ecfeff',\n agreedText: '#0e7490',\n disagreedBg: '#fffbeb',\n disagreedText: '#b45309',\n };\n}\n\n/**\n * StanceAccordion — vertical list of topic rows showing politician stance labels.\n * Expanding a row reveals the full stance spectrum (with You / politician dots),\n * lazy-fetched reasoning + source links, and the politician's quotes for the topic.\n * True accordion: only one row open at a time.\n *\n * Props:\n * topics — filtered intersection topics (from CompassCard's topicsFiltered)\n * polAnswers — array of { topic_id, value }\n * userAnswerMap — Record<topic_id, value> — the viewer's own answers (for the \"You\" dot)\n * politicianId — politician UUID\n * allTopics — full topic objects with stances arrays\n * expandedTopics — full set of topics for \"show all\" toggle\n * darkMode — boolean — drives the color palette\n * verdictsByTopic — DEPRECATED (kept for backward compat, no longer used in render)\n * verdictsByQuote — Record<quote_id, 'agreed' | 'disagreed'> | undefined — per-quote verdicts\n * initialExpandedTopicId — topic ID to auto-open on mount (e.g. deep-linked from ReadRank)\n * apiUrl — API base URL (default: 'https://api.empowered.vote')\n */\nexport default function StanceAccordion({\n topics,\n polAnswers,\n userAnswerMap = {},\n politicianId,\n allTopics,\n expandedTopics,\n darkMode = false,\n verdictsByTopic, // DEPRECATED, no longer rendered\n verdictsByQuote, // Record<quote_id, 'agreed' | 'disagreed'> | undefined\n initialExpandedTopicId,\n apiUrl = 'https://api.empowered.vote',\n}) {\n const [expandedTopicId, setExpandedTopicId] = useState(null);\n const [loadingId, setLoadingId] = useState(null);\n const [showAll, setShowAll] = useState(false);\n const contextCache = useRef(new Map());\n const quotesCache = useRef(null); // null = unfetched, array = fetched (may be empty)\n\n const c = palette(darkMode);\n\n // Build lookup: topic_id -> polAnswer value\n const polAnswerMap = {};\n if (polAnswers) {\n polAnswers.forEach((a) => {\n polAnswerMap[String(a.topic_id)] = a.value;\n });\n }\n\n // Build lookup: topic id -> full topic (for stance label resolution)\n const topicById = {};\n if (allTopics) {\n allTopics.forEach((t) => {\n topicById[String(t.id)] = t;\n });\n }\n\n /**\n * Resolve stance label from answer value.\n * topic.stances[value - 1].text -> e.g., \"Strongly Support\"\n */\n function getStanceLabel(topicId, value) {\n const topic = topicById[String(topicId)];\n if (!topic || !topic.stances || !value) return 'No position';\n const idx = value - 1;\n if (idx < 0 || idx >= topic.stances.length) return 'No position';\n return topic.stances[idx].text || 'No position';\n }\n\n /**\n * Fetch context for a topic (reasoning + sources). Returns after caching.\n */\n async function fetchContext(topicId) {\n if (contextCache.current.has(topicId)) return;\n try {\n const res = await fetch(\n `${apiUrl}/api/compass/politicians/${politicianId}/${topicId}/context`,\n { credentials: 'include' }\n );\n if (res.status === 404) {\n contextCache.current.set(topicId, { reasoning: '', sources: [] });\n } else if (res.ok) {\n const data = await res.json();\n contextCache.current.set(topicId, {\n reasoning: data.reasoning || '',\n sources: data.sources || [],\n });\n } else {\n contextCache.current.set(topicId, { reasoning: '', sources: [] });\n }\n } catch {\n contextCache.current.set(topicId, { reasoning: '', sources: [] });\n }\n }\n\n /**\n * Fetch quotes for this politician once and store in quotesCache.\n * The backend filters by politician_id when provided; this client-side\n * cache holds only quotes for the current politician.\n * Subsequent calls return immediately (no-op).\n */\n async function ensureQuotesFetched() {\n if (quotesCache.current !== null) return;\n try {\n const res = await fetch(\n `${apiUrl}/api/essentials/quotes?politician_id=${politicianId}`,\n { credentials: 'include' }\n );\n if (res.ok) {\n const data = await res.json();\n quotesCache.current = data.quotes || [];\n } else {\n quotesCache.current = [];\n }\n } catch {\n quotesCache.current = [];\n }\n }\n\n /**\n * Toggle accordion row. Lazy-fetch context + quotes in parallel if not cached.\n */\n const handleToggle = useCallback(\n async (topicId) => {\n if (expandedTopicId === topicId) {\n setExpandedTopicId(null);\n return;\n }\n\n setExpandedTopicId(topicId);\n\n // Check if context already cached (quotes fetched separately)\n if (contextCache.current.has(topicId) && quotesCache.current !== null) return;\n\n // Fetch context and quotes in parallel\n setLoadingId(topicId);\n try {\n await Promise.all([fetchContext(topicId), ensureQuotesFetched()]);\n } finally {\n setLoadingId(null);\n }\n },\n [expandedTopicId, politicianId, apiUrl]\n );\n\n // Auto-open the deep-linked topic once both topics and initialExpandedTopicId are available.\n // Depends on both so it fires whether topics or the ID arrives last.\n useEffect(() => {\n if (initialExpandedTopicId && topics && topics.length > 0) {\n handleToggle(String(initialExpandedTopicId));\n }\n // handleToggle is stable per render cycle; omitting avoids infinite loop\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialExpandedTopicId, topics?.length]);\n\n if (!topics || topics.length === 0) return null;\n\n const hasToggle = expandedTopics && expandedTopics.length > topics.length;\n const baseTopics = hasToggle && showAll ? expandedTopics : topics;\n\n // Pin the deep-linked topic to the top so it's always visible without \"show all\"\n let visibleTopics = baseTopics;\n if (initialExpandedTopicId) {\n const fullList = expandedTopics || topics;\n const pinned = fullList.find((t) => String(t.id) === String(initialExpandedTopicId));\n if (pinned && String(baseTopics[0]?.id) !== String(initialExpandedTopicId)) {\n visibleTopics = [pinned, ...baseTopics.filter((t) => String(t.id) !== String(initialExpandedTopicId))];\n }\n }\n\n const sectionLabelStyle = {\n fontSize: '11px',\n fontWeight: 600,\n color: c.sectionLabel,\n textTransform: 'uppercase',\n letterSpacing: '0.06em',\n };\n\n return (\n <div\n className=\"ev-stance-panel flex flex-col\"\n style={{ fontFamily: \"'Manrope', sans-serif\" }}\n >\n <h3 style={{ ...sectionLabelStyle, marginBottom: '8px' }}>\n Stance Breakdown\n </h3>\n\n {visibleTopics.map((topic) => {\n const topicId = String(topic.id);\n const polValue = polAnswerMap[topicId];\n const userValue = userAnswerMap[topicId];\n const label = getStanceLabel(topicId, polValue);\n const isExpanded = expandedTopicId === topicId;\n const isLoading = loadingId === topicId;\n const cached = contextCache.current.get(topicId);\n const fullTopic = topicById[topicId];\n const questionText = fullTopic?.question_text;\n const titleText = questionText || topic.short_title;\n const stances = fullTopic?.stances || topic.stances || [];\n\n // Filter quotes for this politician and topic.\n // candidateId guard is a defensive check — the backend already filters by\n // politician_id, but this ensures correctness if the cache is ever shared.\n const topicQuotes = quotesCache.current\n ? quotesCache.current.filter((q) => {\n if (!q.issue) return false;\n if (q.candidateId && q.candidateId !== politicianId) return false;\n if (topic.topic_key) return q.issue === topic.topic_key;\n return topic.short_title && q.issue.toLowerCase() === topic.short_title.toLowerCase();\n })\n : [];\n\n return (\n <div\n key={topicId}\n style={{ borderBottom: `1px solid ${c.rowBorder}` }}\n >\n {/* Collapsed row — question-led title + politician stance chip */}\n <button\n type=\"button\"\n onClick={() => handleToggle(topicId)}\n className=\"w-full flex items-start justify-between text-left cursor-pointer\"\n style={{\n padding: '12px 8px',\n background: 'transparent',\n border: 'none',\n transition: 'background 0.15s ease',\n borderRadius: '8px',\n }}\n onMouseEnter={(e) => { e.currentTarget.style.background = c.rowHover; }}\n onMouseLeave={(e) => { e.currentTarget.style.background = 'transparent'; }}\n >\n <div className=\"flex flex-col min-w-0\" style={{ gap: '5px' }}>\n <span\n style={{\n fontSize: '14px',\n fontWeight: 600,\n color: c.title,\n lineHeight: 1.4,\n }}\n >\n {titleText}\n </span>\n {/* Stance chip: sage dot + politician's current position.\n Wraps to full lines so the whole stance reads before expanding. */}\n <span style={{ display: 'flex', alignItems: 'flex-start', gap: '8px' }}>\n <span\n style={{\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: c.polDot,\n flexShrink: 0,\n marginTop: '6px',\n }}\n />\n <span\n style={{\n fontSize: '13px',\n color: c.chipLabel,\n lineHeight: 1.45,\n }}\n >\n {label}\n </span>\n </span>\n </div>\n\n {/* Chevron */}\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={c.chevron}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"flex-shrink-0 ml-2\"\n style={{\n marginTop: '3px',\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease',\n }}\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </button>\n\n {/* Expanded content */}\n <div\n style={{\n display: 'grid',\n gridTemplateRows: isExpanded ? '1fr' : '0fr',\n transition: 'grid-template-rows 0.25s ease',\n }}\n >\n <div style={{ overflow: 'hidden' }}>\n <div style={{ padding: '4px 8px 16px' }}>\n {/* Stance spectrum — full scale with You / politician dots.\n Read-only on the profile (editing belongs to the compass tool). */}\n {stances.length > 0 && (\n <>\n {/* Legend */}\n {(userValue > 0 || polValue > 0) && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '14px',\n marginBottom: '8px',\n fontSize: '12px',\n color: c.sourceText,\n }}\n >\n {userValue > 0 && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: '6px' }}>\n <span style={{ width: '9px', height: '9px', borderRadius: '50%', backgroundColor: USER_DOT }} />\n You\n </span>\n )}\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: '6px' }}>\n <span style={{ width: '9px', height: '9px', borderRadius: '50%', backgroundColor: c.polDot }} />\n Their stance\n </span>\n </div>\n )}\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', marginBottom: '14px' }}>\n {stances.map((stance, i) => {\n const stanceNum = i + 1;\n const isUser = userValue === stanceNum;\n const isPol = polValue === stanceNum;\n const isActive = isUser || isPol;\n return (\n <div\n key={i}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: '10px',\n padding: '10px 12px',\n borderRadius: '12px',\n fontSize: '13px',\n lineHeight: 1.4,\n border: `1px solid ${isActive ? c.pillActiveBorder : 'transparent'}`,\n backgroundColor: isActive ? c.pillActiveBg : 'transparent',\n }}\n >\n {/* Left dot rail — fixed width so every stance's text\n aligns and the You / their-stance markers scan vertically. */}\n <span\n style={{\n flexShrink: 0,\n width: '30px',\n display: 'flex',\n alignItems: 'center',\n gap: '5px',\n paddingTop: '3px',\n }}\n >\n {isUser && (\n <span style={{ width: '9px', height: '9px', borderRadius: '50%', backgroundColor: USER_DOT, boxShadow: `0 0 0 3px ${USER_DOT}33` }} />\n )}\n {isPol && (\n <span style={{ width: '9px', height: '9px', borderRadius: '50%', backgroundColor: c.polDot, boxShadow: `0 0 0 3px ${c.polDot}33` }} />\n )}\n </span>\n <span\n style={{\n flex: 1,\n color: isActive ? c.pillActiveText : c.pillIdleText,\n fontWeight: isActive ? 500 : 400,\n }}\n >\n {stance.text}\n </span>\n </div>\n );\n })}\n </div>\n </>\n )}\n\n {isLoading && (\n <div className=\"flex items-center\" style={{ padding: '12px 0' }}>\n <div\n style={{\n width: '20px',\n height: '20px',\n border: `2px solid ${c.spinnerTrack}`,\n borderTopColor: '#00657c',\n borderRadius: '50%',\n animation: 'ev-spin 0.8s linear infinite',\n }}\n />\n </div>\n )}\n\n {!isLoading && cached && (\n <>\n {cached.reasoning ? (\n <p\n style={{\n fontSize: '14px',\n color: c.reasoning,\n marginBottom: '12px',\n whiteSpace: 'pre-wrap',\n lineHeight: 1.6,\n }}\n >\n {cached.reasoning}\n </p>\n ) : null}\n\n {cached.sources && cached.sources.length > 0 && (\n <div style={{ marginTop: '8px' }}>\n <p style={{ ...sectionLabelStyle, marginBottom: '6px' }}>\n References\n </p>\n <ol style={{ listStyle: 'decimal', listStylePosition: 'inside', display: 'flex', flexDirection: 'column', gap: '4px' }}>\n {cached.sources.map((src, i) => (\n <li key={i} style={{ fontSize: '12px', color: c.sourceText }}>\n <a\n href={src}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1.5\"\n style={{ color: c.link }}\n >\n <Favicon url={src} />\n <span style={{ textDecoration: 'underline', textUnderlineOffset: '2px' }}>\n {getDisplayUrl(src)}\n </span>\n </a>\n </li>\n ))}\n </ol>\n </div>\n )}\n\n {topicQuotes.length > 0 && (\n <div style={{ marginTop: '14px' }}>\n <p style={{ ...sectionLabelStyle, marginBottom: '8px' }}>\n Quotes\n </p>\n {topicQuotes.map((quote) => {\n const verdict = verdictsByQuote ? verdictsByQuote[quote.id] : undefined;\n const borderColor =\n verdict === 'agreed'\n ? c.agreedText\n : verdict === 'disagreed'\n ? c.disagreedText\n : c.quoteBorder;\n const sourceName = quote.source_name || quote.sourceName;\n return (\n <div\n key={quote.id}\n style={{\n borderLeft: `3px solid ${borderColor}`,\n paddingLeft: '10px',\n paddingTop: '6px',\n paddingBottom: '6px',\n marginBottom: '8px',\n }}\n >\n <p\n style={{\n fontSize: '13px',\n fontStyle: 'italic',\n color: c.quoteText,\n margin: 0,\n lineHeight: 1.5,\n }}\n >\n {quote.text}\n </p>\n {verdict === 'agreed' && (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n backgroundColor: c.agreedBg,\n color: c.agreedText,\n padding: '2px 8px',\n borderRadius: '9999px',\n fontSize: '11px',\n fontWeight: 500,\n marginTop: '4px',\n flexShrink: 0,\n }}\n >\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M5 13l4 4L19 7\" />\n </svg>\n Agreed\n </span>\n )}\n {verdict === 'disagreed' && (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n backgroundColor: c.disagreedBg,\n color: c.disagreedText,\n padding: '2px 8px',\n borderRadius: '9999px',\n fontSize: '11px',\n fontWeight: 500,\n marginTop: '4px',\n flexShrink: 0,\n }}\n >\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n Disagreed\n </span>\n )}\n {sourceName && (\n <a\n href={quote.source_url || quote.sourceUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{\n display: 'block',\n fontSize: '11px',\n color: c.link,\n marginTop: '3px',\n textDecoration: 'none',\n }}\n >\n {sourceName}\n </a>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {!cached.reasoning &&\n (!cached.sources || cached.sources.length === 0) &&\n topicQuotes.length === 0 && (\n <p style={{ fontSize: '14px', color: c.emptyText, fontStyle: 'italic', padding: '8px 0' }}>\n No detailed reasoning available for this topic.\n </p>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n })}\n\n {hasToggle && (\n <button\n type=\"button\"\n onClick={() => setShowAll((v) => !v)}\n className=\"text-sm font-medium mt-2 px-2 py-1 self-start cursor-pointer hover:underline\"\n style={{ color: c.link }}\n >\n {showAll ? 'Show fewer' : `Show all ${expandedTopics.length} topics`}\n </button>\n )}\n </div>\n );\n}\n","import React from 'react';\n\n/**\n * Favicon — renders a site's favicon via Google's favicon service.\n * Default size=16 for inline source link display.\n */\nexport default function Favicon({ url, size = 16 }) {\n try {\n const domain = new URL(url).hostname;\n return (\n <img\n src={`https://www.google.com/s2/favicons?sz=${size}&domain=${domain}`}\n alt=\"\"\n width={size}\n height={size}\n style={{ verticalAlign: 'middle', flexShrink: 0 }}\n />\n );\n } catch {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n style={{ verticalAlign: 'middle', flexShrink: 0 }}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M2 12h20M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\" />\n </svg>\n );\n }\n}\n"],"mappings":"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","names":["useEffect","useEffect","offset","React","React","React","useState","useRef","useEffect","useState","useEffect","useState","useRef","useEffect","styles","React","React","React","linkStyle","React","React","React","styles","React","React","useState","useEffect","styles","CompassIcon","React","useState","useEffect","React","useState","useEffect","React","React","useState","React","useState","focus","React","React","useState","useEffect","_a","React","React","useState","useEffect","RADAR_SIZE","useState","useEffect","_a","React","React","useEffect","useState","useState","useEffect","React","React","useState","useState","styles","React","React","styles","React","React","useState","useState","styles","React","React","styles","React","React","styles","React","React","useState","useState","styles","React","React","useState","useEffect","React","React","React","d","React","SOCIAL_PLATFORMS","React","React","useState","useEffect","_a","tierColors","styles","React","useState","formatDate","React","useState","React","React","React","useState","useState","React","React","React","containerStyle","React","useState","useState","containerStyle","React","React","containerStyle","React","useEffect","useState","useRef","useState","useRef","useEffect","React","useState","useRef","useCallback","useEffect","React","useState","useRef","useCallback","useEffect","React"]}