Add Your Heading Text Here

Projected Annual Releases Through San Quentin

0 250 500 750 1000 Releases Per Year
#sq-release-chart.sq-chart-wrap { max-width: 980px; margin: 0 auto; font-family: Arial, sans-serif; } #sq-release-chart .sq-chart-title { color: #DAA520; font-size: 22px; font-weight: 700; margin: 0 0 18px; text-transform: uppercase; letter-spacing: 0.5px; line-height: 1.2; } #sq-release-chart .sq-chart-box { background: #f4f4f4; border-radius: 8px; padding: 24px 18px 18px; overflow: hidden; } #sq-release-chart svg { width: 100%; height: auto; display: block; } #sq-release-chart .sq-grid-line { stroke: #d7d7d7; stroke-width: 1; } #sq-release-chart .sq-axis-line { stroke: #8e8e8e; stroke-width: 2; } #sq-release-chart .sq-tick-label { fill: #333; font-size: 14px; } #sq-release-chart .sq-x-label { fill: #333; font-size: 14px; text-anchor: middle; } #sq-release-chart .sq-axis-title { fill: #333; font-size: 15px; font-weight: 600; } #sq-release-chart .sq-bar { transform-box: fill-box; transform-origin: center bottom; transform: translateY(100%) scaleY(0); opacity: 0.95; transition: transform 900ms cubic-bezier(.22,.84,.24,1), opacity 900ms ease; } #sq-release-chart.is-visible .sq-bar { transform: translateY(0) scaleY(1); opacity: 1; } #sq-release-chart .sq-value-label { fill: #333; font-size: 12px; text-anchor: middle; opacity: 0; transition: opacity 500ms ease 700ms; } #sq-release-chart.is-visible .sq-value-label { opacity: 1; } (function () { var root = document.getElementById("sq-release-chart"); if (!root) return; var data = [ { year: 2026, value: 300 }, { year: 2027, value: 350 }, { year: 2028, value: 400 }, { year: 2029, value: 450 }, { year: 2030, value: 500 }, { year: 2031, value: 550 }, { year: 2032, value: 600 }, { year: 2033, value: 700 }, { year: 2034, value: 800 }, { year: 2035, value: 900 } ]; var barsGroup = root.querySelector(".sq-bars"); var xLabelsGroup = root.querySelector(".sq-x-labels"); var valueLabelsGroup = root.querySelector(".sq-value-labels"); var chart = { left: 90, right: 930, top: 20, bottom: 470, height: 450, width: 840, maxY: 1000 }; var slotWidth = chart.width / data.length; var barWidth = 48; function lerp(a, b, t) { return a + (b - a) * t; } function hexToRgb(hex) { var c = hex.replace("#", ""); var n = parseInt(c, 16); return { r: (n >> 16) & 255, g: (n >> 8) & 255, b: n & 255 }; } function rgbToHex(r, g, b) { return "#" + [r, g, b].map(function (v) { return Math.round(v).toString(16).padStart(2, "0"); }).join(""); } function interpolateColor(a, b, t) { var s = hexToRgb(a); var e = hexToRgb(b); return rgbToHex( lerp(s.r, e.r, t), lerp(s.g, e.g, t), lerp(s.b, e.b, t) ); } function yScale(v) { return chart.bottom - (v / chart.maxY) * chart.height; } data.forEach(function (d, i) { var xCenter = chart.left + slotWidth * i + slotWidth / 2; var barX = xCenter - barWidth / 2; var barY = yScale(d.value); var barHeight = chart.bottom - barY; var t = i / (data.length - 1); var fill = interpolateColor("#000000", "#DAA520", t); var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); rect.setAttribute("class", "sq-bar"); rect.setAttribute("x", barX); rect.setAttribute("y", barY); rect.setAttribute("width", barWidth); rect.setAttribute("height", barHeight); rect.setAttribute("fill", fill); rect.style.transitionDelay = (i * 90) + "ms"; barsGroup.appendChild(rect); var xLabel = document.createElementNS("http://www.w3.org/2000/svg", "text"); xLabel.setAttribute("class", "sq-x-label"); xLabel.setAttribute("x", xCenter); xLabel.setAttribute("y", 500); xLabel.textContent = d.year; xLabelsGroup.appendChild(xLabel); var valueLabel = document.createElementNS("http://www.w3.org/2000/svg", "text"); valueLabel.setAttribute("class", "sq-value-label"); valueLabel.setAttribute("x", xCenter); valueLabel.setAttribute("y", barY - 8); valueLabel.textContent = d.value; valueLabelsGroup.appendChild(valueLabel); }); if ("IntersectionObserver" in window) { var observer = new IntersectionObserver(function (entries) { entries.forEach(function (entry) { if (entry.isIntersecting) { root.classList.add("is-visible"); observer.unobserve(entry.target); } }); }, { threshold: 0.35 }); observer.observe(root); } else { root.classList.add("is-visible"); } })();