Theme name constraint: Must match regex [a-zA-Z][a-zA-Z0-9_-:]*. Use kebab-case. Parent:default for OroCommerce storefront. Child themes inherit SCSS, templates, and JavaScript.
SCSS Organization — 3-Folder Compilation Order
Oro enforces a strict compilation order. Violating it causes build failures:
settings/ — Mixins, functions, reusable utilities
variables/ — Configuration variables, color palettes
A mixin defined in components/ is unavailable to variables/. Use !default on variables so child themes can override. Use map.deep-merge() to extend parent palettes without losing keys.
See references/frontend-patterns.md for complete SCSS examples per folder.
Layout Updates
Layout updates are YAML files that modify the layout tree at runtime:
See references/layout-actions.md for the full action reference.
JavaScript Page Components
OroCommerce uses Chaplin.js-based page components initialized from server-rendered HTML via data-page-component-module and data-page-component-options attributes. Register modules in jsmodules.yml under dynamic-imports: for async loading.
See references/frontend-patterns.md for full Chaplin.js examples and jsmodules.yml configuration.
Key Pitfalls
SCSS folder order: Defining a variable in components/ won't work if variables/ hasn't compiled yet. Follow the strict order: settings, variables, components.
Block naming: Twig layout blocks must end with widget. ID-specific blocks use underscore prefix: productdetailswidget. Missing either breaks template resolution.
Parent theme inheritance: Use map.deep-merge() to extend parent color palettes. Direct assignment replaces the entire palette, losing parent keys.