@asteroidcms/core-utils 0.1.0 → 0.1.1

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.
package/dist/index.js.map CHANGED
@@ -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"],"names":["alias","gql","end","next","escapeHtml","i","j","label","useMemo"],"mappings":"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","file":"index.js","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\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\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];\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};\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];\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 return sanitizeAndStyle(working, options);\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\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 { createElement, useEffect, useMemo, useRef } from \"react\";\nimport hljs from \"highlight.js/lib/common\";\nimport \"highlight.js/styles/tokyo-night-dark.css\";\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\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\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\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/* 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 = CODEBLOCK_STYLE;\n document.head.appendChild(tag);\n styleInjected = true;\n}\n\nexport function RichTextContent({\n html,\n classMap,\n as = \"div\",\n className,\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\n useEffect(() => {\n ensureCodeBlockStyles();\n if (ref.current) {\n enhanceCodeBlocks(ref.current);\n enhanceBlockquotes(ref.current);\n }\n }, [safe]);\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 return createElement(as, {\n ref,\n className,\n dangerouslySetInnerHTML: { __html: safe },\n });\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/utils/getContentReadTime.ts","../src/components/richTextParser.ts","../src/components/RichTextContent.tsx"],"names":["alias","gql","end","next","escapeHtml","i","j","label","useMemo"],"mappings":"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","file":"index.js","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","type ReadTimeUnit = \"short\" | \"long\";\n\ninterface GetContentReadTimeOptions {\n /**\n * Average words read per minute\n * @default 200\n */\n wordsPerMinute?: number;\n\n /**\n * Output style\n * short => \"3 min read\"\n * long => \"3 minutes read\"\n *\n * @default \"short\"\n */\n format?: ReadTimeUnit;\n\n /**\n * Round mode for minutes\n * ceil => always round up\n * round => normal rounding\n * floor => round down\n *\n * @default \"ceil\"\n */\n round?: \"ceil\" | \"round\" | \"floor\";\n\n /**\n * Minimum minutes returned\n * @default 1\n */\n minMinutes?: number;\n}\n\nexport function getContentReadTime(\n content: string,\n options: GetContentReadTimeOptions = {},\n): string {\n const {\n wordsPerMinute = 200,\n format = \"short\",\n round = \"ceil\",\n minMinutes = 1,\n } = options;\n\n if (!content || typeof content !== \"string\") {\n return format === \"short\"\n ? `${minMinutes} min read`\n : `${minMinutes} minute read`;\n }\n\n // Remove scripts/styles\n let text = content\n .replace(/<script[\\s\\S]*?<\\/script>/gi, \" \")\n .replace(/<style[\\s\\S]*?<\\/style>/gi, \" \");\n\n // Replace some semantic tags with spacing\n text = text\n .replace(/<\\/(p|div|h[1-6]|li|blockquote|pre|code|br|tr)>/gi, \" \")\n .replace(/<[^>]+>/g, \" \");\n\n // Decode common HTML entities\n text = text\n .replace(/&nbsp;/gi, \" \")\n .replace(/&amp;/gi, \"&\")\n .replace(/&lt;/gi, \"<\")\n .replace(/&gt;/gi, \">\")\n .replace(/&#39;/gi, \"'\")\n .replace(/&quot;/gi, '\"');\n\n // Cleanup whitespace\n text = text.replace(/\\s+/g, \" \").trim();\n\n // Count words\n const words = text.split(\" \").filter(Boolean).length;\n\n // Calculate minutes\n const rawMinutes = words / wordsPerMinute;\n\n const roundMap = {\n ceil: Math.ceil,\n round: Math.round,\n floor: Math.floor,\n };\n\n const minutes = Math.max(minMinutes, roundMap[round](rawMinutes));\n\n if (format === \"long\") {\n return `${minutes} ${minutes === 1 ? \"minute\" : \"minutes\"} read`;\n }\n\n return `${minutes} min read`;\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\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\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];\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};\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];\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 return sanitizeAndStyle(working, options);\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\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 { createElement, useEffect, useMemo, useRef } from \"react\";\nimport hljs from \"highlight.js/lib/common\";\nimport \"highlight.js/styles/tokyo-night-dark.css\";\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\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\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\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/* 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 = CODEBLOCK_STYLE;\n document.head.appendChild(tag);\n styleInjected = true;\n}\n\nexport function RichTextContent({\n html,\n classMap,\n as = \"div\",\n className,\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\n useEffect(() => {\n ensureCodeBlockStyles();\n if (ref.current) {\n enhanceCodeBlocks(ref.current);\n enhanceBlockquotes(ref.current);\n }\n }, [safe]);\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 return createElement(as, {\n ref,\n className,\n dangerouslySetInnerHTML: { __html: safe },\n });\n}\n"]}