import { Dynamic } from "solid-js/web"; import { WidgetRenderer } from "./WidgetRenderer"; import { getGrid } from "../grids/registry"; import type { DashboardGridConfig } from "../types/grid"; import { createMemo, createSignal, onMount, Show, For } from "solid-js"; import type { WidgetConfig } from "../types/widget"; export function Preview() { const [widgets, setWidgets] = createSignal([]); const [gridConfig, setGridConfig] = createSignal({ templateId: null, widgetPlacements: [], }); const [error, setError] = createSignal(""); // Calculate scale to fit grid inside viewport const scale = createMemo(() => { const grid = gridConfig().templateId ? getGrid(gridConfig().templateId!) : null; if (!grid) return 1; const gridWidth = grid.template?.width || 800; const gridHeight = grid.template?.height || 600; const viewportWidth = window.innerWidth - 40; // Add margin for safety const viewportHeight = window.innerHeight - 40; // Add margin for safety const scaleX = viewportWidth / gridWidth; const scaleY = viewportHeight / gridHeight; // Use slightly smaller scale to ensure nothing clips return Math.min(scaleX, scaleY) * 0.98; // 98% to add buffer }); onMount(() => { try { const urlParams = new URLSearchParams(window.location.search); const configParam = urlParams.get("config"); if (configParam) { const decoded = decodeURIComponent(configParam); const config = JSON.parse(decoded); // Support both old format (array) and new format (object with widgets and grid) if (Array.isArray(config)) { setWidgets(config); } else { if (config.widgets) { setWidgets(config.widgets); } if (config.grid) { setGridConfig(config.grid); } } } else { setError("No configuration found in URL"); } } catch (err) { console.error("Error loading config:", err); setError("Failed to load dashboard configuration"); } }); return (
window.location.reload()} style={{ width: "100vw", height: "100vh", position: "fixed", top: "0", left: "0", background: "var(--bg, #fff)", overflow: "hidden", display: "flex", "align-items": "center", "justify-content": "center", padding: "20px", "box-sizing": "border-box", }} >

Error

{error()}

0}>
{/* Render grid template if selected */} {/* @ts-ignore */} {() => { const grid = getGrid(gridConfig().templateId!); return grid ? : null; }} {/* Render widgets */} {(widget) => }

No widgets to display

); }