@c2l2c/backstage-plugin-dora-metrics 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DoraMetricsContent.esm.js","sources":["../../src/components/DoraMetricsContent.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { useTheme } from '@material-ui/core/styles';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { InfoCard } from '@backstage/core-components';\nimport { doraMetricsApiRef } from '../api/types';\nimport type { DoraEnvironment, DoraHistoryPoint, DoraMetrics, DoraMetricValue, PrDetail } from '../api/types';\nimport { RatingBadge } from './ui/badge';\nimport { Card, CardLabel, CardFooter, CardDescription } from './ui/card';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from './ui/select';\nimport { ExternalLink } from 'lucide-react';\n\nconst ANNOTATION_PROJECT_SLUG = 'github.com/project-slug';\n\nconst DATE_RANGE_OPTIONS = [\n { value: '7', label: 'Last 7 days' },\n { value: '14', label: 'Last 14 days' },\n { value: '30', label: 'Last 30 days' },\n { value: '60', label: 'Last 60 days' },\n { value: '90', label: 'Last 90 days' },\n];\n\n// ─── Helpers ───────────────────────────────────────────────────────────────\n\nfunction formatDuration(hours: number): string {\n const totalMinutes = Math.round(hours * 60);\n const d = Math.floor(totalMinutes / (24 * 60));\n const h = Math.floor((totalMinutes % (24 * 60)) / 60);\n const m = totalMinutes % 60;\n if (d > 0) return h > 0 ? `${d}d ${h}h` : `${d}d`;\n if (h > 0) return m > 0 ? `${h}h ${m}m` : `${h}h`;\n return `${m}m`;\n}\n\n// Red → Orange → Yellow → Lime → Green gradient (slowest to fastest)\nconst DURATION_GRADIENT = ['#f87171', '#fb923c', '#fbbf24', '#a3e635', '#4ade80'];\n\nfunction durationColor(index: number, total: number): string {\n if (total <= 1) return DURATION_GRADIENT[0];\n const step = (DURATION_GRADIENT.length - 1) / (total - 1);\n return DURATION_GRADIENT[Math.round(index * step)];\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────────────\n\n// Period-over-period delta — compares last bucket vs second-to-last bucket\nfunction buildDeltaLabel(\n values: number[],\n unit: string,\n lowerIsBetter: boolean,\n): { text: string; tooltip: string; good: boolean } | null {\n if (values.length < 2) return null;\n const curr = values[values.length - 1];\n const prev = values[values.length - 2];\n const diff = curr - prev;\n if (Math.abs(diff) < 0.001) return null;\n const good = lowerIsBetter ? diff < 0 : diff > 0;\n const arrow = diff > 0 ? '↑' : '↓';\n\n const fmt = (v: number) =>\n unit === 'hours' ? formatDuration(v) :\n unit === '%' ? `${Math.round(v * 10) / 10}%` :\n unit === 'per week' ? `${Math.round(v * 10) / 10}/wk` :\n `${Math.round(v * 10) / 10} ${unit}`;\n\n const direction = good ? 'improving' : 'worsening';\n return {\n text: `${arrow} ${fmt(Math.abs(diff))} ${direction}`,\n tooltip: `Latest period: ${fmt(curr)} · Previous period: ${fmt(prev)}\\nEach period = one time bucket (~1/7th of your selected date range)`,\n good,\n };\n}\n\n// ─── DOJO loading overlay ──────────────────────────────────────────────────\n\nconst LOADING_MESSAGES = [\n 'Establishing routes…',\n 'Syncing catalog…',\n 'Loading plugins…',\n 'Fetching PR data…',\n 'Reading entity graph…',\n];\nconst STAGES = ['FETCH', 'PARSE', 'SCORE', 'RENDER'] as const;\nconst FONT_IMPACT = '\"Impact\",\"Haettenschweiler\",\"Franklin Gothic Heavy\",\"Arial Black\",sans-serif';\nconst FONT_MONO = '\"JetBrains Mono\",\"Fira Code\",\"Consolas\",monospace';\n\nfunction DojoLoadingOverlay() {\n const theme = useTheme();\n const isDark = theme.palette.type === 'dark';\n\n const [activeStage, setActiveStage] = useState(0);\n const [msgKey, setMsgKey] = useState(0);\n const [msgIdx, setMsgIdx] = useState(0);\n\n useEffect(() => {\n const st = setInterval(() => setActiveStage(s => (s + 1) % STAGES.length), 800);\n return () => clearInterval(st);\n }, []);\n\n useEffect(() => {\n const mt = setInterval(() => { setMsgIdx(i => (i + 1) % LOADING_MESSAGES.length); setMsgKey(k => k + 1); }, 2200);\n return () => clearInterval(mt);\n }, []);\n\n const textShadow = isDark\n ? '3px 3px 0 #C24E00, 6px 6px 0 #902800, 9px 9px 0 #5A1800, 12px 12px 0 rgba(0,0,0,0.55), 0 0 60px rgba(250,100,0,0.45)'\n : '3px 3px 0 #C24E00, 6px 6px 0 #902800, 9px 9px 0 rgba(80,20,0,0.28), 0 0 32px rgba(250,100,0,0.22)';\n\n const mutedColor = isDark ? '#3f3f46' : '#a1a1aa';\n const subtitleColor = isDark ? '#52525b' : '#71717a';\n const borderColor = isDark ? 'rgba(255,255,255,0.07)' : 'rgba(0,0,0,0.08)';\n\n return (\n <>\n {/* Frosted glass backdrop — blurs whatever is behind */}\n <div aria-hidden style={{\n position: 'fixed', inset: 0, zIndex: 900,\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n background: isDark ? 'rgba(6,6,9,0.65)' : 'rgba(253,252,251,0.70)',\n }} />\n\n {/* Centered card */}\n <div style={{\n position: 'fixed', zIndex: 901,\n top: '50%', left: '50%',\n transform: 'translateX(-50%) translateY(-50%)',\n display: 'flex', flexDirection: 'column', alignItems: 'center',\n padding: '48px 56px 40px',\n borderRadius: 20,\n background: isDark ? 'rgba(9,9,12,0.82)' : 'rgba(255,255,255,0.88)',\n border: `1px solid ${borderColor}`,\n boxShadow: isDark\n ? '0 0 0 1px rgba(250,100,0,0.06), 0 32px 80px rgba(0,0,0,0.65)'\n : '0 32px 80px rgba(0,0,0,0.12)',\n backdropFilter: 'blur(20px)',\n WebkitBackdropFilter: 'blur(20px)',\n animation: 'dlsCardIn 0.35s cubic-bezier(0.34,1.2,0.64,1) both',\n overflow: 'visible',\n }}>\n\n {/* Breathing ambient glow — inside card */}\n <div aria-hidden style={{\n position: 'absolute', width: 500, height: 360,\n left: '50%', top: '50%',\n transform: 'translateX(-50%) translateY(-50%)',\n background: `radial-gradient(ellipse at center, ${isDark ? 'rgba(250,100,0,0.08)' : 'rgba(250,100,0,0.05)'} 0%, transparent 70%)`,\n animation: 'dlsBreath 3.2s ease-in-out infinite',\n pointerEvents: 'none', borderRadius: 20,\n }} />\n\n {/* FleetPanda wordmark */}\n <span style={{ fontFamily: 'Inter,system-ui,sans-serif', fontSize: 11, fontWeight: 700,\n letterSpacing: '0.18em', textTransform: 'uppercase', marginBottom: 6,\n color: isDark ? 'rgba(250,100,0,0.55)' : 'rgba(180,70,0,0.55)',\n animation: 'dlsFadeUp 0.5s ease both' }}>\n FleetPanda\n </span>\n\n {/* DOJO */}\n <div style={{ display: 'flex', lineHeight: 1, marginBottom: 6 }}>\n {['D','O','J','O'].map((letter, i) => (\n <span key={i} style={{\n fontFamily: FONT_IMPACT, fontWeight: 900, fontSize: 110,\n color: '#FA6400', letterSpacing: '0.04em', display: 'inline-block',\n transform: 'skewX(-6deg)', textShadow,\n WebkitTextStroke: '0.5px #C24E00',\n animation: `dlsLetterDrop 0.6s cubic-bezier(0.34,1.45,0.64,1) ${i * 0.1}s both`,\n }}>\n {letter}\n </span>\n ))}\n </div>\n\n {/* Subtitle */}\n <span style={{ fontFamily: 'Inter,system-ui,sans-serif', fontSize: 13, fontWeight: 400,\n letterSpacing: '0.06em', color: subtitleColor, marginBottom: 32,\n animation: 'dlsFadeUp 0.4s ease 0.55s both' }}>\n Developer Portal\n </span>\n\n {/* Pipeline stages */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 0, marginBottom: 20, animation: 'dlsFadeUp 0.4s ease 0.7s both' }}>\n {STAGES.map((stage, i) => {\n const isActive = i === activeStage;\n const isComplete = i < activeStage;\n return (\n <div key={stage} style={{ display: 'flex', alignItems: 'center', gap: 0 }}>\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 5, width: 64 }}>\n <div style={{ position: 'relative', width: 12, height: 12 }}>\n {isActive && (\n <div style={{ position: 'absolute', inset: -6, borderRadius: '50%',\n border: '1.5px solid rgba(250,100,0,0.5)', animation: 'dlsPulse 1s ease-out infinite' }} />\n )}\n <div style={{\n width: 12, height: 12, borderRadius: '50%',\n background: (isActive || isComplete) ? '#FA6400' : (isDark ? '#27272a' : '#e4e4e7'),\n border: `2px solid ${(isActive || isComplete) ? '#C24E00' : (isDark ? '#3f3f46' : '#d4d4d8')}`,\n boxShadow: isActive ? '0 0 14px rgba(250,100,0,0.7)' : 'none',\n transition: 'background 0.3s, box-shadow 0.3s',\n }} />\n </div>\n <span style={{ fontFamily: 'Inter,system-ui,sans-serif', fontSize: 8, fontWeight: 700,\n letterSpacing: '0.12em', textTransform: 'uppercase',\n color: isActive ? '#FA6400' : isComplete ? mutedColor : mutedColor,\n transition: 'color 0.3s' }}>\n {stage}\n </span>\n </div>\n {i < STAGES.length - 1 && (\n <div style={{ width: 32, height: 2, marginBottom: 14, position: 'relative', overflow: 'hidden',\n background: isDark ? '#27272a' : '#e4e4e7', borderRadius: 2 }}>\n <div style={{\n position: 'absolute', inset: 0, borderRadius: 2, background: '#FA6400',\n transformOrigin: 'left center',\n transform: `scaleX(${i < activeStage ? 1 : isActive ? 0.5 : 0})`,\n transition: 'transform 0.4s ease',\n }} />\n </div>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Status message */}\n <span key={msgKey} style={{ fontFamily: FONT_MONO, fontSize: 11,\n color: mutedColor, letterSpacing: '0.04em', animation: 'dlsFadeUp 0.3s ease both' }}>\n {LOADING_MESSAGES[msgIdx]}\n </span>\n\n </div>{/* end card */}\n\n <style>{`\n @keyframes dlsLetterDrop {\n from { opacity: 0; transform: skewX(-6deg) translateY(-32px) scale(1.1); }\n 65% { transform: skewX(-6deg) translateY(6px) scale(0.95); }\n to { opacity: 1; transform: skewX(-6deg) translateY(0) scale(1); }\n }\n @keyframes dlsFadeUp {\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n }\n @keyframes dlsBreath {\n 0%, 100% { transform: translateX(-50%) translateY(-50%) scale(0.85); opacity: 0.6; }\n 50% { transform: translateX(-50%) translateY(-50%) scale(1.2); opacity: 1; }\n }\n @keyframes dlsPulse {\n from { transform: scale(0.6); opacity: 0.9; }\n to { transform: scale(2.2); opacity: 0; }\n }\n @keyframes dlsCardIn {\n from { opacity: 0; transform: translateX(-50%) translateY(-46%); }\n to { opacity: 1; transform: translateX(-50%) translateY(-50%); }\n }\n `}</style>\n </>\n );\n}\n\n// ─── Compact sparkline (with hover tooltip + date axis) ────────────────────\n\nfunction CompactSparkline({\n values,\n weekLabels,\n color,\n type,\n formatValue,\n height = 36,\n}: {\n values: number[];\n weekLabels: string[];\n color: string;\n type: 'bar' | 'line';\n formatValue: (v: number) => string;\n height?: number;\n}) {\n const theme = useTheme();\n const isDark = theme.palette.type === 'dark';\n const [hoverIdx, setHoverIdx] = useState<number | null>(null);\n\n const VW = 400; // viewBox units\n const mutedBorder = isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.06)';\n const tooltipBg = isDark ? '#1c1c20' : '#ffffff';\n const tooltipBdr = isDark ? '#3f3f46' : '#e4e4e7';\n const tooltipText = isDark ? '#ededef' : '#111114';\n const font = 'Inter,system-ui,sans-serif';\n\n const handleMouseMove = (e: React.MouseEvent<SVGSVGElement>) => {\n const rect = e.currentTarget.getBoundingClientRect();\n const relX = (e.clientX - rect.left) / rect.width;\n setHoverIdx(Math.max(0, Math.min(values.length - 1, Math.round(relX * (values.length - 1)))));\n };\n\n if (type === 'bar') {\n const max = Math.max(...values, 1);\n const gap = 4;\n const barW = (VW - gap * (values.length - 1)) / values.length;\n\n const hoverX = hoverIdx !== null\n ? hoverIdx * (barW + gap) + barW / 2\n : null;\n const tooltipX = hoverX !== null ? Math.min(hoverX - 34, VW - 72) : 0;\n\n return (\n <div>\n <svg viewBox={`0 0 ${VW} ${height}`} width=\"100%\" style={{ display: 'block', overflow: 'visible' }}\n onMouseMove={handleMouseMove} onMouseLeave={() => setHoverIdx(null)}>\n {values.map((v, i) => {\n const h = Math.max(2, (v / max) * (height - 4));\n return (\n <rect key={i} x={i * (barW + gap)} y={height - h} width={barW} height={h} rx={1.5}\n fill={color} opacity={i === hoverIdx ? 1 : 0.3 + (i / values.length) * 0.55} />\n );\n })}\n <line x1={0} y1={height - 0.5} x2={VW} y2={height - 0.5} stroke={mutedBorder} strokeWidth={1} />\n {hoverIdx !== null && hoverX !== null && (\n <>\n <rect x={tooltipX} y={2} width={72} height={22} rx={4} fill={tooltipBg} stroke={tooltipBdr} strokeWidth={1} />\n <text x={tooltipX + 36} y={17} textAnchor=\"middle\" fill={tooltipText} fontSize={9} fontWeight={600} fontFamily={font}>\n {weekLabels[hoverIdx]}: {formatValue(values[hoverIdx])}\n </text>\n </>\n )}\n </svg>\n <div style={{ display: 'flex', justifyContent: 'space-between', marginTop: 3 }}>\n <span style={{ fontSize: 9, color: isDark ? '#3f3f46' : '#a1a1aa' }}>{weekLabels[0]}</span>\n <span style={{ fontSize: 9, color: isDark ? '#3f3f46' : '#a1a1aa' }}>{weekLabels[weekLabels.length - 1]}</span>\n </div>\n </div>\n );\n }\n\n if (values.length < 2) return null;\n const max = Math.max(...values, 0.01);\n const min = Math.min(...values);\n const range = max - min || max || 1;\n const pad = 3;\n const pts = values.map((v, i): [number, number] => [\n (i / (values.length - 1)) * (VW - pad * 2) + pad,\n (height - pad * 2) - ((v - min) / range) * (height - pad * 2 - 2) + pad,\n ]);\n const d = pts.map(([x, y], i) => `${i === 0 ? 'M' : 'L'}${x.toFixed(1)},${y.toFixed(1)}`).join(' ');\n const area = `${d} L${pts[pts.length-1][0]},${height} L${pts[0][0]},${height} Z`;\n const hoverPt = hoverIdx !== null ? pts[hoverIdx] : null;\n const tooltipX2 = hoverPt ? Math.min(hoverPt[0] - 34, VW - 72) : 0;\n\n return (\n <div>\n <svg viewBox={`0 0 ${VW} ${height}`} width=\"100%\" style={{ display: 'block', overflow: 'visible' }}\n onMouseMove={handleMouseMove} onMouseLeave={() => setHoverIdx(null)}>\n <path d={area} fill={color} opacity={0.07} />\n <path d={d} fill=\"none\" stroke={color} strokeWidth={1.5} strokeLinejoin=\"round\" strokeLinecap=\"round\" />\n {pts.map(([x, y], i) => (\n <circle key={i} cx={x} cy={y} r={i === hoverIdx ? 3.5 : i === pts.length - 1 ? 2.5 : 0} fill={color} />\n ))}\n <line x1={0} y1={height - 0.5} x2={VW} y2={height - 0.5} stroke={mutedBorder} strokeWidth={1} />\n {hoverPt && hoverIdx !== null && (\n <>\n <line x1={hoverPt[0]} y1={0} x2={hoverPt[0]} y2={height} stroke={color} strokeWidth={1} strokeDasharray=\"2 2\" opacity={0.4} />\n <rect x={tooltipX2} y={2} width={72} height={22} rx={4} fill={tooltipBg} stroke={tooltipBdr} strokeWidth={1} />\n <text x={tooltipX2 + 36} y={17} textAnchor=\"middle\" fill={tooltipText} fontSize={9} fontWeight={600} fontFamily={font}>\n {weekLabels[hoverIdx]}: {formatValue(values[hoverIdx])}\n </text>\n </>\n )}\n </svg>\n <div style={{ display: 'flex', justifyContent: 'space-between', marginTop: 3 }}>\n <span style={{ fontSize: 9, color: isDark ? '#3f3f46' : '#a1a1aa' }}>{weekLabels[0]}</span>\n <span style={{ fontSize: 9, color: isDark ? '#3f3f46' : '#a1a1aa' }}>{weekLabels[weekLabels.length - 1]}</span>\n </div>\n </div>\n );\n}\n\n// ─── Detailed interactive chart ────────────────────────────────────────────\n\ninterface ChartTooltipState {\n x: number;\n y: number;\n primary: string;\n secondary?: string;\n}\n\nfunction DetailedChart({\n values,\n weekLabels,\n bucketMidMs,\n color,\n type,\n formatValue,\n prs,\n days,\n hoveredPrNumber,\n onPrHover,\n}: {\n values: number[];\n weekLabels: string[];\n bucketMidMs: number[];\n color: string;\n type: 'bar' | 'line';\n formatValue: (v: number) => string;\n prs?: PrDetail[];\n days: number;\n hoveredPrNumber?: number | null;\n onPrHover?: (num: number | null) => void;\n}) {\n const theme = useTheme();\n const isDark = theme.palette.type === 'dark';\n const [hoverIdx, setHoverIdx] = useState<number | null>(null);\n const [tooltip, setTooltip] = useState<ChartTooltipState | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const W = 800, H = 260;\n const PAD = { top: 16, right: 16, bottom: 36, left: 56 };\n const cW = W - PAD.left - PAD.right;\n const cH = H - PAD.top - PAD.bottom;\n\n // Y scale: based on bucket values only so the trend line is clearly readable.\n // PR dots that fall outside this range are rendered clamped to chart area.\n const dataMax = Math.max(...values, 0.01);\n const dataMin = type === 'line' ? Math.min(...values, 0) : 0;\n const dataRange = dataMax - dataMin || dataMax || 1;\n const yScale = (v: number) => cH - ((v - dataMin) / dataRange) * cH;\n\n // Shared timestamp-based x-axis\n const cutoffMs = Date.now() - days * 24 * 60 * 60 * 1000;\n const rangeMs = days * 24 * 60 * 60 * 1000;\n const xTime = (ms: number) => Math.max(0, Math.min(cW, ((ms - cutoffMs) / rangeMs) * cW));\n\n const xIdx = (i: number) => bucketMidMs.length === values.length\n ? xTime(bucketMidMs[i])\n : (values.length > 1 ? (i / (values.length - 1)) * cW : cW / 2);\n\n const pts: [number, number][] = values.map((v, i) => [PAD.left + xIdx(i), PAD.top + yScale(v)]);\n const linePath = pts.map(([x, y], i) => `${i === 0 ? 'M' : 'L'}${x.toFixed(1)},${y.toFixed(1)}`).join(' ');\n const areaPath = pts.length > 1\n ? `${linePath} L${pts[pts.length-1][0]},${PAD.top+cH} L${pts[0][0]},${PAD.top+cH} Z`\n : '';\n\n const gap = 6;\n const barW = values.length > 1 ? (cW - gap * (values.length - 1)) / values.length : cW;\n\n const yTicks = [0, 0.25, 0.5, 0.75, 1].map(t => dataMin + t * dataRange);\n const gridColor = isDark ? 'rgba(255,255,255,0.05)' : 'rgba(0,0,0,0.05)';\n const axisColor = isDark ? '#3f3f46' : '#d4d4d8';\n const labelColor = isDark ? '#52525b' : '#a1a1aa';\n const font = 'Inter,system-ui,sans-serif';\n const gradId = `dg_${color.replace('#','')}`;\n\n // Find the nearest bucket index for a given timestamp\n const nearestBucket = (ms: number): number => {\n if (bucketMidMs.length === 0) return 0;\n let best = 0, bestDist = Infinity;\n bucketMidMs.forEach((mid, i) => {\n const d = Math.abs(ms - mid);\n if (d < bestDist) { bestDist = d; best = i; }\n });\n return best;\n };\n\n const handleSvgMouseMove = (e: React.MouseEvent<SVGSVGElement>) => {\n const rect = e.currentTarget.getBoundingClientRect();\n const relX = (e.clientX - rect.left - PAD.left * (rect.width / W)) / (rect.width * cW / W);\n const idx = Math.max(0, Math.min(values.length - 1, Math.round(relX * (values.length - 1))));\n setHoverIdx(idx);\n const cRect = containerRef.current?.getBoundingClientRect();\n const x = cRect ? e.clientX - cRect.left : 0;\n const y = cRect ? e.clientY - cRect.top : 0;\n setTooltip({ x, y, primary: formatValue(values[idx]), secondary: weekLabels[idx] });\n };\n\n return (\n <div ref={containerRef} style={{ position: 'relative' }}>\n <svg viewBox={`0 0 ${W} ${H}`} width=\"100%\" style={{ display: 'block' }}\n onMouseMove={handleSvgMouseMove}\n onMouseLeave={() => { setHoverIdx(null); setTooltip(null); }}>\n <defs>\n <linearGradient id={gradId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity={0.28} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0} />\n </linearGradient>\n {/* Clip PR dots to the chart area */}\n <clipPath id={`prClip_${gradId}`}>\n <rect x={PAD.left} y={PAD.top - 8} width={cW} height={cH + 16} />\n </clipPath>\n </defs>\n\n {/* Grid + Y-axis */}\n {yTicks.map((v, i) => {\n const y = PAD.top + yScale(v);\n return (\n <g key={i}>\n {i > 0 && <line x1={PAD.left} y1={y} x2={PAD.left+cW} y2={y} stroke={gridColor} strokeWidth={1} strokeDasharray=\"3 4\" />}\n <text x={PAD.left - 6} y={y + 4} textAnchor=\"end\" fill={labelColor} fontSize={10} fontFamily={font}>\n {formatValue(v)}\n </text>\n </g>\n );\n })}\n <line x1={PAD.left} y1={PAD.top+cH} x2={PAD.left+cW} y2={PAD.top+cH} stroke={axisColor} strokeWidth={1} />\n\n {/* Chart body */}\n {type === 'bar' ? (\n values.map((v, i) => {\n const bH = Math.max(2, ((v - dataMin) / dataRange) * cH);\n const x = PAD.left + i * (barW + gap);\n return (\n <rect key={i} x={x} y={PAD.top+cH-bH} width={barW} height={bH} rx={3}\n fill={color} opacity={i === hoverIdx ? 0.95 : 0.4 + (i / Math.max(values.length - 1, 1)) * 0.45} />\n );\n })\n ) : (\n <>\n {areaPath && <path d={areaPath} fill={`url(#${gradId})`} />}\n <path d={linePath} fill=\"none\" stroke={color} strokeWidth={2.5} strokeLinejoin=\"round\" strokeLinecap=\"round\" />\n {pts.map(([x, y], i) => (\n <circle key={i} cx={x} cy={y}\n r={i === hoverIdx ? 5.5 : 4}\n fill={isDark ? '#0f0f12' : '#ffffff'} stroke={color}\n strokeWidth={i === hoverIdx ? 2.5 : 1.5} />\n ))}\n </>\n )}\n\n {/* PR data-point dots — x at bucket midpoint, y at actual duration (clamped to chart) */}\n {prs && type === 'line' && (\n <g clipPath={`url(#prClip_${gradId})`}>\n {prs.map((pr, dotIdx) => {\n const mergedMs = new Date(pr.mergedAt).getTime();\n const bIdx = nearestBucket(mergedMs);\n // Small deterministic jitter within the bucket to avoid overlap\n const jitter = ((pr.number * 17 + dotIdx * 11) % 13 - 6) * 5;\n const px = PAD.left + xIdx(bIdx) + jitter;\n // Clamp y: PR may be faster or slower than bucket avg; always visible\n const rawPy = PAD.top + yScale(pr.durationHours);\n const py = Math.max(PAD.top + 4, Math.min(PAD.top + cH - 4, rawPy));\n const isHov = pr.number === hoveredPrNumber;\n\n // Thin connector from dot to the bucket trend point\n const trendPt = pts[bIdx];\n\n return (\n <g key={pr.number} style={{ cursor: 'pointer' }}\n onMouseEnter={e => {\n e.stopPropagation();\n const cRect = containerRef.current?.getBoundingClientRect();\n const x = cRect ? e.clientX - cRect.left : 0;\n const y = cRect ? e.clientY - cRect.top : 0;\n setTooltip({ x, y,\n primary: `#${pr.number}: ${pr.title}`,\n secondary: `${formatValue(pr.durationHours)} · ${new Date(pr.mergedAt).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}` });\n onPrHover?.(pr.number);\n }}\n onMouseLeave={() => { setTooltip(null); onPrHover?.(null); }}>\n {trendPt && (\n <line x1={px} y1={py} x2={trendPt[0]} y2={trendPt[1]}\n stroke={color} strokeWidth={isHov ? 1 : 0.5}\n strokeDasharray=\"2 3\" opacity={isHov ? 0.5 : 0.2} />\n )}\n <circle cx={px} cy={py} r={isHov ? 11 : 7} fill={color} opacity={isHov ? 0.2 : 0.1} />\n <circle cx={px} cy={py} r={isHov ? 5.5 : 3.5}\n fill={isHov ? color : (isDark ? '#1a1a20' : '#fff')}\n stroke={color} strokeWidth={isHov ? 0 : 1.5}\n opacity={isHov ? 1 : 0.8} />\n </g>\n );\n })}\n </g>\n )}\n\n {/* Hover crosshair */}\n {hoverIdx !== null && type === 'line' && pts[hoverIdx] && (\n <>\n <line x1={pts[hoverIdx][0]} y1={PAD.top} x2={pts[hoverIdx][0]} y2={PAD.top+cH}\n stroke={color} strokeWidth={1} strokeDasharray=\"3 3\" opacity={0.3} />\n <line x1={PAD.left} y1={pts[hoverIdx][1]} x2={PAD.left+cW} y2={pts[hoverIdx][1]}\n stroke={color} strokeWidth={1} strokeDasharray=\"3 3\" opacity={0.2} />\n </>\n )}\n\n {/* X-axis labels */}\n {weekLabels.map((lbl, i) => {\n const total = weekLabels.length;\n const step = Math.max(1, Math.floor(total / 5));\n if (i !== 0 && i !== total - 1 && i % step !== 0) return null;\n const x = type === 'bar'\n ? PAD.left + i * (barW + gap) + barW / 2\n : PAD.left + xIdx(i);\n return (\n <text key={i} x={x} y={H - 8} textAnchor=\"middle\" fill={labelColor} fontSize={10} fontFamily={font}>\n {lbl}\n </text>\n );\n })}\n </svg>\n\n {/* Absolute tooltip — positioned relative to the chart container */}\n {tooltip && (() => {\n const TW = 220;\n const cW2 = containerRef.current?.offsetWidth ?? 800;\n const nearRight = tooltip.x + TW + 12 > cW2;\n return (\n <div style={{\n position: 'absolute',\n left: nearRight ? tooltip.x - TW - 8 : tooltip.x + 8,\n top: tooltip.y - 36,\n zIndex: 9999, pointerEvents: 'none',\n background: isDark ? '#18181b' : '#ffffff',\n border: `1px solid ${isDark ? '#3f3f46' : '#e4e4e7'}`,\n borderRadius: 7, padding: '7px 10px',\n boxShadow: isDark ? '0 6px 20px rgba(0,0,0,0.55)' : '0 6px 20px rgba(0,0,0,0.10)',\n width: TW,\n }}>\n <div style={{ fontSize: 12, fontWeight: 600, color: isDark ? '#ededef' : '#111114',\n fontFamily: font, lineHeight: 1.4 }}>\n {tooltip.primary}\n </div>\n {tooltip.secondary && (\n <div style={{ fontSize: 11, color: isDark ? '#71717a' : '#a1a1aa', fontFamily: font, marginTop: 2 }}>\n {tooltip.secondary}\n </div>\n )}\n </div>\n );\n })()}\n </div>\n );\n}\n\n// ─── Detailed overlay ──────────────────────────────────────────────────────\n\ninterface ExpandedCardData {\n title: string;\n metric: DoraMetricValue;\n description: string;\n lowerIsBetter: boolean;\n sparklineValues: number[];\n sparklineType: 'bar' | 'line';\n sparklineColor: string;\n weekLabels: string[];\n bucketMidMs: number[];\n prs?: PrDetail[];\n}\n\nfunction DetailedOverlay({\n data,\n days,\n onClose,\n}: {\n data: ExpandedCardData;\n days: number;\n onClose: () => void;\n}) {\n const theme = useTheme();\n const isDark = theme.palette.type === 'dark';\n const [hoveredPrNumber, setHoveredPrNumber] = useState<number | null>(null);\n const prRowRefs = useRef<Map<number, HTMLDivElement>>(new Map());\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [onClose]);\n\n // Auto-scroll to the highlighted PR row when hover comes from the chart\n useEffect(() => {\n if (hoveredPrNumber !== null) {\n const el = prRowRefs.current.get(hoveredPrNumber);\n if (el) el.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, [hoveredPrNumber]);\n\n const { title, metric, description, lowerIsBetter, sparklineValues, sparklineType, sparklineColor, weekLabels, bucketMidMs, prs } = data;\n const isDeployFreq = sparklineType === 'bar';\n const displayValue = metric.unit === 'hours' ? formatDuration(metric.value) : String(metric.value);\n const displayUnit = metric.unit === 'hours' ? '' : metric.unit;\n const formatVal = (v: number) => metric.unit === 'hours' ? formatDuration(v) : `${Math.round(v * 10) / 10}`;\n const borderColor = isDark ? '#27272a' : '#e4e4e7';\n const mutedColor = isDark ? '#52525b' : '#a1a1aa';\n const targetLabel = lowerIsBetter\n ? `Target: < ${metric.unit === 'hours' ? formatDuration(metric.target) : metric.target} ${displayUnit}`\n : `Target: ≥ ${metric.target} ${displayUnit}`;\n\n // Group deployment PRs by date (for the date table)\n const prsByDate = isDeployFreq && prs ? prs.reduce((acc, pr) => {\n const date = new Date(pr.mergedAt).toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' });\n if (!acc[date]) acc[date] = [];\n acc[date].push(pr);\n return acc;\n }, {} as Record<string, PrDetail[]>) : {};\n const sortedDates = Object.keys(prsByDate).sort(\n (a, b) => new Date(prsByDate[b][0].mergedAt).getTime() - new Date(prsByDate[a][0].mergedAt).getTime()\n );\n\n return (\n <>\n {/* Backdrop */}\n <div onClick={onClose} style={{\n position: 'fixed', inset: 0, zIndex: 499,\n background: isDark ? 'rgba(0,0,0,0.6)' : 'rgba(0,0,0,0.3)',\n backdropFilter: 'blur(4px)',\n }} />\n\n {/* Panel */}\n <div style={{\n position: 'fixed',\n top: '50%', left: '50%',\n transform: 'translateX(-50%) translateY(-50%)',\n width: 'min(92vw, 960px)',\n maxHeight: 'calc(100vh - 80px)',\n zIndex: 500,\n background: isDark ? '#09090c' : '#fafafa',\n border: `1px solid ${borderColor}`,\n borderRadius: 14,\n display: 'flex', flexDirection: 'column',\n overflow: 'hidden',\n animation: 'detailExpandIn 0.2s cubic-bezier(0.34,1.2,0.64,1)',\n boxShadow: isDark ? '0 24px 64px rgba(0,0,0,0.7)' : '0 24px 64px rgba(0,0,0,0.18)',\n }}>\n {/* Header */}\n <div style={{\n display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start',\n padding: '20px 24px 16px',\n borderBottom: `1px solid ${borderColor}`,\n flexShrink: 0,\n }}>\n <div>\n <div style={{ fontSize: 10, fontWeight: 700, color: mutedColor, textTransform: 'uppercase', letterSpacing: '0.12em', marginBottom: 8 }}>\n {title} · {weekLabels[0]} – {weekLabels[weekLabels.length - 1]}\n </div>\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 8, flexWrap: 'wrap' }}>\n <span style={{ fontSize: 52, fontWeight: 700, color: theme.palette.text.primary, lineHeight: 1, letterSpacing: '-0.02em' }}>\n {displayValue}\n </span>\n {displayUnit && (\n <span style={{ fontSize: 18, color: mutedColor, fontWeight: 500 }}>{displayUnit}</span>\n )}\n <RatingBadge rating={metric.rating} />\n </div>\n <div style={{ fontSize: 12, color: mutedColor, marginTop: 6 }}>\n {description} · <span style={{ fontStyle: 'italic' }}>{targetLabel}</span>\n </div>\n </div>\n <button type=\"button\" onClick={onClose} style={{\n all: 'unset', cursor: 'pointer', width: 30, height: 30,\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n borderRadius: '50%', background: isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.06)',\n color: mutedColor, fontSize: 18, fontWeight: 300, transition: 'all 0.12s', flexShrink: 0,\n }}\n onMouseEnter={e => { (e.currentTarget as HTMLElement).style.background = isDark ? 'rgba(255,255,255,0.12)' : 'rgba(0,0,0,0.1)'; }}\n onMouseLeave={e => { (e.currentTarget as HTMLElement).style.background = isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.06)'; }}>\n ✕\n </button>\n </div>\n\n {/* Body — scrollable */}\n <div style={{ flex: 1, overflow: 'auto', padding: '20px 24px', display: 'flex', flexDirection: 'column', gap: 20 }}>\n\n {/* Chart */}\n {weekLabels.length >= 2 ? (\n <DetailedChart\n values={sparklineValues} weekLabels={weekLabels}\n bucketMidMs={bucketMidMs}\n color={sparklineColor} type={sparklineType}\n formatValue={formatVal} prs={isDeployFreq ? undefined : prs} days={days}\n hoveredPrNumber={hoveredPrNumber} onPrHover={setHoveredPrNumber}\n />\n ) : (\n <div style={{ color: mutedColor, fontSize: 13, textAlign: 'center', padding: '48px 0' }}>\n Not enough data — select a wider date range.\n </div>\n )}\n\n {/* === Deployment Frequency: PRs grouped by date === */}\n {isDeployFreq && prs && prs.length > 0 && (\n <div>\n <div style={{ fontSize: 10, fontWeight: 700, color: mutedColor, textTransform: 'uppercase',\n letterSpacing: '0.12em', marginBottom: 12,\n borderTop: `1px solid ${borderColor}`, paddingTop: 12 }}>\n All deployments · {prs.length} PRs merged\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n {sortedDates.map(date => (\n <div key={date}>\n {/* Date header */}\n <div style={{\n fontSize: 11, fontWeight: 700, color: sparklineColor,\n marginBottom: 6, display: 'flex', alignItems: 'center', gap: 8,\n }}>\n <span>{date}</span>\n <span style={{ color: mutedColor, fontWeight: 500 }}>· {prsByDate[date].length} PR{prsByDate[date].length > 1 ? 's' : ''}</span>\n </div>\n {/* PR rows */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, paddingLeft: 12,\n borderLeft: `2px solid ${sparklineColor}22` }}>\n {prsByDate[date].map(pr => (\n <div key={pr.number} style={{\n display: 'flex', flexDirection: 'column', gap: 5,\n padding: '7px 10px', borderRadius: 7,\n background: isDark ? '#0d0d10' : '#f7f7f9',\n border: `1px solid ${borderColor}`,\n transition: 'background 0.12s',\n }}>\n {/* Row 1: number + title + lead time + link */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <span style={{ fontSize: 10, fontWeight: 700, color: mutedColor, flexShrink: 0, minWidth: 36 }}>\n #{pr.number}\n </span>\n <span style={{ fontSize: 12, color: theme.palette.text.primary, flex: 1,\n whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }} title={pr.title}>\n {pr.title}\n </span>\n <span style={{ fontSize: 10, color: mutedColor, flexShrink: 0 }}>\n {formatDuration(pr.durationHours)} lead\n </span>\n <a href={pr.url} target=\"_blank\" rel=\"noopener noreferrer\"\n style={{ color: mutedColor, flexShrink: 0 }}>\n <ExternalLink size={11} />\n </a>\n </div>\n {/* Row 2: author badge */}\n {pr.author && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 5 }}>\n {pr.authorAvatar ? (\n <img src={pr.authorAvatar} alt={pr.author}\n style={{ width: 16, height: 16, borderRadius: '50%', flexShrink: 0,\n border: `1px solid ${isDark ? '#3f3f46' : '#e4e4e7'}` }} />\n ) : (\n <div style={{ width: 16, height: 16, borderRadius: '50%', flexShrink: 0,\n background: isDark ? '#27272a' : '#e4e4e7',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n fontSize: 8, fontWeight: 700, color: mutedColor }}>\n {pr.author[0].toUpperCase()}\n </div>\n )}\n <a href={`https://github.com/${pr.author}`} target=\"_blank\" rel=\"noopener noreferrer\"\n style={{ fontSize: 10, fontWeight: 500, color: mutedColor,\n textDecoration: 'none', letterSpacing: '0.01em' }}\n onMouseEnter={e => { (e.currentTarget as HTMLElement).style.color = '#FA6400'; }}\n onMouseLeave={e => { (e.currentTarget as HTMLElement).style.color = mutedColor; }}>\n @{pr.author}\n </a>\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* === Lead Time / MTTR: duration-ranked PR list with hover linking === */}\n {!isDeployFreq && prs && prs.length > 0 && (\n <div>\n <div style={{ fontSize: 10, fontWeight: 700, color: mutedColor, textTransform: 'uppercase',\n letterSpacing: '0.12em', marginBottom: 10,\n borderTop: `1px solid ${borderColor}`, paddingTop: 12 }}>\n {title.toLowerCase().includes('restore') ? 'Slowest Hotfix PRs' : 'Slowest PRs'}\n {' '}· hover a row to highlight on chart\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {prs.map((pr, i) => {\n const col = durationColor(i, prs.length);\n const maxDur = prs[0].durationHours;\n const barPct = maxDur > 0 ? (pr.durationHours / maxDur) * 100 : 0;\n const isHov = pr.number === hoveredPrNumber;\n return (\n <div key={pr.number}\n ref={(el) => {\n if (el) prRowRefs.current.set(pr.number, el);\n else prRowRefs.current.delete(pr.number);\n }}\n onMouseEnter={() => setHoveredPrNumber(pr.number)}\n onMouseLeave={() => setHoveredPrNumber(null)}\n style={{\n padding: '8px 12px', borderRadius: 8,\n background: isHov\n ? (isDark ? '#18181f' : '#f0f0ff')\n : (isDark ? '#111114' : '#f4f4f6'),\n border: `1px solid ${isHov ? sparklineColor + '55' : borderColor}`,\n display: 'flex', flexDirection: 'column', gap: 5,\n transition: 'background 0.12s, border-color 0.12s',\n cursor: 'default',\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, minWidth: 0 }}>\n <span style={{ fontSize: 10, fontWeight: 700, color: col, flexShrink: 0 }}>#{pr.number}</span>\n <span style={{ fontSize: 12, color: theme.palette.text.primary, flex: 1,\n whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }} title={pr.title}>\n {pr.title}\n </span>\n <span style={{ fontSize: 10, color: mutedColor, flexShrink: 0 }}>\n {new Date(pr.mergedAt).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}\n </span>\n <a href={pr.url} target=\"_blank\" rel=\"noopener noreferrer\"\n style={{ color: mutedColor, flexShrink: 0, transition: 'color 0.12s' }}>\n <ExternalLink size={11} />\n </a>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <AnimatedBar widthPct={barPct} color={col} />\n <span style={{ fontSize: 11, fontWeight: 700, color: col, minWidth: 52, textAlign: 'right', flexShrink: 0 }}>\n {formatDuration(pr.durationHours)}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n )}\n </div>\n </div>\n <style>{`\n @keyframes detailExpandIn {\n from { opacity: 0; transform: translateX(-50%) translateY(-46%); }\n to { opacity: 1; transform: translateX(-50%) translateY(-50%); }\n }\n `}</style>\n </>\n );\n}\n\n// ─── Animated bar ──────────────────────────────────────────────────────────\n\nfunction AnimatedBar({ widthPct, color }: { widthPct: number; color: string }) {\n const [width, setWidth] = useState(0);\n const ref = useRef<HTMLDivElement>(null);\n const theme = useTheme();\n const isDark = theme.palette.type === 'dark';\n\n useEffect(() => {\n const timer = setTimeout(() => setWidth(widthPct), 80);\n return () => clearTimeout(timer);\n }, [widthPct]);\n\n return (\n <div\n ref={ref}\n style={{\n background: isDark ? '#1a1a1e' : '#f0f0f2',\n borderRadius: 4,\n height: 5,\n overflow: 'hidden',\n flex: 1,\n minWidth: 40,\n }}\n >\n <div\n style={{\n height: '100%',\n width: `${width}%`,\n background: color,\n borderRadius: 4,\n transition: 'width 0.55s cubic-bezier(0.4, 0, 0.2, 1)',\n boxShadow: `0 0 6px ${color}88`,\n }}\n />\n </div>\n );\n}\n\n// ─── Metric cards ──────────────────────────────────────────────────────────\n\nfunction MetricCard({\n title,\n metric,\n description,\n lowerIsBetter = false,\n sparklineData,\n sparklineType = 'line',\n sparklineColor,\n weekLabels,\n onExpand,\n}: {\n title: string;\n metric: DoraMetricValue;\n description: string;\n lowerIsBetter?: boolean;\n sparklineData?: number[];\n sparklineType?: 'bar' | 'line';\n sparklineColor?: string;\n weekLabels?: string[];\n onExpand?: () => void;\n}) {\n const theme = useTheme();\n const isDark = theme.palette.type === 'dark';\n const [hovered, setHovered] = useState(false);\n\n const displayValue = metric.unit === 'hours' ? formatDuration(metric.value) : metric.value;\n const displayUnit = metric.unit === 'hours' ? '' : metric.unit;\n const targetValue = metric.unit === 'hours' ? formatDuration(metric.target) : metric.target;\n const targetLabel = lowerIsBetter\n ? `Target: < ${targetValue} ${displayUnit}`.trim()\n : `Target: ≥ ${targetValue} ${displayUnit}`.trim();\n\n const hasSparkline = sparklineData && sparklineData.length >= 2 && weekLabels && weekLabels.length >= 2;\n const delta = hasSparkline ? buildDeltaLabel(sparklineData!, metric.unit, lowerIsBetter) : null;\n const formatVal = (v: number) => metric.unit === 'hours' ? formatDuration(v) : `${Math.round(v * 10) / 10}`;\n\n return (\n <Card\n style={{ cursor: onExpand ? 'pointer' : undefined }}\n onClick={onExpand}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', gap: 8 }}>\n <CardLabel>{title}</CardLabel>\n {onExpand && (\n <span style={{\n fontSize: 9, fontWeight: 600, color: isDark ? '#3f3f46' : '#d4d4d8',\n opacity: hovered ? 1 : 0, transition: 'opacity 0.15s',\n letterSpacing: '0.05em', textTransform: 'uppercase', flexShrink: 0,\n }}>\n expand ↗\n </span>\n )}\n </div>\n {/* Right-aligned column: delta trend + direction hint stacked */}\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'flex-end', gap: 4 }}>\n {delta && (\n <span title={delta.tooltip} style={{\n fontSize: 10, fontWeight: 600, cursor: 'help',\n color: delta.good ? '#4ade80' : '#f87171',\n background: delta.good\n ? (isDark ? 'rgba(74,222,128,0.08)' : 'rgba(74,222,128,0.12)')\n : (isDark ? 'rgba(248,113,113,0.08)' : 'rgba(248,113,113,0.12)'),\n padding: '2px 8px', borderRadius: 4, whiteSpace: 'nowrap',\n }}>\n {delta.text}\n </span>\n )}\n <span style={{\n fontSize: 10, fontWeight: 600,\n color: isDark ? '#3f3f46' : '#d4d4d8',\n whiteSpace: 'nowrap',\n }}>\n {lowerIsBetter ? '↓ lower = better' : '↑ higher = better'}\n </span>\n </div>\n {/* Value row: big number + unit */}\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 6 }}>\n <span style={{ fontSize: 36, fontWeight: 700, color: isDark ? '#f4f4f5' : '#111114', lineHeight: 1 }}>\n {displayValue}\n </span>\n {displayUnit && (\n <span style={{ fontSize: 14, color: isDark ? '#71717a' : '#71717a', fontWeight: 500 }}>\n {displayUnit}\n </span>\n )}\n </div>\n <RatingBadge rating={metric.rating} />\n {hasSparkline && (\n <div style={{ marginTop: 2 }}>\n <CompactSparkline\n values={sparklineData!}\n weekLabels={weekLabels!}\n color={sparklineColor ?? '#FA6400'}\n type={sparklineType}\n formatValue={formatVal}\n />\n </div>\n )}\n <CardDescription>{description}</CardDescription>\n <CardFooter>\n <span style={{ fontWeight: 600, color: isDark ? '#a1a1aa' : '#52525b' }}>\n {targetLabel}\n </span>\n </CardFooter>\n </Card>\n );\n}\n\nfunction NaCard({ title, description }: { title: string; description: string }) {\n return (\n <Card>\n <CardLabel>{title}</CardLabel>\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 6 }}>\n <span style={{ fontSize: 36, fontWeight: 700, color: '#52525b', lineHeight: 1 }}>N/A</span>\n </div>\n <CardDescription muted>{description}</CardDescription>\n </Card>\n );\n}\n\n// ─── Filter label ──────────────────────────────────────────────────────────\n\nfunction FilterLabel({ children }: { children: React.ReactNode }) {\n const theme = useTheme();\n return (\n <div style={{ fontSize: 11, fontWeight: 600, color: theme.palette.text.primary, marginBottom: 4, textTransform: 'uppercase', letterSpacing: '0.06em' }}>\n {children}\n </div>\n );\n}\n\n// ─── Main component ────────────────────────────────────────────────────────\n\nexport function DoraMetricsContent() {\n const { entity } = useEntity();\n const doraApi = useApi(doraMetricsApiRef);\n const muiTheme = useTheme();\n const textPrimary = muiTheme.palette.text.primary;\n const textSecondary = muiTheme.palette.text.secondary;\n\n const projectSlug = entity.metadata.annotations?.[ANNOTATION_PROJECT_SLUG] ?? '';\n const environments: DoraEnvironment[] = doraApi.getEnvironments();\n const defaultEnv = environments[0];\n const defaultDays = doraApi.getDefaultDays();\n\n const [selectedBranch, setSelectedBranch] = useState<string>(defaultEnv?.branch ?? '');\n const [selectedDays, setSelectedDays] = useState<string>(String(defaultDays));\n\n const selectedEnv = environments.find(e => e.branch === selectedBranch) ?? defaultEnv;\n const days = parseInt(selectedDays, 10);\n\n const [metrics, setMetrics] = useState<DoraMetrics | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const [history, setHistory] = useState<DoraHistoryPoint[] | null>(null);\n const [expanded, setExpanded] = useState<ExpandedCardData | null>(null);\n\n useEffect(() => {\n if (!projectSlug) {\n setError(new Error(`Entity is missing the \"${ANNOTATION_PROJECT_SLUG}\" annotation.`));\n setLoading(false);\n return;\n }\n if (!selectedEnv) {\n setError(new Error('No environments configured for DORA metrics.'));\n setLoading(false);\n return;\n }\n\n let cancelled = false;\n setLoading(true);\n setError(null);\n setHistory(null);\n\n doraApi\n .getMetrics(projectSlug, selectedEnv.branch, selectedEnv.isProduction, selectedEnv.label, days)\n .then(data => {\n if (!cancelled) { setMetrics(data); setLoading(false); }\n })\n .catch((err: Error) => {\n if (!cancelled) { setError(err); setLoading(false); }\n });\n\n doraApi\n .getHistory(projectSlug, selectedEnv.branch, selectedEnv.isProduction, selectedEnv.label, days)\n .then(data => { if (!cancelled) setHistory(data); })\n .catch(() => { /* history is optional — fail silently */ });\n\n return () => { cancelled = true; };\n }, [doraApi, projectSlug, selectedEnv?.branch, days]);\n\n if (loading) return <DojoLoadingOverlay />;\n\n if (error) {\n return (\n <InfoCard title=\"DORA Metrics\">\n <div style={{ padding: 24, color: '#f87171' }}>\n <span style={{ fontWeight: 600 }}>Error: </span>{error.message}\n </div>\n </InfoCard>\n );\n }\n\n if (!metrics) return null;\n\n return (\n <InfoCard title=\" \">\n <div style={{ padding: '4px 0', position: 'relative' }}>\n {/* Detailed overlay */}\n {expanded && (\n <DetailedOverlay data={expanded} days={days} onClose={() => setExpanded(null)} />\n )}\n\n {/* Title */}\n <div style={{ marginBottom: 16 }}>\n <div style={{ fontSize: 22, fontWeight: 700, color: textPrimary, letterSpacing: '-0.02em' }}>DORA Metrics</div>\n {selectedEnv && (\n <div style={{ fontSize: 12, color: textSecondary, marginTop: 5 }}>\n Showing metrics for branch{' '}\n <strong style={{ color: textPrimary, fontFamily: 'monospace' }}>{selectedEnv.branch}</strong>\n </div>\n )}\n </div>\n\n {/* Filters row — left aligned */}\n <div style={{ display: 'flex', alignItems: 'flex-end', gap: 16, flexWrap: 'wrap', marginBottom: 20 }}>\n {environments.length > 1 && (\n <div>\n <FilterLabel>Branch</FilterLabel>\n <Select value={selectedBranch} onValueChange={setSelectedBranch}>\n <SelectTrigger><SelectValue placeholder=\"Select branch\" /></SelectTrigger>\n <SelectContent>\n {environments.map(env => (\n <SelectItem key={env.branch} value={env.branch}>\n {env.branch} ({env.name})\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n <div>\n <FilterLabel>Date Range</FilterLabel>\n <Select value={selectedDays} onValueChange={setSelectedDays}>\n <SelectTrigger><SelectValue placeholder=\"Select date range\" /></SelectTrigger>\n <SelectContent>\n {DATE_RANGE_OPTIONS.map(opt => (\n <SelectItem key={opt.value} value={opt.value}>{opt.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n {/* Metric cards — sparklines inline, click to expand */}\n {(() => {\n const wkLabels = history?.map(h => h.weekLabel) ?? [];\n const deployData = history?.map(h => h.deploymentCount) ?? [];\n const leadData = history?.map(h => h.leadTimeHours) ?? [];\n const cfrData = history?.map(h => h.changeFailureRate ?? 0) ?? [];\n const mttrData = history?.map(h => h.mttrHours ?? 0) ?? [];\n\n const bmMs = history?.map(h => h.bucketMidMs) ?? [];\n\n const mkExpand = (\n title: string, metric: DoraMetricValue, description: string,\n lowerIsBetter: boolean, sparklineValues: number[],\n sparklineType: 'bar' | 'line', sparklineColor: string, prs?: PrDetail[],\n ) => () => setExpanded({\n title, metric, description, lowerIsBetter,\n sparklineValues, sparklineType, sparklineColor,\n weekLabels: wkLabels, bucketMidMs: bmMs, prs,\n });\n\n return (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 12 }}>\n <MetricCard\n title=\"Deployment Frequency\"\n metric={metrics.deploymentFrequency}\n description=\"How often code is deployed to this branch\"\n sparklineData={deployData}\n sparklineType=\"bar\"\n sparklineColor=\"#FA6400\"\n weekLabels={wkLabels}\n onExpand={mkExpand('Deployment Frequency', metrics.deploymentFrequency,\n 'How often code is deployed to this branch', false, deployData, 'bar', '#FA6400',\n metrics.deploymentFrequency.slowestPRs)}\n />\n <MetricCard\n title=\"Lead Time for Changes\"\n metric={metrics.leadTime}\n description=\"Average time from PR creation to merge\"\n lowerIsBetter\n sparklineData={leadData}\n sparklineType=\"line\"\n sparklineColor=\"#818cf8\"\n weekLabels={wkLabels}\n onExpand={mkExpand('Lead Time for Changes', metrics.leadTime,\n 'Average time from PR creation to merge', true, leadData, 'line', '#818cf8', metrics.leadTime.slowestPRs)}\n />\n {metrics.changeFailureRate !== null ? (\n <MetricCard\n title=\"Change Failure Rate\"\n metric={metrics.changeFailureRate}\n description=\"% of all merged PRs that were hotfixes\"\n lowerIsBetter\n sparklineData={cfrData}\n sparklineType=\"line\"\n sparklineColor=\"#f87171\"\n weekLabels={wkLabels}\n onExpand={mkExpand('Change Failure Rate', metrics.changeFailureRate,\n '% of all merged PRs that were hotfixes', true, cfrData, 'line', '#f87171')}\n />\n ) : (\n <NaCard title=\"Change Failure Rate\" description=\"Only tracked on production branches\" />\n )}\n {metrics.mttr !== null ? (\n <MetricCard\n title=\"Mean Time to Restore\"\n metric={metrics.mttr}\n description=\"Avg time from hotfix PR open to merge\"\n lowerIsBetter\n sparklineData={mttrData}\n sparklineType=\"line\"\n sparklineColor=\"#fbbf24\"\n weekLabels={wkLabels}\n onExpand={mkExpand('Mean Time to Restore', metrics.mttr,\n 'Avg time from hotfix PR open to merge', true, mttrData, 'line', '#fbbf24', metrics.mttr.slowestPRs)}\n />\n ) : (\n <NaCard title=\"Mean Time to Restore\" description=\"Only tracked on production branches\" />\n )}\n {metrics.numberOfHotfixes !== null ? (\n <MetricCard\n title=\"Hotfixes to Production\"\n metric={metrics.numberOfHotfixes}\n description={`PRs labeled '${selectedEnv?.label ?? 'hotfix'}' merged to production`}\n lowerIsBetter\n />\n ) : (\n <NaCard title=\"Hotfixes to Production\" description=\"Only tracked on production branches\" />\n )}\n </div>\n );\n })()}\n\n </div>\n </InfoCard>\n );\n}\n"],"names":["max"],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+
3
+ const RATING_STYLES = {
4
+ elite: { background: "#14532d", color: "#86efac", border: "#166534" },
5
+ high: { background: "#1e3a5f", color: "#93c5fd", border: "#1d4ed8" },
6
+ medium: { background: "#451a03", color: "#fdba74", border: "#92400e" },
7
+ low: { background: "#450a0a", color: "#fca5a5", border: "#991b1b" }
8
+ };
9
+ function RatingBadge({ rating }) {
10
+ const s = RATING_STYLES[rating];
11
+ return /* @__PURE__ */ jsx(
12
+ "span",
13
+ {
14
+ style: {
15
+ display: "inline-flex",
16
+ alignItems: "center",
17
+ padding: "2px 8px",
18
+ borderRadius: 9999,
19
+ background: s.background,
20
+ color: s.color,
21
+ border: `1px solid ${s.border}`,
22
+ fontSize: 11,
23
+ fontWeight: 600,
24
+ letterSpacing: "0.06em",
25
+ textTransform: "uppercase"
26
+ },
27
+ children: rating
28
+ }
29
+ );
30
+ }
31
+
32
+ export { RatingBadge };
33
+ //# sourceMappingURL=badge.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.esm.js","sources":["../../../src/components/ui/badge.tsx"],"sourcesContent":["import type { DoraRating } from '../../api/types';\n\nconst RATING_STYLES: Record<DoraRating, { background: string; color: string; border: string }> = {\n elite: { background: '#14532d', color: '#86efac', border: '#166534' },\n high: { background: '#1e3a5f', color: '#93c5fd', border: '#1d4ed8' },\n medium:{ background: '#451a03', color: '#fdba74', border: '#92400e' },\n low: { background: '#450a0a', color: '#fca5a5', border: '#991b1b' },\n};\n\nexport function RatingBadge({ rating }: { rating: DoraRating }) {\n const s = RATING_STYLES[rating];\n return (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 8px',\n borderRadius: 9999,\n background: s.background,\n color: s.color,\n border: `1px solid ${s.border}`,\n fontSize: 11,\n fontWeight: 600,\n letterSpacing: '0.06em',\n textTransform: 'uppercase',\n }}\n >\n {rating}\n </span>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,aAAA,GAA2F;AAAA,EAC/F,OAAO,EAAE,UAAA,EAAY,WAAW,KAAA,EAAO,SAAA,EAAW,QAAQ,SAAA,EAAU;AAAA,EACpE,MAAO,EAAE,UAAA,EAAY,WAAW,KAAA,EAAO,SAAA,EAAW,QAAQ,SAAA,EAAU;AAAA,EACpE,QAAO,EAAE,UAAA,EAAY,WAAW,KAAA,EAAO,SAAA,EAAW,QAAQ,SAAA,EAAU;AAAA,EACpE,KAAO,EAAE,UAAA,EAAY,WAAW,KAAA,EAAO,SAAA,EAAW,QAAQ,SAAA;AAC5D,CAAA;AAEO,SAAS,WAAA,CAAY,EAAE,MAAA,EAAO,EAA2B;AAC9D,EAAA,MAAM,CAAA,GAAI,cAAc,MAAM,CAAA;AAC9B,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,aAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,OAAA,EAAS,SAAA;AAAA,QACT,YAAA,EAAc,IAAA;AAAA,QACd,YAAY,CAAA,CAAE,UAAA;AAAA,QACd,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,MAAA,EAAQ,CAAA,UAAA,EAAa,CAAA,CAAE,MAAM,CAAA,CAAA;AAAA,QAC7B,QAAA,EAAU,EAAA;AAAA,QACV,UAAA,EAAY,GAAA;AAAA,QACZ,aAAA,EAAe,QAAA;AAAA,QACf,aAAA,EAAe;AAAA,OACjB;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;;;;"}
@@ -0,0 +1,77 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useState } from 'react';
3
+ import { useTheme } from '@material-ui/core/styles';
4
+
5
+ function Card({
6
+ children,
7
+ style,
8
+ onClick,
9
+ onMouseEnter,
10
+ onMouseLeave
11
+ }) {
12
+ const theme = useTheme();
13
+ const isDark = theme.palette.type === "dark";
14
+ const [hovered, setHovered] = useState(false);
15
+ return /* @__PURE__ */ jsx(
16
+ "div",
17
+ {
18
+ onMouseEnter: () => {
19
+ setHovered(true);
20
+ onMouseEnter?.();
21
+ },
22
+ onMouseLeave: () => {
23
+ setHovered(false);
24
+ onMouseLeave?.();
25
+ },
26
+ onClick,
27
+ style: {
28
+ background: isDark ? "#0f0f12" : "#ffffff",
29
+ border: `1px solid ${hovered ? isDark ? "#3f3f46" : "#c4c4c8" : isDark ? "#27272a" : "#e4e4e7"}`,
30
+ borderRadius: 12,
31
+ padding: "20px 24px",
32
+ display: "flex",
33
+ flexDirection: "column",
34
+ gap: 10,
35
+ flex: "1 1 200px",
36
+ minWidth: 180,
37
+ transform: hovered ? "translateY(-2px)" : "translateY(0)",
38
+ boxShadow: hovered ? isDark ? "0 8px 24px rgba(0,0,0,0.4)" : "0 8px 24px rgba(0,0,0,0.08)" : "none",
39
+ transition: "transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease",
40
+ ...style
41
+ },
42
+ children
43
+ }
44
+ );
45
+ }
46
+ function CardLabel({ children }) {
47
+ const theme = useTheme();
48
+ return /* @__PURE__ */ jsx("div", { style: {
49
+ fontSize: 11,
50
+ fontWeight: 600,
51
+ color: theme.palette.text.secondary,
52
+ textTransform: "uppercase",
53
+ letterSpacing: "0.1em"
54
+ }, children });
55
+ }
56
+ function CardFooter({ children }) {
57
+ const theme = useTheme();
58
+ const isDark = theme.palette.type === "dark";
59
+ return /* @__PURE__ */ jsx("div", { style: {
60
+ fontSize: 12,
61
+ color: theme.palette.text.secondary,
62
+ borderTop: `1px solid ${isDark ? "#27272a" : "#e4e4e7"}`,
63
+ paddingTop: 10,
64
+ marginTop: 4
65
+ }, children });
66
+ }
67
+ function CardDescription({
68
+ children,
69
+ muted = false
70
+ }) {
71
+ const theme = useTheme();
72
+ const isDark = theme.palette.type === "dark";
73
+ return /* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: muted ? isDark ? "#3f3f46" : "#a1a1aa" : theme.palette.text.secondary }, children });
74
+ }
75
+
76
+ export { Card, CardDescription, CardFooter, CardLabel };
77
+ //# sourceMappingURL=card.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.esm.js","sources":["../../../src/components/ui/card.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { useTheme } from '@material-ui/core/styles';\n\nexport function Card({\n children, style, onClick, onMouseEnter, onMouseLeave,\n}: {\n children: React.ReactNode;\n style?: React.CSSProperties;\n onClick?: () => void;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n}) {\n const theme = useTheme();\n const isDark = theme.palette.type === 'dark';\n const [hovered, setHovered] = useState(false);\n\n return (\n <div\n onMouseEnter={() => { setHovered(true); onMouseEnter?.(); }}\n onMouseLeave={() => { setHovered(false); onMouseLeave?.(); }}\n onClick={onClick}\n style={{\n background: isDark ? '#0f0f12' : '#ffffff',\n border: `1px solid ${hovered\n ? (isDark ? '#3f3f46' : '#c4c4c8')\n : (isDark ? '#27272a' : '#e4e4e7')}`,\n borderRadius: 12,\n padding: '20px 24px',\n display: 'flex',\n flexDirection: 'column',\n gap: 10,\n flex: '1 1 200px',\n minWidth: 180,\n transform: hovered ? 'translateY(-2px)' : 'translateY(0)',\n boxShadow: hovered\n ? (isDark ? '0 8px 24px rgba(0,0,0,0.4)' : '0 8px 24px rgba(0,0,0,0.08)')\n : 'none',\n transition: 'transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease',\n ...style,\n }}\n >\n {children}\n </div>\n );\n}\n\nexport function CardLabel({ children }: { children: React.ReactNode }) {\n const theme = useTheme();\n return (\n <div style={{\n fontSize: 11,\n fontWeight: 600,\n color: theme.palette.text.secondary,\n textTransform: 'uppercase',\n letterSpacing: '0.1em',\n }}>\n {children}\n </div>\n );\n}\n\nexport function CardValue({ value, unit }: { value: number | string; unit: string }) {\n const theme = useTheme();\n return (\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 6 }}>\n <span style={{ fontSize: 36, fontWeight: 700, color: theme.palette.text.primary, lineHeight: 1 }}>\n {value}\n </span>\n <span style={{ fontSize: 14, color: theme.palette.text.secondary, fontWeight: 500 }}>{unit}</span>\n </div>\n );\n}\n\nexport function CardFooter({ children }: { children: React.ReactNode }) {\n const theme = useTheme();\n const isDark = theme.palette.type === 'dark';\n return (\n <div style={{\n fontSize: 12,\n color: theme.palette.text.secondary,\n borderTop: `1px solid ${isDark ? '#27272a' : '#e4e4e7'}`,\n paddingTop: 10,\n marginTop: 4,\n }}>\n {children}\n </div>\n );\n}\n\nexport function CardDescription({\n children,\n muted = false,\n}: {\n children: React.ReactNode;\n muted?: boolean;\n}) {\n const theme = useTheme();\n const isDark = theme.palette.type === 'dark';\n return (\n <div style={{ fontSize: 12, color: muted ? (isDark ? '#3f3f46' : '#a1a1aa') : theme.palette.text.secondary }}>\n {children}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import * as SelectPrimitive from '@radix-ui/react-select';
3
+ import { useTheme } from '@material-ui/core/styles';
4
+ import { ChevronDown, Check } from 'lucide-react';
5
+
6
+ function Select({
7
+ value,
8
+ onValueChange,
9
+ children
10
+ }) {
11
+ return /* @__PURE__ */ jsx(SelectPrimitive.Root, { value, onValueChange, children });
12
+ }
13
+ function SelectTrigger({ children }) {
14
+ const theme = useTheme();
15
+ const isDark = theme.palette.type === "dark";
16
+ return /* @__PURE__ */ jsxs(
17
+ SelectPrimitive.Trigger,
18
+ {
19
+ style: {
20
+ display: "inline-flex",
21
+ alignItems: "center",
22
+ justifyContent: "space-between",
23
+ gap: 8,
24
+ borderRadius: 6,
25
+ border: `1px solid ${isDark ? "#3f3f46" : "#d4d4d8"}`,
26
+ background: isDark ? "#18181b" : "#ffffff",
27
+ color: isDark ? "#f4f4f5" : "#111114",
28
+ padding: "6px 12px",
29
+ fontSize: 14,
30
+ fontWeight: 500,
31
+ cursor: "pointer",
32
+ minWidth: 180,
33
+ outline: "none"
34
+ },
35
+ children: [
36
+ children,
37
+ /* @__PURE__ */ jsx(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ jsx(ChevronDown, { size: 14, style: { color: isDark ? "#a1a1aa" : "#71717a", flexShrink: 0 } }) })
38
+ ]
39
+ }
40
+ );
41
+ }
42
+ function SelectValue({ placeholder }) {
43
+ return /* @__PURE__ */ jsx(SelectPrimitive.Value, { placeholder });
44
+ }
45
+ function SelectContent({ children }) {
46
+ const theme = useTheme();
47
+ const isDark = theme.palette.type === "dark";
48
+ return /* @__PURE__ */ jsx(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsx(
49
+ SelectPrimitive.Content,
50
+ {
51
+ position: "popper",
52
+ sideOffset: 4,
53
+ style: {
54
+ background: isDark ? "#18181b" : "#ffffff",
55
+ border: `1px solid ${isDark ? "#3f3f46" : "#e4e4e7"}`,
56
+ borderRadius: 8,
57
+ padding: 4,
58
+ boxShadow: isDark ? "0 4px 24px rgba(0,0,0,0.4)" : "0 4px 24px rgba(0,0,0,0.12)",
59
+ zIndex: 9999,
60
+ minWidth: 180
61
+ },
62
+ children: /* @__PURE__ */ jsx(SelectPrimitive.Viewport, { children })
63
+ }
64
+ ) });
65
+ }
66
+ function SelectItem({
67
+ value,
68
+ children
69
+ }) {
70
+ const theme = useTheme();
71
+ const isDark = theme.palette.type === "dark";
72
+ return /* @__PURE__ */ jsxs(
73
+ SelectPrimitive.Item,
74
+ {
75
+ value,
76
+ style: {
77
+ display: "flex",
78
+ alignItems: "center",
79
+ gap: 8,
80
+ padding: "6px 28px 6px 8px",
81
+ borderRadius: 4,
82
+ fontSize: 14,
83
+ color: isDark ? "#f4f4f5" : "#111114",
84
+ cursor: "pointer",
85
+ outline: "none",
86
+ position: "relative",
87
+ userSelect: "none"
88
+ },
89
+ onMouseEnter: (e) => {
90
+ e.currentTarget.style.background = isDark ? "#27272a" : "#f4f4f6";
91
+ },
92
+ onMouseLeave: (e) => {
93
+ e.currentTarget.style.background = "transparent";
94
+ },
95
+ children: [
96
+ /* @__PURE__ */ jsx(
97
+ SelectPrimitive.ItemIndicator,
98
+ {
99
+ style: { position: "absolute", right: 8, display: "flex" },
100
+ children: /* @__PURE__ */ jsx(Check, { size: 12, style: { color: isDark ? "#a1a1aa" : "#71717a" } })
101
+ }
102
+ ),
103
+ /* @__PURE__ */ jsx(SelectPrimitive.ItemText, { children })
104
+ ]
105
+ }
106
+ );
107
+ }
108
+
109
+ export { Select, SelectContent, SelectItem, SelectTrigger, SelectValue };
110
+ //# sourceMappingURL=select.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.esm.js","sources":["../../../src/components/ui/select.tsx"],"sourcesContent":["import React from 'react';\nimport * as SelectPrimitive from '@radix-ui/react-select';\nimport { useTheme } from '@material-ui/core/styles';\nimport { Check, ChevronDown } from 'lucide-react';\n\nexport function Select({\n value,\n onValueChange,\n children,\n}: {\n value: string;\n onValueChange: (v: string) => void;\n children: React.ReactNode;\n}) {\n return (\n <SelectPrimitive.Root value={value} onValueChange={onValueChange}>\n {children}\n </SelectPrimitive.Root>\n );\n}\n\nexport function SelectTrigger({ children }: { children: React.ReactNode }) {\n const theme = useTheme();\n const isDark = theme.palette.type === 'dark';\n return (\n <SelectPrimitive.Trigger\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 8,\n borderRadius: 6,\n border: `1px solid ${isDark ? '#3f3f46' : '#d4d4d8'}`,\n background: isDark ? '#18181b' : '#ffffff',\n color: isDark ? '#f4f4f5' : '#111114',\n padding: '6px 12px',\n fontSize: 14,\n fontWeight: 500,\n cursor: 'pointer',\n minWidth: 180,\n outline: 'none',\n }}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown size={14} style={{ color: isDark ? '#a1a1aa' : '#71717a', flexShrink: 0 }} />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n}\n\nexport function SelectValue({ placeholder }: { placeholder?: string }) {\n return <SelectPrimitive.Value placeholder={placeholder} />;\n}\n\nexport function SelectContent({ children }: { children: React.ReactNode }) {\n const theme = useTheme();\n const isDark = theme.palette.type === 'dark';\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n position=\"popper\"\n sideOffset={4}\n style={{\n background: isDark ? '#18181b' : '#ffffff',\n border: `1px solid ${isDark ? '#3f3f46' : '#e4e4e7'}`,\n borderRadius: 8,\n padding: 4,\n boxShadow: isDark\n ? '0 4px 24px rgba(0,0,0,0.4)'\n : '0 4px 24px rgba(0,0,0,0.12)',\n zIndex: 9999,\n minWidth: 180,\n }}\n >\n <SelectPrimitive.Viewport>{children}</SelectPrimitive.Viewport>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n );\n}\n\nexport function SelectItem({\n value,\n children,\n}: {\n value: string;\n children: React.ReactNode;\n}) {\n const theme = useTheme();\n const isDark = theme.palette.type === 'dark';\n return (\n <SelectPrimitive.Item\n value={value}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '6px 28px 6px 8px',\n borderRadius: 4,\n fontSize: 14,\n color: isDark ? '#f4f4f5' : '#111114',\n cursor: 'pointer',\n outline: 'none',\n position: 'relative',\n userSelect: 'none',\n }}\n onMouseEnter={e => {\n (e.currentTarget as HTMLElement).style.background = isDark ? '#27272a' : '#f4f4f6';\n }}\n onMouseLeave={e => {\n (e.currentTarget as HTMLElement).style.background = 'transparent';\n }}\n >\n <SelectPrimitive.ItemIndicator\n style={{ position: 'absolute', right: 8, display: 'flex' }}\n >\n <Check size={12} style={{ color: isDark ? '#a1a1aa' : '#71717a' }} />\n </SelectPrimitive.ItemIndicator>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { ApiBlueprint, createApiFactory, configApiRef } from '@backstage/frontend-plugin-api';
2
+ import { githubAuthApiRef } from '@backstage/core-plugin-api';
3
+ import { doraMetricsApiRef } from '../api/types.esm.js';
4
+ import { DoraMetricsClient } from '../api/DoraMetricsClient.esm.js';
5
+
6
+ const doraMetricsApiExtension = ApiBlueprint.make({
7
+ name: "dora-metrics",
8
+ params: (createApi) => createApi(
9
+ createApiFactory({
10
+ api: doraMetricsApiRef,
11
+ deps: {
12
+ githubAuthApi: githubAuthApiRef,
13
+ configApi: configApiRef
14
+ },
15
+ factory: ({ githubAuthApi, configApi }) => new DoraMetricsClient(githubAuthApi, configApi)
16
+ })
17
+ )
18
+ });
19
+
20
+ export { doraMetricsApiExtension };
21
+ //# sourceMappingURL=api.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.esm.js","sources":["../../src/extensions/api.ts"],"sourcesContent":["import {\n ApiBlueprint,\n createApiFactory,\n configApiRef,\n} from '@backstage/frontend-plugin-api';\nimport { githubAuthApiRef} from '@backstage/core-plugin-api';\nimport { doraMetricsApiRef } from '../api/types';\nimport { DoraMetricsClient } from '../api/DoraMetricsClient';\n\nexport const doraMetricsApiExtension = ApiBlueprint.make({\n name: 'dora-metrics',\n params: createApi =>\n createApi(\n createApiFactory({\n api: doraMetricsApiRef,\n deps: {\n githubAuthApi: githubAuthApiRef,\n configApi: configApiRef,\n },\n factory: ({ githubAuthApi, configApi }) =>\n new DoraMetricsClient(githubAuthApi, configApi),\n }),\n ),\n});\n"],"names":[],"mappings":";;;;;AASO,MAAM,uBAAA,GAA0B,aAAa,IAAA,CAAK;AAAA,EACvD,IAAA,EAAM,cAAA;AAAA,EACN,QAAQ,CAAA,SAAA,KACN,SAAA;AAAA,IACE,gBAAA,CAAiB;AAAA,MACf,GAAA,EAAK,iBAAA;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,aAAA,EAAe,gBAAA;AAAA,QACf,SAAA,EAAW;AAAA,OACb;AAAA,MACA,OAAA,EAAS,CAAC,EAAE,aAAA,EAAe,WAAU,KACnC,IAAI,iBAAA,CAAkB,aAAA,EAAe,SAAS;AAAA,KACjD;AAAA;AAEP,CAAC;;;;"}
@@ -0,0 +1,14 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';
3
+
4
+ const doraMetricsEntityContentExtension = EntityContentBlueprint.make({
5
+ params: {
6
+ path: "dora-metrics",
7
+ title: "DORA Metrics",
8
+ filter: (entity) => entity.spec?.type === "service" || Boolean(entity.metadata.annotations?.["github.com/project-slug"]),
9
+ loader: () => import('../components/DoraMetricsContent.esm.js').then((m) => /* @__PURE__ */ jsx(m.DoraMetricsContent, {}))
10
+ }
11
+ });
12
+
13
+ export { doraMetricsEntityContentExtension };
14
+ //# sourceMappingURL=entityContent.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entityContent.esm.js","sources":["../../src/extensions/entityContent.tsx"],"sourcesContent":["import { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';\n\nexport const doraMetricsEntityContentExtension = EntityContentBlueprint.make({\n params: {\n path: 'dora-metrics',\n title: 'DORA Metrics',\n filter: entity =>\n entity.spec?.type === 'service' ||\n Boolean(entity.metadata.annotations?.['github.com/project-slug']),\n loader: () =>\n import('../components/DoraMetricsContent').then(m => (\n <m.DoraMetricsContent />\n )),\n },\n});\n"],"names":[],"mappings":";;;AAEO,MAAM,iCAAA,GAAoC,uBAAuB,IAAA,CAAK;AAAA,EAC3E,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,cAAA;AAAA,IACN,KAAA,EAAO,cAAA;AAAA,IACP,MAAA,EAAQ,CAAA,MAAA,KACN,MAAA,CAAO,IAAA,EAAM,IAAA,KAAS,SAAA,IACtB,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,WAAA,GAAc,yBAAyB,CAAC,CAAA;AAAA,IAClE,MAAA,EAAQ,MACN,OAAO,yCAAkC,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,qBAC9C,GAAA,CAAC,CAAA,CAAE,kBAAA,EAAF,EAAqB,CACvB;AAAA;AAEP,CAAC;;;;"}