[ { "id": "F001", "description": "Define designer layout model as a direct subset of CSS box model + flex/grid properties (no constraint solver concepts).", "implemented": true }, { "id": "F002", "description": "Implement mapping from designer node layout properties to DOM style props (inline styles or class tokens) for canvas rendering.", "implemented": true }, { "id": "F003", "description": "Implement container layout modes: flex column and flex row.", "implemented": true }, { "id": "F004", "description": "Implement container spacing controls: gap, padding, border (as exposed by the designer UI).", "implemented": true }, { "id": "F005", "description": "Implement alignment controls for flex containers: justify-content and align-items.", "implemented": true }, { "id": "F006", "description": "Implement item sizing controls: width/height and min/max constraints using CSS values.", "implemented": true }, { "id": "F007", "description": "Implement flex item controls: grow/shrink/basis for nodes inside flex containers (where meaningful).", "implemented": true }, { "id": "F008", "description": "Implement grid container mode using CSS grid (template columns/rows + gap + auto-flow).", "implemented": true }, { "id": "F009", "description": "Replace custom drop-parent resolution with @dnd-kit/core (sensors + collision detection + sortable).", "implemented": true }, { "id": "F010", "description": "Implement reorder within the same container using dnd-kit sortable primitives.", "implemented": true }, { "id": "F011", "description": "Implement moving nodes across containers (drop into another container) using dnd-kit over/collision results.", "implemented": true }, { "id": "F012", "description": "Implement nesting into eligible containers using an explicit type-based allowlist (containers vs leaves).", "implemented": true }, { "id": "F013", "description": "Provide drop indicators derived from DOM geometry (insertion index before/after, nested target highlight).", "implemented": true }, { "id": "F014", "description": "Implement a clear invalid-drop UX state (blocked cursor/indicator + no state mutation).", "implemented": true }, { "id": "F015", "description": "Implement aspect ratio for images using CSS aspect-ratio and object-fit (no JS math).", "implemented": true }, { "id": "F016", "description": "Implement resize handles for image + container blocks (section/stack) that update pixel CSS sizing props and rely on DOM layout (no constraint solver).", "implemented": true }, { "id": "F016A", "description": "Implement property-panel editing of sizing props as CSS strings (%/rem/auto) while drag resize remains pixel-only.", "implemented": true }, { "id": "F016B", "description": "Implement basic snapping as discrete insertion behavior: edge snapping (before/after) for flex and deterministic cell/index snapping for grid.", "implemented": true }, { "id": "F016C", "description": "Ensure drag-drop persists only container + insertion index (no coordinate-based layout persistence).", "implemented": true }, { "id": "F017", "description": "Delete legacy geometry utilities: constraintSolver.ts, constraints.ts, dropParentResolution.ts, aspectRatio.ts.", "implemented": true }, { "id": "F018", "description": "Reduce utils/layout.ts to lightweight mapping helpers only, removing coordinate math and solver logic.", "implemented": true }, { "id": "F019", "description": "Update designer state serialization/export to persist CSS-like layout props as part of the workspace snapshot/AST export.", "implemented": true }, { "id": "F020", "description": "Ensure preview rendering uses the same CSS semantics as the invoice renderer (no designer-only geometry).", "implemented": true }, { "id": "F021", "description": "Audit and remove any runtime imports of deleted geometry modules from invoice-designer components.", "implemented": true }, { "id": "F022", "description": "Add developer-facing docs in SCRATCHPAD.md for key dnd-kit collision strategy choices and nesting rules.", "implemented": true } ]