/**
 * Canonical slug rules shared by the whole system.
 *
 * Historically each surface had its own slugify regex (the admin `SlugField`
 * allowed underscores via `\w`; the page/post modals used `[a-z0-9]` only) and
 * the server stored whatever it was handed — no format check, no reserved-word
 * guard. That let a slug like `My Page!` or `admin` reach the database and break
 * URLs or shadow admin routes. This module is the single source of truth.
 */
/**
 * A valid slug is one or more lowercase alphanumeric segments joined by single
 * hyphens: no uppercase, no spaces, no leading/trailing/double hyphens, no other
 * punctuation. Matches the strict form the public URL builder expects.
 */
export declare const SLUG_PATTERN: RegExp;
/**
 * Slugs that would shadow framework/admin routes or collide with reserved
 * site-root handling. `home`/`index`/`""` intentionally resolve to the site root
 * (see `resolveDocumentUrl`) so they are allowed and handled there — these are
 * the ones that must never become a document slug.
 */
export declare const RESERVED_SLUGS: readonly string[];
/**
 * Normalize arbitrary input into a valid slug: lowercase, collapse any run of
 * non-alphanumeric characters to a single hyphen, and trim leading/trailing
 * hyphens. Returns `''` when nothing usable remains.
 */
export declare function normalizeSlug(input: string | null | undefined): string;
/** True when `slug` is already in canonical form. */
export declare function isValidSlug(slug: string): boolean;
/** True when `slug` (case-insensitively) is reserved. */
export declare function isReservedSlug(slug: string): boolean;
/**
 * Validate a document slug. Returns a human-readable error message, or `null`
 * when the slug is acceptable. An empty/absent slug is allowed here (URL
 * presence is enforced separately by the publish gate, which also accepts a
 * `path`).
 */
export declare function validateSlug(slug: string | null | undefined): string | null;
//# sourceMappingURL=slug.d.ts.map