open-design/skills
Mohamed Abdallah be1b3dae40
craft: add rtl-and-bidi so OD artifacts don't break for Arabic / Hebrew / Persian users (#595)
* feat(craft): add rtl-and-bidi + opt-ins on blog-post, docs-page, finance-report

Module 4 of 5 in the behavioral craft series proposed in #501. Modules
1 (state-coverage, #502) and 2 (animation-discipline, #515) merged.
Module 3 (accessibility-baseline, #587) open at time of authoring.

Differentiating niche per the corpus prior-art survey: zero existing
OSS RTL skill is Apache-2.0, framework-agnostic, and aligned with
UAX #9 rev 51. The closest comparators (idanlevi1/rtlify 5★, MIT;
skills-il/localization 7★, MIT) are LTR-web-skewed and don't cover
Flutter Directionality, RN I18nManager, Compose LocalLayoutDirection,
or iOS UIKit semanticContentAttribute / SwiftUI layoutDirection.

Three-loop adversarial review pass via Claude Opus 4.7 xhigh effort
(codex unavailable). Loop 1 caught five revisions (typography spin-out,
WebKit prose compression, mistakes-list trim 12→9, alreq letter-spacing
rename dropped, WebKit r94775 specific revision dropped). Loop 2 caught
one blocking SwiftUI 4 claim and three nits. Loop 3 said ship.

Skill opt-ins picked to avoid PR #587 merge surface: blog-post (long-form
text), docs-page (LTR code islands in RTL prose), finance-report
(numerals + IBAN + currency).

Refs #501.

* fix(craft): rtl-and-bidi review fixes (lefarcen 6 findings)

- P2 #1 WebKit #50949: bug is RESOLVED FIXED, not still open. Verified
  directly against bugs.webkit.org. Removed the broken-WebKit framing;
  the recommendation to prefer <bdi> over CSS now stands on UAX #9
  §2.7 ("prefer markup over CSS or control characters") rather than a
  WebKit bug. Source list updated to drop the dead reference.
- P2 #2 isolate vs embedding controls: U+202C PDF is the
  embedding/override terminator, not an isolate terminator. Split into
  two families: isolate controls (U+2066/2067/2068 + U+2069 PDI) for
  modern code, embedding/override controls (U+202A/202B/202D/202E +
  U+202C PDF) as legacy. Recommend isolates first.
- P2 #3 base direction and language: new section covering
  <html dir lang>, mixed-language subtrees, dir=auto for UGC. Without
  this, agents can follow every other rule and still ship an LTR
  document containing Arabic.
- P2 #4 phone/IBAN/card values: bare <bdi> is unreliable for
  weak/neutral character runs; updated must-mirror bullet and forms
  section to require <bdi dir="ltr">. Added common-mistake entry.
- P3 #1 native mobile budget: added a one-line opt-out hint at the
  top of the section so HTML-only skills know they can skim it. Full
  split into web/native files deferred — the table is 16 lines on a
  176-line file, the cost is bounded.
- P3 #2 lintability: restructured "common mistakes" into three groups
  — mechanically lintable, needs script detection, HTML semantics —
  with explicit exception language (chart axes, physical-object icons,
  platform-pinned UI). Avoids false positives in future linting.

Reviewed via Claude CLI Opus 4.7 xhigh effort (3 loops on the
original draft); these fixes are explicit reviewer responses with
WebKit Bugzilla state verified live.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(craft): rtl-and-bidi mrcfps round-2 precision (lang+dir, isolate picks)

Two non-blocking precision items:

- lang-without-dir scope: previous wording implied English never needs
  dir="ltr". True only at the document root in a default-LTR page.
  lang does not reset an inherited bidi base direction, so an
  <section lang="en"> inside an RTL ancestor still resolves RTL.
  Reworded to "lang without dir is fine at the document root in a
  default-LTR page; inside any opposite-direction ancestor, set both."
- Plain-text isolate picks: previous wording recommended U+2068 / U+2069
  generically. U+2068 is FSI (first-strong auto-detect) — wrong default
  for known-direction runs, especially weak/neutral-heavy values like
  phone, IBAN, card numbers (the same class this file forces to LTR in
  HTML). Split: LRI/PDI for known-LTR, RLI/PDI for known-RTL, FSI/PDI
  reserved for unknown direction. Added an explicit "don't default to
  FSI" callout.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(craft+skills): rtl-and-bidi mrcfps round-3 — skill-body conflicts + bidi semantic correction

P1 BLOCKING — skill-body physical-direction conflicts (mrcfps):

- skills/docs-page: "left nav" / "right-rail TOC" / "left-edge accent
  stripe" survive in skill body even with the rtl-and-bidi opt-in,
  because craft is injected ABOVE the skill body. An Arabic docs
  request would still see "Left nav" and emit physical-direction
  layout. Updated description, lay-out section, and self-check to
  inline-start / inline-end vocabulary; added a self-check bullet
  requiring logical CSS on rails and accent.

- skills/blog-post: pull-quote "accent rule on the left" updated to
  "accent rule on the inline-start edge" with a matching note about
  flipping under dir="rtl".

P1 craft semantic correction (mrcfps):

- HTML-semantics lint: previous wording equated <bdi dir="auto"> with
  unicode-bidi: plaintext. Not equivalent. <bdi> isolates an inline
  run from surrounding bidi resolution; unicode-bidi: plaintext
  changes how base direction is *determined* for each plaintext
  paragraph in a block. Different surfaces. Reworded the lint guidance
  to "prefer semantic isolation in HTML for inline runs; reach for
  unicode-bidi: plaintext only when that block-level paragraph
  behavior is explicitly required and tested" — and explicitly flagged
  that they are not drop-in equivalents to avoid future linters
  flagging valid CSS with a non-equivalent fix.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(craft): rtl-and-bidi mrcfps round-4 — split progress-bar from media scrubber

Non-blocking precision: prior must-mirror bullet lumped "progress-bar
fill" together with sliders, which would have flipped a video / audio
scrubber under dir="rtl" — directly conflicting with the must-not-mirror
rule for media playback controls (play/pause/FF/rewind represent tape
direction, not reading direction). The two cases collide on every audio
or video player.

- Must-mirror progress bars now scoped to "non-media" (download, upload,
  form-completion).
- Media scrubber / progress timeline added explicitly to the must-not-
  mirror media bullet.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 12:43:48 +08:00
..
audio-jingle Add live artifacts and Composio connector catalog (#381) 2026-05-05 16:42:11 +08:00
blog-post craft: add rtl-and-bidi so OD artifacts don't break for Arabic / Hebrew / Persian users (#595) 2026-05-06 12:43:48 +08:00
critique Refactor project name from "Open Claude Design" to "Open Design" (#1) 2026-04-28 16:03:35 +08:00
dashboard feat(craft): accessibility-baseline module + opt-ins on dashboard, hr-onboarding, mobile-onboarding (#587) 2026-05-06 09:18:59 +08:00
dating-web feat(skills): open-design-landing rename, kami skills, landing OG (#428) 2026-05-04 19:22:46 +08:00
design-brief feat: add design-brief skill with structured I-Lang input format (#184) 2026-05-01 23:11:38 +08:00
digital-eguide feat(skills): open-design-landing rename, kami skills, landing OG (#428) 2026-05-04 19:22:46 +08:00
docs-page craft: add rtl-and-bidi so OD artifacts don't break for Arabic / Hebrew / Persian users (#595) 2026-05-06 12:43:48 +08:00
email-marketing feat(skills): open-design-landing rename, kami skills, landing OG (#428) 2026-05-04 19:22:46 +08:00
eng-runbook Refactor project name from "Open Claude Design" to "Open Design" (#1) 2026-04-28 16:03:35 +08:00
finance-report craft: add rtl-and-bidi so OD artifacts don't break for Arabic / Hebrew / Persian users (#595) 2026-05-06 12:43:48 +08:00
gamified-app feat(craft): animation-discipline module + opt-ins on mobile-app, mobile-onboarding, gamified-app (#515) 2026-05-05 18:32:30 +08:00
guizang-ppt docs: add Brazilian Portuguese (pt-BR) translations (#460) 2026-05-05 09:14:06 +08:00
hatch-pet feat(skills): open-design-landing rename, kami skills, landing OG (#428) 2026-05-04 19:22:46 +08:00
hr-onboarding feat(craft): accessibility-baseline module + opt-ins on dashboard, hr-onboarding, mobile-onboarding (#587) 2026-05-06 09:18:59 +08:00
html-ppt docs: add Brazilian Portuguese (pt-BR) translations (#460) 2026-05-05 09:14:06 +08:00
html-ppt-course-module feat(skills): integrate lewislulu/html-ppt-skill + 15 per-template Examples cards (#193) 2026-05-02 11:00:44 +08:00
html-ppt-dir-key-nav-minimal feat(skills): integrate lewislulu/html-ppt-skill + 15 per-template Examples cards (#193) 2026-05-02 11:00:44 +08:00
html-ppt-graphify-dark-graph feat(skills): integrate lewislulu/html-ppt-skill + 15 per-template Examples cards (#193) 2026-05-02 11:00:44 +08:00
html-ppt-hermes-cyber-terminal feat(skills): integrate lewislulu/html-ppt-skill + 15 per-template Examples cards (#193) 2026-05-02 11:00:44 +08:00
html-ppt-knowledge-arch-blueprint feat(skills): integrate lewislulu/html-ppt-skill + 15 per-template Examples cards (#193) 2026-05-02 11:00:44 +08:00
html-ppt-obsidian-claude-gradient feat(skills): integrate lewislulu/html-ppt-skill + 15 per-template Examples cards (#193) 2026-05-02 11:00:44 +08:00
html-ppt-pitch-deck feat(skills): integrate lewislulu/html-ppt-skill + 15 per-template Examples cards (#193) 2026-05-02 11:00:44 +08:00
html-ppt-presenter-mode-reveal feat(skills): integrate lewislulu/html-ppt-skill + 15 per-template Examples cards (#193) 2026-05-02 11:00:44 +08:00
html-ppt-product-launch feat(skills): integrate lewislulu/html-ppt-skill + 15 per-template Examples cards (#193) 2026-05-02 11:00:44 +08:00
html-ppt-taste-brutalist feat(skills): add taste-skill-derived web prototype and HTML PPT examples (#358) 2026-05-03 20:31:05 +08:00
html-ppt-taste-editorial feat(skills): add taste-skill-derived web prototype and HTML PPT examples (#358) 2026-05-03 20:31:05 +08:00
html-ppt-tech-sharing feat(skills): integrate lewislulu/html-ppt-skill + 15 per-template Examples cards (#193) 2026-05-02 11:00:44 +08:00
html-ppt-testing-safety-alert feat(skills): integrate lewislulu/html-ppt-skill + 15 per-template Examples cards (#193) 2026-05-02 11:00:44 +08:00
html-ppt-weekly-report feat(skills): integrate lewislulu/html-ppt-skill + 15 per-template Examples cards (#193) 2026-05-02 11:00:44 +08:00
html-ppt-xhs-pastel-card feat(skills): integrate lewislulu/html-ppt-skill + 15 per-template Examples cards (#193) 2026-05-02 11:00:44 +08:00
html-ppt-xhs-post feat(skills): integrate lewislulu/html-ppt-skill + 15 per-template Examples cards (#193) 2026-05-02 11:00:44 +08:00
html-ppt-xhs-white-editorial feat(skills): integrate lewislulu/html-ppt-skill + 15 per-template Examples cards (#193) 2026-05-02 11:00:44 +08:00
hyperframes Add live artifacts and Composio connector catalog (#381) 2026-05-05 16:42:11 +08:00
image-poster Add live artifacts and Composio connector catalog (#381) 2026-05-05 16:42:11 +08:00
invoice Refactor project name from "Open Claude Design" to "Open Design" (#1) 2026-04-28 16:03:35 +08:00
kami-deck feat(skills): open-design-landing rename, kami skills, landing OG (#428) 2026-05-04 19:22:46 +08:00
kami-landing feat(skills): open-design-landing rename, kami skills, landing OG (#428) 2026-05-04 19:22:46 +08:00
kanban-board feat(craft): state-coverage module + opt-ins on dashboard, mobile-app, kanban-board (#502) 2026-05-05 16:31:05 +08:00
live-artifact Add live artifacts and Composio connector catalog (#381) 2026-05-05 16:42:11 +08:00
magazine-poster Refactor project name from "Open Claude Design" to "Open Design" (#1) 2026-04-28 16:03:35 +08:00
meeting-notes Refactor project name from "Open Claude Design" to "Open Design" (#1) 2026-04-28 16:03:35 +08:00
mobile-app feat(craft): animation-discipline module + opt-ins on mobile-app, mobile-onboarding, gamified-app (#515) 2026-05-05 18:32:30 +08:00
mobile-onboarding feat(craft): accessibility-baseline module + opt-ins on dashboard, hr-onboarding, mobile-onboarding (#587) 2026-05-06 09:18:59 +08:00
motion-frames Refactor project name from "Open Claude Design" to "Open Design" (#1) 2026-04-28 16:03:35 +08:00
open-design-landing feat(skills): open-design-landing rename, kami skills, landing OG (#428) 2026-05-04 19:22:46 +08:00
open-design-landing-deck feat(skills): open-design-landing rename, kami skills, landing OG (#428) 2026-05-04 19:22:46 +08:00
pm-spec Refactor project name from "Open Claude Design" to "Open Design" (#1) 2026-04-28 16:03:35 +08:00
pptx-html-fidelity-audit feat(pptx-fidelity): broaden script coverage beyond CJK (#308) 2026-05-03 00:53:28 +08:00
pricing-page Refactor project name from "Open Claude Design" to "Open Design" (#1) 2026-04-28 16:03:35 +08:00
replit-deck Feat: add replit-deck skill with 8 themes from replit.com/slides (#74) 2026-04-30 11:19:52 +08:00
saas-landing feat(craft): add brand-agnostic craft references + Refero-derived lint rules (#225) 2026-05-02 11:00:33 +08:00
simple-deck Refactor project name from "Open Claude Design" to "Open Design" (#1) 2026-04-28 16:03:35 +08:00
social-carousel Refactor project name from "Open Claude Design" to "Open Design" (#1) 2026-04-28 16:03:35 +08:00
sprite-animation Refactor project name from "Open Claude Design" to "Open Design" (#1) 2026-04-28 16:03:35 +08:00
team-okrs Refactor project name from "Open Claude Design" to "Open Design" (#1) 2026-04-28 16:03:35 +08:00
tweaks Refactor project name from "Open Claude Design" to "Open Design" (#1) 2026-04-28 16:03:35 +08:00
video-shortform Add live artifacts and Composio connector catalog (#381) 2026-05-05 16:42:11 +08:00
web-prototype Refactor project name from "Open Claude Design" to "Open Design" (#1) 2026-04-28 16:03:35 +08:00
web-prototype-taste-brutalist feat(skills): add taste-skill-derived web prototype and HTML PPT examples (#358) 2026-05-03 20:31:05 +08:00
web-prototype-taste-editorial feat(skills): add taste-skill-derived web prototype and HTML PPT examples (#358) 2026-05-03 20:31:05 +08:00
web-prototype-taste-soft feat(skills): add taste-skill-derived web prototype and HTML PPT examples (#358) 2026-05-03 20:31:05 +08:00
weekly-update Refactor project name from "Open Claude Design" to "Open Design" (#1) 2026-04-28 16:03:35 +08:00
wireframe-sketch Refactor project name from "Open Claude Design" to "Open Design" (#1) 2026-04-28 16:03:35 +08:00