- Use kebab-case for file names (e.g.
signature-editor.tsx,button-sidebar-panel.tsx) - Use PascalCase for React components and types
- Use camelCase for variables, functions, and props
src/blocks/— Block components (read-only renderers) + Zod schemas. Each block exports its component, schema, props type, and defaults.src/editor/— Editor-specific block components (inline editors, block wrappers, add-block menu)src/editor/core.tsx— Editor block dictionary (maps block types to editor components)src/email-builder/— Reader components for rendering emails (preview/export)src/email-builder/reader/core.tsx— Reader block dictionarysrc/app/— App shell: drawers, inspector panels, email canvassrc/app/inspector-drawer/configuration-panel/input-panels/— Sidebar panels for each block typesrc/core/— Shared block building utilitiese2e/— Playwright end-to-end tests
@blocks→src/blocks@editor→src/editor@core→src/core@email-builder→src/email-builder
- Create
src/blocks/{name}.tsx— component, schema, defaults - Export from
src/blocks/index.ts - Create
src/editor/blocks/{name}/{name}-editor.tsx— inline editor - Register in
src/editor/core.tsx(editor dictionary) - Register in
src/email-builder/reader/core.tsx(reader dictionary) - Create
src/app/inspector-drawer/configuration-panel/input-panels/{name}-sidebar-panel.tsx - Register in
src/app/inspector-drawer/configuration-panel/index.tsx - Add to
src/editor/blocks/helpers/editor-children-ids/add-block-menu/buttons.tsx - Export from
src/index.ts
- E2E tests use Playwright (
e2e/directory) - Run with
npx playwright test - Config:
playwright.config.ts(uses vite dev server on port 5199)