// Test-only host for header-composition.browser.mjs (2026-10-20). Not a Storybook Story and not shipped (package // "files" is dist + ai). It replaces the Composition demo removed in 5faa1f1 for the hiddenControls / menuOrder checks. // Uses only the public @hm-design/sw API, like a consuming project. window.__setComposition({ hidden, order }) changes // the props at runtime; the layer selection is host state, so it must survive reordering, hiding and showing again. import { useEffect, useState } from "react" import { createRoot } from "react-dom/client" import { SWHeader, type SWHeaderHideableControlId, type SWHeaderLayer, type SWHeaderMenuId } from "@hm-design/sw" import "@hm-design/sw/styles.css" type Composition = { hidden?: SWHeaderHideableControlId[]; order?: SWHeaderMenuId[] } declare global { interface Window { __setComposition?: (next: Composition) => void; __callbacks: string[] } } window.__callbacks = [] const LAYERS: SWHeaderLayer[] = [ { id: "0", name: "0", color: "#ffffff" }, { id: "wall", name: "WALL", color: "#ff4242" }, { id: "dim", name: "DIM", color: "#47af91" }, ] const record = (line: string) => { window.__callbacks.push(line) } function Host() { const [composition, setComposition] = useState({}) const [layerId, setLayerId] = useState("0") useEffect(() => { window.__setComposition = next => setComposition(next) }, []) const layer = LAYERS.find(item => item.id === layerId)! return (
record("onHomeClick")} onLayerSelect={item => { setLayerId(item.id); record(`onLayerSelect(${item.id})`) }} onLayerOpen={() => record("onLayerOpen")} onColorOpen={() => record("onColorOpen")} onLineStyleOpen={() => record("onLineStyleOpen")} onTextStyleOpen={() => record("onTextStyleOpen")} onDimensionStyleOpen={() => record("onDimensionStyleOpen")} onPrint={() => record("onPrint")} onPopupGuide={() => record("onPopupGuide")} onMinimize={() => record("onMinimize")} onClose={() => record("onClose")} />
) } createRoot(document.getElementById("root")!).render()