Renders the platform-wide announcement bar in both SSR (Next.js) and client-only (Vite/CRA embed) modes, handling fetch, dismissal state, animations, and XSS-safe CTA navigation. ## Key Components ### `AnnouncementBar` (default export) The primary component accepting these props (`AnnouncementBarProps`): | Prop | Type | Description | |---|---|---| | `initialAnnouncement` | `Announcement \| null \| undefined` | SSR-seeded announcement; omit for client-only self-fetch | | `previewMode` | `boolean` | Admin draft preview — disables fetch, storage, and dismiss | | `dismissible` | `boolean` | Whether the user can dismiss the bar | | `className` | `string` | Optional wrapper class | ### Internal Utilities Used - **`useSelfFetch`** — visibility-driven revalidation (refocuses after 60s stale); no polling - **`useEndpointsRuntime`** — resolves `announcementsUrl`; absent provider = silent no-op - **`isAnnouncementDismissed` / `dismissAnnouncement`** — cookie-based dismissal SSOT - **`pickReadableTextColor`** — selects `theme-light` / `theme-dark` ODS scope from background color - **`EntityIcon`** — renders uploaded image URL or library glyph by name - **`AnnouncementBarView`** — pure presentational shell (44px strip, `text-h6`, compact CTA) ## Usage Example ```typescript // SSR mode (Next.js layout — zero flash, no CLS) import { AnnouncementBar } from '@openframe/ui'; export default async function RootLayout({ children }) { const announcement = await resolveAnnouncement(); // server-side return (