The settings sidebar — every property panel for the selected node. Lives in packages/sdk/src/chrome/toolbar/.
The settings sidebar — every property panel for the selected node. Lives in packages/sdk/src/chrome/toolbar/.
The structure is static: tabs, sections, accordions render once and never unmount. Only the content inside each section reacts to the selected node via CraftJS hooks (useNode, useEditor). Switching nodes does NOT rebuild the tree — hidden sections return null content but stay at stable key positions.
Toolbar shell, exportsInspectorTab.tsx — tab stripTabBarBreakpointPicker)Toolbar (left/right dock)
└── ToolbarWrapper
├── TabStrip (InspectorTab — Style / Layout / Animation / Settings)
│ └── DarkModeToggle (EditModifiersAtom.dark)
├── SearchBar (SettingsSearchAtom)
└── Section content (per active tab)
└── PropertySection / ToolbarSection
└── PropertyRenderer / ToolbarItem
└── BreakpointChip (per-field, silent-when-clean)
The viewport switcher in the canvas header is now the scope picker — switching to MD canvas means writes go to md:. There is no longer a separate breakpoint picker in the tab bar. See responsive-editor.md.
The tabs are defined in inspector/properties/sectionDefs.ts. Each property def belongs to a section, each section to a tab.
Triggered by Cmd/Ctrl+F or the search icon. Backed by SettingsSearchAtom + searchProperties() from the registry — fuzzy-matches property labels and section titles, then scrolls to and highlights matches.