| `ScheduleDayPicker` | Appointments / Treatment day headers — nav arrows + today toggle + expandable panel. **`compact`**: no field label; date centered; Today on the navigator row |
| `CalendarDaySelect` | Navigator wrapper (arrows + panel). Empty `label` + `showHeader={false}` puts Today beside the date (used by `compact`) |
| `CalendarDayPartsPanel` | Year / month / day row — used by schedule picker and `AppDateInput` |
Persian (`fa`): Jalali calendar + `arabext` digits via Intl (`usesPersianCalendar`). Internal model stays **`Date` at local midnight** (Gregorian) — APIs unchanged.
- Gregorian typing: `frontend/src/lib/i18n/dateInputFormat.ts`
- Gregorian month labels: `schedule.monthJanuary` … message keys
## RTL
-`dir` / `lang` on `<html>` from `app/[locale]/layout.tsx`
-`isRtlLocale` in `frontend/src/i18n/routing.ts`
- Use **logical** CSS: `text-start`, `text-end`, `ps-*`, `pe-*`, `ms-*`, `me-*`
- **`Table`**: default `[&_th]:text-start [&_td]:text-start`; override with `text-center` or `text-end` on cells — **never**`text-left` / `text-right` on headers (causes header/body column drift in RTL)
- Minimal overrides in `globals.css` — avoid double-mirroring (no extra `row-reverse` on shells that already inherit `direction: rtl`)
## i18n strings
- User-facing copy: `frontend/messages/{en,fa,nl}.json` — all three locales.
## Verify
```bash
cd frontend && npx tsc --noEmit
```
Manual: switch to Persian — Cases date filters, Tasks filter row (single line + sort visible), Staff/Orgs table columns aligned; switch to English — date fields match adjacent dropdown alignment.