# Scratchpad — Designer UX & Quote Bindings ## Key File Paths ### Designer Inspector System - **Schema definitions:** `packages/billing/src/components/invoice-designer/schema/componentSchema.ts` - COMMON_INSPECTOR (line 58) — layout, sizing, appearance, flex-item panels - Layout enum fields: flexDirection (91), alignItems (101), justifyContent (114) - Grid string fields: gridTemplateColumns (143), gridTemplateRows (150) - Spacing css-length fields: gap (76), padding (83), margin (242) - **Inspector renderer:** `packages/billing/src/components/invoice-designer/inspector/DesignerSchemaInspector.tsx` - Field kind rendering: renderField (line 117) - enum → CustomSelect dropdown (190-206) - css-length → text Input (209-225) - widget → TableEditorWidget (289-293) - Normalizers import (line 14-20) - **Inspector schema types:** `packages/billing/src/components/invoice-designer/schema/inspectorSchema.ts` - **Normalizers:** `packages/billing/src/components/invoice-designer/inspector/normalizers.ts` ### Designer Palette - **Palette component:** `packages/billing/src/components/invoice-designer/palette/ComponentPalette.tsx` - 4 tabs: BLOCKS, PRESETS, FIELDS, OUTLINE (lines ~272-299) - Fields tab builds from expression context adapter (lines 230-233) - Field grouping by category: invoice, customer, tenant, item (lines 41-46) - **Layout presets:** `packages/billing/src/components/invoice-designer/constants/presets.ts` - LayoutPresetDefinition interface (line 35) - LAYOUT_PRESETS array (line 44): 5-6 existing presets ### Quote Bindings - **Binding definitions:** `packages/billing/src/lib/quote-template-ast/bindings.ts` - 35 value bindings (lines 7-35) - 2 collection bindings: lineItems, phases (lines 37-40) - **Quote adapters:** `packages/billing/src/lib/adapters/quoteAdapters.ts` - mapQuoteItemToViewModel (line 37) — maps single item - buildPhaseViewModels (line 64) — groups by phase - mapLoadedQuoteToViewModel (line 207) — builds full view model - **Quote types:** `packages/types/src/interfaces/quote.interfaces.ts` - QuoteViewModel (line ~185) - QuoteViewModelLineItem — has is_recurring, service_item_kind, billing_frequency ### Table Editor Widget - **Widget:** `packages/billing/src/components/invoice-designer/inspector/widgets/TableEditorWidget.tsx` - Collection binding dropdown (lines 391-403) - Options built from AST bindings (lines 142-205) ## Panel Scroll Problem (FR-0) The 3-panel layout (palette | canvas | inspector) is inside `flex flex-1 min-h-[560px]` (line 1830). - **Palette** (left): Has floating behavior via `isPaletteFloating` + `fixed top-0` (line 1843). **Bug:** triggers when `rect.top <= 0` (line 703), pinning to browser viewport top, overlapping the app header/navbar. Causes jarring jump on scroll. - **Canvas** (center): `flex-1 flex` (line 2091) - **Inspector** (right): Plain `