import * as _angular_core from '@angular/core'; import { Signal, OnDestroy, Type, Provider, AfterViewInit, ElementRef, TemplateRef, InjectionToken, OnInit } from '@angular/core'; import { ControlValueAccessor } from '@angular/forms'; import * as _dataengineeringformachinelearning_viking_ui from '@dataengineeringformachinelearning/viking-ui'; import { SafeHtml } from '@angular/platform-browser'; import { Params } from '@angular/router'; /** * AUTO-GENERATED by scripts/sync_lucide_icons.mjs — do not edit by hand. * Lucide paths are inlined at build time; lucide is a devDependency only. * @see https://lucide.dev */ declare const LUCIDE_ICON_PATHS: { readonly "alert-circle": ""; readonly "alert-triangle": ""; readonly "arrow-left": ""; readonly "arrow-right": ""; readonly "arrow-up-right": ""; readonly "bar-chart": ""; readonly bell: ""; readonly bold: ""; readonly bolt: ""; readonly brain: ""; readonly bug: ""; readonly building: ""; readonly calendar: ""; readonly check: ""; readonly "check-circle": ""; readonly "chevron-down": ""; readonly "chevron-left": ""; readonly "chevron-right": ""; readonly "chevron-up": ""; readonly chip: ""; readonly clock: ""; readonly cloud: ""; readonly cookie: ""; readonly copy: ""; readonly "dots-horizontal": ""; readonly "dots-vertical": ""; readonly download: ""; readonly external: ""; readonly eye: ""; readonly "eye-off": ""; readonly file: ""; readonly filter: ""; readonly fingerprint: ""; readonly folder: ""; readonly globe: ""; readonly "grip-vertical": ""; readonly heart: ""; readonly home: ""; readonly image: ""; readonly info: ""; readonly insights: ""; readonly italic: ""; readonly key: ""; readonly link: ""; readonly list: ""; readonly "list-ordered": ""; readonly loader: ""; readonly lock: ""; readonly "log-in": ""; readonly "log-out": ""; readonly mail: ""; readonly menu: ""; readonly minus: ""; readonly moon: ""; readonly network: ""; readonly paperclip: ""; readonly pencil: ""; readonly phone: ""; readonly play: ""; readonly plus: ""; readonly policy: ""; readonly refresh: ""; readonly rocket: ""; readonly search: ""; readonly "search-off": ""; readonly send: ""; readonly server: ""; readonly settings: ""; readonly shield: ""; readonly ship: ""; readonly sparkle: ""; readonly speed: ""; readonly star: ""; readonly sun: ""; readonly terminal: ""; readonly trash: ""; readonly "trending-up": ""; readonly underline: ""; readonly upload: ""; readonly user: ""; readonly "user-shield": ""; readonly x: ""; }; /** * DEML branded icon paths — optimized SVG geometry (not sourced from Lucide). * Use via viking-icon name="deml" | "deml-compact" | "deml-lockup". */ declare const VIKING_BRAND_ICON_PATHS: { /** Primary bar-chart mark in rounded frame (outline). */ readonly deml: ""; /** Compact monogram for favicons and dense Drakkar shell. */ readonly "deml-compact": ""; /** Lockup mark with baseline accent bar. */ readonly "deml-lockup": ""; }; /** Drakkar — Viking-UI / site shell brand marks (Lucide ship, build-time inlined). */ declare const VIKING_DRAKKAR_ICON_PATHS: { /** Primary Drakkar longship mark (outline). */ readonly drakkar: ""; /** Compact tile for favicons and dense navbar chrome. */ readonly "drakkar-compact": ""; /** Lockup mark with baseline accent bar. */ readonly "drakkar-lockup": ""; }; /** Filled-path overrides for DEML brand marks. */ declare const VIKING_BRAND_ICON_FILLED_PATHS: Partial>; /** Filled-path overrides for Drakkar brand marks. */ declare const VIKING_DRAKKAR_ICON_FILLED_PATHS: Partial>; type VikingBrandIconName = keyof typeof VIKING_BRAND_ICON_PATHS; type VikingDrakkarIconName = keyof typeof VIKING_DRAKKAR_ICON_PATHS; declare const VIKING_BRAND_ICON_NAMES_LIST: VikingBrandIconName[]; declare const VIKING_DRAKKAR_ICON_NAMES_LIST: VikingDrakkarIconName[]; /** Official platform brand colors — exception for recognizable integration marks (same policy as Google/Apple in viking-icon). */ declare const VIKING_INTEGRATION_BRAND_COLORS: { readonly kubernetes: "#326CE5"; readonly tensorflow: "#FF6F00"; readonly pytorch: "#EE4C2C"; readonly "apache-spark": "#E25A1C"; readonly databricks: "#FF3621"; readonly "aws-redshift": "#8C4FFF"; }; type VikingIntegrationBrandName = keyof typeof VIKING_INTEGRATION_BRAND_COLORS; declare const VIKING_INTEGRATION_BRAND_NAMES: VikingIntegrationBrandName[]; declare const isIntegrationBrandIcon: (name: string) => name is VikingIntegrationBrandName; /** Multi-path brand SVG markup (24×24 viewBox) — official product logos at brand hue. */ declare const VIKING_INTEGRATION_BRAND_SVGS: Record; /** Path markup for icon registry / viking-icon-paths.json sync. */ declare const VIKING_INTEGRATION_ICON_PATHS: Record; type VikingIntegrationIconName = VikingIntegrationBrandName; declare const VIKING_INTEGRATION_ICON_NAMES_LIST: ("kubernetes" | "tensorflow" | "pytorch" | "apache-spark" | "databricks" | "aws-redshift")[]; /** * Zero-dependency inline SVG icon registry (24×24 stroke icons). * Lucide paths are synced at build time; DEML brand marks are custom artwork. */ type VikingIconName$1 = keyof typeof VIKING_ICON_PATHS$1; type VikingIconSizePreset = "sm" | "md" | "lg"; type VikingIconVariant = "outline" | "filled"; /** Semantic color tokens resolved to CSS custom properties. */ type VikingIconColorToken = "inherit" | "accent" | "success" | "warning" | "danger" | "info" | "muted" | "text"; /** Pixel sizes for sm / md / lg presets. */ declare const VIKING_ICON_SIZE_PRESETS: Record; declare const VIKING_ICON_PATHS$1: { readonly hub: ""; readonly model: ""; readonly google: ""; readonly apple: ""; readonly kubernetes: string; readonly tensorflow: string; readonly pytorch: string; readonly "apache-spark": string; readonly databricks: string; readonly "aws-redshift": string; readonly drakkar: ""; readonly "drakkar-compact": ""; readonly "drakkar-lockup": ""; readonly deml: ""; readonly "deml-compact": ""; readonly "deml-lockup": ""; readonly "alert-circle": ""; readonly "alert-triangle": ""; readonly "arrow-left": ""; readonly "arrow-right": ""; readonly "arrow-up-right": ""; readonly "bar-chart": ""; readonly bell: ""; readonly bold: ""; readonly bolt: ""; readonly brain: ""; readonly bug: ""; readonly building: ""; readonly calendar: ""; readonly check: ""; readonly "check-circle": ""; readonly "chevron-down": ""; readonly "chevron-left": ""; readonly "chevron-right": ""; readonly "chevron-up": ""; readonly chip: ""; readonly clock: ""; readonly cloud: ""; readonly cookie: ""; readonly copy: ""; readonly "dots-horizontal": ""; readonly "dots-vertical": ""; readonly download: ""; readonly external: ""; readonly eye: ""; readonly "eye-off": ""; readonly file: ""; readonly filter: ""; readonly fingerprint: ""; readonly folder: ""; readonly globe: ""; readonly "grip-vertical": ""; readonly heart: ""; readonly home: ""; readonly image: ""; readonly info: ""; readonly insights: ""; readonly italic: ""; readonly key: ""; readonly link: ""; readonly list: ""; readonly "list-ordered": ""; readonly loader: ""; readonly lock: ""; readonly "log-in": ""; readonly "log-out": ""; readonly mail: ""; readonly menu: ""; readonly minus: ""; readonly moon: ""; readonly network: ""; readonly paperclip: ""; readonly pencil: ""; readonly phone: ""; readonly play: ""; readonly plus: ""; readonly policy: ""; readonly refresh: ""; readonly rocket: ""; readonly search: ""; readonly "search-off": ""; readonly send: ""; readonly server: ""; readonly settings: ""; readonly shield: ""; readonly ship: ""; readonly sparkle: ""; readonly speed: ""; readonly star: ""; readonly sun: ""; readonly terminal: ""; readonly trash: ""; readonly "trending-up": ""; readonly underline: ""; readonly upload: ""; readonly user: ""; readonly "user-shield": ""; readonly x: ""; }; /** Filled-path overrides used when variant="filled" (brand marks, solid shapes). */ declare const VIKING_ICON_FILLED_PATHS: Partial>; /** Legacy Material Icons ligature names → Viking icon registry keys. */ declare const MATERIAL_ICON_ALIASES: Record; /** Icons always rendered with fill (play triangle, dot grids). */ declare const VIKING_FILLED_ICON_NAMES: readonly ["play", "dots-horizontal", "dots-vertical", "grip-vertical"]; /** OAuth / vendor marks rendered with official brand artwork in viking-icon. */ declare const VIKING_BRAND_ICON_NAMES: readonly ["google", "apple", ...("deml" | "deml-compact" | "deml-lockup")[]]; declare const vikingIconViewBox: (_name: VikingIconName$1) => string; /** Resolve pixel size from preset or explicit value. */ declare const resolveVikingIconSize: (size: number | undefined, preset: VikingIconSizePreset | null | undefined) => number; /** Resolve semantic color token or raw CSS value for icon tinting. */ declare const resolveVikingIconColor: (color: VikingIconColorToken | string | undefined) => string | undefined; /** Resolve a Viking or legacy Material icon name to a registry key. */ declare const resolveVikingIcon: (name: string) => VikingIconName$1; declare const VIKING_ICON_NAMES: VikingIconName$1[]; /** Lucide-sourced icon names (for docs and showcase grouping). */ declare const VIKING_LUCIDE_ICON_NAMES: (keyof typeof LUCIDE_ICON_PATHS)[]; /** Semantic tones — every tone resolves to a THEME.md token. */ type VikingTone = "accent" | "secondary" | "success" | "warning" | "danger" | "info" | "muted"; type VikingSize = "base" | "sm" | "xs"; /** Values supported by viking-select / viking-radio-group. */ type VikingOptionValue = string | number | boolean; interface VikingSelectOption { label: string; value: T; disabled?: boolean; } interface VikingCommandItem { id: string; label: string; group?: string; icon?: VikingIconName$1; kbd?: string; } interface VikingKanbanCard { id: string; title: string; description?: string; tone?: VikingTone; } interface VikingKanbanColumn { id: string; title: string; cards: VikingKanbanCard[]; } interface VikingKanbanMove { cardId: string; fromColumnId: string; toColumnId: string; toIndex: number; } interface VikingChartSeries { name: string; data: number[]; tone?: VikingTone; } type VikingChartKind = "line" | "area" | "bar" | "grouped-bar" | "stacked-bar" | "sparkline" | "donut"; type VikingChartCurve = "linear" | "smooth"; interface VikingDonutSegment { label: string; value: number; tone?: VikingTone; } type VikingToastAction = { readonly label: string; readonly onClick: () => void; }; /** Importance for the priority toast stack (FORJD ADR-0020). */ type VikingToastPriority = "low" | "normal" | "high" | "critical"; interface VikingToastOptions { heading?: string; text: string; tone?: VikingTone; /** Importance — defaults from tone (success→low, danger→critical). */ priority?: VikingToastPriority; /** Auto-dismiss duration in ms. 0 disables auto-dismiss. */ duration?: number; /** Replace an in-flight toast with the same key. */ dedupeKey?: string; /** Optional one-shot action (e.g. Undo). */ action?: VikingToastAction; } interface VikingToastInstance extends Required> { id: number; heading: string; priority: VikingToastPriority; dedupeKey?: string; action?: VikingToastAction; } /** * Suite focus helpers — keyboard navigation + restore after overlays. * Pure DOM utilities; safe to call from Angular effects / event handlers. */ /** True when the element can receive keyboard focus. */ declare function isFocusable(el: Element | null | undefined): el is HTMLElement; /** Focusable descendants in document order (excludes the container itself). */ declare function getFocusableElements(root: ParentNode): HTMLElement[]; /** Move focus to the first focusable descendant, or the container if focusable. */ declare function focusFirst(root: HTMLElement, options?: FocusOptions): HTMLElement | null; /** Capture the element that should regain focus when an overlay closes. */ declare function captureReturnFocus(active?: Element | null): HTMLElement | null; /** Restore focus after dismiss; no-op if the node is gone or not focusable. */ declare function restoreFocus(el: HTMLElement | null | undefined, options?: FocusOptions): void; type RovingKey = "ArrowRight" | "ArrowLeft" | "ArrowDown" | "ArrowUp" | "Home" | "End"; /** * Roving tabindex index math for tablists / menubars. * Returns the next index, or null if the key is not a navigation key. */ declare function nextRovingIndex(key: string, currentIndex: number, length: number, options?: { vertical?: boolean; wrap?: boolean; }): number | null; /** * Horizontal menubar / tablist key handler helper. * When orientation is "both", arrows work in either axis (FORJD tabs). */ declare function nextRovingIndexBothAxes(key: string, currentIndex: number, length: number): number | null; /** Horizontal menubar / nav list. */ declare function nextRovingIndexHorizontal(key: string, currentIndex: number, length: number): number | null; /** * Trap Tab / Shift+Tab inside an overlay root (WCAG 2.4.3 + focus retention). * Prefer native .showModal() when available; this is a defensive fallback. */ declare function trapTabKey(event: KeyboardEvent, root: HTMLElement): void; /** * Field validation a11y — associate description/error with the control and * surface invalid state (WCAG 1.3.1 / 3.3.1 / 4.1.2 / 4.1.3). */ /** Native + suite control hosts that can receive aria-invalid / describedby. */ declare const FIELD_CONTROL_SELECTOR: string; type FieldMessageIds = { descriptionId: string; errorId: string; hasDescription: boolean; hasError: boolean; }; /** Space-separated id list for aria-describedby (description kept when error). */ declare function fieldDescribedBy(ids: FieldMessageIds): string | null; declare function findFieldControl(root: ParentNode): HTMLElement | null; /** * Wire aria-describedby + aria-invalid (+ optional required) onto the field control. * Safe to call from afterRenderEffect whenever messages change. */ declare function syncFieldControlA11y(root: ParentNode, ids: FieldMessageIds & { required?: boolean; }): HTMLElement | null; /** * Suite theme preference — light / dark / system. * Persist preference; resolve against prefers-color-scheme; apply data-theme. */ type SuiteThemePreference = "light" | "dark" | "system"; type SuiteThemeResolved = "light" | "dark"; /** Canonical storage key (migrates legacy `theme`). */ declare const SUITE_THEME_STORAGE_KEY = "suite-theme"; declare const SUITE_THEME_CHANGE_EVENT = "suite-theme-change"; declare function prefersDarkScheme(media?: MediaQueryList | null | undefined): boolean; /** WCAG 2.3.3 — true when the user asks for reduced motion. */ declare function prefersReducedMotion(media?: MediaQueryList | null | undefined): boolean; declare function resolveSuiteTheme(preference: SuiteThemePreference, systemPrefersDark?: boolean): SuiteThemeResolved; /** Accessible name for the suite theme toggle (voice / SR). */ declare function suiteThemeToggleAriaLabel(preference: SuiteThemePreference, resolved: SuiteThemeResolved): string; declare function parseSuiteThemePreference(value: string | null | undefined): SuiteThemePreference | null; /** Read preference: suite-theme → legacy theme → system. */ declare function readSuiteThemePreference(storage?: Pick | null | undefined): SuiteThemePreference; declare function writeSuiteThemePreference(preference: SuiteThemePreference, storage?: Pick | null | undefined): void; /** Apply resolved theme to the document. Returns true when DOM actually changed. */ declare function applySuiteTheme(resolved: SuiteThemeResolved, root?: HTMLElement | null): boolean; declare function dispatchSuiteThemeChange(detail: { preference: SuiteThemePreference; resolved: SuiteThemeResolved; }, target?: EventTarget | null): void; /** * Idempotent document-level listener: when preference is `system`, re-apply * on OS scheme changes. Avoids N theme-toggle instances each rewriting DOM. */ declare function ensureSuiteSystemThemeListener(): void; /** Toggle resolved appearance and persist as an explicit light/dark choice. */ declare function toggleSuiteThemePreference(preference: SuiteThemePreference, systemPrefersDark?: boolean): SuiteThemePreference; /** Cycle system → light → dark → system (for controls that expose all modes). */ declare function cycleSuiteThemePreference(preference: SuiteThemePreference): SuiteThemePreference; /** * Inline FOUC bootstrap (copy into scripts). * Mirrors read → resolve → apply without writing storage. */ declare function bootstrapSuiteThemeInline(): string; /** Builds a stable unique-id factory (shared by vikingUid / forjdUid). */ declare function createUidFactory(_namespace?: string): (prefix: string) => string; /** Generates a stable, unique DOM id for label/control associations. */ declare const vikingUid: (prefix: string) => string; /** * Native focus session — shared by modal/sheet (and forjd dialog/sheet). * Captures return focus, opens via showModal, traps Tab, restores on close. */ /** Stateful helper for one native dialog host at a time. */ declare class NativeDialogSession { private returnFocus; /** * Sync `open` model → dialog.showModal() / close(). * Pass `connected: false` when the host is detached (SSR / destroy). */ syncOpen(dialog: HTMLDialogElement, wantOpen: boolean, options?: { connected?: boolean; }): void; /** Native `close` event — clear model + restore focus. */ onNativeClose(setClosed: () => void): void; /** Backdrop click on the dialog element itself. */ onBackdropClick(event: MouseEvent, dialog: HTMLDialogElement, dismissible: boolean, close: () => void): void; /** Defensive Tab trap (complements native modal focus retention). */ onKeydown(event: KeyboardEvent, dialog: HTMLDialogElement): void; /** Close on destroy if still open. */ destroy(dialog: HTMLDialogElement | null | undefined): void; } /** * Priority-aware toast queue — shared shape for VikingToastService / FjToastService. * Non-intrusive: capped visible stack, importance ordering, dedupe, sticky critical. * Dual-adapter: keep API aligned with forjd-ui core/a11y/toast-store (FORJD ADR-0020). */ type ToastPriority = "low" | "normal" | "high" | "critical"; type ToastStoreItem = { readonly id: number; readonly priority: ToastPriority; /** When set, a new toast with the same key replaces the prior one. */ readonly dedupeKey?: string; }; type ToastStore = { readonly messages: Signal; nextId: () => number; add: (message: TMessage, durationMs?: number) => number; dismiss: (id: number) => void; clear: () => void; /** Pause auto-dismiss (e.g. pointer hover) — non-intrusive reading time. */ pause: (id?: number) => void; /** Resume auto-dismiss after pause. */ resume: (id?: number) => void; }; type CreateToastStoreOptions = { readonly defaultDurationMs?: number; /** Max simultaneous toasts; lower-priority / older ones are dropped. */ readonly maxVisible?: number; readonly durationByPriority?: Partial>; }; declare function toastPriorityRank(priority: ToastPriority): number; /** Map suite tones to a default importance (callers may override). */ declare function toastPriorityFromTone(tone: string | undefined | null): ToastPriority; declare function defaultToastDurationMs(priority: ToastPriority, overrides?: Partial>): number; declare function createToastStore(options?: { defaultDurationMs?: number; maxVisible?: number; durationByPriority?: Partial>; }): ToastStore; /** * Optimistic apply → persist → rollback on failure. * Dual-adapter: keep API aligned with forjd-ui core/a11y/optimistic. */ type OptimisticResult = { readonly ok: true; } | { readonly ok: false; readonly error: unknown; }; type RunOptimisticOptions = { /** Capture prior state before apply (used only on rollback). */ snapshot: () => TSnapshot; /** Immediate UI update. */ apply: () => void; /** Persist / network / storage — sync or async. */ persist: () => void | Promise; /** Restore snapshot when persist throws. */ rollback: (snapshot: TSnapshot) => void; }; /** * Apply UI optimistically, then persist. On persist failure, rollback and * return `{ ok: false, error }` without rethrowing (callers may toast). */ declare function runOptimistic(options: RunOptimisticOptions): Promise; /** * Undo/redo stack for reversible client actions (FORJD ADR-0019). * Dual-adapter: keep API aligned with forjd-ui core/a11y/command-history. * * Use for local UI mutations (theme, recent searches, soft client state). * Do not invent server soft-delete here — irreversible API deletes stay confirm-only. */ type HistoryEntry = { readonly id: string; readonly label: string; readonly undo: () => void | Promise; readonly redo: () => void | Promise; }; type RunHistoryCommand = { readonly label: string; /** Forward action — runs immediately; history records only on success. */ readonly do: () => void | Promise; /** Inverse — restores prior state. */ readonly undo: () => void | Promise; readonly id?: string; }; type CommandHistory = { run: (command: RunHistoryCommand) => Promise; undo: () => Promise; redo: () => Promise; clear: () => void; canUndo: () => boolean; canRedo: () => boolean; undoLabel: () => string | null; redoLabel: () => string | null; subscribe: (listener: () => void) => () => void; }; type CreateCommandHistoryOptions = { readonly maxDepth?: number; }; /** Shared suite history so Angular hosts and optional WC callers share one stack. */ declare function getDefaultCommandHistory(options?: CreateCommandHistoryOptions): CommandHistory; /** @internal test helper — reset the shared singleton. */ declare function resetDefaultCommandHistoryForTests(): void; declare function createCommandHistory(options?: CreateCommandHistoryOptions): CommandHistory; /** * Bind ⌘Z / Ctrl+Z (undo) and ⌘⇧Z / Ctrl+Y (redo). * Skips when focus is in an editable field. */ declare function bindCommandHistoryShortcuts(history: CommandHistory, options?: { readonly target?: Document; }): () => void; /** * Suite command history — ⌘Z / ⌘⇧Z for reversible client actions (FORJD ADR-0019). * Shortcuts bind once via `getDefaultCommandHistory()`. */ declare class VikingCommandHistoryService { private readonly platformId; private readonly destroyRef; private readonly toast; private readonly history; private readonly version; readonly canUndo: _angular_core.Signal; readonly canRedo: _angular_core.Signal; readonly undoLabel: _angular_core.Signal; readonly redoLabel: _angular_core.Signal; constructor(); run(command: RunHistoryCommand): Promise; runWithUndoToast(command: RunHistoryCommand, opts?: { readonly text?: string; readonly duration?: number; }): Promise; undo(): Promise; redo(): Promise; clear(): void; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵprov: _angular_core.ɵɵInjectableDeclaration; } /** * Multi-select model for list/table bulk actions (FORJD ADR-0021). * Dual-adapter: keep API aligned with forjd-ui core/a11y/selection-model. * * Keys are stable string ids. Hosts own persistence / server calls; * this helper only tracks selection set membership. */ type SelectionModel = { readonly selected: () => readonly string[]; readonly size: () => number; readonly isSelected: (id: string) => boolean; readonly allSelected: (ids: readonly string[]) => boolean; readonly someSelected: (ids: readonly string[]) => boolean; toggle: (id: string) => void; select: (id: string) => void; deselect: (id: string) => void; /** Select every id in `ids` (union). */ selectMany: (ids: readonly string[]) => void; /** Select exactly `ids` (replace). */ setSelected: (ids: readonly string[]) => void; /** Toggle all: if every id selected → clear those; else select all. */ toggleAll: (ids: readonly string[]) => void; clear: () => void; /** Drop ids that are no longer in the visible/page set. */ pruneTo: (ids: readonly string[]) => void; subscribe: (listener: () => void) => () => void; }; type CreateSelectionModelOptions = { readonly initial?: readonly string[]; readonly maxSelected?: number; }; declare function createSelectionModel(options?: CreateSelectionModelOptions): SelectionModel; type VikingBulkAction = { readonly id: string; readonly label: string; readonly variant?: "primary" | "secondary" | "outline" | "ghost" | "danger"; readonly disabled?: boolean; }; /** * Non-modal bulk action bar — appears when list rows are selected (FORJD ADR-0021). */ declare class VikingBulkToolbar { readonly count: _angular_core.InputSignal; readonly actions: _angular_core.InputSignal; readonly ariaLabel: _angular_core.InputSignal; readonly actionClick: _angular_core.OutputEmitterRef; readonly clear: _angular_core.OutputEmitterRef; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵcmp: _angular_core.ɵɵComponentDeclaration; } /** * Progressive disclosure store — smart defaults + remembered expand state * (FORJD ADR-0022). Dual-adapter: keep API aligned with forjd-ui core/a11y/disclosure. * * Advanced sections default collapsed so new users see essentials first. * Expand state persists in localStorage (never secrets). */ declare const SUITE_DISCLOSURE_STORAGE_KEY = "suite-disclosure-v1"; type DisclosureStore = { readonly isOpen: (id: string, fallback?: boolean) => boolean; readonly setOpen: (id: string, open: boolean) => void; readonly toggle: (id: string, fallback?: boolean) => void; /** Clear one id (or all) so smart defaults apply again. */ readonly reset: (id?: string) => void; /** Remembered expand map (suite data pack — FORJD ADR-0026). */ readonly snapshot: () => Readonly>; /** Merge or replace remembered expand state (suite data pack — FORJD ADR-0026). */ readonly importMap: (map: Readonly>, mode?: "merge" | "replace") => void; readonly subscribe: (listener: () => void) => () => void; }; type CreateDisclosureStoreOptions = { readonly storageKey?: string; /** Explicit defaults — missing ids fall back to `false` (collapsed). */ readonly defaults?: Readonly>; readonly storage?: Pick | null; }; declare function createDisclosureStore(options?: CreateDisclosureStoreOptions): DisclosureStore; /** Process-wide suite disclosure store (shared across disclosure hosts). */ declare function getDefaultDisclosureStore(): DisclosureStore; /** Test helper — drop the singleton between suites. */ declare function resetDefaultDisclosureStore(): void; /** * Progressive disclosure panel — advanced content collapsed by default * (FORJD ADR-0022). Chrome: suite-components.css (`.suite-disclosure`). */ declare class VikingDisclosure { private readonly destroyRef; private store; /** Stable section id for persistence (e.g. `deml.settings.telemetry`). */ readonly sectionId: _angular_core.InputSignal; readonly heading: _angular_core.InputSignal; readonly description: _angular_core.InputSignal; /** Smart default when the user has never toggled this section. */ readonly defaultOpen: _angular_core.InputSignal; /** Small label — default “Advanced” for progressive disclosure. */ readonly badge: _angular_core.InputSignal; readonly level: _angular_core.InputSignal<"default" | "inset">; protected readonly open: _angular_core.WritableSignal; protected readonly triggerId: string; protected readonly panelId: _angular_core.Signal; constructor(); protected toggle(): void; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵcmp: _angular_core.ɵɵComponentDeclaration; } /** * Suite keyboard shortcut registry + helpers (FORJD ADR-0023). * Dual-adapter: keep API aligned with forjd-ui core/a11y/keyboard-shortcuts. * * Features keep their own listeners (search, undo); this catalog documents * them and owns the help chord (`?`). Never store secrets in shortcut state. */ type SuiteShortcut = { readonly id: string; /** * Display chord tokens. Use `Mod` for ⌘ (macOS) / Ctrl (elsewhere). * Examples: `['Mod', 'K']`, `['/']`, `['?']`, `['Esc']`. */ readonly keys: readonly string[]; readonly label: string; readonly group: string; readonly description?: string; }; type ShortcutRegistry = { readonly list: () => readonly SuiteShortcut[]; readonly byGroup: () => ReadonlyArray<{ readonly group: string; readonly items: readonly SuiteShortcut[]; }>; readonly register: (shortcut: SuiteShortcut) => void; readonly unregister: (id: string) => void; readonly subscribe: (listener: () => void) => () => void; }; type CreateShortcutRegistryOptions = { readonly initial?: readonly SuiteShortcut[]; }; /** True when keydown should not steal typing focus. */ declare function isEditableKeyboardTarget(target: EventTarget | null): boolean; declare function prefersMacModKey(platform?: string): boolean; /** Expand `Mod` and join for docs / aria. */ declare function formatShortcutChord(keys: readonly string[], options?: { readonly mac?: boolean; }): string; /** Built-in suite shortcuts (search / undo / help). Bindings live with owners. */ declare function suiteDefaultShortcuts(): readonly SuiteShortcut[]; declare function createShortcutRegistry(options?: CreateShortcutRegistryOptions): ShortcutRegistry; declare function getDefaultShortcutRegistry(): ShortcutRegistry; declare function resetDefaultShortcutRegistry(): void; /** * Bind `?` (Shift+/) to open shortcut help. * Skips editable fields and when a modifier other than Shift is held. */ declare function bindShortcutHelpKey(onOpen: () => void, options?: { readonly target?: Document; }): () => void; /** * Suite shortcut help — `?` opens the reference dialog (FORJD ADR-0023). */ declare class VikingShortcutHelpService implements OnDestroy { private readonly openSignal; readonly open: _angular_core.Signal; readonly registry: ShortcutRegistry; private readonly unbind; constructor(); show(): void; hide(): void; setOpen(next: boolean): void; ngOnDestroy(): void; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵprov: _angular_core.ɵɵInjectableDeclaration; } /** * Keyboard shortcut reference dialog (FORJD ADR-0023). * Open via `?` or `VikingShortcutHelpService.show()`. */ declare class VikingShortcutHelp { protected readonly help: VikingShortcutHelpService; private readonly destroyRef; private readonly mac; private readonly tick; constructor(); protected readonly groups: _angular_core.Signal; protected displayKeys(item: SuiteShortcut): string[]; protected chord(item: SuiteShortcut): string; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵcmp: _angular_core.ɵɵComponentDeclaration; } /** * Suite preferences store — persist + cross-tab sync (FORJD ADR-0024). * Dual-adapter: keep API aligned with forjd-ui core/a11y/preferences. * * Soft UI chrome only (theme, …). Never store secrets, tokens, or auth. * Theme also mirrors `suite-theme` for FOUC / legacy readers. */ declare const SUITE_PREFERENCES_STORAGE_KEY = "suite-preferences-v1"; declare const SUITE_PREFERENCES_CHANGE_EVENT = "suite-preferences-change"; type SuitePreferences = { readonly theme: SuiteThemePreference; /** Epoch ms — last-write-wins across tabs. */ readonly updatedAt: number; }; type PreferencesPatch = { readonly theme?: SuiteThemePreference; }; type PreferencesStore = { readonly get: () => SuitePreferences; readonly patch: (partial: PreferencesPatch, opts?: { readonly source?: "local" | "theme" | "sync"; }) => SuitePreferences; readonly reset: () => SuitePreferences; readonly subscribe: (listener: () => void) => () => void; /** Listen for `storage` + same-tab CustomEvent. */ readonly bindSync: (options?: { readonly target?: Window; }) => () => void; }; type CreatePreferencesStoreOptions = { readonly storageKey?: string; readonly storage?: Pick | null; }; declare function createPreferencesStore(options?: CreatePreferencesStoreOptions): PreferencesStore; declare function getDefaultPreferencesStore(): PreferencesStore; declare function resetDefaultPreferencesStore(): void; /** * Suite activity log — important soft-chrome actions (FORJD ADR-0027). * Dual-adapter: keep API aligned with forjd-ui core/a11y/activity-log. * * Local, capped, metadata-only. Never secrets, tokens, or ciphertext. * Not a substitute for server `audit_events` / DEML AuditLog. */ declare const SUITE_ACTIVITY_STORAGE_KEY = "suite-activity-v1"; declare const SUITE_ACTIVITY_CHANGE_EVENT = "suite-activity-change"; type SuiteActivitySource = "forjd" | "deml" | "suite"; type SuiteActivityEntry = { readonly id: string; readonly at: number; readonly kind: string; readonly label: string; readonly detail?: string; readonly source?: SuiteActivitySource; }; type ActivityLogRecordInput = { readonly kind: string; readonly label: string; readonly detail?: string; readonly source?: SuiteActivitySource; readonly at?: number; }; type ActivityLog = { readonly list: () => readonly SuiteActivityEntry[]; readonly record: (input: ActivityLogRecordInput) => SuiteActivityEntry | null; readonly clear: () => void; readonly subscribe: (listener: () => void) => () => void; readonly bindSync: (options?: { readonly target?: Window; }) => () => void; }; type CreateActivityLogOptions = { readonly storageKey?: string; readonly maxEntries?: number; readonly storage?: Pick | null; }; declare function createActivityLog(options?: CreateActivityLogOptions): ActivityLog; declare function getDefaultActivityLog(): ActivityLog; declare function resetDefaultActivityLog(): void; /** Convenience for adapters — records against the process default log. */ declare function recordSuiteActivity(input: ActivityLogRecordInput): SuiteActivityEntry | null; /** * Suite preferences — persist + cross-tab sync; open via ⌘, (FORJD ADR-0024). * Export / import soft chrome via suite data pack (FORJD ADR-0026). * Important actions → suite activity log (FORJD ADR-0027). */ declare class VikingPreferencesService { private readonly platformId; private readonly destroyRef; private readonly theme; private readonly toast; private readonly store; private readonly activity; private readonly openSignal; private readonly snapshotSignal; private readonly activitySignal; readonly open: _angular_core.Signal; readonly snapshot: _angular_core.Signal; readonly activityEntries: _angular_core.Signal; constructor(); show(): void; hide(): void; setOpen(next: boolean): void; setTheme(preference: SuiteThemePreference): void; resetDisclosure(): void; clearSearchHistory(): void; resetAll(): void; clearActivity(): void; /** Download soft UI chrome as a suite data pack JSON file (FORJD ADR-0026). */ exportDataPack(options?: { readonly includeRecentSearches?: boolean; }): void; /** Import a suite data pack file (merge or replace). */ importDataPack(file: File, mode?: "merge" | "replace"): Promise; private bindOpenShortcut; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵprov: _angular_core.ɵɵInjectableDeclaration; } /** * Preferences form body — theme, export/import, activity * (FORJD ADR-0024 / ADR-0026 / ADR-0027). */ declare class VikingPreferencesPanel { protected readonly prefs: VikingPreferencesService; private readonly packFile; protected readonly includeRecent: _angular_core.WritableSignal; private importMode; protected readonly themeOptions: { readonly value: SuiteThemePreference; readonly label: string; }[]; protected setTheme(value: SuiteThemePreference): void; protected exportPack(): void; protected pickImport(mode: "merge" | "replace"): void; protected onPackFile(event: Event): void; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵcmp: _angular_core.ɵɵComponentDeclaration; } /** Preferences modal — open via ⌘, / Ctrl+, or VikingPreferencesService.show(). */ declare class VikingPreferences { protected readonly prefs: VikingPreferencesService; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵcmp: _angular_core.ɵɵComponentDeclaration; } /** * Suite onboarding progress — first-time guidance (FORJD ADR-0025). * Dual-adapter: keep API aligned with forjd-ui core/a11y/onboarding. * * Journey state only (dismiss / complete / step ids). Never secrets or tokens. * Separate from suite-preferences-v1 (FORJD ADR-0024 soft chrome). */ declare const SUITE_ONBOARDING_STORAGE_KEY = "suite-onboarding-v1"; declare const SUITE_ONBOARDING_CHANGE_EVENT = "suite-onboarding-change"; type SuiteOnboardingFlow = "deml-status" | "forjd-partner" | null; type SuiteOnboardingState = { readonly version: 1; readonly dismissed: boolean; readonly completed: boolean; readonly completedSteps: readonly string[]; readonly activeFlow: SuiteOnboardingFlow; readonly updatedAt: number; }; type OnboardingStore = { readonly get: () => SuiteOnboardingState; readonly shouldShowGuide: () => boolean; readonly isStepComplete: (id: string) => boolean; readonly completeStep: (id: string) => void; readonly incompleteStep: (id: string) => void; readonly markComplete: () => void; readonly markDismissed: () => void; readonly setActiveFlow: (flow: SuiteOnboardingFlow) => void; readonly reset: () => void; /** Merge or replace journey state (suite data pack — FORJD ADR-0026). */ readonly importState: (raw: unknown, mode?: "merge" | "replace") => void; readonly subscribe: (listener: () => void) => () => void; readonly bindSync: (options?: { readonly target?: Window; }) => () => void; }; type CreateOnboardingStoreOptions = { readonly storageKey?: string; readonly storage?: Pick | null; }; declare function createOnboardingStore(options?: CreateOnboardingStoreOptions): OnboardingStore; declare function getDefaultOnboardingStore(): OnboardingStore; declare function resetDefaultOnboardingStore(): void; /** Standard empty-state eyebrow for first-time guidance surfaces. */ declare const SUITE_EMPTY_GUIDANCE_EYEBROW = "Getting started"; /** One checklist row for first-time guidance (FORJD ADR-0025). */ type VikingOnboardingStep = { readonly id: string; readonly title: string; readonly description?: string; /** In-app route (preferred) or absolute http(s) URL. */ readonly href?: string; readonly routerLink?: string | readonly string[]; readonly actionLabel?: string; }; /** * First-time onboarding checklist — persists via createOnboardingStore * (FORJD ADR-0025). Chrome: suite-components.css (`.suite-onboarding`). * Empty surfaces should keep using viking-empty-state with * SUITE_EMPTY_GUIDANCE_EYEBROW. */ declare class VikingOnboardingChecklist { private readonly destroyRef; private store; readonly flowId: _angular_core.InputSignal; readonly heading: _angular_core.InputSignal; readonly description: _angular_core.InputSignal; readonly eyebrow: _angular_core.InputSignal; readonly steps: _angular_core.InputSignal; readonly dismissible: _angular_core.InputSignal; readonly dismissLabel: _angular_core.InputSignal; readonly finishLabel: _angular_core.InputSignal; /** Hide when the store says the guide should not show (completed / dismissed). */ readonly autoHide: _angular_core.InputSignal; readonly stepChange: _angular_core.OutputEmitterRef<{ readonly id: string; readonly complete: boolean; }>; readonly dismissed: _angular_core.OutputEmitterRef; readonly completed: _angular_core.OutputEmitterRef; protected readonly titleId: string; protected readonly tick: _angular_core.WritableSignal; protected readonly completedCount: _angular_core.Signal; protected readonly allDone: _angular_core.Signal; protected readonly hidden: _angular_core.Signal; constructor(); protected isDone(id: string): boolean; protected stepHref(step: VikingOnboardingStep): string | null; protected toggleStep(id: string, event: Event): void; protected onAction(id: string): void; protected finish(): void; protected dismiss(): void; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵcmp: _angular_core.ɵɵComponentDeclaration; } /** Shared Web Component item types. */ type VikingSearchPaletteItem = { title: string; href: string; snippet?: string; group?: string; keywords?: string[]; action?: "cookie-settings" | "bug-report"; }; type VikingWcTone = "accent" | "secondary" | "success" | "warning" | "danger" | "info" | "muted" | "subtle"; /** * Recent search persistence for the suite command palette (localStorage). * Stores query strings and recently opened destinations — never secrets. */ declare const DEFAULT_RECENT_STORAGE_KEY = "viking-search-recent-v1"; declare const DEFAULT_RECENT_LIMIT = 8; type VikingRecentSearch = { readonly query: string; readonly title?: string; readonly href?: string; readonly at: number; }; /** Read recent entries (newest first). */ declare function readRecentSearches(storageKey?: string, options?: { readonly limit?: number; }): VikingRecentSearch[]; /** Push a query (and optional destination) to the front of recent history. */ declare function pushRecentSearch(entry: { query: string; title?: string; href?: string; }, options?: { readonly storageKey?: string; readonly limit?: number; }): VikingRecentSearch[]; /** Clear all recent searches for the key. */ declare function clearRecentSearches(storageKey?: string): void; /** Map recent rows into palette items for the empty-query state. */ declare function recentSearchesAsItems(recent: readonly VikingRecentSearch[]): VikingSearchPaletteItem[]; /** * Suite data pack — export / import soft UI chrome (FORJD ADR-0026). * Dual-adapter: keep API aligned with forjd-ui core/a11y/suite-data-pack. * * Browser JSON only. Never secrets, tokens, auth, or ciphertext. * Unrelated to server `/api/v1/exports` (analytics jobs). */ declare const SUITE_DATA_PACK_KIND: "suite-data-pack"; declare const SUITE_DATA_PACK_VERSION: 1; type SuiteDataPackV1 = { readonly kind: typeof SUITE_DATA_PACK_KIND; readonly version: typeof SUITE_DATA_PACK_VERSION; readonly exportedAt: number; readonly preferences?: { readonly theme: SuiteThemePreference; readonly updatedAt: number; }; readonly disclosure?: Readonly>; readonly onboarding?: unknown; readonly recentSearches?: readonly VikingRecentSearch[]; }; type ExportSuiteDataPackOptions = { /** Include command-palette recent queries (off by default — typed history). */ readonly includeRecentSearches?: boolean; readonly recentStorageKey?: string; }; type ImportSuiteDataPackOptions = { readonly mode?: "merge" | "replace"; readonly recentStorageKey?: string; }; type ParseSuiteDataPackResult = { readonly ok: true; readonly pack: SuiteDataPackV1; } | { readonly ok: false; readonly error: string; }; type ApplySuiteDataPackResult = { readonly applied: readonly string[]; }; /** Build a portable pack from the current browser suite stores. */ declare function exportSuiteDataPack(options?: ExportSuiteDataPackOptions): SuiteDataPackV1; /** Validate + sanitize an unknown JSON value into a pack. */ declare function parseSuiteDataPack(raw: unknown): ParseSuiteDataPackResult; /** Apply a parsed pack into local suite stores. */ declare function applySuiteDataPack(pack: SuiteDataPackV1, options?: ImportSuiteDataPackOptions): ApplySuiteDataPackResult; /** Trigger a browser download of the pack JSON. */ declare function downloadSuiteDataPack(pack: SuiteDataPackV1, filename?: string): void; /** Read + parse a user-selected pack file. */ declare function readSuiteDataPackFile(file: File): Promise; /** * Compact activity / audit rows for soft-chrome actions (FORJD ADR-0027). * Chrome: suite-components.css (`.suite-activity`). */ declare class VikingActivityList { readonly entries: _angular_core.InputSignal; readonly emptyLabel: _angular_core.InputSignal; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵcmp: _angular_core.ɵɵComponentDeclaration; } /** * Canonical client data-fetching handle — flat phase/data/error signals. * Dual-adapter: keep API aligned with FORJD `app/core/fetch/fetch-handle` * (FORJD ADR-0011). Presentation binds isLoading / isError / isSuccess; * domain code owns fetchers — viking-ui does not call backends. */ /** Shared lifecycle for any client request (probe, GET, mutation read-back). */ type FetchPhase = "idle" | "loading" | "success" | "error"; /** Soft or hard settle — prefer this over throw when the domain returns outcomes. */ type FetchSettled = { readonly ok: true; readonly data: TData; } | { readonly ok: false; readonly error: TError; }; type CreateFetchHandleOptions = { /** Default `idle`. Use `loading` when the view probes immediately on mount. */ readonly initialPhase?: FetchPhase; }; type FetchHandle = { readonly phase: Signal; readonly data: Signal; readonly error: Signal; readonly isIdle: Signal; readonly isLoading: Signal; readonly isSuccess: Signal; readonly isError: Signal; /** * Run a throwing fetcher. Sets loading → success|error. * Superseded / aborted generations do not write success or error. */ run(fetcher: (signal: AbortSignal) => Promise, mapError?: (cause: unknown) => TError): Promise; /** * Run a soft-settled fetcher (no throw for domain outcomes). * Use for continuity probes that return ok | soft-failure. */ runSettled(fetcher: (signal: AbortSignal) => Promise>): Promise; /** Force error without a network round-trip (e.g. offline event). */ fail(error: TError): void; /** * Apply a settled result without entering `loading` (SWR background revalidation). * Does not abort an in-flight `run` / `runSettled`. */ applySettled(settled: FetchSettled): void; /** Return to idle and drop data/error. */ reset(): void; /** * Abort the in-flight request (if any). * If still `loading` with no successor run, returns to `idle` (DestroyRef-safe). */ abort(): void; }; /** Safe string for UI error slots — never stringify tokens/ciphertext. */ declare function fetchErrorMessage(cause: unknown, fallback?: string): string; /** * Create a local fetch handle (component- or service-owned). * Flat signals only — no nested `{ status, data, error }` VM object. */ declare function createFetchHandle(options?: CreateFetchHandleOptions): FetchHandle; /** * Stale-while-revalidate cache with generation-guarded writes. * Dual-adapter: keep API aligned with FORJD `app/core/fetch/swr-cache` * (FORJD ADR-0012). One cache instance per resource — compose; no mega keyed store. */ type SwrCachePolicy = { /** Serve without network when age < freshMs. */ readonly freshMs: number; /** Serve cached value and revalidate in background when freshMs ≤ age < staleMs. */ readonly staleMs: number; }; type SwrReadSource = "fresh" | "stale" | "network"; type SwrReadResult = { readonly value: T; readonly source: SwrReadSource; }; type CreateSwrCacheOptions = { readonly policy: SwrCachePolicy; /** Return false to skip storing (e.g. offline). Caller still receives the value. */ readonly shouldCache?: (value: T) => boolean; }; type SwrCache = { /** SWR read: fresh hit | stale+background revalidate | blocking network. */ read(fetcher: () => Promise): Promise>; /** Hard drop — bump generation so in-flight writes cannot repopulate. */ invalidate(): void; /** * Soft invalidate — keep value but age it past `freshMs` so the next `read` * returns stale and kicks background revalidation. */ markStale(): void; /** * Force a background revalidate when a value exists. * Failed revalidation keeps the previous value (SWR). */ revalidate(fetcher: () => Promise): Promise; /** Current value without fetching. */ peek(): T | null; /** Age in ms, or `null` when empty. */ ageMs(now?: number): number | null; /** Notify on successful cache writes (network / revalidate). */ subscribe(listener: (value: T) => void): () => void; }; /** * Create a single-resource SWR cache. * Prefer one instance per URL/resource over a multi-key global map (ADR-0010). */ declare function createSwrCache(options: CreateSwrCacheOptions): SwrCache; /** * Client navigation hygiene — block XSS URL schemes and open redirects. * Dual-adapter: keep API aligned with forjd-ui core/a11y/safe-href * (FORJD ADR-0013 / ADR-0016). */ type SafeHrefOptions = { /** * When set, absolute `http(s)` URLs must match one of these hosts * (exact or subdomain). Relative `/…` and `#…` ignore this list. */ readonly allowedHosts?: readonly string[]; /** * When true, reject `http:` except loopback (`localhost`, `127.0.0.1`, `::1`). */ readonly httpsOnlyExceptLoopback?: boolean; }; /** * Return a safe href for `` / button-as-link, or `null` when unsafe. */ declare function safeHref(raw: string | null | undefined, options?: SafeHrefOptions): string | null; /** Normalize an API/origin base to a safe `http(s)` origin+path (no trailing slash). */ declare function safeHttpBase(raw: string | null | undefined, options?: SafeHrefOptions): string | null; /** * Plain-text sanitizer + HTML encoding for UGC / third-party strings. * Dual-adapter: keep API aligned with forjd-ui core/a11y/sanitize-text * (FORJD ADR-0014 / ADR-0015). */ type SanitizeTextOptions = { readonly maxLength?: number; readonly allowNewlines?: boolean; }; /** Strip markup/controls from a display string (never trust third-party HTML). */ declare function sanitizeDisplayText(raw: string | null | undefined, options?: SanitizeTextOptions): string; /** Sanitize then HTML-escape for attribute / template-literal sinks. */ declare function encodeForHtml(raw: string | null | undefined, options?: SanitizeTextOptions): string; /** * Optional browser globals for suite chrome (search palette, cookie, bug report). * Surfaces register handlers; callers invoke without deep coupling. */ type DemlWidgets = { openSearch?: () => void; closeSearch?: () => void; openCookieSettings?: () => void; openBugReport?: () => void; }; type DemlGlobal = typeof globalThis & { DemlWidgets?: DemlWidgets; }; declare function readDemlWidgets(): DemlWidgets; declare function writeDemlWidgets(patch: DemlWidgets): DemlWidgets; /** * VikingThemeService — suite light/dark/system with persistence + OS sync. * Apply `data-theme` on ``; FOUC script should mirror read/resolve. * Equality-guarded: skips DOM writes / events when nothing changed. * Theme changes are optimistic with storage rollback on failure. */ declare class VikingThemeService { private readonly platformId; private readonly destroyRef; private readonly history; private media; private readonly onMediaChange; private readonly preferenceSignal; private readonly systemDarkSignal; /** Stored preference: light | dark | system. */ readonly preference: _angular_core.Signal; /** Resolved appearance applied to the document. */ readonly theme: _angular_core.Signal; constructor(); /** * Optimistic theme change: update UI immediately, persist to storage, roll * back preference + DOM if storage throws (quota / private mode). * Successful changes join the command-history stack (⌘Z / Undo toast). */ setPreference(preference: SuiteThemePreference, opts?: { readonly recordHistory?: boolean; }): void; /** Flip explicit light ↔ dark based on current resolved theme. */ toggleTheme(): void; /** Cycle system → light → dark → system. */ cyclePreference(): void; useSystemPreference(): void; private applyCurrent; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵprov: _angular_core.ɵɵInjectableDeclaration; } /** Fixed series palette — Role B; keep in sync with suite-tokens.css --suite-series-* */ declare const VIKING_SERIES_PRESETS: readonly ["var(--suite-series-1)", "var(--suite-series-2)", "var(--suite-series-3)", "var(--suite-series-4)", "var(--suite-series-5)", "var(--suite-series-6)", "var(--suite-series-7)", "var(--suite-series-8)"]; declare const VIKING_SERIES_DEFAULT: "var(--suite-series-1)"; type VikingSeriesPreset = (typeof VIKING_SERIES_PRESETS)[number]; /** Registers a component as a ControlValueAccessor. */ declare const provideVikingCva: (component: Type) => Provider; /** Shared ControlValueAccessor plumbing for Viking-Material form controls. */ declare abstract class VikingControl implements ControlValueAccessor { protected onChange: (value: T) => void; protected onTouched: () => void; /** Disabled state driven by Angular forms (setDisabledState). */ readonly formDisabled: _angular_core.WritableSignal; abstract writeValue(value: T): void; registerOnChange(fn: (value: T) => void): void; registerOnTouched(fn: () => void): void; setDisabledState(isDisabled: boolean): void; static ɵfac: _angular_core.ɵɵFactoryDeclaration, never>; static ɵdir: _angular_core.ɵɵDirectiveDeclaration, never, never, {}, {}, never, never, true, never>; } /** * DOM helpers for Viking web components. * HTMLElementBase is SSR-safe when the DOM constructor is unavailable. */ /** Constructor shape used by custom element classes. */ type HTMLElementBaseCtor = { new (): HTMLElement; prototype: HTMLElement; }; declare const HTMLElementBase: HTMLElementBaseCtor; /** * Framework-agnostic Viking badge Web Component. * Tag: `viking-badge` (legacy alias: `viking-badge-wc`) * * @attr tone - Semantic color: accent | secondary | success | warning | danger | info | muted * @attr size - Compact density: sm * @attr icon - Viking icon registry name (pairs with label for a11y) * @attr removable - Shows remove control; dispatches `viking-removed` * * @example * Healthy */ declare class VikingBadgeWc extends HTMLElementBase { static readonly tag = "viking-badge"; static readonly legacyTag = "viking-badge-wc"; static get observedAttributes(): string[]; private readonly shadow; constructor(); connectedCallback(): void; attributeChangedCallback(): void; private get tone(); private get size(); private get removable(); private readonly onRemove; private render; } declare const registerVikingBadgeWc: () => void; /** * Framework-agnostic Viking button Web Component. * Tag: `viking-button-wc` — for static HTML / marketing only. * Angular apps must use `viking-button` (native control; never nest this WC). * * Host is a layout shell only; the single interactive control is the inner * `