// dashboard.mjs — songs + sounds sections for pop/demos.html. // Browser-only. Fetches ./demos/manifest.json and renders two picker-driven // sections above the tool-demo masonry. No Node imports. // ── accent colours (match tool-demo CATS) ──────────────────────────── const LANE_ACCENT = { dance: "#c0631a", hippyhayzard: "#c0631a", marimba: "#8a5223", gradus: "#5a6b1f", "big-pictures": "#1d7a8a", chillwave: "#1d7a8a", jungle: "#5a6b1f", gecs: "#b5331f", hellsine: "#b5331f", }; const DEFAULT_ACCENT = "#1a1712"; function laneAccent(lane) { return LANE_ACCENT[lane] || DEFAULT_ACCENT; } // ── status badge ───────────────────────────────────────────────────── const STATUS_COLOR = { released: "#3f7d2e", render: "#c0631a", wip: "#6b6353", }; function badge(status) { const d = document.createElement("span"); d.className = "db-badge"; d.textContent = status; d.style.setProperty("--badge", STATUS_COLOR[status] || "#6b6353"); return d; } // ── tiny DOM helpers ────────────────────────────────────────────────── function el(tag, cls, ...kids) { const n = document.createElement(tag); if (cls) n.className = cls; for (const k of kids) { if (k == null) continue; n.append(typeof k === "string" ? document.createTextNode(k) : k); } return n; } // ── section heading ─────────────────────────────────────────────────── function sectionHeading(text) { const h = document.createElement("h2"); h.className = "db-section"; h.textContent = text; return h; } // ── songs section — picker-driven ──────────────────────────────────── // A