// onLayout(fn) fires after layout is computed but before paint - the one point // where measured geometry is available via getBoundingBox (a window-relative // snapshot, valid only here or in an event handler). Its canonical use is to // connect or annotate laid-out elements with detached drawing: let the layout // engine place the boxes, read their boxes, then draw a d-path between them. // // Two rules make it safe: // 1. Write the result to something that does NOT affect layout - a d-path's `d`, // a detached node's position. Writing a layout-affecting prop here forces an // extra layout pass every frame. // 2. Call flush() after the write so it lands before the display list is built // (onLayout runs after the frame's normal flush). import { render, onLayout, getBoundingBox, createSignal, flush } from "@solidrt/core" function App() { let boxA!: { id: number } let boxB!: { id: number } let [d, setD] = createSignal("") onLayout(() => { let a = getBoundingBox(boxA) let b = getBoundingBox(boxB) if (!a || !b) return let ax = a.x + a.width / 2, ay = a.y + a.height / 2 let bx = b.x + b.width / 2, by = b.y + b.height / 2 setD(`M ${ax} ${ay} L ${bx} ${by}`) flush() }) return ( (boxA = n)} width={80} height={80} radius={8} color="#3366b3" /> (boxB = n)} width={80} height={80} radius={8} color="#6699e6" /> ) } render(() => )