5fe978c0ca
- BookingDayGrid (artifacts/tx-os/src/pages/protocol.tsx): booking blocks are
now <button type="button"> with onClick -> new optional onSelect prop,
hover/focus-visible styles, aria-label (title/room/time) and
data-testid="calendar-booking-{id}".
- ProtocolPage: new detailsBooking state; day grid passes onSelect; new
read-only details Dialog (before AppDock) with:
header = booking title + status pill + public-request badge;
summary card = date, time range (LTR), duration, room, reference,
meeting type; requester section = name, phone (LTR), entity (external
only), department, attendee count; meeting section = purpose + key
attendees with side badges; notes; rejection-reason box when rejected.
Empty/null fields hidden via DetailRow helper.
- New helpers: DetailRow component, formatDuration(start,end,t) using
pluralized i18n keys.
- i18n: protocol.bookings.details.* added to ar.json (full Arabic plural
forms for hours/minutes) and en.json.
- View-only per task scope (no edit/approve/cancel in dialog).
- tsc --noEmit clean; both locale JSONs valid; architect review PASS.