RTL & Internationalisation

Sitka is built on CSS logical properties so layouts mirror correctly in right-to-left scripts (Arabic, Hebrew, Persian) without overrides. This page covers the property mapping, audit checklist, and language detection patterns.

Why logical properties

Physical properties like margin-left are hardcoded to screen direction. Logical properties like margin-inline-start resolve relative to the writing direction set by dir or writing-mode. In LTR, inline-start is left. In RTL, it becomes right — automatically.

Physical (avoid)

.sidebar {
  margin-left: 16px;
  padding-left: 12px;
  border-left: 1px solid …;
  left: 0;
}

Logical (preferred)

.sidebar {
  margin-inline-start: 16px;
  padding-inline-start: 12px;
  border-inline-start: 1px solid …;
  inset-inline-start: 0;
}

Property mapping

PhysicalLogical equivalentNotes
margin-leftmargin-inline-startLeading margin — left in LTR, right in RTL
margin-rightmargin-inline-endTrailing margin
padding-leftpadding-inline-startLeading padding
padding-rightpadding-inline-endTrailing padding
border-leftborder-inline-startLeading border
border-rightborder-inline-endTrailing border
leftinset-inline-startPositioned element leading edge
rightinset-inline-endPositioned element trailing edge
topinset-block-startBlock start (usually top)
bottominset-block-endBlock end (usually bottom)
widthinline-sizeHorizontal size
heightblock-sizeVertical size
text-align: lefttext-align: startAlign to reading start
text-align: righttext-align: endAlign to reading end
float: leftfloat: inline-startFloat to reading start

Setting direction

HTML — attribute
<!-- LTR (default) -->
<html lang="en" dir="ltr">

<!-- RTL (Arabic, Hebrew, Persian) -->
<html lang="ar" dir="rtl">

<!-- Mixed content: scope to element -->
<p dir="rtl">مرحبا</p>
Next.js — locale middleware
// app/layout.tsx
export default function RootLayout({
  children,
  params: { locale },
}: {
  children: React.ReactNode;
  params: { locale: string };
}) {
  const dir = ["ar","he","fa","ur"].includes(locale)
    ? "rtl" : "ltr";

  return (
    <html lang={locale} dir={dir}>
      <body>{children}</body>
    </html>
  );
}

Audit checklist

Use this checklist when auditing an existing component for RTL support. ✓ = covered by logical properties. △ = requires manual review.

ItemStatusNotes
Directional margins / paddingUse inline-start / inline-end
Absolute positioning (left/right)Use inset-inline-start / end
Text alignmentUse start / end, not left / right
Border radius (leading corner)Use border-start-start-radius etc.
Icons inside buttonsReview icon direction (arrows, chevrons)
Flex row directionflex-direction: row already mirrors in RTL
Animations (slide from left)Use translateX with logical sign or rtl overrides
Custom scroll positioningscrollLeft behaves differently in RTL

Tailwind CSS v4

Tailwind v4 ships logical property utilities natively. Use ps-4 (padding-inline-start) and pe-4 (padding-inline-end) instead of pl-4 / pr-4 for components that must work in RTL.

  • ps-{n} / pe-{n} → padding-inline-start / end
  • ms-{n} / me-{n} → margin-inline-start / end
  • start-{n} / end-{n} → inset-inline-start / end
  • border-s / border-e → border-inline-start / end
  • rounded-s-{n} / rounded-e-{n} → leading / trailing corner radius