/** * SiteHeader — universal, prop-driven site header for hiai-ui * * Adapted from projects/webs/svelte-app/src/lib/components/SiteHeader.svelte. * Stripped of: * - $app/state, $app/navigation, getContext('t'|'siteContent'), palettes, * globalThemeState, nidoStructuredContentSeed (all webs-specific) * - CrocoNav / HiaiLogo / Logo special-cases * - Style selector (department dropdown, palette switcher) * - Page-driven URL query rewriting (design / style / lang persistence) * * Replaced with a single `config` prop + three callbacks. Parent owns state. * Reuses hiai-ui's own LanguageSelector, ShareButton, and ThemeToggle so the * same picker UX is identical across consumers. ThemeToggle is only used as a * fallback when `onToggleDark` is not provided — controlled theme is preferred. */ import type { Snippet } from 'svelte'; import { type Language } from './LanguageSelector.svelte'; export interface HeaderNavItem { label: string; href: string; active?: boolean; } export interface LogoConfig { /** Optional image URL. When omitted, `alt` is rendered as text. */ src?: string; /** Logo image alt text, or fallback site name when no src. */ alt: string; /** When provided, the logo becomes a clickable link. */ href?: string; } export interface SiteHeaderConfig { logo: LogoConfig; nav?: HeaderNavItem[]; /** Optional list of available languages. If length <= 1, the selector * is hidden even when `showLangSelector` is true. */ languages?: Language[]; /** Active language code. Required when `languages` is provided. */ currentLang?: string; /** Reflects the current theme. Drives the icon + `aria-pressed`. */ dark?: boolean; showThemeToggle?: boolean; showLangSelector?: boolean; showShareButton?: boolean; /** Optional override for the share URL. Defaults to window.location.href. */ shareUrl?: string; /** Optional override for the share title. Defaults to document.title. */ shareTitle?: string; /** Optional share description / body. */ shareText?: string; /** Right-aligned auth area (desktop). Rendered as-is. */ authSlot?: Snippet; /** Auth area in mobile menu. Fallbacks to authSlot if unset. */ mobileAuthSlot?: Snippet; } interface Props { config: SiteHeaderConfig; /** Called when the dark/light toggle button is pressed. * When omitted, the self-contained ThemeToggle is rendered instead. */ onToggleDark?: () => void; /** Called when the user picks a language code from the selector. */ onSelectLang?: (code: string) => void; /** Called when a nav link is clicked. Receives the href; when provided, * the default browser navigation is prevented so the parent can route. */ onNavigate?: (href: string) => void; class?: string; authSlot?: Snippet; mobileAuthSlot?: Snippet; } declare const SiteHeader: import("svelte").Component; type SiteHeader = ReturnType; export default SiteHeader;