Locale-aware date and time formatters built on `Intl.DateTimeFormat` with the user's locale (no hardcoded locale). Mirrors `src/lib/format-date.ts` from the openframe-frontend app so both codebases render dates the same way — american (`05/05/2026`) or european (`05.05.2026`) format depending on the user's locale. ## Key Components - `formatDate()` - Short locale-formatted date (`dateStyle: 'short'`) - `formatTime()` - Short locale-formatted time (`timeStyle: 'short'`) All formatters accept `string | number | Date` input and guard against invalid dates, returning the `—` placeholder instead of throwing `RangeError: Invalid time value`. ## Usage Example ```typescript import { formatDate, formatTime } from './format-date'; // Locale-formatted date const date = formatDate('2026-05-05T14:47:00Z'); // Returns: "05/05/2026" (en-US) or "05.05.2026" (european locales) // Locale-formatted time const time = formatTime('2026-05-05T14:47:00Z'); // Returns: "2:47 PM" (en-US) or "14:47" (european locales) // Invalid input falls back to a placeholder const missing = formatDate('not-a-date'); // Returns: "—" ``` Used by the chat message timestamp (`components/chat/chat-message-enhanced.tsx`): messages from a previous day show `formatDate` + `formatTime`, today's messages show `formatTime` only.