import { type DashboardLocale } from './i18n.js';
import { type ResolvedTheme, type ThemeMode, type SkinId } from './preferences.js';
type UiListener = () => void;
declare class DashboardUiState {
    locale: DashboardLocale;
    themeMode: ThemeMode;
    resolvedTheme: ResolvedTheme;
    skin: SkinId;
    authed: boolean;
    private listeners;
    private translate;
    private mediaQuery;
    init(): void;
    t(key: string, params?: Record<string, string | number>): string;
    setLocale(locale: DashboardLocale): void;
    get theme(): string;
    setTheme(value: string): void;
    on(fn: UiListener): () => void;
    private emit;
    private applyTheme;
    private applySkin;
    private applyLocale;
}
export declare const ui: DashboardUiState;
export declare function t(key: string, params?: Record<string, string | number>): string;
export declare function escapeHtml(s: string): string;
export declare function relTime(ms: number): string;
export declare function botOrbStyle(name: string): string;
/** 查 bot 头像 URL：larkAppId 是唯一稳定键，在场就只认它——绝不在 appId 落空时
 *  串到 botName 兜底，否则两个同名 bot 会互相借用头像（按名查 last-writer-wins）。
 *  只有完全没有 appId 的渲染点才退回按名查。 */
export declare function botAvatarUrlFor(name?: string, larkAppId?: string): string | undefined;
export interface BotAvatarOpts {
    /** 展示名 —— 决定回退渐变球的色相，也用于按名查头像。 */
    name?: string;
    /** 主查询键。 */
    larkAppId?: string;
    /** 显式头像 URL（调用方已拿到时传，省一次 map 查询、首屏即出图）。 */
    avatarUrl?: string;
    /** 尺寸：md=42px（默认），sm=24px。 */
    size?: 'sm' | 'md';
    /** 右下角状态点；不传则不渲染圆点。 */
    dot?: 'ok' | 'busy' | 'warn' | 'off';
}
/** 全站统一的 bot 头像渲染：有头像出 <img>（盖在渐变球上、加载失败自动回退到
 *  渐变球），没有就直接渲染渐变球。避免"先球后头像"闪烁靠 CSS 的 .orb-has-img。 */
export declare function botAvatarHtml(opts: BotAvatarOpts): string;
/** 查飞书群头像 URL（按 chatId）。 */
export declare function chatAvatarUrlFor(chatId?: string): string | undefined;
export interface ChatAvatarOpts {
    chatId?: string;
    /** 群名 —— 决定回退占位的色相。 */
    name?: string;
    /** 显式群头像 URL（调用方已有时传，省一次 map 查询）。 */
    avatarUrl?: string;
    /** 尺寸：md=42px（默认），sm=24px。 */
    size?: 'sm' | 'md';
}
/** 飞书群头像渲染：圆角方形（.orb-square）以区别于圆形的 bot 头像；复用同一套
 *  占位 / 淡入 / 加载失败回退机制（.orb-has-img / .orb-img）。 */
export declare function chatAvatarHtml(opts: ChatAvatarOpts): string;
export declare function loadNameMaps(): Promise<void>;
/** 按 larkAppId 查注册表友好名（含 localStorage 回灌的缓存）；查不到返回 undefined。 */
export declare function botNameForAppId(appId?: string): string | undefined;
/** 会话所属 bot 的显示名：注册表友好名 → 会话自带 botName（非 id 时）→ id。 */
export declare function botDisplayName(s: Record<string, any>): string;
/** 会话所在群聊的标题；单聊或群列表里查不到时返回 null（由调用方回退）。 */
export declare function chatDisplayTitle(s: Record<string, any>): string | null;
/** 话题首条消息常以 "@bot " 开头（群里要 @ 才能触发）——展示时剥掉开头的
 *  连续 mention，只留真正的消息内容；剥空了（纯 @ 消息）就保留原文。 */
export declare function stripMentionPrefix(title: unknown): string;
/** 全站统一的页面级 loading 占位（慢接口在途时先渲染这个，避免白屏假死）。 */
export declare function loadingHtml(label?: string): string;
/** 会话当前是否卡在等人，以及等什么（全局 strip 和工作台共用同一判定）。 */
export declare function attentionReason(s: Record<string, any>): string | null;
export declare function attentionWaitSince(s: Record<string, any>): number;
export {};
//# sourceMappingURL=ui.d.ts.map