@asteroidcms/core-utils 0.1.8 → 0.2.0
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/README.md +167 -0
- package/dist/client.cjs +208 -172
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +135 -171
- package/dist/client.d.ts +135 -171
- package/dist/client.js +208 -173
- package/dist/client.js.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/next.cjs.map +1 -1
- package/dist/next.js.map +1 -1
- package/dist/server.cjs +699 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +342 -0
- package/dist/server.d.ts +342 -0
- package/dist/server.js +669 -0
- package/dist/server.js.map +1 -0
- package/package.json +11 -2
package/dist/client.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","../src/utils/extractHeadings.ts","../src/seo/Seo.tsx","../src/seo/seo.builders.ts","../src/seo/jsonld.ts","../src/components/AsteroidArticlePage.tsx","../src/components/AsteroidArticlesListing.tsx"],"names":["alias","gql","end","next","escapeHtml","i","j","label","jsx","RichTextContent","useMemo","useContext","Fragment","body","jsxs","useState","useEffect"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAkPxB,IAAI,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","file":"client.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 | \"collapsible\"\n | \"collapsibleTitle\";\n\nexport type RichTextClassMap = Partial<Record<RichTextClassKey, string>> & {\n /** Variant overrides keyed as `${matchKey}:${variant}`, e.g. \"callout:warning\". */\n variants?: Record<string, string>;\n};\n\nexport interface ParseRichTextOptions {\n classMap?: RichTextClassMap;\n /** Tag allowlist override. Defaults to a safe semantic set. */\n allowlist?: ReadonlyArray<string>;\n /**\n * When `true` (default), inject slugified `id` attributes on `<h1>`–`<h6>`\n * tags that don't already have one. Lets ToC anchors resolve from the\n * server-rendered markup without a client-side mutation step.\n */\n autoHeadingIds?: boolean;\n}\n\nconst DEFAULT_ALLOWLIST: ReadonlyArray<string> = [\n \"p\",\n \"br\",\n \"hr\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"ul\",\n \"ol\",\n \"li\",\n \"blockquote\",\n \"pre\",\n \"code\",\n \"kbd\",\n \"a\",\n \"strong\",\n \"em\",\n \"u\",\n \"b\",\n \"i\",\n \"s\",\n \"strike\",\n \"del\",\n \"mark\",\n \"small\",\n \"sub\",\n \"sup\",\n \"table\",\n \"thead\",\n \"tbody\",\n \"tfoot\",\n \"tr\",\n \"th\",\n \"td\",\n \"colgroup\",\n \"col\",\n \"figure\",\n \"figcaption\",\n \"img\",\n \"aside\",\n \"section\",\n \"article\",\n \"div\",\n \"span\",\n \"details\",\n \"summary\",\n];\n\n/** Per-tag attribute allowlist. Global attrs from GLOBAL_ALLOWED_ATTRS apply to all. */\nconst ALLOWED_ATTRS: Record<string, ReadonlyArray<string>> = {\n a: [\"href\", \"title\", \"target\", \"rel\"],\n img: [\"src\", \"alt\", \"title\", \"width\", \"height\", \"loading\"],\n th: [\"colspan\", \"rowspan\", \"scope\"],\n td: [\"colspan\", \"rowspan\"],\n col: [\"span\", \"width\"],\n colgroup: [\"span\"],\n table: [\"border\", \"cellpadding\", \"cellspacing\"],\n span: [\"style\"],\n details: [\"open\"],\n};\n\n/**\n * Tag → allowlisted CSS property names. Inline `style` is otherwise blocked\n * by the sanitizer; properties listed here are extracted and re-emitted with\n * value-level validation.\n */\nconst ALLOWED_STYLE_PROPS: Record<string, ReadonlyArray<string>> = {\n span: [\"font-size\"],\n};\n\n/** Strict per-property value validators for inline `style` declarations. */\nconst STYLE_VALUE_VALIDATORS: Record<string, (value: string) => boolean> = {\n \"font-size\": (v) => /^\\d{1,3}(?:\\.\\d+)?(?:px|rem|em|%)$/.test(v.trim()),\n};\n\nfunction sanitizeStyle(tag: string, style: string): string {\n const allowed = ALLOWED_STYLE_PROPS[tag];\n if (!allowed || !style) return \"\";\n const out: string[] = [];\n for (const decl of style.split(\";\")) {\n const idx = decl.indexOf(\":\");\n if (idx === -1) continue;\n const name = decl.slice(0, idx).trim().toLowerCase();\n const value = decl.slice(idx + 1).trim();\n if (!allowed.includes(name)) continue;\n const validate = STYLE_VALUE_VALIDATORS[name];\n if (!validate || !validate(value)) continue;\n out.push(`${name}: ${value}`);\n }\n return out.join(\"; \");\n}\n\nconst GLOBAL_ALLOWED_ATTRS: ReadonlyArray<string> = [\n \"id\",\n \"class\",\n \"lang\",\n \"dir\",\n \"data-variant\",\n \"data-callout\",\n \"data-title\",\n \"data-callout-title\",\n \"data-language\",\n \"data-filename\",\n \"data-icon\",\n];\n\nconst URL_ATTRS = new Set([\"href\", \"src\"]);\n\n/* -------------------------------------------------------------------------- */\n/* Public API */\n/* -------------------------------------------------------------------------- */\n\nexport function parseRichText(\n html: string,\n options: ParseRichTextOptions = {},\n): string {\n if (!html || typeof html !== \"string\") return \"\";\n\n let working = isLegacyFormat(html) ? migrateLegacyToHtml(html) : html;\n working = removeEmptyParagraphs(working);\n working = upgradeStandaloneImages(working);\n working = upgradeAuthoredBlockquotes(working);\n working = flattenTableCellParagraphs(working);\n working = sanitizeAndStyle(working, options);\n if (options.autoHeadingIds !== false) {\n working = injectHeadingIds(working);\n }\n return working;\n}\n\n/**\n * Add a slugified `id` to each `<h1>`–`<h6>` that doesn't already have one.\n * Pure string transform; safe to run as a post-pass after sanitization.\n */\nfunction injectHeadingIds(html: string): string {\n const used = new Map<string, number>();\n // First, reserve existing IDs so generated slugs don't collide with them.\n const existingRe = /<h[1-6]\\b[^>]*\\bid\\s*=\\s*(\"([^\"]*)\"|'([^']*)'|(\\S+))/gi;\n let em: RegExpExecArray | null;\n while ((em = existingRe.exec(html)) !== null) {\n const id = em[2] ?? em[3] ?? em[4] ?? \"\";\n if (id) used.set(id, (used.get(id) ?? 0) + 1);\n }\n return html.replace(\n /<(h[1-6])\\b([^>]*)>([\\s\\S]*?)<\\/\\1>/gi,\n (full, tag: string, attrs: string, inner: string) => {\n if (/\\bid\\s*=/i.test(attrs)) return full;\n const text = inner\n .replace(/<[^>]+>/g, \" \")\n .replace(/ /g, \" \")\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/\\s+/g, \" \")\n .trim();\n if (!text) return full;\n const base = slugifyHeading(text) || tag;\n const n = used.get(base) ?? 0;\n used.set(base, n + 1);\n const id = n === 0 ? base : `${base}-${n}`;\n return `<${tag}${attrs} id=\"${id}\">${inner}</${tag}>`;\n },\n );\n}\n\nfunction slugifyHeading(text: string): string {\n return text\n .normalize(\"NFKD\")\n .replace(/[̀-ͯ]/g, \"\")\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\n/**\n * Tiptap stores table-cell content as `<p>` blocks (`<td><p>x</p></td>`),\n * which produces unwanted vertical margin and an extra block element when\n * consumers style table cells. Unwrap the paragraphs so cells hold inline\n * content directly. Multiple `<p>` siblings inside the same cell are joined\n * with `<br />` so line breaks survive.\n */\nfunction flattenTableCellParagraphs(html: string): string {\n return html.replace(\n /<(th|td)\\b([^>]*)>([\\s\\S]*?)<\\/\\1>/gi,\n (_full, tag: string, attrs: string, inner: string) => {\n let flat = inner;\n // Drop opening <p ...> tags.\n flat = flat.replace(/<p\\b[^>]*>/gi, \"\");\n // Replace closing </p> followed by more content with a <br/>, drop trailing ones.\n flat = flat.replace(/<\\/p>(\\s*)(?=\\S)/gi, \"<br />$1\");\n flat = flat.replace(/<\\/p>\\s*$/i, \"\");\n return `<${tag}${attrs}>${flat.trim()}</${tag}>`;\n },\n );\n}\n\n/**\n * Strips `<p>` elements that contain nothing but whitespace, ` `, 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| |<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*(?:>|```|\\|)/i.test(html);\n}\n\nfunction decodeEntities(input: string): string {\n return input\n .replace(/ /g, \" \")\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n}\n\nfunction escapeHtml(input: string): string {\n return input\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\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 `` 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, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\");\n}\n\nfunction classKeyForTag(\n tag: string,\n attrs: Record<string, string>,\n openStack: ReadonlyArray<string>,\n): RichTextClassKey | null {\n if (tag === \"aside\" && \"data-callout\" in attrs) return \"callout\";\n if (tag === \"p\" && \"data-callout-title\" in attrs) return \"calloutTitle\";\n if (tag === \"code\" && openStack[openStack.length - 1] !== \"pre\")\n return \"inlineCode\";\n if (tag === \"details\") return \"collapsible\";\n if (tag === \"summary\") return \"collapsibleTitle\";\n\n const known: ReadonlyArray<RichTextClassKey> = [\n \"p\",\n \"br\",\n \"hr\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"ul\",\n \"ol\",\n \"li\",\n \"blockquote\",\n \"pre\",\n \"code\",\n \"kbd\",\n \"a\",\n \"strong\",\n \"em\",\n \"u\",\n \"s\",\n \"table\",\n \"thead\",\n \"tbody\",\n \"tr\",\n \"th\",\n \"td\",\n \"figure\",\n \"figcaption\",\n \"img\",\n \"span\",\n ];\n return (known as ReadonlyArray<string>).includes(tag)\n ? (tag as RichTextClassKey)\n : null;\n}\n\nfunction variantClass(\n classMap: RichTextClassMap | undefined,\n matchKey: string | null,\n variant: string | undefined,\n): string | undefined {\n if (!classMap?.variants || !matchKey || !variant) return undefined;\n return classMap.variants[`${matchKey}:${variant}`];\n}\n\nfunction sanitizeAndStyle(html: string, options: ParseRichTextOptions): string {\n const allowlist = options.allowlist ?? DEFAULT_ALLOWLIST;\n const classMap = options.classMap;\n const tokens = tokenize(html);\n const out: string[] = [];\n const openStack: string[] = [];\n const skipStack: Array<{ tag: string; dropChildren: boolean }> = [];\n const tableWrapperStack: boolean[] = [];\n\n for (let tokenIdx = 0; tokenIdx < tokens.length; tokenIdx++) {\n const token = tokens[tokenIdx];\n if (token.type === \"comment\") continue;\n\n if (token.type === \"text\") {\n if (skipStack.length > 0 && skipStack[skipStack.length - 1].dropChildren)\n continue;\n out.push(token.value);\n continue;\n }\n\n if (token.type === \"open\") {\n const allowed = allowlist.includes(token.tag);\n const dropChildren = token.tag === \"script\" || token.tag === \"style\";\n\n if (!allowed) {\n if (!token.selfClosing)\n skipStack.push({ tag: token.tag, dropChildren });\n continue;\n }\n\n const safeAttrs: Record<string, string> = {};\n for (const [name, value] of Object.entries(token.attrs)) {\n if (!isAttrAllowed(token.tag, name)) continue;\n if (URL_ATTRS.has(name) && !isSafeUrl(value)) continue;\n if (name === \"style\") {\n const cleaned = sanitizeStyle(token.tag, value);\n if (cleaned) safeAttrs.style = cleaned;\n continue;\n }\n safeAttrs[name] = value;\n }\n\n const matchKey = classKeyForTag(token.tag, token.attrs, openStack);\n const variant = token.attrs[\"data-variant\"];\n\n const classes: string[] = [];\n if (safeAttrs.class) classes.push(safeAttrs.class);\n if (matchKey && classMap?.[matchKey])\n classes.push(classMap[matchKey] as string);\n const variantCls = variantClass(classMap, matchKey, variant);\n if (variantCls) classes.push(variantCls);\n\n if (token.tag === \"a\") {\n if (safeAttrs.target === \"_blank\" && !safeAttrs.rel)\n safeAttrs.rel = \"noreferrer noopener\";\n }\n\n const merged = classes.join(\" \").trim();\n if (merged) safeAttrs.class = merged;\n else delete safeAttrs.class;\n\n const attrStr = Object.entries(safeAttrs)\n .map(([k, v]) => `${k}=\"${escapeAttr(v)}\"`)\n .join(\" \");\n\n if (token.tag === \"table\") {\n const wrapperClass = classMap?.tableWrapper;\n if (wrapperClass) {\n out.push(`<div class=\"${escapeAttr(wrapperClass)}\">`);\n tableWrapperStack.push(true);\n } else {\n tableWrapperStack.push(false);\n }\n }\n\n out.push(\n `<${token.tag}${attrStr ? \" \" + attrStr : \"\"}${token.selfClosing ? \" /\" : \"\"}>`,\n );\n if (!token.selfClosing) openStack.push(token.tag);\n\n if (\n token.tag === \"aside\" &&\n \"data-callout\" in token.attrs &&\n token.attrs[\"data-title\"]\n ) {\n const title = token.attrs[\"data-title\"];\n let lookahead = tokenIdx + 1;\n while (lookahead < tokens.length) {\n const next = tokens[lookahead];\n if (next.type === \"comment\") {\n lookahead++;\n continue;\n }\n if (next.type === \"text\" && next.value.trim() === \"\") {\n lookahead++;\n continue;\n }\n break;\n }\n const next = tokens[lookahead];\n const alreadyHasTitle =\n next &&\n next.type === \"open\" &&\n next.tag === \"p\" &&\n \"data-callout-title\" in next.attrs;\n if (!alreadyHasTitle) {\n const titleClasses: string[] = [];\n if (classMap?.calloutTitle) titleClasses.push(classMap.calloutTitle);\n const titleVariantCls = variantClass(\n classMap,\n \"calloutTitle\",\n token.attrs[\"data-variant\"],\n );\n if (titleVariantCls) titleClasses.push(titleVariantCls);\n const titleClassAttr = titleClasses.length\n ? ` class=\"${escapeAttr(titleClasses.join(\" \"))}\"`\n : \"\";\n out.push(\n `<p data-callout-title=\"true\"${titleClassAttr}>${escapeHtml(title)}</p>`,\n );\n }\n }\n continue;\n }\n\n if (token.type === \"close\") {\n if (\n skipStack.length > 0 &&\n skipStack[skipStack.length - 1].tag === token.tag\n ) {\n skipStack.pop();\n continue;\n }\n if (!allowlist.includes(token.tag)) continue;\n const idx = openStack.lastIndexOf(token.tag);\n if (idx === -1) continue;\n while (openStack.length > idx + 1) {\n const orphan = openStack.pop() as string;\n out.push(`</${orphan}>`);\n }\n openStack.pop();\n out.push(`</${token.tag}>`);\n if (token.tag === \"table\" && tableWrapperStack.pop()) {\n out.push(`</div>`);\n }\n }\n }\n\n while (openStack.length > 0) {\n const tag = openStack.pop() as string;\n out.push(`</${tag}>`);\n if (tag === \"table\" && tableWrapperStack.pop()) {\n out.push(`</div>`);\n }\n }\n\n return out.join(\"\");\n}\n","import {\n createElement,\n Fragment,\n memo,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport hljs from \"highlight.js/lib/common\";\nimport {\n parseRichText,\n type ParseRichTextOptions,\n type RichTextClassMap,\n} from \"./richTextParser\";\n\nexport type { RichTextClassMap, ParseRichTextOptions };\n\ninterface RichTextContentProps {\n html: string;\n classMap?: RichTextClassMap;\n /** Wrapper element. Defaults to `div`. Use `article` for blog content. */\n as?: keyof React.JSX.IntrinsicElements;\n className?: string;\n /**\n * Fires after the parsed HTML is in the DOM and post-render enhancements\n * (syntax highlighting, copy buttons, blockquote decorations) have run.\n * The wrapper element is passed back so callers can read headings, attach\n * a ToC observer, or do other DOM work without re-querying.\n */\n onReady?: (root: HTMLElement) => void;\n /**\n * Optional ref to the wrapper element. Useful for consumers that need a\n * stable reference to the rendered tree (e.g. scroll observers, ToC hooks).\n */\n contentRef?: React.MutableRefObject<HTMLElement | null>;\n /**\n * Per-variant icon override for callouts that opt into icons via\n * `data-icon`. Provide a React element for any variant key — these\n * elements are rendered into the chip via a portal, so they live in\n * React land (refs, event handlers, theme context all work). Variants\n * you don't provide fall back to the built-in SVG glyph.\n *\n * Common variants: `\"info\" | \"warning\" | \"success\" | \"danger\" | \"default\"`.\n * Custom variant names work too — anything you set via\n * `data-variant` on an `<aside data-callout>`.\n *\n * Example:\n * ```tsx\n * import { Info, AlertTriangle } from \"lucide-react\";\n *\n * <RichTextContent\n * html={article.doc}\n * calloutIcons={{\n * info: <Info size={14} strokeWidth={2.4} />,\n * warning: <AlertTriangle size={14} strokeWidth={2.4} />,\n * }}\n * />\n * ```\n */\n calloutIcons?: Partial<Record<string, ReactNode>>;\n}\n\n/**\n * Default look for the pullquote figure emitted by the parser when a\n * blockquote ends with an attribution line (`— Name`). Styles the decorative\n * curly quote marks and gives the author its own treatment so it reads as a\n * separate element from the quote body.\n */\nconst DEFAULT_CLASS_MAP: RichTextClassMap = {\n variants: {\n \"figure:pullquote\": \"relative my-8\",\n \"blockquote:pullquote\":\n \"relative italic text-lg leading-snug tracking-[-0.01em] sm:text-xl\",\n \"figcaption:pullquote\":\n \"mt-4 pt-3 border-t border-current/15 not-italic text-xs uppercase tracking-[0.14em] opacity-80\",\n \"span:quote-open\":\n \"mr-1 font-serif text-[1.4em] leading-none align-[-0.15em] opacity-60 select-none\",\n \"span:quote-close\":\n \"ml-1 font-serif text-[1.4em] leading-none align-[-0.15em] opacity-60 select-none\",\n \"span:author\":\n \"ml-1 font-semibold not-italic tracking-[0.16em] text-current\",\n },\n};\n\nfunction mergeClassMap(\n defaults: RichTextClassMap,\n user?: RichTextClassMap,\n): RichTextClassMap {\n if (!user) return defaults;\n return {\n ...defaults,\n ...user,\n variants: { ...defaults.variants, ...user.variants },\n };\n}\n\n/**\n * Server-safe React renderer for CMS rich text fields.\n *\n * Pairs with `parseRichText` from `richTextParser.ts`. Pass a `classMap`\n * keyed by tag, plus special wrapper keys like `tableWrapper`\n * (and `variants` keyed by `${tag}:${variantName}`) to apply frontend-specific\n * Tailwind classes without changing stored content.\n *\n * Built-in figure variants emitted by the parser:\n * - `figure:image` / `figcaption:image` — wraps standalone `<img>` blocks\n * and renders the alt/title as a centered caption.\n * - `figure:pullquote` / `blockquote:pullquote` / `figcaption:pullquote` —\n * emitted when a blockquote ends with an attribution line like\n * `— Name` (em/en dash or `--`). The author moves to the `<figcaption>`.\n * The blockquote body is wrapped with `<span data-variant=\"quote-open\">“</span>`\n * and `<span data-variant=\"quote-close\">”</span>`, addressable via the\n * `span:quote-open` / `span:quote-close` keys in `classMap.variants` so\n * the decorative marks can be sized, colored, or hidden independently.\n * The author name inside `<figcaption>` is wrapped in\n * `<span data-variant=\"author\">…</span>` (after the em-dash separator)\n * so it can be styled with its own `span:author` variant key without\n * affecting the dash.\n * - `tableWrapper` — wraps each sanitized `<table>` in a scroll container\n * before the table tag itself is rendered. Useful when you need the\n * table to match a bordered, horizontally scrollable design exactly.\n *\n * Sensible defaults for the pullquote layout (decorative quote marks +\n * distinct author treatment) ship in `DEFAULT_CLASS_MAP` and are merged with\n * the caller's `classMap` — user values win on conflict.\n *\n * Example:\n * ```\n * <RichTextContent\n * html={post.body}\n * classMap={{\n * figure: \"mt-10\",\n * variants: {\n * \"figure:pullquote\":\n * \"rounded-xl border-l-4 border-primary-color bg-primary-color/4 p-6 sm:p-8\",\n * \"blockquote:pullquote\":\n * \"text-lg font-medium leading-snug tracking-[-0.01em] sm:text-xl\",\n * \"figcaption:pullquote\":\n * \"mt-3 text-xs font-semibold uppercase tracking-[0.14em] text-primary-color\",\n * \"figcaption:image\": \"mt-3 text-center text-xs text-secondary-color\",\n * },\n * }}\n * />\n * ```\n *\n * Copy this file + `richTextParser.ts` into any consuming frontend; both\n * are dependency-free aside from React.\n */\nconst COPY_ICON_SVG = `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path></svg>`;\nconst CHECK_ICON_SVG = `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>`;\n\nconst ATTRIBUTION_RE = /^(?:[—–-]+|--)\\s+\\S/;\n\nfunction isAttributionEl(el: Element | null): boolean {\n if (!el) return false;\n if (el.getAttribute(\"data-variant\") === \"attribution\") return true;\n return ATTRIBUTION_RE.test((el.textContent ?? \"\").trim());\n}\n\nfunction findQuoteBody(bq: HTMLQuoteElement): {\n first: HTMLElement | null;\n last: HTMLElement | null;\n} {\n const children = Array.from(bq.children) as HTMLElement[];\n if (children.length === 0) return { first: null, last: null };\n let lastIdx = children.length - 1;\n // Skip trailing attribution paragraph(s) when picking where the closing\n // quote mark belongs.\n while (lastIdx >= 0 && isAttributionEl(children[lastIdx])) lastIdx--;\n if (lastIdx < 0) return { first: null, last: null };\n return { first: children[0], last: children[lastIdx] };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Callout icon injection */\n/* -------------------------------------------------------------------------- */\n\n// Per-variant SVG glyphs rendered inside the callout chip when the author\n// opts into the icon. Kept as raw strings so they can be inlined cheaply via\n// `innerHTML`. All glyphs share the same 16×16 viewBox so they line up in\n// the chip.\nconst CALLOUT_ICON_SVG: Record<string, string> = {\n info: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 16v-5\"/><path d=\"M12 8h.01\"/></svg>`,\n warning: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg>`,\n success: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"/></svg>`,\n danger: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"m15 9-6 6\"/><path d=\"m9 9 6 6\"/></svg>`,\n default: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M12 2.5l1.6 5.4a4 4 0 0 0 2.5 2.5L21.5 12l-5.4 1.6a4 4 0 0 0-2.5 2.5L12 21.5l-1.6-5.4a4 4 0 0 0-2.5-2.5L2.5 12l5.4-1.6a4 4 0 0 0 2.5-2.5z\"/></svg>`,\n};\n\nfunction calloutVariantOf(el: Element): string {\n return el.getAttribute(\"data-variant\") ?? \"default\";\n}\n\nfunction isIconEnabled(el: Element): boolean {\n const v = el.getAttribute(\"data-icon\");\n // Treat presence-only (`data-icon`) as truthy; explicit \"false\"/\"0\" disables.\n if (v === null) return false;\n return v !== \"false\" && v !== \"0\";\n}\n\n/**\n * Walk the callouts in the rendered subtree and ensure each one that has\n * `data-icon` set carries an empty `<span class=\"rt-callout-icon\">` chip at\n * its first child. The chip's contents are filled later by React (either\n * a portal of the user-supplied element, or the built-in SVG glyph),\n * which lets consumers swap in their own icon components.\n *\n * Returns the chip spans currently in the DOM in document order so the\n * component can render portals into them.\n */\nfunction enhanceCallouts(\n root: HTMLElement,\n calloutIcons?: Partial<Record<string, ReactNode>>,\n): Array<{ el: HTMLElement; variant: string }> {\n const callouts = root.querySelectorAll<HTMLElement>(\"aside[data-callout]\");\n callouts.forEach((el) => {\n if (el.querySelector(\":scope > .rt-callout-icon\")) return;\n if (!isIconEnabled(el)) return;\n const variant = calloutVariantOf(el);\n const icon = document.createElement(\"span\");\n icon.className = \"rt-callout-icon\";\n icon.dataset.variant = variant;\n icon.setAttribute(\"aria-hidden\", \"true\");\n if (!calloutIcons || !(variant in calloutIcons)) {\n icon.innerHTML = CALLOUT_ICON_SVG[variant] ?? CALLOUT_ICON_SVG.default;\n }\n el.prepend(icon);\n });\n if (!calloutIcons) return [];\n const chips: Array<{ el: HTMLElement; variant: string }> = [];\n root\n .querySelectorAll<HTMLElement>(\n \"aside[data-callout] > .rt-callout-icon\",\n )\n .forEach((chip) => {\n const variant =\n chip.dataset.variant ||\n (chip.parentElement?.getAttribute(\"data-variant\") ?? \"default\");\n if (variant in calloutIcons) {\n chips.push({ el: chip, variant });\n }\n });\n return chips;\n}\n\nfunction enhanceBlockquotes(root: HTMLElement) {\n const quotes = root.querySelectorAll<HTMLQuoteElement>(\"blockquote\");\n quotes.forEach((bq) => {\n if (bq.querySelector(\":scope > .rt-quote-open\")) return;\n if (bq.closest('figure[data-variant=\"pullquote\"]')) return;\n\n const { first, last } = findQuoteBody(bq);\n if (!first || !last) return;\n\n const open = document.createElement(\"span\");\n open.className = \"rt-quote-open\";\n open.setAttribute(\"aria-hidden\", \"true\");\n open.textContent = \"“\";\n\n const close = document.createElement(\"span\");\n close.className = \"rt-quote-close\";\n close.setAttribute(\"aria-hidden\", \"true\");\n close.textContent = \"”\";\n\n first.prepend(open);\n last.append(close);\n });\n}\n\n/* -------------------------------------------------------------------------- */\n/* Syntax highlighting (highlight.js) */\n/* -------------------------------------------------------------------------- */\n\n// `highlight.js/lib/common` ships ~35 popular languages — enough for typical\n// CMS content without dragging in every grammar. The theme CSS is imported at\n// the top of the file. To add an obscure language, register it explicitly:\n// import lang from \"highlight.js/lib/languages/foo\"; hljs.registerLanguage(\"foo\", lang);\n\nfunction escapeHtml(s: string): string {\n return s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\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) => \" \".repeat(m.length));\n}\n\nfunction highlightSource(src: string, lang?: string): string {\n if (lang && hljs.getLanguage(lang)) {\n try {\n return hljs.highlight(src, { language: lang, ignoreIllegals: true })\n .value;\n } catch {\n // fall through to escaped plain text\n }\n }\n return escapeHtml(src);\n}\n\nfunction highlightLine(line: string, lang: string | undefined): string {\n if (!line) return \"\";\n return preserveSpaces(highlightSource(line, lang));\n}\n\nfunction highlightCodeBlock(pre: HTMLPreElement) {\n const lang = pre.dataset.language;\n if (!lang) return;\n const code = pre.querySelector(\"code\");\n if (!code) return;\n if (code.classList.contains(\"hljs\")) return;\n const source = code.textContent ?? \"\";\n code.innerHTML = highlightSource(source, lang);\n code.classList.add(\"hljs\");\n}\n\nconst DIFF_SEPARATOR_RE = /\\n?@@---@@\\n?/;\n\ntype DiffOp = { t: \"eq\" | \"rem\" | \"add\"; line: string };\n\nfunction diffLines(a: string[], b: string[]): DiffOp[] {\n const n = a.length;\n const m = b.length;\n const dp: number[][] = Array.from({ length: n + 1 }, () =>\n new Array(m + 1).fill(0),\n );\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= m; j++) {\n dp[i][j] =\n a[i - 1] === b[j - 1]\n ? dp[i - 1][j - 1] + 1\n : Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n const ops: DiffOp[] = [];\n let i = n;\n let j = m;\n while (i > 0 && j > 0) {\n if (a[i - 1] === b[j - 1]) {\n ops.unshift({ t: \"eq\", line: a[i - 1] });\n i--;\n j--;\n } else if (dp[i - 1][j] >= dp[i][j - 1]) {\n ops.unshift({ t: \"rem\", line: a[i - 1] });\n i--;\n } else {\n ops.unshift({ t: \"add\", line: b[j - 1] });\n j--;\n }\n }\n while (i > 0) ops.unshift({ t: \"rem\", line: a[--i] });\n while (j > 0) ops.unshift({ t: \"add\", line: b[--j] });\n return ops;\n}\n\nfunction renderDiff(before: string, after: string, lang?: string): string {\n const ops = diffLines(before.split(\"\\n\"), after.split(\"\\n\"));\n type Cell = { n: number | null; line: string | null; cls: string };\n type Row = { left: Cell; right: Cell };\n const rows: Row[] = [];\n let aNo = 0;\n let bNo = 0;\n let k = 0;\n while (k < ops.length) {\n const op = ops[k];\n if (op.t === \"eq\") {\n aNo++;\n bNo++;\n rows.push({\n left: { n: aNo, line: op.line, cls: \"\" },\n right: { n: bNo, line: op.line, cls: \"\" },\n });\n k++;\n continue;\n }\n const rems: string[] = [];\n while (k < ops.length && ops[k].t === \"rem\") {\n rems.push(ops[k].line);\n k++;\n }\n const adds: string[] = [];\n while (k < ops.length && ops[k].t === \"add\") {\n adds.push(ops[k].line);\n k++;\n }\n const len = Math.max(rems.length, adds.length);\n for (let x = 0; x < len; x++) {\n const remLine = x < rems.length ? rems[x] : null;\n const addLine = x < adds.length ? adds[x] : null;\n rows.push({\n left: {\n n: remLine !== null ? ++aNo : null,\n line: remLine,\n cls: remLine !== null ? \"rt-diff-rem\" : \"rt-diff-empty\",\n },\n right: {\n n: addLine !== null ? ++bNo : null,\n line: addLine,\n cls: addLine !== null ? \"rt-diff-add\" : \"rt-diff-empty\",\n },\n });\n }\n }\n const cell = (c: Cell, side: \"l\" | \"r\") => {\n const sign = side === \"l\" ? \"-\" : \"+\";\n const showSign = c.cls === \"rt-diff-rem\" || c.cls === \"rt-diff-add\";\n return (\n `<td class=\"rt-diff-num\">${c.n ?? \"\"}</td>` +\n `<td class=\"rt-diff-sign\">${showSign ? sign : \"\"}</td>` +\n `<td class=\"rt-diff-line ${c.cls}\">${c.line === null ? \"\" : highlightLine(c.line, lang) || \" \"}</td>`\n );\n };\n const body = rows\n .map((r) => `<tr>${cell(r.left, \"l\")}${cell(r.right, \"r\")}</tr>`)\n .join(\"\");\n return `<table class=\"rt-diff-table\"><tbody>${body}</tbody></table>`;\n}\n\nfunction makeCopyButton(\n getText: () => string,\n opts: { className?: string; label?: string } = {},\n): HTMLButtonElement {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = opts.className ?? \"rt-codeblock__copy\";\n btn.setAttribute(\"aria-label\", opts.label ?? \"Copy code\");\n btn.innerHTML = COPY_ICON_SVG;\n btn.addEventListener(\"click\", async () => {\n try {\n await navigator.clipboard.writeText(getText());\n btn.innerHTML = CHECK_ICON_SVG;\n btn.classList.add(\"is-copied\");\n window.setTimeout(() => {\n btn.innerHTML = COPY_ICON_SVG;\n btn.classList.remove(\"is-copied\");\n }, 1500);\n } catch {\n // clipboard unavailable; no-op\n }\n });\n return btn;\n}\n\nfunction buildCodeBlockLabel(pre: HTMLPreElement): HTMLElement | null {\n const filename = pre.dataset.filename;\n if (!filename) return null;\n const tag = document.createElement(\"span\");\n tag.className = \"rt-codeblock__label\";\n const file = document.createElement(\"span\");\n // Use the language-pill styling for the filename so it reads as a small\n // tag rather than plain text. Language itself is no longer displayed.\n file.className = \"rt-codeblock__filename rt-codeblock__language\";\n file.textContent = filename;\n tag.appendChild(file);\n return tag;\n}\n\nfunction enhanceCodeBlocks(root: HTMLElement) {\n const blocks = root.querySelectorAll<HTMLPreElement>(\"pre\");\n blocks.forEach((pre) => {\n if (pre.classList.contains(\"rt-codeblock\")) return;\n pre.classList.add(\"rt-codeblock\");\n\n const variant = pre.dataset.variant;\n\n // Diff variant: split content on the @@---@@ marker and render a\n // side-by-side LCS diff. Skip the regular code-block chrome.\n if (variant === \"diff\") {\n const codeEl = pre.querySelector(\"code\");\n const src = codeEl?.textContent ?? \"\";\n const [beforeSrc = \"\", afterSrc = \"\"] = src.split(DIFF_SEPARATOR_RE);\n pre.innerHTML = renderDiff(beforeSrc, afterSrc, pre.dataset.language);\n\n // Per-side copy buttons. Each copies only its own snippet (no signs,\n // no line numbers — just the raw text the author originally pasted).\n // Wrap in half-width cells so the buttons sit at the top-right of\n // their respective column instead of bunching on one side.\n const bar = document.createElement(\"div\");\n bar.className = \"rt-diff-copy-bar\";\n const leftHalf = document.createElement(\"div\");\n leftHalf.className = \"rt-diff-copy-half\";\n leftHalf.appendChild(\n makeCopyButton(() => beforeSrc, {\n className: \"rt-diff-copy\",\n label: \"Copy before\",\n }),\n );\n const rightHalf = document.createElement(\"div\");\n rightHalf.className = \"rt-diff-copy-half\";\n rightHalf.appendChild(\n makeCopyButton(() => afterSrc, {\n className: \"rt-diff-copy\",\n label: \"Copy after\",\n }),\n );\n bar.appendChild(leftHalf);\n bar.appendChild(rightHalf);\n pre.prepend(bar);\n\n const label = buildCodeBlockLabel(pre);\n if (label) pre.prepend(label);\n return;\n }\n\n // Terminal variant: synthetic chrome (traffic lights) via CSS; render\n // a `$ ` prompt on every visible line so multi-line snippets read like a\n // real shell session. Copying yields just the commands without prompts.\n if (variant === \"terminal\") {\n pre.classList.add(\"rt-terminal\");\n const codeEl = pre.querySelector(\"code\");\n const source = codeEl?.textContent ?? \"\";\n if (codeEl) {\n // Default to shell highlighting when no explicit language is set —\n // a terminal block without `bash`/`sh` selected almost certainly\n // contains shell commands, and `tokenizeFor(\"sh\", …)` is safe to fall\n // back to (it just returns text tokens for content it can't classify).\n const lang = pre.dataset.language || \"sh\";\n const lines = source.split(\"\\n\");\n codeEl.innerHTML = lines\n .map(\n (line) =>\n `<span class=\"rt-term-line\"><span class=\"rt-term-prompt\" aria-hidden=\"true\">$</span> ${highlightLine(line, lang) || \" \"}</span>`,\n )\n .join(\"\");\n }\n pre.appendChild(makeCopyButton(() => source, { label: \"Copy commands\" }));\n return;\n }\n\n const label = buildCodeBlockLabel(pre);\n if (label) pre.prepend(label);\n\n pre.appendChild(\n makeCopyButton(\n () => pre.querySelector(\"code\")?.textContent ?? pre.innerText,\n ),\n );\n\n highlightCodeBlock(pre);\n });\n}\n\n// Inlined `tokyo-night-dark` highlight.js theme. Bundled as a string rather\n// than imported as a CSS file so the package works in SSR environments\n// (Node throws \"Unknown file extension '.css'\" otherwise). Injected once on\n// the client via `ensureCodeBlockStyles`.\nconst HLJS_THEME = `\npre code.hljs { display: block; overflow-x: auto; padding: 1em; }\ncode.hljs { padding: 3px 5px; }\n.hljs-meta, .hljs-comment { color: #565f89; }\n.hljs-tag, .hljs-doctag, .hljs-selector-id, .hljs-selector-class,\n.hljs-regexp, .hljs-template-tag, .hljs-selector-pseudo,\n.hljs-selector-attr, .hljs-variable.language_, .hljs-deletion { color: #f7768e; }\n.hljs-variable, .hljs-template-variable, .hljs-number, .hljs-literal,\n.hljs-type, .hljs-params, .hljs-link { color: #ff9e64; }\n.hljs-built_in, .hljs-attribute { color: #e0af68; }\n.hljs-selector-tag { color: #73daca; }\n.hljs-keyword, .hljs-title.function_, .hljs-title, .hljs-title.class_,\n.hljs-title.class_.inherited__, .hljs-subst, .hljs-property { color: #7dcfff; }\n.hljs-quote, .hljs-string, .hljs-symbol, .hljs-bullet,\n.hljs-addition { color: #9ece6a; }\n.hljs-code, .hljs-formula, .hljs-section { color: #7aa2f7; }\n.hljs-name, .hljs-operator, .hljs-char.escape_, .hljs-attr { color: #bb9af7; }\n.hljs-punctuation { color: #c0caf5; }\n.hljs { background: #1a1b26; color: #9aa5ce; }\n.hljs-emphasis { font-style: italic; }\n.hljs-strong { font-weight: bold; }\n`;\n\nconst CODEBLOCK_STYLE = `\n.rt-codeblock { position: relative; }\n.rt-codeblock[data-filename]:not([data-filename=\"\"]) { padding-top: 2rem; }\n.rt-codeblock__label {\n position: absolute; top: 0.45rem; left: 0.85rem;\n display: inline-flex; align-items: center; gap: 0.5rem;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n pointer-events: none;\n}\n.rt-codeblock__filename {\n font-size: 0.72rem; letter-spacing: 0.02em;\n color: #d1d5db;\n}\n.rt-codeblock__sep {\n color: #6b7280;\n font-size: 0.72rem;\n}\n.rt-codeblock__language {\n font-size: 0.6rem; letter-spacing: 0.08em;\n text-transform: lowercase;\n color: #9ca3af;\n padding: 0.05rem 0.35rem;\n border: 1px solid rgba(255,255,255,0.12);\n border-radius: 0.25rem;\n}\n.rt-codeblock__copy {\n position: absolute; top: 0.4rem; right: 0.4rem;\n display: inline-flex; align-items: center; justify-content: center;\n width: 1.75rem; height: 1.75rem; padding: 0;\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 0.375rem;\n background: rgba(255,255,255,0.04);\n color: #d1d5db;\n cursor: pointer;\n opacity: 0; transition: opacity 120ms ease, background 120ms ease, color 120ms ease;\n}\n.rt-codeblock:hover .rt-codeblock__copy,\n.rt-codeblock:focus-within .rt-codeblock__copy { opacity: 1; }\n.rt-codeblock__copy:hover { background: rgba(255,255,255,0.1); color: #fff; }\n.rt-codeblock__copy.is-copied { color: #34d399; opacity: 1; }\n@media (hover: none) { .rt-codeblock__copy { opacity: 1; } }\n.rt-quote-open, .rt-quote-close {\n font-family: Georgia, \"Times New Roman\", serif;\n font-size: 1.4em;\n line-height: 0;\n vertical-align: -0.15em;\n opacity: 0.6;\n user-select: none;\n}\n.rt-quote-open { margin-right: 0.15em; }\n.rt-quote-close { margin-left: 0.15em; }\n\n/* Callout chip ----------------------------------------------------------- */\n/* Layout: when a callout opts into an icon, use a 2-column grid so the chip\n sits left of the title + body. Consumers can override via classMap. */\naside[data-callout][data-icon]:not([data-icon=\"false\"]):not([data-icon=\"0\"]) {\n display: grid;\n grid-template-columns: auto 1fr;\n column-gap: 0.85rem;\n align-items: start;\n}\naside[data-callout][data-icon]:not([data-icon=\"false\"]):not([data-icon=\"0\"]) > .rt-callout-icon {\n grid-row: 1 / span 99;\n margin-top: 0.05rem;\n}\n.rt-callout-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.6rem;\n height: 1.6rem;\n border-radius: 0.4rem;\n color: #fff;\n background: #475569;\n flex-shrink: 0;\n}\n.rt-callout-icon[data-variant=\"info\"] { background: #2563eb; }\n.rt-callout-icon[data-variant=\"warning\"] { background: #d97706; }\n.rt-callout-icon[data-variant=\"success\"] { background: #16a34a; }\n.rt-callout-icon[data-variant=\"danger\"] { background: #dc2626; }\n.rt-callout-icon[data-variant=\"default\"] { background: #475569; }\n\n/* Collapsible (FAQ accordion) ------------------------------------------ */\n/* Native <details>/<summary> with a rotating chevron. Only structural\n styling lives here — colors, padding, and typography belong to\n consumers via the \\`collapsible\\` and \\`collapsibleTitle\\` classMap keys. */\ndetails[data-collapsible] > summary {\n cursor: pointer;\n list-style: none;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.75rem;\n}\ndetails[data-collapsible] > summary::-webkit-details-marker { display: none; }\ndetails[data-collapsible] > summary::after {\n content: \"\";\n width: 0.55rem;\n height: 0.55rem;\n border-right: 1.5px solid currentColor;\n border-bottom: 1.5px solid currentColor;\n transform: rotate(-45deg) translate(-0.1rem, 0.05rem);\n transition: transform 0.18s ease;\n opacity: 0.55;\n flex-shrink: 0;\n}\ndetails[data-collapsible][open] > summary::after {\n transform: rotate(45deg) translate(-0.05rem, -0.05rem);\n}\n/* highlight.js theme handles .hljs-* color classes; we only override the\n default .hljs background so the per-block chrome (dark bg, terminal,\n diff red/green rows) wins. */\n.rt-codeblock .hljs,\n.rt-codeblock code.hljs { background: transparent; padding: 0; }\n\n/* Terminal variant ------------------------------------------------------- */\n.rt-codeblock.rt-terminal,\n.rt-codeblock[data-variant=\"terminal\"] {\n position: relative;\n padding-top: 2.25rem;\n background: #0b0b0d;\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 0.65rem;\n box-shadow: 0 1px 0 rgba(255,255,255,0.04) inset,\n 0 10px 30px -10px rgba(0,0,0,0.6);\n}\n.rt-codeblock.rt-terminal::before,\n.rt-codeblock[data-variant=\"terminal\"]::before {\n content: \"\";\n position: absolute; top: 0; left: 0; right: 0; height: 1.75rem;\n background: linear-gradient(#1a1a1d, #141417);\n border-bottom: 1px solid rgba(255,255,255,0.06);\n border-radius: 0.65rem 0.65rem 0 0;\n}\n.rt-codeblock.rt-terminal::after,\n.rt-codeblock[data-variant=\"terminal\"]::after {\n content: \"\";\n position: absolute; top: 0.55rem; left: 0.75rem;\n width: 0.65rem; height: 0.65rem; border-radius: 50%;\n background: #ff5f57;\n box-shadow:\n 1.1rem 0 0 0 #febc2e,\n 2.2rem 0 0 0 #28c840;\n}\n.rt-codeblock.rt-terminal code,\n.rt-codeblock[data-variant=\"terminal\"] code {\n color: #d4d4d8;\n display: block;\n}\n.rt-term-line { display: block; white-space: pre-wrap; }\n.rt-term-prompt {\n color: #28c840;\n font-weight: 600;\n margin-right: 0.35em;\n user-select: none;\n}\n\n/* Diff variant ----------------------------------------------------------- */\n.rt-codeblock[data-variant=\"diff\"] {\n padding: 0;\n overflow: hidden;\n background: #0b0b0d;\n border: 1px solid rgba(255,255,255,0.08);\n}\n.rt-codeblock[data-variant=\"diff\"][data-filename]:not([data-filename=\"\"]) {\n padding-top: 2rem;\n}\n.rt-diff-table {\n width: 100%;\n border-collapse: collapse;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 0.78rem;\n line-height: 1.55;\n color: #e5e7eb;\n table-layout: fixed;\n}\n.rt-diff-table colgroup { display: none; }\n.rt-diff-table td {\n padding: 0 0.5rem;\n vertical-align: top;\n white-space: pre-wrap;\n word-break: break-word;\n}\n.rt-diff-table td.rt-diff-num {\n width: 2.25rem;\n text-align: right;\n color: rgba(156,163,175,0.55);\n user-select: none;\n background: rgba(255,255,255,0.02);\n}\n.rt-diff-table td.rt-diff-sign {\n width: 0.85rem;\n text-align: center;\n user-select: none;\n color: rgba(255,255,255,0.45);\n}\n.rt-diff-table td.rt-diff-line.rt-diff-rem {\n background: rgba(248,113,113,0.12);\n color: #fecaca;\n}\n.rt-diff-table tr:has(td.rt-diff-rem) td.rt-diff-sign:first-of-type {\n color: #f87171;\n}\n.rt-diff-table td.rt-diff-line.rt-diff-add {\n background: rgba(74,222,128,0.12);\n color: #bbf7d0;\n}\n.rt-diff-table tr:has(td.rt-diff-add) td.rt-diff-sign + td + td + td.rt-diff-sign {\n color: #4ade80;\n}\n.rt-diff-table td.rt-diff-line.rt-diff-empty {\n background: rgba(255,255,255,0.025);\n}\n.rt-diff-table tr td:nth-child(4) { border-left: 1px solid rgba(255,255,255,0.06); }\n.rt-diff-copy-bar {\n position: absolute; top: 0.4rem; left: 0; right: 0; z-index: 2;\n display: grid; grid-template-columns: 1fr 1fr;\n pointer-events: none;\n}\n.rt-diff-copy-half {\n display: flex;\n justify-content: flex-end;\n padding-right: 0.4rem;\n}\n.rt-diff-copy {\n pointer-events: auto;\n display: inline-flex; align-items: center; justify-content: center;\n width: 1.6rem; height: 1.6rem; padding: 0;\n border: 1px solid rgba(255,255,255,0.1);\n border-radius: 0.375rem;\n background: rgba(20,20,23,0.85);\n color: #d1d5db;\n cursor: pointer;\n opacity: 0; transition: opacity 120ms ease, background 120ms ease, color 120ms ease;\n}\n.rt-codeblock[data-variant=\"diff\"]:hover .rt-diff-copy,\n.rt-codeblock[data-variant=\"diff\"]:focus-within .rt-diff-copy { opacity: 1; }\n.rt-diff-copy:hover { background: rgba(0,0,0,0.92); color: #fff; }\n.rt-diff-copy.is-copied { color: #34d399; opacity: 1; }\n@media (hover: none) { .rt-diff-copy { opacity: 1; } }\n`;\n\nlet styleInjected = false;\nfunction ensureCodeBlockStyles() {\n if (styleInjected || typeof document === \"undefined\") return;\n if (document.getElementById(\"rt-codeblock-style\")) {\n styleInjected = true;\n return;\n }\n const tag = document.createElement(\"style\");\n tag.id = \"rt-codeblock-style\";\n tag.textContent = HLJS_THEME + \"\\n\" + CODEBLOCK_STYLE;\n document.head.appendChild(tag);\n styleInjected = true;\n}\n\ntype CalloutChip = { el: HTMLElement; variant: string };\n\nfunction calloutChipsEqual(a: CalloutChip[], b: CalloutChip[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i].el !== b[i].el || a[i].variant !== b[i].variant) return false;\n }\n return true;\n}\n\nfunction BuiltinCalloutIcon({ variant }: { variant: string }) {\n const html = CALLOUT_ICON_SVG[variant] ?? CALLOUT_ICON_SVG.default;\n return <span dangerouslySetInnerHTML={{ __html: html }} />;\n}\n\nexport const RichTextContent = memo(function RichTextContent({\n html,\n classMap,\n as = \"div\",\n className,\n onReady,\n contentRef,\n calloutIcons,\n}: RichTextContentProps) {\n const merged = useMemo(\n () => mergeClassMap(DEFAULT_CLASS_MAP, classMap),\n [classMap],\n );\n const safe = useMemo(\n () => parseRichText(html, { classMap: merged }),\n [html, merged],\n );\n\n const ref = useRef<HTMLElement | null>(null);\n const prevSafe = useRef(\"\");\n const chipsRef = useRef<CalloutChip[]>([]);\n const onReadyRef = useRef(onReady);\n onReadyRef.current = onReady;\n const contentRefStable = useRef(contentRef);\n contentRefStable.current = contentRef;\n const calloutIconsRef = useRef(calloutIcons);\n calloutIconsRef.current = calloutIcons;\n\n const [renderKey, setRenderKey] = useState(0);\n\n useLayoutEffect(() => {\n ensureCodeBlockStyles();\n const root = ref.current;\n if (!root) return;\n if (contentRefStable.current) contentRefStable.current.current = root;\n if (prevSafe.current === safe) return;\n prevSafe.current = safe;\n\n root.innerHTML = safe;\n enhanceCodeBlocks(root);\n enhanceBlockquotes(root);\n const nextChips = enhanceCallouts(root, calloutIconsRef.current);\n\n if (!calloutChipsEqual(chipsRef.current, nextChips)) {\n chipsRef.current = nextChips;\n if (nextChips.length > 0) setRenderKey((n) => n + 1);\n }\n\n onReadyRef.current?.(root);\n }, [safe]);\n\n void renderKey;\n\n return (\n <Fragment>\n {createElement(as, {\n ref,\n className,\n })}\n {chipsRef.current.map((chip, i) =>\n createPortal(\n calloutIconsRef.current && chip.variant in calloutIconsRef.current ? (\n calloutIconsRef.current[chip.variant]\n ) : (\n <BuiltinCalloutIcon variant={chip.variant} />\n ),\n chip.el,\n `${chip.variant}:${i}`,\n ),\n )}\n </Fragment>\n );\n}, richTextPropsEqual);\n\nfunction richTextPropsEqual(\n prev: RichTextContentProps,\n next: RichTextContentProps,\n): boolean {\n if (prev.html !== next.html) return false;\n if (prev.classMap !== next.classMap) return false;\n if (prev.as !== next.as) return false;\n if (prev.className !== next.className) return false;\n const prevKeys = prev.calloutIcons ? Object.keys(prev.calloutIcons) : [];\n const nextKeys = next.calloutIcons ? Object.keys(next.calloutIcons) : [];\n if (prevKeys.length !== nextKeys.length) return false;\n for (const k of nextKeys) {\n if (!prevKeys.includes(k)) return false;\n }\n return true;\n}\n","/**\n * Heading extraction helpers used to build tables of contents (ToC) from\n * rich-text HTML. Server-safe — no React, no DOM dependency in the HTML\n * variant. The DOM variant assigns missing `id`s in-place so anchor links\n * resolve immediately.\n */\n\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport interface ExtractedHeading {\n id: string;\n text: string;\n level: HeadingLevel;\n}\n\nexport interface ExtractHeadingsOptions {\n /** Levels to include. Defaults to `[2, 3]` — typical doc page outline. */\n levels?: ReadonlyArray<HeadingLevel>;\n /** Custom slug function. Defaults to a lowercase/kebab/diacritic-safe slug. */\n slugify?: (text: string, index: number) => string;\n}\n\nconst DEFAULT_LEVELS: ReadonlyArray<HeadingLevel> = [2, 3];\n\nexport function slugify(text: string): string {\n return text\n .normalize(\"NFKD\")\n .replace(/[̀-ͯ]/g, \"\")\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\nfunction decodeBasicEntities(s: string): string {\n return s\n .replace(/ /g, \" \")\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n}\n\nfunction stripTags(s: string): string {\n return decodeBasicEntities(s.replace(/<[^>]+>/g, \" \"))\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction uniqueId(base: string, used: Map<string, number>): string {\n const seed = base || \"section\";\n const n = used.get(seed) ?? 0;\n used.set(seed, n + 1);\n return n === 0 ? seed : `${seed}-${n}`;\n}\n\n/**\n * Parse headings out of a raw HTML string. Returns headings in document\n * order with stable, de-duplicated IDs.\n *\n * If a heading already has an `id` attribute, it's preserved verbatim\n * (and reserved so later slugs don't collide with it).\n */\nexport function extractHeadingsFromHtml(\n html: string,\n options: ExtractHeadingsOptions = {},\n): ExtractedHeading[] {\n if (!html) return [];\n const levels = options.levels ?? DEFAULT_LEVELS;\n const slug = options.slugify ?? slugify;\n const used = new Map<string, number>();\n const out: ExtractedHeading[] = [];\n const re = /<h([1-6])\\b([^>]*)>([\\s\\S]*?)<\\/h\\1>/gi;\n let m: RegExpExecArray | null;\n let i = 0;\n while ((m = re.exec(html)) !== null) {\n const level = Number(m[1]) as HeadingLevel;\n if (!levels.includes(level)) continue;\n const attrs = m[2] ?? \"\";\n const inner = m[3] ?? \"\";\n const text = stripTags(inner);\n if (!text) continue;\n const explicitIdMatch = attrs.match(/\\bid\\s*=\\s*(\"([^\"]*)\"|'([^']*)'|(\\S+))/i);\n let id: string;\n if (explicitIdMatch) {\n id = explicitIdMatch[2] ?? explicitIdMatch[3] ?? explicitIdMatch[4] ?? \"\";\n if (id) used.set(id, (used.get(id) ?? 0) + 1);\n } else {\n id = uniqueId(slug(text, i), used);\n }\n out.push({ id, text, level });\n i++;\n }\n return out;\n}\n\n/**\n * Walk a rendered DOM subtree, collect headings, and assign missing `id`s\n * in-place so anchor links resolve immediately. Also sets `scrollMarginTop`\n * on each heading when `scrollMarginTop` is provided so navigation lands\n * cleanly below a sticky header.\n */\nexport function extractHeadingsFromElement(\n root: HTMLElement,\n options: ExtractHeadingsOptions & { scrollMarginTop?: number } = {},\n): ExtractedHeading[] {\n const levels = options.levels ?? DEFAULT_LEVELS;\n const slug = options.slugify ?? slugify;\n const selector = levels.map((l) => `h${l}`).join(\",\");\n const nodes = root.querySelectorAll<HTMLHeadingElement>(selector);\n const used = new Map<string, number>();\n // Reserve already-present IDs so generated ones don't collide.\n nodes.forEach((n) => {\n if (n.id) used.set(n.id, (used.get(n.id) ?? 0) + 1);\n });\n const out: ExtractedHeading[] = [];\n let i = 0;\n nodes.forEach((node) => {\n const level = Number(node.tagName.slice(1)) as HeadingLevel;\n const text = (node.textContent ?? \"\").replace(/\\s+/g, \" \").trim();\n if (!text) return;\n if (!node.id) {\n node.id = uniqueId(slug(text, i), used);\n }\n if (options.scrollMarginTop != null) {\n node.style.scrollMarginTop = `${options.scrollMarginTop}px`;\n }\n out.push({ id: node.id, text, level });\n i++;\n });\n return out;\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport type { SeoClientProps } from \"./seo.config\";\n\nfunction setMeta(attr: \"name\" | \"property\", key: string, content: string) {\n let element = document.head.querySelector<HTMLMetaElement>(\n `meta[${attr}=\"${key}\"]`,\n );\n if (!element) {\n if (!content) return;\n element = document.createElement(\"meta\");\n element.setAttribute(attr, key);\n document.head.appendChild(element);\n } else if (!content) {\n element.remove();\n return;\n }\n element.setAttribute(\"content\", content);\n}\n\nfunction setCanonical(url: string) {\n let canonical = document.head.querySelector<HTMLLinkElement>(\n 'link[rel=\"canonical\"]',\n );\n if (!canonical) {\n canonical = document.createElement(\"link\");\n canonical.rel = \"canonical\";\n document.head.appendChild(canonical);\n }\n canonical.href = url;\n}\n\n/** Render a JSON-LD <script>. Pass a built graph via `data`; renders nothing if absent. */\nexport function JsonLd({ data }: { data?: object }) {\n if (!data) return null;\n const html = JSON.stringify(data)\n .replace(/</g, \"\\\\u003c\")\n .replace(/>/g, \"\\\\u003e\")\n .replace(/\\u2028/g, \"\\\\u2028\")\n .replace(/\\u2029/g, \"\\\\u2029\");\n return (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n}\n\n/**\n * Imperatively sets document title, meta description, canonical URL and social\n * tags. Works in plain React apps and Next.js client components. In a Next.js\n * App Router app, prefer server `generateMetadata` from the `/next` entry.\n */\nexport function Seo({\n title,\n description,\n url,\n siteName,\n keywords,\n twitter,\n image,\n noindex,\n}: SeoClientProps) {\n useEffect(() => {\n document.title = title;\n setMeta(\"name\", \"description\", description);\n setCanonical(url);\n\n setMeta(\"property\", \"og:title\", title);\n setMeta(\"property\", \"og:description\", description);\n setMeta(\"property\", \"og:url\", url);\n setMeta(\"property\", \"og:site_name\", siteName || \"\");\n setMeta(\"name\", \"keywords\", keywords || \"\");\n setMeta(\"name\", \"robots\", noindex ? \"noindex\" : \"index\");\n\n setMeta(\"name\", \"twitter:card\", image ? \"summary_large_image\" : \"summary\");\n setMeta(\"name\", \"twitter:title\", title);\n setMeta(\"name\", \"twitter:description\", description);\n setMeta(\"name\", \"twitter:site\", twitter || \"\");\n setMeta(\"property\", \"og:image\", image || \"\");\n setMeta(\"name\", \"twitter:image\", image || \"\");\n }, [title, description, url, siteName, keywords, twitter, image, noindex]);\n\n return null;\n}\n","// Pure builders that turn CMS posts + config into SEO values. Server-safe.\n\nimport { cmsImage } from \"../utils/cmsImage\";\nimport type {\n AsteroidOgImageParams,\n AsteroidPageSeoOptions,\n AsteroidSeoConfig,\n ISeoValues,\n SeoClientProps,\n} from \"./seo.config\";\n\n/** Apply the configured title template, defaulting to `${title} | ${siteName}`. */\nexport function applyTitleTemplate(\n config: AsteroidSeoConfig,\n title: string,\n): string {\n return config.titleTemplate\n ? config.titleTemplate(title)\n : `${title} | ${config.siteName}`;\n}\n\nexport function buildOgImageUrl(\n config: AsteroidSeoConfig,\n params: AsteroidOgImageParams,\n): string | undefined {\n if (config.getOgImageUrl) {\n return config.getOgImageUrl(params);\n }\n\n const palette = config.ogImage?.palette;\n if (!palette) return undefined;\n\n const apiPath = config.ogImage?.apiPath ?? \"/api/og\";\n const base = config.baseUrl.replace(/\\/$/, \"\");\n const searchParams = new URLSearchParams({\n title: params.title,\n type: params.type ?? \"article\",\n siteName: config.siteName,\n bg: palette.background,\n fg: palette.foreground,\n accent: palette.accent,\n });\n\n if (params.subtitle?.trim()) searchParams.set(\"subtitle\", params.subtitle.trim());\n if (params.eyebrow?.trim()) searchParams.set(\"eyebrow\", params.eyebrow.trim());\n if (palette.accentMuted) searchParams.set(\"accentMuted\", palette.accentMuted);\n if (palette.mutedText) searchParams.set(\"muted\", palette.mutedText);\n\n return `${base}${apiPath}?${searchParams.toString()}`;\n}\n\ntype ArticleLike = {\n title: string;\n description?: string;\n meta_description?: string;\n featured_image?: string;\n};\n\n/**\n * Generic per-page SEO builder. Use it directly for landing/marketing pages, or\n * as the base for the article/listing wrappers below. Content-type agnostic.\n */\nexport function buildPageSeoValues(\n config: AsteroidSeoConfig,\n options: AsteroidPageSeoOptions,\n): ISeoValues {\n const base = config.baseUrl.replace(/\\/$/, \"\");\n const path = options.path ?? \"/\";\n const url = `${base}${path.startsWith(\"/\") ? path : `/${path}`}`;\n const description =\n options.description?.trim() ||\n config.defaultDescription ||\n `${options.title} - ${config.siteName}.`;\n\n return {\n title: applyTitleTemplate(config, options.title),\n siteName: config.siteName,\n twitter: config.twitter ?? \"\",\n description,\n url,\n keywords: options.keywords ?? config.defaultKeywords ?? options.title,\n image:\n options.image ??\n buildOgImageUrl(config, {\n title: options.title,\n subtitle: description,\n eyebrow: options.eyebrow,\n type: options.ogType === \"article\" ? \"article\" : \"listing\",\n }),\n noindex: options.noindex ?? config.noindex,\n manifestUrl: config.manifestUrl,\n };\n}\n\nfunction resolveArticleImage<TPost extends ArticleLike>(\n post: TPost,\n config: AsteroidSeoConfig,\n): string | undefined {\n // cmsUrl is required to resolve a real featured image. Without it we fall\n // back to the generated OG image rather than throwing; server builders must\n // never crash a render.\n const featuredImage = config.cmsUrl\n ? cmsImage(post.featured_image, { cmsUrl: config.cmsUrl })\n : \"\";\n\n if (featuredImage) return featuredImage;\n\n const description =\n post.meta_description?.trim() ||\n post.description?.trim() ||\n config.defaultDescription;\n\n return buildOgImageUrl(config, {\n title: post.title,\n subtitle: description,\n eyebrow: config.contentLabel ?? \"Article\",\n type: \"article\",\n });\n}\n\n/** SEO for a single article; works for news, articles, or docs pages. */\nexport function buildArticleSeoValues<TPost extends ArticleLike>(\n post: TPost,\n config: AsteroidSeoConfig,\n slug: string,\n options?: { noindex?: boolean },\n): ISeoValues {\n const articlePath = config.articlePath ?? \"/blog\";\n const url = `${config.baseUrl.replace(/\\/$/, \"\")}${articlePath}/${slug}`;\n const description =\n post.meta_description?.trim() ||\n post.description?.trim() ||\n config.defaultDescription ||\n `Read the latest from ${config.siteName}.`;\n\n return {\n title: applyTitleTemplate(config, post.title),\n siteName: config.siteName,\n twitter: config.twitter ?? \"\",\n description,\n url,\n keywords: config.defaultKeywords ?? post.title,\n image: resolveArticleImage(post, config),\n noindex: options?.noindex ?? config.noindex,\n manifestUrl: config.manifestUrl,\n };\n}\n\n/** SEO for an article collection / category listing (any content type). */\nexport function buildArticleListingSeoValues(\n config: AsteroidSeoConfig,\n options?: { categoryName?: string; categorySlug?: string; noindex?: boolean },\n): ISeoValues {\n const articlePath = config.articlePath ?? \"/blog\";\n const base = config.baseUrl.replace(/\\/$/, \"\");\n const label = config.contentLabel ?? \"Articles\";\n const categoryName = options?.categoryName?.trim();\n const categorySlug = options?.categorySlug?.trim();\n\n const titleText = categoryName ? `${categoryName} ${label}` : label;\n\n const description = categoryName\n ? `Explore ${categoryName} ${label.toLowerCase()}, guides, and the latest updates from ${config.siteName}.`\n : config.defaultDescription ||\n `Browse ${label.toLowerCase()}, insights, and the latest updates from ${config.siteName}.`;\n\n const url = categorySlug\n ? `${base}${articlePath}/category/${categorySlug}`\n : `${base}${articlePath}`;\n\n return {\n title: applyTitleTemplate(config, titleText),\n siteName: config.siteName,\n twitter: config.twitter ?? \"\",\n description,\n url,\n keywords:\n config.defaultKeywords ??\n (categoryName\n ? `${categoryName}, ${config.siteName}`\n : `${config.siteName} ${label.toLowerCase()}`),\n image: buildOgImageUrl(config, {\n title: titleText,\n subtitle: description,\n eyebrow: categoryName ? \"Category\" : label,\n type: \"listing\",\n }),\n noindex: options?.noindex ?? config.noindex,\n manifestUrl: config.manifestUrl,\n };\n}\n\nexport function seoValuesToClientProps(values: ISeoValues): SeoClientProps {\n return {\n title: values.title,\n description: values.description,\n url: values.url,\n siteName: values.siteName,\n keywords: values.keywords,\n twitter: values.twitter,\n image: values.image,\n noindex: values.noindex,\n };\n}\n","// Pure schema.org JSON-LD builders. Server-safe. No hardcoded site identity.\n\nimport type { AsteroidSeoConfig } from \"./seo.config\";\n\n/** Build the site-wide Organization + WebSite @graph from config. */\nexport function buildSiteJsonLd(config: AsteroidSeoConfig): object {\n const siteUrl = config.baseUrl.replace(/\\/$/, \"\");\n const org = config.organization;\n\n const organizationNode: Record<string, unknown> = {\n \"@type\": \"Organization\",\n \"@id\": `${siteUrl}/#organization`,\n name: config.siteName,\n legalName: config.siteName,\n url: siteUrl,\n };\n if (org?.logoUrl) {\n organizationNode.logo = { \"@type\": \"ImageObject\", url: org.logoUrl };\n }\n if (org?.contactPhone || org?.contactEmail) {\n organizationNode.contactPoint = {\n \"@type\": \"ContactPoint\",\n ...(org.contactPhone ? { telephone: org.contactPhone } : {}),\n ...(org.contactEmail ? { email: org.contactEmail } : {}),\n contactType: \"customer service\",\n };\n }\n if (org?.address) {\n organizationNode.address = {\n \"@type\": \"PostalAddress\",\n ...(org.address.street ? { streetAddress: org.address.street } : {}),\n ...(org.address.city ? { addressLocality: org.address.city } : {}),\n ...(org.address.country ? { addressCountry: org.address.country } : {}),\n };\n }\n if (org?.socials?.length) {\n organizationNode.sameAs = org.socials;\n }\n\n const websiteNode: Record<string, unknown> = {\n \"@type\": \"WebSite\",\n \"@id\": `${siteUrl}/#website`,\n url: siteUrl,\n name: config.siteName,\n publisher: { \"@id\": `${siteUrl}/#organization` },\n inLanguage: \"en-US\",\n };\n if (config.defaultDescription) {\n websiteNode.description = config.defaultDescription;\n }\n\n return {\n \"@context\": \"https://schema.org\",\n \"@graph\": [organizationNode, websiteNode, ...(config.extraJsonLdNodes ?? [])],\n };\n}\n\n/** schema.org Article subtypes; pick per content kind. */\nexport type ArticleJsonLdType =\n | \"Article\"\n | \"BlogPosting\"\n | \"NewsArticle\"\n | \"TechArticle\"\n | (string & {});\n\nexport type ArticleJsonLdProps = {\n title: string;\n description: string;\n url: string;\n /** Site name; used as the author fallback. */\n siteName: string;\n /** Normalized base URL (no trailing slash); used to reference the org/website @ids. */\n siteUrl: string;\n /** schema.org @type. Default: `\"Article\"`. */\n articleType?: ArticleJsonLdType;\n image?: string;\n authorName?: string;\n publishedTime?: string;\n tags?: string[];\n category?: string;\n};\n\nexport function buildArticleJsonLd(props: ArticleJsonLdProps): object {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": props.articleType ?? \"Article\",\n headline: props.title,\n description: props.description,\n url: props.url,\n ...(props.image ? { image: props.image } : {}),\n ...(props.publishedTime ? { datePublished: props.publishedTime } : {}),\n ...(props.category ? { articleSection: props.category } : {}),\n ...(props.tags && props.tags.length > 0\n ? { keywords: props.tags.join(\", \") }\n : {}),\n author: { \"@type\": \"Person\", name: props.authorName || props.siteName },\n publisher: { \"@id\": `${props.siteUrl}/#organization` },\n isPartOf: { \"@id\": `${props.siteUrl}/#website` },\n inLanguage: \"en-US\",\n };\n}\n\nexport type CollectionJsonLdProps = {\n name: string;\n description: string;\n url: string;\n /** Normalized base URL (no trailing slash); used to reference the org/website @ids. */\n siteUrl: string;\n};\n\nexport function buildCollectionJsonLd(props: CollectionJsonLdProps): object {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"CollectionPage\",\n name: props.name,\n description: props.description,\n url: props.url,\n isPartOf: { \"@id\": `${props.siteUrl}/#website` },\n publisher: { \"@id\": `${props.siteUrl}/#organization` },\n inLanguage: \"en-US\",\n };\n}\n\nexport type WebPageJsonLdProps = {\n name: string;\n description: string;\n url: string;\n /** Normalized base URL (no trailing slash); used to reference the org/website @ids. */\n siteUrl: string;\n};\n\n/** Generic WebPage node for landing/marketing pages with no article concept. */\nexport function buildWebPageJsonLd(props: WebPageJsonLdProps): object {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"WebPage\",\n name: props.name,\n description: props.description,\n url: props.url,\n isPartOf: { \"@id\": `${props.siteUrl}/#website` },\n publisher: { \"@id\": `${props.siteUrl}/#organization` },\n inLanguage: \"en-US\",\n };\n}\n","\"use client\";\n\nimport { useContext, type ReactNode } from \"react\";\nimport {\n seoValuesToClientProps,\n buildArticleSeoValues,\n} from \"../seo/seo.builders\";\nimport type { AsteroidSeoConfig } from \"../seo/seo.config\";\nimport { JsonLd, Seo } from \"../seo/Seo\";\nimport { buildArticleJsonLd, type ArticleJsonLdType } from \"../seo/jsonld\";\nimport { AsteroidCMSContext } from \"../provider/context\";\n\n// ----------------------------------------------------------------------------\n// Types\n// ----------------------------------------------------------------------------\n\nexport interface AsteroidArticlePagePost {\n slug: string;\n title: string;\n description?: string;\n content?: string;\n featured_image?: string;\n tags?: string;\n published_date?: string | null;\n category?: {\n slug: string;\n name: string;\n };\n author?: {\n name: string;\n bio?: string;\n };\n}\n\nexport type AsteroidArticlePageUseArticleResult<\n TPost extends AsteroidArticlePagePost = AsteroidArticlePagePost,\n> = {\n data?: TPost | null;\n loading: boolean;\n error?: unknown;\n};\n\nexport type AsteroidArticlePageUseArticle<\n TPost extends AsteroidArticlePagePost = AsteroidArticlePagePost,\n> = (slug: string) => AsteroidArticlePageUseArticleResult<TPost>;\n\nexport interface AsteroidArticlePageProps<\n TPost extends AsteroidArticlePagePost = AsteroidArticlePagePost,\n> {\n /** Article post slug to fetch. */\n slug: string;\n\n /** Inject the app-specific CMS fetching hook. */\n useArticle: AsteroidArticlePageUseArticle<TPost>;\n\n /** Site SEO config - enables client-side meta tags in React and Next.js apps. */\n seo?: AsteroidSeoConfig;\n\n /** schema.org Article subtype for the built-in JSON-LD. Default: \"Article\". */\n articleType?: ArticleJsonLdType;\n /** Mark this page as `noindex` for search engines. */\n noindex?: boolean;\n\n // Static content slots (shown when provided)\n /** \"Back to article\" link. */\n backLink?: ReactNode;\n\n // Render props\n /** Wrap the entire component output. */\n renderRoot?: (params: { children: ReactNode }) => ReactNode;\n\n /** Loading skeleton placeholder. */\n renderSkeleton?: () => ReactNode;\n\n /** Error or not-found state. */\n renderError?: (params: {\n error?: unknown;\n reason: \"error\" | \"not-found\";\n }) => ReactNode;\n\n /** Article post title / heading area. */\n renderHeader?: (params: { post: TPost }) => ReactNode;\n\n /** Article post metadata line (date, author, reading time, category chip). */\n renderMeta?: (params: { post: TPost }) => ReactNode;\n\n /** Article post description paragraph. */\n renderDescription?: (params: { post: TPost }) => ReactNode;\n\n /** Featured / hero image. */\n renderFeaturedImage?: (params: { post: TPost }) => ReactNode;\n\n /** Table of contents section. */\n renderToc?: (params: { post: TPost }) => ReactNode;\n\n /** Main rich-text content body. */\n renderContent?: (params: { post: TPost }) => ReactNode;\n\n /** Top advertisement slot. */\n renderPreArticle?: (params: { post: TPost }) => ReactNode;\n\n /** Middle advertisement slot. */\n renderMidArticle?: (params: { post: TPost }) => ReactNode;\n\n /** Bottom advertisement slot. */\n renderPostArticle?: (params: { post: TPost }) => ReactNode;\n\n /** Tags section. */\n renderTags?: (params: { post: TPost }) => ReactNode;\n\n /** Author details section. */\n renderAuthorDetails?: (params: { post: TPost }) => ReactNode;\n\n /** Related / similar posts section. */\n renderRelatedPosts?: (params: { post: TPost }) => ReactNode;\n\n /** Call-to-action section. */\n renderCTA?: (params: { post: TPost }) => ReactNode;\n\n /** Override the built-in Article JSON-LD structured data. */\n renderJsonLd?: (params: { post: TPost }) => ReactNode;\n\n /**\n * Escape hatch - receive the full result and render everything yourself.\n * When provided, structural render props above are ignored.\n */\n children?: (state: AsteroidArticlePageUseArticleResult<TPost>) => ReactNode;\n}\n\n// ----------------------------------------------------------------------------\n// AsteroidArticlePage\n// ----------------------------------------------------------------------------\n\nexport function AsteroidArticlePage<\n TPost extends AsteroidArticlePagePost = AsteroidArticlePagePost,\n>(props: AsteroidArticlePageProps<TPost>) {\n const {\n slug,\n useArticle,\n seo,\n articleType,\n backLink,\n renderRoot,\n renderSkeleton,\n renderError,\n renderHeader,\n renderMeta,\n renderDescription,\n renderFeaturedImage,\n renderToc,\n renderContent,\n renderPreArticle,\n renderMidArticle,\n renderPostArticle,\n renderTags,\n renderAuthorDetails,\n renderRelatedPosts,\n renderCTA,\n renderJsonLd,\n noindex,\n children,\n } = props;\n\n const { data: article, loading, error } = useArticle(slug);\n const cmsConfig = useContext(AsteroidCMSContext);\n const seoConfig =\n seo && !seo.cmsUrl && cmsConfig?.cmsUrl\n ? { ...seo, cmsUrl: cmsConfig.cmsUrl }\n : seo;\n\n // Escape hatch\n if (children) {\n return <>{children({ data: article, loading, error })}</>;\n }\n\n // Loading\n if (loading) {\n const body = renderSkeleton?.() ?? null;\n return renderRoot ? renderRoot({ children: body }) : <>{body}</>;\n }\n\n // Error / not found\n if (!article || error) {\n const body =\n renderError?.({ error, reason: error ? \"error\" : \"not-found\" }) ?? null;\n return renderRoot ? renderRoot({ children: body }) : <>{body}</>;\n }\n\n // Success\n const seoValues =\n seoConfig && article\n ? buildArticleSeoValues(article, seoConfig, slug, { noindex })\n : null;\n\n const body = (\n <>\n {seoValues ? <Seo {...seoValuesToClientProps(seoValues)} /> : null}\n {seoConfig && article\n ? (renderJsonLd?.({ post: article }) ?? (\n <JsonLd\n data={buildArticleJsonLd({\n title: article.title,\n description:\n article.description || seoConfig.defaultDescription || \"\",\n url: `${(seoConfig.baseUrl || \"\").replace(/\\/$/, \"\")}${\n seoConfig.articlePath ?? \"/blog\"\n }/${slug}`,\n siteName: seoConfig.siteName,\n siteUrl: (seoConfig.baseUrl || \"\").replace(/\\/$/, \"\"),\n articleType,\n image: seoValues?.image,\n authorName: article.author?.name,\n publishedTime: article.published_date || undefined,\n tags: article.tags\n ?.split(\",\")\n .map((t) => t.trim())\n .filter(Boolean),\n category: article.category?.name,\n })}\n />\n ))\n : null}\n {backLink}\n {renderPreArticle?.({ post: article })}\n {renderHeader?.({ post: article })}\n {renderMeta?.({ post: article })}\n {renderDescription?.({ post: article })}\n {renderFeaturedImage?.({ post: article })}\n {renderToc?.({ post: article })}\n {renderContent?.({ post: article })}\n {renderMidArticle?.({ post: article })}\n {renderTags?.({ post: article })}\n {renderAuthorDetails?.({ post: article })}\n {renderRelatedPosts?.({ post: article })}\n {renderCTA?.({ post: article })}\n {renderPostArticle?.({ post: article })}\n </>\n );\n\n return renderRoot ? renderRoot({ children: body }) : <>{body}</>;\n}\n","\"use client\";\n\nimport { Fragment, useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport {\n buildArticleListingSeoValues,\n seoValuesToClientProps,\n} from \"../seo/seo.builders\";\nimport type { AsteroidSeoConfig } from \"../seo/seo.config\";\nimport { JsonLd, Seo } from \"../seo/Seo\";\nimport { buildCollectionJsonLd } from \"../seo/jsonld\";\n\n// ----------------------------------------------------------------------------\n// Types\n// ----------------------------------------------------------------------------\n\n/** Minimal article post shape shared across Asteroid CMS apps. */\nexport interface AsteroidArticlePost {\n slug: string;\n title: string;\n description?: string;\n featured_image?: string;\n featured?: boolean;\n published_date?: string | null;\n category?: {\n slug: string;\n name: string;\n description?: string;\n };\n}\n\nexport interface AsteroidArticleCategoryGroup<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n> {\n categoryName: string;\n categorySlug: string;\n posts: TPost[];\n}\n\nexport interface AsteroidArticlesUsePostsResult<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n> {\n posts: TPost[];\n featured?: TPost | null;\n rest: TPost[];\n loading: boolean;\n error?: unknown;\n}\n\nexport type AsteroidArticlesUsePosts<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n> = (searchQuery: string) => AsteroidArticlesUsePostsResult<TPost>;\n\nexport interface AsteroidArticlesSearchParams {\n value: string;\n onChange: (value: string) => void;\n onSubmit: (event: React.FormEvent) => void;\n}\n\nexport interface AsteroidArticlesHeaderParams {\n eyebrow: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n search: ReactNode;\n}\n\nexport interface AsteroidArticlesFeaturedCardParams<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n> {\n post: TPost;\n}\n\nexport interface AsteroidArticlesPostCardParams<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n> {\n post: TPost;\n index: number;\n group: AsteroidArticleCategoryGroup<TPost>;\n}\n\nexport interface AsteroidArticlesPostGridParams<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n> {\n posts: TPost[];\n group: AsteroidArticleCategoryGroup<TPost>;\n /** Pre-built post cards - render as-is or wrap. */\n children: ReactNode;\n}\n\nexport interface AsteroidArticlesCategoryHeadingParams<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n> {\n group: AsteroidArticleCategoryGroup<TPost>;\n}\n\nexport interface AsteroidArticlesCategoryGroupParams<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n> {\n group: AsteroidArticleCategoryGroup<TPost>;\n /** Default heading + grid - use it, wrap it, or replace entirely. */\n defaultContent: ReactNode;\n}\n\nexport type AsteroidArticlesEmptyReason = \"error\" | \"no-posts\" | \"no-results\";\n\nexport interface AsteroidArticlesEmptyParams {\n reason: AsteroidArticlesEmptyReason;\n searchQuery?: string;\n error?: unknown;\n}\n\nexport interface AsteroidArticlesContentParams {\n featured: ReactNode;\n groups: ReactNode;\n noSearchResults: ReactNode;\n}\n\nexport interface AsteroidArticlesState<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n> {\n posts: TPost[];\n featured: TPost | null | undefined;\n rest: TPost[];\n categoryGroups: AsteroidArticleCategoryGroup<TPost>[];\n loading: boolean;\n error: unknown;\n hasError: boolean;\n isEmpty: boolean;\n isSearching: boolean;\n searchQuery: string;\n debouncedSearchQuery: string;\n setSearchQuery: (value: string) => void;\n}\n\nexport interface AsteroidArticlesProps<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n> {\n /** Inject app-specific CMS fetching. Receives the debounced search query. */\n usePosts: AsteroidArticlesUsePosts<TPost>;\n\n /** Limit listing to a single category slug. */\n categorySlug?: string;\n /** Limit listing to a single post slug. */\n articleSlug?: string;\n\n /** Debounce delay for search in ms. Default: 800 */\n searchDebounceMs?: number;\n\n /** Site SEO config - enables client-side meta tags in React and Next.js apps. */\n seo?: AsteroidSeoConfig;\n /** Mark this page as `noindex` for search engines. */\n noindex?: boolean;\n\n // Static header slots (content only - no styling in AsteroidArticles)\n eyebrow?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n\n // Render props (MUI DataGrid-style)\n /** Wrap the entire component output. */\n renderRoot?: (params: { children: ReactNode }) => ReactNode;\n /** Replace the default header layout (eyebrow + title + description + search). */\n renderHeader?: (params: AsteroidArticlesHeaderParams) => ReactNode;\n /** Replace the search control. */\n renderSearch?: (params: AsteroidArticlesSearchParams) => ReactNode;\n /** Featured hero card. Return `null` to suppress. Hidden while searching. */\n renderFeaturedCard?: (\n params: AsteroidArticlesFeaturedCardParams<TPost>,\n ) => ReactNode;\n /** Individual post card inside a grid. */\n renderPostCard: (params: AsteroidArticlesPostCardParams<TPost>) => ReactNode;\n /** Category section heading. */\n renderCategoryHeading?: (\n params: AsteroidArticlesCategoryHeadingParams<TPost>,\n ) => ReactNode;\n /** Grid wrapper for post cards within a category. */\n renderPostGrid?: (params: AsteroidArticlesPostGridParams<TPost>) => ReactNode;\n /**\n * Full category section (heading + grid).\n * Receives `defaultContent` so you can wrap rather than fully replace.\n */\n renderCategoryGroup?: (\n params: AsteroidArticlesCategoryGroupParams<TPost>,\n ) => ReactNode;\n /** Loading state. */\n renderSkeleton?: () => ReactNode;\n /** Error, empty feed, or zero search results. Return `null` to suppress. */\n renderEmpty?: (params: AsteroidArticlesEmptyParams) => ReactNode;\n /** Wrap featured card + category groups. */\n renderContent?: (params: AsteroidArticlesContentParams) => ReactNode;\n\n /** Override the built-in CollectionPage JSON-LD structured data. */\n renderJsonLd?: (params: AsteroidArticlesState<TPost>) => ReactNode;\n\n /**\n * Escape hatch - receive full computed state and render everything yourself.\n * When provided, structural render props above are ignored (slot render props\n * like `renderPostCard` are still used if you call them manually).\n */\n children?: (state: AsteroidArticlesState<TPost>) => ReactNode;\n\n /** Custom category grouping. */\n groupPostsByCategory?: (\n posts: TPost[],\n ) => AsteroidArticleCategoryGroup<TPost>[];\n}\n\n// ----------------------------------------------------------------------------\n// Utilities\n// ----------------------------------------------------------------------------\n\nfunction useDebouncedValue<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n}\n\nexport function defaultGetCategoryName(\n post: Pick<AsteroidArticlePost, \"category\">,\n): string | undefined {\n return post.category?.name?.trim() || undefined;\n}\n\nexport function defaultGroupPostsByCategory<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n>(posts: TPost[]): AsteroidArticleCategoryGroup<TPost>[] {\n const groups = new Map<string, AsteroidArticleCategoryGroup<TPost>>();\n\n for (const post of posts) {\n const categoryName = defaultGetCategoryName(post) || \"Other\";\n const categorySlug = post.category?.slug || \"other\";\n const existing = groups.get(categorySlug);\n\n if (existing) {\n existing.posts.push(post);\n } else {\n groups.set(categorySlug, { categoryName, categorySlug, posts: [post] });\n }\n }\n\n return Array.from(groups.values());\n}\n\nfunction applyPostFilters<TPost extends AsteroidArticlePost>(\n posts: TPost[],\n {\n categorySlug,\n articleSlug,\n }: Pick<AsteroidArticlesProps<TPost>, \"categorySlug\" | \"articleSlug\">,\n): TPost[] {\n let filtered = posts;\n\n if (categorySlug) {\n filtered = filtered.filter((post) => post.category?.slug === categorySlug);\n }\n\n if (articleSlug) {\n filtered = filtered.filter((post) => post.slug === articleSlug);\n }\n\n return filtered;\n}\n\nfunction splitFeaturedAndRest<TPost extends AsteroidArticlePost>(\n posts: TPost[],\n): { featured: TPost | null; rest: TPost[] } {\n const featured = posts.find((post) => post.featured) ?? null;\n const rest = featured\n ? posts.filter((post) => post.slug !== featured.slug)\n : [...posts];\n\n return { featured, rest };\n}\n\n// ----------------------------------------------------------------------------\n// State hook (headless usage)\n// ----------------------------------------------------------------------------\n\nexport function useAsteroidArticlesState<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n>({\n usePosts,\n categorySlug,\n articleSlug,\n searchDebounceMs = 800,\n groupPostsByCategory = defaultGroupPostsByCategory,\n}: Pick<\n AsteroidArticlesProps<TPost>,\n | \"usePosts\"\n | \"categorySlug\"\n | \"articleSlug\"\n | \"searchDebounceMs\"\n | \"groupPostsByCategory\"\n>): AsteroidArticlesState<TPost> {\n const [searchQuery, setSearchQuery] = useState(\"\");\n const debouncedSearchQuery = useDebouncedValue(searchQuery, searchDebounceMs);\n\n const { posts: rawPosts, loading, error } = usePosts(debouncedSearchQuery);\n\n const posts = useMemo(\n () => applyPostFilters(rawPosts, { categorySlug, articleSlug }),\n [rawPosts, categorySlug, articleSlug],\n );\n\n const { featured, rest } = useMemo(\n () => splitFeaturedAndRest(posts),\n [posts],\n );\n\n const isSearching = debouncedSearchQuery.trim().length > 0;\n\n const categoryGroups = useMemo(() => {\n if (isSearching) {\n if (posts.length === 0) return [];\n return [\n {\n categoryName: `Search results for \"${debouncedSearchQuery.trim()}\"`,\n categorySlug: \"search-results\",\n posts,\n },\n ];\n }\n return groupPostsByCategory(rest);\n }, [isSearching, posts, debouncedSearchQuery, rest, groupPostsByCategory]);\n\n const hasError = Boolean(error);\n const isEmpty = !featured && rest.length === 0;\n\n return {\n posts,\n featured,\n rest,\n categoryGroups,\n loading,\n error,\n hasError,\n isEmpty,\n isSearching,\n searchQuery,\n debouncedSearchQuery,\n setSearchQuery,\n };\n}\n\n// ----------------------------------------------------------------------------\n// AsteroidArticlesListing\n// ----------------------------------------------------------------------------\n\nexport function AsteroidArticlesListing<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n>(props: AsteroidArticlesProps<TPost>) {\n const {\n eyebrow,\n title,\n description,\n seo,\n categorySlug,\n renderRoot,\n renderHeader,\n renderSearch,\n renderFeaturedCard,\n renderPostCard,\n renderCategoryHeading,\n renderPostGrid,\n renderCategoryGroup,\n renderSkeleton,\n renderEmpty,\n renderContent,\n renderJsonLd,\n noindex,\n children,\n } = props;\n\n const state = useAsteroidArticlesState(props);\n\n const categoryName = categorySlug\n ? state.posts[0]?.category?.name?.trim()\n : undefined;\n\n if (children) {\n return <>{children(state)}</>;\n }\n\n const seoNode = seo ? (\n <Seo\n {...seoValuesToClientProps(\n buildArticleListingSeoValues(seo, {\n categoryName,\n categorySlug,\n noindex,\n }),\n )}\n />\n ) : null;\n\n const jsonLdNode = seo\n ? (renderJsonLd?.(state) ?? (\n <JsonLd\n data={buildCollectionJsonLd({\n name: categoryName || `${seo.siteName} ${seo.contentLabel ?? \"Articles\"}`,\n description: seo.defaultDescription || \"\",\n url: `${(seo.baseUrl || \"\").replace(/\\/$/, \"\")}${\n seo.articlePath ?? \"/blog\"\n }${categorySlug ? `/category/${categorySlug}` : \"\"}`,\n siteUrl: (seo.baseUrl || \"\").replace(/\\/$/, \"\"),\n })}\n />\n ))\n : null;\n\n const handleSearchSubmit = (event: React.FormEvent) => {\n event.preventDefault();\n };\n\n const searchNode = renderSearch\n ? renderSearch({\n value: state.searchQuery,\n onChange: state.setSearchQuery,\n onSubmit: handleSearchSubmit,\n })\n : null;\n\n const headerNode = renderHeader ? (\n renderHeader({ eyebrow, title, description, search: searchNode })\n ) : (\n <>\n {eyebrow}\n {title}\n {description}\n {searchNode}\n </>\n );\n\n const featuredNode =\n state.featured && !state.isSearching && renderFeaturedCard\n ? renderFeaturedCard({ post: state.featured })\n : null;\n\n const noSearchResultsNode =\n state.isSearching && !state.loading && state.posts.length === 0\n ? (renderEmpty?.({\n reason: \"no-results\",\n searchQuery: state.debouncedSearchQuery.trim(),\n }) ?? null)\n : null;\n\n const groupsNode = noSearchResultsNode\n ? null\n : state.categoryGroups.map((group) => {\n const postCards = group.posts.map((post, index) => (\n <Fragment key={post.slug ?? index}>\n {renderPostCard({ post, index, group })}\n </Fragment>\n ));\n\n const gridNode = renderPostGrid ? (\n renderPostGrid({ posts: group.posts, group, children: postCards })\n ) : (\n <>{postCards}</>\n );\n\n const headingNode = renderCategoryHeading\n ? renderCategoryHeading({ group })\n : group.categoryName;\n\n const defaultContent = (\n <>\n {headingNode}\n {gridNode}\n </>\n );\n\n return renderCategoryGroup\n ? renderCategoryGroup({ group, defaultContent })\n : defaultContent;\n });\n\n const contentNode =\n !state.loading &&\n !state.hasError &&\n (state.featured || state.rest.length > 0) ? (\n renderContent ? (\n renderContent({\n featured: featuredNode,\n groups: groupsNode,\n noSearchResults: noSearchResultsNode,\n })\n ) : (\n <>\n {featuredNode}\n {noSearchResultsNode}\n {groupsNode}\n </>\n )\n ) : null;\n\n const body = (\n <>\n {seoNode}\n {jsonLdNode}\n {headerNode}\n {state.loading ? renderSkeleton?.() : null}\n {!state.loading && (state.hasError || state.isEmpty)\n ? renderEmpty?.({\n reason: state.hasError ? \"error\" : \"no-posts\",\n searchQuery: state.debouncedSearchQuery.trim(),\n error: state.error,\n })\n : null}\n {contentNode}\n </>\n );\n\n return renderRoot ? renderRoot({ children: body }) : <>{body}</>;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/provider/context.ts","../src/apollo/errorLink.ts","../src/apollo/createApolloClient.ts","../src/provider/AsteroidCMSProvider.tsx","../src/hooks/useCmsContent.tsx","../src/hooks/useCmsMutate.tsx","../src/utils/cmsImage.ts","../src/components/richTextParser.ts","../src/components/RichTextContent.tsx","../src/utils/extractHeadings.ts","../src/seo/Seo.tsx","../src/seo/seo.builders.ts","../src/seo/jsonld.ts","../src/components/articles/article.view.tsx","../src/components/articles/AsteroidArticlePage.tsx","../src/components/articles/articles.state.ts","../src/components/articles/articles.view.tsx","../src/components/articles/AsteroidArticlesListing.tsx","../src/components/articles/ArticleSearchBox.tsx"],"names":["alias","gql","end","next","escapeHtml","i","j","label","jsx","RichTextContent","useMemo","cmsImage","jsxs","Fragment","useContext","body","useState","useEffect","useRef"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAkPxB,IAAI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","file":"client.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/**\n * Build a runtime-agnostic image resolver. Passes absolute http(s) URLs\n * through unchanged; otherwise resolves a CMS asset id to a canonical media\n * URL. Returns \"\" when input is empty or no `cmsUrl` is configured.\n */\nexport function createImageResolver(options: {\n cmsUrl?: string;\n mediaPath?: string;\n}): (idOrUrl?: string) => string {\n return (idOrUrl?: string) => {\n if (!idOrUrl) return \"\";\n if (/^https?:\\/\\//i.test(idOrUrl)) return idOrUrl;\n if (!options.cmsUrl) return \"\";\n return cmsImage(idOrUrl, { cmsUrl: options.cmsUrl, mediaPath: options.mediaPath });\n };\n}\n","/**\n * Portable rich-text parser for CMS content.\n *\n * Zero runtime dependencies. Safe to copy into any consuming frontend.\n *\n * Pipeline:\n * 1. Detect & migrate legacy \"markdown-in-divs\" content to clean semantic HTML.\n * 2. Walk the HTML through a tag/attribute allowlist (strips <script>, event\n * handlers, javascript: URLs, unknown tags).\n * 3. Merge per-tag and per-variant classes from `options.classMap`.\n *\n * Idempotent: parseRichText(parseRichText(x, opts), opts) === parseRichText(x, opts).\n */\n\nexport type RichTextClassKey =\n | \"p\"\n | \"br\"\n | \"hr\"\n | \"h1\"\n | \"h2\"\n | \"h3\"\n | \"h4\"\n | \"h5\"\n | \"h6\"\n | \"ul\"\n | \"ol\"\n | \"li\"\n | \"blockquote\"\n | \"pre\"\n | \"code\"\n | \"inlineCode\"\n | \"a\"\n | \"strong\"\n | \"em\"\n | \"u\"\n | \"s\"\n | \"kbd\"\n | \"table\"\n | \"tableWrapper\"\n | \"thead\"\n | \"tbody\"\n | \"tr\"\n | \"th\"\n | \"td\"\n | \"figure\"\n | \"figcaption\"\n | \"img\"\n | \"span\"\n | \"callout\"\n | \"calloutTitle\"\n | \"collapsible\"\n | \"collapsibleTitle\";\n\nexport type RichTextClassMap = Partial<Record<RichTextClassKey, string>> & {\n /** Variant overrides keyed as `${matchKey}:${variant}`, e.g. \"callout:warning\". */\n variants?: Record<string, string>;\n};\n\nexport interface ParseRichTextOptions {\n classMap?: RichTextClassMap;\n /** Tag allowlist override. Defaults to a safe semantic set. */\n allowlist?: ReadonlyArray<string>;\n /**\n * When `true` (default), inject slugified `id` attributes on `<h1>`–`<h6>`\n * tags that don't already have one. Lets ToC anchors resolve from the\n * server-rendered markup without a client-side mutation step.\n */\n autoHeadingIds?: boolean;\n}\n\nconst DEFAULT_ALLOWLIST: ReadonlyArray<string> = [\n \"p\",\n \"br\",\n \"hr\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"ul\",\n \"ol\",\n \"li\",\n \"blockquote\",\n \"pre\",\n \"code\",\n \"kbd\",\n \"a\",\n \"strong\",\n \"em\",\n \"u\",\n \"b\",\n \"i\",\n \"s\",\n \"strike\",\n \"del\",\n \"mark\",\n \"small\",\n \"sub\",\n \"sup\",\n \"table\",\n \"thead\",\n \"tbody\",\n \"tfoot\",\n \"tr\",\n \"th\",\n \"td\",\n \"colgroup\",\n \"col\",\n \"figure\",\n \"figcaption\",\n \"img\",\n \"aside\",\n \"section\",\n \"article\",\n \"div\",\n \"span\",\n \"details\",\n \"summary\",\n];\n\n/** Per-tag attribute allowlist. Global attrs from GLOBAL_ALLOWED_ATTRS apply to all. */\nconst ALLOWED_ATTRS: Record<string, ReadonlyArray<string>> = {\n a: [\"href\", \"title\", \"target\", \"rel\"],\n img: [\"src\", \"alt\", \"title\", \"width\", \"height\", \"loading\"],\n th: [\"colspan\", \"rowspan\", \"scope\"],\n td: [\"colspan\", \"rowspan\"],\n col: [\"span\", \"width\"],\n colgroup: [\"span\"],\n table: [\"border\", \"cellpadding\", \"cellspacing\"],\n span: [\"style\"],\n details: [\"open\"],\n};\n\n/**\n * Tag → allowlisted CSS property names. Inline `style` is otherwise blocked\n * by the sanitizer; properties listed here are extracted and re-emitted with\n * value-level validation.\n */\nconst ALLOWED_STYLE_PROPS: Record<string, ReadonlyArray<string>> = {\n span: [\"font-size\"],\n};\n\n/** Strict per-property value validators for inline `style` declarations. */\nconst STYLE_VALUE_VALIDATORS: Record<string, (value: string) => boolean> = {\n \"font-size\": (v) => /^\\d{1,3}(?:\\.\\d+)?(?:px|rem|em|%)$/.test(v.trim()),\n};\n\nfunction sanitizeStyle(tag: string, style: string): string {\n const allowed = ALLOWED_STYLE_PROPS[tag];\n if (!allowed || !style) return \"\";\n const out: string[] = [];\n for (const decl of style.split(\";\")) {\n const idx = decl.indexOf(\":\");\n if (idx === -1) continue;\n const name = decl.slice(0, idx).trim().toLowerCase();\n const value = decl.slice(idx + 1).trim();\n if (!allowed.includes(name)) continue;\n const validate = STYLE_VALUE_VALIDATORS[name];\n if (!validate || !validate(value)) continue;\n out.push(`${name}: ${value}`);\n }\n return out.join(\"; \");\n}\n\nconst GLOBAL_ALLOWED_ATTRS: ReadonlyArray<string> = [\n \"id\",\n \"class\",\n \"lang\",\n \"dir\",\n \"data-variant\",\n \"data-callout\",\n \"data-title\",\n \"data-callout-title\",\n \"data-language\",\n \"data-filename\",\n \"data-icon\",\n];\n\nconst URL_ATTRS = new Set([\"href\", \"src\"]);\n\n/* -------------------------------------------------------------------------- */\n/* Public API */\n/* -------------------------------------------------------------------------- */\n\nexport function parseRichText(\n html: string,\n options: ParseRichTextOptions = {},\n): string {\n if (!html || typeof html !== \"string\") return \"\";\n\n let working = isLegacyFormat(html) ? migrateLegacyToHtml(html) : html;\n working = removeEmptyParagraphs(working);\n working = upgradeStandaloneImages(working);\n working = upgradeAuthoredBlockquotes(working);\n working = flattenTableCellParagraphs(working);\n working = sanitizeAndStyle(working, options);\n if (options.autoHeadingIds !== false) {\n working = injectHeadingIds(working);\n }\n return working;\n}\n\n/**\n * Add a slugified `id` to each `<h1>`–`<h6>` that doesn't already have one.\n * Pure string transform; safe to run as a post-pass after sanitization.\n */\nfunction injectHeadingIds(html: string): string {\n const used = new Map<string, number>();\n // First, reserve existing IDs so generated slugs don't collide with them.\n const existingRe = /<h[1-6]\\b[^>]*\\bid\\s*=\\s*(\"([^\"]*)\"|'([^']*)'|(\\S+))/gi;\n let em: RegExpExecArray | null;\n while ((em = existingRe.exec(html)) !== null) {\n const id = em[2] ?? em[3] ?? em[4] ?? \"\";\n if (id) used.set(id, (used.get(id) ?? 0) + 1);\n }\n return html.replace(\n /<(h[1-6])\\b([^>]*)>([\\s\\S]*?)<\\/\\1>/gi,\n (full, tag: string, attrs: string, inner: string) => {\n if (/\\bid\\s*=/i.test(attrs)) return full;\n const text = inner\n .replace(/<[^>]+>/g, \" \")\n .replace(/ /g, \" \")\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/\\s+/g, \" \")\n .trim();\n if (!text) return full;\n const base = slugifyHeading(text) || tag;\n const n = used.get(base) ?? 0;\n used.set(base, n + 1);\n const id = n === 0 ? base : `${base}-${n}`;\n return `<${tag}${attrs} id=\"${id}\">${inner}</${tag}>`;\n },\n );\n}\n\nfunction slugifyHeading(text: string): string {\n return text\n .normalize(\"NFKD\")\n .replace(/[̀-ͯ]/g, \"\")\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\n/**\n * Tiptap stores table-cell content as `<p>` blocks (`<td><p>x</p></td>`),\n * which produces unwanted vertical margin and an extra block element when\n * consumers style table cells. Unwrap the paragraphs so cells hold inline\n * content directly. Multiple `<p>` siblings inside the same cell are joined\n * with `<br />` so line breaks survive.\n */\nfunction flattenTableCellParagraphs(html: string): string {\n return html.replace(\n /<(th|td)\\b([^>]*)>([\\s\\S]*?)<\\/\\1>/gi,\n (_full, tag: string, attrs: string, inner: string) => {\n let flat = inner;\n // Drop opening <p ...> tags.\n flat = flat.replace(/<p\\b[^>]*>/gi, \"\");\n // Replace closing </p> followed by more content with a <br/>, drop trailing ones.\n flat = flat.replace(/<\\/p>(\\s*)(?=\\S)/gi, \"<br />$1\");\n flat = flat.replace(/<\\/p>\\s*$/i, \"\");\n return `<${tag}${attrs}>${flat.trim()}</${tag}>`;\n },\n );\n}\n\n/**\n * Strips `<p>` elements that contain nothing but whitespace, ` `, 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| |<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*(?:>|```|\\|)/i.test(html);\n}\n\nfunction decodeEntities(input: string): string {\n return input\n .replace(/ /g, \" \")\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n}\n\nfunction escapeHtml(input: string): string {\n return input\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\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 `` 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, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\");\n}\n\nfunction classKeyForTag(\n tag: string,\n attrs: Record<string, string>,\n openStack: ReadonlyArray<string>,\n): RichTextClassKey | null {\n if (tag === \"aside\" && \"data-callout\" in attrs) return \"callout\";\n if (tag === \"p\" && \"data-callout-title\" in attrs) return \"calloutTitle\";\n if (tag === \"code\" && openStack[openStack.length - 1] !== \"pre\")\n return \"inlineCode\";\n if (tag === \"details\") return \"collapsible\";\n if (tag === \"summary\") return \"collapsibleTitle\";\n\n const known: ReadonlyArray<RichTextClassKey> = [\n \"p\",\n \"br\",\n \"hr\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"ul\",\n \"ol\",\n \"li\",\n \"blockquote\",\n \"pre\",\n \"code\",\n \"kbd\",\n \"a\",\n \"strong\",\n \"em\",\n \"u\",\n \"s\",\n \"table\",\n \"thead\",\n \"tbody\",\n \"tr\",\n \"th\",\n \"td\",\n \"figure\",\n \"figcaption\",\n \"img\",\n \"span\",\n ];\n return (known as ReadonlyArray<string>).includes(tag)\n ? (tag as RichTextClassKey)\n : null;\n}\n\nfunction variantClass(\n classMap: RichTextClassMap | undefined,\n matchKey: string | null,\n variant: string | undefined,\n): string | undefined {\n if (!classMap?.variants || !matchKey || !variant) return undefined;\n return classMap.variants[`${matchKey}:${variant}`];\n}\n\nfunction sanitizeAndStyle(html: string, options: ParseRichTextOptions): string {\n const allowlist = options.allowlist ?? DEFAULT_ALLOWLIST;\n const classMap = options.classMap;\n const tokens = tokenize(html);\n const out: string[] = [];\n const openStack: string[] = [];\n const skipStack: Array<{ tag: string; dropChildren: boolean }> = [];\n const tableWrapperStack: boolean[] = [];\n\n for (let tokenIdx = 0; tokenIdx < tokens.length; tokenIdx++) {\n const token = tokens[tokenIdx];\n if (token.type === \"comment\") continue;\n\n if (token.type === \"text\") {\n if (skipStack.length > 0 && skipStack[skipStack.length - 1].dropChildren)\n continue;\n out.push(token.value);\n continue;\n }\n\n if (token.type === \"open\") {\n const allowed = allowlist.includes(token.tag);\n const dropChildren = token.tag === \"script\" || token.tag === \"style\";\n\n if (!allowed) {\n if (!token.selfClosing)\n skipStack.push({ tag: token.tag, dropChildren });\n continue;\n }\n\n const safeAttrs: Record<string, string> = {};\n for (const [name, value] of Object.entries(token.attrs)) {\n if (!isAttrAllowed(token.tag, name)) continue;\n if (URL_ATTRS.has(name) && !isSafeUrl(value)) continue;\n if (name === \"style\") {\n const cleaned = sanitizeStyle(token.tag, value);\n if (cleaned) safeAttrs.style = cleaned;\n continue;\n }\n safeAttrs[name] = value;\n }\n\n const matchKey = classKeyForTag(token.tag, token.attrs, openStack);\n const variant = token.attrs[\"data-variant\"];\n\n const classes: string[] = [];\n if (safeAttrs.class) classes.push(safeAttrs.class);\n if (matchKey && classMap?.[matchKey])\n classes.push(classMap[matchKey] as string);\n const variantCls = variantClass(classMap, matchKey, variant);\n if (variantCls) classes.push(variantCls);\n\n if (token.tag === \"a\") {\n if (safeAttrs.target === \"_blank\" && !safeAttrs.rel)\n safeAttrs.rel = \"noreferrer noopener\";\n }\n\n const merged = classes.join(\" \").trim();\n if (merged) safeAttrs.class = merged;\n else delete safeAttrs.class;\n\n const attrStr = Object.entries(safeAttrs)\n .map(([k, v]) => `${k}=\"${escapeAttr(v)}\"`)\n .join(\" \");\n\n if (token.tag === \"table\") {\n const wrapperClass = classMap?.tableWrapper;\n if (wrapperClass) {\n out.push(`<div class=\"${escapeAttr(wrapperClass)}\">`);\n tableWrapperStack.push(true);\n } else {\n tableWrapperStack.push(false);\n }\n }\n\n out.push(\n `<${token.tag}${attrStr ? \" \" + attrStr : \"\"}${token.selfClosing ? \" /\" : \"\"}>`,\n );\n if (!token.selfClosing) openStack.push(token.tag);\n\n if (\n token.tag === \"aside\" &&\n \"data-callout\" in token.attrs &&\n token.attrs[\"data-title\"]\n ) {\n const title = token.attrs[\"data-title\"];\n let lookahead = tokenIdx + 1;\n while (lookahead < tokens.length) {\n const next = tokens[lookahead];\n if (next.type === \"comment\") {\n lookahead++;\n continue;\n }\n if (next.type === \"text\" && next.value.trim() === \"\") {\n lookahead++;\n continue;\n }\n break;\n }\n const next = tokens[lookahead];\n const alreadyHasTitle =\n next &&\n next.type === \"open\" &&\n next.tag === \"p\" &&\n \"data-callout-title\" in next.attrs;\n if (!alreadyHasTitle) {\n const titleClasses: string[] = [];\n if (classMap?.calloutTitle) titleClasses.push(classMap.calloutTitle);\n const titleVariantCls = variantClass(\n classMap,\n \"calloutTitle\",\n token.attrs[\"data-variant\"],\n );\n if (titleVariantCls) titleClasses.push(titleVariantCls);\n const titleClassAttr = titleClasses.length\n ? ` class=\"${escapeAttr(titleClasses.join(\" \"))}\"`\n : \"\";\n out.push(\n `<p data-callout-title=\"true\"${titleClassAttr}>${escapeHtml(title)}</p>`,\n );\n }\n }\n continue;\n }\n\n if (token.type === \"close\") {\n if (\n skipStack.length > 0 &&\n skipStack[skipStack.length - 1].tag === token.tag\n ) {\n skipStack.pop();\n continue;\n }\n if (!allowlist.includes(token.tag)) continue;\n const idx = openStack.lastIndexOf(token.tag);\n if (idx === -1) continue;\n while (openStack.length > idx + 1) {\n const orphan = openStack.pop() as string;\n out.push(`</${orphan}>`);\n }\n openStack.pop();\n out.push(`</${token.tag}>`);\n if (token.tag === \"table\" && tableWrapperStack.pop()) {\n out.push(`</div>`);\n }\n }\n }\n\n while (openStack.length > 0) {\n const tag = openStack.pop() as string;\n out.push(`</${tag}>`);\n if (tag === \"table\" && tableWrapperStack.pop()) {\n out.push(`</div>`);\n }\n }\n\n return out.join(\"\");\n}\n","import {\n createElement,\n Fragment,\n memo,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport hljs from \"highlight.js/lib/common\";\nimport {\n parseRichText,\n type ParseRichTextOptions,\n type RichTextClassMap,\n} from \"./richTextParser\";\n\nexport type { RichTextClassMap, ParseRichTextOptions };\n\ninterface RichTextContentProps {\n html: string;\n classMap?: RichTextClassMap;\n /** Wrapper element. Defaults to `div`. Use `article` for blog content. */\n as?: keyof React.JSX.IntrinsicElements;\n className?: string;\n /**\n * Fires after the parsed HTML is in the DOM and post-render enhancements\n * (syntax highlighting, copy buttons, blockquote decorations) have run.\n * The wrapper element is passed back so callers can read headings, attach\n * a ToC observer, or do other DOM work without re-querying.\n */\n onReady?: (root: HTMLElement) => void;\n /**\n * Optional ref to the wrapper element. Useful for consumers that need a\n * stable reference to the rendered tree (e.g. scroll observers, ToC hooks).\n */\n contentRef?: React.MutableRefObject<HTMLElement | null>;\n /**\n * Per-variant icon override for callouts that opt into icons via\n * `data-icon`. Provide a React element for any variant key — these\n * elements are rendered into the chip via a portal, so they live in\n * React land (refs, event handlers, theme context all work). Variants\n * you don't provide fall back to the built-in SVG glyph.\n *\n * Common variants: `\"info\" | \"warning\" | \"success\" | \"danger\" | \"default\"`.\n * Custom variant names work too — anything you set via\n * `data-variant` on an `<aside data-callout>`.\n *\n * Example:\n * ```tsx\n * import { Info, AlertTriangle } from \"lucide-react\";\n *\n * <RichTextContent\n * html={article.doc}\n * calloutIcons={{\n * info: <Info size={14} strokeWidth={2.4} />,\n * warning: <AlertTriangle size={14} strokeWidth={2.4} />,\n * }}\n * />\n * ```\n */\n calloutIcons?: Partial<Record<string, ReactNode>>;\n}\n\n/**\n * Default look for the pullquote figure emitted by the parser when a\n * blockquote ends with an attribution line (`— Name`). Styles the decorative\n * curly quote marks and gives the author its own treatment so it reads as a\n * separate element from the quote body.\n */\nconst DEFAULT_CLASS_MAP: RichTextClassMap = {\n variants: {\n \"figure:pullquote\": \"relative my-8\",\n \"blockquote:pullquote\":\n \"relative italic text-lg leading-snug tracking-[-0.01em] sm:text-xl\",\n \"figcaption:pullquote\":\n \"mt-4 pt-3 border-t border-current/15 not-italic text-xs uppercase tracking-[0.14em] opacity-80\",\n \"span:quote-open\":\n \"mr-1 font-serif text-[1.4em] leading-none align-[-0.15em] opacity-60 select-none\",\n \"span:quote-close\":\n \"ml-1 font-serif text-[1.4em] leading-none align-[-0.15em] opacity-60 select-none\",\n \"span:author\":\n \"ml-1 font-semibold not-italic tracking-[0.16em] text-current\",\n },\n};\n\nfunction mergeClassMap(\n defaults: RichTextClassMap,\n user?: RichTextClassMap,\n): RichTextClassMap {\n if (!user) return defaults;\n return {\n ...defaults,\n ...user,\n variants: { ...defaults.variants, ...user.variants },\n };\n}\n\n/**\n * Server-safe React renderer for CMS rich text fields.\n *\n * Pairs with `parseRichText` from `richTextParser.ts`. Pass a `classMap`\n * keyed by tag, plus special wrapper keys like `tableWrapper`\n * (and `variants` keyed by `${tag}:${variantName}`) to apply frontend-specific\n * Tailwind classes without changing stored content.\n *\n * Built-in figure variants emitted by the parser:\n * - `figure:image` / `figcaption:image` — wraps standalone `<img>` blocks\n * and renders the alt/title as a centered caption.\n * - `figure:pullquote` / `blockquote:pullquote` / `figcaption:pullquote` —\n * emitted when a blockquote ends with an attribution line like\n * `— Name` (em/en dash or `--`). The author moves to the `<figcaption>`.\n * The blockquote body is wrapped with `<span data-variant=\"quote-open\">“</span>`\n * and `<span data-variant=\"quote-close\">”</span>`, addressable via the\n * `span:quote-open` / `span:quote-close` keys in `classMap.variants` so\n * the decorative marks can be sized, colored, or hidden independently.\n * The author name inside `<figcaption>` is wrapped in\n * `<span data-variant=\"author\">…</span>` (after the em-dash separator)\n * so it can be styled with its own `span:author` variant key without\n * affecting the dash.\n * - `tableWrapper` — wraps each sanitized `<table>` in a scroll container\n * before the table tag itself is rendered. Useful when you need the\n * table to match a bordered, horizontally scrollable design exactly.\n *\n * Sensible defaults for the pullquote layout (decorative quote marks +\n * distinct author treatment) ship in `DEFAULT_CLASS_MAP` and are merged with\n * the caller's `classMap` — user values win on conflict.\n *\n * Example:\n * ```\n * <RichTextContent\n * html={post.body}\n * classMap={{\n * figure: \"mt-10\",\n * variants: {\n * \"figure:pullquote\":\n * \"rounded-xl border-l-4 border-primary-color bg-primary-color/4 p-6 sm:p-8\",\n * \"blockquote:pullquote\":\n * \"text-lg font-medium leading-snug tracking-[-0.01em] sm:text-xl\",\n * \"figcaption:pullquote\":\n * \"mt-3 text-xs font-semibold uppercase tracking-[0.14em] text-primary-color\",\n * \"figcaption:image\": \"mt-3 text-center text-xs text-secondary-color\",\n * },\n * }}\n * />\n * ```\n *\n * Copy this file + `richTextParser.ts` into any consuming frontend; both\n * are dependency-free aside from React.\n */\nconst COPY_ICON_SVG = `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path></svg>`;\nconst CHECK_ICON_SVG = `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>`;\n\nconst ATTRIBUTION_RE = /^(?:[—–-]+|--)\\s+\\S/;\n\nfunction isAttributionEl(el: Element | null): boolean {\n if (!el) return false;\n if (el.getAttribute(\"data-variant\") === \"attribution\") return true;\n return ATTRIBUTION_RE.test((el.textContent ?? \"\").trim());\n}\n\nfunction findQuoteBody(bq: HTMLQuoteElement): {\n first: HTMLElement | null;\n last: HTMLElement | null;\n} {\n const children = Array.from(bq.children) as HTMLElement[];\n if (children.length === 0) return { first: null, last: null };\n let lastIdx = children.length - 1;\n // Skip trailing attribution paragraph(s) when picking where the closing\n // quote mark belongs.\n while (lastIdx >= 0 && isAttributionEl(children[lastIdx])) lastIdx--;\n if (lastIdx < 0) return { first: null, last: null };\n return { first: children[0], last: children[lastIdx] };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Callout icon injection */\n/* -------------------------------------------------------------------------- */\n\n// Per-variant SVG glyphs rendered inside the callout chip when the author\n// opts into the icon. Kept as raw strings so they can be inlined cheaply via\n// `innerHTML`. All glyphs share the same 16×16 viewBox so they line up in\n// the chip.\nconst CALLOUT_ICON_SVG: Record<string, string> = {\n info: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 16v-5\"/><path d=\"M12 8h.01\"/></svg>`,\n warning: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg>`,\n success: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"/></svg>`,\n danger: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"m15 9-6 6\"/><path d=\"m9 9 6 6\"/></svg>`,\n default: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M12 2.5l1.6 5.4a4 4 0 0 0 2.5 2.5L21.5 12l-5.4 1.6a4 4 0 0 0-2.5 2.5L12 21.5l-1.6-5.4a4 4 0 0 0-2.5-2.5L2.5 12l5.4-1.6a4 4 0 0 0 2.5-2.5z\"/></svg>`,\n};\n\nfunction calloutVariantOf(el: Element): string {\n return el.getAttribute(\"data-variant\") ?? \"default\";\n}\n\nfunction isIconEnabled(el: Element): boolean {\n const v = el.getAttribute(\"data-icon\");\n // Treat presence-only (`data-icon`) as truthy; explicit \"false\"/\"0\" disables.\n if (v === null) return false;\n return v !== \"false\" && v !== \"0\";\n}\n\n/**\n * Walk the callouts in the rendered subtree and ensure each one that has\n * `data-icon` set carries an empty `<span class=\"rt-callout-icon\">` chip at\n * its first child. The chip's contents are filled later by React (either\n * a portal of the user-supplied element, or the built-in SVG glyph),\n * which lets consumers swap in their own icon components.\n *\n * Returns the chip spans currently in the DOM in document order so the\n * component can render portals into them.\n */\nfunction enhanceCallouts(\n root: HTMLElement,\n calloutIcons?: Partial<Record<string, ReactNode>>,\n): Array<{ el: HTMLElement; variant: string }> {\n const callouts = root.querySelectorAll<HTMLElement>(\"aside[data-callout]\");\n callouts.forEach((el) => {\n if (el.querySelector(\":scope > .rt-callout-icon\")) return;\n if (!isIconEnabled(el)) return;\n const variant = calloutVariantOf(el);\n const icon = document.createElement(\"span\");\n icon.className = \"rt-callout-icon\";\n icon.dataset.variant = variant;\n icon.setAttribute(\"aria-hidden\", \"true\");\n if (!calloutIcons || !(variant in calloutIcons)) {\n icon.innerHTML = CALLOUT_ICON_SVG[variant] ?? CALLOUT_ICON_SVG.default;\n }\n el.prepend(icon);\n });\n if (!calloutIcons) return [];\n const chips: Array<{ el: HTMLElement; variant: string }> = [];\n root\n .querySelectorAll<HTMLElement>(\n \"aside[data-callout] > .rt-callout-icon\",\n )\n .forEach((chip) => {\n const variant =\n chip.dataset.variant ||\n (chip.parentElement?.getAttribute(\"data-variant\") ?? \"default\");\n if (variant in calloutIcons) {\n chips.push({ el: chip, variant });\n }\n });\n return chips;\n}\n\nfunction enhanceBlockquotes(root: HTMLElement) {\n const quotes = root.querySelectorAll<HTMLQuoteElement>(\"blockquote\");\n quotes.forEach((bq) => {\n if (bq.querySelector(\":scope > .rt-quote-open\")) return;\n if (bq.closest('figure[data-variant=\"pullquote\"]')) return;\n\n const { first, last } = findQuoteBody(bq);\n if (!first || !last) return;\n\n const open = document.createElement(\"span\");\n open.className = \"rt-quote-open\";\n open.setAttribute(\"aria-hidden\", \"true\");\n open.textContent = \"“\";\n\n const close = document.createElement(\"span\");\n close.className = \"rt-quote-close\";\n close.setAttribute(\"aria-hidden\", \"true\");\n close.textContent = \"”\";\n\n first.prepend(open);\n last.append(close);\n });\n}\n\n/* -------------------------------------------------------------------------- */\n/* Syntax highlighting (highlight.js) */\n/* -------------------------------------------------------------------------- */\n\n// `highlight.js/lib/common` ships ~35 popular languages — enough for typical\n// CMS content without dragging in every grammar. The theme CSS is imported at\n// the top of the file. To add an obscure language, register it explicitly:\n// import lang from \"highlight.js/lib/languages/foo\"; hljs.registerLanguage(\"foo\", lang);\n\nfunction escapeHtml(s: string): string {\n return s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\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) => \" \".repeat(m.length));\n}\n\nfunction highlightSource(src: string, lang?: string): string {\n if (lang && hljs.getLanguage(lang)) {\n try {\n return hljs.highlight(src, { language: lang, ignoreIllegals: true })\n .value;\n } catch {\n // fall through to escaped plain text\n }\n }\n return escapeHtml(src);\n}\n\nfunction highlightLine(line: string, lang: string | undefined): string {\n if (!line) return \"\";\n return preserveSpaces(highlightSource(line, lang));\n}\n\nfunction highlightCodeBlock(pre: HTMLPreElement) {\n const lang = pre.dataset.language;\n if (!lang) return;\n const code = pre.querySelector(\"code\");\n if (!code) return;\n if (code.classList.contains(\"hljs\")) return;\n const source = code.textContent ?? \"\";\n code.innerHTML = highlightSource(source, lang);\n code.classList.add(\"hljs\");\n}\n\nconst DIFF_SEPARATOR_RE = /\\n?@@---@@\\n?/;\n\ntype DiffOp = { t: \"eq\" | \"rem\" | \"add\"; line: string };\n\nfunction diffLines(a: string[], b: string[]): DiffOp[] {\n const n = a.length;\n const m = b.length;\n const dp: number[][] = Array.from({ length: n + 1 }, () =>\n new Array(m + 1).fill(0),\n );\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= m; j++) {\n dp[i][j] =\n a[i - 1] === b[j - 1]\n ? dp[i - 1][j - 1] + 1\n : Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n const ops: DiffOp[] = [];\n let i = n;\n let j = m;\n while (i > 0 && j > 0) {\n if (a[i - 1] === b[j - 1]) {\n ops.unshift({ t: \"eq\", line: a[i - 1] });\n i--;\n j--;\n } else if (dp[i - 1][j] >= dp[i][j - 1]) {\n ops.unshift({ t: \"rem\", line: a[i - 1] });\n i--;\n } else {\n ops.unshift({ t: \"add\", line: b[j - 1] });\n j--;\n }\n }\n while (i > 0) ops.unshift({ t: \"rem\", line: a[--i] });\n while (j > 0) ops.unshift({ t: \"add\", line: b[--j] });\n return ops;\n}\n\nfunction renderDiff(before: string, after: string, lang?: string): string {\n const ops = diffLines(before.split(\"\\n\"), after.split(\"\\n\"));\n type Cell = { n: number | null; line: string | null; cls: string };\n type Row = { left: Cell; right: Cell };\n const rows: Row[] = [];\n let aNo = 0;\n let bNo = 0;\n let k = 0;\n while (k < ops.length) {\n const op = ops[k];\n if (op.t === \"eq\") {\n aNo++;\n bNo++;\n rows.push({\n left: { n: aNo, line: op.line, cls: \"\" },\n right: { n: bNo, line: op.line, cls: \"\" },\n });\n k++;\n continue;\n }\n const rems: string[] = [];\n while (k < ops.length && ops[k].t === \"rem\") {\n rems.push(ops[k].line);\n k++;\n }\n const adds: string[] = [];\n while (k < ops.length && ops[k].t === \"add\") {\n adds.push(ops[k].line);\n k++;\n }\n const len = Math.max(rems.length, adds.length);\n for (let x = 0; x < len; x++) {\n const remLine = x < rems.length ? rems[x] : null;\n const addLine = x < adds.length ? adds[x] : null;\n rows.push({\n left: {\n n: remLine !== null ? ++aNo : null,\n line: remLine,\n cls: remLine !== null ? \"rt-diff-rem\" : \"rt-diff-empty\",\n },\n right: {\n n: addLine !== null ? ++bNo : null,\n line: addLine,\n cls: addLine !== null ? \"rt-diff-add\" : \"rt-diff-empty\",\n },\n });\n }\n }\n const cell = (c: Cell, side: \"l\" | \"r\") => {\n const sign = side === \"l\" ? \"-\" : \"+\";\n const showSign = c.cls === \"rt-diff-rem\" || c.cls === \"rt-diff-add\";\n return (\n `<td class=\"rt-diff-num\">${c.n ?? \"\"}</td>` +\n `<td class=\"rt-diff-sign\">${showSign ? sign : \"\"}</td>` +\n `<td class=\"rt-diff-line ${c.cls}\">${c.line === null ? \"\" : highlightLine(c.line, lang) || \" \"}</td>`\n );\n };\n const body = rows\n .map((r) => `<tr>${cell(r.left, \"l\")}${cell(r.right, \"r\")}</tr>`)\n .join(\"\");\n return `<table class=\"rt-diff-table\"><tbody>${body}</tbody></table>`;\n}\n\nfunction makeCopyButton(\n getText: () => string,\n opts: { className?: string; label?: string } = {},\n): HTMLButtonElement {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = opts.className ?? \"rt-codeblock__copy\";\n btn.setAttribute(\"aria-label\", opts.label ?? \"Copy code\");\n btn.innerHTML = COPY_ICON_SVG;\n btn.addEventListener(\"click\", async () => {\n try {\n await navigator.clipboard.writeText(getText());\n btn.innerHTML = CHECK_ICON_SVG;\n btn.classList.add(\"is-copied\");\n window.setTimeout(() => {\n btn.innerHTML = COPY_ICON_SVG;\n btn.classList.remove(\"is-copied\");\n }, 1500);\n } catch {\n // clipboard unavailable; no-op\n }\n });\n return btn;\n}\n\nfunction buildCodeBlockLabel(pre: HTMLPreElement): HTMLElement | null {\n const filename = pre.dataset.filename;\n if (!filename) return null;\n const tag = document.createElement(\"span\");\n tag.className = \"rt-codeblock__label\";\n const file = document.createElement(\"span\");\n // Use the language-pill styling for the filename so it reads as a small\n // tag rather than plain text. Language itself is no longer displayed.\n file.className = \"rt-codeblock__filename rt-codeblock__language\";\n file.textContent = filename;\n tag.appendChild(file);\n return tag;\n}\n\nfunction enhanceCodeBlocks(root: HTMLElement) {\n const blocks = root.querySelectorAll<HTMLPreElement>(\"pre\");\n blocks.forEach((pre) => {\n if (pre.classList.contains(\"rt-codeblock\")) return;\n pre.classList.add(\"rt-codeblock\");\n\n const variant = pre.dataset.variant;\n\n // Diff variant: split content on the @@---@@ marker and render a\n // side-by-side LCS diff. Skip the regular code-block chrome.\n if (variant === \"diff\") {\n const codeEl = pre.querySelector(\"code\");\n const src = codeEl?.textContent ?? \"\";\n const [beforeSrc = \"\", afterSrc = \"\"] = src.split(DIFF_SEPARATOR_RE);\n pre.innerHTML = renderDiff(beforeSrc, afterSrc, pre.dataset.language);\n\n // Per-side copy buttons. Each copies only its own snippet (no signs,\n // no line numbers — just the raw text the author originally pasted).\n // Wrap in half-width cells so the buttons sit at the top-right of\n // their respective column instead of bunching on one side.\n const bar = document.createElement(\"div\");\n bar.className = \"rt-diff-copy-bar\";\n const leftHalf = document.createElement(\"div\");\n leftHalf.className = \"rt-diff-copy-half\";\n leftHalf.appendChild(\n makeCopyButton(() => beforeSrc, {\n className: \"rt-diff-copy\",\n label: \"Copy before\",\n }),\n );\n const rightHalf = document.createElement(\"div\");\n rightHalf.className = \"rt-diff-copy-half\";\n rightHalf.appendChild(\n makeCopyButton(() => afterSrc, {\n className: \"rt-diff-copy\",\n label: \"Copy after\",\n }),\n );\n bar.appendChild(leftHalf);\n bar.appendChild(rightHalf);\n pre.prepend(bar);\n\n const label = buildCodeBlockLabel(pre);\n if (label) pre.prepend(label);\n return;\n }\n\n // Terminal variant: synthetic chrome (traffic lights) via CSS; render\n // a `$ ` prompt on every visible line so multi-line snippets read like a\n // real shell session. Copying yields just the commands without prompts.\n if (variant === \"terminal\") {\n pre.classList.add(\"rt-terminal\");\n const codeEl = pre.querySelector(\"code\");\n const source = codeEl?.textContent ?? \"\";\n if (codeEl) {\n // Default to shell highlighting when no explicit language is set —\n // a terminal block without `bash`/`sh` selected almost certainly\n // contains shell commands, and `tokenizeFor(\"sh\", …)` is safe to fall\n // back to (it just returns text tokens for content it can't classify).\n const lang = pre.dataset.language || \"sh\";\n const lines = source.split(\"\\n\");\n codeEl.innerHTML = lines\n .map(\n (line) =>\n `<span class=\"rt-term-line\"><span class=\"rt-term-prompt\" aria-hidden=\"true\">$</span> ${highlightLine(line, lang) || \" \"}</span>`,\n )\n .join(\"\");\n }\n pre.appendChild(makeCopyButton(() => source, { label: \"Copy commands\" }));\n return;\n }\n\n const label = buildCodeBlockLabel(pre);\n if (label) pre.prepend(label);\n\n pre.appendChild(\n makeCopyButton(\n () => pre.querySelector(\"code\")?.textContent ?? pre.innerText,\n ),\n );\n\n highlightCodeBlock(pre);\n });\n}\n\n// Inlined `tokyo-night-dark` highlight.js theme. Bundled as a string rather\n// than imported as a CSS file so the package works in SSR environments\n// (Node throws \"Unknown file extension '.css'\" otherwise). Injected once on\n// the client via `ensureCodeBlockStyles`.\nconst HLJS_THEME = `\npre code.hljs { display: block; overflow-x: auto; padding: 1em; }\ncode.hljs { padding: 3px 5px; }\n.hljs-meta, .hljs-comment { color: #565f89; }\n.hljs-tag, .hljs-doctag, .hljs-selector-id, .hljs-selector-class,\n.hljs-regexp, .hljs-template-tag, .hljs-selector-pseudo,\n.hljs-selector-attr, .hljs-variable.language_, .hljs-deletion { color: #f7768e; }\n.hljs-variable, .hljs-template-variable, .hljs-number, .hljs-literal,\n.hljs-type, .hljs-params, .hljs-link { color: #ff9e64; }\n.hljs-built_in, .hljs-attribute { color: #e0af68; }\n.hljs-selector-tag { color: #73daca; }\n.hljs-keyword, .hljs-title.function_, .hljs-title, .hljs-title.class_,\n.hljs-title.class_.inherited__, .hljs-subst, .hljs-property { color: #7dcfff; }\n.hljs-quote, .hljs-string, .hljs-symbol, .hljs-bullet,\n.hljs-addition { color: #9ece6a; }\n.hljs-code, .hljs-formula, .hljs-section { color: #7aa2f7; }\n.hljs-name, .hljs-operator, .hljs-char.escape_, .hljs-attr { color: #bb9af7; }\n.hljs-punctuation { color: #c0caf5; }\n.hljs { background: #1a1b26; color: #9aa5ce; }\n.hljs-emphasis { font-style: italic; }\n.hljs-strong { font-weight: bold; }\n`;\n\nconst CODEBLOCK_STYLE = `\n.rt-codeblock { position: relative; }\n.rt-codeblock[data-filename]:not([data-filename=\"\"]) { padding-top: 2rem; }\n.rt-codeblock__label {\n position: absolute; top: 0.45rem; left: 0.85rem;\n display: inline-flex; align-items: center; gap: 0.5rem;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n pointer-events: none;\n}\n.rt-codeblock__filename {\n font-size: 0.72rem; letter-spacing: 0.02em;\n color: #d1d5db;\n}\n.rt-codeblock__sep {\n color: #6b7280;\n font-size: 0.72rem;\n}\n.rt-codeblock__language {\n font-size: 0.6rem; letter-spacing: 0.08em;\n text-transform: lowercase;\n color: #9ca3af;\n padding: 0.05rem 0.35rem;\n border: 1px solid rgba(255,255,255,0.12);\n border-radius: 0.25rem;\n}\n.rt-codeblock__copy {\n position: absolute; top: 0.4rem; right: 0.4rem;\n display: inline-flex; align-items: center; justify-content: center;\n width: 1.75rem; height: 1.75rem; padding: 0;\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 0.375rem;\n background: rgba(255,255,255,0.04);\n color: #d1d5db;\n cursor: pointer;\n opacity: 0; transition: opacity 120ms ease, background 120ms ease, color 120ms ease;\n}\n.rt-codeblock:hover .rt-codeblock__copy,\n.rt-codeblock:focus-within .rt-codeblock__copy { opacity: 1; }\n.rt-codeblock__copy:hover { background: rgba(255,255,255,0.1); color: #fff; }\n.rt-codeblock__copy.is-copied { color: #34d399; opacity: 1; }\n@media (hover: none) { .rt-codeblock__copy { opacity: 1; } }\n.rt-quote-open, .rt-quote-close {\n font-family: Georgia, \"Times New Roman\", serif;\n font-size: 1.4em;\n line-height: 0;\n vertical-align: -0.15em;\n opacity: 0.6;\n user-select: none;\n}\n.rt-quote-open { margin-right: 0.15em; }\n.rt-quote-close { margin-left: 0.15em; }\n\n/* Callout chip ----------------------------------------------------------- */\n/* Layout: when a callout opts into an icon, use a 2-column grid so the chip\n sits left of the title + body. Consumers can override via classMap. */\naside[data-callout][data-icon]:not([data-icon=\"false\"]):not([data-icon=\"0\"]) {\n display: grid;\n grid-template-columns: auto 1fr;\n column-gap: 0.85rem;\n align-items: start;\n}\naside[data-callout][data-icon]:not([data-icon=\"false\"]):not([data-icon=\"0\"]) > .rt-callout-icon {\n grid-row: 1 / span 99;\n margin-top: 0.05rem;\n}\n.rt-callout-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.6rem;\n height: 1.6rem;\n border-radius: 0.4rem;\n color: #fff;\n background: #475569;\n flex-shrink: 0;\n}\n.rt-callout-icon[data-variant=\"info\"] { background: #2563eb; }\n.rt-callout-icon[data-variant=\"warning\"] { background: #d97706; }\n.rt-callout-icon[data-variant=\"success\"] { background: #16a34a; }\n.rt-callout-icon[data-variant=\"danger\"] { background: #dc2626; }\n.rt-callout-icon[data-variant=\"default\"] { background: #475569; }\n\n/* Collapsible (FAQ accordion) ------------------------------------------ */\n/* Native <details>/<summary> with a rotating chevron. Only structural\n styling lives here — colors, padding, and typography belong to\n consumers via the \\`collapsible\\` and \\`collapsibleTitle\\` classMap keys. */\ndetails[data-collapsible] > summary {\n cursor: pointer;\n list-style: none;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.75rem;\n}\ndetails[data-collapsible] > summary::-webkit-details-marker { display: none; }\ndetails[data-collapsible] > summary::after {\n content: \"\";\n width: 0.55rem;\n height: 0.55rem;\n border-right: 1.5px solid currentColor;\n border-bottom: 1.5px solid currentColor;\n transform: rotate(-45deg) translate(-0.1rem, 0.05rem);\n transition: transform 0.18s ease;\n opacity: 0.55;\n flex-shrink: 0;\n}\ndetails[data-collapsible][open] > summary::after {\n transform: rotate(45deg) translate(-0.05rem, -0.05rem);\n}\n/* highlight.js theme handles .hljs-* color classes; we only override the\n default .hljs background so the per-block chrome (dark bg, terminal,\n diff red/green rows) wins. */\n.rt-codeblock .hljs,\n.rt-codeblock code.hljs { background: transparent; padding: 0; }\n\n/* Terminal variant ------------------------------------------------------- */\n.rt-codeblock.rt-terminal,\n.rt-codeblock[data-variant=\"terminal\"] {\n position: relative;\n padding-top: 2.25rem;\n background: #0b0b0d;\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 0.65rem;\n box-shadow: 0 1px 0 rgba(255,255,255,0.04) inset,\n 0 10px 30px -10px rgba(0,0,0,0.6);\n}\n.rt-codeblock.rt-terminal::before,\n.rt-codeblock[data-variant=\"terminal\"]::before {\n content: \"\";\n position: absolute; top: 0; left: 0; right: 0; height: 1.75rem;\n background: linear-gradient(#1a1a1d, #141417);\n border-bottom: 1px solid rgba(255,255,255,0.06);\n border-radius: 0.65rem 0.65rem 0 0;\n}\n.rt-codeblock.rt-terminal::after,\n.rt-codeblock[data-variant=\"terminal\"]::after {\n content: \"\";\n position: absolute; top: 0.55rem; left: 0.75rem;\n width: 0.65rem; height: 0.65rem; border-radius: 50%;\n background: #ff5f57;\n box-shadow:\n 1.1rem 0 0 0 #febc2e,\n 2.2rem 0 0 0 #28c840;\n}\n.rt-codeblock.rt-terminal code,\n.rt-codeblock[data-variant=\"terminal\"] code {\n color: #d4d4d8;\n display: block;\n}\n.rt-term-line { display: block; white-space: pre-wrap; }\n.rt-term-prompt {\n color: #28c840;\n font-weight: 600;\n margin-right: 0.35em;\n user-select: none;\n}\n\n/* Diff variant ----------------------------------------------------------- */\n.rt-codeblock[data-variant=\"diff\"] {\n padding: 0;\n overflow: hidden;\n background: #0b0b0d;\n border: 1px solid rgba(255,255,255,0.08);\n}\n.rt-codeblock[data-variant=\"diff\"][data-filename]:not([data-filename=\"\"]) {\n padding-top: 2rem;\n}\n.rt-diff-table {\n width: 100%;\n border-collapse: collapse;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 0.78rem;\n line-height: 1.55;\n color: #e5e7eb;\n table-layout: fixed;\n}\n.rt-diff-table colgroup { display: none; }\n.rt-diff-table td {\n padding: 0 0.5rem;\n vertical-align: top;\n white-space: pre-wrap;\n word-break: break-word;\n}\n.rt-diff-table td.rt-diff-num {\n width: 2.25rem;\n text-align: right;\n color: rgba(156,163,175,0.55);\n user-select: none;\n background: rgba(255,255,255,0.02);\n}\n.rt-diff-table td.rt-diff-sign {\n width: 0.85rem;\n text-align: center;\n user-select: none;\n color: rgba(255,255,255,0.45);\n}\n.rt-diff-table td.rt-diff-line.rt-diff-rem {\n background: rgba(248,113,113,0.12);\n color: #fecaca;\n}\n.rt-diff-table tr:has(td.rt-diff-rem) td.rt-diff-sign:first-of-type {\n color: #f87171;\n}\n.rt-diff-table td.rt-diff-line.rt-diff-add {\n background: rgba(74,222,128,0.12);\n color: #bbf7d0;\n}\n.rt-diff-table tr:has(td.rt-diff-add) td.rt-diff-sign + td + td + td.rt-diff-sign {\n color: #4ade80;\n}\n.rt-diff-table td.rt-diff-line.rt-diff-empty {\n background: rgba(255,255,255,0.025);\n}\n.rt-diff-table tr td:nth-child(4) { border-left: 1px solid rgba(255,255,255,0.06); }\n.rt-diff-copy-bar {\n position: absolute; top: 0.4rem; left: 0; right: 0; z-index: 2;\n display: grid; grid-template-columns: 1fr 1fr;\n pointer-events: none;\n}\n.rt-diff-copy-half {\n display: flex;\n justify-content: flex-end;\n padding-right: 0.4rem;\n}\n.rt-diff-copy {\n pointer-events: auto;\n display: inline-flex; align-items: center; justify-content: center;\n width: 1.6rem; height: 1.6rem; padding: 0;\n border: 1px solid rgba(255,255,255,0.1);\n border-radius: 0.375rem;\n background: rgba(20,20,23,0.85);\n color: #d1d5db;\n cursor: pointer;\n opacity: 0; transition: opacity 120ms ease, background 120ms ease, color 120ms ease;\n}\n.rt-codeblock[data-variant=\"diff\"]:hover .rt-diff-copy,\n.rt-codeblock[data-variant=\"diff\"]:focus-within .rt-diff-copy { opacity: 1; }\n.rt-diff-copy:hover { background: rgba(0,0,0,0.92); color: #fff; }\n.rt-diff-copy.is-copied { color: #34d399; opacity: 1; }\n@media (hover: none) { .rt-diff-copy { opacity: 1; } }\n`;\n\nlet styleInjected = false;\nfunction ensureCodeBlockStyles() {\n if (styleInjected || typeof document === \"undefined\") return;\n if (document.getElementById(\"rt-codeblock-style\")) {\n styleInjected = true;\n return;\n }\n const tag = document.createElement(\"style\");\n tag.id = \"rt-codeblock-style\";\n tag.textContent = HLJS_THEME + \"\\n\" + CODEBLOCK_STYLE;\n document.head.appendChild(tag);\n styleInjected = true;\n}\n\ntype CalloutChip = { el: HTMLElement; variant: string };\n\nfunction calloutChipsEqual(a: CalloutChip[], b: CalloutChip[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i].el !== b[i].el || a[i].variant !== b[i].variant) return false;\n }\n return true;\n}\n\nfunction BuiltinCalloutIcon({ variant }: { variant: string }) {\n const html = CALLOUT_ICON_SVG[variant] ?? CALLOUT_ICON_SVG.default;\n return <span dangerouslySetInnerHTML={{ __html: html }} />;\n}\n\nexport const RichTextContent = memo(function RichTextContent({\n html,\n classMap,\n as = \"div\",\n className,\n onReady,\n contentRef,\n calloutIcons,\n}: RichTextContentProps) {\n const merged = useMemo(\n () => mergeClassMap(DEFAULT_CLASS_MAP, classMap),\n [classMap],\n );\n const safe = useMemo(\n () => parseRichText(html, { classMap: merged }),\n [html, merged],\n );\n\n const ref = useRef<HTMLElement | null>(null);\n const prevSafe = useRef(\"\");\n const chipsRef = useRef<CalloutChip[]>([]);\n const onReadyRef = useRef(onReady);\n onReadyRef.current = onReady;\n const contentRefStable = useRef(contentRef);\n contentRefStable.current = contentRef;\n const calloutIconsRef = useRef(calloutIcons);\n calloutIconsRef.current = calloutIcons;\n\n const [renderKey, setRenderKey] = useState(0);\n\n useLayoutEffect(() => {\n ensureCodeBlockStyles();\n const root = ref.current;\n if (!root) return;\n if (contentRefStable.current) contentRefStable.current.current = root;\n if (prevSafe.current === safe) return;\n prevSafe.current = safe;\n\n root.innerHTML = safe;\n enhanceCodeBlocks(root);\n enhanceBlockquotes(root);\n const nextChips = enhanceCallouts(root, calloutIconsRef.current);\n\n if (!calloutChipsEqual(chipsRef.current, nextChips)) {\n chipsRef.current = nextChips;\n if (nextChips.length > 0) setRenderKey((n) => n + 1);\n }\n\n onReadyRef.current?.(root);\n }, [safe]);\n\n void renderKey;\n\n return (\n <Fragment>\n {createElement(as, {\n ref,\n className,\n })}\n {chipsRef.current.map((chip, i) =>\n createPortal(\n calloutIconsRef.current && chip.variant in calloutIconsRef.current ? (\n calloutIconsRef.current[chip.variant]\n ) : (\n <BuiltinCalloutIcon variant={chip.variant} />\n ),\n chip.el,\n `${chip.variant}:${i}`,\n ),\n )}\n </Fragment>\n );\n}, richTextPropsEqual);\n\nfunction richTextPropsEqual(\n prev: RichTextContentProps,\n next: RichTextContentProps,\n): boolean {\n if (prev.html !== next.html) return false;\n if (prev.classMap !== next.classMap) return false;\n if (prev.as !== next.as) return false;\n if (prev.className !== next.className) return false;\n const prevKeys = prev.calloutIcons ? Object.keys(prev.calloutIcons) : [];\n const nextKeys = next.calloutIcons ? Object.keys(next.calloutIcons) : [];\n if (prevKeys.length !== nextKeys.length) return false;\n for (const k of nextKeys) {\n if (!prevKeys.includes(k)) return false;\n }\n return true;\n}\n","/**\n * Heading extraction helpers used to build tables of contents (ToC) from\n * rich-text HTML. Server-safe — no React, no DOM dependency in the HTML\n * variant. The DOM variant assigns missing `id`s in-place so anchor links\n * resolve immediately.\n */\n\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport interface ExtractedHeading {\n id: string;\n text: string;\n level: HeadingLevel;\n}\n\nexport interface ExtractHeadingsOptions {\n /** Levels to include. Defaults to `[2, 3]` — typical doc page outline. */\n levels?: ReadonlyArray<HeadingLevel>;\n /** Custom slug function. Defaults to a lowercase/kebab/diacritic-safe slug. */\n slugify?: (text: string, index: number) => string;\n}\n\nconst DEFAULT_LEVELS: ReadonlyArray<HeadingLevel> = [2, 3];\n\nexport function slugify(text: string): string {\n return text\n .normalize(\"NFKD\")\n .replace(/[̀-ͯ]/g, \"\")\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\nfunction decodeBasicEntities(s: string): string {\n return s\n .replace(/ /g, \" \")\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n}\n\nfunction stripTags(s: string): string {\n return decodeBasicEntities(s.replace(/<[^>]+>/g, \" \"))\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction uniqueId(base: string, used: Map<string, number>): string {\n const seed = base || \"section\";\n const n = used.get(seed) ?? 0;\n used.set(seed, n + 1);\n return n === 0 ? seed : `${seed}-${n}`;\n}\n\n/**\n * Parse headings out of a raw HTML string. Returns headings in document\n * order with stable, de-duplicated IDs.\n *\n * If a heading already has an `id` attribute, it's preserved verbatim\n * (and reserved so later slugs don't collide with it).\n */\nexport function extractHeadingsFromHtml(\n html: string,\n options: ExtractHeadingsOptions = {},\n): ExtractedHeading[] {\n if (!html) return [];\n const levels = options.levels ?? DEFAULT_LEVELS;\n const slug = options.slugify ?? slugify;\n const used = new Map<string, number>();\n const out: ExtractedHeading[] = [];\n const re = /<h([1-6])\\b([^>]*)>([\\s\\S]*?)<\\/h\\1>/gi;\n let m: RegExpExecArray | null;\n let i = 0;\n while ((m = re.exec(html)) !== null) {\n const level = Number(m[1]) as HeadingLevel;\n if (!levels.includes(level)) continue;\n const attrs = m[2] ?? \"\";\n const inner = m[3] ?? \"\";\n const text = stripTags(inner);\n if (!text) continue;\n const explicitIdMatch = attrs.match(/\\bid\\s*=\\s*(\"([^\"]*)\"|'([^']*)'|(\\S+))/i);\n let id: string;\n if (explicitIdMatch) {\n id = explicitIdMatch[2] ?? explicitIdMatch[3] ?? explicitIdMatch[4] ?? \"\";\n if (id) used.set(id, (used.get(id) ?? 0) + 1);\n } else {\n id = uniqueId(slug(text, i), used);\n }\n out.push({ id, text, level });\n i++;\n }\n return out;\n}\n\n/**\n * Walk a rendered DOM subtree, collect headings, and assign missing `id`s\n * in-place so anchor links resolve immediately. Also sets `scrollMarginTop`\n * on each heading when `scrollMarginTop` is provided so navigation lands\n * cleanly below a sticky header.\n */\nexport function extractHeadingsFromElement(\n root: HTMLElement,\n options: ExtractHeadingsOptions & { scrollMarginTop?: number } = {},\n): ExtractedHeading[] {\n const levels = options.levels ?? DEFAULT_LEVELS;\n const slug = options.slugify ?? slugify;\n const selector = levels.map((l) => `h${l}`).join(\",\");\n const nodes = root.querySelectorAll<HTMLHeadingElement>(selector);\n const used = new Map<string, number>();\n // Reserve already-present IDs so generated ones don't collide.\n nodes.forEach((n) => {\n if (n.id) used.set(n.id, (used.get(n.id) ?? 0) + 1);\n });\n const out: ExtractedHeading[] = [];\n let i = 0;\n nodes.forEach((node) => {\n const level = Number(node.tagName.slice(1)) as HeadingLevel;\n const text = (node.textContent ?? \"\").replace(/\\s+/g, \" \").trim();\n if (!text) return;\n if (!node.id) {\n node.id = uniqueId(slug(text, i), used);\n }\n if (options.scrollMarginTop != null) {\n node.style.scrollMarginTop = `${options.scrollMarginTop}px`;\n }\n out.push({ id: node.id, text, level });\n i++;\n });\n return out;\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport type { SeoClientProps } from \"./seo.config\";\n\nfunction setMeta(attr: \"name\" | \"property\", key: string, content: string) {\n let element = document.head.querySelector<HTMLMetaElement>(\n `meta[${attr}=\"${key}\"]`,\n );\n if (!element) {\n if (!content) return;\n element = document.createElement(\"meta\");\n element.setAttribute(attr, key);\n document.head.appendChild(element);\n } else if (!content) {\n element.remove();\n return;\n }\n element.setAttribute(\"content\", content);\n}\n\nfunction setCanonical(url: string) {\n let canonical = document.head.querySelector<HTMLLinkElement>(\n 'link[rel=\"canonical\"]',\n );\n if (!canonical) {\n canonical = document.createElement(\"link\");\n canonical.rel = \"canonical\";\n document.head.appendChild(canonical);\n }\n canonical.href = url;\n}\n\n/** Render a JSON-LD <script>. Pass a built graph via `data`; renders nothing if absent. */\nexport function JsonLd({ data }: { data?: object }) {\n if (!data) return null;\n const html = JSON.stringify(data)\n .replace(/</g, \"\\\\u003c\")\n .replace(/>/g, \"\\\\u003e\")\n .replace(/\\u2028/g, \"\\\\u2028\")\n .replace(/\\u2029/g, \"\\\\u2029\");\n return (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n}\n\n/**\n * Imperatively sets document title, meta description, canonical URL and social\n * tags. Works in plain React apps and Next.js client components. In a Next.js\n * App Router app, prefer server `generateMetadata` from the `/next` entry.\n */\nexport function Seo({\n title,\n description,\n url,\n siteName,\n keywords,\n twitter,\n image,\n noindex,\n}: SeoClientProps) {\n useEffect(() => {\n document.title = title;\n setMeta(\"name\", \"description\", description);\n setCanonical(url);\n\n setMeta(\"property\", \"og:title\", title);\n setMeta(\"property\", \"og:description\", description);\n setMeta(\"property\", \"og:url\", url);\n setMeta(\"property\", \"og:site_name\", siteName || \"\");\n setMeta(\"name\", \"keywords\", keywords || \"\");\n setMeta(\"name\", \"robots\", noindex ? \"noindex\" : \"index\");\n\n setMeta(\"name\", \"twitter:card\", image ? \"summary_large_image\" : \"summary\");\n setMeta(\"name\", \"twitter:title\", title);\n setMeta(\"name\", \"twitter:description\", description);\n setMeta(\"name\", \"twitter:site\", twitter || \"\");\n setMeta(\"property\", \"og:image\", image || \"\");\n setMeta(\"name\", \"twitter:image\", image || \"\");\n }, [title, description, url, siteName, keywords, twitter, image, noindex]);\n\n return null;\n}\n","// Pure builders that turn CMS posts + config into SEO values. Server-safe.\n\nimport { cmsImage } from \"../utils/cmsImage\";\nimport type {\n AsteroidOgImageParams,\n AsteroidPageSeoOptions,\n AsteroidSeoConfig,\n ISeoValues,\n SeoClientProps,\n} from \"./seo.config\";\n\n/** Apply the configured title template, defaulting to `${title} | ${siteName}`. */\nexport function applyTitleTemplate(\n config: AsteroidSeoConfig,\n title: string,\n): string {\n return config.titleTemplate\n ? config.titleTemplate(title)\n : `${title} | ${config.siteName}`;\n}\n\nexport function buildOgImageUrl(\n config: AsteroidSeoConfig,\n params: AsteroidOgImageParams,\n): string | undefined {\n if (config.getOgImageUrl) {\n return config.getOgImageUrl(params);\n }\n\n const palette = config.ogImage?.palette;\n if (!palette) return undefined;\n\n const apiPath = config.ogImage?.apiPath ?? \"/api/og\";\n const base = config.baseUrl.replace(/\\/$/, \"\");\n const searchParams = new URLSearchParams({\n title: params.title,\n type: params.type ?? \"article\",\n siteName: config.siteName,\n bg: palette.background,\n fg: palette.foreground,\n accent: palette.accent,\n });\n\n if (params.subtitle?.trim()) searchParams.set(\"subtitle\", params.subtitle.trim());\n if (params.eyebrow?.trim()) searchParams.set(\"eyebrow\", params.eyebrow.trim());\n if (palette.accentMuted) searchParams.set(\"accentMuted\", palette.accentMuted);\n if (palette.mutedText) searchParams.set(\"muted\", palette.mutedText);\n\n return `${base}${apiPath}?${searchParams.toString()}`;\n}\n\ntype ArticleLike = {\n title: string;\n description?: string;\n meta_description?: string;\n featured_image?: string;\n};\n\n/**\n * Generic per-page SEO builder. Use it directly for landing/marketing pages, or\n * as the base for the article/listing wrappers below. Content-type agnostic.\n */\nexport function buildPageSeoValues(\n config: AsteroidSeoConfig,\n options: AsteroidPageSeoOptions,\n): ISeoValues {\n const base = config.baseUrl.replace(/\\/$/, \"\");\n const path = options.path ?? \"/\";\n const url = `${base}${path.startsWith(\"/\") ? path : `/${path}`}`;\n const description =\n options.description?.trim() ||\n config.defaultDescription ||\n `${options.title} - ${config.siteName}.`;\n\n return {\n title: applyTitleTemplate(config, options.title),\n siteName: config.siteName,\n twitter: config.twitter ?? \"\",\n description,\n url,\n keywords: options.keywords ?? config.defaultKeywords ?? options.title,\n image:\n options.image ??\n buildOgImageUrl(config, {\n title: options.title,\n subtitle: description,\n eyebrow: options.eyebrow,\n type: options.ogType === \"article\" ? \"article\" : \"listing\",\n }),\n noindex: options.noindex ?? config.noindex,\n manifestUrl: config.manifestUrl,\n };\n}\n\nfunction resolveArticleImage<TPost extends ArticleLike>(\n post: TPost,\n config: AsteroidSeoConfig,\n): string | undefined {\n // cmsUrl is required to resolve a real featured image. Without it we fall\n // back to the generated OG image rather than throwing; server builders must\n // never crash a render.\n const featuredImage = config.cmsUrl\n ? cmsImage(post.featured_image, { cmsUrl: config.cmsUrl })\n : \"\";\n\n if (featuredImage) return featuredImage;\n\n const description =\n post.meta_description?.trim() ||\n post.description?.trim() ||\n config.defaultDescription;\n\n return buildOgImageUrl(config, {\n title: post.title,\n subtitle: description,\n eyebrow: config.contentLabel ?? \"Article\",\n type: \"article\",\n });\n}\n\n/** SEO for a single article; works for news, articles, or docs pages. */\nexport function buildArticleSeoValues<TPost extends ArticleLike>(\n post: TPost,\n config: AsteroidSeoConfig,\n slug: string,\n options?: { noindex?: boolean },\n): ISeoValues {\n const articlePath = config.articlePath ?? \"/blog\";\n const url = `${config.baseUrl.replace(/\\/$/, \"\")}${articlePath}/${slug}`;\n const description =\n post.meta_description?.trim() ||\n post.description?.trim() ||\n config.defaultDescription ||\n `Read the latest from ${config.siteName}.`;\n\n return {\n title: applyTitleTemplate(config, post.title),\n siteName: config.siteName,\n twitter: config.twitter ?? \"\",\n description,\n url,\n keywords: config.defaultKeywords ?? post.title,\n image: resolveArticleImage(post, config),\n noindex: options?.noindex ?? config.noindex,\n manifestUrl: config.manifestUrl,\n };\n}\n\n/** SEO for an article collection / category listing (any content type). */\nexport function buildArticleListingSeoValues(\n config: AsteroidSeoConfig,\n options?: { categoryName?: string; categorySlug?: string; noindex?: boolean },\n): ISeoValues {\n const articlePath = config.articlePath ?? \"/blog\";\n const base = config.baseUrl.replace(/\\/$/, \"\");\n const label = config.contentLabel ?? \"Articles\";\n const categoryName = options?.categoryName?.trim();\n const categorySlug = options?.categorySlug?.trim();\n\n const titleText = categoryName ? `${categoryName} ${label}` : label;\n\n const description = categoryName\n ? `Explore ${categoryName} ${label.toLowerCase()}, guides, and the latest updates from ${config.siteName}.`\n : config.defaultDescription ||\n `Browse ${label.toLowerCase()}, insights, and the latest updates from ${config.siteName}.`;\n\n const url = categorySlug\n ? `${base}${articlePath}/category/${categorySlug}`\n : `${base}${articlePath}`;\n\n return {\n title: applyTitleTemplate(config, titleText),\n siteName: config.siteName,\n twitter: config.twitter ?? \"\",\n description,\n url,\n keywords:\n config.defaultKeywords ??\n (categoryName\n ? `${categoryName}, ${config.siteName}`\n : `${config.siteName} ${label.toLowerCase()}`),\n image: buildOgImageUrl(config, {\n title: titleText,\n subtitle: description,\n eyebrow: categoryName ? \"Category\" : label,\n type: \"listing\",\n }),\n noindex: options?.noindex ?? config.noindex,\n manifestUrl: config.manifestUrl,\n };\n}\n\nexport function seoValuesToClientProps(values: ISeoValues): SeoClientProps {\n return {\n title: values.title,\n description: values.description,\n url: values.url,\n siteName: values.siteName,\n keywords: values.keywords,\n twitter: values.twitter,\n image: values.image,\n noindex: values.noindex,\n };\n}\n","// Pure schema.org JSON-LD builders. Server-safe. No hardcoded site identity.\n\nimport type { AsteroidSeoConfig } from \"./seo.config\";\n\n/** Build the site-wide Organization + WebSite @graph from config. */\nexport function buildSiteJsonLd(config: AsteroidSeoConfig): object {\n const siteUrl = config.baseUrl.replace(/\\/$/, \"\");\n const org = config.organization;\n\n const organizationNode: Record<string, unknown> = {\n \"@type\": \"Organization\",\n \"@id\": `${siteUrl}/#organization`,\n name: config.siteName,\n legalName: config.siteName,\n url: siteUrl,\n };\n if (org?.logoUrl) {\n organizationNode.logo = { \"@type\": \"ImageObject\", url: org.logoUrl };\n }\n if (org?.contactPhone || org?.contactEmail) {\n organizationNode.contactPoint = {\n \"@type\": \"ContactPoint\",\n ...(org.contactPhone ? { telephone: org.contactPhone } : {}),\n ...(org.contactEmail ? { email: org.contactEmail } : {}),\n contactType: \"customer service\",\n };\n }\n if (org?.address) {\n organizationNode.address = {\n \"@type\": \"PostalAddress\",\n ...(org.address.street ? { streetAddress: org.address.street } : {}),\n ...(org.address.city ? { addressLocality: org.address.city } : {}),\n ...(org.address.country ? { addressCountry: org.address.country } : {}),\n };\n }\n if (org?.socials?.length) {\n organizationNode.sameAs = org.socials;\n }\n\n const websiteNode: Record<string, unknown> = {\n \"@type\": \"WebSite\",\n \"@id\": `${siteUrl}/#website`,\n url: siteUrl,\n name: config.siteName,\n publisher: { \"@id\": `${siteUrl}/#organization` },\n inLanguage: \"en-US\",\n };\n if (config.defaultDescription) {\n websiteNode.description = config.defaultDescription;\n }\n\n return {\n \"@context\": \"https://schema.org\",\n \"@graph\": [organizationNode, websiteNode, ...(config.extraJsonLdNodes ?? [])],\n };\n}\n\n/** schema.org Article subtypes; pick per content kind. */\nexport type ArticleJsonLdType =\n | \"Article\"\n | \"BlogPosting\"\n | \"NewsArticle\"\n | \"TechArticle\"\n | (string & {});\n\nexport type ArticleJsonLdProps = {\n title: string;\n description: string;\n url: string;\n /** Site name; used as the author fallback. */\n siteName: string;\n /** Normalized base URL (no trailing slash); used to reference the org/website @ids. */\n siteUrl: string;\n /** schema.org @type. Default: `\"Article\"`. */\n articleType?: ArticleJsonLdType;\n image?: string;\n authorName?: string;\n publishedTime?: string;\n tags?: string[];\n category?: string;\n};\n\nexport function buildArticleJsonLd(props: ArticleJsonLdProps): object {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": props.articleType ?? \"Article\",\n headline: props.title,\n description: props.description,\n url: props.url,\n ...(props.image ? { image: props.image } : {}),\n ...(props.publishedTime ? { datePublished: props.publishedTime } : {}),\n ...(props.category ? { articleSection: props.category } : {}),\n ...(props.tags && props.tags.length > 0\n ? { keywords: props.tags.join(\", \") }\n : {}),\n author: { \"@type\": \"Person\", name: props.authorName || props.siteName },\n publisher: { \"@id\": `${props.siteUrl}/#organization` },\n isPartOf: { \"@id\": `${props.siteUrl}/#website` },\n inLanguage: \"en-US\",\n };\n}\n\nexport type CollectionJsonLdProps = {\n name: string;\n description: string;\n url: string;\n /** Normalized base URL (no trailing slash); used to reference the org/website @ids. */\n siteUrl: string;\n};\n\nexport function buildCollectionJsonLd(props: CollectionJsonLdProps): object {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"CollectionPage\",\n name: props.name,\n description: props.description,\n url: props.url,\n isPartOf: { \"@id\": `${props.siteUrl}/#website` },\n publisher: { \"@id\": `${props.siteUrl}/#organization` },\n inLanguage: \"en-US\",\n };\n}\n\nexport type WebPageJsonLdProps = {\n name: string;\n description: string;\n url: string;\n /** Normalized base URL (no trailing slash); used to reference the org/website @ids. */\n siteUrl: string;\n};\n\n/** Generic WebPage node for landing/marketing pages with no article concept. */\nexport function buildWebPageJsonLd(props: WebPageJsonLdProps): object {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"WebPage\",\n name: props.name,\n description: props.description,\n url: props.url,\n isPartOf: { \"@id\": `${props.siteUrl}/#website` },\n publisher: { \"@id\": `${props.siteUrl}/#organization` },\n inLanguage: \"en-US\",\n };\n}\n","// src/components/articles/article.view.tsx\nimport type { ReactNode } from \"react\";\nimport type { ArticleImageResolver } from \"./articles.types\";\n\nexport interface AsteroidArticlePagePost {\n slug: string;\n title: string;\n description?: string;\n content?: string;\n featured_image?: string;\n tags?: string;\n published_date?: string | null;\n category?: { slug: string; name: string };\n author?: { name: string; bio?: string };\n}\n\ntype Slot<TPost> = (params: { post: TPost; cmsImage: ArticleImageResolver }) => ReactNode;\n\nexport interface ArticleBodyRenderProps<\n TPost extends AsteroidArticlePagePost = AsteroidArticlePagePost,\n> {\n backLink?: ReactNode;\n renderHeader?: Slot<TPost>;\n renderMeta?: Slot<TPost>;\n renderDescription?: Slot<TPost>;\n renderFeaturedImage?: Slot<TPost>;\n renderToc?: Slot<TPost>;\n renderContent?: Slot<TPost>;\n renderPreArticle?: Slot<TPost>;\n renderMidArticle?: Slot<TPost>;\n renderPostArticle?: Slot<TPost>;\n renderTags?: Slot<TPost>;\n renderAuthorDetails?: Slot<TPost>;\n renderRelatedPosts?: (params: {\n post: TPost;\n relatedPosts: TPost[];\n cmsImage: ArticleImageResolver;\n }) => ReactNode;\n renderCTA?: Slot<TPost>;\n}\n\nexport interface RenderArticleBodyArgs<\n TPost extends AsteroidArticlePagePost = AsteroidArticlePagePost,\n> {\n post: TPost;\n cmsImage: ArticleImageResolver;\n relatedPosts: TPost[];\n seoNode: ReactNode;\n jsonLdNode: ReactNode;\n renderProps: ArticleBodyRenderProps<TPost>;\n}\n\nexport function renderArticleBody<\n TPost extends AsteroidArticlePagePost = AsteroidArticlePagePost,\n>(args: RenderArticleBodyArgs<TPost>): ReactNode {\n const { post, cmsImage, relatedPosts, seoNode, jsonLdNode, renderProps: r } = args;\n const slot = { post, cmsImage };\n\n return (\n <>\n {seoNode}\n {jsonLdNode}\n {r.backLink}\n {r.renderPreArticle?.(slot)}\n {r.renderHeader?.(slot)}\n {r.renderMeta?.(slot)}\n {r.renderDescription?.(slot)}\n {r.renderFeaturedImage?.(slot)}\n {r.renderToc?.(slot)}\n {r.renderContent?.(slot)}\n {r.renderMidArticle?.(slot)}\n {r.renderTags?.(slot)}\n {r.renderAuthorDetails?.(slot)}\n {r.renderRelatedPosts?.({ post, relatedPosts, cmsImage })}\n {r.renderCTA?.(slot)}\n {r.renderPostArticle?.(slot)}\n </>\n );\n}\n","\"use client\";\n\nimport { useContext, type ReactNode } from \"react\";\nimport { seoValuesToClientProps, buildArticleSeoValues } from \"../../seo/seo.builders\";\nimport type { AsteroidSeoConfig } from \"../../seo/seo.config\";\nimport { JsonLd, Seo } from \"../../seo/Seo\";\nimport { buildArticleJsonLd, type ArticleJsonLdType } from \"../../seo/jsonld\";\nimport { AsteroidCMSContext } from \"../../provider/context\";\nimport { useCmsImage } from \"../../utils/cmsImage\";\nimport {\n renderArticleBody,\n type ArticleBodyRenderProps,\n type AsteroidArticlePagePost,\n} from \"./article.view\";\n\nexport type { AsteroidArticlePagePost } from \"./article.view\";\n\nexport type AsteroidArticlePageUseArticleResult<\n TPost extends AsteroidArticlePagePost = AsteroidArticlePagePost,\n> = { data?: TPost | null; loading: boolean; error?: unknown };\n\nexport type AsteroidArticlePageUseArticle<\n TPost extends AsteroidArticlePagePost = AsteroidArticlePagePost,\n> = (slug: string) => AsteroidArticlePageUseArticleResult<TPost>;\n\nexport interface AsteroidArticlePageProps<\n TPost extends AsteroidArticlePagePost = AsteroidArticlePagePost,\n> extends ArticleBodyRenderProps<TPost> {\n slug: string;\n useArticle: AsteroidArticlePageUseArticle<TPost>;\n seo?: AsteroidSeoConfig;\n articleType?: ArticleJsonLdType;\n noindex?: boolean;\n relatedPosts?: TPost[];\n renderRoot?: (params: { children: ReactNode }) => ReactNode;\n renderSkeleton?: () => ReactNode;\n renderError?: (params: { error?: unknown; reason: \"error\" | \"not-found\" }) => ReactNode;\n renderJsonLd?: (params: { post: TPost }) => ReactNode;\n children?: (state: AsteroidArticlePageUseArticleResult<TPost>) => ReactNode;\n}\n\nexport function AsteroidArticlePage<\n TPost extends AsteroidArticlePagePost = AsteroidArticlePagePost,\n>(props: AsteroidArticlePageProps<TPost>) {\n const {\n slug,\n useArticle,\n seo,\n articleType,\n noindex,\n relatedPosts = [],\n renderRoot,\n renderSkeleton,\n renderError,\n renderJsonLd,\n children,\n ...bodyRenderProps\n } = props;\n\n const { data: article, loading, error } = useArticle(slug);\n const cmsConfig = useContext(AsteroidCMSContext);\n const cmsImage = useCmsImage();\n const seoConfig = seo && !seo.cmsUrl && cmsConfig?.cmsUrl ? { ...seo, cmsUrl: cmsConfig.cmsUrl } : seo;\n\n if (children) return <>{children({ data: article, loading, error })}</>;\n\n if (loading) {\n const body = renderSkeleton?.() ?? null;\n return renderRoot ? <>{renderRoot({ children: body })}</> : <>{body}</>;\n }\n\n if (!article || error) {\n const body = renderError?.({ error, reason: error ? \"error\" : \"not-found\" }) ?? null;\n return renderRoot ? <>{renderRoot({ children: body })}</> : <>{body}</>;\n }\n\n const seoValues = seoConfig ? buildArticleSeoValues(article, seoConfig, slug, { noindex }) : null;\n const seoNode = seoValues ? <Seo {...seoValuesToClientProps(seoValues)} /> : null;\n const jsonLdNode = seoConfig\n ? renderJsonLd?.({ post: article }) ?? (\n <JsonLd\n data={buildArticleJsonLd({\n title: article.title,\n description: article.description || seoConfig.defaultDescription || \"\",\n url: `${(seoConfig.baseUrl || \"\").replace(/\\/$/, \"\")}${seoConfig.articlePath ?? \"/blog\"}/${slug}`,\n siteName: seoConfig.siteName,\n siteUrl: (seoConfig.baseUrl || \"\").replace(/\\/$/, \"\"),\n articleType,\n image: seoValues?.image,\n authorName: article.author?.name,\n publishedTime: article.published_date || undefined,\n tags: article.tags?.split(\",\").map((t) => t.trim()).filter(Boolean),\n category: article.category?.name,\n })}\n />\n )\n : null;\n\n const body = renderArticleBody({\n post: article,\n cmsImage,\n relatedPosts,\n seoNode,\n jsonLdNode,\n renderProps: bodyRenderProps as ArticleBodyRenderProps<TPost>,\n });\n\n return renderRoot ? <>{renderRoot({ children: body })}</> : <>{body}</>;\n}\n","// src/components/articles/articles.state.ts\nimport type {\n AsteroidArticleCategoryGroup,\n AsteroidArticlePost,\n ArticlesViewState,\n} from \"./articles.types\";\n\nexport function defaultGetCategoryName(\n post: Pick<AsteroidArticlePost, \"category\">,\n): string | undefined {\n return post.category?.name?.trim() || undefined;\n}\n\nexport function defaultGroupPostsByCategory<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n>(posts: TPost[]): AsteroidArticleCategoryGroup<TPost>[] {\n const groups = new Map<string, AsteroidArticleCategoryGroup<TPost>>();\n\n for (const post of posts) {\n const categoryName = defaultGetCategoryName(post) || \"Other\";\n const categorySlug = post.category?.slug || \"other\";\n const existing = groups.get(categorySlug);\n\n if (existing) {\n existing.posts.push(post);\n } else {\n groups.set(categorySlug, { categoryName, categorySlug, posts: [post] });\n }\n }\n\n return Array.from(groups.values());\n}\n\nexport function applyPostFilters<TPost extends AsteroidArticlePost>(\n posts: TPost[],\n { categorySlug, articleSlug }: { categorySlug?: string; articleSlug?: string },\n): TPost[] {\n let filtered = posts;\n if (categorySlug) {\n filtered = filtered.filter((post) => post.category?.slug === categorySlug);\n }\n if (articleSlug) {\n filtered = filtered.filter((post) => post.slug === articleSlug);\n }\n return filtered;\n}\n\nexport function splitFeaturedAndRest<TPost extends AsteroidArticlePost>(\n posts: TPost[],\n): { featured: TPost | null; rest: TPost[] } {\n const featured = posts.find((post) => post.featured) ?? null;\n const rest = featured\n ? posts.filter((post) => post.slug !== featured.slug)\n : [...posts];\n return { featured, rest };\n}\n\nexport interface BuildArticlesViewStateOptions<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n> {\n categorySlug?: string;\n articleSlug?: string;\n searchQuery?: string;\n groupPostsByCategory?: (posts: TPost[]) => AsteroidArticleCategoryGroup<TPost>[];\n}\n\nexport function buildArticlesViewState<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n>(\n rawPosts: TPost[],\n options: BuildArticlesViewStateOptions<TPost>,\n): ArticlesViewState<TPost> {\n const {\n categorySlug,\n articleSlug,\n searchQuery = \"\",\n groupPostsByCategory = defaultGroupPostsByCategory,\n } = options;\n\n const posts = applyPostFilters(rawPosts, { categorySlug, articleSlug });\n const { featured, rest } = splitFeaturedAndRest(posts);\n const trimmedQuery = searchQuery.trim();\n const isSearching = trimmedQuery.length > 0;\n\n const categoryGroups = isSearching\n ? posts.length === 0\n ? []\n : [\n {\n categoryName: `Search results for \"${trimmedQuery}\"`,\n categorySlug: \"search-results\",\n posts,\n },\n ]\n : groupPostsByCategory(rest);\n\n return {\n posts,\n featured,\n rest,\n categoryGroups,\n isEmpty: !featured && rest.length === 0,\n isSearching,\n searchQuery: trimmedQuery,\n };\n}\n","// src/components/articles/articles.view.tsx\nimport { Fragment, type ReactNode } from \"react\";\nimport type {\n ArticleImageResolver,\n ArticlesViewState,\n AsteroidArticleCategoryGroup,\n AsteroidArticlePost,\n AsteroidArticlesCategoryGroupParams,\n AsteroidArticlesCategoryHeadingParams,\n AsteroidArticlesContentParams,\n AsteroidArticlesEmptyParams,\n AsteroidArticlesFeaturedCardParams,\n AsteroidArticlesHeaderParams,\n AsteroidArticlesPostCardParams,\n AsteroidArticlesPostGridParams,\n} from \"./articles.types\";\n\nexport interface ArticlesListingRenderProps<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n> {\n eyebrow?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n renderRoot?: (params: { children: ReactNode }) => ReactNode;\n renderHeader?: (params: AsteroidArticlesHeaderParams) => ReactNode;\n renderFeaturedCard?: (params: AsteroidArticlesFeaturedCardParams<TPost>) => ReactNode;\n renderPostCard: (params: AsteroidArticlesPostCardParams<TPost>) => ReactNode;\n renderCategoryHeading?: (params: AsteroidArticlesCategoryHeadingParams<TPost>) => ReactNode;\n renderPostGrid?: (params: AsteroidArticlesPostGridParams<TPost>) => ReactNode;\n renderCategoryGroup?: (params: AsteroidArticlesCategoryGroupParams<TPost>) => ReactNode;\n renderSkeleton?: () => ReactNode;\n renderEmpty?: (params: AsteroidArticlesEmptyParams) => ReactNode;\n renderContent?: (params: AsteroidArticlesContentParams) => ReactNode;\n}\n\nexport interface RenderArticlesListingArgs<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n> {\n state: ArticlesViewState<TPost>;\n loading: boolean;\n hasError: boolean;\n error: unknown;\n cmsImage: ArticleImageResolver;\n searchNode: ReactNode;\n seoNode: ReactNode;\n jsonLdNode: ReactNode;\n renderProps: ArticlesListingRenderProps<TPost>;\n}\n\nexport function renderArticlesListingBody<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n>(args: RenderArticlesListingArgs<TPost>): ReactNode {\n const { state, loading, hasError, error, cmsImage, searchNode, seoNode, jsonLdNode, renderProps } = args;\n const {\n eyebrow,\n title,\n description,\n renderRoot,\n renderHeader,\n renderFeaturedCard,\n renderPostCard,\n renderCategoryHeading,\n renderPostGrid,\n renderCategoryGroup,\n renderSkeleton,\n renderEmpty,\n renderContent,\n } = renderProps;\n\n const headerNode = renderHeader\n ? renderHeader({ eyebrow, title, description, search: searchNode })\n : (\n <>\n {eyebrow}\n {title}\n {description}\n {searchNode}\n </>\n );\n\n const featuredNode =\n state.featured && !state.isSearching && renderFeaturedCard\n ? renderFeaturedCard({ post: state.featured, cmsImage })\n : null;\n\n const noSearchResultsNode =\n state.isSearching && !loading && state.posts.length === 0\n ? renderEmpty?.({ reason: \"no-results\", searchQuery: state.searchQuery }) ?? null\n : null;\n\n const groupsNode = noSearchResultsNode\n ? null\n : state.categoryGroups.map((group: AsteroidArticleCategoryGroup<TPost>) => {\n const postCards = group.posts.map((post, index) => (\n <Fragment key={post.slug ?? index}>\n {renderPostCard({ post, index, group, cmsImage })}\n </Fragment>\n ));\n\n const gridNode = renderPostGrid\n ? renderPostGrid({ posts: group.posts, group, children: postCards })\n : <>{postCards}</>;\n\n const headingNode = renderCategoryHeading\n ? renderCategoryHeading({ group })\n : group.categoryName;\n\n const defaultContent = (\n <>\n {headingNode}\n {gridNode}\n </>\n );\n\n return (\n <Fragment key={group.categorySlug}>\n {renderCategoryGroup ? renderCategoryGroup({ group, defaultContent }) : defaultContent}\n </Fragment>\n );\n });\n\n const contentNode =\n !loading && !hasError && (state.featured || state.rest.length > 0)\n ? renderContent\n ? renderContent({ featured: featuredNode, groups: groupsNode, noSearchResults: noSearchResultsNode })\n : (\n <>\n {featuredNode}\n {noSearchResultsNode}\n {groupsNode}\n </>\n )\n : null;\n\n const body = (\n <>\n {seoNode}\n {jsonLdNode}\n {headerNode}\n {loading ? renderSkeleton?.() : null}\n {!loading && (hasError || state.isEmpty)\n ? renderEmpty?.({\n reason: hasError ? \"error\" : state.isSearching ? \"no-results\" : \"no-posts\",\n searchQuery: state.searchQuery,\n error,\n })\n : null}\n {contentNode}\n </>\n );\n\n return renderRoot ? renderRoot({ children: body }) : <>{body}</>;\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport {\n buildArticleListingSeoValues,\n seoValuesToClientProps,\n} from \"../../seo/seo.builders\";\nimport type { AsteroidSeoConfig } from \"../../seo/seo.config\";\nimport { JsonLd, Seo } from \"../../seo/Seo\";\nimport { buildCollectionJsonLd } from \"../../seo/jsonld\";\nimport { useCmsImage } from \"../../utils/cmsImage\";\nimport { buildArticlesViewState } from \"./articles.state\";\nimport { renderArticlesListingBody, type ArticlesListingRenderProps } from \"./articles.view\";\nimport type {\n ArticlesViewState,\n AsteroidArticleCategoryGroup,\n AsteroidArticlePost,\n AsteroidArticlesSearchParams,\n} from \"./articles.types\";\n\nexport type {\n AsteroidArticlePost,\n AsteroidArticleCategoryGroup,\n} from \"./articles.types\";\n\nexport interface AsteroidArticlesUsePostsResult<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n> {\n posts: TPost[];\n featured?: TPost | null;\n rest?: TPost[];\n loading: boolean;\n error?: unknown;\n}\n\nexport type AsteroidArticlesUsePosts<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n> = (searchQuery: string) => AsteroidArticlesUsePostsResult<TPost>;\n\nexport interface AsteroidArticlesState<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n> extends ArticlesViewState<TPost> {\n // `searchQuery` (inherited) is the effective, debounced+trimmed query used\n // for grouping and empty-state messages.\n loading: boolean;\n error: unknown;\n hasError: boolean;\n /** Raw, un-debounced input value. Bind your search box to this. */\n inputValue: string;\n setSearchQuery: (value: string) => void;\n}\n\nexport interface AsteroidArticlesProps<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n> extends ArticlesListingRenderProps<TPost> {\n usePosts: AsteroidArticlesUsePosts<TPost>;\n categorySlug?: string;\n articleSlug?: string;\n searchDebounceMs?: number;\n seo?: AsteroidSeoConfig;\n noindex?: boolean;\n renderSearch?: (params: AsteroidArticlesSearchParams) => ReactNode;\n renderJsonLd?: (state: AsteroidArticlesState<TPost>) => ReactNode;\n groupPostsByCategory?: (posts: TPost[]) => AsteroidArticleCategoryGroup<TPost>[];\n children?: (state: AsteroidArticlesState<TPost>) => ReactNode;\n}\n\nfunction useDebouncedValue<T>(value: T, delay: number): T {\n const [debounced, setDebounced] = useState(value);\n useEffect(() => {\n const timer = setTimeout(() => setDebounced(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n return debounced;\n}\n\nexport function useAsteroidArticlesState<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n>(props: Pick<\n AsteroidArticlesProps<TPost>,\n \"usePosts\" | \"categorySlug\" | \"articleSlug\" | \"searchDebounceMs\" | \"groupPostsByCategory\"\n>): AsteroidArticlesState<TPost> {\n const { usePosts, categorySlug, articleSlug, searchDebounceMs = 800, groupPostsByCategory } = props;\n const [inputValue, setSearchQuery] = useState(\"\");\n const debouncedSearchQuery = useDebouncedValue(inputValue, searchDebounceMs);\n const { posts: rawPosts, loading, error } = usePosts(debouncedSearchQuery);\n\n const view = useMemo(\n () =>\n buildArticlesViewState(rawPosts, {\n categorySlug,\n articleSlug,\n searchQuery: debouncedSearchQuery,\n groupPostsByCategory,\n }),\n [rawPosts, categorySlug, articleSlug, debouncedSearchQuery, groupPostsByCategory],\n );\n\n return {\n ...view,\n loading,\n error,\n hasError: Boolean(error),\n inputValue,\n setSearchQuery,\n };\n}\n\nexport function AsteroidArticlesListing<\n TPost extends AsteroidArticlePost = AsteroidArticlePost,\n>(props: AsteroidArticlesProps<TPost>) {\n const { seo, categorySlug, noindex, renderSearch, renderJsonLd, children, ...renderProps } = props;\n const state = useAsteroidArticlesState(props);\n const cmsImage = useCmsImage();\n\n if (children) return <>{children(state)}</>;\n\n const categoryName = categorySlug ? state.posts[0]?.category?.name?.trim() : undefined;\n\n const seoNode = seo ? (\n <Seo\n {...seoValuesToClientProps(\n buildArticleListingSeoValues(seo, { categoryName, categorySlug, noindex }),\n )}\n />\n ) : null;\n\n const jsonLdNode = seo\n ? renderJsonLd?.(state) ?? (\n <JsonLd\n data={buildCollectionJsonLd({\n name: categoryName || `${seo.siteName} ${seo.contentLabel ?? \"Articles\"}`,\n description: seo.defaultDescription || \"\",\n url: `${(seo.baseUrl || \"\").replace(/\\/$/, \"\")}${seo.articlePath ?? \"/blog\"}${\n categorySlug ? `/category/${categorySlug}` : \"\"\n }`,\n siteUrl: (seo.baseUrl || \"\").replace(/\\/$/, \"\"),\n })}\n />\n )\n : null;\n\n const searchNode = renderSearch\n ? renderSearch({\n value: state.inputValue,\n onChange: state.setSearchQuery,\n onSubmit: (event) => event.preventDefault(),\n })\n : null;\n\n return (\n <>\n {renderArticlesListingBody({\n state,\n loading: state.loading,\n hasError: state.hasError,\n error: state.error,\n cmsImage,\n searchNode,\n seoNode,\n jsonLdNode,\n renderProps: renderProps as ArticlesListingRenderProps<TPost>,\n })}\n </>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { usePathname, useRouter, useSearchParams } from \"next/navigation\";\n\nexport interface ArticleSearchBoxProps {\n /** URL query param the search writes to. Default: \"q\". */\n paramKey?: string;\n placeholder?: string;\n /** Debounce before navigating. Default: 500ms. */\n debounceMs?: number;\n className?: string;\n /** Override the default input UI. */\n render?: (params: {\n value: string;\n onChange: (value: string) => void;\n onSubmit: (event: { preventDefault: () => void }) => void;\n }) => ReactNode;\n}\n\nexport function ArticleSearchBox({\n paramKey = \"q\",\n placeholder = \"Search articles...\",\n debounceMs = 500,\n className,\n render,\n}: ArticleSearchBoxProps) {\n const router = useRouter();\n const pathname = usePathname();\n const searchParams = useSearchParams();\n const initial = searchParams.get(paramKey) ?? \"\";\n const [value, setValue] = useState(initial);\n const searchParamsRef = useRef(searchParams);\n searchParamsRef.current = searchParams;\n\n useEffect(() => {\n const timer = setTimeout(() => {\n const params = new URLSearchParams(Array.from(searchParamsRef.current.entries()));\n const trimmed = value.trim();\n if (trimmed) params.set(paramKey, trimmed);\n else params.delete(paramKey);\n const query = params.toString();\n router.replace(query ? `${pathname}?${query}` : pathname, { scroll: false });\n }, debounceMs);\n return () => clearTimeout(timer);\n // Re-run only when the typed value or debounce changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, debounceMs, paramKey, pathname]);\n\n const onSubmit = (event: { preventDefault: () => void }) => event.preventDefault();\n\n if (render) return <>{render({ value, onChange: setValue, onSubmit })}</>;\n\n return (\n <form onSubmit={onSubmit} className={className}>\n <input\n type=\"search\"\n value={value}\n placeholder={placeholder}\n aria-label={placeholder}\n onChange={(event) => setValue(event.target.value)}\n />\n </form>\n );\n}\n"]}
|