A comprehensive guide to understanding which icons should mirror in RTL layouts and which should stay the same—with a simple decision framework.
Karim Benali
Senior frontend developer with 10+ years building RTL-first applications.
When localizing interfaces for RTL languages, one of the trickiest questions designers and developers face is: Which icons should flip?
The answer seems simple at first—flip everything for RTL, right? Wrong. Some icons should mirror, while others must stay exactly the same. Getting this wrong creates confusing, sometimes broken user experiences.
Here's the golden rule:
Let's break down what this means and how to apply it consistently.
These icons represent movement or direction in physical or interface space. They should flip because the concept of "forward" and "back" reverses in RTL.
Examples:
These icons represent concepts, objects, or actions that are universal regardless of reading direction. They communicate meaning through symbolism, not direction.
Examples:
| Icon Type | LTR Example | RTL Behavior | Reason |
|---|---|---|---|
| Directional | |||
| Back arrow | ← | → (flip) | Direction represents navigation |
| Forward arrow | → | ← (flip) | Direction represents navigation |
| Chevron right | › | ‹ (flip) | Points to content direction |
| Reply | ↩ | ↪ (flip) | Curves toward reading start |
| Undo | ↶ | ↷ (flip) | Cultural reading direction |
| Semantic | |||
| Search | 🔍 | 🔍 (stay) | Universal object |
| Close | ✕ | ✕ (stay) | No directional meaning |
| Download | ⬇ | ⬇ (stay) | Vertical, not horizontal |
| Settings | ⚙ | ⚙ (stay) | Universal symbol |
| Plus | + | + (stay) | Mathematical symbol |
| Checkmark | ✓ | ✓ (stay) | Universal approval |
The Physical Metaphor Test: If an icon represents physical movement through space or directional flow (like arrows), it flips. If it represents an object, concept, or vertical action, it doesn't.
Some icons aren't immediately obvious. Here's how to handle the tricky ones:
The play button points right in both LTR and RTL. Why? It represents the universal direction of time and media progression, which is standardized globally as left-to-right regardless of writing system.
Other media controls:
These are learned conventions from physical media devices and should remain consistent.
Text alignment icons are directional because they represent where text aligns:
In RTL, "align left" and "align right" swap meanings because the content frame itself flips.
Speaker icons with sound waves typically point right (🔊). This shouldn't flip—it's a symbolic representation of sound propagation, not directional movement in the interface.
The external link icon (↗) typically points up and to the right. Opinion is divided:
Recommendation: Don't flip. It's become a universal symbol.
The simplest approach for icons in HTML:
/* Flip icons in RTL */
[dir="rtl"] .icon-directional {
transform: scaleX(-1);
}<button>
<svg class="icon-directional">
<!-- back arrow icon -->
</svg>
Back
</button>Don't flip logos, brand marks, or text inside icons! Use this technique only for simple directional icons.
Pros:
Cons:
Load different icon variants based on direction:
import { ChevronLeft, ChevronRight } from 'lucide-react';
function BackButton() {
const dir = useDirection(); // 'ltr' or 'rtl'
const BackIcon = dir === 'rtl' ? ChevronRight : ChevronLeft;
return (
<button>
<BackIcon />
{t('back')}
</button>
);
}Pros:
Cons:
Many modern icon libraries have built-in RTL support:
// Lucide React
import { ArrowLeft } from 'lucide-react';
<ArrowLeft className="rtl-flip" />
// With Tailwind
<ArrowLeft className="rtl:rotate-180" />// Material-UI with auto-mirroring
import ArrowBack from '@mui/icons-material/ArrowBack';
<ArrowBack /> {/* Automatically flips in RTL */}Create a systematic approach:
/* Utility classes */
.flip-in-rtl {
[dir="rtl"] & {
transform: scaleX(-1);
}
}
.rotate-in-rtl {
[dir="rtl"] & {
transform: rotate(180deg);
}
}
/* Never flip */
.no-flip {
transform: none !important;
}<!-- Usage -->
<ChevronRight class="flip-in-rtl" />
<SearchIcon class="no-flip" />How popular icon libraries handle RTL:
| Library | RTL Support | Method | Notes |
|---|---|---|---|
| Material Icons | Built-in | Auto-flip | Automatically mirrors directional icons |
| Heroicons | Manual | CSS classes | Provide direction-specific variants |
| Lucide | Manual | Transform | Use CSS transform or conditional rendering |
| Font Awesome | Manual | CSS classes | Use .fa-flip-horizontal with RTL context |
| Feather Icons | Manual | Transform | Apply CSS transform |
| Bootstrap Icons | Manual | Transform | Apply CSS transform |
Before shipping RTL support, verify these icon behaviors:
Navigation:
Forms:
Actions:
Media:
Content:
Pro tip: Create a dedicated "Icon Gallery" page in your app that displays all icons in both LTR and RTL side-by-side. This makes QA much easier.
/* DON'T: Flip all icons blindly */
[dir="rtl"] svg {
transform: scaleX(-1);
}This breaks semantic icons like search, settings, and media controls.
<!-- DON'T: Flip logos or brand marks -->
<img src="logo.svg" class="flip-in-rtl" />Logos and brand identities should never flip. They're designed with specific orientation.
<!-- BAD: Back button doesn't flip but chevron does -->
<button>
<ArrowLeft /> <!-- Not flipped -->
<ChevronRight class="flip-in-rtl" /> <!-- Flipped -->
</button>Be consistent: if one navigation icon flips, all navigation icons should flip.
<!-- DON'T: This will flip the text too -->
<svg class="flip-in-rtl">
<text>Save</text>
<path d="..." />
</svg>Extracting the icon from text or using conditional rendering instead.
GitHub flips:
GitHub doesn't flip:
Material Design has comprehensive guidelines and auto-flips these icons:
Check out their documentation:
Two categories: Directional icons flip (represent movement), semantic icons don't (represent objects/concepts).
Physical metaphor test: Does the icon represent directional flow through space? If yes, flip it.
Media controls stay: Play, pause, fast-forward use universal conventions—don't flip.
Text alignment flips: These are contextual to content direction.
Choose implementation: CSS transform is simplest, conditional rendering is most flexible.
Test systematically: Create an icon gallery view to QA all icons at once.
When in doubt, don't flip: It's better to have a consistent icon that users recognize than a flipped one that confuses.
A comprehensive guide to understanding which icons should mirror in RTL layouts and which should stay the same—with a simple decision framework.
Karim Benali
Senior frontend developer with 10+ years building RTL-first applications.
When localizing interfaces for RTL languages, one of the trickiest questions designers and developers face is: Which icons should flip?
The answer seems simple at first—flip everything for RTL, right? Wrong. Some icons should mirror, while others must stay exactly the same. Getting this wrong creates confusing, sometimes broken user experiences.
Here's the golden rule:
Let's break down what this means and how to apply it consistently.
These icons represent movement or direction in physical or interface space. They should flip because the concept of "forward" and "back" reverses in RTL.
Examples:
These icons represent concepts, objects, or actions that are universal regardless of reading direction. They communicate meaning through symbolism, not direction.
Examples:
| Icon Type | LTR Example | RTL Behavior | Reason |
|---|---|---|---|
| Directional | |||
| Back arrow | ← | → (flip) | Direction represents navigation |
| Forward arrow | → | ← (flip) | Direction represents navigation |
| Chevron right | › | ‹ (flip) | Points to content direction |
| Reply | ↩ | ↪ (flip) | Curves toward reading start |
| Undo | ↶ | ↷ (flip) | Cultural reading direction |
| Semantic | |||
| Search | 🔍 | 🔍 (stay) | Universal object |
| Close | ✕ | ✕ (stay) | No directional meaning |
| Download | ⬇ | ⬇ (stay) | Vertical, not horizontal |
| Settings | ⚙ | ⚙ (stay) | Universal symbol |
| Plus | + | + (stay) | Mathematical symbol |
| Checkmark | ✓ | ✓ (stay) | Universal approval |
The Physical Metaphor Test: If an icon represents physical movement through space or directional flow (like arrows), it flips. If it represents an object, concept, or vertical action, it doesn't.
Some icons aren't immediately obvious. Here's how to handle the tricky ones:
The play button points right in both LTR and RTL. Why? It represents the universal direction of time and media progression, which is standardized globally as left-to-right regardless of writing system.
Other media controls:
These are learned conventions from physical media devices and should remain consistent.
Text alignment icons are directional because they represent where text aligns:
In RTL, "align left" and "align right" swap meanings because the content frame itself flips.
Speaker icons with sound waves typically point right (🔊). This shouldn't flip—it's a symbolic representation of sound propagation, not directional movement in the interface.
The external link icon (↗) typically points up and to the right. Opinion is divided:
Recommendation: Don't flip. It's become a universal symbol.
The simplest approach for icons in HTML:
/* Flip icons in RTL */
[dir="rtl"] .icon-directional {
transform: scaleX(-1);
}<button>
<svg class="icon-directional">
<!-- back arrow icon -->
</svg>
Back
</button>Don't flip logos, brand marks, or text inside icons! Use this technique only for simple directional icons.
Pros:
Cons:
Load different icon variants based on direction:
import { ChevronLeft, ChevronRight } from 'lucide-react';
function BackButton() {
const dir = useDirection(); // 'ltr' or 'rtl'
const BackIcon = dir === 'rtl' ? ChevronRight : ChevronLeft;
return (
<button>
<BackIcon />
{t('back')}
</button>
);
}Pros:
Cons:
Many modern icon libraries have built-in RTL support:
// Lucide React
import { ArrowLeft } from 'lucide-react';
<ArrowLeft className="rtl-flip" />
// With Tailwind
<ArrowLeft className="rtl:rotate-180" />// Material-UI with auto-mirroring
import ArrowBack from '@mui/icons-material/ArrowBack';
<ArrowBack /> {/* Automatically flips in RTL */}Create a systematic approach:
/* Utility classes */
.flip-in-rtl {
[dir="rtl"] & {
transform: scaleX(-1);
}
}
.rotate-in-rtl {
[dir="rtl"] & {
transform: rotate(180deg);
}
}
/* Never flip */
.no-flip {
transform: none !important;
}<!-- Usage -->
<ChevronRight class="flip-in-rtl" />
<SearchIcon class="no-flip" />How popular icon libraries handle RTL:
| Library | RTL Support | Method | Notes |
|---|---|---|---|
| Material Icons | Built-in | Auto-flip | Automatically mirrors directional icons |
| Heroicons | Manual | CSS classes | Provide direction-specific variants |
| Lucide | Manual | Transform | Use CSS transform or conditional rendering |
| Font Awesome | Manual | CSS classes | Use .fa-flip-horizontal with RTL context |
| Feather Icons | Manual | Transform | Apply CSS transform |
| Bootstrap Icons | Manual | Transform | Apply CSS transform |
Before shipping RTL support, verify these icon behaviors:
Navigation:
Forms:
Actions:
Media:
Content:
Pro tip: Create a dedicated "Icon Gallery" page in your app that displays all icons in both LTR and RTL side-by-side. This makes QA much easier.
/* DON'T: Flip all icons blindly */
[dir="rtl"] svg {
transform: scaleX(-1);
}This breaks semantic icons like search, settings, and media controls.
<!-- DON'T: Flip logos or brand marks -->
<img src="logo.svg" class="flip-in-rtl" />Logos and brand identities should never flip. They're designed with specific orientation.
<!-- BAD: Back button doesn't flip but chevron does -->
<button>
<ArrowLeft /> <!-- Not flipped -->
<ChevronRight class="flip-in-rtl" /> <!-- Flipped -->
</button>Be consistent: if one navigation icon flips, all navigation icons should flip.
<!-- DON'T: This will flip the text too -->
<svg class="flip-in-rtl">
<text>Save</text>
<path d="..." />
</svg>Extracting the icon from text or using conditional rendering instead.
GitHub flips:
GitHub doesn't flip:
Material Design has comprehensive guidelines and auto-flips these icons:
Check out their documentation:
Two categories: Directional icons flip (represent movement), semantic icons don't (represent objects/concepts).
Physical metaphor test: Does the icon represent directional flow through space? If yes, flip it.
Media controls stay: Play, pause, fast-forward use universal conventions—don't flip.
Text alignment flips: These are contextual to content direction.
Choose implementation: CSS transform is simplest, conditional rendering is most flexible.
Test systematically: Create an icon gallery view to QA all icons at once.
When in doubt, don't flip: It's better to have a consistent icon that users recognize than a flipped one that confuses.