/**
 * 媒体嵌入命令组。
 * 插入 Penna 扩展语法 `!video[label](url)`、`!audio`、`!iframe`。
 */
import type { EditorView } from "@codemirror/view";
import { FormDialog, type FormFieldDef } from "../../../editor/dialog/FormDialog.js";
import { Command, type CommandContext } from "../../../editor/commands/Command";
import type { DialogCapableCommand } from "../../../editor/commands/DialogCommand";
import type { DialogType } from "../../../editor/commands/dialogTypes";
/** `media` 弹窗提交结果。 */
export interface MediaDialogResult {
    kind: "video" | "audio" | "iframe";
    label: string;
    url: string;
    poster?: string;
    maxWidth?: string;
    maxHeight?: string;
}
/**
 * 将媒体数据转为 Penna 媒体 Markdown。
 * @param data - 已校验的媒体表单数据
 * @returns 可插入编辑器的媒体语法
 */
export declare function mediaMarkdown(data: MediaDialogResult): string;
declare class MediaFormDialog extends FormDialog<MediaDialogResult> {
    private readonly kind;
    /**
     * 创建固定媒体类型的表单。
     * @param kind - 表单生成字段和输出语法对应的媒体类型
     */
    constructor(kind: MediaDialogResult["kind"]);
    /** 返回当前媒体类型对应的弹窗标题。 */
    get title(): string;
    /** 根据媒体类型返回所需的表单字段。 */
    get fields(): FormFieldDef[];
    /**
     * 将媒体表单转换为插入数据。
     * @param raw - 表单提交的字段值
     * @returns URL 为空时返回 null
     */
    toResult(raw: Record<string, string | boolean>): MediaDialogResult | null;
}
/** 媒体命令基类，`kind` 在构造时固定（video / audio / iframe）。 */
export declare class MediaCommand implements Command, DialogCapableCommand {
    private readonly kind;
    readonly dialogType: DialogType;
    /**
     * 创建固定媒体类型的命令。
     * @param kind - 打开表单时预选的媒体类型
     */
    constructor(kind: MediaDialogResult["kind"]);
    renderDialog: (host: HTMLElement, props: Record<string, unknown>, callbacks: Parameters<MediaFormDialog["render"]>[2]) => () => void;
    /**
     * 打开媒体表单并用提交数据替换当前选区。
     * @param view - 要修改的 CodeMirror 编辑器实例
     * @param _p - 未使用的命令参数
     * @param ctx - 提供事件总线的命令上下文
     * @returns 用户取消、URL 为空或缺少事件总线时返回 false
     */
    execute(view: EditorView, _p: unknown, ctx: CommandContext): Promise<boolean>;
}
/** `video` — 插入视频嵌入 */
export declare const videoCommand: MediaCommand;
/** `audio` — 插入音频嵌入 */
export declare const audioCommand: MediaCommand;
/** `iframe` — 插入 iframe 嵌入页 */
export declare const iframeCommand: MediaCommand;
export {};
//# sourceMappingURL=MediaCommand.d.ts.map