← Files WixARCHIVED FILE

skills/wix-app/references/editor-react-component/DIRECTIONALITY.md

3.46 KB · Sep 30, 2026 · 23:18 UTC

↓ Download file

# Component Directionality (RTL/LTR)

Rules and patterns for direction support in Editor React components.

---

## Rules

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.

### Direction Resolution

```typescript
const subComponentDirection = elementProps?.subComponent?.direction;
```

- Sub-component directions only applied when explicitly set (to override inherited direction)
- When undefined: inherits direction from parent via CSS inheritance
- Root component always gets fallback class

### Direction Anti-Patterns

```scss
/* ❌ Don't use CSS variables for direction */
.component { direction: var(--component-direction, ltr); }
```

```tsx
/* ❌ Don't use conditional logic for fallback class */
className={classNames({
  [styles.fallbackDirection]: !direction
})}
```

### RTL in SCSS

Use logical CSS properties — never physical `left`/`right`-only layouts. See §2.1 below.

---

## Patterns

### Root Element Pattern

Apply on main component only:

```typescript
<div
  dir={direction}
  className={classNames(
    styles.root,
    className,
    styles.fallbackDirection,
  )}
>
```

```scss
.fallbackDirection:not([dir]) {
  direction: var(--wix-opt-in-direction);
}
```

**Imports:**

```typescript
import type { Direction } from '@wix/editor-react-types';
```

### Child Element Direction

Only when explicitly specified:

```typescript
const labelDirection = elementProps?.label?.direction;

<span
  dir={labelDirection}
>
```

### Runtime Direction Checking

**Environment Service (for site direction):**

Use service when direction drives JavaScript behavior (keyboard navigation, animation logic, conditional rendering).

```typescript
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):**

```typescript
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):

```scss
.scrollButton {
  scale: var(--wix-opt-in-direction-multiplier, 1) 1;
}
```

### RTL Support — Use Logical CSS Properties

**✅ Correct:**

```scss
.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:**

```scss
.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.

---

## Common Mistake: Manual RTL Handling

**❌ Wrong:**

```scss
.element {
  padding-left: 8px;
  [dir='rtl'] & {
    padding-right: 8px; // Manual overrides
  }
}
```

**✅ Correct:**

```scss
.element {
  padding-inline-start: 8px; // Auto RTL/LTR
}
```

## Container Components and RTL Inheritance

Elements that render `React.ReactNode` content MUST have `dir="ltr"` to prevent RTL inheritance from the parent component:

```tsx
<Accordion.Content dir="ltr">
  {item.content} {/* React.ReactNode */}
</Accordion.Content>
```

SHA-256: ee87243412e26f5eeb983ca44dc31bfec4fa5be8ab7a1f35bdb2587e34a3a6e9