--- id: skills-il/localization/hebrew-tailwind-preset version: "eb0207f5" license: MIT install: manual updated: 2026-07-27 --- # hebrew-tailwind-preset — Set up Tailwind CSS v4 to support Hebrew right-to-left layouts using built-in dir variants, logical utilities (ms-/me-/ps-/pe-), and Hebrew-optimized font stacks. Covers installation for Vite and PostCSS toolchains, font loading with swap display, and RTL-specific component patterns. Publisher: skills-il · Stars: 21 · Updated: 2026-07-27 Install (manual): `git clone https://github.com/skills-il/localization` ## SKILL.md # Hebrew Tailwind Preset Tailwind CSS v4 recommended (current release v4.3, May 2026); v3.1+ is compatible for `dir` variants. Works with React, Vue, Angular, Next.js, and Nuxt. No network required. ## Instructions ### Step 1: Install and Configure Tailwind v4 for RTL See `references/rtl-config.md` for complete configuration reference. **Install the Tailwind v4 build plugin first.** Tailwind v4 dropped the automatic `tailwind.config.js` loading, so `@import "tailwindcss"` alone will not build until a build plugin is wired. Pick the one matching your toolchain: ```bash # Vite (recommended): install the first-party Vite plugin npm install tailwindcss @tailwindcss/vite ``` ```js // vite.config.js -- add the plugin import { defineConfig } from 'vite'; import tailwindcss from '@tailwindcss/vite'; export default defineConfig({ plugins: [tailwindcss()], }); ``` ```bash # PostCSS-based toolchains (Next.js, Webpack, etc.) npm install tailwindcss @tailwindcss/postcss postcss ``` ```js // postcss.config.mjs export default { plugins: { '@tailwindcss/postcss': {} }, }; ``` In v4 the `@tailwindcss/postcss` plugin handles `@import` inlining and vendor prefixing, so `postcss-import` and `autoprefixer` are no longer needed. Then load Hebrew fonts with `font-display: swap` (via a Google Fonts `` or an `@font-face` rule) to avoid a Flash of Invisible Text while the Hebrew font file loads. See Step 2 for the snippet. **Tailwind v4 (CSS-first configuration):** ```css /* app.css -- imported by your build entry */ @import "tailwindcss"; @theme { /* Hebrew font stacks */ --font-hebrew: 'Heebo', 'Assistant', 'Noto Sans Hebrew', sans-serif; --font-hebrew-serif: 'Frank Ruhl Libre', 'David Libre', serif; --font-mono: 'Fira Code', 'Source Code Pro', monospace; /* Hebrew-optimized type scale */ --text-xs: 0.8125rem; --text-sm: 0.875rem; --text-base: 1rem; --text-lg: 1.125rem; --text-xl: 1.25rem; --text-2xl: 1.5rem; --text-3xl: 1.875rem; --text-4xl: 2.25rem; /* Hebrew line heights (taller than Latin defaults) */ --leading-tight: 1.4; --leading-normal: 1.7; --leading-relaxed: 1.9; } ``` **Tailwind v3 (JavaScript configuration):** ```js // tailwind.config.js module.exports = { content: ['./src/**/*.{html,js,jsx,tsx}'], theme: { extend: { fontFamily: { hebrew: ['Heebo', 'Assistant', 'Noto Sans Hebrew', 'sans-serif'], 'hebrew-serif': ['Frank Ruhl Libre', 'David Libre', 'serif'], }, lineHeight: { 'hebrew': '1.7', 'hebrew-tight': '1.4', 'hebrew-relaxed': '1.9', }, }, }, plugins: [], }; ``` **Load the Hebrew fonts with `font-display: swap`.** Either add a Google Fonts `` in your HTML head: ```html ``` Or self-host with an `@font-face` rule inside the same CSS file as your `@theme` block: ```css @font-face { font-family: 'Heebo'; src: url('/fonts/heebo-variable.woff2') format('woff2'); font-weight: 400 700; font-display: swap; } ``` The `&display=swap` query param (link) and the `font-display: swap` descriptor (`@font-face`) both make the browser render fallback text immediately instead of hiding text until the Hebrew font loads. **Next.js: wire `next/font` through `@theme inline`.** When you self-host with `next/font` (recommended for Next.js: no external request, no layout shift), the font is exposed as a CSS variable, and `@theme` cannot reference a runtime variable directly. Use `@theme inline` so the variable resolves at the use site: ```css /* app.css */ @import "tailwindcss"; @theme inline { --font-hebrew: var(--font-heebo); /* --font-heebo comes from next/font */ } ``` ```tsx // layout.tsx import { Heebo } from 'next/font/google'; const heebo = Heebo({ subsets: ['hebrew', 'latin'], variable: '--font-heebo' }); // ... ``` Plain `@theme { --font-hebrew: var(--font-heebo); }` (without `inline`) breaks, because Tailwind tries to resolve the variable at build time when it does not yet exist. ### Step 2: Use Logical Property Utilities Tailwind v4's native logical utilities and `rtl:`/`ltr:` variants cover RTL on their own, so the old community `tailwindcss-rtl` plugin is no longer needed. Always prefer logical utilities over physical directional ones: | Physical (avoid) | Logical (use) | RTL Behavior | |-------------------|--------------|--------------| | `ml-4` | `ms-4` | Right margin in RTL | | `mr-4` | `me-4` | Left margin in RTL | | `pl-4` | `ps-4` | Right padding in RTL | | `pr-4` | `pe-4` | Left padding in RTL | | `left-0` | `inset-s-0` | Right: 0 in RTL (v4.3+; `start-0` is the deprecated alias) | | `right-0` | `inset-e-0` | Left: 0 in RTL (v4.3+; `end-0` is the deprecated alias) | | `border-l` | `border-s` | Right border in RTL | | `border-r` | `border-e` | Left border in RTL | | `rounded-l-lg` | `rounded-s-lg` | Right rounded in RTL | | `rounded-r-lg` | `rounded-e-lg` | Left rounded in RTL | | `text-left` | `text-start` | Right-aligned in RTL | | `text-right` | `text-end` | Left-aligned in RTL | | `scroll-ml-4` | `scroll-ms-4` | Right scroll margin in RTL | **Tailwind v4.3 inset rename.** As of v4.3 (May 2026) the logical *positioning* utilities `start-*`/`end-*` are deprecated in favor of `inset-s-*`/`inset-e-*` (so they line up with `inset-bs-*`/`inset-be-*`). The old names still work, but prefer `inset-s-0`/`inset-e-0` in new code. This rename affects only inset/positioning; the margin/padding/border utilities `ms-*`/`me-*`/`ps-*`/`pe-*`/`border-s`/`border-e` are unchanged. Arbitrary values compose with logical utilities too (e.g. `ms-[3px]`, `inset-s-[10px]`). ### Step 3: Use Dir Variants for RTL-Specific Styles **Prerequisite:** the `rtl:` and `ltr:` variants (built into Tailwind v4) match on an ancestor's `dir` attribute. They do nothing unless an ancestor element actually carries `dir="rtl"` (or `dir="ltr"`) - normally the `` element. Set `dir="rtl"` on the root before relying on any `rtl:` utility below. Because these variants resolve via the CSS `:dir()` pseudo-class, they also respond correctly to `dir="auto"` on mixed Hebrew/English user content, not only an explicit `dir="rtl"`. **Dark mode in v4.** The v3 `darkMode` config key is gone. In v4 you opt into class-based dark mode in CSS with `@custom-variant dark (&:where(.dark, .dark *));`, then combine freely with direction, e.g. `class="dark:bg-gray-900 rtl:text-right"`. Set `dir="rtl"` on `` and toggle `.dark` on the same element. When you need direction-specific overrides: ```html
טקסט גוף עם ריווח מותאם לקריאות עברית.
פריט מספר ORD-12345 אושר
``` ### Step 5: RTL-First Component Patterns with Tailwind **RTL-first card:** ```htmlתוכן הכרטיס עם טקסט בעברית.