@asteroidcms/core-utils 0.1.5 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/provider/context.ts","../src/apollo/errorLink.ts","../src/apollo/createApolloClient.ts","../src/provider/AsteroidCMSProvider.tsx","../src/hooks/useCmsContent.tsx","../src/hooks/useCmsMutate.tsx","../src/utils/cmsImage.ts","../src/components/richTextParser.ts","../src/components/RichTextContent.tsx","../src/utils/extractHeadings.ts","../src/hooks/useTableOfContents.tsx"],"names":["createContext","useContext","ErrorLink","CombinedGraphQLErrors","CombinedProtocolErrors","SetContextLink","HttpLink","ApolloClient","ApolloLink","InMemoryCache","useMemo","jsx","ApolloProvider","alias","gql","useQuery","useMutation","end","next","escapeHtml","hljs","i","j","label","useRef","useState","useEffect","Fragment","createElement","createPortal"],"mappings":"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M,eAAA,GAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAA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","file":"client.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { ResolvedAsteroidCMSConfig } from \"./types\";\n\nexport const AsteroidCMSContext = createContext<ResolvedAsteroidCMSConfig | null>(null);\n\nexport function useAsteroidCMSConfig(): ResolvedAsteroidCMSConfig {\n const ctx = useContext(AsteroidCMSContext);\n if (!ctx) {\n throw new Error(\n \"useAsteroidCMSConfig must be used inside <AsteroidCMSProvider>. \" +\n \"Wrap your app with <AsteroidCMSProvider cmsUrl=... apiKey=... />.\",\n );\n }\n return ctx;\n}\n","import { CombinedGraphQLErrors, CombinedProtocolErrors } from \"@apollo/client\";\nimport { ErrorLink } from \"@apollo/client/link/error\";\n\ntype OnError = (error: unknown) => void;\n\n/**\n * Lightweight error link. Forwards every error to the consumer-supplied\n * `onError` handler (configured on the provider). No toasts, no auth, no\n * token refresh — the package is auth-key only.\n */\nexport function createErrorLink(onError?: OnError) {\n return new ErrorLink(({ error }) => {\n if (!onError) return;\n if (CombinedGraphQLErrors.is(error)) {\n error.errors.forEach((e) => onError(e));\n } else if (CombinedProtocolErrors.is(error)) {\n error.errors.forEach((e) => onError(e));\n } else {\n onError(error);\n }\n });\n}\n","import {\n ApolloClient,\n ApolloLink,\n HttpLink,\n InMemoryCache,\n} from \"@apollo/client\";\nimport { SetContextLink } from \"@apollo/client/link/context\";\nimport { createErrorLink } from \"./errorLink\";\nimport type { AsteroidCMSConfig, ResolvedAsteroidCMSConfig } from \"../provider/types\";\n\ndeclare module \"@apollo/client\" {\n namespace ApolloClient.DeclareDefaultOptions {\n interface WatchQuery {\n errorPolicy: \"all\";\n returnPartialData: false;\n }\n interface Query {\n errorPolicy: \"all\";\n }\n interface Mutate {\n errorPolicy: \"none\";\n }\n }\n}\n\nconst trimTrailingSlash = (s: string) => s.replace(/\\/+$/, \"\");\nconst ensureLeadingSlash = (s: string) => (s.startsWith(\"/\") ? s : `/${s}`);\n\nexport function resolveConfig(config: AsteroidCMSConfig): ResolvedAsteroidCMSConfig {\n if (!config.cmsUrl) throw new Error(\"AsteroidCMSProvider: `cmsUrl` is required.\");\n if (!config.apiKey) throw new Error(\"AsteroidCMSProvider: `apiKey` is required.\");\n\n return {\n cmsUrl: trimTrailingSlash(config.cmsUrl),\n apiKey: config.apiKey,\n graphqlPath: ensureLeadingSlash(config.graphqlPath ?? \"/graphql\"),\n mediaPath: ensureLeadingSlash(config.mediaPath ?? \"/media/canonical\"),\n headers: config.headers ?? {},\n onError: config.onError,\n };\n}\n\nexport function createApolloClient(config: AsteroidCMSConfig): ApolloClient {\n if (config.client) return config.client;\n\n const resolved = resolveConfig(config);\n const uri = `${resolved.cmsUrl}${resolved.graphqlPath}`;\n\n const authLink = new SetContextLink((_op, prevContext) => {\n const prevHeaders = (prevContext as { headers?: Record<string, string> }).headers ?? {};\n return {\n ...prevContext,\n headers: {\n ...prevHeaders,\n \"x-api-key\": resolved.apiKey,\n ...resolved.headers,\n },\n };\n });\n\n const httpLink = new HttpLink({ uri });\n\n return new ApolloClient({\n link: ApolloLink.from([createErrorLink(resolved.onError), authLink, httpLink]),\n cache: new InMemoryCache(config.cacheConfig),\n defaultOptions: {\n watchQuery: {\n fetchPolicy: \"cache-and-network\",\n errorPolicy: \"all\",\n returnPartialData: false,\n },\n query: { fetchPolicy: \"network-only\", errorPolicy: \"all\" },\n mutate: { errorPolicy: \"none\" },\n },\n ...config.apolloOptions,\n });\n}\n","import { useMemo, type PropsWithChildren } from \"react\";\nimport { ApolloProvider } from \"@apollo/client/react\";\nimport { AsteroidCMSContext } from \"./context\";\nimport { createApolloClient, resolveConfig } from \"../apollo/createApolloClient\";\nimport type { AsteroidCMSConfig } from \"./types\";\n\nexport type AsteroidCMSProviderProps = PropsWithChildren<AsteroidCMSConfig>;\n\n/**\n * Root provider for `@asteroidcms/core-utils`.\n *\n * Wrap your app once at the top level:\n *\n * ```tsx\n * <AsteroidCMSProvider cmsUrl=\"https://cms.example.com\" apiKey=\"...\">\n * <App />\n * </AsteroidCMSProvider>\n * ```\n *\n * Everything below — `useCmsContent`, `useCmsMutate`, `useCmsImage`,\n * `<RichTextContent>` — picks up `cmsUrl` and `apiKey` from this provider.\n */\nexport function AsteroidCMSProvider({ children, ...config }: AsteroidCMSProviderProps) {\n const resolved = useMemo(() => resolveConfig(config), [\n config.cmsUrl,\n config.apiKey,\n config.graphqlPath,\n config.mediaPath,\n config.headers,\n config.onError,\n ]);\n\n const client = useMemo(\n () => createApolloClient(config),\n // The client is intentionally rebuilt only when the identity-shaping props change.\n [\n config.client,\n resolved.cmsUrl,\n resolved.apiKey,\n resolved.graphqlPath,\n config.cacheConfig,\n config.apolloOptions,\n ],\n );\n\n return (\n <AsteroidCMSContext.Provider value={resolved}>\n <ApolloProvider client={client}>{children}</ApolloProvider>\n </AsteroidCMSContext.Provider>\n );\n}\n\nexport default AsteroidCMSProvider;\n","import { type DocumentNode, gql } from \"@apollo/client\";\nimport { useQuery } from \"@apollo/client/react\";\n\ntype FieldSelector = string | { field: string; as?: string };\n\ntype ReferenceExpansion = {\n field: string;\n as?: string;\n single?: boolean;\n select?: readonly (FieldSelector | ReferenceExpansion)[];\n};\n\ntype ContentStatus = \"DRAFT\" | \"PUBLISHED\" | \"ARCHIVED\";\n\ntype CmsSearchCondition = {\n field: string;\n value: string;\n mode?: string;\n};\n\nexport type UseCmsContentOptions = {\n schema_slug: string;\n entrySlug?: string;\n select?: readonly (FieldSelector | ReferenceExpansion)[];\n fullData?: boolean;\n limit?: number;\n offset?: number;\n status?: ContentStatus;\n filter?: Record<string, string | number | boolean | null>;\n search?: CmsSearchCondition[];\n variables?: Record<string, any>;\n};\n\n/**\n * React hook for querying content from Asteroid CMS via a flexible GraphQL API.\n *\n * Supports single-entry fetches (`entrySlug`) and paginated/filtered lists,\n * with arbitrarily nested reference expansion and field aliasing.\n */\nexport function useCmsContent<T = unknown>({\n schema_slug,\n entrySlug,\n select = [],\n fullData = false,\n limit,\n offset,\n status = \"PUBLISHED\",\n filter,\n search,\n variables = {},\n}: UseCmsContentOptions) {\n const isSingle = !!entrySlug;\n\n const buildSelection = (\n items: readonly (FieldSelector | ReferenceExpansion)[] = [],\n ): string => {\n const lines: string[] = [];\n\n items.forEach((item) => {\n if (typeof item === \"string\") {\n lines.push(`${item}: dataField(slug: \"${item}\")`);\n } else if (\"field\" in item && typeof item.field === \"string\") {\n if (!(\"select\" in item)) {\n const alias = item.as || item.field;\n lines.push(`${alias}: dataField(slug: \"${item.field}\")`);\n return;\n }\n\n const alias = item.as || item.field;\n const resolver = item.single\n ? \"expandedReferenceObject\"\n : \"expandedReference\";\n\n const subSelection = item.select?.length\n ? buildSelection(item.select)\n : \"data { ... }\";\n\n lines.push(`\n ${alias}: ${resolver}(slug: \"${item.field}\") {\n ${subSelection}\n }\n `);\n }\n });\n\n return lines.join(\"\\n \").trim();\n };\n\n const selectionParts: string[] = [];\n if (fullData) selectionParts.push(\"data\");\n if (select.length > 0) {\n const userSelection = buildSelection(select);\n if (userSelection) selectionParts.push(userSelection);\n }\n const selection = selectionParts.join(\"\\n \").trim() || \"id\";\n\n const queryVariables: Record<string, any> = {\n schema_slug,\n ...(entrySlug && { slug: entrySlug }),\n ...variables,\n };\n const fieldArgParts: string[] = [\"schema_slug: $schema_slug\"];\n\n if (!isSingle) {\n if (typeof limit === \"number\" && limit >= 0) {\n fieldArgParts.push(\"limit: $limit\");\n queryVariables.limit = limit;\n }\n if (typeof offset === \"number\" && offset >= 0) {\n fieldArgParts.push(\"offset: $offset\");\n queryVariables.offset = offset;\n }\n if (status) {\n fieldArgParts.push(\"status: $status\");\n queryVariables.status = status;\n }\n\n const hasSearch = Array.isArray(search) && search.length > 0;\n const hasFilter =\n filter && typeof filter === \"object\" && Object.keys(filter).length > 0;\n\n if (hasSearch || hasFilter) {\n const mergedFilter: Record<string, unknown> = hasFilter ? { ...filter } : {};\n if (hasSearch) {\n for (const condition of search!) {\n mergedFilter[condition.field] = {\n regex: true,\n value: condition.value,\n mode: condition.mode ?? \"i\",\n };\n }\n }\n fieldArgParts.push(\"data: $filter\");\n queryVariables.filter = mergedFilter;\n }\n }\n\n const varDecls: string[] = [\"$schema_slug: String!\"];\n if (\"limit\" in queryVariables) varDecls.push(\"$limit: Float\");\n if (\"offset\" in queryVariables) varDecls.push(\"$offset: Float\");\n if (\"status\" in queryVariables) varDecls.push(\"$status: ContentStatus\");\n if (\"filter\" in queryVariables) varDecls.push(\"$filter: JSONObject\");\n\n const varBlock = varDecls.length > 0 ? `(\\n ${varDecls.join(\"\\n \")}\\n)` : \"\";\n const contentFieldArgs = fieldArgParts.join(\", \");\n const queryStr = isSingle\n ? `\n query Get${schema_slug}Entry($schema_slug: String!, $slug: String!) {\n entry: contentEntry(schema_slug: $schema_slug, slug: $slug) {\n ${selection}\n }\n }\n `\n : `\n query Get${schema_slug}Entries${varBlock} {\n entries: contentEntries(${contentFieldArgs}) {\n ${selection}\n }\n }\n `;\n\n const GET_CONTENT = gql(queryStr) as DocumentNode;\n\n const { loading, error, data, ...rest } = useQuery(GET_CONTENT, {\n variables: queryVariables,\n skip: !schema_slug || (isSingle && !entrySlug),\n });\n\n const typed = data as { entry?: unknown; entries?: unknown } | undefined;\n const result = isSingle ? typed?.entry : typed?.entries;\n\n return {\n loading,\n error,\n data: result as T | undefined,\n ...rest,\n };\n}\n","import { gql } from \"@apollo/client\";\nimport { useMutation } from \"@apollo/client/react\";\n\ntype FieldSelector =\n | string\n | {\n field: string;\n as?: string;\n single?: boolean;\n select?: readonly (FieldSelector | ReferenceExpansion)[];\n };\n\ntype ReferenceExpansion = {\n field: string;\n as?: string;\n single?: boolean;\n select?: readonly (FieldSelector | ReferenceExpansion)[];\n};\n\ntype MutationType = \"create\" | \"update\" | \"delete\";\n\nexport type UseCmsMutateOptions = {\n schema_slug: string;\n entrySlug?: string;\n select?: readonly (FieldSelector | ReferenceExpansion)[];\n fullData?: boolean;\n mutationType?: MutationType;\n entryId?: string;\n variables?: Record<string, any>;\n};\n\n/**\n * React hook for mutating content in Asteroid CMS (`create` / `update` / `delete`).\n * Uses the same selection syntax as `useCmsContent`.\n */\nexport function useCmsMutate<TData = unknown>({\n schema_slug,\n select = [],\n fullData = false,\n mutationType = \"create\",\n entryId,\n variables: inputVariables = {},\n}: UseCmsMutateOptions) {\n const buildSelection = (\n items: readonly (FieldSelector | ReferenceExpansion)[] = [],\n ): string => {\n const lines: string[] = [];\n\n for (const item of items) {\n if (typeof item === \"string\") {\n lines.push(`${item}: dataField(slug: \"${item}\")`);\n continue;\n }\n\n const { field, as, single, select: subSelect } = item;\n const alias = as || field;\n\n if (!subSelect?.length) {\n lines.push(`${alias}: dataField(slug: \"${field}\")`);\n continue;\n }\n\n const resolver = single ? \"expandedReferenceObject\" : \"expandedReference\";\n const sub = buildSelection(subSelect) || \"id slug\";\n\n lines.push(`\n ${alias}: ${resolver}(slug: \"${field}\") {\n id\n slug\n ${sub}\n }\n `);\n }\n\n return lines.join(\"\\n \").trim();\n };\n\n const userSelection = buildSelection(select);\n let selection = fullData ? \"data\" : \"\";\n\n if (userSelection) {\n selection = selection ? `${selection}\\n ${userSelection}` : userSelection;\n }\n\n if (!selection) {\n selection = \"id slug status version created_at updated_at\";\n }\n\n const operation = mutationType;\n const mutationName = `${operation}ContentEntry`;\n\n const varDecls: string[] = [\"$schema_slug: String!\"];\n const callArgs: string[] = [\"schema_slug: $schema_slug\"];\n\n if (operation === \"create\" || operation === \"update\") {\n varDecls.unshift(\"$data: JSONObject!\");\n callArgs.unshift(\"data: $data\");\n }\n if (operation === \"update\" || operation === \"delete\") {\n varDecls.push(\"$id: ID!\");\n callArgs.push(\"id: $id\");\n }\n\n const returnFields = selection.includes(\"data\")\n ? selection\n : `${selection}\\n data`;\n\n const MUTATION = gql`\n mutation ${mutationName}(${varDecls.join(\", \")}) {\n result: ${mutationName}(${callArgs.join(\", \")}) {\n id\n status\n version\n created_at\n updated_at\n schema {\n id\n slug\n }\n ${returnFields}\n }\n }\n `;\n\n const mutationVariables = {\n schema_slug,\n ...(operation === \"update\" || operation === \"delete\" ? { id: entryId } : {}),\n ...inputVariables,\n };\n\n if ((operation === \"update\" || operation === \"delete\") && !entryId) {\n console.warn(`useCmsMutate: entryId is required for ${operation}`);\n }\n\n const [mutateFn, mutationResult] = useMutation(MUTATION, {\n variables: mutationVariables,\n });\n\n const resultData = (mutationResult.data as { result?: TData } | null | undefined)?.result;\n\n return {\n mutate: mutateFn,\n ...mutationResult,\n data: resultData,\n } as const;\n}\n","import { useAsteroidCMSConfig } from \"../provider/context\";\n\n/**\n * Build a canonical media URL from an asset id. Pass `cmsUrl` explicitly when\n * calling outside of React (e.g. SSR loaders, scripts). Inside components,\n * prefer `useCmsImage()`.\n */\nexport function cmsImage(\n id: string | undefined,\n options: { cmsUrl: string; mediaPath?: string },\n): string {\n if (!id) return \"\";\n const base = options.cmsUrl.replace(/\\/+$/, \"\");\n const path = (options.mediaPath ?? \"/media/canonical\").replace(/^\\/?/, \"/\");\n return `${base}${path}/${id}`;\n}\n\n/** Hook variant that pulls `cmsUrl`/`mediaPath` from the provider. */\nexport function useCmsImage(): (id?: string) => string {\n const { cmsUrl, mediaPath } = useAsteroidCMSConfig();\n return (id?: string) => cmsImage(id, { cmsUrl, mediaPath });\n}\n","/**\n * Portable rich-text parser for CMS content.\n *\n * Zero runtime dependencies. Safe to copy into any consuming frontend.\n *\n * Pipeline:\n * 1. Detect & migrate legacy \"markdown-in-divs\" content to clean semantic HTML.\n * 2. Walk the HTML through a tag/attribute allowlist (strips <script>, event\n * handlers, javascript: URLs, unknown tags).\n * 3. Merge per-tag and per-variant classes from `options.classMap`.\n *\n * Idempotent: parseRichText(parseRichText(x, opts), opts) === parseRichText(x, opts).\n */\n\nexport type RichTextClassKey =\n | \"p\"\n | \"br\"\n | \"hr\"\n | \"h1\"\n | \"h2\"\n | \"h3\"\n | \"h4\"\n | \"h5\"\n | \"h6\"\n | \"ul\"\n | \"ol\"\n | \"li\"\n | \"blockquote\"\n | \"pre\"\n | \"code\"\n | \"inlineCode\"\n | \"a\"\n | \"strong\"\n | \"em\"\n | \"u\"\n | \"s\"\n | \"kbd\"\n | \"table\"\n | \"tableWrapper\"\n | \"thead\"\n | \"tbody\"\n | \"tr\"\n | \"th\"\n | \"td\"\n | \"figure\"\n | \"figcaption\"\n | \"img\"\n | \"span\"\n | \"callout\"\n | \"calloutTitle\"\n | \"collapsible\"\n | \"collapsibleTitle\";\n\nexport type RichTextClassMap = Partial<Record<RichTextClassKey, string>> & {\n /** Variant overrides keyed as `${matchKey}:${variant}`, e.g. \"callout:warning\". */\n variants?: Record<string, string>;\n};\n\nexport interface ParseRichTextOptions {\n classMap?: RichTextClassMap;\n /** Tag allowlist override. Defaults to a safe semantic set. */\n allowlist?: ReadonlyArray<string>;\n /**\n * When `true` (default), inject slugified `id` attributes on `<h1>`–`<h6>`\n * tags that don't already have one. Lets ToC anchors resolve from the\n * server-rendered markup without a client-side mutation step.\n */\n autoHeadingIds?: boolean;\n}\n\nconst DEFAULT_ALLOWLIST: ReadonlyArray<string> = [\n \"p\",\n \"br\",\n \"hr\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"ul\",\n \"ol\",\n \"li\",\n \"blockquote\",\n \"pre\",\n \"code\",\n \"kbd\",\n \"a\",\n \"strong\",\n \"em\",\n \"u\",\n \"b\",\n \"i\",\n \"s\",\n \"strike\",\n \"del\",\n \"mark\",\n \"small\",\n \"sub\",\n \"sup\",\n \"table\",\n \"thead\",\n \"tbody\",\n \"tfoot\",\n \"tr\",\n \"th\",\n \"td\",\n \"colgroup\",\n \"col\",\n \"figure\",\n \"figcaption\",\n \"img\",\n \"aside\",\n \"section\",\n \"article\",\n \"div\",\n \"span\",\n \"details\",\n \"summary\",\n];\n\n/** Per-tag attribute allowlist. Global attrs from GLOBAL_ALLOWED_ATTRS apply to all. */\nconst ALLOWED_ATTRS: Record<string, ReadonlyArray<string>> = {\n a: [\"href\", \"title\", \"target\", \"rel\"],\n img: [\"src\", \"alt\", \"title\", \"width\", \"height\", \"loading\"],\n th: [\"colspan\", \"rowspan\", \"scope\"],\n td: [\"colspan\", \"rowspan\"],\n col: [\"span\", \"width\"],\n colgroup: [\"span\"],\n table: [\"border\", \"cellpadding\", \"cellspacing\"],\n span: [\"style\"],\n details: [\"open\"],\n};\n\n/**\n * Tag → allowlisted CSS property names. Inline `style` is otherwise blocked\n * by the sanitizer; properties listed here are extracted and re-emitted with\n * value-level validation.\n */\nconst ALLOWED_STYLE_PROPS: Record<string, ReadonlyArray<string>> = {\n span: [\"font-size\"],\n};\n\n/** Strict per-property value validators for inline `style` declarations. */\nconst STYLE_VALUE_VALIDATORS: Record<string, (value: string) => boolean> = {\n \"font-size\": (v) => /^\\d{1,3}(?:\\.\\d+)?(?:px|rem|em|%)$/.test(v.trim()),\n};\n\nfunction sanitizeStyle(tag: string, style: string): string {\n const allowed = ALLOWED_STYLE_PROPS[tag];\n if (!allowed || !style) return \"\";\n const out: string[] = [];\n for (const decl of style.split(\";\")) {\n const idx = decl.indexOf(\":\");\n if (idx === -1) continue;\n const name = decl.slice(0, idx).trim().toLowerCase();\n const value = decl.slice(idx + 1).trim();\n if (!allowed.includes(name)) continue;\n const validate = STYLE_VALUE_VALIDATORS[name];\n if (!validate || !validate(value)) continue;\n out.push(`${name}: ${value}`);\n }\n return out.join(\"; \");\n}\n\nconst GLOBAL_ALLOWED_ATTRS: ReadonlyArray<string> = [\n \"id\",\n \"class\",\n \"lang\",\n \"dir\",\n \"data-variant\",\n \"data-callout\",\n \"data-title\",\n \"data-callout-title\",\n \"data-language\",\n \"data-filename\",\n \"data-icon\",\n];\n\nconst URL_ATTRS = new Set([\"href\", \"src\"]);\n\n/* -------------------------------------------------------------------------- */\n/* Public API */\n/* -------------------------------------------------------------------------- */\n\nexport function parseRichText(\n html: string,\n options: ParseRichTextOptions = {},\n): string {\n if (!html || typeof html !== \"string\") return \"\";\n\n let working = isLegacyFormat(html) ? migrateLegacyToHtml(html) : html;\n working = removeEmptyParagraphs(working);\n working = upgradeStandaloneImages(working);\n working = upgradeAuthoredBlockquotes(working);\n working = flattenTableCellParagraphs(working);\n working = sanitizeAndStyle(working, options);\n if (options.autoHeadingIds !== false) {\n working = injectHeadingIds(working);\n }\n return working;\n}\n\n/**\n * Add a slugified `id` to each `<h1>`–`<h6>` that doesn't already have one.\n * Pure string transform; safe to run as a post-pass after sanitization.\n */\nfunction injectHeadingIds(html: string): string {\n const used = new Map<string, number>();\n // First, reserve existing IDs so generated slugs don't collide with them.\n const existingRe = /<h[1-6]\\b[^>]*\\bid\\s*=\\s*(\"([^\"]*)\"|'([^']*)'|(\\S+))/gi;\n let em: RegExpExecArray | null;\n while ((em = existingRe.exec(html)) !== null) {\n const id = em[2] ?? em[3] ?? em[4] ?? \"\";\n if (id) used.set(id, (used.get(id) ?? 0) + 1);\n }\n return html.replace(\n /<(h[1-6])\\b([^>]*)>([\\s\\S]*?)<\\/\\1>/gi,\n (full, tag: string, attrs: string, inner: string) => {\n if (/\\bid\\s*=/i.test(attrs)) return full;\n const text = inner\n .replace(/<[^>]+>/g, \" \")\n .replace(/&nbsp;/g, \" \")\n .replace(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/\\s+/g, \" \")\n .trim();\n if (!text) return full;\n const base = slugifyHeading(text) || tag;\n const n = used.get(base) ?? 0;\n used.set(base, n + 1);\n const id = n === 0 ? base : `${base}-${n}`;\n return `<${tag}${attrs} id=\"${id}\">${inner}</${tag}>`;\n },\n );\n}\n\nfunction slugifyHeading(text: string): string {\n return text\n .normalize(\"NFKD\")\n .replace(/[̀-ͯ]/g, \"\")\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\n/**\n * Tiptap stores table-cell content as `<p>` blocks (`<td><p>x</p></td>`),\n * which produces unwanted vertical margin and an extra block element when\n * consumers style table cells. Unwrap the paragraphs so cells hold inline\n * content directly. Multiple `<p>` siblings inside the same cell are joined\n * with `<br />` so line breaks survive.\n */\nfunction flattenTableCellParagraphs(html: string): string {\n return html.replace(\n /<(th|td)\\b([^>]*)>([\\s\\S]*?)<\\/\\1>/gi,\n (_full, tag: string, attrs: string, inner: string) => {\n let flat = inner;\n // Drop opening <p ...> tags.\n flat = flat.replace(/<p\\b[^>]*>/gi, \"\");\n // Replace closing </p> followed by more content with a <br/>, drop trailing ones.\n flat = flat.replace(/<\\/p>(\\s*)(?=\\S)/gi, \"<br />$1\");\n flat = flat.replace(/<\\/p>\\s*$/i, \"\");\n return `<${tag}${attrs}>${flat.trim()}</${tag}>`;\n },\n );\n}\n\n/**\n * Strips `<p>` elements that contain nothing but whitespace, `&nbsp;`, or a\n * single `<br>`. Editor placeholders and stray blank lines in stored content\n * disappear without touching paragraphs that hold real content.\n */\nexport function removeEmptyParagraphs(html: string): string {\n return html.replace(/<p\\b[^>]*>(?:\\s|&nbsp;|<br\\s*\\/?>)*<\\/p>/gi, \"\");\n}\n\n/* -------------------------------------------------------------------------- */\n/* Figure transforms (run on already-HTML content, before sanitize) */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Wraps a standalone `<p><img/></p>` in `<figure data-variant=\"image\">` with a\n * `<figcaption>` derived from the image's title or alt. Images already nested\n * inside a `<figure>` are left untouched.\n */\nfunction upgradeStandaloneImages(html: string): string {\n return html.replace(\n /<p\\b[^>]*>\\s*(<img\\b[^>]*?>)\\s*<\\/p>/gi,\n (_full, img: string) => {\n const altMatch = img.match(/\\balt\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/i);\n const titleMatch = img.match(/\\btitle\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/i);\n const alt = altMatch ? (altMatch[1] ?? altMatch[2] ?? \"\") : \"\";\n const title = titleMatch ? (titleMatch[1] ?? titleMatch[2] ?? \"\") : \"\";\n const caption = title || alt;\n const captionHtml = caption\n ? `<figcaption data-variant=\"image\">${escapeHtml(caption)}</figcaption>`\n : \"\";\n return `<figure data-variant=\"image\">${img}${captionHtml}</figure>`;\n },\n );\n}\n\n/**\n * Injects decorative curly-quote spans inside the first and last paragraph\n * of pullquote body HTML so they flow inline with the quote text instead of\n * appearing on their own lines as siblings of `<p>` blocks.\n */\nfunction injectQuoteSpans(inner: string): string {\n const trimmed = inner.trim();\n if (!trimmed) return trimmed;\n\n const openSpan = `<span data-variant=\"quote-open\">“</span>`;\n const closeSpan = `<span data-variant=\"quote-close\">”</span>`;\n\n let result = trimmed.replace(\n /^(\\s*<p\\b[^>]*>)/,\n (_m, tag) => `${tag}${openSpan}`,\n );\n if (result === trimmed) {\n // No leading <p>; just prepend the span as a sibling.\n result = `${openSpan}${result}`;\n }\n\n const replaced = result.replace(\n /(<\\/p>\\s*)$/,\n (_m, tag) => `${closeSpan}${tag}`,\n );\n if (replaced === result) {\n result = `${result}${closeSpan}`;\n } else {\n result = replaced;\n }\n\n return result;\n}\n\n/**\n * Detects blockquotes whose last paragraph is an attribution line (`— Name`,\n * `–- Name`, or `-- Name`) and rewrites them as a pull-quote figure:\n *\n * <figure data-variant=\"pullquote\">\n * <blockquote data-variant=\"pullquote\">…rest…</blockquote>\n * <figcaption data-variant=\"pullquote\">— Name</figcaption>\n * </figure>\n *\n * Blockquotes already nested inside a `<figure>` are left untouched.\n */\nfunction upgradeAuthoredBlockquotes(html: string): string {\n const figureRanges: Array<[number, number]> = [];\n const figRe = /<figure\\b[\\s\\S]*?<\\/figure>/gi;\n let fm: RegExpExecArray | null;\n while ((fm = figRe.exec(html)) !== null) {\n figureRanges.push([fm.index, fm.index + fm[0].length]);\n }\n const insideFigure = (pos: number): boolean =>\n figureRanges.some(([s, e]) => pos >= s && pos < e);\n\n return html.replace(\n /<blockquote\\b[^>]*>([\\s\\S]*?)<\\/blockquote>/gi,\n (full, inner: string, offset: number) => {\n if (typeof offset === \"number\" && insideFigure(offset)) return full;\n\n const lastP = inner.match(/<p\\b[^>]*>([\\s\\S]*?)<\\/p>\\s*$/i);\n if (!lastP) return full;\n const text = stripInlineTags(decodeEntities(lastP[1])).trim();\n const authorMatch = text.match(/^(?:[—–]+|--)\\s+(.+)$/);\n if (!authorMatch) return full;\n\n const author = authorMatch[1].trim();\n const rest = inner.slice(0, inner.length - lastP[0].length).trim();\n if (!rest) return full;\n\n const wrapped = injectQuoteSpans(rest);\n return `<figure data-variant=\"pullquote\"><blockquote data-variant=\"pullquote\">${wrapped}</blockquote><figcaption data-variant=\"pullquote\">— <span data-variant=\"author\">${escapeHtml(author)}</span></figcaption></figure>`;\n },\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* Legacy \"markdown-in-divs\" detection + migration */\n/* -------------------------------------------------------------------------- */\n\nfunction isLegacyFormat(html: string): boolean {\n if (!/<div\\b/i.test(html)) return false;\n return /<div[^>]*>\\s*(?:&gt;|```|\\|)/i.test(html);\n}\n\nfunction decodeEntities(input: string): string {\n return input\n .replace(/&nbsp;/g, \" \")\n .replace(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\");\n}\n\nfunction escapeHtml(input: string): string {\n return input\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction extractLegacyLines(html: string): string[] {\n const normalized = html\n .replace(/\\r\\n?/g, \"\\n\")\n .replace(/<\\/div>\\s*<div[^>]*>/gi, \"\\n\")\n .replace(/<div[^>]*>/gi, \"\")\n .replace(/<\\/div>/gi, \"\\n\")\n .replace(/<br\\s*\\/?>(\\s*)/gi, \"\\n\")\n .replace(/<\\/p>\\s*<p[^>]*>/gi, \"\\n\\n\")\n .replace(/<p[^>]*>/gi, \"\")\n .replace(/<\\/p>/gi, \"\\n\");\n return normalized.split(\"\\n\").map((line) => line.replace(/\\s+$/g, \"\"));\n}\n\nfunction stripInlineTags(input: string): string {\n return input.replace(/<[^>]+>/g, \"\");\n}\n\nfunction renderInline(raw: string): string {\n let out = decodeEntities(raw);\n\n out = out.replace(\n /`([^`]+)`/g,\n (_m, code) => `<code>${escapeHtml(decodeEntities(code))}</code>`,\n );\n // Image markdown must run before links so `![alt](url)` isn't matched as a link.\n out = out.replace(\n /!\\[([^\\]]*)\\]\\(([^)]+)\\)/g,\n (_m, alt, src) =>\n `<img src=\"${escapeHtml(String(src).trim())}\" alt=\"${escapeHtml(String(alt))}\" />`,\n );\n out = out.replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n (_m, text, href) =>\n `<a href=\"${escapeHtml(String(href).trim())}\" target=\"_blank\" rel=\"noreferrer noopener\">${text}</a>`,\n );\n out = out.replace(/\\*\\*([^*]+)\\*\\*/g, \"<strong>$1</strong>\");\n out = out.replace(/__([^_]+)__/g, \"<strong>$1</strong>\");\n out = out.replace(/\\*([^*]+)\\*/g, \"<em>$1</em>\");\n out = out.replace(/(^|[^_])_([^_]+)_(?!_)/g, \"$1<em>$2</em>\");\n\n return out;\n}\n\nfunction isCodeFence(line: string): boolean {\n return /^\\s*```/.test(stripInlineTags(decodeEntities(line)).trim());\n}\n\nfunction isBlockquoteLine(line: string): boolean {\n return stripInlineTags(decodeEntities(line)).trim().startsWith(\">\");\n}\n\nfunction calloutHeaderOf(\n line: string,\n): { title: string; variant: string } | null {\n const text = stripInlineTags(decodeEntities(line)).trim();\n const m = text.match(/^>\\s*\\[!\\s*([^\\]]+?)\\s*\\]\\s*$/);\n if (!m) return null;\n const raw = m[1];\n const lower = raw.toLowerCase();\n const knownVariants = [\n \"info\",\n \"warning\",\n \"success\",\n \"danger\",\n \"note\",\n \"tip\",\n \"caution\",\n \"important\",\n ];\n const variant = knownVariants.includes(lower)\n ? lower === \"note\"\n ? \"info\"\n : lower === \"tip\"\n ? \"success\"\n : lower === \"caution\" || lower === \"important\"\n ? \"warning\"\n : lower\n : \"info\";\n return { title: raw, variant };\n}\n\nfunction stripBlockquoteMarker(line: string): string {\n return stripInlineTags(decodeEntities(line)).replace(/^\\s*>\\s?/, \"\");\n}\n\nfunction isTableLine(line: string): boolean {\n return /^\\|.*\\|$/.test(stripInlineTags(decodeEntities(line)).trim());\n}\n\nfunction isTableDivider(line: string): boolean {\n return /^\\|\\s*:?-{2,}:?\\s*(\\|\\s*:?-{2,}:?\\s*)+\\|?$/.test(\n stripInlineTags(decodeEntities(line)).trim(),\n );\n}\n\nfunction splitTableRow(line: string): string[] {\n return stripInlineTags(decodeEntities(line))\n .trim()\n .replace(/^\\|/, \"\")\n .replace(/\\|$/, \"\")\n .split(\"|\")\n .map((cell) => cell.trim());\n}\n\nfunction renderTable(rows: string[]): string {\n if (rows.length === 0) return \"\";\n let headerCells: string[] = [];\n let bodyStart = 0;\n if (rows.length >= 2 && isTableDivider(rows[1])) {\n headerCells = splitTableRow(rows[0]);\n bodyStart = 2;\n }\n const bodyRows = rows.slice(bodyStart).map(splitTableRow);\n const head = headerCells.length\n ? `<thead><tr>${headerCells.map((c) => `<th>${renderInline(c)}</th>`).join(\"\")}</tr></thead>`\n : \"\";\n const body = bodyRows.length\n ? `<tbody>${bodyRows.map((cells) => `<tr>${cells.map((c) => `<td>${renderInline(c)}</td>`).join(\"\")}</tr>`).join(\"\")}</tbody>`\n : \"\";\n return `<table>${head}${body}</table>`;\n}\n\nfunction renderCallout(\n title: string,\n variant: string,\n bodyLines: string[],\n): string {\n const body = bodyLines.map((l) => renderInline(l)).join(\"<br />\");\n return `<aside data-callout data-variant=\"${escapeHtml(variant)}\" data-title=\"${escapeHtml(title)}\">${body ? `<p>${body}</p>` : \"\"}</aside>`;\n}\n\nfunction renderBlockquote(lines: string[]): string {\n if (lines.length > 0) {\n const last = stripInlineTags(\n decodeEntities(lines[lines.length - 1]),\n ).trim();\n const authorMatch = last.match(/^(?:[—–]+|--)\\s+(.+)$/);\n if (authorMatch && lines.length > 1) {\n const author = authorMatch[1].trim();\n const quoteLines = lines.slice(0, -1);\n const body = quoteLines.map((l) => renderInline(l)).join(\"<br />\");\n return `<figure data-variant=\"pullquote\"><blockquote data-variant=\"pullquote\"><p><span data-variant=\"quote-open\">“</span>${body}<span data-variant=\"quote-close\">”</span></p></blockquote><figcaption data-variant=\"pullquote\">— <span data-variant=\"author\">${escapeHtml(author)}</span></figcaption></figure>`;\n }\n }\n return `<blockquote><p>${lines.map((l) => renderInline(l)).join(\"<br />\")}</p></blockquote>`;\n}\n\nfunction isImageOnlyLine(line: string): boolean {\n const text = stripInlineTags(decodeEntities(line)).trim();\n return /^!\\[[^\\]]*\\]\\([^)]+\\)$/.test(text);\n}\n\nfunction renderImageFigure(line: string): string {\n const m = stripInlineTags(decodeEntities(line))\n .trim()\n .match(/^!\\[([^\\]]*)\\]\\(([^)]+)\\)$/);\n if (!m) return \"\";\n const alt = m[1];\n const src = m[2].trim();\n const img = `<img src=\"${escapeHtml(src)}\" alt=\"${escapeHtml(alt)}\" />`;\n const cap = alt\n ? `<figcaption data-variant=\"image\">${escapeHtml(alt)}</figcaption>`\n : \"\";\n return `<figure data-variant=\"image\">${img}${cap}</figure>`;\n}\n\nfunction renderParagraph(lines: string[]): string {\n const body = lines.map((l) => renderInline(l)).join(\"<br />\");\n return body.length === 0 ? \"\" : `<p>${body}</p>`;\n}\n\nfunction migrateLegacyToHtml(html: string): string {\n const lines = extractLegacyLines(html);\n const blocks: string[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n const trimmed = stripInlineTags(decodeEntities(line)).trim();\n\n if (trimmed.length === 0) {\n i++;\n continue;\n }\n\n if (isCodeFence(line)) {\n const codeLines: string[] = [];\n i++;\n while (i < lines.length && !isCodeFence(lines[i])) {\n codeLines.push(stripInlineTags(decodeEntities(lines[i])));\n i++;\n }\n if (i < lines.length) i++;\n blocks.push(\n `<pre><code>${escapeHtml(codeLines.join(\"\\n\"))}</code></pre>`,\n );\n continue;\n }\n\n const callout = calloutHeaderOf(line);\n if (callout) {\n const bodyLines: string[] = [];\n i++;\n while (i < lines.length && isBlockquoteLine(lines[i])) {\n bodyLines.push(stripBlockquoteMarker(lines[i]));\n i++;\n }\n blocks.push(renderCallout(callout.title, callout.variant, bodyLines));\n continue;\n }\n\n if (isBlockquoteLine(line)) {\n const quoteLines: string[] = [];\n while (i < lines.length && isBlockquoteLine(lines[i])) {\n quoteLines.push(stripBlockquoteMarker(lines[i]));\n i++;\n }\n blocks.push(renderBlockquote(quoteLines));\n continue;\n }\n\n if (isTableLine(line)) {\n const tableLines: string[] = [];\n while (i < lines.length && isTableLine(lines[i])) {\n tableLines.push(lines[i]);\n i++;\n }\n blocks.push(renderTable(tableLines));\n continue;\n }\n\n if (isImageOnlyLine(line)) {\n blocks.push(renderImageFigure(line));\n i++;\n continue;\n }\n\n const paragraphLines: string[] = [];\n while (\n i < lines.length &&\n stripInlineTags(decodeEntities(lines[i])).trim().length > 0 &&\n !isCodeFence(lines[i]) &&\n !isBlockquoteLine(lines[i]) &&\n !isTableLine(lines[i]) &&\n !isImageOnlyLine(lines[i])\n ) {\n paragraphLines.push(lines[i]);\n i++;\n }\n const p = renderParagraph(paragraphLines);\n if (p) blocks.push(p);\n }\n\n return blocks.join(\"\");\n}\n\n/* -------------------------------------------------------------------------- */\n/* Sanitize + classMap pass */\n/* -------------------------------------------------------------------------- */\n\ntype Token =\n | { type: \"text\"; value: string }\n | { type: \"comment\" }\n | {\n type: \"open\";\n tag: string;\n attrs: Record<string, string>;\n selfClosing: boolean;\n }\n | { type: \"close\"; tag: string };\n\nconst VOID_TAGS = new Set([\n \"br\",\n \"hr\",\n \"img\",\n \"input\",\n \"meta\",\n \"link\",\n \"source\",\n \"wbr\",\n \"col\",\n]);\n\nfunction tokenize(html: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n\n while (i < html.length) {\n const lt = html.indexOf(\"<\", i);\n if (lt === -1) {\n tokens.push({ type: \"text\", value: html.slice(i) });\n break;\n }\n if (lt > i) tokens.push({ type: \"text\", value: html.slice(i, lt) });\n\n if (html.startsWith(\"<!--\", lt)) {\n const end = html.indexOf(\"-->\", lt + 4);\n if (end === -1) {\n i = html.length;\n break;\n }\n tokens.push({ type: \"comment\" });\n i = end + 3;\n continue;\n }\n\n let end = lt + 1;\n let inQuote: string | null = null;\n while (end < html.length) {\n const ch = html[end];\n if (inQuote) {\n if (ch === inQuote) inQuote = null;\n } else {\n if (ch === '\"' || ch === \"'\") inQuote = ch;\n else if (ch === \">\") break;\n }\n end++;\n }\n if (end >= html.length) {\n tokens.push({ type: \"text\", value: html.slice(lt) });\n break;\n }\n\n const tagContent = html.slice(lt + 1, end).trim();\n if (tagContent.startsWith(\"/\")) {\n tokens.push({\n type: \"close\",\n tag: tagContent.slice(1).trim().toLowerCase(),\n });\n } else {\n const selfClosingMark = tagContent.endsWith(\"/\");\n const inner = selfClosingMark\n ? tagContent.slice(0, -1).trim()\n : tagContent;\n const spaceIdx = inner.search(/\\s/);\n const tag = (\n spaceIdx === -1 ? inner : inner.slice(0, spaceIdx)\n ).toLowerCase();\n const attrStr = spaceIdx === -1 ? \"\" : inner.slice(spaceIdx + 1);\n const attrs = parseAttrs(attrStr);\n tokens.push({\n type: \"open\",\n tag,\n attrs,\n selfClosing: selfClosingMark || VOID_TAGS.has(tag),\n });\n }\n i = end + 1;\n }\n\n return tokens;\n}\n\nfunction parseAttrs(str: string): Record<string, string> {\n const out: Record<string, string> = {};\n const re =\n /([a-zA-Z_][a-zA-Z0-9_:-]*)(?:\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s>]+)))?/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(str)) !== null) {\n const name = m[1].toLowerCase();\n const value = m[2] ?? m[3] ?? m[4] ?? \"\";\n out[name] = decodeEntities(value);\n }\n return out;\n}\n\nfunction isAttrAllowed(tag: string, attr: string): boolean {\n if (attr.startsWith(\"on\")) return false;\n if (GLOBAL_ALLOWED_ATTRS.includes(attr)) return true;\n const list = ALLOWED_ATTRS[tag];\n return Boolean(list && list.includes(attr));\n}\n\nfunction isSafeUrl(value: string): boolean {\n const v = value.trim().toLowerCase();\n if (\n v.startsWith(\"javascript:\") ||\n (v.startsWith(\"data:\") && !v.startsWith(\"data:image/\"))\n )\n return false;\n if (v.startsWith(\"vbscript:\") || v.startsWith(\"file:\")) return false;\n return true;\n}\n\nfunction escapeAttr(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\");\n}\n\nfunction classKeyForTag(\n tag: string,\n attrs: Record<string, string>,\n openStack: ReadonlyArray<string>,\n): RichTextClassKey | null {\n if (tag === \"aside\" && \"data-callout\" in attrs) return \"callout\";\n if (tag === \"p\" && \"data-callout-title\" in attrs) return \"calloutTitle\";\n if (tag === \"code\" && openStack[openStack.length - 1] !== \"pre\")\n return \"inlineCode\";\n if (tag === \"details\") return \"collapsible\";\n if (tag === \"summary\") return \"collapsibleTitle\";\n\n const known: ReadonlyArray<RichTextClassKey> = [\n \"p\",\n \"br\",\n \"hr\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"ul\",\n \"ol\",\n \"li\",\n \"blockquote\",\n \"pre\",\n \"code\",\n \"kbd\",\n \"a\",\n \"strong\",\n \"em\",\n \"u\",\n \"s\",\n \"table\",\n \"thead\",\n \"tbody\",\n \"tr\",\n \"th\",\n \"td\",\n \"figure\",\n \"figcaption\",\n \"img\",\n \"span\",\n ];\n return (known as ReadonlyArray<string>).includes(tag)\n ? (tag as RichTextClassKey)\n : null;\n}\n\nfunction variantClass(\n classMap: RichTextClassMap | undefined,\n matchKey: string | null,\n variant: string | undefined,\n): string | undefined {\n if (!classMap?.variants || !matchKey || !variant) return undefined;\n return classMap.variants[`${matchKey}:${variant}`];\n}\n\nfunction sanitizeAndStyle(html: string, options: ParseRichTextOptions): string {\n const allowlist = options.allowlist ?? DEFAULT_ALLOWLIST;\n const classMap = options.classMap;\n const tokens = tokenize(html);\n const out: string[] = [];\n const openStack: string[] = [];\n const skipStack: Array<{ tag: string; dropChildren: boolean }> = [];\n const tableWrapperStack: boolean[] = [];\n\n for (let tokenIdx = 0; tokenIdx < tokens.length; tokenIdx++) {\n const token = tokens[tokenIdx];\n if (token.type === \"comment\") continue;\n\n if (token.type === \"text\") {\n if (skipStack.length > 0 && skipStack[skipStack.length - 1].dropChildren)\n continue;\n out.push(token.value);\n continue;\n }\n\n if (token.type === \"open\") {\n const allowed = allowlist.includes(token.tag);\n const dropChildren = token.tag === \"script\" || token.tag === \"style\";\n\n if (!allowed) {\n if (!token.selfClosing)\n skipStack.push({ tag: token.tag, dropChildren });\n continue;\n }\n\n const safeAttrs: Record<string, string> = {};\n for (const [name, value] of Object.entries(token.attrs)) {\n if (!isAttrAllowed(token.tag, name)) continue;\n if (URL_ATTRS.has(name) && !isSafeUrl(value)) continue;\n if (name === \"style\") {\n const cleaned = sanitizeStyle(token.tag, value);\n if (cleaned) safeAttrs.style = cleaned;\n continue;\n }\n safeAttrs[name] = value;\n }\n\n const matchKey = classKeyForTag(token.tag, token.attrs, openStack);\n const variant = token.attrs[\"data-variant\"];\n\n const classes: string[] = [];\n if (safeAttrs.class) classes.push(safeAttrs.class);\n if (matchKey && classMap?.[matchKey])\n classes.push(classMap[matchKey] as string);\n const variantCls = variantClass(classMap, matchKey, variant);\n if (variantCls) classes.push(variantCls);\n\n if (token.tag === \"a\") {\n if (safeAttrs.target === \"_blank\" && !safeAttrs.rel)\n safeAttrs.rel = \"noreferrer noopener\";\n }\n\n const merged = classes.join(\" \").trim();\n if (merged) safeAttrs.class = merged;\n else delete safeAttrs.class;\n\n const attrStr = Object.entries(safeAttrs)\n .map(([k, v]) => `${k}=\"${escapeAttr(v)}\"`)\n .join(\" \");\n\n if (token.tag === \"table\") {\n const wrapperClass = classMap?.tableWrapper;\n if (wrapperClass) {\n out.push(`<div class=\"${escapeAttr(wrapperClass)}\">`);\n tableWrapperStack.push(true);\n } else {\n tableWrapperStack.push(false);\n }\n }\n\n out.push(\n `<${token.tag}${attrStr ? \" \" + attrStr : \"\"}${token.selfClosing ? \" /\" : \"\"}>`,\n );\n if (!token.selfClosing) openStack.push(token.tag);\n\n if (\n token.tag === \"aside\" &&\n \"data-callout\" in token.attrs &&\n token.attrs[\"data-title\"]\n ) {\n const title = token.attrs[\"data-title\"];\n let lookahead = tokenIdx + 1;\n while (lookahead < tokens.length) {\n const next = tokens[lookahead];\n if (next.type === \"comment\") {\n lookahead++;\n continue;\n }\n if (next.type === \"text\" && next.value.trim() === \"\") {\n lookahead++;\n continue;\n }\n break;\n }\n const next = tokens[lookahead];\n const alreadyHasTitle =\n next &&\n next.type === \"open\" &&\n next.tag === \"p\" &&\n \"data-callout-title\" in next.attrs;\n if (!alreadyHasTitle) {\n const titleClasses: string[] = [];\n if (classMap?.calloutTitle) titleClasses.push(classMap.calloutTitle);\n const titleVariantCls = variantClass(\n classMap,\n \"calloutTitle\",\n token.attrs[\"data-variant\"],\n );\n if (titleVariantCls) titleClasses.push(titleVariantCls);\n const titleClassAttr = titleClasses.length\n ? ` class=\"${escapeAttr(titleClasses.join(\" \"))}\"`\n : \"\";\n out.push(\n `<p data-callout-title=\"true\"${titleClassAttr}>${escapeHtml(title)}</p>`,\n );\n }\n }\n continue;\n }\n\n if (token.type === \"close\") {\n if (\n skipStack.length > 0 &&\n skipStack[skipStack.length - 1].tag === token.tag\n ) {\n skipStack.pop();\n continue;\n }\n if (!allowlist.includes(token.tag)) continue;\n const idx = openStack.lastIndexOf(token.tag);\n if (idx === -1) continue;\n while (openStack.length > idx + 1) {\n const orphan = openStack.pop() as string;\n out.push(`</${orphan}>`);\n }\n openStack.pop();\n out.push(`</${token.tag}>`);\n if (token.tag === \"table\" && tableWrapperStack.pop()) {\n out.push(`</div>`);\n }\n }\n }\n\n while (openStack.length > 0) {\n const tag = openStack.pop() as string;\n out.push(`</${tag}>`);\n if (tag === \"table\" && tableWrapperStack.pop()) {\n out.push(`</div>`);\n }\n }\n\n return out.join(\"\");\n}\n","import {\n createElement,\n Fragment,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport hljs from \"highlight.js/lib/common\";\nimport {\n parseRichText,\n type ParseRichTextOptions,\n type RichTextClassMap,\n} from \"./richTextParser\";\n\nexport type { RichTextClassMap, ParseRichTextOptions };\n\ninterface RichTextContentProps {\n html: string;\n classMap?: RichTextClassMap;\n /** Wrapper element. Defaults to `div`. Use `article` for blog content. */\n as?: keyof React.JSX.IntrinsicElements;\n className?: string;\n /**\n * Fires after the parsed HTML is in the DOM and post-render enhancements\n * (syntax highlighting, copy buttons, blockquote decorations) have run.\n * The wrapper element is passed back so callers can read headings, attach\n * a ToC observer, or do other DOM work without re-querying.\n */\n onReady?: (root: HTMLElement) => void;\n /**\n * Optional ref to the wrapper element. Useful for hooks like\n * `useTableOfContents` that need a stable reference to the rendered tree.\n */\n contentRef?: React.MutableRefObject<HTMLElement | null>;\n /**\n * Per-variant icon override for callouts that opt into icons via\n * `data-icon`. Provide a React element for any variant key — these\n * elements are rendered into the chip via a portal, so they live in\n * React land (refs, event handlers, theme context all work). Variants\n * you don't provide fall back to the built-in SVG glyph.\n *\n * Common variants: `\"info\" | \"warning\" | \"success\" | \"danger\" | \"default\"`.\n * Custom variant names work too — anything you set via\n * `data-variant` on an `<aside data-callout>`.\n *\n * Example:\n * ```tsx\n * import { Info, AlertTriangle } from \"lucide-react\";\n *\n * <RichTextContent\n * html={article.doc}\n * calloutIcons={{\n * info: <Info size={14} strokeWidth={2.4} />,\n * warning: <AlertTriangle size={14} strokeWidth={2.4} />,\n * }}\n * />\n * ```\n */\n calloutIcons?: Partial<Record<string, ReactNode>>;\n}\n\n/**\n * Default look for the pullquote figure emitted by the parser when a\n * blockquote ends with an attribution line (`— Name`). Styles the decorative\n * curly quote marks and gives the author its own treatment so it reads as a\n * separate element from the quote body.\n */\nconst DEFAULT_CLASS_MAP: RichTextClassMap = {\n variants: {\n \"figure:pullquote\": \"relative my-8\",\n \"blockquote:pullquote\":\n \"relative italic text-lg leading-snug tracking-[-0.01em] sm:text-xl\",\n \"figcaption:pullquote\":\n \"mt-4 pt-3 border-t border-current/15 not-italic text-xs uppercase tracking-[0.14em] opacity-80\",\n \"span:quote-open\":\n \"mr-1 font-serif text-[1.4em] leading-none align-[-0.15em] opacity-60 select-none\",\n \"span:quote-close\":\n \"ml-1 font-serif text-[1.4em] leading-none align-[-0.15em] opacity-60 select-none\",\n \"span:author\":\n \"ml-1 font-semibold not-italic tracking-[0.16em] text-current\",\n },\n};\n\nfunction mergeClassMap(\n defaults: RichTextClassMap,\n user?: RichTextClassMap,\n): RichTextClassMap {\n if (!user) return defaults;\n return {\n ...defaults,\n ...user,\n variants: { ...defaults.variants, ...user.variants },\n };\n}\n\n/**\n * Server-safe React renderer for CMS rich text fields.\n *\n * Pairs with `parseRichText` from `richTextParser.ts`. Pass a `classMap`\n * keyed by tag, plus special wrapper keys like `tableWrapper`\n * (and `variants` keyed by `${tag}:${variantName}`) to apply frontend-specific\n * Tailwind classes without changing stored content.\n *\n * Built-in figure variants emitted by the parser:\n * - `figure:image` / `figcaption:image` — wraps standalone `<img>` blocks\n * and renders the alt/title as a centered caption.\n * - `figure:pullquote` / `blockquote:pullquote` / `figcaption:pullquote` —\n * emitted when a blockquote ends with an attribution line like\n * `— Name` (em/en dash or `--`). The author moves to the `<figcaption>`.\n * The blockquote body is wrapped with `<span data-variant=\"quote-open\">“</span>`\n * and `<span data-variant=\"quote-close\">”</span>`, addressable via the\n * `span:quote-open` / `span:quote-close` keys in `classMap.variants` so\n * the decorative marks can be sized, colored, or hidden independently.\n * The author name inside `<figcaption>` is wrapped in\n * `<span data-variant=\"author\">…</span>` (after the em-dash separator)\n * so it can be styled with its own `span:author` variant key without\n * affecting the dash.\n * - `tableWrapper` — wraps each sanitized `<table>` in a scroll container\n * before the table tag itself is rendered. Useful when you need the\n * table to match a bordered, horizontally scrollable design exactly.\n *\n * Sensible defaults for the pullquote layout (decorative quote marks +\n * distinct author treatment) ship in `DEFAULT_CLASS_MAP` and are merged with\n * the caller's `classMap` — user values win on conflict.\n *\n * Example:\n * ```\n * <RichTextContent\n * html={post.body}\n * classMap={{\n * figure: \"mt-10\",\n * variants: {\n * \"figure:pullquote\":\n * \"rounded-xl border-l-4 border-primary-color bg-primary-color/4 p-6 sm:p-8\",\n * \"blockquote:pullquote\":\n * \"text-lg font-medium leading-snug tracking-[-0.01em] sm:text-xl\",\n * \"figcaption:pullquote\":\n * \"mt-3 text-xs font-semibold uppercase tracking-[0.14em] text-primary-color\",\n * \"figcaption:image\": \"mt-3 text-center text-xs text-secondary-color\",\n * },\n * }}\n * />\n * ```\n *\n * Copy this file + `richTextParser.ts` into any consuming frontend; both\n * are dependency-free aside from React.\n */\nconst COPY_ICON_SVG = `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path></svg>`;\nconst CHECK_ICON_SVG = `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>`;\n\nconst ATTRIBUTION_RE = /^(?:[—–-]+|--)\\s+\\S/;\n\nfunction isAttributionEl(el: Element | null): boolean {\n if (!el) return false;\n if (el.getAttribute(\"data-variant\") === \"attribution\") return true;\n return ATTRIBUTION_RE.test((el.textContent ?? \"\").trim());\n}\n\nfunction findQuoteBody(bq: HTMLQuoteElement): {\n first: HTMLElement | null;\n last: HTMLElement | null;\n} {\n const children = Array.from(bq.children) as HTMLElement[];\n if (children.length === 0) return { first: null, last: null };\n let lastIdx = children.length - 1;\n // Skip trailing attribution paragraph(s) when picking where the closing\n // quote mark belongs.\n while (lastIdx >= 0 && isAttributionEl(children[lastIdx])) lastIdx--;\n if (lastIdx < 0) return { first: null, last: null };\n return { first: children[0], last: children[lastIdx] };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Callout icon injection */\n/* -------------------------------------------------------------------------- */\n\n// Per-variant SVG glyphs rendered inside the callout chip when the author\n// opts into the icon. Kept as raw strings so they can be inlined cheaply via\n// `innerHTML`. All glyphs share the same 16×16 viewBox so they line up in\n// the chip.\nconst CALLOUT_ICON_SVG: Record<string, string> = {\n info: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 16v-5\"/><path d=\"M12 8h.01\"/></svg>`,\n warning: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg>`,\n success: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"/></svg>`,\n danger: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"m15 9-6 6\"/><path d=\"m9 9 6 6\"/></svg>`,\n default: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M12 2.5l1.6 5.4a4 4 0 0 0 2.5 2.5L21.5 12l-5.4 1.6a4 4 0 0 0-2.5 2.5L12 21.5l-1.6-5.4a4 4 0 0 0-2.5-2.5L2.5 12l5.4-1.6a4 4 0 0 0 2.5-2.5z\"/></svg>`,\n};\n\nfunction calloutVariantOf(el: Element): string {\n return el.getAttribute(\"data-variant\") ?? \"default\";\n}\n\nfunction isIconEnabled(el: Element): boolean {\n const v = el.getAttribute(\"data-icon\");\n // Treat presence-only (`data-icon`) as truthy; explicit \"false\"/\"0\" disables.\n if (v === null) return false;\n return v !== \"false\" && v !== \"0\";\n}\n\n/**\n * Walk the callouts in the rendered subtree and ensure each one that has\n * `data-icon` set carries an empty `<span class=\"rt-callout-icon\">` chip at\n * its first child. The chip's contents are filled later by React (either\n * a portal of the user-supplied element, or the built-in SVG glyph),\n * which lets consumers swap in their own icon components.\n *\n * Returns the chip spans currently in the DOM in document order so the\n * component can render portals into them.\n */\nfunction enhanceCallouts(\n root: HTMLElement,\n): Array<{ el: HTMLElement; variant: string }> {\n const callouts = root.querySelectorAll<HTMLElement>(\"aside[data-callout]\");\n callouts.forEach((el) => {\n if (el.dataset.rtCalloutEnhanced === \"1\") return;\n el.dataset.rtCalloutEnhanced = \"1\";\n if (!isIconEnabled(el)) return;\n if (el.querySelector(\":scope > .rt-callout-icon\")) return;\n const variant = calloutVariantOf(el);\n const icon = document.createElement(\"span\");\n icon.className = \"rt-callout-icon\";\n icon.dataset.variant = variant;\n icon.setAttribute(\"aria-hidden\", \"true\");\n el.prepend(icon);\n });\n const chips: Array<{ el: HTMLElement; variant: string }> = [];\n root\n .querySelectorAll<HTMLElement>(\n \"aside[data-callout] > .rt-callout-icon\",\n )\n .forEach((chip) => {\n chips.push({\n el: chip,\n variant:\n chip.dataset.variant ||\n (chip.parentElement?.getAttribute(\"data-variant\") ?? \"default\"),\n });\n });\n return chips;\n}\n\nfunction enhanceBlockquotes(root: HTMLElement) {\n const quotes = root.querySelectorAll<HTMLQuoteElement>(\"blockquote\");\n quotes.forEach((bq) => {\n if (bq.dataset.rtQuoted === \"1\") return;\n // Pullquotes inside a figure already get curly quotes from the parser.\n if (bq.closest('figure[data-variant=\"pullquote\"]')) return;\n bq.dataset.rtQuoted = \"1\";\n\n const { first, last } = findQuoteBody(bq);\n if (!first || !last) return;\n\n const open = document.createElement(\"span\");\n open.className = \"rt-quote-open\";\n open.setAttribute(\"aria-hidden\", \"true\");\n open.textContent = \"“\";\n\n const close = document.createElement(\"span\");\n close.className = \"rt-quote-close\";\n close.setAttribute(\"aria-hidden\", \"true\");\n close.textContent = \"”\";\n\n first.prepend(open);\n last.append(close);\n });\n}\n\n/* -------------------------------------------------------------------------- */\n/* Syntax highlighting (highlight.js) */\n/* -------------------------------------------------------------------------- */\n\n// `highlight.js/lib/common` ships ~35 popular languages — enough for typical\n// CMS content without dragging in every grammar. The theme CSS is imported at\n// the top of the file. To add an obscure language, register it explicitly:\n// import lang from \"highlight.js/lib/languages/foo\"; hljs.registerLanguage(\"foo\", lang);\n\nfunction escapeHtml(s: string): string {\n return s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n\nfunction preserveSpaces(html: string): string {\n // Keep runs of 2+ spaces visible inside table cells / inline contexts where\n // the browser would otherwise collapse them.\n return html.replace(/ {2,}/g, (m) => \"&nbsp;\".repeat(m.length));\n}\n\nfunction highlightSource(src: string, lang?: string): string {\n if (lang && hljs.getLanguage(lang)) {\n try {\n return hljs.highlight(src, { language: lang, ignoreIllegals: true })\n .value;\n } catch {\n // fall through to escaped plain text\n }\n }\n return escapeHtml(src);\n}\n\nfunction highlightLine(line: string, lang: string | undefined): string {\n if (!line) return \"\";\n return preserveSpaces(highlightSource(line, lang));\n}\n\nfunction highlightCodeBlock(pre: HTMLPreElement) {\n const lang = pre.dataset.language;\n if (!lang) return;\n const code = pre.querySelector(\"code\");\n if (!code) return;\n if ((code as HTMLElement).dataset.rtHighlighted === \"1\") return;\n const source = code.textContent ?? \"\";\n code.innerHTML = highlightSource(source, lang);\n code.classList.add(\"hljs\");\n (code as HTMLElement).dataset.rtHighlighted = \"1\";\n}\n\nconst DIFF_SEPARATOR_RE = /\\n?@@---@@\\n?/;\n\ntype DiffOp = { t: \"eq\" | \"rem\" | \"add\"; line: string };\n\nfunction diffLines(a: string[], b: string[]): DiffOp[] {\n const n = a.length;\n const m = b.length;\n const dp: number[][] = Array.from({ length: n + 1 }, () =>\n new Array(m + 1).fill(0),\n );\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= m; j++) {\n dp[i][j] =\n a[i - 1] === b[j - 1]\n ? dp[i - 1][j - 1] + 1\n : Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n const ops: DiffOp[] = [];\n let i = n;\n let j = m;\n while (i > 0 && j > 0) {\n if (a[i - 1] === b[j - 1]) {\n ops.unshift({ t: \"eq\", line: a[i - 1] });\n i--;\n j--;\n } else if (dp[i - 1][j] >= dp[i][j - 1]) {\n ops.unshift({ t: \"rem\", line: a[i - 1] });\n i--;\n } else {\n ops.unshift({ t: \"add\", line: b[j - 1] });\n j--;\n }\n }\n while (i > 0) ops.unshift({ t: \"rem\", line: a[--i] });\n while (j > 0) ops.unshift({ t: \"add\", line: b[--j] });\n return ops;\n}\n\nfunction renderDiff(before: string, after: string, lang?: string): string {\n const ops = diffLines(before.split(\"\\n\"), after.split(\"\\n\"));\n type Cell = { n: number | null; line: string | null; cls: string };\n type Row = { left: Cell; right: Cell };\n const rows: Row[] = [];\n let aNo = 0;\n let bNo = 0;\n let k = 0;\n while (k < ops.length) {\n const op = ops[k];\n if (op.t === \"eq\") {\n aNo++;\n bNo++;\n rows.push({\n left: { n: aNo, line: op.line, cls: \"\" },\n right: { n: bNo, line: op.line, cls: \"\" },\n });\n k++;\n continue;\n }\n const rems: string[] = [];\n while (k < ops.length && ops[k].t === \"rem\") {\n rems.push(ops[k].line);\n k++;\n }\n const adds: string[] = [];\n while (k < ops.length && ops[k].t === \"add\") {\n adds.push(ops[k].line);\n k++;\n }\n const len = Math.max(rems.length, adds.length);\n for (let x = 0; x < len; x++) {\n const remLine = x < rems.length ? rems[x] : null;\n const addLine = x < adds.length ? adds[x] : null;\n rows.push({\n left: {\n n: remLine !== null ? ++aNo : null,\n line: remLine,\n cls: remLine !== null ? \"rt-diff-rem\" : \"rt-diff-empty\",\n },\n right: {\n n: addLine !== null ? ++bNo : null,\n line: addLine,\n cls: addLine !== null ? \"rt-diff-add\" : \"rt-diff-empty\",\n },\n });\n }\n }\n const cell = (c: Cell, side: \"l\" | \"r\") => {\n const sign = side === \"l\" ? \"-\" : \"+\";\n const showSign = c.cls === \"rt-diff-rem\" || c.cls === \"rt-diff-add\";\n return (\n `<td class=\"rt-diff-num\">${c.n ?? \"\"}</td>` +\n `<td class=\"rt-diff-sign\">${showSign ? sign : \"\"}</td>` +\n `<td class=\"rt-diff-line ${c.cls}\">${c.line === null ? \"\" : highlightLine(c.line, lang) || \"&nbsp;\"}</td>`\n );\n };\n const body = rows\n .map((r) => `<tr>${cell(r.left, \"l\")}${cell(r.right, \"r\")}</tr>`)\n .join(\"\");\n return `<table class=\"rt-diff-table\"><tbody>${body}</tbody></table>`;\n}\n\nfunction makeCopyButton(\n getText: () => string,\n opts: { className?: string; label?: string } = {},\n): HTMLButtonElement {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = opts.className ?? \"rt-codeblock__copy\";\n btn.setAttribute(\"aria-label\", opts.label ?? \"Copy code\");\n btn.innerHTML = COPY_ICON_SVG;\n btn.addEventListener(\"click\", async () => {\n try {\n await navigator.clipboard.writeText(getText());\n btn.innerHTML = CHECK_ICON_SVG;\n btn.classList.add(\"is-copied\");\n window.setTimeout(() => {\n btn.innerHTML = COPY_ICON_SVG;\n btn.classList.remove(\"is-copied\");\n }, 1500);\n } catch {\n // clipboard unavailable; no-op\n }\n });\n return btn;\n}\n\nfunction buildCodeBlockLabel(pre: HTMLPreElement): HTMLElement | null {\n const filename = pre.dataset.filename;\n if (!filename) return null;\n const tag = document.createElement(\"span\");\n tag.className = \"rt-codeblock__label\";\n const file = document.createElement(\"span\");\n // Use the language-pill styling for the filename so it reads as a small\n // tag rather than plain text. Language itself is no longer displayed.\n file.className = \"rt-codeblock__filename rt-codeblock__language\";\n file.textContent = filename;\n tag.appendChild(file);\n return tag;\n}\n\nfunction enhanceCodeBlocks(root: HTMLElement) {\n const blocks = root.querySelectorAll<HTMLPreElement>(\"pre\");\n blocks.forEach((pre) => {\n if (pre.dataset.rtEnhanced === \"1\") return;\n pre.dataset.rtEnhanced = \"1\";\n pre.classList.add(\"rt-codeblock\");\n\n const variant = pre.dataset.variant;\n\n // Diff variant: split content on the @@---@@ marker and render a\n // side-by-side LCS diff. Skip the regular code-block chrome.\n if (variant === \"diff\") {\n const codeEl = pre.querySelector(\"code\");\n const src = codeEl?.textContent ?? \"\";\n const [beforeSrc = \"\", afterSrc = \"\"] = src.split(DIFF_SEPARATOR_RE);\n pre.innerHTML = renderDiff(beforeSrc, afterSrc, pre.dataset.language);\n\n // Per-side copy buttons. Each copies only its own snippet (no signs,\n // no line numbers — just the raw text the author originally pasted).\n // Wrap in half-width cells so the buttons sit at the top-right of\n // their respective column instead of bunching on one side.\n const bar = document.createElement(\"div\");\n bar.className = \"rt-diff-copy-bar\";\n const leftHalf = document.createElement(\"div\");\n leftHalf.className = \"rt-diff-copy-half\";\n leftHalf.appendChild(\n makeCopyButton(() => beforeSrc, {\n className: \"rt-diff-copy\",\n label: \"Copy before\",\n }),\n );\n const rightHalf = document.createElement(\"div\");\n rightHalf.className = \"rt-diff-copy-half\";\n rightHalf.appendChild(\n makeCopyButton(() => afterSrc, {\n className: \"rt-diff-copy\",\n label: \"Copy after\",\n }),\n );\n bar.appendChild(leftHalf);\n bar.appendChild(rightHalf);\n pre.prepend(bar);\n\n const label = buildCodeBlockLabel(pre);\n if (label) pre.prepend(label);\n return;\n }\n\n // Terminal variant: synthetic chrome (traffic lights) via CSS; render\n // a `$ ` prompt on every visible line so multi-line snippets read like a\n // real shell session. Copying yields just the commands without prompts.\n if (variant === \"terminal\") {\n pre.classList.add(\"rt-terminal\");\n const codeEl = pre.querySelector(\"code\");\n const source = codeEl?.textContent ?? \"\";\n if (codeEl) {\n // Default to shell highlighting when no explicit language is set —\n // a terminal block without `bash`/`sh` selected almost certainly\n // contains shell commands, and `tokenizeFor(\"sh\", …)` is safe to fall\n // back to (it just returns text tokens for content it can't classify).\n const lang = pre.dataset.language || \"sh\";\n const lines = source.split(\"\\n\");\n codeEl.innerHTML = lines\n .map(\n (line) =>\n `<span class=\"rt-term-line\"><span class=\"rt-term-prompt\" aria-hidden=\"true\">$</span> ${highlightLine(line, lang) || \"&nbsp;\"}</span>`,\n )\n .join(\"\");\n }\n pre.appendChild(makeCopyButton(() => source, { label: \"Copy commands\" }));\n return;\n }\n\n const label = buildCodeBlockLabel(pre);\n if (label) pre.prepend(label);\n\n pre.appendChild(\n makeCopyButton(\n () => pre.querySelector(\"code\")?.textContent ?? pre.innerText,\n ),\n );\n\n highlightCodeBlock(pre);\n });\n}\n\n// Inlined `tokyo-night-dark` highlight.js theme. Bundled as a string rather\n// than imported as a CSS file so the package works in SSR environments\n// (Node throws \"Unknown file extension '.css'\" otherwise). Injected once on\n// the client via `ensureCodeBlockStyles`.\nconst HLJS_THEME = `\npre code.hljs { display: block; overflow-x: auto; padding: 1em; }\ncode.hljs { padding: 3px 5px; }\n.hljs-meta, .hljs-comment { color: #565f89; }\n.hljs-tag, .hljs-doctag, .hljs-selector-id, .hljs-selector-class,\n.hljs-regexp, .hljs-template-tag, .hljs-selector-pseudo,\n.hljs-selector-attr, .hljs-variable.language_, .hljs-deletion { color: #f7768e; }\n.hljs-variable, .hljs-template-variable, .hljs-number, .hljs-literal,\n.hljs-type, .hljs-params, .hljs-link { color: #ff9e64; }\n.hljs-built_in, .hljs-attribute { color: #e0af68; }\n.hljs-selector-tag { color: #73daca; }\n.hljs-keyword, .hljs-title.function_, .hljs-title, .hljs-title.class_,\n.hljs-title.class_.inherited__, .hljs-subst, .hljs-property { color: #7dcfff; }\n.hljs-quote, .hljs-string, .hljs-symbol, .hljs-bullet,\n.hljs-addition { color: #9ece6a; }\n.hljs-code, .hljs-formula, .hljs-section { color: #7aa2f7; }\n.hljs-name, .hljs-operator, .hljs-char.escape_, .hljs-attr { color: #bb9af7; }\n.hljs-punctuation { color: #c0caf5; }\n.hljs { background: #1a1b26; color: #9aa5ce; }\n.hljs-emphasis { font-style: italic; }\n.hljs-strong { font-weight: bold; }\n`;\n\nconst CODEBLOCK_STYLE = `\n.rt-codeblock { position: relative; }\n.rt-codeblock[data-filename]:not([data-filename=\"\"]) { padding-top: 2rem; }\n.rt-codeblock__label {\n position: absolute; top: 0.45rem; left: 0.85rem;\n display: inline-flex; align-items: center; gap: 0.5rem;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n pointer-events: none;\n}\n.rt-codeblock__filename {\n font-size: 0.72rem; letter-spacing: 0.02em;\n color: #d1d5db;\n}\n.rt-codeblock__sep {\n color: #6b7280;\n font-size: 0.72rem;\n}\n.rt-codeblock__language {\n font-size: 0.6rem; letter-spacing: 0.08em;\n text-transform: lowercase;\n color: #9ca3af;\n padding: 0.05rem 0.35rem;\n border: 1px solid rgba(255,255,255,0.12);\n border-radius: 0.25rem;\n}\n.rt-codeblock__copy {\n position: absolute; top: 0.4rem; right: 0.4rem;\n display: inline-flex; align-items: center; justify-content: center;\n width: 1.75rem; height: 1.75rem; padding: 0;\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 0.375rem;\n background: rgba(255,255,255,0.04);\n color: #d1d5db;\n cursor: pointer;\n opacity: 0; transition: opacity 120ms ease, background 120ms ease, color 120ms ease;\n}\n.rt-codeblock:hover .rt-codeblock__copy,\n.rt-codeblock:focus-within .rt-codeblock__copy { opacity: 1; }\n.rt-codeblock__copy:hover { background: rgba(255,255,255,0.1); color: #fff; }\n.rt-codeblock__copy.is-copied { color: #34d399; opacity: 1; }\n@media (hover: none) { .rt-codeblock__copy { opacity: 1; } }\n.rt-quote-open, .rt-quote-close {\n font-family: Georgia, \"Times New Roman\", serif;\n font-size: 1.4em;\n line-height: 0;\n vertical-align: -0.15em;\n opacity: 0.6;\n user-select: none;\n}\n.rt-quote-open { margin-right: 0.15em; }\n.rt-quote-close { margin-left: 0.15em; }\n\n/* Callout chip ----------------------------------------------------------- */\n/* Layout: when a callout opts into an icon, use a 2-column grid so the chip\n sits left of the title + body. Consumers can override via classMap. */\naside[data-callout][data-icon]:not([data-icon=\"false\"]):not([data-icon=\"0\"]) {\n display: grid;\n grid-template-columns: auto 1fr;\n column-gap: 0.85rem;\n align-items: start;\n}\naside[data-callout][data-icon]:not([data-icon=\"false\"]):not([data-icon=\"0\"]) > .rt-callout-icon {\n grid-row: 1 / span 99;\n margin-top: 0.05rem;\n}\n.rt-callout-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.6rem;\n height: 1.6rem;\n border-radius: 0.4rem;\n color: #fff;\n background: #475569;\n flex-shrink: 0;\n}\n.rt-callout-icon[data-variant=\"info\"] { background: #2563eb; }\n.rt-callout-icon[data-variant=\"warning\"] { background: #d97706; }\n.rt-callout-icon[data-variant=\"success\"] { background: #16a34a; }\n.rt-callout-icon[data-variant=\"danger\"] { background: #dc2626; }\n.rt-callout-icon[data-variant=\"default\"] { background: #475569; }\n\n/* Collapsible (FAQ accordion) ------------------------------------------ */\n/* Native <details>/<summary> with a rotating chevron. Only structural\n styling lives here — colors, padding, and typography belong to\n consumers via the \\`collapsible\\` and \\`collapsibleTitle\\` classMap keys. */\ndetails[data-collapsible] > summary {\n cursor: pointer;\n list-style: none;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.75rem;\n}\ndetails[data-collapsible] > summary::-webkit-details-marker { display: none; }\ndetails[data-collapsible] > summary::after {\n content: \"\";\n width: 0.55rem;\n height: 0.55rem;\n border-right: 1.5px solid currentColor;\n border-bottom: 1.5px solid currentColor;\n transform: rotate(-45deg) translate(-0.1rem, 0.05rem);\n transition: transform 0.18s ease;\n opacity: 0.55;\n flex-shrink: 0;\n}\ndetails[data-collapsible][open] > summary::after {\n transform: rotate(45deg) translate(-0.05rem, -0.05rem);\n}\n/* highlight.js theme handles .hljs-* color classes; we only override the\n default .hljs background so the per-block chrome (dark bg, terminal,\n diff red/green rows) wins. */\n.rt-codeblock .hljs,\n.rt-codeblock code.hljs { background: transparent; padding: 0; }\n\n/* Terminal variant ------------------------------------------------------- */\n.rt-codeblock.rt-terminal,\n.rt-codeblock[data-variant=\"terminal\"] {\n position: relative;\n padding-top: 2.25rem;\n background: #0b0b0d;\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 0.65rem;\n box-shadow: 0 1px 0 rgba(255,255,255,0.04) inset,\n 0 10px 30px -10px rgba(0,0,0,0.6);\n}\n.rt-codeblock.rt-terminal::before,\n.rt-codeblock[data-variant=\"terminal\"]::before {\n content: \"\";\n position: absolute; top: 0; left: 0; right: 0; height: 1.75rem;\n background: linear-gradient(#1a1a1d, #141417);\n border-bottom: 1px solid rgba(255,255,255,0.06);\n border-radius: 0.65rem 0.65rem 0 0;\n}\n.rt-codeblock.rt-terminal::after,\n.rt-codeblock[data-variant=\"terminal\"]::after {\n content: \"\";\n position: absolute; top: 0.55rem; left: 0.75rem;\n width: 0.65rem; height: 0.65rem; border-radius: 50%;\n background: #ff5f57;\n box-shadow:\n 1.1rem 0 0 0 #febc2e,\n 2.2rem 0 0 0 #28c840;\n}\n.rt-codeblock.rt-terminal code,\n.rt-codeblock[data-variant=\"terminal\"] code {\n color: #d4d4d8;\n display: block;\n}\n.rt-term-line { display: block; white-space: pre-wrap; }\n.rt-term-prompt {\n color: #28c840;\n font-weight: 600;\n margin-right: 0.35em;\n user-select: none;\n}\n\n/* Diff variant ----------------------------------------------------------- */\n.rt-codeblock[data-variant=\"diff\"] {\n padding: 0;\n overflow: hidden;\n background: #0b0b0d;\n border: 1px solid rgba(255,255,255,0.08);\n}\n.rt-codeblock[data-variant=\"diff\"][data-filename]:not([data-filename=\"\"]) {\n padding-top: 2rem;\n}\n.rt-diff-table {\n width: 100%;\n border-collapse: collapse;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 0.78rem;\n line-height: 1.55;\n color: #e5e7eb;\n table-layout: fixed;\n}\n.rt-diff-table colgroup { display: none; }\n.rt-diff-table td {\n padding: 0 0.5rem;\n vertical-align: top;\n white-space: pre-wrap;\n word-break: break-word;\n}\n.rt-diff-table td.rt-diff-num {\n width: 2.25rem;\n text-align: right;\n color: rgba(156,163,175,0.55);\n user-select: none;\n background: rgba(255,255,255,0.02);\n}\n.rt-diff-table td.rt-diff-sign {\n width: 0.85rem;\n text-align: center;\n user-select: none;\n color: rgba(255,255,255,0.45);\n}\n.rt-diff-table td.rt-diff-line.rt-diff-rem {\n background: rgba(248,113,113,0.12);\n color: #fecaca;\n}\n.rt-diff-table tr:has(td.rt-diff-rem) td.rt-diff-sign:first-of-type {\n color: #f87171;\n}\n.rt-diff-table td.rt-diff-line.rt-diff-add {\n background: rgba(74,222,128,0.12);\n color: #bbf7d0;\n}\n.rt-diff-table tr:has(td.rt-diff-add) td.rt-diff-sign + td + td + td.rt-diff-sign {\n color: #4ade80;\n}\n.rt-diff-table td.rt-diff-line.rt-diff-empty {\n background: rgba(255,255,255,0.025);\n}\n.rt-diff-table tr td:nth-child(4) { border-left: 1px solid rgba(255,255,255,0.06); }\n.rt-diff-copy-bar {\n position: absolute; top: 0.4rem; left: 0; right: 0; z-index: 2;\n display: grid; grid-template-columns: 1fr 1fr;\n pointer-events: none;\n}\n.rt-diff-copy-half {\n display: flex;\n justify-content: flex-end;\n padding-right: 0.4rem;\n}\n.rt-diff-copy {\n pointer-events: auto;\n display: inline-flex; align-items: center; justify-content: center;\n width: 1.6rem; height: 1.6rem; padding: 0;\n border: 1px solid rgba(255,255,255,0.1);\n border-radius: 0.375rem;\n background: rgba(20,20,23,0.85);\n color: #d1d5db;\n cursor: pointer;\n opacity: 0; transition: opacity 120ms ease, background 120ms ease, color 120ms ease;\n}\n.rt-codeblock[data-variant=\"diff\"]:hover .rt-diff-copy,\n.rt-codeblock[data-variant=\"diff\"]:focus-within .rt-diff-copy { opacity: 1; }\n.rt-diff-copy:hover { background: rgba(0,0,0,0.92); color: #fff; }\n.rt-diff-copy.is-copied { color: #34d399; opacity: 1; }\n@media (hover: none) { .rt-diff-copy { opacity: 1; } }\n`;\n\nlet styleInjected = false;\nfunction ensureCodeBlockStyles() {\n if (styleInjected || typeof document === \"undefined\") return;\n if (document.getElementById(\"rt-codeblock-style\")) {\n styleInjected = true;\n return;\n }\n const tag = document.createElement(\"style\");\n tag.id = \"rt-codeblock-style\";\n tag.textContent = HLJS_THEME + \"\\n\" + CODEBLOCK_STYLE;\n document.head.appendChild(tag);\n styleInjected = true;\n}\n\ntype CalloutChip = { el: HTMLElement; variant: string };\n\nfunction calloutChipsEqual(a: CalloutChip[], b: CalloutChip[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i].el !== b[i].el || a[i].variant !== b[i].variant) return false;\n }\n return true;\n}\n\nfunction BuiltinCalloutIcon({ variant }: { variant: string }) {\n const html = CALLOUT_ICON_SVG[variant] ?? CALLOUT_ICON_SVG.default;\n return <span dangerouslySetInnerHTML={{ __html: html }} />;\n}\n\nexport function RichTextContent({\n html,\n classMap,\n as = \"div\",\n className,\n onReady,\n contentRef,\n calloutIcons,\n}: RichTextContentProps) {\n const merged = useMemo(\n () => mergeClassMap(DEFAULT_CLASS_MAP, classMap),\n [classMap],\n );\n const safe = useMemo(\n () => parseRichText(html, { classMap: merged }),\n [html, merged],\n );\n\n const ref = useRef<HTMLElement | null>(null);\n const [chips, setChips] = useState<CalloutChip[]>([]);\n\n useEffect(() => {\n ensureCodeBlockStyles();\n const root = ref.current;\n if (!root) return;\n if (contentRef) contentRef.current = root;\n\n // `dangerouslySetInnerHTML` rebuilds the subtree whenever the parsed HTML\n // changes — and on a parent re-render that produces a new `html` string\n // reference even with identical content (common with Apollo's\n // `cache-and-network` returning a fresh object after a background\n // refetch). The freshly-mounted `<pre>` / `<blockquote>` nodes carry no\n // `data-rt-*` markers, so re-enhancing is just a matter of re-running\n // the helpers. A `MutationObserver` makes that automatic: any subtree\n // mutation triggers a re-application, so syntax highlighting and copy\n // buttons survive every kind of re-render without the consumer having\n // to think about effect deps or stable prop identity.\n const apply = () => {\n // The enhancers themselves mutate the subtree (inject copy buttons,\n // rewrite `<code>` innerHTML for hljs). Disconnect while running so\n // the observer doesn't loop on its own writes.\n mo.disconnect();\n enhanceCodeBlocks(root);\n enhanceBlockquotes(root);\n const nextChips = enhanceCallouts(root);\n // Equality short-circuit so re-renders triggered by other DOM\n // mutations (highlighter writes, copy buttons) don't loop us through\n // setState → portal write → MO fires → apply → setState…\n setChips((prev) => (calloutChipsEqual(prev, nextChips) ? prev : nextChips));\n onReady?.(root);\n mo.observe(root, { childList: true, subtree: true });\n };\n\n let raf = 0;\n const mo = new MutationObserver(() => {\n // Coalesce bursts of mutations from a single React commit into one\n // enhancement pass.\n if (raf) return;\n raf = requestAnimationFrame(() => {\n raf = 0;\n apply();\n });\n });\n\n apply();\n\n return () => {\n mo.disconnect();\n if (raf) cancelAnimationFrame(raf);\n };\n }, [safe, onReady, contentRef]);\n\n // `createElement` avoids the JSX type explosion that happens when a dynamic\n // `<Tag />` widens to the union of every IntrinsicElement\n // (TS2590: Expression produces a union type that is too complex to represent).\n //\n // Pass the stable object ref directly — using an inline callback ref here\n // would be recreated on every render, causing React to null-then-reset the\n // ref on each commit. That churn breaks downstream observers\n // (`useTableOfContents`, custom MutationObservers) that expect the node\n // identity to be stable across renders of the same article.\n return (\n <Fragment>\n {createElement(as, {\n ref,\n className,\n dangerouslySetInnerHTML: { __html: safe },\n })}\n {chips.map((chip, i) =>\n createPortal(\n calloutIcons && chip.variant in calloutIcons ? (\n calloutIcons[chip.variant]\n ) : (\n <BuiltinCalloutIcon variant={chip.variant} />\n ),\n chip.el,\n `${chip.variant}:${i}`,\n ),\n )}\n </Fragment>\n );\n}\n","/**\n * Heading extraction helpers used to build tables of contents (ToC) from\n * rich-text HTML. Server-safe — no React, no DOM dependency in the HTML\n * variant. The DOM variant assigns missing `id`s in-place so anchor links\n * resolve immediately.\n */\n\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport interface ExtractedHeading {\n id: string;\n text: string;\n level: HeadingLevel;\n}\n\nexport interface ExtractHeadingsOptions {\n /** Levels to include. Defaults to `[2, 3]` — typical doc page outline. */\n levels?: ReadonlyArray<HeadingLevel>;\n /** Custom slug function. Defaults to a lowercase/kebab/diacritic-safe slug. */\n slugify?: (text: string, index: number) => string;\n}\n\nconst DEFAULT_LEVELS: ReadonlyArray<HeadingLevel> = [2, 3];\n\nexport function slugify(text: string): string {\n return text\n .normalize(\"NFKD\")\n .replace(/[̀-ͯ]/g, \"\")\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\nfunction decodeBasicEntities(s: string): string {\n return s\n .replace(/&nbsp;/g, \" \")\n .replace(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\");\n}\n\nfunction stripTags(s: string): string {\n return decodeBasicEntities(s.replace(/<[^>]+>/g, \" \"))\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction uniqueId(base: string, used: Map<string, number>): string {\n const seed = base || \"section\";\n const n = used.get(seed) ?? 0;\n used.set(seed, n + 1);\n return n === 0 ? seed : `${seed}-${n}`;\n}\n\n/**\n * Parse headings out of a raw HTML string. Returns headings in document\n * order with stable, de-duplicated IDs.\n *\n * If a heading already has an `id` attribute, it's preserved verbatim\n * (and reserved so later slugs don't collide with it).\n */\nexport function extractHeadingsFromHtml(\n html: string,\n options: ExtractHeadingsOptions = {},\n): ExtractedHeading[] {\n if (!html) return [];\n const levels = options.levels ?? DEFAULT_LEVELS;\n const slug = options.slugify ?? slugify;\n const used = new Map<string, number>();\n const out: ExtractedHeading[] = [];\n const re = /<h([1-6])\\b([^>]*)>([\\s\\S]*?)<\\/h\\1>/gi;\n let m: RegExpExecArray | null;\n let i = 0;\n while ((m = re.exec(html)) !== null) {\n const level = Number(m[1]) as HeadingLevel;\n if (!levels.includes(level)) continue;\n const attrs = m[2] ?? \"\";\n const inner = m[3] ?? \"\";\n const text = stripTags(inner);\n if (!text) continue;\n const explicitIdMatch = attrs.match(/\\bid\\s*=\\s*(\"([^\"]*)\"|'([^']*)'|(\\S+))/i);\n let id: string;\n if (explicitIdMatch) {\n id = explicitIdMatch[2] ?? explicitIdMatch[3] ?? explicitIdMatch[4] ?? \"\";\n if (id) used.set(id, (used.get(id) ?? 0) + 1);\n } else {\n id = uniqueId(slug(text, i), used);\n }\n out.push({ id, text, level });\n i++;\n }\n return out;\n}\n\n/**\n * Walk a rendered DOM subtree, collect headings, and assign missing `id`s\n * in-place so anchor links resolve immediately. Also sets `scrollMarginTop`\n * on each heading when `scrollMarginTop` is provided so navigation lands\n * cleanly below a sticky header.\n */\nexport function extractHeadingsFromElement(\n root: HTMLElement,\n options: ExtractHeadingsOptions & { scrollMarginTop?: number } = {},\n): ExtractedHeading[] {\n const levels = options.levels ?? DEFAULT_LEVELS;\n const slug = options.slugify ?? slugify;\n const selector = levels.map((l) => `h${l}`).join(\",\");\n const nodes = root.querySelectorAll<HTMLHeadingElement>(selector);\n const used = new Map<string, number>();\n // Reserve already-present IDs so generated ones don't collide.\n nodes.forEach((n) => {\n if (n.id) used.set(n.id, (used.get(n.id) ?? 0) + 1);\n });\n const out: ExtractedHeading[] = [];\n let i = 0;\n nodes.forEach((node) => {\n const level = Number(node.tagName.slice(1)) as HeadingLevel;\n const text = (node.textContent ?? \"\").replace(/\\s+/g, \" \").trim();\n if (!text) return;\n if (!node.id) {\n node.id = uniqueId(slug(text, i), used);\n }\n if (options.scrollMarginTop != null) {\n node.style.scrollMarginTop = `${options.scrollMarginTop}px`;\n }\n out.push({ id: node.id, text, level });\n i++;\n });\n return out;\n}\n","\"use client\";\n\nimport { useEffect, useState, type RefObject } from \"react\";\nimport {\n extractHeadingsFromElement,\n type ExtractedHeading,\n type HeadingLevel,\n} from \"../utils/extractHeadings\";\n\nexport interface UseTableOfContentsOptions {\n /** Heading levels to include. Defaults to `[2, 3]`. */\n levels?: ReadonlyArray<HeadingLevel>;\n /**\n * Re-collect headings whenever this value changes. Pass the article slug\n * (or any stable identifier) so swapping content rebuilds the ToC.\n */\n contentKey?: string | number | null;\n /** Pixels to subtract from heading scroll-into-view target. Default 24. */\n scrollMarginTop?: number;\n /**\n * Distance from the top of the viewport (in px) at which a heading becomes\n * \"active\". A heading is considered active once its top edge has scrolled\n * past this line. Default `96` — works well with a sticky header that\n * stands ~60–80px tall.\n */\n activationOffset?: number;\n}\n\nexport interface UseTableOfContentsResult {\n items: ExtractedHeading[];\n activeId: string;\n}\n\n/**\n * Build a table of contents from a rendered element and track which\n * heading is currently in view via IntersectionObserver. Resilient to\n * content swaps when `contentKey` is provided.\n *\n * Usage:\n * ```tsx\n * const ref = useRef<HTMLDivElement>(null);\n * const { items, activeId } = useTableOfContents(ref, {\n * contentKey: article.slug,\n * levels: [2, 3],\n * });\n * ```\n */\nexport function useTableOfContents(\n ref: RefObject<HTMLElement | null>,\n options: UseTableOfContentsOptions = {},\n): UseTableOfContentsResult {\n const {\n levels,\n contentKey = null,\n scrollMarginTop = 24,\n activationOffset = 96,\n } = options;\n const [items, setItems] = useState<ExtractedHeading[]>([]);\n const [activeId, setActiveId] = useState<string>(\"\");\n\n // Collection. Re-runs on contentKey change and falls back to a\n // MutationObserver so async-rendered content (e.g. lazy code highlight)\n // doesn't leave the ToC stale.\n useEffect(() => {\n const root = ref.current;\n if (!root) {\n setItems([]);\n setActiveId(\"\");\n return;\n }\n\n let raf = 0;\n const collect = () => {\n const next = extractHeadingsFromElement(root, {\n levels,\n scrollMarginTop,\n });\n // Always replace the items array. A content-equality short-circuit\n // here looks like a free optimization but it's a footgun: when an\n // article is revisited (same slug → same heading text/IDs), the new\n // article body lives on freshly-mounted DOM nodes. Re-using the\n // previous items array means the downstream IntersectionObserver\n // effect doesn't re-run, so it stays attached to the detached DOM\n // from the previous visit and never fires again.\n setItems(next);\n setActiveId((prev) =>\n next.some((h) => h.id === prev) ? prev : (next[0]?.id ?? \"\"),\n );\n };\n\n // First pass — wait one frame so dangerouslySetInnerHTML has painted.\n raf = requestAnimationFrame(collect);\n\n const mo = new MutationObserver(() => {\n if (raf) cancelAnimationFrame(raf);\n raf = requestAnimationFrame(collect);\n });\n mo.observe(root, { childList: true, subtree: true, characterData: true });\n\n return () => {\n mo.disconnect();\n if (raf) cancelAnimationFrame(raf);\n };\n }, [ref, contentKey, levels, scrollMarginTop]);\n\n // Active-heading tracking.\n //\n // Geometric pick: active = the last heading whose top edge has scrolled\n // past `activationOffset`. This is monotonic with scroll position — the\n // active heading only advances when you scroll past a new one and only\n // retreats when an earlier one scrolls back below the activation line.\n // Avoids the \"snap back to a previous heading when nothing's in the IO\n // band\" flicker.\n //\n // IntersectionObserver is used purely as a cheap wake-up trigger so we\n // don't need a `scroll` listener; an rAF guard collapses bursts.\n useEffect(() => {\n if (items.length === 0) return;\n const targets = items\n .map((it) => document.getElementById(it.id))\n .filter((el): el is HTMLElement => el !== null);\n if (targets.length === 0) return;\n\n let raf = 0;\n const compute = () => {\n raf = 0;\n let activeIdx = 0;\n for (let i = 0; i < items.length; i++) {\n const el = document.getElementById(items[i].id);\n if (!el) continue;\n // `top - activationOffset <= 0` means this heading has crossed\n // the activation line. Loop forward and take the LAST one that\n // qualifies so a single scroll position has exactly one answer.\n if (el.getBoundingClientRect().top - activationOffset <= 0) {\n activeIdx = i;\n } else {\n break;\n }\n }\n\n // End-of-page rescue. Headings near the bottom (and tightly-spaced\n // pairs like H2 followed immediately by H3) may not have enough\n // content below them to ever scroll past the activation line — they\n // would never become active. When the document is scrolled to (or\n // past) the bottom, walk backwards through the headings and activate\n // the last one whose top is still inside the viewport. This makes the\n // ToC reach its final heading on every page and keeps tightly-packed\n // sub-headings reachable.\n const scroller = document.scrollingElement || document.documentElement;\n const scrollY = window.scrollY;\n const viewportH = window.innerHeight;\n const atBottom = scrollY + viewportH >= scroller.scrollHeight - 2;\n if (atBottom) {\n for (let i = items.length - 1; i > activeIdx; i--) {\n const el = document.getElementById(items[i].id);\n if (el && el.getBoundingClientRect().top < viewportH) {\n activeIdx = i;\n break;\n }\n }\n }\n\n setActiveId(items[activeIdx].id);\n };\n const schedule = () => {\n if (raf) return;\n raf = requestAnimationFrame(compute);\n };\n\n // Observe every heading with a 1px band at the activation line. Any\n // heading crossing in or out of that line wakes us up to recompute.\n const io = new IntersectionObserver(schedule, {\n rootMargin: `-${activationOffset}px 0px -${Math.max(0, window.innerHeight - activationOffset - 1)}px 0px`,\n threshold: 0,\n });\n targets.forEach((t) => io.observe(t));\n\n // Also catch resize (band height depends on innerHeight) and\n // scroll-restoration on mount.\n window.addEventListener(\"resize\", schedule, { passive: true });\n compute();\n\n return () => {\n io.disconnect();\n window.removeEventListener(\"resize\", schedule);\n if (raf) cancelAnimationFrame(raf);\n };\n }, [items, activationOffset]);\n\n return { items, activeId };\n}\n"]}
1
+ {"version":3,"sources":["../src/provider/context.ts","../src/apollo/errorLink.ts","../src/apollo/createApolloClient.ts","../src/provider/AsteroidCMSProvider.tsx","../src/hooks/useCmsContent.tsx","../src/hooks/useCmsMutate.tsx","../src/utils/cmsImage.ts","../src/components/richTextParser.ts","../src/components/RichTextContent.tsx","../src/utils/extractHeadings.ts"],"names":["createContext","useContext","ErrorLink","CombinedGraphQLErrors","CombinedProtocolErrors","SetContextLink","HttpLink","ApolloClient","ApolloLink","InMemoryCache","useMemo","jsx","ApolloProvider","alias","gql","useQuery","useMutation","end","next","escapeHtml","hljs","i","j","label","memo","RichTextContent","useRef","useState","useLayoutEffect","Fragment","createElement","createPortal"],"mappings":"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AA;AAAA,CAAA;AAuBnB,IAAM,eAAA,GAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","file":"client.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { ResolvedAsteroidCMSConfig } from \"./types\";\n\nexport const AsteroidCMSContext = createContext<ResolvedAsteroidCMSConfig | null>(null);\n\nexport function useAsteroidCMSConfig(): ResolvedAsteroidCMSConfig {\n const ctx = useContext(AsteroidCMSContext);\n if (!ctx) {\n throw new Error(\n \"useAsteroidCMSConfig must be used inside <AsteroidCMSProvider>. \" +\n \"Wrap your app with <AsteroidCMSProvider cmsUrl=... apiKey=... />.\",\n );\n }\n return ctx;\n}\n","import { CombinedGraphQLErrors, CombinedProtocolErrors } from \"@apollo/client\";\nimport { ErrorLink } from \"@apollo/client/link/error\";\n\ntype OnError = (error: unknown) => void;\n\n/**\n * Lightweight error link. Forwards every error to the consumer-supplied\n * `onError` handler (configured on the provider). No toasts, no auth, no\n * token refresh — the package is auth-key only.\n */\nexport function createErrorLink(onError?: OnError) {\n return new ErrorLink(({ error }) => {\n if (!onError) return;\n if (CombinedGraphQLErrors.is(error)) {\n error.errors.forEach((e) => onError(e));\n } else if (CombinedProtocolErrors.is(error)) {\n error.errors.forEach((e) => onError(e));\n } else {\n onError(error);\n }\n });\n}\n","import {\n ApolloClient,\n ApolloLink,\n HttpLink,\n InMemoryCache,\n} from \"@apollo/client\";\nimport { SetContextLink } from \"@apollo/client/link/context\";\nimport { createErrorLink } from \"./errorLink\";\nimport type { AsteroidCMSConfig, ResolvedAsteroidCMSConfig } from \"../provider/types\";\n\ndeclare module \"@apollo/client\" {\n namespace ApolloClient.DeclareDefaultOptions {\n interface WatchQuery {\n errorPolicy: \"all\";\n returnPartialData: false;\n }\n interface Query {\n errorPolicy: \"all\";\n }\n interface Mutate {\n errorPolicy: \"none\";\n }\n }\n}\n\nconst trimTrailingSlash = (s: string) => s.replace(/\\/+$/, \"\");\nconst ensureLeadingSlash = (s: string) => (s.startsWith(\"/\") ? s : `/${s}`);\n\nexport function resolveConfig(config: AsteroidCMSConfig): ResolvedAsteroidCMSConfig {\n if (!config.cmsUrl) throw new Error(\"AsteroidCMSProvider: `cmsUrl` is required.\");\n if (!config.apiKey) throw new Error(\"AsteroidCMSProvider: `apiKey` is required.\");\n\n return {\n cmsUrl: trimTrailingSlash(config.cmsUrl),\n apiKey: config.apiKey,\n graphqlPath: ensureLeadingSlash(config.graphqlPath ?? \"/graphql\"),\n mediaPath: ensureLeadingSlash(config.mediaPath ?? \"/media/canonical\"),\n headers: config.headers ?? {},\n onError: config.onError,\n };\n}\n\nexport function createApolloClient(config: AsteroidCMSConfig): ApolloClient {\n if (config.client) return config.client;\n\n const resolved = resolveConfig(config);\n const uri = `${resolved.cmsUrl}${resolved.graphqlPath}`;\n\n const authLink = new SetContextLink((_op, prevContext) => {\n const prevHeaders = (prevContext as { headers?: Record<string, string> }).headers ?? {};\n return {\n ...prevContext,\n headers: {\n ...prevHeaders,\n \"x-api-key\": resolved.apiKey,\n ...resolved.headers,\n },\n };\n });\n\n const httpLink = new HttpLink({ uri });\n\n return new ApolloClient({\n link: ApolloLink.from([createErrorLink(resolved.onError), authLink, httpLink]),\n cache: new InMemoryCache(config.cacheConfig),\n defaultOptions: {\n watchQuery: {\n fetchPolicy: \"cache-and-network\",\n errorPolicy: \"all\",\n returnPartialData: false,\n },\n query: { fetchPolicy: \"network-only\", errorPolicy: \"all\" },\n mutate: { errorPolicy: \"none\" },\n },\n ...config.apolloOptions,\n });\n}\n","import { useMemo, type PropsWithChildren } from \"react\";\nimport { ApolloProvider } from \"@apollo/client/react\";\nimport { AsteroidCMSContext } from \"./context\";\nimport { createApolloClient, resolveConfig } from \"../apollo/createApolloClient\";\nimport type { AsteroidCMSConfig } from \"./types\";\n\nexport type AsteroidCMSProviderProps = PropsWithChildren<AsteroidCMSConfig>;\n\n/**\n * Root provider for `@asteroidcms/core-utils`.\n *\n * Wrap your app once at the top level:\n *\n * ```tsx\n * <AsteroidCMSProvider cmsUrl=\"https://cms.example.com\" apiKey=\"...\">\n * <App />\n * </AsteroidCMSProvider>\n * ```\n *\n * Everything below — `useCmsContent`, `useCmsMutate`, `useCmsImage`,\n * `<RichTextContent>` — picks up `cmsUrl` and `apiKey` from this provider.\n */\nexport function AsteroidCMSProvider({ children, ...config }: AsteroidCMSProviderProps) {\n const resolved = useMemo(() => resolveConfig(config), [\n config.cmsUrl,\n config.apiKey,\n config.graphqlPath,\n config.mediaPath,\n config.headers,\n config.onError,\n ]);\n\n const client = useMemo(\n () => createApolloClient(config),\n // The client is intentionally rebuilt only when the identity-shaping props change.\n [\n config.client,\n resolved.cmsUrl,\n resolved.apiKey,\n resolved.graphqlPath,\n config.cacheConfig,\n config.apolloOptions,\n ],\n );\n\n return (\n <AsteroidCMSContext.Provider value={resolved}>\n <ApolloProvider client={client}>{children}</ApolloProvider>\n </AsteroidCMSContext.Provider>\n );\n}\n\nexport default AsteroidCMSProvider;\n","import { type DocumentNode, gql } from \"@apollo/client\";\nimport { useQuery } from \"@apollo/client/react\";\n\ntype FieldSelector = string | { field: string; as?: string };\n\ntype ReferenceExpansion = {\n field: string;\n as?: string;\n single?: boolean;\n select?: readonly (FieldSelector | ReferenceExpansion)[];\n};\n\ntype ContentStatus = \"DRAFT\" | \"PUBLISHED\" | \"ARCHIVED\";\n\ntype CmsSearchCondition = {\n field: string;\n value: string;\n mode?: string;\n};\n\nexport type UseCmsContentOptions = {\n schema_slug: string;\n entrySlug?: string;\n select?: readonly (FieldSelector | ReferenceExpansion)[];\n fullData?: boolean;\n limit?: number;\n offset?: number;\n status?: ContentStatus;\n filter?: Record<string, string | number | boolean | null>;\n search?: CmsSearchCondition[];\n variables?: Record<string, any>;\n};\n\n/**\n * React hook for querying content from Asteroid CMS via a flexible GraphQL API.\n *\n * Supports single-entry fetches (`entrySlug`) and paginated/filtered lists,\n * with arbitrarily nested reference expansion and field aliasing.\n */\nexport function useCmsContent<T = unknown>({\n schema_slug,\n entrySlug,\n select = [],\n fullData = false,\n limit,\n offset,\n status = \"PUBLISHED\",\n filter,\n search,\n variables = {},\n}: UseCmsContentOptions) {\n const isSingle = !!entrySlug;\n\n const buildSelection = (\n items: readonly (FieldSelector | ReferenceExpansion)[] = [],\n ): string => {\n const lines: string[] = [];\n\n items.forEach((item) => {\n if (typeof item === \"string\") {\n lines.push(`${item}: dataField(slug: \"${item}\")`);\n } else if (\"field\" in item && typeof item.field === \"string\") {\n if (!(\"select\" in item)) {\n const alias = item.as || item.field;\n lines.push(`${alias}: dataField(slug: \"${item.field}\")`);\n return;\n }\n\n const alias = item.as || item.field;\n const resolver = item.single\n ? \"expandedReferenceObject\"\n : \"expandedReference\";\n\n const subSelection = item.select?.length\n ? buildSelection(item.select)\n : \"data { ... }\";\n\n lines.push(`\n ${alias}: ${resolver}(slug: \"${item.field}\") {\n ${subSelection}\n }\n `);\n }\n });\n\n return lines.join(\"\\n \").trim();\n };\n\n const selectionParts: string[] = [];\n if (fullData) selectionParts.push(\"data\");\n if (select.length > 0) {\n const userSelection = buildSelection(select);\n if (userSelection) selectionParts.push(userSelection);\n }\n const selection = selectionParts.join(\"\\n \").trim() || \"id\";\n\n const queryVariables: Record<string, any> = {\n schema_slug,\n ...(entrySlug && { slug: entrySlug }),\n ...variables,\n };\n const fieldArgParts: string[] = [\"schema_slug: $schema_slug\"];\n\n if (!isSingle) {\n if (typeof limit === \"number\" && limit >= 0) {\n fieldArgParts.push(\"limit: $limit\");\n queryVariables.limit = limit;\n }\n if (typeof offset === \"number\" && offset >= 0) {\n fieldArgParts.push(\"offset: $offset\");\n queryVariables.offset = offset;\n }\n if (status) {\n fieldArgParts.push(\"status: $status\");\n queryVariables.status = status;\n }\n\n const hasSearch = Array.isArray(search) && search.length > 0;\n const hasFilter =\n filter && typeof filter === \"object\" && Object.keys(filter).length > 0;\n\n if (hasSearch || hasFilter) {\n const mergedFilter: Record<string, unknown> = hasFilter ? { ...filter } : {};\n if (hasSearch) {\n for (const condition of search!) {\n mergedFilter[condition.field] = {\n regex: true,\n value: condition.value,\n mode: condition.mode ?? \"i\",\n };\n }\n }\n fieldArgParts.push(\"data: $filter\");\n queryVariables.filter = mergedFilter;\n }\n }\n\n const varDecls: string[] = [\"$schema_slug: String!\"];\n if (\"limit\" in queryVariables) varDecls.push(\"$limit: Float\");\n if (\"offset\" in queryVariables) varDecls.push(\"$offset: Float\");\n if (\"status\" in queryVariables) varDecls.push(\"$status: ContentStatus\");\n if (\"filter\" in queryVariables) varDecls.push(\"$filter: JSONObject\");\n\n const varBlock = varDecls.length > 0 ? `(\\n ${varDecls.join(\"\\n \")}\\n)` : \"\";\n const contentFieldArgs = fieldArgParts.join(\", \");\n const queryStr = isSingle\n ? `\n query Get${schema_slug}Entry($schema_slug: String!, $slug: String!) {\n entry: contentEntry(schema_slug: $schema_slug, slug: $slug) {\n ${selection}\n }\n }\n `\n : `\n query Get${schema_slug}Entries${varBlock} {\n entries: contentEntries(${contentFieldArgs}) {\n ${selection}\n }\n }\n `;\n\n const GET_CONTENT = gql(queryStr) as DocumentNode;\n\n const { loading, error, data, ...rest } = useQuery(GET_CONTENT, {\n variables: queryVariables,\n skip: !schema_slug || (isSingle && !entrySlug),\n });\n\n const typed = data as { entry?: unknown; entries?: unknown } | undefined;\n const result = isSingle ? typed?.entry : typed?.entries;\n\n return {\n loading,\n error,\n data: result as T | undefined,\n ...rest,\n };\n}\n","import { gql } from \"@apollo/client\";\nimport { useMutation } from \"@apollo/client/react\";\n\ntype FieldSelector =\n | string\n | {\n field: string;\n as?: string;\n single?: boolean;\n select?: readonly (FieldSelector | ReferenceExpansion)[];\n };\n\ntype ReferenceExpansion = {\n field: string;\n as?: string;\n single?: boolean;\n select?: readonly (FieldSelector | ReferenceExpansion)[];\n};\n\ntype MutationType = \"create\" | \"update\" | \"delete\";\n\nexport type UseCmsMutateOptions = {\n schema_slug: string;\n entrySlug?: string;\n select?: readonly (FieldSelector | ReferenceExpansion)[];\n fullData?: boolean;\n mutationType?: MutationType;\n entryId?: string;\n variables?: Record<string, any>;\n};\n\n/**\n * React hook for mutating content in Asteroid CMS (`create` / `update` / `delete`).\n * Uses the same selection syntax as `useCmsContent`.\n */\nexport function useCmsMutate<TData = unknown>({\n schema_slug,\n select = [],\n fullData = false,\n mutationType = \"create\",\n entryId,\n variables: inputVariables = {},\n}: UseCmsMutateOptions) {\n const buildSelection = (\n items: readonly (FieldSelector | ReferenceExpansion)[] = [],\n ): string => {\n const lines: string[] = [];\n\n for (const item of items) {\n if (typeof item === \"string\") {\n lines.push(`${item}: dataField(slug: \"${item}\")`);\n continue;\n }\n\n const { field, as, single, select: subSelect } = item;\n const alias = as || field;\n\n if (!subSelect?.length) {\n lines.push(`${alias}: dataField(slug: \"${field}\")`);\n continue;\n }\n\n const resolver = single ? \"expandedReferenceObject\" : \"expandedReference\";\n const sub = buildSelection(subSelect) || \"id slug\";\n\n lines.push(`\n ${alias}: ${resolver}(slug: \"${field}\") {\n id\n slug\n ${sub}\n }\n `);\n }\n\n return lines.join(\"\\n \").trim();\n };\n\n const userSelection = buildSelection(select);\n let selection = fullData ? \"data\" : \"\";\n\n if (userSelection) {\n selection = selection ? `${selection}\\n ${userSelection}` : userSelection;\n }\n\n if (!selection) {\n selection = \"id slug status version created_at updated_at\";\n }\n\n const operation = mutationType;\n const mutationName = `${operation}ContentEntry`;\n\n const varDecls: string[] = [\"$schema_slug: String!\"];\n const callArgs: string[] = [\"schema_slug: $schema_slug\"];\n\n if (operation === \"create\" || operation === \"update\") {\n varDecls.unshift(\"$data: JSONObject!\");\n callArgs.unshift(\"data: $data\");\n }\n if (operation === \"update\" || operation === \"delete\") {\n varDecls.push(\"$id: ID!\");\n callArgs.push(\"id: $id\");\n }\n\n const returnFields = selection.includes(\"data\")\n ? selection\n : `${selection}\\n data`;\n\n const MUTATION = gql`\n mutation ${mutationName}(${varDecls.join(\", \")}) {\n result: ${mutationName}(${callArgs.join(\", \")}) {\n id\n status\n version\n created_at\n updated_at\n schema {\n id\n slug\n }\n ${returnFields}\n }\n }\n `;\n\n const mutationVariables = {\n schema_slug,\n ...(operation === \"update\" || operation === \"delete\" ? { id: entryId } : {}),\n ...inputVariables,\n };\n\n if ((operation === \"update\" || operation === \"delete\") && !entryId) {\n console.warn(`useCmsMutate: entryId is required for ${operation}`);\n }\n\n const [mutateFn, mutationResult] = useMutation(MUTATION, {\n variables: mutationVariables,\n });\n\n const resultData = (mutationResult.data as { result?: TData } | null | undefined)?.result;\n\n return {\n mutate: mutateFn,\n ...mutationResult,\n data: resultData,\n } as const;\n}\n","import { useAsteroidCMSConfig } from \"../provider/context\";\n\n/**\n * Build a canonical media URL from an asset id. Pass `cmsUrl` explicitly when\n * calling outside of React (e.g. SSR loaders, scripts). Inside components,\n * prefer `useCmsImage()`.\n */\nexport function cmsImage(\n id: string | undefined,\n options: { cmsUrl: string; mediaPath?: string },\n): string {\n if (!id) return \"\";\n const base = options.cmsUrl.replace(/\\/+$/, \"\");\n const path = (options.mediaPath ?? \"/media/canonical\").replace(/^\\/?/, \"/\");\n return `${base}${path}/${id}`;\n}\n\n/** Hook variant that pulls `cmsUrl`/`mediaPath` from the provider. */\nexport function useCmsImage(): (id?: string) => string {\n const { cmsUrl, mediaPath } = useAsteroidCMSConfig();\n return (id?: string) => cmsImage(id, { cmsUrl, mediaPath });\n}\n","/**\n * Portable rich-text parser for CMS content.\n *\n * Zero runtime dependencies. Safe to copy into any consuming frontend.\n *\n * Pipeline:\n * 1. Detect & migrate legacy \"markdown-in-divs\" content to clean semantic HTML.\n * 2. Walk the HTML through a tag/attribute allowlist (strips <script>, event\n * handlers, javascript: URLs, unknown tags).\n * 3. Merge per-tag and per-variant classes from `options.classMap`.\n *\n * Idempotent: parseRichText(parseRichText(x, opts), opts) === parseRichText(x, opts).\n */\n\nexport type RichTextClassKey =\n | \"p\"\n | \"br\"\n | \"hr\"\n | \"h1\"\n | \"h2\"\n | \"h3\"\n | \"h4\"\n | \"h5\"\n | \"h6\"\n | \"ul\"\n | \"ol\"\n | \"li\"\n | \"blockquote\"\n | \"pre\"\n | \"code\"\n | \"inlineCode\"\n | \"a\"\n | \"strong\"\n | \"em\"\n | \"u\"\n | \"s\"\n | \"kbd\"\n | \"table\"\n | \"tableWrapper\"\n | \"thead\"\n | \"tbody\"\n | \"tr\"\n | \"th\"\n | \"td\"\n | \"figure\"\n | \"figcaption\"\n | \"img\"\n | \"span\"\n | \"callout\"\n | \"calloutTitle\"\n | \"collapsible\"\n | \"collapsibleTitle\";\n\nexport type RichTextClassMap = Partial<Record<RichTextClassKey, string>> & {\n /** Variant overrides keyed as `${matchKey}:${variant}`, e.g. \"callout:warning\". */\n variants?: Record<string, string>;\n};\n\nexport interface ParseRichTextOptions {\n classMap?: RichTextClassMap;\n /** Tag allowlist override. Defaults to a safe semantic set. */\n allowlist?: ReadonlyArray<string>;\n /**\n * When `true` (default), inject slugified `id` attributes on `<h1>`–`<h6>`\n * tags that don't already have one. Lets ToC anchors resolve from the\n * server-rendered markup without a client-side mutation step.\n */\n autoHeadingIds?: boolean;\n}\n\nconst DEFAULT_ALLOWLIST: ReadonlyArray<string> = [\n \"p\",\n \"br\",\n \"hr\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"ul\",\n \"ol\",\n \"li\",\n \"blockquote\",\n \"pre\",\n \"code\",\n \"kbd\",\n \"a\",\n \"strong\",\n \"em\",\n \"u\",\n \"b\",\n \"i\",\n \"s\",\n \"strike\",\n \"del\",\n \"mark\",\n \"small\",\n \"sub\",\n \"sup\",\n \"table\",\n \"thead\",\n \"tbody\",\n \"tfoot\",\n \"tr\",\n \"th\",\n \"td\",\n \"colgroup\",\n \"col\",\n \"figure\",\n \"figcaption\",\n \"img\",\n \"aside\",\n \"section\",\n \"article\",\n \"div\",\n \"span\",\n \"details\",\n \"summary\",\n];\n\n/** Per-tag attribute allowlist. Global attrs from GLOBAL_ALLOWED_ATTRS apply to all. */\nconst ALLOWED_ATTRS: Record<string, ReadonlyArray<string>> = {\n a: [\"href\", \"title\", \"target\", \"rel\"],\n img: [\"src\", \"alt\", \"title\", \"width\", \"height\", \"loading\"],\n th: [\"colspan\", \"rowspan\", \"scope\"],\n td: [\"colspan\", \"rowspan\"],\n col: [\"span\", \"width\"],\n colgroup: [\"span\"],\n table: [\"border\", \"cellpadding\", \"cellspacing\"],\n span: [\"style\"],\n details: [\"open\"],\n};\n\n/**\n * Tag → allowlisted CSS property names. Inline `style` is otherwise blocked\n * by the sanitizer; properties listed here are extracted and re-emitted with\n * value-level validation.\n */\nconst ALLOWED_STYLE_PROPS: Record<string, ReadonlyArray<string>> = {\n span: [\"font-size\"],\n};\n\n/** Strict per-property value validators for inline `style` declarations. */\nconst STYLE_VALUE_VALIDATORS: Record<string, (value: string) => boolean> = {\n \"font-size\": (v) => /^\\d{1,3}(?:\\.\\d+)?(?:px|rem|em|%)$/.test(v.trim()),\n};\n\nfunction sanitizeStyle(tag: string, style: string): string {\n const allowed = ALLOWED_STYLE_PROPS[tag];\n if (!allowed || !style) return \"\";\n const out: string[] = [];\n for (const decl of style.split(\";\")) {\n const idx = decl.indexOf(\":\");\n if (idx === -1) continue;\n const name = decl.slice(0, idx).trim().toLowerCase();\n const value = decl.slice(idx + 1).trim();\n if (!allowed.includes(name)) continue;\n const validate = STYLE_VALUE_VALIDATORS[name];\n if (!validate || !validate(value)) continue;\n out.push(`${name}: ${value}`);\n }\n return out.join(\"; \");\n}\n\nconst GLOBAL_ALLOWED_ATTRS: ReadonlyArray<string> = [\n \"id\",\n \"class\",\n \"lang\",\n \"dir\",\n \"data-variant\",\n \"data-callout\",\n \"data-title\",\n \"data-callout-title\",\n \"data-language\",\n \"data-filename\",\n \"data-icon\",\n];\n\nconst URL_ATTRS = new Set([\"href\", \"src\"]);\n\n/* -------------------------------------------------------------------------- */\n/* Public API */\n/* -------------------------------------------------------------------------- */\n\nexport function parseRichText(\n html: string,\n options: ParseRichTextOptions = {},\n): string {\n if (!html || typeof html !== \"string\") return \"\";\n\n let working = isLegacyFormat(html) ? migrateLegacyToHtml(html) : html;\n working = removeEmptyParagraphs(working);\n working = upgradeStandaloneImages(working);\n working = upgradeAuthoredBlockquotes(working);\n working = flattenTableCellParagraphs(working);\n working = sanitizeAndStyle(working, options);\n if (options.autoHeadingIds !== false) {\n working = injectHeadingIds(working);\n }\n return working;\n}\n\n/**\n * Add a slugified `id` to each `<h1>`–`<h6>` that doesn't already have one.\n * Pure string transform; safe to run as a post-pass after sanitization.\n */\nfunction injectHeadingIds(html: string): string {\n const used = new Map<string, number>();\n // First, reserve existing IDs so generated slugs don't collide with them.\n const existingRe = /<h[1-6]\\b[^>]*\\bid\\s*=\\s*(\"([^\"]*)\"|'([^']*)'|(\\S+))/gi;\n let em: RegExpExecArray | null;\n while ((em = existingRe.exec(html)) !== null) {\n const id = em[2] ?? em[3] ?? em[4] ?? \"\";\n if (id) used.set(id, (used.get(id) ?? 0) + 1);\n }\n return html.replace(\n /<(h[1-6])\\b([^>]*)>([\\s\\S]*?)<\\/\\1>/gi,\n (full, tag: string, attrs: string, inner: string) => {\n if (/\\bid\\s*=/i.test(attrs)) return full;\n const text = inner\n .replace(/<[^>]+>/g, \" \")\n .replace(/&nbsp;/g, \" \")\n .replace(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/\\s+/g, \" \")\n .trim();\n if (!text) return full;\n const base = slugifyHeading(text) || tag;\n const n = used.get(base) ?? 0;\n used.set(base, n + 1);\n const id = n === 0 ? base : `${base}-${n}`;\n return `<${tag}${attrs} id=\"${id}\">${inner}</${tag}>`;\n },\n );\n}\n\nfunction slugifyHeading(text: string): string {\n return text\n .normalize(\"NFKD\")\n .replace(/[̀-ͯ]/g, \"\")\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\n/**\n * Tiptap stores table-cell content as `<p>` blocks (`<td><p>x</p></td>`),\n * which produces unwanted vertical margin and an extra block element when\n * consumers style table cells. Unwrap the paragraphs so cells hold inline\n * content directly. Multiple `<p>` siblings inside the same cell are joined\n * with `<br />` so line breaks survive.\n */\nfunction flattenTableCellParagraphs(html: string): string {\n return html.replace(\n /<(th|td)\\b([^>]*)>([\\s\\S]*?)<\\/\\1>/gi,\n (_full, tag: string, attrs: string, inner: string) => {\n let flat = inner;\n // Drop opening <p ...> tags.\n flat = flat.replace(/<p\\b[^>]*>/gi, \"\");\n // Replace closing </p> followed by more content with a <br/>, drop trailing ones.\n flat = flat.replace(/<\\/p>(\\s*)(?=\\S)/gi, \"<br />$1\");\n flat = flat.replace(/<\\/p>\\s*$/i, \"\");\n return `<${tag}${attrs}>${flat.trim()}</${tag}>`;\n },\n );\n}\n\n/**\n * Strips `<p>` elements that contain nothing but whitespace, `&nbsp;`, or a\n * single `<br>`. Editor placeholders and stray blank lines in stored content\n * disappear without touching paragraphs that hold real content.\n */\nexport function removeEmptyParagraphs(html: string): string {\n return html.replace(/<p\\b[^>]*>(?:\\s|&nbsp;|<br\\s*\\/?>)*<\\/p>/gi, \"\");\n}\n\n/* -------------------------------------------------------------------------- */\n/* Figure transforms (run on already-HTML content, before sanitize) */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Wraps a standalone `<p><img/></p>` in `<figure data-variant=\"image\">` with a\n * `<figcaption>` derived from the image's title or alt. Images already nested\n * inside a `<figure>` are left untouched.\n */\nfunction upgradeStandaloneImages(html: string): string {\n return html.replace(\n /<p\\b[^>]*>\\s*(<img\\b[^>]*?>)\\s*<\\/p>/gi,\n (_full, img: string) => {\n const altMatch = img.match(/\\balt\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/i);\n const titleMatch = img.match(/\\btitle\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/i);\n const alt = altMatch ? (altMatch[1] ?? altMatch[2] ?? \"\") : \"\";\n const title = titleMatch ? (titleMatch[1] ?? titleMatch[2] ?? \"\") : \"\";\n const caption = title || alt;\n const captionHtml = caption\n ? `<figcaption data-variant=\"image\">${escapeHtml(caption)}</figcaption>`\n : \"\";\n return `<figure data-variant=\"image\">${img}${captionHtml}</figure>`;\n },\n );\n}\n\n/**\n * Injects decorative curly-quote spans inside the first and last paragraph\n * of pullquote body HTML so they flow inline with the quote text instead of\n * appearing on their own lines as siblings of `<p>` blocks.\n */\nfunction injectQuoteSpans(inner: string): string {\n const trimmed = inner.trim();\n if (!trimmed) return trimmed;\n\n const openSpan = `<span data-variant=\"quote-open\">“</span>`;\n const closeSpan = `<span data-variant=\"quote-close\">”</span>`;\n\n let result = trimmed.replace(\n /^(\\s*<p\\b[^>]*>)/,\n (_m, tag) => `${tag}${openSpan}`,\n );\n if (result === trimmed) {\n // No leading <p>; just prepend the span as a sibling.\n result = `${openSpan}${result}`;\n }\n\n const replaced = result.replace(\n /(<\\/p>\\s*)$/,\n (_m, tag) => `${closeSpan}${tag}`,\n );\n if (replaced === result) {\n result = `${result}${closeSpan}`;\n } else {\n result = replaced;\n }\n\n return result;\n}\n\n/**\n * Detects blockquotes whose last paragraph is an attribution line (`— Name`,\n * `–- Name`, or `-- Name`) and rewrites them as a pull-quote figure:\n *\n * <figure data-variant=\"pullquote\">\n * <blockquote data-variant=\"pullquote\">…rest…</blockquote>\n * <figcaption data-variant=\"pullquote\">— Name</figcaption>\n * </figure>\n *\n * Blockquotes already nested inside a `<figure>` are left untouched.\n */\nfunction upgradeAuthoredBlockquotes(html: string): string {\n const figureRanges: Array<[number, number]> = [];\n const figRe = /<figure\\b[\\s\\S]*?<\\/figure>/gi;\n let fm: RegExpExecArray | null;\n while ((fm = figRe.exec(html)) !== null) {\n figureRanges.push([fm.index, fm.index + fm[0].length]);\n }\n const insideFigure = (pos: number): boolean =>\n figureRanges.some(([s, e]) => pos >= s && pos < e);\n\n return html.replace(\n /<blockquote\\b[^>]*>([\\s\\S]*?)<\\/blockquote>/gi,\n (full, inner: string, offset: number) => {\n if (typeof offset === \"number\" && insideFigure(offset)) return full;\n\n const lastP = inner.match(/<p\\b[^>]*>([\\s\\S]*?)<\\/p>\\s*$/i);\n if (!lastP) return full;\n const text = stripInlineTags(decodeEntities(lastP[1])).trim();\n const authorMatch = text.match(/^(?:[—–]+|--)\\s+(.+)$/);\n if (!authorMatch) return full;\n\n const author = authorMatch[1].trim();\n const rest = inner.slice(0, inner.length - lastP[0].length).trim();\n if (!rest) return full;\n\n const wrapped = injectQuoteSpans(rest);\n return `<figure data-variant=\"pullquote\"><blockquote data-variant=\"pullquote\">${wrapped}</blockquote><figcaption data-variant=\"pullquote\">— <span data-variant=\"author\">${escapeHtml(author)}</span></figcaption></figure>`;\n },\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* Legacy \"markdown-in-divs\" detection + migration */\n/* -------------------------------------------------------------------------- */\n\nfunction isLegacyFormat(html: string): boolean {\n if (!/<div\\b/i.test(html)) return false;\n return /<div[^>]*>\\s*(?:&gt;|```|\\|)/i.test(html);\n}\n\nfunction decodeEntities(input: string): string {\n return input\n .replace(/&nbsp;/g, \" \")\n .replace(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\");\n}\n\nfunction escapeHtml(input: string): string {\n return input\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction extractLegacyLines(html: string): string[] {\n const normalized = html\n .replace(/\\r\\n?/g, \"\\n\")\n .replace(/<\\/div>\\s*<div[^>]*>/gi, \"\\n\")\n .replace(/<div[^>]*>/gi, \"\")\n .replace(/<\\/div>/gi, \"\\n\")\n .replace(/<br\\s*\\/?>(\\s*)/gi, \"\\n\")\n .replace(/<\\/p>\\s*<p[^>]*>/gi, \"\\n\\n\")\n .replace(/<p[^>]*>/gi, \"\")\n .replace(/<\\/p>/gi, \"\\n\");\n return normalized.split(\"\\n\").map((line) => line.replace(/\\s+$/g, \"\"));\n}\n\nfunction stripInlineTags(input: string): string {\n return input.replace(/<[^>]+>/g, \"\");\n}\n\nfunction renderInline(raw: string): string {\n let out = decodeEntities(raw);\n\n out = out.replace(\n /`([^`]+)`/g,\n (_m, code) => `<code>${escapeHtml(decodeEntities(code))}</code>`,\n );\n // Image markdown must run before links so `![alt](url)` isn't matched as a link.\n out = out.replace(\n /!\\[([^\\]]*)\\]\\(([^)]+)\\)/g,\n (_m, alt, src) =>\n `<img src=\"${escapeHtml(String(src).trim())}\" alt=\"${escapeHtml(String(alt))}\" />`,\n );\n out = out.replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n (_m, text, href) =>\n `<a href=\"${escapeHtml(String(href).trim())}\" target=\"_blank\" rel=\"noreferrer noopener\">${text}</a>`,\n );\n out = out.replace(/\\*\\*([^*]+)\\*\\*/g, \"<strong>$1</strong>\");\n out = out.replace(/__([^_]+)__/g, \"<strong>$1</strong>\");\n out = out.replace(/\\*([^*]+)\\*/g, \"<em>$1</em>\");\n out = out.replace(/(^|[^_])_([^_]+)_(?!_)/g, \"$1<em>$2</em>\");\n\n return out;\n}\n\nfunction isCodeFence(line: string): boolean {\n return /^\\s*```/.test(stripInlineTags(decodeEntities(line)).trim());\n}\n\nfunction isBlockquoteLine(line: string): boolean {\n return stripInlineTags(decodeEntities(line)).trim().startsWith(\">\");\n}\n\nfunction calloutHeaderOf(\n line: string,\n): { title: string; variant: string } | null {\n const text = stripInlineTags(decodeEntities(line)).trim();\n const m = text.match(/^>\\s*\\[!\\s*([^\\]]+?)\\s*\\]\\s*$/);\n if (!m) return null;\n const raw = m[1];\n const lower = raw.toLowerCase();\n const knownVariants = [\n \"info\",\n \"warning\",\n \"success\",\n \"danger\",\n \"note\",\n \"tip\",\n \"caution\",\n \"important\",\n ];\n const variant = knownVariants.includes(lower)\n ? lower === \"note\"\n ? \"info\"\n : lower === \"tip\"\n ? \"success\"\n : lower === \"caution\" || lower === \"important\"\n ? \"warning\"\n : lower\n : \"info\";\n return { title: raw, variant };\n}\n\nfunction stripBlockquoteMarker(line: string): string {\n return stripInlineTags(decodeEntities(line)).replace(/^\\s*>\\s?/, \"\");\n}\n\nfunction isTableLine(line: string): boolean {\n return /^\\|.*\\|$/.test(stripInlineTags(decodeEntities(line)).trim());\n}\n\nfunction isTableDivider(line: string): boolean {\n return /^\\|\\s*:?-{2,}:?\\s*(\\|\\s*:?-{2,}:?\\s*)+\\|?$/.test(\n stripInlineTags(decodeEntities(line)).trim(),\n );\n}\n\nfunction splitTableRow(line: string): string[] {\n return stripInlineTags(decodeEntities(line))\n .trim()\n .replace(/^\\|/, \"\")\n .replace(/\\|$/, \"\")\n .split(\"|\")\n .map((cell) => cell.trim());\n}\n\nfunction renderTable(rows: string[]): string {\n if (rows.length === 0) return \"\";\n let headerCells: string[] = [];\n let bodyStart = 0;\n if (rows.length >= 2 && isTableDivider(rows[1])) {\n headerCells = splitTableRow(rows[0]);\n bodyStart = 2;\n }\n const bodyRows = rows.slice(bodyStart).map(splitTableRow);\n const head = headerCells.length\n ? `<thead><tr>${headerCells.map((c) => `<th>${renderInline(c)}</th>`).join(\"\")}</tr></thead>`\n : \"\";\n const body = bodyRows.length\n ? `<tbody>${bodyRows.map((cells) => `<tr>${cells.map((c) => `<td>${renderInline(c)}</td>`).join(\"\")}</tr>`).join(\"\")}</tbody>`\n : \"\";\n return `<table>${head}${body}</table>`;\n}\n\nfunction renderCallout(\n title: string,\n variant: string,\n bodyLines: string[],\n): string {\n const body = bodyLines.map((l) => renderInline(l)).join(\"<br />\");\n return `<aside data-callout data-variant=\"${escapeHtml(variant)}\" data-title=\"${escapeHtml(title)}\">${body ? `<p>${body}</p>` : \"\"}</aside>`;\n}\n\nfunction renderBlockquote(lines: string[]): string {\n if (lines.length > 0) {\n const last = stripInlineTags(\n decodeEntities(lines[lines.length - 1]),\n ).trim();\n const authorMatch = last.match(/^(?:[—–]+|--)\\s+(.+)$/);\n if (authorMatch && lines.length > 1) {\n const author = authorMatch[1].trim();\n const quoteLines = lines.slice(0, -1);\n const body = quoteLines.map((l) => renderInline(l)).join(\"<br />\");\n return `<figure data-variant=\"pullquote\"><blockquote data-variant=\"pullquote\"><p><span data-variant=\"quote-open\">“</span>${body}<span data-variant=\"quote-close\">”</span></p></blockquote><figcaption data-variant=\"pullquote\">— <span data-variant=\"author\">${escapeHtml(author)}</span></figcaption></figure>`;\n }\n }\n return `<blockquote><p>${lines.map((l) => renderInline(l)).join(\"<br />\")}</p></blockquote>`;\n}\n\nfunction isImageOnlyLine(line: string): boolean {\n const text = stripInlineTags(decodeEntities(line)).trim();\n return /^!\\[[^\\]]*\\]\\([^)]+\\)$/.test(text);\n}\n\nfunction renderImageFigure(line: string): string {\n const m = stripInlineTags(decodeEntities(line))\n .trim()\n .match(/^!\\[([^\\]]*)\\]\\(([^)]+)\\)$/);\n if (!m) return \"\";\n const alt = m[1];\n const src = m[2].trim();\n const img = `<img src=\"${escapeHtml(src)}\" alt=\"${escapeHtml(alt)}\" />`;\n const cap = alt\n ? `<figcaption data-variant=\"image\">${escapeHtml(alt)}</figcaption>`\n : \"\";\n return `<figure data-variant=\"image\">${img}${cap}</figure>`;\n}\n\nfunction renderParagraph(lines: string[]): string {\n const body = lines.map((l) => renderInline(l)).join(\"<br />\");\n return body.length === 0 ? \"\" : `<p>${body}</p>`;\n}\n\nfunction migrateLegacyToHtml(html: string): string {\n const lines = extractLegacyLines(html);\n const blocks: string[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n const trimmed = stripInlineTags(decodeEntities(line)).trim();\n\n if (trimmed.length === 0) {\n i++;\n continue;\n }\n\n if (isCodeFence(line)) {\n const codeLines: string[] = [];\n i++;\n while (i < lines.length && !isCodeFence(lines[i])) {\n codeLines.push(stripInlineTags(decodeEntities(lines[i])));\n i++;\n }\n if (i < lines.length) i++;\n blocks.push(\n `<pre><code>${escapeHtml(codeLines.join(\"\\n\"))}</code></pre>`,\n );\n continue;\n }\n\n const callout = calloutHeaderOf(line);\n if (callout) {\n const bodyLines: string[] = [];\n i++;\n while (i < lines.length && isBlockquoteLine(lines[i])) {\n bodyLines.push(stripBlockquoteMarker(lines[i]));\n i++;\n }\n blocks.push(renderCallout(callout.title, callout.variant, bodyLines));\n continue;\n }\n\n if (isBlockquoteLine(line)) {\n const quoteLines: string[] = [];\n while (i < lines.length && isBlockquoteLine(lines[i])) {\n quoteLines.push(stripBlockquoteMarker(lines[i]));\n i++;\n }\n blocks.push(renderBlockquote(quoteLines));\n continue;\n }\n\n if (isTableLine(line)) {\n const tableLines: string[] = [];\n while (i < lines.length && isTableLine(lines[i])) {\n tableLines.push(lines[i]);\n i++;\n }\n blocks.push(renderTable(tableLines));\n continue;\n }\n\n if (isImageOnlyLine(line)) {\n blocks.push(renderImageFigure(line));\n i++;\n continue;\n }\n\n const paragraphLines: string[] = [];\n while (\n i < lines.length &&\n stripInlineTags(decodeEntities(lines[i])).trim().length > 0 &&\n !isCodeFence(lines[i]) &&\n !isBlockquoteLine(lines[i]) &&\n !isTableLine(lines[i]) &&\n !isImageOnlyLine(lines[i])\n ) {\n paragraphLines.push(lines[i]);\n i++;\n }\n const p = renderParagraph(paragraphLines);\n if (p) blocks.push(p);\n }\n\n return blocks.join(\"\");\n}\n\n/* -------------------------------------------------------------------------- */\n/* Sanitize + classMap pass */\n/* -------------------------------------------------------------------------- */\n\ntype Token =\n | { type: \"text\"; value: string }\n | { type: \"comment\" }\n | {\n type: \"open\";\n tag: string;\n attrs: Record<string, string>;\n selfClosing: boolean;\n }\n | { type: \"close\"; tag: string };\n\nconst VOID_TAGS = new Set([\n \"br\",\n \"hr\",\n \"img\",\n \"input\",\n \"meta\",\n \"link\",\n \"source\",\n \"wbr\",\n \"col\",\n]);\n\nfunction tokenize(html: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n\n while (i < html.length) {\n const lt = html.indexOf(\"<\", i);\n if (lt === -1) {\n tokens.push({ type: \"text\", value: html.slice(i) });\n break;\n }\n if (lt > i) tokens.push({ type: \"text\", value: html.slice(i, lt) });\n\n if (html.startsWith(\"<!--\", lt)) {\n const end = html.indexOf(\"-->\", lt + 4);\n if (end === -1) {\n i = html.length;\n break;\n }\n tokens.push({ type: \"comment\" });\n i = end + 3;\n continue;\n }\n\n let end = lt + 1;\n let inQuote: string | null = null;\n while (end < html.length) {\n const ch = html[end];\n if (inQuote) {\n if (ch === inQuote) inQuote = null;\n } else {\n if (ch === '\"' || ch === \"'\") inQuote = ch;\n else if (ch === \">\") break;\n }\n end++;\n }\n if (end >= html.length) {\n tokens.push({ type: \"text\", value: html.slice(lt) });\n break;\n }\n\n const tagContent = html.slice(lt + 1, end).trim();\n if (tagContent.startsWith(\"/\")) {\n tokens.push({\n type: \"close\",\n tag: tagContent.slice(1).trim().toLowerCase(),\n });\n } else {\n const selfClosingMark = tagContent.endsWith(\"/\");\n const inner = selfClosingMark\n ? tagContent.slice(0, -1).trim()\n : tagContent;\n const spaceIdx = inner.search(/\\s/);\n const tag = (\n spaceIdx === -1 ? inner : inner.slice(0, spaceIdx)\n ).toLowerCase();\n const attrStr = spaceIdx === -1 ? \"\" : inner.slice(spaceIdx + 1);\n const attrs = parseAttrs(attrStr);\n tokens.push({\n type: \"open\",\n tag,\n attrs,\n selfClosing: selfClosingMark || VOID_TAGS.has(tag),\n });\n }\n i = end + 1;\n }\n\n return tokens;\n}\n\nfunction parseAttrs(str: string): Record<string, string> {\n const out: Record<string, string> = {};\n const re =\n /([a-zA-Z_][a-zA-Z0-9_:-]*)(?:\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s>]+)))?/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(str)) !== null) {\n const name = m[1].toLowerCase();\n const value = m[2] ?? m[3] ?? m[4] ?? \"\";\n out[name] = decodeEntities(value);\n }\n return out;\n}\n\nfunction isAttrAllowed(tag: string, attr: string): boolean {\n if (attr.startsWith(\"on\")) return false;\n if (GLOBAL_ALLOWED_ATTRS.includes(attr)) return true;\n const list = ALLOWED_ATTRS[tag];\n return Boolean(list && list.includes(attr));\n}\n\nfunction isSafeUrl(value: string): boolean {\n const v = value.trim().toLowerCase();\n if (\n v.startsWith(\"javascript:\") ||\n (v.startsWith(\"data:\") && !v.startsWith(\"data:image/\"))\n )\n return false;\n if (v.startsWith(\"vbscript:\") || v.startsWith(\"file:\")) return false;\n return true;\n}\n\nfunction escapeAttr(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\");\n}\n\nfunction classKeyForTag(\n tag: string,\n attrs: Record<string, string>,\n openStack: ReadonlyArray<string>,\n): RichTextClassKey | null {\n if (tag === \"aside\" && \"data-callout\" in attrs) return \"callout\";\n if (tag === \"p\" && \"data-callout-title\" in attrs) return \"calloutTitle\";\n if (tag === \"code\" && openStack[openStack.length - 1] !== \"pre\")\n return \"inlineCode\";\n if (tag === \"details\") return \"collapsible\";\n if (tag === \"summary\") return \"collapsibleTitle\";\n\n const known: ReadonlyArray<RichTextClassKey> = [\n \"p\",\n \"br\",\n \"hr\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"ul\",\n \"ol\",\n \"li\",\n \"blockquote\",\n \"pre\",\n \"code\",\n \"kbd\",\n \"a\",\n \"strong\",\n \"em\",\n \"u\",\n \"s\",\n \"table\",\n \"thead\",\n \"tbody\",\n \"tr\",\n \"th\",\n \"td\",\n \"figure\",\n \"figcaption\",\n \"img\",\n \"span\",\n ];\n return (known as ReadonlyArray<string>).includes(tag)\n ? (tag as RichTextClassKey)\n : null;\n}\n\nfunction variantClass(\n classMap: RichTextClassMap | undefined,\n matchKey: string | null,\n variant: string | undefined,\n): string | undefined {\n if (!classMap?.variants || !matchKey || !variant) return undefined;\n return classMap.variants[`${matchKey}:${variant}`];\n}\n\nfunction sanitizeAndStyle(html: string, options: ParseRichTextOptions): string {\n const allowlist = options.allowlist ?? DEFAULT_ALLOWLIST;\n const classMap = options.classMap;\n const tokens = tokenize(html);\n const out: string[] = [];\n const openStack: string[] = [];\n const skipStack: Array<{ tag: string; dropChildren: boolean }> = [];\n const tableWrapperStack: boolean[] = [];\n\n for (let tokenIdx = 0; tokenIdx < tokens.length; tokenIdx++) {\n const token = tokens[tokenIdx];\n if (token.type === \"comment\") continue;\n\n if (token.type === \"text\") {\n if (skipStack.length > 0 && skipStack[skipStack.length - 1].dropChildren)\n continue;\n out.push(token.value);\n continue;\n }\n\n if (token.type === \"open\") {\n const allowed = allowlist.includes(token.tag);\n const dropChildren = token.tag === \"script\" || token.tag === \"style\";\n\n if (!allowed) {\n if (!token.selfClosing)\n skipStack.push({ tag: token.tag, dropChildren });\n continue;\n }\n\n const safeAttrs: Record<string, string> = {};\n for (const [name, value] of Object.entries(token.attrs)) {\n if (!isAttrAllowed(token.tag, name)) continue;\n if (URL_ATTRS.has(name) && !isSafeUrl(value)) continue;\n if (name === \"style\") {\n const cleaned = sanitizeStyle(token.tag, value);\n if (cleaned) safeAttrs.style = cleaned;\n continue;\n }\n safeAttrs[name] = value;\n }\n\n const matchKey = classKeyForTag(token.tag, token.attrs, openStack);\n const variant = token.attrs[\"data-variant\"];\n\n const classes: string[] = [];\n if (safeAttrs.class) classes.push(safeAttrs.class);\n if (matchKey && classMap?.[matchKey])\n classes.push(classMap[matchKey] as string);\n const variantCls = variantClass(classMap, matchKey, variant);\n if (variantCls) classes.push(variantCls);\n\n if (token.tag === \"a\") {\n if (safeAttrs.target === \"_blank\" && !safeAttrs.rel)\n safeAttrs.rel = \"noreferrer noopener\";\n }\n\n const merged = classes.join(\" \").trim();\n if (merged) safeAttrs.class = merged;\n else delete safeAttrs.class;\n\n const attrStr = Object.entries(safeAttrs)\n .map(([k, v]) => `${k}=\"${escapeAttr(v)}\"`)\n .join(\" \");\n\n if (token.tag === \"table\") {\n const wrapperClass = classMap?.tableWrapper;\n if (wrapperClass) {\n out.push(`<div class=\"${escapeAttr(wrapperClass)}\">`);\n tableWrapperStack.push(true);\n } else {\n tableWrapperStack.push(false);\n }\n }\n\n out.push(\n `<${token.tag}${attrStr ? \" \" + attrStr : \"\"}${token.selfClosing ? \" /\" : \"\"}>`,\n );\n if (!token.selfClosing) openStack.push(token.tag);\n\n if (\n token.tag === \"aside\" &&\n \"data-callout\" in token.attrs &&\n token.attrs[\"data-title\"]\n ) {\n const title = token.attrs[\"data-title\"];\n let lookahead = tokenIdx + 1;\n while (lookahead < tokens.length) {\n const next = tokens[lookahead];\n if (next.type === \"comment\") {\n lookahead++;\n continue;\n }\n if (next.type === \"text\" && next.value.trim() === \"\") {\n lookahead++;\n continue;\n }\n break;\n }\n const next = tokens[lookahead];\n const alreadyHasTitle =\n next &&\n next.type === \"open\" &&\n next.tag === \"p\" &&\n \"data-callout-title\" in next.attrs;\n if (!alreadyHasTitle) {\n const titleClasses: string[] = [];\n if (classMap?.calloutTitle) titleClasses.push(classMap.calloutTitle);\n const titleVariantCls = variantClass(\n classMap,\n \"calloutTitle\",\n token.attrs[\"data-variant\"],\n );\n if (titleVariantCls) titleClasses.push(titleVariantCls);\n const titleClassAttr = titleClasses.length\n ? ` class=\"${escapeAttr(titleClasses.join(\" \"))}\"`\n : \"\";\n out.push(\n `<p data-callout-title=\"true\"${titleClassAttr}>${escapeHtml(title)}</p>`,\n );\n }\n }\n continue;\n }\n\n if (token.type === \"close\") {\n if (\n skipStack.length > 0 &&\n skipStack[skipStack.length - 1].tag === token.tag\n ) {\n skipStack.pop();\n continue;\n }\n if (!allowlist.includes(token.tag)) continue;\n const idx = openStack.lastIndexOf(token.tag);\n if (idx === -1) continue;\n while (openStack.length > idx + 1) {\n const orphan = openStack.pop() as string;\n out.push(`</${orphan}>`);\n }\n openStack.pop();\n out.push(`</${token.tag}>`);\n if (token.tag === \"table\" && tableWrapperStack.pop()) {\n out.push(`</div>`);\n }\n }\n }\n\n while (openStack.length > 0) {\n const tag = openStack.pop() as string;\n out.push(`</${tag}>`);\n if (tag === \"table\" && tableWrapperStack.pop()) {\n out.push(`</div>`);\n }\n }\n\n return out.join(\"\");\n}\n","import {\n createElement,\n Fragment,\n memo,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport hljs from \"highlight.js/lib/common\";\nimport {\n parseRichText,\n type ParseRichTextOptions,\n type RichTextClassMap,\n} from \"./richTextParser\";\n\nexport type { RichTextClassMap, ParseRichTextOptions };\n\ninterface RichTextContentProps {\n html: string;\n classMap?: RichTextClassMap;\n /** Wrapper element. Defaults to `div`. Use `article` for blog content. */\n as?: keyof React.JSX.IntrinsicElements;\n className?: string;\n /**\n * Fires after the parsed HTML is in the DOM and post-render enhancements\n * (syntax highlighting, copy buttons, blockquote decorations) have run.\n * The wrapper element is passed back so callers can read headings, attach\n * a ToC observer, or do other DOM work without re-querying.\n */\n onReady?: (root: HTMLElement) => void;\n /**\n * Optional ref to the wrapper element. Useful for consumers that need a\n * stable reference to the rendered tree (e.g. scroll observers, ToC hooks).\n */\n contentRef?: React.MutableRefObject<HTMLElement | null>;\n /**\n * Per-variant icon override for callouts that opt into icons via\n * `data-icon`. Provide a React element for any variant key — these\n * elements are rendered into the chip via a portal, so they live in\n * React land (refs, event handlers, theme context all work). Variants\n * you don't provide fall back to the built-in SVG glyph.\n *\n * Common variants: `\"info\" | \"warning\" | \"success\" | \"danger\" | \"default\"`.\n * Custom variant names work too — anything you set via\n * `data-variant` on an `<aside data-callout>`.\n *\n * Example:\n * ```tsx\n * import { Info, AlertTriangle } from \"lucide-react\";\n *\n * <RichTextContent\n * html={article.doc}\n * calloutIcons={{\n * info: <Info size={14} strokeWidth={2.4} />,\n * warning: <AlertTriangle size={14} strokeWidth={2.4} />,\n * }}\n * />\n * ```\n */\n calloutIcons?: Partial<Record<string, ReactNode>>;\n}\n\n/**\n * Default look for the pullquote figure emitted by the parser when a\n * blockquote ends with an attribution line (`— Name`). Styles the decorative\n * curly quote marks and gives the author its own treatment so it reads as a\n * separate element from the quote body.\n */\nconst DEFAULT_CLASS_MAP: RichTextClassMap = {\n variants: {\n \"figure:pullquote\": \"relative my-8\",\n \"blockquote:pullquote\":\n \"relative italic text-lg leading-snug tracking-[-0.01em] sm:text-xl\",\n \"figcaption:pullquote\":\n \"mt-4 pt-3 border-t border-current/15 not-italic text-xs uppercase tracking-[0.14em] opacity-80\",\n \"span:quote-open\":\n \"mr-1 font-serif text-[1.4em] leading-none align-[-0.15em] opacity-60 select-none\",\n \"span:quote-close\":\n \"ml-1 font-serif text-[1.4em] leading-none align-[-0.15em] opacity-60 select-none\",\n \"span:author\":\n \"ml-1 font-semibold not-italic tracking-[0.16em] text-current\",\n },\n};\n\nfunction mergeClassMap(\n defaults: RichTextClassMap,\n user?: RichTextClassMap,\n): RichTextClassMap {\n if (!user) return defaults;\n return {\n ...defaults,\n ...user,\n variants: { ...defaults.variants, ...user.variants },\n };\n}\n\n/**\n * Server-safe React renderer for CMS rich text fields.\n *\n * Pairs with `parseRichText` from `richTextParser.ts`. Pass a `classMap`\n * keyed by tag, plus special wrapper keys like `tableWrapper`\n * (and `variants` keyed by `${tag}:${variantName}`) to apply frontend-specific\n * Tailwind classes without changing stored content.\n *\n * Built-in figure variants emitted by the parser:\n * - `figure:image` / `figcaption:image` — wraps standalone `<img>` blocks\n * and renders the alt/title as a centered caption.\n * - `figure:pullquote` / `blockquote:pullquote` / `figcaption:pullquote` —\n * emitted when a blockquote ends with an attribution line like\n * `— Name` (em/en dash or `--`). The author moves to the `<figcaption>`.\n * The blockquote body is wrapped with `<span data-variant=\"quote-open\">“</span>`\n * and `<span data-variant=\"quote-close\">”</span>`, addressable via the\n * `span:quote-open` / `span:quote-close` keys in `classMap.variants` so\n * the decorative marks can be sized, colored, or hidden independently.\n * The author name inside `<figcaption>` is wrapped in\n * `<span data-variant=\"author\">…</span>` (after the em-dash separator)\n * so it can be styled with its own `span:author` variant key without\n * affecting the dash.\n * - `tableWrapper` — wraps each sanitized `<table>` in a scroll container\n * before the table tag itself is rendered. Useful when you need the\n * table to match a bordered, horizontally scrollable design exactly.\n *\n * Sensible defaults for the pullquote layout (decorative quote marks +\n * distinct author treatment) ship in `DEFAULT_CLASS_MAP` and are merged with\n * the caller's `classMap` — user values win on conflict.\n *\n * Example:\n * ```\n * <RichTextContent\n * html={post.body}\n * classMap={{\n * figure: \"mt-10\",\n * variants: {\n * \"figure:pullquote\":\n * \"rounded-xl border-l-4 border-primary-color bg-primary-color/4 p-6 sm:p-8\",\n * \"blockquote:pullquote\":\n * \"text-lg font-medium leading-snug tracking-[-0.01em] sm:text-xl\",\n * \"figcaption:pullquote\":\n * \"mt-3 text-xs font-semibold uppercase tracking-[0.14em] text-primary-color\",\n * \"figcaption:image\": \"mt-3 text-center text-xs text-secondary-color\",\n * },\n * }}\n * />\n * ```\n *\n * Copy this file + `richTextParser.ts` into any consuming frontend; both\n * are dependency-free aside from React.\n */\nconst COPY_ICON_SVG = `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path></svg>`;\nconst CHECK_ICON_SVG = `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>`;\n\nconst ATTRIBUTION_RE = /^(?:[—–-]+|--)\\s+\\S/;\n\nfunction isAttributionEl(el: Element | null): boolean {\n if (!el) return false;\n if (el.getAttribute(\"data-variant\") === \"attribution\") return true;\n return ATTRIBUTION_RE.test((el.textContent ?? \"\").trim());\n}\n\nfunction findQuoteBody(bq: HTMLQuoteElement): {\n first: HTMLElement | null;\n last: HTMLElement | null;\n} {\n const children = Array.from(bq.children) as HTMLElement[];\n if (children.length === 0) return { first: null, last: null };\n let lastIdx = children.length - 1;\n // Skip trailing attribution paragraph(s) when picking where the closing\n // quote mark belongs.\n while (lastIdx >= 0 && isAttributionEl(children[lastIdx])) lastIdx--;\n if (lastIdx < 0) return { first: null, last: null };\n return { first: children[0], last: children[lastIdx] };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Callout icon injection */\n/* -------------------------------------------------------------------------- */\n\n// Per-variant SVG glyphs rendered inside the callout chip when the author\n// opts into the icon. Kept as raw strings so they can be inlined cheaply via\n// `innerHTML`. All glyphs share the same 16×16 viewBox so they line up in\n// the chip.\nconst CALLOUT_ICON_SVG: Record<string, string> = {\n info: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 16v-5\"/><path d=\"M12 8h.01\"/></svg>`,\n warning: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg>`,\n success: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"/></svg>`,\n danger: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"m15 9-6 6\"/><path d=\"m9 9 6 6\"/></svg>`,\n default: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M12 2.5l1.6 5.4a4 4 0 0 0 2.5 2.5L21.5 12l-5.4 1.6a4 4 0 0 0-2.5 2.5L12 21.5l-1.6-5.4a4 4 0 0 0-2.5-2.5L2.5 12l5.4-1.6a4 4 0 0 0 2.5-2.5z\"/></svg>`,\n};\n\nfunction calloutVariantOf(el: Element): string {\n return el.getAttribute(\"data-variant\") ?? \"default\";\n}\n\nfunction isIconEnabled(el: Element): boolean {\n const v = el.getAttribute(\"data-icon\");\n // Treat presence-only (`data-icon`) as truthy; explicit \"false\"/\"0\" disables.\n if (v === null) return false;\n return v !== \"false\" && v !== \"0\";\n}\n\n/**\n * Walk the callouts in the rendered subtree and ensure each one that has\n * `data-icon` set carries an empty `<span class=\"rt-callout-icon\">` chip at\n * its first child. The chip's contents are filled later by React (either\n * a portal of the user-supplied element, or the built-in SVG glyph),\n * which lets consumers swap in their own icon components.\n *\n * Returns the chip spans currently in the DOM in document order so the\n * component can render portals into them.\n */\nfunction enhanceCallouts(\n root: HTMLElement,\n calloutIcons?: Partial<Record<string, ReactNode>>,\n): Array<{ el: HTMLElement; variant: string }> {\n const callouts = root.querySelectorAll<HTMLElement>(\"aside[data-callout]\");\n callouts.forEach((el) => {\n if (el.querySelector(\":scope > .rt-callout-icon\")) return;\n if (!isIconEnabled(el)) return;\n const variant = calloutVariantOf(el);\n const icon = document.createElement(\"span\");\n icon.className = \"rt-callout-icon\";\n icon.dataset.variant = variant;\n icon.setAttribute(\"aria-hidden\", \"true\");\n if (!calloutIcons || !(variant in calloutIcons)) {\n icon.innerHTML = CALLOUT_ICON_SVG[variant] ?? CALLOUT_ICON_SVG.default;\n }\n el.prepend(icon);\n });\n if (!calloutIcons) return [];\n const chips: Array<{ el: HTMLElement; variant: string }> = [];\n root\n .querySelectorAll<HTMLElement>(\n \"aside[data-callout] > .rt-callout-icon\",\n )\n .forEach((chip) => {\n const variant =\n chip.dataset.variant ||\n (chip.parentElement?.getAttribute(\"data-variant\") ?? \"default\");\n if (variant in calloutIcons) {\n chips.push({ el: chip, variant });\n }\n });\n return chips;\n}\n\nfunction enhanceBlockquotes(root: HTMLElement) {\n const quotes = root.querySelectorAll<HTMLQuoteElement>(\"blockquote\");\n quotes.forEach((bq) => {\n if (bq.querySelector(\":scope > .rt-quote-open\")) return;\n if (bq.closest('figure[data-variant=\"pullquote\"]')) return;\n\n const { first, last } = findQuoteBody(bq);\n if (!first || !last) return;\n\n const open = document.createElement(\"span\");\n open.className = \"rt-quote-open\";\n open.setAttribute(\"aria-hidden\", \"true\");\n open.textContent = \"“\";\n\n const close = document.createElement(\"span\");\n close.className = \"rt-quote-close\";\n close.setAttribute(\"aria-hidden\", \"true\");\n close.textContent = \"”\";\n\n first.prepend(open);\n last.append(close);\n });\n}\n\n/* -------------------------------------------------------------------------- */\n/* Syntax highlighting (highlight.js) */\n/* -------------------------------------------------------------------------- */\n\n// `highlight.js/lib/common` ships ~35 popular languages — enough for typical\n// CMS content without dragging in every grammar. The theme CSS is imported at\n// the top of the file. To add an obscure language, register it explicitly:\n// import lang from \"highlight.js/lib/languages/foo\"; hljs.registerLanguage(\"foo\", lang);\n\nfunction escapeHtml(s: string): string {\n return s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n\nfunction preserveSpaces(html: string): string {\n // Keep runs of 2+ spaces visible inside table cells / inline contexts where\n // the browser would otherwise collapse them.\n return html.replace(/ {2,}/g, (m) => \"&nbsp;\".repeat(m.length));\n}\n\nfunction highlightSource(src: string, lang?: string): string {\n if (lang && hljs.getLanguage(lang)) {\n try {\n return hljs.highlight(src, { language: lang, ignoreIllegals: true })\n .value;\n } catch {\n // fall through to escaped plain text\n }\n }\n return escapeHtml(src);\n}\n\nfunction highlightLine(line: string, lang: string | undefined): string {\n if (!line) return \"\";\n return preserveSpaces(highlightSource(line, lang));\n}\n\nfunction highlightCodeBlock(pre: HTMLPreElement) {\n const lang = pre.dataset.language;\n if (!lang) return;\n const code = pre.querySelector(\"code\");\n if (!code) return;\n if (code.classList.contains(\"hljs\")) return;\n const source = code.textContent ?? \"\";\n code.innerHTML = highlightSource(source, lang);\n code.classList.add(\"hljs\");\n}\n\nconst DIFF_SEPARATOR_RE = /\\n?@@---@@\\n?/;\n\ntype DiffOp = { t: \"eq\" | \"rem\" | \"add\"; line: string };\n\nfunction diffLines(a: string[], b: string[]): DiffOp[] {\n const n = a.length;\n const m = b.length;\n const dp: number[][] = Array.from({ length: n + 1 }, () =>\n new Array(m + 1).fill(0),\n );\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= m; j++) {\n dp[i][j] =\n a[i - 1] === b[j - 1]\n ? dp[i - 1][j - 1] + 1\n : Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n const ops: DiffOp[] = [];\n let i = n;\n let j = m;\n while (i > 0 && j > 0) {\n if (a[i - 1] === b[j - 1]) {\n ops.unshift({ t: \"eq\", line: a[i - 1] });\n i--;\n j--;\n } else if (dp[i - 1][j] >= dp[i][j - 1]) {\n ops.unshift({ t: \"rem\", line: a[i - 1] });\n i--;\n } else {\n ops.unshift({ t: \"add\", line: b[j - 1] });\n j--;\n }\n }\n while (i > 0) ops.unshift({ t: \"rem\", line: a[--i] });\n while (j > 0) ops.unshift({ t: \"add\", line: b[--j] });\n return ops;\n}\n\nfunction renderDiff(before: string, after: string, lang?: string): string {\n const ops = diffLines(before.split(\"\\n\"), after.split(\"\\n\"));\n type Cell = { n: number | null; line: string | null; cls: string };\n type Row = { left: Cell; right: Cell };\n const rows: Row[] = [];\n let aNo = 0;\n let bNo = 0;\n let k = 0;\n while (k < ops.length) {\n const op = ops[k];\n if (op.t === \"eq\") {\n aNo++;\n bNo++;\n rows.push({\n left: { n: aNo, line: op.line, cls: \"\" },\n right: { n: bNo, line: op.line, cls: \"\" },\n });\n k++;\n continue;\n }\n const rems: string[] = [];\n while (k < ops.length && ops[k].t === \"rem\") {\n rems.push(ops[k].line);\n k++;\n }\n const adds: string[] = [];\n while (k < ops.length && ops[k].t === \"add\") {\n adds.push(ops[k].line);\n k++;\n }\n const len = Math.max(rems.length, adds.length);\n for (let x = 0; x < len; x++) {\n const remLine = x < rems.length ? rems[x] : null;\n const addLine = x < adds.length ? adds[x] : null;\n rows.push({\n left: {\n n: remLine !== null ? ++aNo : null,\n line: remLine,\n cls: remLine !== null ? \"rt-diff-rem\" : \"rt-diff-empty\",\n },\n right: {\n n: addLine !== null ? ++bNo : null,\n line: addLine,\n cls: addLine !== null ? \"rt-diff-add\" : \"rt-diff-empty\",\n },\n });\n }\n }\n const cell = (c: Cell, side: \"l\" | \"r\") => {\n const sign = side === \"l\" ? \"-\" : \"+\";\n const showSign = c.cls === \"rt-diff-rem\" || c.cls === \"rt-diff-add\";\n return (\n `<td class=\"rt-diff-num\">${c.n ?? \"\"}</td>` +\n `<td class=\"rt-diff-sign\">${showSign ? sign : \"\"}</td>` +\n `<td class=\"rt-diff-line ${c.cls}\">${c.line === null ? \"\" : highlightLine(c.line, lang) || \"&nbsp;\"}</td>`\n );\n };\n const body = rows\n .map((r) => `<tr>${cell(r.left, \"l\")}${cell(r.right, \"r\")}</tr>`)\n .join(\"\");\n return `<table class=\"rt-diff-table\"><tbody>${body}</tbody></table>`;\n}\n\nfunction makeCopyButton(\n getText: () => string,\n opts: { className?: string; label?: string } = {},\n): HTMLButtonElement {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = opts.className ?? \"rt-codeblock__copy\";\n btn.setAttribute(\"aria-label\", opts.label ?? \"Copy code\");\n btn.innerHTML = COPY_ICON_SVG;\n btn.addEventListener(\"click\", async () => {\n try {\n await navigator.clipboard.writeText(getText());\n btn.innerHTML = CHECK_ICON_SVG;\n btn.classList.add(\"is-copied\");\n window.setTimeout(() => {\n btn.innerHTML = COPY_ICON_SVG;\n btn.classList.remove(\"is-copied\");\n }, 1500);\n } catch {\n // clipboard unavailable; no-op\n }\n });\n return btn;\n}\n\nfunction buildCodeBlockLabel(pre: HTMLPreElement): HTMLElement | null {\n const filename = pre.dataset.filename;\n if (!filename) return null;\n const tag = document.createElement(\"span\");\n tag.className = \"rt-codeblock__label\";\n const file = document.createElement(\"span\");\n // Use the language-pill styling for the filename so it reads as a small\n // tag rather than plain text. Language itself is no longer displayed.\n file.className = \"rt-codeblock__filename rt-codeblock__language\";\n file.textContent = filename;\n tag.appendChild(file);\n return tag;\n}\n\nfunction enhanceCodeBlocks(root: HTMLElement) {\n const blocks = root.querySelectorAll<HTMLPreElement>(\"pre\");\n blocks.forEach((pre) => {\n if (pre.classList.contains(\"rt-codeblock\")) return;\n pre.classList.add(\"rt-codeblock\");\n\n const variant = pre.dataset.variant;\n\n // Diff variant: split content on the @@---@@ marker and render a\n // side-by-side LCS diff. Skip the regular code-block chrome.\n if (variant === \"diff\") {\n const codeEl = pre.querySelector(\"code\");\n const src = codeEl?.textContent ?? \"\";\n const [beforeSrc = \"\", afterSrc = \"\"] = src.split(DIFF_SEPARATOR_RE);\n pre.innerHTML = renderDiff(beforeSrc, afterSrc, pre.dataset.language);\n\n // Per-side copy buttons. Each copies only its own snippet (no signs,\n // no line numbers — just the raw text the author originally pasted).\n // Wrap in half-width cells so the buttons sit at the top-right of\n // their respective column instead of bunching on one side.\n const bar = document.createElement(\"div\");\n bar.className = \"rt-diff-copy-bar\";\n const leftHalf = document.createElement(\"div\");\n leftHalf.className = \"rt-diff-copy-half\";\n leftHalf.appendChild(\n makeCopyButton(() => beforeSrc, {\n className: \"rt-diff-copy\",\n label: \"Copy before\",\n }),\n );\n const rightHalf = document.createElement(\"div\");\n rightHalf.className = \"rt-diff-copy-half\";\n rightHalf.appendChild(\n makeCopyButton(() => afterSrc, {\n className: \"rt-diff-copy\",\n label: \"Copy after\",\n }),\n );\n bar.appendChild(leftHalf);\n bar.appendChild(rightHalf);\n pre.prepend(bar);\n\n const label = buildCodeBlockLabel(pre);\n if (label) pre.prepend(label);\n return;\n }\n\n // Terminal variant: synthetic chrome (traffic lights) via CSS; render\n // a `$ ` prompt on every visible line so multi-line snippets read like a\n // real shell session. Copying yields just the commands without prompts.\n if (variant === \"terminal\") {\n pre.classList.add(\"rt-terminal\");\n const codeEl = pre.querySelector(\"code\");\n const source = codeEl?.textContent ?? \"\";\n if (codeEl) {\n // Default to shell highlighting when no explicit language is set —\n // a terminal block without `bash`/`sh` selected almost certainly\n // contains shell commands, and `tokenizeFor(\"sh\", …)` is safe to fall\n // back to (it just returns text tokens for content it can't classify).\n const lang = pre.dataset.language || \"sh\";\n const lines = source.split(\"\\n\");\n codeEl.innerHTML = lines\n .map(\n (line) =>\n `<span class=\"rt-term-line\"><span class=\"rt-term-prompt\" aria-hidden=\"true\">$</span> ${highlightLine(line, lang) || \"&nbsp;\"}</span>`,\n )\n .join(\"\");\n }\n pre.appendChild(makeCopyButton(() => source, { label: \"Copy commands\" }));\n return;\n }\n\n const label = buildCodeBlockLabel(pre);\n if (label) pre.prepend(label);\n\n pre.appendChild(\n makeCopyButton(\n () => pre.querySelector(\"code\")?.textContent ?? pre.innerText,\n ),\n );\n\n highlightCodeBlock(pre);\n });\n}\n\n// Inlined `tokyo-night-dark` highlight.js theme. Bundled as a string rather\n// than imported as a CSS file so the package works in SSR environments\n// (Node throws \"Unknown file extension '.css'\" otherwise). Injected once on\n// the client via `ensureCodeBlockStyles`.\nconst HLJS_THEME = `\npre code.hljs { display: block; overflow-x: auto; padding: 1em; }\ncode.hljs { padding: 3px 5px; }\n.hljs-meta, .hljs-comment { color: #565f89; }\n.hljs-tag, .hljs-doctag, .hljs-selector-id, .hljs-selector-class,\n.hljs-regexp, .hljs-template-tag, .hljs-selector-pseudo,\n.hljs-selector-attr, .hljs-variable.language_, .hljs-deletion { color: #f7768e; }\n.hljs-variable, .hljs-template-variable, .hljs-number, .hljs-literal,\n.hljs-type, .hljs-params, .hljs-link { color: #ff9e64; }\n.hljs-built_in, .hljs-attribute { color: #e0af68; }\n.hljs-selector-tag { color: #73daca; }\n.hljs-keyword, .hljs-title.function_, .hljs-title, .hljs-title.class_,\n.hljs-title.class_.inherited__, .hljs-subst, .hljs-property { color: #7dcfff; }\n.hljs-quote, .hljs-string, .hljs-symbol, .hljs-bullet,\n.hljs-addition { color: #9ece6a; }\n.hljs-code, .hljs-formula, .hljs-section { color: #7aa2f7; }\n.hljs-name, .hljs-operator, .hljs-char.escape_, .hljs-attr { color: #bb9af7; }\n.hljs-punctuation { color: #c0caf5; }\n.hljs { background: #1a1b26; color: #9aa5ce; }\n.hljs-emphasis { font-style: italic; }\n.hljs-strong { font-weight: bold; }\n`;\n\nconst CODEBLOCK_STYLE = `\n.rt-codeblock { position: relative; }\n.rt-codeblock[data-filename]:not([data-filename=\"\"]) { padding-top: 2rem; }\n.rt-codeblock__label {\n position: absolute; top: 0.45rem; left: 0.85rem;\n display: inline-flex; align-items: center; gap: 0.5rem;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n pointer-events: none;\n}\n.rt-codeblock__filename {\n font-size: 0.72rem; letter-spacing: 0.02em;\n color: #d1d5db;\n}\n.rt-codeblock__sep {\n color: #6b7280;\n font-size: 0.72rem;\n}\n.rt-codeblock__language {\n font-size: 0.6rem; letter-spacing: 0.08em;\n text-transform: lowercase;\n color: #9ca3af;\n padding: 0.05rem 0.35rem;\n border: 1px solid rgba(255,255,255,0.12);\n border-radius: 0.25rem;\n}\n.rt-codeblock__copy {\n position: absolute; top: 0.4rem; right: 0.4rem;\n display: inline-flex; align-items: center; justify-content: center;\n width: 1.75rem; height: 1.75rem; padding: 0;\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 0.375rem;\n background: rgba(255,255,255,0.04);\n color: #d1d5db;\n cursor: pointer;\n opacity: 0; transition: opacity 120ms ease, background 120ms ease, color 120ms ease;\n}\n.rt-codeblock:hover .rt-codeblock__copy,\n.rt-codeblock:focus-within .rt-codeblock__copy { opacity: 1; }\n.rt-codeblock__copy:hover { background: rgba(255,255,255,0.1); color: #fff; }\n.rt-codeblock__copy.is-copied { color: #34d399; opacity: 1; }\n@media (hover: none) { .rt-codeblock__copy { opacity: 1; } }\n.rt-quote-open, .rt-quote-close {\n font-family: Georgia, \"Times New Roman\", serif;\n font-size: 1.4em;\n line-height: 0;\n vertical-align: -0.15em;\n opacity: 0.6;\n user-select: none;\n}\n.rt-quote-open { margin-right: 0.15em; }\n.rt-quote-close { margin-left: 0.15em; }\n\n/* Callout chip ----------------------------------------------------------- */\n/* Layout: when a callout opts into an icon, use a 2-column grid so the chip\n sits left of the title + body. Consumers can override via classMap. */\naside[data-callout][data-icon]:not([data-icon=\"false\"]):not([data-icon=\"0\"]) {\n display: grid;\n grid-template-columns: auto 1fr;\n column-gap: 0.85rem;\n align-items: start;\n}\naside[data-callout][data-icon]:not([data-icon=\"false\"]):not([data-icon=\"0\"]) > .rt-callout-icon {\n grid-row: 1 / span 99;\n margin-top: 0.05rem;\n}\n.rt-callout-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.6rem;\n height: 1.6rem;\n border-radius: 0.4rem;\n color: #fff;\n background: #475569;\n flex-shrink: 0;\n}\n.rt-callout-icon[data-variant=\"info\"] { background: #2563eb; }\n.rt-callout-icon[data-variant=\"warning\"] { background: #d97706; }\n.rt-callout-icon[data-variant=\"success\"] { background: #16a34a; }\n.rt-callout-icon[data-variant=\"danger\"] { background: #dc2626; }\n.rt-callout-icon[data-variant=\"default\"] { background: #475569; }\n\n/* Collapsible (FAQ accordion) ------------------------------------------ */\n/* Native <details>/<summary> with a rotating chevron. Only structural\n styling lives here — colors, padding, and typography belong to\n consumers via the \\`collapsible\\` and \\`collapsibleTitle\\` classMap keys. */\ndetails[data-collapsible] > summary {\n cursor: pointer;\n list-style: none;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.75rem;\n}\ndetails[data-collapsible] > summary::-webkit-details-marker { display: none; }\ndetails[data-collapsible] > summary::after {\n content: \"\";\n width: 0.55rem;\n height: 0.55rem;\n border-right: 1.5px solid currentColor;\n border-bottom: 1.5px solid currentColor;\n transform: rotate(-45deg) translate(-0.1rem, 0.05rem);\n transition: transform 0.18s ease;\n opacity: 0.55;\n flex-shrink: 0;\n}\ndetails[data-collapsible][open] > summary::after {\n transform: rotate(45deg) translate(-0.05rem, -0.05rem);\n}\n/* highlight.js theme handles .hljs-* color classes; we only override the\n default .hljs background so the per-block chrome (dark bg, terminal,\n diff red/green rows) wins. */\n.rt-codeblock .hljs,\n.rt-codeblock code.hljs { background: transparent; padding: 0; }\n\n/* Terminal variant ------------------------------------------------------- */\n.rt-codeblock.rt-terminal,\n.rt-codeblock[data-variant=\"terminal\"] {\n position: relative;\n padding-top: 2.25rem;\n background: #0b0b0d;\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 0.65rem;\n box-shadow: 0 1px 0 rgba(255,255,255,0.04) inset,\n 0 10px 30px -10px rgba(0,0,0,0.6);\n}\n.rt-codeblock.rt-terminal::before,\n.rt-codeblock[data-variant=\"terminal\"]::before {\n content: \"\";\n position: absolute; top: 0; left: 0; right: 0; height: 1.75rem;\n background: linear-gradient(#1a1a1d, #141417);\n border-bottom: 1px solid rgba(255,255,255,0.06);\n border-radius: 0.65rem 0.65rem 0 0;\n}\n.rt-codeblock.rt-terminal::after,\n.rt-codeblock[data-variant=\"terminal\"]::after {\n content: \"\";\n position: absolute; top: 0.55rem; left: 0.75rem;\n width: 0.65rem; height: 0.65rem; border-radius: 50%;\n background: #ff5f57;\n box-shadow:\n 1.1rem 0 0 0 #febc2e,\n 2.2rem 0 0 0 #28c840;\n}\n.rt-codeblock.rt-terminal code,\n.rt-codeblock[data-variant=\"terminal\"] code {\n color: #d4d4d8;\n display: block;\n}\n.rt-term-line { display: block; white-space: pre-wrap; }\n.rt-term-prompt {\n color: #28c840;\n font-weight: 600;\n margin-right: 0.35em;\n user-select: none;\n}\n\n/* Diff variant ----------------------------------------------------------- */\n.rt-codeblock[data-variant=\"diff\"] {\n padding: 0;\n overflow: hidden;\n background: #0b0b0d;\n border: 1px solid rgba(255,255,255,0.08);\n}\n.rt-codeblock[data-variant=\"diff\"][data-filename]:not([data-filename=\"\"]) {\n padding-top: 2rem;\n}\n.rt-diff-table {\n width: 100%;\n border-collapse: collapse;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 0.78rem;\n line-height: 1.55;\n color: #e5e7eb;\n table-layout: fixed;\n}\n.rt-diff-table colgroup { display: none; }\n.rt-diff-table td {\n padding: 0 0.5rem;\n vertical-align: top;\n white-space: pre-wrap;\n word-break: break-word;\n}\n.rt-diff-table td.rt-diff-num {\n width: 2.25rem;\n text-align: right;\n color: rgba(156,163,175,0.55);\n user-select: none;\n background: rgba(255,255,255,0.02);\n}\n.rt-diff-table td.rt-diff-sign {\n width: 0.85rem;\n text-align: center;\n user-select: none;\n color: rgba(255,255,255,0.45);\n}\n.rt-diff-table td.rt-diff-line.rt-diff-rem {\n background: rgba(248,113,113,0.12);\n color: #fecaca;\n}\n.rt-diff-table tr:has(td.rt-diff-rem) td.rt-diff-sign:first-of-type {\n color: #f87171;\n}\n.rt-diff-table td.rt-diff-line.rt-diff-add {\n background: rgba(74,222,128,0.12);\n color: #bbf7d0;\n}\n.rt-diff-table tr:has(td.rt-diff-add) td.rt-diff-sign + td + td + td.rt-diff-sign {\n color: #4ade80;\n}\n.rt-diff-table td.rt-diff-line.rt-diff-empty {\n background: rgba(255,255,255,0.025);\n}\n.rt-diff-table tr td:nth-child(4) { border-left: 1px solid rgba(255,255,255,0.06); }\n.rt-diff-copy-bar {\n position: absolute; top: 0.4rem; left: 0; right: 0; z-index: 2;\n display: grid; grid-template-columns: 1fr 1fr;\n pointer-events: none;\n}\n.rt-diff-copy-half {\n display: flex;\n justify-content: flex-end;\n padding-right: 0.4rem;\n}\n.rt-diff-copy {\n pointer-events: auto;\n display: inline-flex; align-items: center; justify-content: center;\n width: 1.6rem; height: 1.6rem; padding: 0;\n border: 1px solid rgba(255,255,255,0.1);\n border-radius: 0.375rem;\n background: rgba(20,20,23,0.85);\n color: #d1d5db;\n cursor: pointer;\n opacity: 0; transition: opacity 120ms ease, background 120ms ease, color 120ms ease;\n}\n.rt-codeblock[data-variant=\"diff\"]:hover .rt-diff-copy,\n.rt-codeblock[data-variant=\"diff\"]:focus-within .rt-diff-copy { opacity: 1; }\n.rt-diff-copy:hover { background: rgba(0,0,0,0.92); color: #fff; }\n.rt-diff-copy.is-copied { color: #34d399; opacity: 1; }\n@media (hover: none) { .rt-diff-copy { opacity: 1; } }\n`;\n\nlet styleInjected = false;\nfunction ensureCodeBlockStyles() {\n if (styleInjected || typeof document === \"undefined\") return;\n if (document.getElementById(\"rt-codeblock-style\")) {\n styleInjected = true;\n return;\n }\n const tag = document.createElement(\"style\");\n tag.id = \"rt-codeblock-style\";\n tag.textContent = HLJS_THEME + \"\\n\" + CODEBLOCK_STYLE;\n document.head.appendChild(tag);\n styleInjected = true;\n}\n\ntype CalloutChip = { el: HTMLElement; variant: string };\n\nfunction calloutChipsEqual(a: CalloutChip[], b: CalloutChip[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i].el !== b[i].el || a[i].variant !== b[i].variant) return false;\n }\n return true;\n}\n\nfunction BuiltinCalloutIcon({ variant }: { variant: string }) {\n const html = CALLOUT_ICON_SVG[variant] ?? CALLOUT_ICON_SVG.default;\n return <span dangerouslySetInnerHTML={{ __html: html }} />;\n}\n\nexport const RichTextContent = memo(function RichTextContent({\n html,\n classMap,\n as = \"div\",\n className,\n onReady,\n contentRef,\n calloutIcons,\n}: RichTextContentProps) {\n const merged = useMemo(\n () => mergeClassMap(DEFAULT_CLASS_MAP, classMap),\n [classMap],\n );\n const safe = useMemo(\n () => parseRichText(html, { classMap: merged }),\n [html, merged],\n );\n\n const ref = useRef<HTMLElement | null>(null);\n const prevSafe = useRef(\"\");\n const chipsRef = useRef<CalloutChip[]>([]);\n const onReadyRef = useRef(onReady);\n onReadyRef.current = onReady;\n const contentRefStable = useRef(contentRef);\n contentRefStable.current = contentRef;\n const calloutIconsRef = useRef(calloutIcons);\n calloutIconsRef.current = calloutIcons;\n\n const [renderKey, setRenderKey] = useState(0);\n\n useLayoutEffect(() => {\n ensureCodeBlockStyles();\n const root = ref.current;\n if (!root) return;\n if (contentRefStable.current) contentRefStable.current.current = root;\n if (prevSafe.current === safe) return;\n prevSafe.current = safe;\n\n root.innerHTML = safe;\n enhanceCodeBlocks(root);\n enhanceBlockquotes(root);\n const nextChips = enhanceCallouts(root, calloutIconsRef.current);\n\n if (!calloutChipsEqual(chipsRef.current, nextChips)) {\n chipsRef.current = nextChips;\n if (nextChips.length > 0) setRenderKey((n) => n + 1);\n }\n\n onReadyRef.current?.(root);\n }, [safe]);\n\n void renderKey;\n\n return (\n <Fragment>\n {createElement(as, {\n ref,\n className,\n })}\n {chipsRef.current.map((chip, i) =>\n createPortal(\n calloutIconsRef.current && chip.variant in calloutIconsRef.current ? (\n calloutIconsRef.current[chip.variant]\n ) : (\n <BuiltinCalloutIcon variant={chip.variant} />\n ),\n chip.el,\n `${chip.variant}:${i}`,\n ),\n )}\n </Fragment>\n );\n}, richTextPropsEqual);\n\nfunction richTextPropsEqual(\n prev: RichTextContentProps,\n next: RichTextContentProps,\n): boolean {\n if (prev.html !== next.html) return false;\n if (prev.classMap !== next.classMap) return false;\n if (prev.as !== next.as) return false;\n if (prev.className !== next.className) return false;\n const prevKeys = prev.calloutIcons ? Object.keys(prev.calloutIcons) : [];\n const nextKeys = next.calloutIcons ? Object.keys(next.calloutIcons) : [];\n if (prevKeys.length !== nextKeys.length) return false;\n for (const k of nextKeys) {\n if (!prevKeys.includes(k)) return false;\n }\n return true;\n}\n","/**\n * Heading extraction helpers used to build tables of contents (ToC) from\n * rich-text HTML. Server-safe — no React, no DOM dependency in the HTML\n * variant. The DOM variant assigns missing `id`s in-place so anchor links\n * resolve immediately.\n */\n\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport interface ExtractedHeading {\n id: string;\n text: string;\n level: HeadingLevel;\n}\n\nexport interface ExtractHeadingsOptions {\n /** Levels to include. Defaults to `[2, 3]` — typical doc page outline. */\n levels?: ReadonlyArray<HeadingLevel>;\n /** Custom slug function. Defaults to a lowercase/kebab/diacritic-safe slug. */\n slugify?: (text: string, index: number) => string;\n}\n\nconst DEFAULT_LEVELS: ReadonlyArray<HeadingLevel> = [2, 3];\n\nexport function slugify(text: string): string {\n return text\n .normalize(\"NFKD\")\n .replace(/[̀-ͯ]/g, \"\")\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\nfunction decodeBasicEntities(s: string): string {\n return s\n .replace(/&nbsp;/g, \" \")\n .replace(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\");\n}\n\nfunction stripTags(s: string): string {\n return decodeBasicEntities(s.replace(/<[^>]+>/g, \" \"))\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction uniqueId(base: string, used: Map<string, number>): string {\n const seed = base || \"section\";\n const n = used.get(seed) ?? 0;\n used.set(seed, n + 1);\n return n === 0 ? seed : `${seed}-${n}`;\n}\n\n/**\n * Parse headings out of a raw HTML string. Returns headings in document\n * order with stable, de-duplicated IDs.\n *\n * If a heading already has an `id` attribute, it's preserved verbatim\n * (and reserved so later slugs don't collide with it).\n */\nexport function extractHeadingsFromHtml(\n html: string,\n options: ExtractHeadingsOptions = {},\n): ExtractedHeading[] {\n if (!html) return [];\n const levels = options.levels ?? DEFAULT_LEVELS;\n const slug = options.slugify ?? slugify;\n const used = new Map<string, number>();\n const out: ExtractedHeading[] = [];\n const re = /<h([1-6])\\b([^>]*)>([\\s\\S]*?)<\\/h\\1>/gi;\n let m: RegExpExecArray | null;\n let i = 0;\n while ((m = re.exec(html)) !== null) {\n const level = Number(m[1]) as HeadingLevel;\n if (!levels.includes(level)) continue;\n const attrs = m[2] ?? \"\";\n const inner = m[3] ?? \"\";\n const text = stripTags(inner);\n if (!text) continue;\n const explicitIdMatch = attrs.match(/\\bid\\s*=\\s*(\"([^\"]*)\"|'([^']*)'|(\\S+))/i);\n let id: string;\n if (explicitIdMatch) {\n id = explicitIdMatch[2] ?? explicitIdMatch[3] ?? explicitIdMatch[4] ?? \"\";\n if (id) used.set(id, (used.get(id) ?? 0) + 1);\n } else {\n id = uniqueId(slug(text, i), used);\n }\n out.push({ id, text, level });\n i++;\n }\n return out;\n}\n\n/**\n * Walk a rendered DOM subtree, collect headings, and assign missing `id`s\n * in-place so anchor links resolve immediately. Also sets `scrollMarginTop`\n * on each heading when `scrollMarginTop` is provided so navigation lands\n * cleanly below a sticky header.\n */\nexport function extractHeadingsFromElement(\n root: HTMLElement,\n options: ExtractHeadingsOptions & { scrollMarginTop?: number } = {},\n): ExtractedHeading[] {\n const levels = options.levels ?? DEFAULT_LEVELS;\n const slug = options.slugify ?? slugify;\n const selector = levels.map((l) => `h${l}`).join(\",\");\n const nodes = root.querySelectorAll<HTMLHeadingElement>(selector);\n const used = new Map<string, number>();\n // Reserve already-present IDs so generated ones don't collide.\n nodes.forEach((n) => {\n if (n.id) used.set(n.id, (used.get(n.id) ?? 0) + 1);\n });\n const out: ExtractedHeading[] = [];\n let i = 0;\n nodes.forEach((node) => {\n const level = Number(node.tagName.slice(1)) as HeadingLevel;\n const text = (node.textContent ?? \"\").replace(/\\s+/g, \" \").trim();\n if (!text) return;\n if (!node.id) {\n node.id = uniqueId(slug(text, i), used);\n }\n if (options.scrollMarginTop != null) {\n node.style.scrollMarginTop = `${options.scrollMarginTop}px`;\n }\n out.push({ id: node.id, text, level });\n i++;\n });\n return out;\n}\n"]}