agentsclimarketplace

Rtl ui design advisor

Skill skillim-hub/skills/rtl-ui-design-advisor

Production-grade AI agent skills & MCP servers for the Israeli market — סקילים

Install
npx -y skills add skillim-hub/skills --skill rtl-ui-design-advisor

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Practical guidance and static checks for right-to-left Hebrew and Arabic interfaces in HTML, CSS, React, and Tailwind.

SKILL.md

12.0 KB, ~3.3k tokens by cl100k_base, as published. Nobody here has run it

RTL UI Design Advisor

Purpose

Build right-to-left interfaces that feel native for Hebrew and Arabic users in Israel. Cover layout direction, bidirectional text, forms, React component architecture, Tailwind usage, accessibility checkpoints, QA, and production readiness. Prioritize real workflows for small businesses, freelancers, nonprofit teams, local services, stores, booking pages, receipts, invoices, support portals, and consumer accounts.

Use semantic direction boundaries. Prefer logical layout primitives over duplicated LTR and RTL styles. Keep numbers, URLs, email addresses, coupon codes, bank details, phone numbers, invoice numbers, order identifiers, and SKU codes readable inside Hebrew or Arabic sentences.

Default decisions

DecisionUseAvoid
Page direction<html lang="he" dir="rtl"> or <html lang="ar" dir="rtl">Setting direction: rtl only on body
Alignmenttext-align: starttext-align: right as a global default
Spacingmargin-inline-start, padding-inline-end, gapmargin-left, padding-right
Positioninginset-inline-start, inset-inline-endleft, right
IconsMirror only directional iconsMirroring logos, currency symbols, charts, phones, calendars, or user icons
Input directiondir="auto" for names and free text; dir="ltr" for email, URLs, phone, IDs, amounts, and codesOne direction for every input
CurrencyIntl.NumberFormat("he-IL", { style: "currency", currency: "ILS" }) plus isolation in surrounding RTL textManual concatenation without bidirectional isolation
DatesExplicit Israeli policy, commonly DD/MM/YYYY such as 03/06/2026Ambiguous date strings such as 03/04/2026 without policy
QAHebrew, Arabic, English, mixed strings, mobile, keyboard, screen reader, PDF, emailVisual-only desktop review

Decision tree: choose the direction strategy

flowchart TD
  A[Start with product language model] --> B{Single Hebrew or Arabic UI?}
  B -- Yes --> C[Set html lang and dir to RTL]
  B -- No --> D{Per-page locale route?}
  D -- Yes --> E[Set html lang and dir from route or server layout]
  D -- No --> F{Mixed content inside one page?}
  F -- Yes --> G[Keep page direction stable and use dir=auto or bdi for dynamic fragments]
  F -- No --> H[Use component-level dir only for embedded widgets]
  C --> I[Use logical CSS and direction-safe components]
  E --> I
  G --> I
  H --> I
  I --> J[Test Hebrew, Arabic, English, and mixed values]

HTML foundation

Set language and direction at the highest stable boundary.

<!doctype html>
<html lang="he" dir="rtl">
  <head>
    <meta charset="utf-8" />
    <title>ניהול הזמנות</title>
  </head>
  <body>
    <main>
      <h1>הזמנות פתוחות</h1>
    </main>
  </body>
</html>

For Arabic:

<html lang="ar" dir="rtl">

For a route-level locale in React:

type Locale = "he" | "ar" | "en";

export function RootLayout({ locale, children }: { locale: Locale; children: React.ReactNode }) {
  const dir = locale === "he" || locale === "ar" ? "rtl" : "ltr";
  return (
    <html lang={locale} dir={dir}>
      <body>{children}</body>
    </html>
  );
}

Bidirectional text

Use <bdi> around variable inline values. Use dir="auto" when a user-provided value can start in Hebrew, Arabic, English, a number, or a symbol.

<p>לקוח: <bdi dir="auto">Maya Cohen</bdi></p>
<p>מסעדה: <bdi dir="auto">مطعم القدس</bdi></p>
<p>מספר הזמנה: <bdi dir="ltr">ORD-2026-0042</bdi></p>
<p>דוא"ל: <bdi dir="ltr">[email protected]</bdi></p>
<p>סה"כ לתשלום: <bdi dir="ltr">₪ 1,250.00</bdi></p>
<p>תאריך אספקה: <bdi dir="ltr">03/06/2026</bdi></p>

Avoid unicode-bidi: bidi-override for ordinary interface text. It forces character order and often damages mixed-language content. Use isolation instead.

Form direction matrix

FieldRecommended directionNotes
Full namedir="auto"Handles Hebrew, Arabic, English, and mixed names
Business namedir="auto"Handles local names, English brands, and legal suffixes
Free-text notedir="auto"Keeps paragraph direction natural
Searchdir="auto"Query may be a Hebrew phrase, Arabic phrase, SKU, or email
Emaildir="ltr"Keeps @, dots, and domain order stable
URLdir="ltr"Keeps protocol, path, and query string stable
Phonedir="ltr"Add inputmode="tel"
Amountdir="ltr" or isolated localized displayKeeps digits and decimal point stable
Israeli ID / business numberdir="ltr"Keeps all digits in order
Bank accountdir="ltr"Keeps branch and account digits stable
<label for="customer-name">שם לקוח</label>
<input id="customer-name" name="customerName" dir="auto" autocomplete="name" />

<label for="email">דוא"ל</label>
<input id="email" name="email" type="email" dir="ltr" autocomplete="email" />

<label for="phone">טלפון</label>
<input id="phone" name="phone" type="tel" dir="ltr" inputmode="tel" autocomplete="tel" />

<label for="amount">סכום</label>
<input id="amount" name="amount" inputmode="decimal" dir="ltr" />

CSS: prefer logical properties

Logical properties adapt to dir and encode intent.

.card {
  padding-inline: 1rem;
  padding-block: 0.75rem;
  border-inline-start: 4px solid currentColor;
}

.toolbar {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
  justify-content: space-between;
}

.badge {
  position: absolute;
  inset-inline-end: 0.5rem;
  inset-block-start: 0.5rem;
}

Physical-to-logical table

Physical propertyLogical replacement
margin-leftmargin-inline-start or margin-inline-end after semantic review
margin-rightmargin-inline-end or margin-inline-start after semantic review
padding-leftpadding-inline-start
padding-rightpadding-inline-end
border-leftborder-inline-start
border-rightborder-inline-end
leftinset-inline-start
rightinset-inline-end
topinset-block-start
bottominset-block-end
text-align: lefttext-align: start or end by meaning
text-align: righttext-align: start for default RTL paragraphs

Before:

.invoice-row {
  padding-left: 16px;
  margin-right: 8px;
  text-align: right;
}

After:

.invoice-row {
  padding-inline-start: 16px;
  margin-inline-end: 8px;
  text-align: start;
}

React patterns

Derive direction from locale once.

type Locale = "he" | "he-IL" | "ar" | "ar-IL" | "en" | "en-IL";

const rtlLocales = new Set<Locale>(["he", "he-IL", "ar", "ar-IL"]);

export function getDir(locale: Locale): "rtl" | "ltr" {
  return rtlLocales.has(locale) ? "rtl" : "ltr";
}

Use it at the shell:

export function AppShell({ locale, children }: { locale: Locale; children: React.ReactNode }) {
  const dir = getDir(locale);
  return (
    <div lang={locale} dir={dir}>
      {children}
    </div>
  );
}

Render dynamic values with isolation:

export function InlineValue({ value, dir = "auto" }: { value: string | number; dir?: "auto" | "ltr" | "rtl" }) {
  return <bdi dir={dir}>{String(value)}</bdi>;
}

Format Israeli values:

export function formatILS(amount: number, locale: "he-IL" | "ar-IL" | "en-IL" = "he-IL") {
  return new Intl.NumberFormat(locale, {
    style: "currency",
    currency: "ILS",
    currencyDisplay: "symbol",
  }).format(amount);
}

export function formatIsraelDate(date: Date) {
  const parts = new Intl.DateTimeFormat("en-GB", {
    day: "2-digit",
    month: "2-digit",
    year: "numeric",
  }).formatToParts(date);
  const get = (type: string) => parts.find((part) => part.type === type)?.value ?? "";
  return `${get("day")}/${get("month")}/${get("year")}`;
}

Verified VAT note

As of the 03/06/2026 verification pass, official Israeli sources confirm the standard VAT rate as 18%, effective 01/01/2025. Do not hard-code the rate in visual components. Load rates from configuration, the server, or shared business logic so future changes do not require UI rewrites.

Tailwind guidance

Use logical utilities in modern Tailwind.

<div dir="rtl" class="p-4">
  <article class="border-s-4 ps-4 text-start">
    <h2 class="text-xl font-bold">חשבונית מס</h2>
    <p class="mt-2">סה"כ: <bdi dir="ltr">₪ 1,250.00</bdi></p>
  </article>
</div>
AvoidPrefer
ml-4ms-4 or me-4 after semantic review
mr-4me-4 or ms-4 after semantic review
pl-4ps-4
pr-4pe-4
left-0start-0
right-0end-0
text-lefttext-start
text-righttext-start for default RTL paragraphs or text-end for trailing alignment
border-lborder-s
border-rborder-e
space-x-4gap-4 when possible

Accessibility checkpoints

  • Set lang accurately for page and embedded language changes.
  • Set dir at stable boundaries and portal roots.
  • Preserve logical keyboard order.
  • Keep focus outlines visible.
  • Associate labels and controls programmatically.
  • Connect error messages with aria-describedby.
  • Test screen-reader output for Hebrew, Arabic, English, amounts, dates, and validation messages.
  • Avoid conveying state only through left or right placement.
  • Validate zoom and enlarged text in RTL.

Anti-patterns

Anti-patternConsequenceSafer pattern
body { direction: rtl; } without root dirBrowser and assistive technology inconsistenciesSet <html lang="he" dir="rtl">
Replacing every left with rightBreaks semantic sides and embedded LTR contentConvert intent to logical properties
Global flex-row-reverseCreates unexpected reading and keyboard orderLet dir control inline start/end
Mirroring every SVGDamages logos, charts, symbols, and media controlsMirror only directional icons
Manual concatenationPunctuation and symbol may moveUse Intl.NumberFormat and <bdi>
text-align: right everywhereDamages English and auto-direction contentUse text-align: start
Manual date stringsCreates ambiguityUse explicit DD/MM/YYYY policy
Duplicated RTL stylesheetCauses drift between variantsUse logical CSS and targeted exceptions

Production checklist

Structure

  • Root layout sets lang and dir.
  • Locale switching updates language and direction together.
  • Dialogs, popovers, tooltips, and toast portals inherit direction.
  • Dynamic values use <bdi> or dir="auto".

CSS and components

  • Physical spacing, borders, and insets are replaced or justified.
  • text-align: start is the default.
  • gap replaces fragile margin spacing.
  • Icon mirroring follows semantic meaning.
  • Carousels, drawers, steppers, breadcrumbs, and pagination are reviewed.

Forms

  • Names, business names, search, and notes use dir="auto".
  • Email, URL, phone, amount, ID, SKU, and bank fields use LTR direction.
  • Error summaries preserve task order.
  • Mobile keyboards match field type.

Israeli localization

  • ILS amounts show ₪ and remain isolated in RTL sentences.
  • Dates follow an explicit DD/MM/YYYY policy where required by the product.
  • Phone numbers are readable and machine-actionable.
  • Invoice and receipt labels match entity type and accounting context.
  • Standard Israeli VAT is documented as 18% effective 01/01/2025 and double-confirmed for 2026 in references/verification-log.md; rates still come from configuration or business logic, not visual components.

QA

  • Test Hebrew, Arabic, English, and mixed content.
  • Test small screens, zoom, and large text.
  • Test keyboard-only navigation.
  • Test screen-reader output.
  • Test PDFs, emails, receipts, invoices, and print views.
  • Capture screenshots before and after rollout.

Gives 0 of the 12 instructions most css styling skills give in ~3.3k tokens

Counted across 586 of the 596 authors here whose files we hold, read 2026-08-06

  • avoid excessive centered layoutsin 55 of 586, across 12 files
  • bundle code into single HTML filein 54 of 586, across 14 files
  • Respect prefers-reduced-motion user settingsin 52 of 586, across 35 files
  • avoid purple gradientsin 51 of 586, across 11 files
  • avoid uniform rounded cornersin 51 of 586, across 11 files
  • avoid Inter fontin 51 of 586, across 11 files
  • edit generated files to develop artifactin 50 of 586, across 10 files
  • animate only transform and opacity propertiesin 43 of 586
  • Make touch targets at least 44x44 pixelsin 41 of 586, across 15 files
  • Ensure minimum color contrast of 4.5:1in 39 of 586, across 10 files
  • use tailwind cssin 39 of 586, across 24 files
  • Use SVG icons instead of emojisin 38 of 586, across 11 files

Said here and by no other author read

  • set language and direction at the highest boundary
  • use logical layout primitives over duplicated styles
  • isolate dynamic values using bdi or dir auto
  • use dir ltr for emails urls phones and ids
  • derive direction from locale once
  • load tax rates from configuration

Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.