/* ============================================================ Finance — Slides. Same two-pane shell as the Model page, but the source file is a PRESENTATION and its items are SLIDES. Rebuilt to mirror the real deck: Slides/CFO_Board_Presentation_Deck.pptx (5 slides). Each slide renders off a Finance data product. ============================================================ */ (function () { const DECK = 'CFO_Board_Presentation_Deck.pptx'; const POR = '#B7B0A8', LEB = '#1F3B2C', BAR = '#1F3B2C'; const SLIDES = [ { title: 'FY2026 Interim Review & Three-Year Outlook', built: 'Executive Summary · Three-Statement Model', cover: true, meta: ['Cascade Ridge Foods · Board of Directors · July 2026', 'Prepared by the Chief Financial Officer · Actuals through June 2026'], kpis: [['FY2026E Revenue', '$160.0M', '+12.7% vs FY2025'], ['FY2026E EBITDA', '$16.3M', '10.2% margin'], ['FY2026E Net Income', '$9.2M', 'vs $2.9M in FY2025'], ['FY2026E Ending Cash', '$19.2M', '0.9x net leverage']], data: [['FY2026E revenue', '$160.0M'], ['FY2026E EBITDA', '$16.3M'], ['FY2026E net income', '$9.2M']] }, { title: 'Revenue Performance & Growth Outlook', built: 'P&L & Margin Bridge · Three-Statement Model', chart: { unit: 'Revenue, $ millions', bars: [['FY2024', 128.0], ['FY2025', 142.0], ['FY2026E', 160.0], ['FY2027E', 176.0], ['FY2028E', 191.8]] }, notes: [['H1-2026 revenue $78.0M, +13.4%', 'June the strongest month on record at $16.4M'], ['Forecast +12% through H2', 'then +10% FY2027 and +9% FY2028 on committed line volume'], ['Mix holds ~84% turnkey', 'tolling grows in line with the book']], data: [['FY2026E revenue', '$160.0M'], ['H1-2026', '$78.0M (+13.4%)'], ['FY2028E', '$191.8M']] }, { title: 'Margin Recovery & Profitability', built: 'P&L & Margin Bridge', chart: { unit: 'EBITDA, $ millions', bars: [['FY2024', 12.0, '9.4%'], ['FY2025', 8.2, '5.8%'], ['FY2026E', 16.3, '10.2%'], ['FY2027E', 17.9, '10.2%'], ['FY2028E', 19.6, '10.2%']] }, notes: [['FY2025 gross margin 18.2%', 'compressed by ingredient inflation + a $1.8M bad-debt write-off'], ['H1-2026 gross margin 20.9%', 'pricing actions and freight recovery holding'], ['Forecast GM 21.2% (FY26E–28E)', 'no repeat write-off; DSO tightened to 48 days']], data: [['FY2025 EBITDA', '$8.2M (5.8%)'], ['FY2026E EBITDA', '$16.3M (10.2%)'], ['FY2025 gross margin', '18.2%']] }, { title: 'Cash Flow, Debt & Distributions', built: 'Three-Statement Model', chart: { unit: 'Ending cash, year-end $ millions', bars: [['FY24', 7.6], ['FY25', 9.5], ['FY26E', 19.2], ['FY27E', 25.3], ['FY28E', 32.7]] }, notes: [['Term debt $15.2M → $11.6M', 'FY2025 → FY2028E · net leverage 0.6x by FY2028E'], ['Principal $1.2M/yr · Capex $3.5M/yr', 'owner distributions $2.0M/yr from FY2027'], ['All uses funded from operations', 'no new borrowing assumed through FY2028']], data: [['FY2026E ending cash', '$19.2M'], ['FY2028E ending cash', '$32.7M'], ['Term debt FY28E', '$11.6M']] }, { title: 'Capacity & Utilization', built: 'Capacity & Utilization', chart: { unit: 'FY2026E utilization by line', pct: true, byPlant: true, bars: [['POR-L1', 78, POR], ['POR-L2', 71, POR], ['POR-L3', 75, POR], ['POR-L4', 69, POR], ['LEB-L1', 88, LEB], ['LEB-L2', 87, LEB], ['LEB-L3', 86, LEB], ['LEB-L4', 90, LEB], ['LEB-L5', 83, LEB]] }, notes: [['Network utilization 76% → 93%', '88.7M units FY2026E on 106.0M practical capacity'], ['LEB-L5 upgrade landed April', '+20% line capacity (~2.7M units/yr), within the $3.5M capex'], ['Expansion case due H1-FY2027', 'Lebanon reaches 96–100% by FY2028; Portland holds low-80s headroom']], data: [['Network util FY2026E', '~85%'], ['Units / capacity', '88.7M / 106.0M'], ['LEB-L5 add', '+20%']] }, ]; function Bars({ chart }) { const bars = chart.bars, pct = chart.pct; const W = 660, H = 196, padT = 22, padB = 30; const max = pct ? 100 : Math.max.apply(null, bars.map((b) => b[1])) * 1.15; const plotH = H - padT - padB, band = W / bars.length, bw = Math.min(58, band * 0.5); const yOf = (v) => padT + plotH - (v / max) * plotH; const fmt = (v) => pct ? v + '%' : v.toFixed(v >= 100 ? 0 : 1); return ( {bars.map((b, i) => { const x = i * band + (band - bw) / 2, y = yOf(b[1]), h = padT + plotH - y; const color = b[2] && /^#/.test(b[2]) ? b[2] : BAR; return ( {fmt(b[1])} {b[0]} {b[2] && !/^#/.test(b[2]) && {b[2]}} ); })} ); } function SlideSurface({ s }) { const green = '#1F3B2C'; // Slide typography scales with the canvas width (cqw = 1% of the // .mdl__canvas container) and caps at the original desktop sizes, so the // fixed 16:9 surface never clips its content on tablet/phone panes. const fs = (px) => `clamp(${Math.max(6, Math.round(px * 0.55))}px, ${(px / 7).toFixed(2)}cqw, ${px}px)`; return (
{s.cover ? (
{s.title}
{s.meta[0]}
{s.meta[1]}
{s.kpis.map((k) => (
{k[0]}
{k[1]}
{k[2]}
))}
) : (
Cascade Ridge Foods
{s.title}
{s.chart &&
{s.chart.unit}
} {s.chart && } {s.notes && (
{s.notes.map((n, i) => (
{n[0]}
{n[1]}
))}
)}
)}
); } function FaceMenu({ face, setFace, faces }) { const [open, setOpen] = React.useState(false); const ref = React.useRef(null); React.useEffect(() => { if (!open) return; const onDoc = (e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); }; document.addEventListener('mousedown', onDoc); return () => document.removeEventListener('mousedown', onDoc); }, [open]); const current = faces.find((f) => f[0] === face); return (
{open && (
{faces.map(([k, label]) => ( ))}
)}
); } function FinanceSlidesCanvas() { const [sel, setSel] = React.useState(0); const [open, setOpen] = React.useState(true); const [canvasOpen, setCanvasOpen] = React.useState(false); const s = SLIDES[sel]; // Standard DP shell — the deck's slides are the DP picker (left rail); each // slide renders in DPShell with the Slide / Data / Control / Context faces. const faces = [ { key: 'artifact', label: 'Slide', render: () => }, { key: 'data', label: 'Data', render: () => }, { key: 'control', label: 'Control', render: () => (
Sync

In sync with {DECK} · rebuilt from the model at the Jul-2026 close

Renders off

{s.built}

Reconciliation

Every figure pulls from a data product — change the model and the slide updates. Nothing is typed by hand.

) }, { key: 'context', label: 'Context', render: () => (
What this is

Slide {sel + 1} of the CFO board deck — a presentation view that renders off the Finance model.

Built from

{s.built}

Why it’s here

The deck is an artifact of the model, not a separate document. Same data as the hub — presented for the board.

) }, ]; return (
setCanvasOpen(false)} ariaLabel={s.title}>
); } window.FinanceSlidesCanvas = FinanceSlidesCanvas; })();