Subchapter 2.63
references/editor-react-component/DIRECTIONALITY.mdMarkdown4 KBView on GitHub
Rules and patterns for direction support in Editor React components.
Direction support is mandatory for every component. The pattern uses native HTML dir attributes for standards-compliant, accessible directionality support, with mandatory fallback classes on root components.
const subComponentDirection = elementProps?.subComponent?.direction;/* ❌ Don't use CSS variables for direction */
.component { direction: var(--component-direction, ltr); }/* ❌ Don't use conditional logic for fallback class */
className={classNames({
[styles.fallbackDirection]: !direction
})}Use logical CSS properties — never physical left/right-only layouts. See §2.1 below.
Apply on main component only. dir and the fallback class go on whatever element is the root — never add a wrapper <div> to host them (see PARTS.md Step 0).
<div
id={id}
dir={direction}
className={classNames(
'profile-card',
styles.root,
className,
styles.fallbackDirection,
)}
>/* Root is the component's own semantic element — same attribute, same classes */
<button
type="button"
id={id}
dir={direction}
className={classNames(
'like-button',
styles.root,
className,
styles.fallbackDirection,
)}
>.fallbackDirection:not([dir]) {
direction: var(--wix-opt-in-direction);
}Imports:
import type { Direction } from '@wix/editor-react-types';Only when explicitly specified:
const labelDirection = elementProps?.label?.direction;
<span
dir={labelDirection}
>Environment Service (for site direction):
Use service when direction drives JavaScript behavior (keyboard navigation, animation logic, conditional rendering).
import { useService } from '@wix/services-manager-react';
import { EnvironmentDefinition } from '@wix/environment-service/definition';
const environmentService = useService(EnvironmentDefinition);
const siteDirection = environmentService.getLanguageDirection();
const isRTL = siteDirection === 'rtl';Fallback chain (for child components):
const isRTL = (direction || parentDirection || siteDirection) === 'rtl';CSS Variable
Use css variable --wix-opt-in-direction-multiplier when direction only affects visual appearance (transforms, spacing, layout):
.scrollButton {
scale: var(--wix-opt-in-direction-multiplier, 1) 1;
}✅ Correct:
.element {
inset-inline-start: 0; // Instead of left
inset-inline-end: 0; // Instead of right
padding-inline-start: 8px; // Instead of padding-left
margin-inline-end: 4px; // Instead of margin-right
}❌ Wrong:
.element {
padding-left: 8px;
[dir='rtl'] & {
padding-right: 8px; // Manual RTL - avoid
}
}Use logical CSS properties (e.g., margin-inline-start not margin-left) for RTL support.
❌ Wrong:
.element {
padding-left: 8px;
[dir='rtl'] & {
padding-right: 8px; // Manual overrides
}
}✅ Correct:
.element {
padding-inline-start: 8px; // Auto RTL/LTR
}Elements that render React.ReactNode content MUST have dir="ltr" to prevent RTL inheritance from the parent component:
<Accordion.Content dir="ltr">
{item.content} {/* React.ReactNode */}
</Accordion.Content>