type VisibilityRole = "admin" | "designer" | "author";
type BlockManifestUi = {
    showSlugPreview?: boolean;
    showCharCount?: number | {
        max: number;
    };
    visibleWhen?: {
        field: string;
        equals?: unknown;
        notEquals?: unknown;
        oneOf?: unknown[];
        notIn?: unknown[];
    };
};
type BaseBlockManifestField = {
    id: string;
    label: string;
    description?: string;
    visibleRoles?: VisibilityRole[];
    defaultValue?: unknown;
    required: boolean;
    ui?: BlockManifestUi;
};
type TextBlockManifestField = BaseBlockManifestField & {
    type: "text";
    multiline: boolean;
    maxLength?: number;
};
type SlugBlockManifestField = BaseBlockManifestField & {
    type: "slug";
    sourceFieldId?: string;
    statusFieldId?: string;
    maxLength?: number;
};
type SelectBlockManifestField = BaseBlockManifestField & {
    type: "select";
    options: Array<{
        value: string;
        label: string;
        description?: string;
        icon?: string;
    }>;
    multiple: boolean;
};
type DateTimeBlockManifestField = BaseBlockManifestField & {
    type: "datetime";
};
type BlockManifestField = TextBlockManifestField | SlugBlockManifestField | SelectBlockManifestField | DateTimeBlockManifestField;
type BlockManifestSlot = {
    id: string;
    label: string;
    allowedKinds: string[];
    min: number;
    max?: number;
    help?: string;
    visibleRoles?: VisibilityRole[];
};
type BlockManifest = {
    name: string;
    version: string;
    title: string;
    description: string;
    component: string;
    fields: BlockManifestField[];
    slots: BlockManifestSlot[];
};
export type RouteMetadataFieldId = "draftTitle" | "draftSlug" | "draftStatus" | "scheduledPublishAt" | "draftMetaTitle" | "draftMetaDescription" | "ogImageId";
export declare const ROUTE_METADATA_MANIFEST: BlockManifest;
export declare const METADATA_WORKFLOW_FIELDS: {
    readonly title: "draftTitle";
    readonly slug: "draftSlug";
    readonly status: "draftStatus";
    readonly publishAt: "scheduledPublishAt";
};
export declare const ROUTE_METADATA_MANAGED_FIELDS_BY_TYPE: {
    readonly event: readonly ["draftTitle", "draftSlug", "draftStatus", "scheduledPublishAt"];
    readonly course: readonly ["draftTitle", "draftSlug", "draftStatus", "scheduledPublishAt"];
    readonly product: readonly ["draftTitle", "draftSlug", "draftStatus", "scheduledPublishAt"];
    readonly "product-category": readonly ["draftTitle", "draftSlug", "draftStatus", "scheduledPublishAt"];
    readonly "team-member": readonly ["draftTitle", "draftSlug", "draftStatus", "scheduledPublishAt"];
};
export declare function getManagedRouteMetadataFieldIdsForType(typeKey: string | null | undefined): ReadonlyArray<RouteMetadataFieldId>;
export declare function isRouteMetadataFieldEditableForType(typeKey: string | null | undefined, fieldId: string): boolean;
export declare function getEditableRouteMetadataFieldIdsForType(typeKey: string | null | undefined): ReadonlyArray<RouteMetadataFieldId>;
export declare function getRouteMetadataManifestForType(typeKey: string | null | undefined): BlockManifest;
/**
 * Remove the legacy route title editor from a route metadata manifest.
 *
 * Entry titles are now derived from entry data (single source of truth) and the route title is a denormalized copy.
 * We still keep `draftTitle` in the underlying manifest for page creation flows, but we omit it from entry editors.
 */
export declare function omitRouteTitleFieldFromManifest(manifest: BlockManifest): BlockManifest;
export declare function sanitizeSlug(value: string): string;
export {};
