// mun-page-2.jsx // Municipal & Institutional Industry Page — Part 2 // MunSolutions (green Solutions-for-this-sector with facility schematic) // MunCaseStudy (featured project with photo slider) // ============================================================ // MunFacilitySchematic — mirrors the F&B "cream" schematic exactly // (building outline, pitched roof with side-profile PV panels, // outdoor BESS pad, service entrance). The interior LED zone from // the F&B variant is swapped for an EV CHARGING zone in the parking // stall area in front of the building. // 5 zones · 01 Audit · 02 EV · 03 Solar PV · 04 Battery · 05 Electrical // ============================================================ const MunFacilitySchematic = ({ activeIndex }) => { const W = 540; const H = 360; const amber = 'rgba(233,199,134,1)'; const amberFill= 'rgba(233,199,134,0.18)'; const ink = 'rgba(255,255,255,0.55)'; const inkDim = 'rgba(255,255,255,0.32)'; const inkFaint = 'rgba(255,255,255,0.18)'; const inkText = 'rgba(255,255,255,0.62)'; const zones = [ // 01 Energy Audits — whole facility ring { id: 0, label: '01', cx: 270, cy: 200, hl: }, // 02 EV Charging — front parking stalls { id: 1, label: '02', cx: 250, cy: 308, hl: }, // 03 Solar PV — rooftop { id: 2, label: '03', cx: 270, cy: 96, hl: }, // 04 Battery — BESS pad { id: 3, label: '04', cx: 502, cy: 244, hl: }, // 05 Electrical Infrastructure — service entrance / switchgear { id: 4, label: '05', cx: 110, cy: 246, hl: }, ]; return (
{/* Ground line + horizon */} {/* Building outline */} {/* Common-area divider — permanent feature inside the building */} COMMON AREAS {/* Window mullions / occupancy units */} {[350, 370, 390, 410, 430].map(x => ( ))} {/* Roof solar panels — Solar PV zone (03) Identical side-profile cross-sections to the F&B schematic, sitting on small standoff legs above the pitched roof. */} {(() => { const panelLen = 26; const panelThick = 2; const legH = 5; const slope = 40 / 190; const angleDeg = Math.atan(slope) * 180 / Math.PI; const positions = []; for (let i = 0; i < 5; i++) { const cx = 110 + i * 30; const roofY = 118 - (cx - 80) * slope; positions.push({ cx, roofY, angle: -angleDeg, key: `L${i}` }); } for (let i = 0; i < 5; i++) { const cx = 310 + i * 30; const roofY = 78 + (cx - 270) * slope; positions.push({ cx, roofY, angle: angleDeg, key: `R${i}` }); } const panelStroke = activeIndex === 2 ? amber : ink; const panelFill = activeIndex === 2 ? amber : ink; const legStroke = activeIndex === 2 ? amber : inkDim; return positions.map(({ cx, roofY, angle, key }) => { const x0 = cx - panelLen / 2; const x1 = cx + panelLen / 2; const yPanelTop = roofY - legH - panelThick; const yLegTop = roofY - legH; const legInset = 4; return ( ); }); })()} {/* Interior baseline detail — desks / occupancy markers (no LED row — replaced by EV stalls outside) */} {[170, 220, 270, 320].map(x => ( ))} {/* EV CHARGING — front parking stalls (zone 02) Sits in front of the building on the paved apron. Stall bays painted on the ground line, EVSE pedestals between. */} {/* paved apron */} {/* stall divider lines */} {[180, 220, 260, 300, 340].map(x => ( ))} {/* EVSE pedestals — pole + head */} {[200, 240, 280, 320].map(x => ( ))} EV CHARGING · PARKING {/* Outdoor BESS pad — Battery zone (04) — identical to F&B */} {[0,1,2,3,4].map(i => ( ))} {[0,1,2,3,4].map(i => ( ))} BESS {/* Electrical service room — Electrical Infrastructure (05) — identical to F&B */} {[0,1,2,3].map(i => ( ))} SERVICE {/* Whole-facility audit ring — Energy Audits (01) */} {zones[activeIndex].hl} {zones.map((z, i) => { const isActive = i === activeIndex; return ( {z.label} ); })}
); }; // ============================================================ // MunSolutions — Soft Green. Mirrors the F&B "Solutions for this // sector" layout exactly: header + schematic on left, 5-row // interactive solutions list on right. // ============================================================ const MunSolutions = () => { const rows = [ { idx: '01', icon: 'clipboard-list', name: 'Energy Audits', zone: 'Whole facility', tag: 'Establish the documented baseline.', why: 'Energy audits create the facility-specific baseline required for BEPS reporting, net-zero tracking, and grant applications. The reference point every subsequent measure is sized against.', href: '/solutions/energy-audits/' }, { idx: '02', icon: 'plug-zap', name: 'EV Charging', zone: 'Parking · fleet yard', tag: 'Fleet electrification on regulatory timelines.', why: 'Fleet electrification and public charging infrastructure — planned proactively against fleet replacement schedules and BEPS positioning for municipal parking facilities.', href: '/solutions/ev-charging/' }, { idx: '03', icon: 'sun', name: 'Commercial Solar', zone: 'Rooftop', tag: 'Reduce GHG intensity and operating cost.', why: 'Rooftop solar reduces electricity operating costs and produces documented emissions reductions for BEPS and net-zero reports.', href: '/solutions/commercial-solar/' }, { idx: '04', icon: 'battery-charging', name: 'Battery Storage', zone: 'Mechanical pad', tag: 'Grid resilience for critical facilities.', why: 'Storage delivers resilience for critical public facilities and unlocks IESO demand-response participation for buildings with appropriate load flexibility.', href: '/solutions/battery-storage/' }, // GI Link Audit (Fix 4): Electrical Infrastructure has no dedicated service page; // routes to /about/contact/ for tailored scoping (consistent with fnb-v2.jsx). { idx: '05', icon: 'cable', name: 'Electrical Infrastructure', zone: 'Service · distribution', tag: 'Build around future capacity.', why: 'Service upgrades, distribution planning, and interconnection coordination support solar, storage, and EV additions on a single delivery path.', href: '/about/contact/' }, ]; const [active, setActive] = React.useState(0); return (
{/* Hairline tick at the top */}
); }; // ============================================================ // MunCaseStudy — Featured Project. Photo slider supports // multiple images (extend SLIDES array to add more). // Paper White surface. // ============================================================ const MUN_FEATURED_SLIDES = [ { label: 'TCHC Torbolton · Rooftop', note: 'Drop primary rooftop aerial photo (1600 × 900 minimum)', src: `${window.GI_BASE}assets/projects/tchc-torbolton/tchc_01.webp`, }, { label: 'TCHC Torbolton · Array detail', note: 'Drop close-up of installed solar panels', src: `${window.GI_BASE}assets/projects/tchc-torbolton/tchc_02.webp`, }, { label: 'TCHC Torbolton · Electrical', note: 'Drop electrical room / inverter photo', src: `${window.GI_BASE}assets/projects/tchc-torbolton/tchc_03.webp`, }, { label: 'TCHC Torbolton · Commissioning', note: 'Drop commissioning / inspection photo', src: `${window.GI_BASE}assets/projects/tchc-torbolton/tchc_04.webp`, }, { label: 'TCHC Torbolton · Full Facility', note: 'Drop full facility photo', src: `${window.GI_BASE}assets/projects/tchc-torbolton/tchc_05.webp`, }, ]; const MunCaseStudy = () => { const [idx, setIdx] = React.useState(0); const slides = MUN_FEATURED_SLIDES; const total = slides.length; const slide = slides[idx]; const go = (n) => setIdx(((n % total) + total) % total); const stats = [ { big: '42.84 kW', label: 'DC system size', sub: '72 × JA Solar JA72D30-595W' }, { big: '45,226', label: 'kWh generated annually',sub: 'Based on facility model' }, { big: 'TCHC', label: 'Client', sub: 'Toronto Community Housing Corporation' }, { big: 'Oct 2025', label: 'Commercial operation', sub: 'ESA inspection completed' }, ]; const spec = [ { l: 'Location', v: '50 Torbolton Drive, Etobicoke, ON' }, { l: 'Client', v: 'Martinway Contracting / TCHC' }, { l: 'System size', v: '42.84 kW DC / 30 kW AC' }, { l: 'Modules', v: '72 × JA Solar JA72D30-595W' }, { l: 'Inverter', v: '1 × Solis S6-GC30K-LV-US 30 kW' }, { l: 'Racking', v: 'TerraGen' }, { l: 'Commissioned', v: 'October 2025' }, ]; const also = [ { name: 'Goodspeeds Manufacturing', loc: 'Nova Scotia', size: 'Industrial rooftop', off: 'Commercial procurement', com: 'Commissioned Apr 2025' }, { name: 'Northland Building Supplies', loc: 'Edmonton, AB', size: 'Commercial rooftop', off: 'Multi-province delivery', com: 'Commissioned Jun 2024' }, { name: 'TCHC Torbolton', loc: 'Etobicoke, ON', size: '42.84 kW DC', off: 'Social housing', com: 'Commissioned Oct 2025' }, { name: 'Municipal Recreation Site', loc: 'Ontario', size: 'In planning', off: 'BEPS positioning', com: 'Engagement 2026' }, ]; return (
{/* ===== SLIDER ===== */}
{slides.map((s, i) => (
{s.src ? ( {s.label} ) : (
[ {s.placeholder} ]
{s.note}
)}
))} {/* Photo location/spec strip */}
{/* Prev / Next */}
{/* Thumbnail strip */}
{slides.map((s, i) => ( ))}
{/* Results */}
Project results
{stats.map((s, i) => (
0 ? 28 : 0, borderRight: i < stats.length - 1 ? '1px solid rgba(15,33,51,0.14)' : 'none', }}>
{s.big}
{s.label}
{s.sub}
))}
{/* Spec + Also-in-sector */}
System details · TCHC Torbolton
{spec.map((s, i) => (
{s.l}
{s.v}
))}
Also in this sector
    {also.map((p, i) => (
  • {p.name}
    {p.loc}
    {p.size} · {p.off} · {p.com}
  • ))}
); }; Object.assign(window, { MunSolutions, MunCaseStudy, MunFacilitySchematic });