{"version":3,"sources":["src/userMenu/runtimeContract.ts","src/userMenu/runtime/i18n.ts","src/userMenu/runtime/icons.ts","src/userMenu/runtime/styles.ts","src/userMenu/runtime/AireonUserMenuElement.ts","src/userMenu/runtime/entry.ts"],"sourcesContent":["export const AIREON_USER_MENU_CONTRACT = 'aireon-user-menu-v1' as const;\nexport const AIREON_USER_MENU_TAG = 'aireon-user-menu-v1' as const;\nexport const AIREON_USER_MENU_ACTION_EVENT = 'aireon:user-menu-action' as const;\nexport const AIREON_USER_MENU_COMPATIBILITY_EVENT = 'aireon:user-menu-compatibility' as const;\nexport const AIREON_USER_MENU_STANDARD_ORDER = [\n  'saved-parcels',\n  'export',\n  'locate',\n  'share',\n  'theme',\n  'whats-new',\n  'tour',\n  'history',\n  'about',\n  'report',\n  'profile',\n  'sign-in',\n  'sign-out',\n] as const;\n\nconst ICONS = [\n  'about',\n  'camera',\n  'download',\n  'exports',\n  'generic-tool',\n  'history',\n  'language',\n  'layers',\n  'locate',\n  'profile',\n  'report',\n  'saved-parcels',\n  'share',\n  'sign-in',\n  'sign-out',\n  'theme-dark',\n  'theme-light',\n  'tour',\n  'whats-new',\n] as const;\n\nexport type AireonUserMenuLocaleV1 = 'en' | 'de' | 'fr' | 'it';\nexport type AireonUserMenuThemeV1 = 'light' | 'dark';\nexport type AireonUserMenuIconV1 = typeof ICONS[number];\nexport type AireonUserMenuStandardIdV1 = typeof AIREON_USER_MENU_STANDARD_ORDER[number];\nexport type AireonUserMenuActionAvailabilityV1 = 'authenticated' | 'anonymous' | 'always';\nexport type AireonUserMenuActionSourceV1 = 'trigger' | 'account' | 'summary' | 'tools' | 'auth';\nexport type AireonUserMenuSummaryStatusV1 = 'loading' | 'ready' | 'empty' | 'error';\nexport type AireonUserMenuSummaryToneV1 = 'neutral' | 'info' | 'warning' | 'success';\n\nexport interface AireonUserMenuAuthenticatedAccountV1 {\n  readonly status: 'authenticated';\n  readonly displayName: string;\n  readonly shortName: string;\n  readonly email?: string;\n  readonly avatarUrl?: string;\n  readonly initials: string;\n  readonly membershipLabel: string;\n  readonly isAdmin: boolean;\n}\n\nexport type AireonUserMenuAccountV1 =\n  | { readonly status: 'loading' }\n  | { readonly status: 'anonymous' }\n  | AireonUserMenuAuthenticatedAccountV1;\n\nexport interface AireonUserMenuActionV1 {\n  readonly id: string;\n  readonly standardId?: AireonUserMenuStandardIdV1;\n  readonly label: string;\n  readonly icon: AireonUserMenuIconV1;\n  readonly availability: AireonUserMenuActionAvailabilityV1;\n  readonly disabled?: boolean;\n  readonly danger?: boolean;\n  readonly badge?: string | number;\n  readonly dot?: boolean;\n  readonly keepOpen?: boolean;\n  readonly children?: readonly AireonUserMenuActionV1[];\n}\n\nexport interface AireonUserMenuSummaryPrimaryV1 {\n  readonly value: string | number;\n  readonly label: string;\n  readonly actionId?: string;\n}\n\nexport interface AireonUserMenuSummaryUtilityV1 {\n  readonly id: string;\n  readonly label: string;\n  readonly icon: AireonUserMenuIconV1;\n  readonly disabled?: boolean;\n}\n\nexport interface AireonUserMenuSummaryItemV1 {\n  readonly id: string;\n  readonly value: string | number;\n  readonly label: string;\n  readonly tone?: AireonUserMenuSummaryToneV1;\n  readonly actionId?: string;\n}\n\nexport interface AireonUserMenuSummaryEmptyV1 {\n  readonly title: string;\n  readonly hint?: string;\n  readonly actionId?: string;\n}\n\nexport interface AireonUserMenuSummaryErrorV1 {\n  readonly message: string;\n  readonly retryActionId?: string;\n}\n\nexport interface AireonUserMenuSummaryV1 {\n  readonly label: string;\n  readonly icon: AireonUserMenuIconV1;\n  readonly status: AireonUserMenuSummaryStatusV1;\n  readonly primary?: AireonUserMenuSummaryPrimaryV1;\n  readonly utilities?: readonly AireonUserMenuSummaryUtilityV1[];\n  readonly items?: readonly AireonUserMenuSummaryItemV1[];\n  readonly layout?: 'grid' | 'chips';\n  readonly empty?: AireonUserMenuSummaryEmptyV1;\n  readonly error?: AireonUserMenuSummaryErrorV1;\n}\n\nexport interface AireonUserMenuModelV1 {\n  readonly contract: typeof AIREON_USER_MENU_CONTRACT;\n  readonly adapterVersion: '1.0.0';\n  readonly appId: string;\n  readonly locale: AireonUserMenuLocaleV1;\n  readonly theme: AireonUserMenuThemeV1;\n  readonly trigger: {\n    readonly compact: boolean;\n    readonly accessibleLabel?: string;\n  };\n  readonly account: AireonUserMenuAccountV1;\n  readonly summary?: AireonUserMenuSummaryV1;\n  readonly actions: readonly AireonUserMenuActionV1[];\n}\n\nexport interface AireonUserMenuActionEventV1 {\n  readonly id: string;\n  readonly source: AireonUserMenuActionSourceV1;\n}\n\nexport interface AireonUserMenuCompatibilityReportV1 {\n  readonly reason: 'duplicate-action';\n  readonly standardId: AireonUserMenuStandardIdV1;\n}\n\nexport type UserMenuModelValidationReason =\n  | 'non-data-value'\n  | 'unknown-field'\n  | 'missing-field'\n  | 'invalid-value'\n  | 'duplicate-standard-id';\n\nexport type UserMenuModelValidation =\n  | {\n    readonly ok: true;\n    readonly value: AireonUserMenuModelV1;\n    readonly compatibilityReports: readonly AireonUserMenuCompatibilityReportV1[];\n  }\n  | { readonly ok: false; readonly reason: UserMenuModelValidationReason };\n\nconst own = (value: Record<string, unknown>, key: string) =>\n  Object.prototype.hasOwnProperty.call(value, key);\n\nconst hasValue = (value: Record<string, unknown>, key: string) =>\n  own(value, key) && value[key] !== undefined;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n  if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n  const prototype = Object.getPrototypeOf(value);\n  return prototype === Object.prototype || prototype === null;\n};\n\nconst isFiniteNumber = (value: unknown): value is number =>\n  typeof value === 'number' && Number.isFinite(value);\n\nconst isString = (value: unknown): value is string => typeof value === 'string';\nconst isBoolean = (value: unknown): value is boolean => typeof value === 'boolean';\n\nconst hasOnlyFields = (value: Record<string, unknown>, allowed: readonly string[]) =>\n  Object.getOwnPropertyNames(value).every((key) => allowed.includes(key)) &&\n  Object.getOwnPropertySymbols(value).length === 0;\n\nconst hasRequiredFields = (value: Record<string, unknown>, required: readonly string[]) =>\n  required.every((key) => own(value, key));\n\nconst containsNonDataValue = (value: unknown, visited = new WeakSet<object>()): boolean => {\n  if (value === undefined || value === null || isString(value) || isBoolean(value) || isFiniteNumber(value)) return false;\n  if (typeof value !== 'object') return true;\n  if (visited.has(value)) return true;\n  if (!Array.isArray(value) && !isRecord(value)) return true;\n\n  visited.add(value);\n  for (const key of Object.getOwnPropertyNames(value)) {\n    const descriptor = Object.getOwnPropertyDescriptor(value, key);\n    if (!descriptor || !('value' in descriptor) || containsNonDataValue(descriptor.value, visited)) {\n      return true;\n    }\n  }\n  return Object.getOwnPropertySymbols(value).length > 0;\n};\n\nconst isOneOf = <T extends readonly string[]>(value: unknown, values: T): value is T[number] =>\n  isString(value) && values.includes(value);\n\nconst validationFailure = (reason: UserMenuModelValidationReason): UserMenuModelValidation => ({\n  ok: false,\n  reason,\n});\n\nfunction validateAction(\n  value: unknown,\n): UserMenuModelValidationReason | undefined {\n  if (!isRecord(value)) return 'invalid-value';\n  const allowed = [\n    'id', 'standardId', 'label', 'icon', 'availability', 'disabled', 'danger', 'badge', 'dot', 'keepOpen', 'children',\n  ];\n  if (!hasOnlyFields(value, allowed)) return 'unknown-field';\n  if (!hasRequiredFields(value, ['id', 'label', 'icon', 'availability'])) return 'missing-field';\n  if (!isString(value.id) || !isString(value.label) || !isOneOf(value.icon, ICONS)) return 'invalid-value';\n  if (!isOneOf(value.availability, ['authenticated', 'anonymous', 'always'] as const)) return 'invalid-value';\n  if (hasValue(value, 'standardId')) {\n    if (!isOneOf(value.standardId, AIREON_USER_MENU_STANDARD_ORDER)) return 'invalid-value';\n  }\n  for (const key of ['disabled', 'danger', 'dot', 'keepOpen'] as const) {\n    if (hasValue(value, key) && !isBoolean(value[key])) return 'invalid-value';\n  }\n  if (hasValue(value, 'badge') && !(isString(value.badge) || isFiniteNumber(value.badge))) return 'invalid-value';\n  if (hasValue(value, 'children')) {\n    if (!Array.isArray(value.children)) return 'invalid-value';\n    for (const child of value.children) {\n      const reason = validateAction(child);\n      if (reason) return reason;\n    }\n  }\n}\n\nfunction normalizeActions(\n  actions: readonly AireonUserMenuActionV1[],\n): {\n  readonly actions: readonly AireonUserMenuActionV1[];\n  readonly compatibilityReports: readonly AireonUserMenuCompatibilityReportV1[];\n} {\n  const standardIds = new Set<AireonUserMenuStandardIdV1>();\n  const reported = new Set<AireonUserMenuStandardIdV1>();\n  const compatibilityReports: AireonUserMenuCompatibilityReportV1[] = [];\n  const normalize = (items: readonly AireonUserMenuActionV1[]): readonly AireonUserMenuActionV1[] => (\n    items.flatMap((action) => {\n      if (action.standardId) {\n        if (standardIds.has(action.standardId)) {\n          if (!reported.has(action.standardId)) {\n            reported.add(action.standardId);\n            compatibilityReports.push({ reason: 'duplicate-action', standardId: action.standardId });\n          }\n          return [];\n        }\n        standardIds.add(action.standardId);\n      }\n      return [{\n        ...action,\n        ...(action.children ? { children: normalize(action.children) } : {}),\n      }];\n    })\n  );\n  return { actions: normalize(actions), compatibilityReports };\n}\n\nfunction validateAccount(value: unknown): UserMenuModelValidationReason | undefined {\n  if (!isRecord(value)) return 'invalid-value';\n  if (!hasRequiredFields(value, ['status'])) return 'missing-field';\n  if (!isOneOf(value.status, ['loading', 'anonymous', 'authenticated'] as const)) return 'invalid-value';\n  if (value.status !== 'authenticated') {\n    return hasOnlyFields(value, ['status']) ? undefined : 'unknown-field';\n  }\n  const allowed = ['status', 'displayName', 'shortName', 'email', 'avatarUrl', 'initials', 'membershipLabel', 'isAdmin'];\n  if (!hasOnlyFields(value, allowed)) return 'unknown-field';\n  if (!hasRequiredFields(value, ['displayName', 'shortName', 'initials', 'membershipLabel', 'isAdmin'])) return 'missing-field';\n  if (![value.displayName, value.shortName, value.initials, value.membershipLabel].every(isString)) return 'invalid-value';\n  if (!isBoolean(value.isAdmin)) return 'invalid-value';\n  if ((hasValue(value, 'email') && !isString(value.email)) || (hasValue(value, 'avatarUrl') && !isString(value.avatarUrl))) {\n    return 'invalid-value';\n  }\n}\n\nfunction validateSummary(value: unknown): UserMenuModelValidationReason | undefined {\n  if (!isRecord(value)) return 'invalid-value';\n  const allowed = ['label', 'icon', 'status', 'primary', 'utilities', 'items', 'layout', 'empty', 'error'];\n  if (!hasOnlyFields(value, allowed)) return 'unknown-field';\n  if (!hasRequiredFields(value, ['label', 'icon', 'status'])) return 'missing-field';\n  if (!isString(value.label) || !isOneOf(value.icon, ICONS)) return 'invalid-value';\n  if (!isOneOf(value.status, ['loading', 'ready', 'empty', 'error'] as const)) return 'invalid-value';\n  if (hasValue(value, 'layout') && !isOneOf(value.layout, ['grid', 'chips'] as const)) return 'invalid-value';\n  if (hasValue(value, 'primary')) {\n    const primary = value.primary;\n    if (!isRecord(primary)) return 'invalid-value';\n    if (!hasOnlyFields(primary, ['value', 'label', 'actionId'])) return 'unknown-field';\n    if (!hasRequiredFields(primary, ['value', 'label'])) return 'missing-field';\n    if (!(isString(primary.value) || isFiniteNumber(primary.value)) || !isString(primary.label)) return 'invalid-value';\n    if (hasValue(primary, 'actionId') && !isString(primary.actionId)) return 'invalid-value';\n  }\n  if (hasValue(value, 'utilities')) {\n    if (!Array.isArray(value.utilities)) return 'invalid-value';\n    for (const utility of value.utilities) {\n      if (!isRecord(utility)) return 'invalid-value';\n      if (!hasOnlyFields(utility, ['id', 'label', 'icon', 'disabled'])) return 'unknown-field';\n      if (!hasRequiredFields(utility, ['id', 'label', 'icon'])) return 'missing-field';\n      if (!isString(utility.id) || !isString(utility.label) || !isOneOf(utility.icon, ICONS)) return 'invalid-value';\n      if (hasValue(utility, 'disabled') && !isBoolean(utility.disabled)) return 'invalid-value';\n    }\n  }\n  if (hasValue(value, 'items')) {\n    if (!Array.isArray(value.items)) return 'invalid-value';\n    for (const item of value.items) {\n      if (!isRecord(item)) return 'invalid-value';\n      if (!hasOnlyFields(item, ['id', 'value', 'label', 'tone', 'actionId'])) return 'unknown-field';\n      if (!hasRequiredFields(item, ['id', 'value', 'label'])) return 'missing-field';\n      if (!isString(item.id) || !(isString(item.value) || isFiniteNumber(item.value)) || !isString(item.label)) return 'invalid-value';\n      if (hasValue(item, 'tone') && !isOneOf(item.tone, ['neutral', 'info', 'warning', 'success'] as const)) return 'invalid-value';\n      if (hasValue(item, 'actionId') && !isString(item.actionId)) return 'invalid-value';\n    }\n  }\n  if (hasValue(value, 'empty')) {\n    const empty = value.empty;\n    if (!isRecord(empty)) return 'invalid-value';\n    if (!hasOnlyFields(empty, ['title', 'hint', 'actionId'])) return 'unknown-field';\n    if (!hasRequiredFields(empty, ['title'])) return 'missing-field';\n    if (!isString(empty.title)) return 'invalid-value';\n    if ((hasValue(empty, 'hint') && !isString(empty.hint)) || (hasValue(empty, 'actionId') && !isString(empty.actionId))) return 'invalid-value';\n  }\n  if (hasValue(value, 'error')) {\n    const error = value.error;\n    if (!isRecord(error)) return 'invalid-value';\n    if (!hasOnlyFields(error, ['message', 'retryActionId'])) return 'unknown-field';\n    if (!hasRequiredFields(error, ['message'])) return 'missing-field';\n    if (!isString(error.message)) return 'invalid-value';\n    if (hasValue(error, 'retryActionId') && !isString(error.retryActionId)) return 'invalid-value';\n  }\n}\n\nexport function validateUserMenuModel(value: unknown): UserMenuModelValidation {\n  if (containsNonDataValue(value)) return validationFailure('non-data-value');\n  if (!isRecord(value)) return validationFailure('invalid-value');\n  const allowed = ['contract', 'adapterVersion', 'appId', 'locale', 'theme', 'trigger', 'account', 'summary', 'actions'];\n  if (!hasOnlyFields(value, allowed)) return validationFailure('unknown-field');\n  if (!hasRequiredFields(value, ['contract', 'adapterVersion', 'appId', 'locale', 'theme', 'trigger', 'account', 'actions'])) {\n    return validationFailure('missing-field');\n  }\n  if (value.contract !== AIREON_USER_MENU_CONTRACT || value.adapterVersion !== '1.0.0' || !isString(value.appId)) {\n    return validationFailure('invalid-value');\n  }\n  if (!isOneOf(value.locale, ['en', 'de', 'fr', 'it'] as const) || !isOneOf(value.theme, ['light', 'dark'] as const)) {\n    return validationFailure('invalid-value');\n  }\n  if (!isRecord(value.trigger)) return validationFailure('invalid-value');\n  if (!hasOnlyFields(value.trigger, ['compact', 'accessibleLabel'])) return validationFailure('unknown-field');\n  if (!hasRequiredFields(value.trigger, ['compact'])) return validationFailure('missing-field');\n  if (!isBoolean(value.trigger.compact) || (hasValue(value.trigger, 'accessibleLabel') && !isString(value.trigger.accessibleLabel))) {\n    return validationFailure('invalid-value');\n  }\n  const accountReason = validateAccount(value.account);\n  if (accountReason) return validationFailure(accountReason);\n  if (hasValue(value, 'summary')) {\n    const summaryReason = validateSummary(value.summary);\n    if (summaryReason) return validationFailure(summaryReason);\n  }\n  if (!Array.isArray(value.actions)) return validationFailure('invalid-value');\n  for (const action of value.actions) {\n    const actionReason = validateAction(action);\n    if (actionReason) return validationFailure(actionReason);\n  }\n  const model = value as unknown as AireonUserMenuModelV1;\n  const normalized = normalizeActions(model.actions);\n  return {\n    ok: true,\n    value: { ...model, actions: normalized.actions },\n    compatibilityReports: normalized.compatibilityReports,\n  };\n}\n\nexport function orderUserMenuActions(\n  actions: readonly AireonUserMenuActionV1[],\n): AireonUserMenuActionV1[] {\n  const rank = new Map(AIREON_USER_MENU_STANDARD_ORDER.map((id, index) => [id, index]));\n  const productRank = AIREON_USER_MENU_STANDARD_ORDER.length;\n  const signOutRank = productRank + 1;\n  return actions\n    .map((action, index) => ({\n      action,\n      index,\n      rank: action.standardId === 'sign-out'\n        ? signOutRank\n        : action.standardId ? (rank.get(action.standardId) ?? productRank) : productRank,\n    }))\n    .sort((left, right) => left.rank - right.rank || left.index - right.index)\n    .map(({ action }) => action);\n}\n","import type { AireonUserMenuLocaleV1, AireonUserMenuStandardIdV1 } from '../runtimeContract';\n\ntype CopyKey =\n  | AireonUserMenuStandardIdV1\n  | 'account'\n  | 'admin'\n  | 'loading'\n  | 'manage'\n  | 'menu'\n  | 'retry'\n  | 'summaryError'\n  | 'tools';\n\nconst COPY: Record<AireonUserMenuLocaleV1, Record<CopyKey, string>> = {\n  en: {\n    account: 'Account', admin: 'Admin', loading: 'Loading account', manage: 'Manage', menu: 'User menu',\n    retry: 'Retry', summaryError: 'Unable to load summary', tools: 'Tools',\n    'saved-parcels': 'Saved parcels', export: 'Export', locate: 'Locate', share: 'Share', theme: 'Theme',\n    'whats-new': \"What's new\", tour: 'Tour', history: 'History', about: 'About', report: 'Report an issue',\n    profile: 'Profile', 'sign-in': 'Sign in', 'sign-out': 'Sign out',\n  },\n  de: {\n    account: 'Konto', admin: 'Admin', loading: 'Konto wird geladen', manage: 'Verwalten', menu: 'Benutzermenü',\n    retry: 'Erneut versuchen', summaryError: 'Zusammenfassung konnte nicht geladen werden', tools: 'Werkzeuge',\n    'saved-parcels': 'Gespeicherte Parzellen', export: 'Exportieren', locate: 'Lokalisieren', share: 'Teilen',\n    theme: 'Darstellung', 'whats-new': 'Neuigkeiten', tour: 'Tour', history: 'Verlauf', about: 'Über',\n    report: 'Problem melden', profile: 'Profil', 'sign-in': 'Anmelden', 'sign-out': 'Abmelden',\n  },\n  fr: {\n    account: 'Compte', admin: 'Admin', loading: 'Chargement du compte', manage: 'Gérer', menu: 'Menu utilisateur',\n    retry: 'Réessayer', summaryError: 'Impossible de charger le résumé', tools: 'Outils',\n    'saved-parcels': 'Parcelles enregistrées', export: 'Exporter', locate: 'Localiser', share: 'Partager',\n    theme: 'Thème', 'whats-new': 'Nouveautés', tour: 'Visite', history: 'Historique', about: 'À propos',\n    report: 'Signaler un problème', profile: 'Profil', 'sign-in': 'Se connecter', 'sign-out': 'Se déconnecter',\n  },\n  it: {\n    account: 'Account', admin: 'Admin', loading: 'Caricamento account', manage: 'Gestisci', menu: 'Menu utente',\n    retry: 'Riprova', summaryError: 'Impossibile caricare il riepilogo', tools: 'Strumenti',\n    'saved-parcels': 'Particelle salvate', export: 'Esporta', locate: 'Individua', share: 'Condividi',\n    theme: 'Tema', 'whats-new': 'Novità', tour: 'Tour', history: 'Cronologia', about: 'Informazioni',\n    report: 'Segnala un problema', profile: 'Profilo', 'sign-in': 'Accedi', 'sign-out': 'Esci',\n  },\n};\n\nexport function userMenuCopy(locale: AireonUserMenuLocaleV1, key: CopyKey): string {\n  return COPY[locale][key];\n}\n\nexport function actionLabel(\n  locale: AireonUserMenuLocaleV1,\n  action: { readonly standardId?: AireonUserMenuStandardIdV1; readonly label: string },\n): string {\n  return action.standardId ? userMenuCopy(locale, action.standardId) : action.label;\n}\n","import type { AireonUserMenuIconV1 } from '../runtimeContract';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\n/** Closed, framework-neutral V1 SVG path data for every permitted menu icon. */\nexport const USER_MENU_ICON_PATHS: Readonly<Record<AireonUserMenuIconV1, string>> = {\n  about: 'M12 8h.01M11 12h1v4h1M4 4h16v16H4z',\n  camera: 'M4 7h3l1-2h8l1 2h3v11H4zM12 11a3 3 0 1 0 0 6 3 3 0 0 0 0-6z',\n  download: 'M12 3v11m0 0 4-4m-4 4-4-4M5 20h14',\n  exports: 'M5 4h10v5m0-5-5 5m5-5-5-5M5 11v9h14v-6',\n  'generic-tool': 'M5 4h14v16H5zM8 8h8M8 12h8M8 16h5',\n  history: 'M4 12a8 8 0 1 0 2-5.3M4 5v4h4m4-5v8l3 2',\n  language: 'M4 5h8M8 3v2c0 5-2 8-4 10m2-6h6m3-4h5m-2-2v2c0 5-2 8-4 10m-2-4h6',\n  layers: 'm12 3 9 5-9 5-9-5 9-5Zm-9 9 9 5 9-5M3 16l9 5 9-5',\n  locate: 'M12 3v3m0 12v3M3 12h3m12 0h3M12 8a4 4 0 1 1 0 8 4 4 0 0 1 0-8z',\n  profile: 'M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8Zm-7 8a7 7 0 0 1 14 0',\n  report: 'M5 3h14v18H5zM8 7h8M8 11h8M8 15h5',\n  'saved-parcels': 'm12 3 8 5v8l-8 5-8-5V8l8-5Zm0 4v9m-4-7 8 5',\n  share: 'M18 8a3 3 0 1 0-2.8-4A3 3 0 0 0 18 8ZM6 15a3 3 0 1 0 2.8 4A3 3 0 0 0 6 15Zm12 1a3 3 0 1 0-2.8 4A3 3 0 0 0 18 16ZM8.6 16.5l6.8 3M15.4 7.5l-6.8 3',\n  'sign-in': 'M13 4h6v16h-6m-3-4 4-4-4-4m4 4H3',\n  'sign-out': 'M11 4H5v16h6m3-4 4-4-4-4m4 4H9',\n  'theme-dark': 'M20 15.5A8 8 0 0 1 8.5 4 8 8 0 1 0 20 15.5Z',\n  'theme-light': 'M12 3v2m0 14v2m9-9h-2M5 12H3m15.4-6.4-1.4 1.4M7 17.6l-1.4 1.4m12.8 0-1.4-1.4M7 6.9 5.6 5.5M12 8a4 4 0 1 0 0 8 4 4 0 0 0 0-8Z',\n  tour: 'M4 5h16v14H4zM8 9h8m-8 4h5',\n  'whats-new': 'M12 3 4 7l8 4 8-4-8-4Zm-8 8 8 4 8-4m-16 4 8 4 8-4',\n};\n\nexport function createUserMenuIcon(icon: AireonUserMenuIconV1): SVGSVGElement {\n  const svg = document.createElementNS(SVG_NS, 'svg');\n  svg.setAttribute('viewBox', '0 0 24 24');\n  svg.setAttribute('aria-hidden', 'true');\n  svg.setAttribute('focusable', 'false');\n  const path = document.createElementNS(SVG_NS, 'path');\n  path.setAttribute('d', USER_MENU_ICON_PATHS[icon]);\n  path.setAttribute('fill', 'none');\n  path.setAttribute('stroke', 'currentColor');\n  path.setAttribute('stroke-width', '1.8');\n  path.setAttribute('stroke-linecap', 'round');\n  path.setAttribute('stroke-linejoin', 'round');\n  svg.append(path);\n  return svg;\n}\n","export const AIREON_USER_MENU_STYLES = `\n  :host {\n    --menu-surface: rgba(255, 255, 255, .92);\n    --menu-text: #172033;\n    --menu-muted: #667085;\n    --menu-border: rgba(23, 32, 51, .14);\n    --menu-hover: rgba(20, 86, 154, .09);\n    --menu-danger: #b42318;\n    --menu-focus: #14569a;\n    --menu-safe-area-top: env(safe-area-inset-top, 0px);\n    --menu-safe-area-right: env(safe-area-inset-right, 0px);\n    --menu-safe-area-bottom: env(safe-area-inset-bottom, 0px);\n    --menu-safe-area-left: env(safe-area-inset-left, 0px);\n    color: var(--menu-text);\n    display: inline-block;\n    font: 14px/1.35 Inter, ui-sans-serif, system-ui, sans-serif;\n    position: relative;\n  }\n  :host([data-theme=\"dark\"]) {\n    --menu-surface: rgba(23, 32, 51, .94);\n    --menu-text: #f8fafc;\n    --menu-muted: #c3ccd9;\n    --menu-border: rgba(255, 255, 255, .16);\n    --menu-hover: rgba(159, 205, 255, .15);\n    --menu-danger: #fda29b;\n    --menu-focus: #9fcdff;\n  }\n  *, *::before, *::after { box-sizing: border-box; }\n  button { color: inherit; font: inherit; }\n  [part=\"trigger\"] {\n    align-items: center; background: transparent; border: 0; border-radius: 999px; cursor: pointer;\n    display: inline-flex; gap: 8px; min-height: 40px; padding: 0; text-align: left;\n  }\n  [part=\"trigger-name\"] { font-weight: 700; max-width: 9rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n  :host([data-compact=\"true\"]) [part=\"trigger-name\"] { display: none; }\n  [part=\"avatar\"], [part=\"avatar-initials\"] { align-items: center; background: #14569a; border-radius: 50%; color: white; display: inline-flex; height: 40px; justify-content: center; overflow: hidden; position: relative; width: 40px; }\n  [part=\"avatar\"] img { height: 100%; object-fit: cover; width: 100%; }\n  [part=\"admin-badge\"] { background: #b54708; border-radius: 999px; color: #fff; font-size: 10px; font-weight: 800; padding: 2px 5px; position: absolute; right: -5px; top: -3px; }\n  [part=\"panel\"] {\n    background: var(--menu-surface); border: 1px solid var(--menu-border); border-radius: 16px;\n    box-shadow: 0 18px 46px rgba(15, 23, 42, .22); max-height: min(38rem, calc(100vh - var(--menu-safe-area-top) - var(--menu-safe-area-bottom) - 1rem));\n    overflow: auto; overscroll-behavior: contain; padding: 8px; position: fixed; right: auto; top: 0;\n    width: min(22.5rem, calc(100vw - var(--menu-safe-area-left) - var(--menu-safe-area-right) - 1rem)); z-index: 2147483647;\n  }\n  [part=\"account\"], [part=\"summary\"] { border: 1px solid var(--menu-border); border-radius: 12px; margin-bottom: 8px; padding: 12px; }\n  [part=\"account\"] { align-items: center; display: grid; gap: 2px 10px; grid-template-columns: auto 1fr auto; }\n  [part=\"account\"] [part=\"avatar\"], [part=\"account\"] [part=\"avatar-initials\"] { grid-row: 1 / span 3; }\n  [part=\"account-name\"] { font-weight: 800; overflow-wrap: anywhere; }\n  [part=\"account-email\"], [part=\"membership\"], [part=\"section-label\"] { color: var(--menu-muted); font-size: 12px; overflow-wrap: anywhere; }\n  [part=\"manage\"] { background: transparent; border: 0; color: var(--menu-focus); cursor: pointer; font-weight: 700; grid-row: 1 / span 3; min-height: 44px; padding: 0 4px; }\n  [part=\"account-loading\"] { min-height: 68px; }\n  [part=\"skeleton\"] { animation: menu-pulse 1.5s ease-in-out infinite; background: var(--menu-hover); border-radius: 6px; height: 12px; margin: 8px 0; }\n  [part=\"summary-heading\"], [part=\"summary-utility-row\"] { align-items: center; display: flex; gap: 8px; justify-content: space-between; }\n  [part=\"summary-heading\"] { font-weight: 800; margin-bottom: 8px; }\n  [part=\"summary-primary\"] { font-size: 24px; font-weight: 800; }\n  [part=\"summary-label\"] { color: var(--menu-muted); font-size: 12px; }\n  [part=\"summary-items\"] { display: grid; gap: 8px; grid-template-columns: repeat(2, minmax(0, 1fr)); margin-top: 10px; }\n  [part=\"summary-items\"][data-layout=\"chips\"] { display: flex; flex-wrap: wrap; }\n  [part=\"summary-item\"] { border: 1px solid var(--menu-border); border-radius: 8px; min-width: 0; padding: 8px; }\n  [part=\"summary-item\"][data-tone=\"success\"] { border-color: rgba(18, 130, 74, .45); }\n  [part=\"section-label\"] { font-weight: 800; letter-spacing: .04em; padding: 8px 8px 4px; text-transform: uppercase; }\n  [part=\"action\"], [part=\"summary-action\"], [part=\"summary-utility\"], [part=\"auth-action\"] { align-items: center; background: transparent; border: 0; border-radius: 9px; cursor: pointer; display: flex; gap: 10px; min-height: 44px; padding: 0 8px; text-align: left; width: 100%; }\n  [part=\"action\"]:hover, [part=\"summary-action\"]:hover, [part=\"summary-utility\"]:hover, [part=\"auth-action\"]:hover, [part=\"manage\"]:hover { background: var(--menu-hover); }\n  [part=\"action-icon\"] { display: inline-flex; flex: 0 0 16px; height: 16px; width: 16px; }\n  [part=\"action-label\"] { flex: 1; min-width: 0; overflow-wrap: anywhere; }\n  [part=\"badge\"] { background: var(--menu-hover); border-radius: 999px; font-size: 12px; font-weight: 700; padding: 2px 7px; }\n  [part=\"dot\"] { background: #d92d20; border-radius: 50%; height: 7px; width: 7px; }\n  [part=\"action\"][data-danger=\"true\"] { color: var(--menu-danger); }\n  [part=\"divider\"] { border-top: 1px solid var(--menu-border); margin: 8px 0; }\n  [part=\"action-group\"] { border-left: 1px solid var(--menu-border); margin-left: 16px; padding-left: 4px; }\n  button:disabled { cursor: not-allowed; opacity: .5; }\n  button:focus-visible { box-shadow: 0 0 0 3px color-mix(in srgb, var(--menu-focus) 35%, transparent); outline: 2px solid var(--menu-focus); outline-offset: 2px; }\n  @keyframes menu-pulse { 50% { opacity: .45; } }\n  @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: .01ms !important; scroll-behavior: auto !important; transition-duration: .01ms !important; } }\n`;\n","import {\n  AIREON_USER_MENU_ACTION_EVENT,\n  AIREON_USER_MENU_COMPATIBILITY_EVENT,\n  AIREON_USER_MENU_TAG,\n  orderUserMenuActions,\n  validateUserMenuModel,\n  type AireonUserMenuActionSourceV1,\n  type AireonUserMenuActionV1,\n  type AireonUserMenuCompatibilityReportV1,\n  type AireonUserMenuModelV1,\n  type AireonUserMenuSummaryV1,\n} from '../runtimeContract';\nimport { actionLabel, userMenuCopy } from './i18n';\nimport { createUserMenuIcon } from './icons';\nimport { AIREON_USER_MENU_STYLES } from './styles';\n\nconst isSafeAvatarUrl = (value: string): boolean => {\n  try {\n    const url = new URL(value, document.baseURI);\n    return url.protocol === 'https:'\n      || (url.protocol === 'data:' && value.toLowerCase().startsWith('data:image/'))\n      || (url.protocol === 'blob:' && url.origin === window.location.origin);\n  } catch {\n    return false;\n  }\n};\n\nexport class AireonUserMenuElement extends HTMLElement {\n  #model: AireonUserMenuModelV1 | null = null;\n  #open = false;\n  #expandedActionId: string | null = null;\n  #rovingActionId: string | null = null;\n  #focusFirstMenuItem = false;\n  readonly #reportedCompatibilityIssues = new Set<string>();\n  readonly #root = this.attachShadow({ mode: 'open' });\n\n  readonly #onDocumentClick = (event: MouseEvent) => {\n    if (this.#open && !event.composedPath().includes(this)) this.#close();\n  };\n\n  readonly #onViewportChange = () => this.#positionPanel();\n\n  connectedCallback(): void {\n    const release = (this.constructor as typeof AireonUserMenuElement & { runtimeRelease?: unknown }).runtimeRelease;\n    if (typeof release === 'string') this.setAttribute('data-runtime-release', release);\n    document.addEventListener('click', this.#onDocumentClick);\n    window.addEventListener('resize', this.#onViewportChange);\n    window.addEventListener('scroll', this.#onViewportChange, true);\n    this.#render();\n  }\n\n  disconnectedCallback(): void {\n    document.removeEventListener('click', this.#onDocumentClick);\n    window.removeEventListener('resize', this.#onViewportChange);\n    window.removeEventListener('scroll', this.#onViewportChange, true);\n  }\n\n  set model(value: AireonUserMenuModelV1) {\n    const checked = validateUserMenuModel(value);\n    if (!checked.ok) throw new TypeError(`Invalid user-menu model: ${checked.reason}`);\n    this.#model = checked.value;\n    this.#render();\n    for (const report of checked.compatibilityReports) this.#reportCompatibility(report);\n  }\n\n  get model(): AireonUserMenuModelV1 | null {\n    return this.#model;\n  }\n\n  #emit(id: string, source: AireonUserMenuActionSourceV1): void {\n    this.dispatchEvent(new CustomEvent(AIREON_USER_MENU_ACTION_EVENT, {\n      bubbles: true,\n      composed: true,\n      detail: { id, source },\n    }));\n  }\n\n  #reportCompatibility(report: AireonUserMenuCompatibilityReportV1): void {\n    const key = `${report.reason}:${report.standardId}`;\n    if (this.#reportedCompatibilityIssues.has(key)) return;\n    this.#reportedCompatibilityIssues.add(key);\n    this.dispatchEvent(new CustomEvent(AIREON_USER_MENU_COMPATIBILITY_EVENT, {\n      bubbles: true,\n      composed: true,\n      detail: report,\n    }));\n  }\n\n  #available(action: AireonUserMenuActionV1): boolean {\n    const status = this.#model?.account.status;\n    return action.availability === 'always'\n      || (action.availability === 'authenticated' && status === 'authenticated')\n      || (action.availability === 'anonymous' && status === 'anonymous');\n  }\n\n  #close(focusTrigger = false): void {\n    if (!this.#open) return;\n    this.#open = false;\n    this.#expandedActionId = null;\n    this.#rovingActionId = null;\n    this.#render();\n    if (focusTrigger) {\n      (this.#root.querySelector('[part=\"trigger\"]') as HTMLButtonElement | null)?.focus();\n    }\n  }\n\n  #toggle(): void {\n    if (this.#open) this.#close(true);\n    else {\n      this.#open = true;\n      this.#focusFirstMenuItem = true;\n      this.#render();\n    }\n  }\n\n  #invoke(id: string, source: AireonUserMenuActionSourceV1, keepOpen = false): void {\n    if (!keepOpen) this.#close();\n    this.#emit(id, source);\n  }\n\n  #appendAvatar(parent: HTMLElement, account: Extract<AireonUserMenuModelV1['account'], { status: 'authenticated' }>): void {\n    if (account.avatarUrl && isSafeAvatarUrl(account.avatarUrl)) {\n      const avatar = document.createElement('span');\n      avatar.setAttribute('part', 'avatar');\n      const image = document.createElement('img');\n      image.src = account.avatarUrl;\n      image.alt = '';\n      avatar.append(image);\n      parent.append(avatar);\n      return;\n    }\n    const initials = document.createElement('span');\n    initials.setAttribute('part', 'avatar-initials');\n    initials.textContent = account.initials;\n    parent.append(initials);\n  }\n\n  #createButton(\n    label: string,\n    part: string,\n    onClick: () => void,\n    options: { readonly disabled?: boolean; readonly actionId?: string; readonly icon?: AireonUserMenuActionV1['icon']; readonly role?: string } = {},\n  ): HTMLButtonElement {\n    const button = document.createElement('button');\n    button.type = 'button';\n    button.setAttribute('part', part);\n    if (options.role) button.setAttribute('role', options.role);\n    if (options.actionId) button.setAttribute('data-action-id', options.actionId);\n    if (options.disabled) button.disabled = true;\n    if (options.icon) {\n      const icon = document.createElement('span');\n      icon.setAttribute('part', 'action-icon');\n      icon.append(createUserMenuIcon(options.icon));\n      button.append(icon);\n    }\n    const text = document.createElement('span');\n    text.setAttribute('part', 'action-label');\n    text.textContent = label;\n    button.append(text);\n    button.addEventListener('click', onClick);\n    return button;\n  }\n\n  #renderAccount(panel: HTMLElement, actions: readonly AireonUserMenuActionV1[]): void {\n    const model = this.#model!;\n    const account = model.account;\n    const section = document.createElement('section');\n    section.setAttribute('part', 'account');\n    if (account.status === 'loading') {\n      const loading = document.createElement('div');\n      loading.setAttribute('part', 'account-loading');\n      loading.setAttribute('aria-label', userMenuCopy(model.locale, 'loading'));\n      for (let index = 0; index < 3; index += 1) {\n        const skeleton = document.createElement('div');\n        skeleton.setAttribute('part', 'skeleton');\n        loading.append(skeleton);\n      }\n      section.append(loading);\n    } else if (account.status === 'authenticated') {\n      this.#appendAvatar(section, account);\n      const name = document.createElement('div');\n      name.setAttribute('part', 'account-name');\n      name.textContent = account.displayName;\n      section.append(name);\n      if (account.email) {\n        const email = document.createElement('div');\n        email.setAttribute('part', 'account-email');\n        email.textContent = account.email;\n        section.append(email);\n      }\n      const membership = document.createElement('div');\n      membership.setAttribute('part', 'membership');\n      membership.textContent = account.membershipLabel;\n      section.append(membership);\n      if (account.isAdmin) {\n        const badge = document.createElement('span');\n        badge.setAttribute('part', 'admin-badge');\n        badge.textContent = userMenuCopy(model.locale, 'admin');\n        section.append(badge);\n      }\n      const profile = actions.find((item) => item.standardId === 'profile');\n      if (profile) {\n        section.append(this.#createButton(userMenuCopy(model.locale, 'manage'), 'manage', () => {\n          this.#invoke(profile.id, 'account');\n        }, {\n          actionId: profile.id,\n          disabled: profile.disabled,\n          role: 'menuitem',\n        }));\n      }\n    } else {\n      const label = document.createElement('div');\n      label.setAttribute('part', 'account-name');\n      label.textContent = userMenuCopy(model.locale, 'account');\n      section.append(label);\n    }\n    panel.append(section);\n  }\n\n  #renderSummary(panel: HTMLElement, summary: AireonUserMenuSummaryV1): void {\n    const model = this.#model!;\n    const section = document.createElement('section');\n    section.setAttribute('part', 'summary');\n    const heading = document.createElement('div');\n    heading.setAttribute('part', 'summary-heading');\n    const icon = document.createElement('span');\n    icon.setAttribute('part', 'action-icon');\n    icon.append(createUserMenuIcon(summary.icon));\n    const headingText = document.createElement('span');\n    headingText.textContent = summary.label;\n    heading.append(icon, headingText);\n    section.append(heading);\n\n    if (summary.utilities?.length) {\n      const utilities = document.createElement('div');\n      utilities.setAttribute('part', 'summary-utility-row');\n      for (const utility of summary.utilities) {\n        utilities.append(this.#createButton(utility.label, 'summary-utility', () => {\n          this.#invoke(utility.id, 'summary');\n        }, { disabled: utility.disabled, actionId: utility.id, icon: utility.icon, role: 'menuitem' }));\n      }\n      section.append(utilities);\n    }\n    if (summary.status === 'loading') {\n      const loading = document.createElement('div');\n      loading.setAttribute('part', 'summary-loading');\n      for (let index = 0; index < 3; index += 1) {\n        const skeleton = document.createElement('div');\n        skeleton.setAttribute('part', 'skeleton');\n        loading.append(skeleton);\n      }\n      section.append(loading);\n    } else if (summary.status === 'ready') {\n      if (summary.primary) {\n        const primary = document.createElement(summary.primary.actionId ? 'button' : 'div');\n        primary.setAttribute('part', summary.primary.actionId ? 'summary-action' : 'summary-primary');\n        if (primary instanceof HTMLButtonElement) {\n          primary.type = 'button';\n          primary.setAttribute('role', 'menuitem');\n          primary.setAttribute('data-action-id', summary.primary.actionId!);\n          primary.addEventListener('click', () => this.#invoke(summary.primary!.actionId!, 'summary'));\n        }\n        const value = document.createElement('div');\n        value.setAttribute('part', 'summary-primary');\n        value.textContent = String(summary.primary.value);\n        const label = document.createElement('div');\n        label.setAttribute('part', 'summary-label');\n        label.textContent = summary.primary.label;\n        primary.append(value, label);\n        section.append(primary);\n      }\n      if (summary.items?.length) {\n        const items = document.createElement('div');\n        items.setAttribute('part', 'summary-items');\n        items.setAttribute('data-layout', summary.layout ?? 'grid');\n        for (const item of summary.items) {\n          const itemElement = document.createElement(item.actionId ? 'button' : 'div');\n          itemElement.setAttribute('part', 'summary-item');\n          itemElement.setAttribute('data-tone', item.tone ?? 'neutral');\n          if (itemElement instanceof HTMLButtonElement) {\n            itemElement.type = 'button';\n            itemElement.setAttribute('role', 'menuitem');\n            itemElement.setAttribute('data-action-id', item.actionId!);\n            itemElement.addEventListener('click', () => this.#invoke(item.actionId!, 'summary'));\n          }\n          const value = document.createElement('div');\n          value.textContent = String(item.value);\n          const label = document.createElement('div');\n          label.setAttribute('part', 'summary-label');\n          label.textContent = item.label;\n          itemElement.append(value, label);\n          items.append(itemElement);\n        }\n        section.append(items);\n      }\n    } else if (summary.status === 'empty' && summary.empty) {\n      const empty = document.createElement(summary.empty.actionId ? 'button' : 'div');\n      empty.setAttribute('part', summary.empty.actionId ? 'summary-action' : 'summary-empty');\n      if (empty instanceof HTMLButtonElement) {\n        empty.type = 'button';\n        empty.setAttribute('role', 'menuitem');\n        empty.setAttribute('data-action-id', summary.empty.actionId!);\n        empty.addEventListener('click', () => this.#invoke(summary.empty!.actionId!, 'summary'));\n      }\n      const title = document.createElement('div');\n      title.textContent = summary.empty.title;\n      empty.append(title);\n      if (summary.empty.hint) {\n        const hint = document.createElement('div');\n        hint.setAttribute('part', 'summary-label');\n        hint.textContent = summary.empty.hint;\n        empty.append(hint);\n      }\n      section.append(empty);\n    } else if (summary.status === 'error') {\n      const error = document.createElement('div');\n      error.setAttribute('part', 'summary-error');\n      error.textContent = summary.error?.message ?? userMenuCopy(model.locale, 'summaryError');\n      section.append(error);\n      if (summary.error?.retryActionId) {\n        section.append(this.#createButton(userMenuCopy(model.locale, 'retry'), 'summary-action', () => {\n          this.#invoke(summary.error!.retryActionId!, 'summary');\n        }, { actionId: summary.error.retryActionId, role: 'menuitem' }));\n      }\n    }\n    panel.append(section);\n  }\n\n  #renderAction(\n    container: HTMLElement,\n    action: AireonUserMenuActionV1,\n    part = 'action',\n    source: AireonUserMenuActionSourceV1 = 'tools',\n  ): void {\n    const model = this.#model!;\n    if (!this.#available(action)) return;\n    const hasChildren = !!action.children?.some((child) => this.#available(child));\n    const activate = () => {\n      if (action.disabled) return;\n      if (hasChildren) {\n        this.#expandedActionId = this.#expandedActionId === action.id ? null : action.id;\n        this.#rovingActionId = action.id;\n        this.#focusFirstMenuItem = true;\n      }\n      this.#invoke(action.id, source, hasChildren || action.keepOpen);\n      if (hasChildren) this.#render();\n    };\n    const button = this.#createButton(actionLabel(model.locale, action), part, activate, {\n      disabled: action.disabled,\n      actionId: action.id,\n      icon: action.icon,\n      role: 'menuitem',\n    });\n    if (hasChildren) {\n      button.addEventListener('keydown', (event) => {\n        if (event.key !== 'Enter' && event.key !== ' ') return;\n        event.preventDefault();\n        activate();\n      });\n    }\n    if (action.danger || action.standardId === 'sign-out') button.setAttribute('data-danger', 'true');\n    if (action.badge !== undefined) {\n      const badge = document.createElement('span');\n      badge.setAttribute('part', 'badge');\n      badge.textContent = String(action.badge);\n      button.append(badge);\n    }\n    if (action.dot) {\n      const dot = document.createElement('span');\n      dot.setAttribute('part', 'dot');\n      dot.setAttribute('aria-hidden', 'true');\n      button.append(dot);\n    }\n    container.append(button);\n    if (hasChildren && this.#expandedActionId === action.id) {\n      const group = document.createElement('div');\n      group.setAttribute('part', 'action-group');\n      group.setAttribute('role', 'group');\n      for (const child of orderUserMenuActions(action.children!)) {\n        this.#renderAction(group, child);\n      }\n      container.append(group);\n    }\n  }\n\n  #onPanelKeydown = (event: KeyboardEvent): void => {\n    if (event.key === 'Escape') {\n      event.preventDefault();\n      this.#close(true);\n      return;\n    }\n    if (!['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key)) return;\n    const items = [...this.#root.querySelectorAll<HTMLButtonElement>('[role=\"menuitem\"]:not(:disabled)')];\n    const index = items.indexOf(this.#root.activeElement as HTMLButtonElement);\n    if (index < 0 || items.length === 0) return;\n    event.preventDefault();\n    const next = event.key === 'Home' ? 0\n      : event.key === 'End' ? items.length - 1\n        : (index + (event.key === 'ArrowDown' ? 1 : -1) + items.length) % items.length;\n    this.#rovingActionId = items[next].getAttribute('data-action-id');\n    for (const item of items) item.tabIndex = item === items[next] ? 0 : -1;\n    items[next].focus();\n  };\n\n  #syncRoving(panel: HTMLElement, focus = false): void {\n    const items = [...panel.querySelectorAll<HTMLButtonElement>('[role=\"menuitem\"]:not(:disabled)')];\n    if (!items.length) return;\n    const active = items.find((item) => item.getAttribute('data-action-id') === this.#rovingActionId) ?? items[0];\n    this.#rovingActionId = active.getAttribute('data-action-id');\n    for (const item of items) item.tabIndex = item === active ? 0 : -1;\n    if (focus) active.focus();\n  }\n\n  #safeAreaInsets(): { top: number; right: number; bottom: number; left: number } {\n    const probe = document.createElement('div');\n    probe.setAttribute('aria-hidden', 'true');\n    probe.style.cssText = 'height:0;overflow:hidden;pointer-events:none;position:fixed;visibility:hidden;width:0';\n    const hostStyles = getComputedStyle(this);\n    const variables = new Map<string, string>();\n    for (const name of [\n      '--menu-safe-area-top',\n      '--menu-safe-area-right',\n      '--menu-safe-area-bottom',\n      '--menu-safe-area-left',\n    ]) {\n      const value = this.style.getPropertyValue(name) || hostStyles.getPropertyValue(name);\n      variables.set(name, value);\n      probe.style.setProperty(name, value);\n    }\n    probe.style.paddingTop = 'var(--menu-safe-area-top)';\n    probe.style.paddingRight = 'var(--menu-safe-area-right)';\n    probe.style.paddingBottom = 'var(--menu-safe-area-bottom)';\n    probe.style.paddingLeft = 'var(--menu-safe-area-left)';\n    this.#root.append(probe);\n    const styles = getComputedStyle(probe);\n    const read = (property: string, variable: string) => Math.max(\n      0,\n      Number.parseFloat(styles.getPropertyValue(property)) || Number.parseFloat(variables.get(variable) ?? '') || 0,\n    );\n    const insets = {\n      top: read('padding-top', '--menu-safe-area-top'),\n      right: read('padding-right', '--menu-safe-area-right'),\n      bottom: read('padding-bottom', '--menu-safe-area-bottom'),\n      left: read('padding-left', '--menu-safe-area-left'),\n    };\n    probe.remove();\n    return insets;\n  }\n\n  #separateSignOut(\n    actions: readonly AireonUserMenuActionV1[],\n  ): { readonly actions: readonly AireonUserMenuActionV1[]; readonly signOut?: AireonUserMenuActionV1 } {\n    let signOut: AireonUserMenuActionV1 | undefined;\n    const visit = (action: AireonUserMenuActionV1): AireonUserMenuActionV1 | undefined => {\n      if (action.standardId === 'sign-out') {\n        if (!signOut && this.#available(action)) signOut = action;\n        return undefined;\n      }\n      if (!action.children) return action;\n      const children = action.children.flatMap((child) => {\n        const retained = visit(child);\n        return retained ? [retained] : [];\n      });\n      return children.length ? { ...action, children } : { ...action, children: undefined };\n    };\n    return {\n      actions: actions.flatMap((action) => {\n        const retained = visit(action);\n        return retained ? [retained] : [];\n      }),\n      signOut,\n    };\n  }\n\n  #positionPanel(): void {\n    if (!this.#open) return;\n    const panel = this.#root.querySelector<HTMLElement>('[part=\"panel\"]');\n    if (!panel) return;\n    const panelRect = panel.getBoundingClientRect();\n    if (!panelRect.width || !panelRect.height) return;\n    const triggerRect = this.getBoundingClientRect();\n    const gap = 8;\n    const safe = this.#safeAreaInsets();\n    const minLeft = safe.left + gap;\n    const maxLeft = Math.max(minLeft, window.innerWidth - panelRect.width - safe.right - gap);\n    const left = Math.min(Math.max(triggerRect.right - panelRect.width, minLeft), maxLeft);\n    const minTop = safe.top + gap;\n    const viewportBottom = window.innerHeight - safe.bottom - gap;\n    const maxTop = Math.max(minTop, viewportBottom - panelRect.height);\n    const below = triggerRect.bottom + gap;\n    const above = triggerRect.top - panelRect.height - gap;\n    const opensAbove = below + panelRect.height > viewportBottom && above >= minTop;\n    const top = opensAbove ? above : Math.min(Math.max(below, minTop), maxTop);\n    panel.style.left = `${Math.round(left)}px`;\n    panel.style.top = `${Math.round(top)}px`;\n    panel.setAttribute('data-placement', opensAbove ? 'top' : 'bottom');\n  }\n\n  #render(): void {\n    this.#root.replaceChildren();\n    const style = document.createElement('style');\n    style.textContent = AIREON_USER_MENU_STYLES;\n    this.#root.append(style);\n    if (!this.#model) return;\n    const model = this.#model;\n    this.setAttribute('data-theme', model.theme);\n    this.setAttribute('data-compact', String(model.trigger.compact));\n\n    const trigger = document.createElement('button');\n    trigger.type = 'button';\n    trigger.setAttribute('part', 'trigger');\n    trigger.setAttribute('aria-haspopup', 'menu');\n    trigger.setAttribute('aria-expanded', String(this.#open));\n    trigger.setAttribute('aria-label', model.trigger.accessibleLabel ?? userMenuCopy(model.locale, 'menu'));\n    if (model.account.status === 'authenticated') {\n      this.#appendAvatar(trigger, model.account);\n      const name = document.createElement('span');\n      name.setAttribute('part', 'trigger-name');\n      name.textContent = model.account.shortName;\n      trigger.append(name);\n      if (model.account.isAdmin) {\n        const badge = document.createElement('span');\n        badge.setAttribute('part', 'admin-badge');\n        badge.textContent = userMenuCopy(model.locale, 'admin');\n        trigger.append(badge);\n      }\n    } else {\n      const initials = document.createElement('span');\n      initials.setAttribute('part', 'avatar-initials');\n      initials.textContent = model.account.status === 'loading' ? '…' : '?';\n      trigger.append(initials);\n    }\n    const chevron = document.createElement('span');\n    chevron.setAttribute('aria-hidden', 'true');\n    chevron.textContent = '⌄';\n    trigger.append(chevron);\n    trigger.addEventListener('click', () => this.#toggle());\n    this.#root.append(trigger);\n\n    if (!this.#open) return;\n    const panel = document.createElement('div');\n    panel.setAttribute('part', 'panel');\n    panel.setAttribute('role', 'menu');\n    panel.setAttribute('aria-label', userMenuCopy(model.locale, 'menu'));\n    panel.addEventListener('keydown', this.#onPanelKeydown);\n    const separated = this.#separateSignOut(\n      orderUserMenuActions(model.actions).filter((action) => this.#available(action)),\n    );\n    const actions = separated.actions;\n    this.#renderAccount(panel, actions);\n    if (model.summary) this.#renderSummary(panel, model.summary);\n\n    const tools = actions.filter((action) => (\n      action.standardId !== 'sign-out'\n      && action.standardId !== 'sign-in'\n      && !(model.account.status === 'authenticated' && action.standardId === 'profile')\n    ));\n    if (tools.length) {\n      const label = document.createElement('div');\n      label.setAttribute('part', 'section-label');\n      label.textContent = userMenuCopy(model.locale, 'tools');\n      panel.append(label);\n      for (const action of tools) this.#renderAction(panel, action);\n    }\n    const auth = actions.filter((action) => action.standardId === 'sign-in');\n    for (const action of auth) this.#renderAction(panel, action, 'auth-action', 'auth');\n    const signOut = separated.signOut;\n    if (signOut) {\n      const divider = document.createElement('div');\n      divider.setAttribute('part', 'divider');\n      panel.append(divider);\n      const signOutContainer = document.createElement('div');\n      signOutContainer.setAttribute('part', 'sign-out');\n      this.#renderAction(signOutContainer, signOut);\n      panel.append(signOutContainer);\n    }\n    this.#root.append(panel);\n    this.#syncRoving(panel, this.#focusFirstMenuItem);\n    this.#focusFirstMenuItem = false;\n    this.#positionPanel();\n  }\n}\n\nexport function registerAireonUserMenu(): void {\n  if (!customElements.get(AIREON_USER_MENU_TAG)) {\n    customElements.define(AIREON_USER_MENU_TAG, AireonUserMenuElement);\n  }\n}\n","import { registerAireonUserMenu } from './AireonUserMenuElement';\n\nregisterAireonUserMenu();\n\nexport { registerAireonUserMenu };\n"],"mappings":"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","names":[]}
