// Dashboard, Inventory, Product detail screens const H = window.DATA_HELPERS; const TODAY_STR = "2026-04-25"; // ─── Helpers shared across screens ───────────────────────────────── const remainingDisplay = (p) => { const cfg = window.SAMPLE_DATA.types.find(t => t.id === p.type); if (p.kind === "discrete") { const cur = p.countLastAudit != null ? p.countLastAudit : p.countOriginal; return `${cur} / ${p.countOriginal} ${cfg?.unit || "ct"}`; } const est = H.estimatedRemaining(p, TODAY_STR); return `${est.toFixed(2).replace(/\.?0+$/,"")} / ${p.weight} ${cfg?.unit || "g"}`; }; const remainingShort = (p) => { if (p.kind === "discrete") { const cur = p.countLastAudit != null ? p.countLastAudit : p.countOriginal; return `${cur} ct`; } const cfg = window.SAMPLE_DATA.types.find(t => t.id === p.type); const est = H.estimatedRemaining(p, TODAY_STR); return `${est.toFixed(2).replace(/\.?0+$/,"") || "0"} ${cfg?.unit || "g"}`; }; const Dashboard = ({data, stats, onNav, onSelectProduct, onAudit, onMarkGone}) => { const series30 = stats.series30.map(d => ({ date: d.date, value: d.grams, label: "" })); // Type breakdown const typeColors = { "Flower": "var(--sage)", "Concentrate": "var(--terracotta)", "Edible": "var(--amber)", "Vaporizer": "var(--plum)", "Pre-roll": "oklch(50% 0.06 200)", "Tincture": "oklch(55% 0.06 270)" }; const segments = Object.entries(stats.typeBreakdown).map(([k, v]) => ({ label: k, value: v, color: typeColors[k] || "var(--ink-3)" })); // Sparklines const last7Series = stats.series7.map(l => l.grams); const last30Series = series30.map(d => d.value); const overdue = stats.overdueAudits; const lowBulk = stats.lowStockBulk; const lowDiscrete = stats.lowStockDiscreteGroups; return (