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 && {foot}
}
{pages.length > 0 && Read: {pages.map((page, i) => {i > 0 && ', '}{page.name})}.
}
);
}
export function Row({ hidden, children }) {
return
{children}
;
}
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}
;
}