import { useEffect, useState } from 'react'; import { createRoot } from 'react-dom/client'; import { Shell } from '../kit/ui/chrome.jsx'; import { demos, load, sidebar } from './tree.js'; import site from './site.js'; export function mount(node) { createRoot(document.getElementById('root')).render(node); } export function useShelves() { const [shelves, set] = useState(demos); useEffect(() => { let live = true; if (!shelves.length) load().then((list) => live && set(list)); return () => { live = false; }; }, [shelves.length]); return shelves; } const READS = `${site.prefix}reads`; function reads() { const el = typeof document === 'undefined' ? null : document.getElementById(READS); return el ? JSON.parse(el.textContent) : []; } export function Page({ crumb, title, sub, foot, bare, controls, contents, children }) { const shelves = useShelves(); const nodes = sidebar({ demos: shelves }); const pages = reads(); return ( {children} {foot && } {pages.length > 0 && } ); } export function Row({ hidden, children }) { return ; } export function Group({ name, hidden, children }) { return ( ); } const pair = (option) => (Array.isArray(option) ? option : [option, option]); export function Pick({ label, value, onChange, options }) { return ( ); } export function Slider({ label, value, onChange, min, max, step = 1, show }) { return ( ); } export function Text({ label, value, onChange, wide }) { return ( ); } export function Check({ label, checked, onChange }) { return ( ); } export function Btn({ primary, on, onClick, children }) { return ; } export function Stats({ children }) { return
{children}
; } export function Stat({ label, children }) { return {label} {children}; } export function Note({ error, children }) { return
{error ? String(error.message ?? error) : children}
; }