import type { LayoutPage, ResumeData, Typography } from "@reactive-resume/schema/resume/data"; import type { Template } from "@reactive-resume/schema/templates"; import type { Locale } from "@reactive-resume/utils/locale"; import type { ComponentType } from "react"; import type { SectionTitleResolver } from "./section-title"; import { useMemo } from "react"; import { Document } from "#react-pdf-renderer"; import { RenderProvider } from "./context"; import { registerFonts, resumeContentContainsCJK, resumeContentScripts } from "./hooks/use-register-fonts"; import { getTemplatePage } from "./templates"; export type TemplatePageProps = { page: LayoutPage; pageIndex: number; }; export type TemplatePage = ComponentType; type ResumeDocumentProps = { data: ResumeData; template: Template; resolveSectionTitle?: SectionTitleResolver | undefined; }; const getLayoutPageKey = (page: LayoutPage, pageIndex: number) => `${page.fullWidth ? "full" : "split"}:${page.main.join(",")}:${page.sidebar.join(",")}:${pageIndex}`; export const ResumeDocument = ({ data, template, resolveSectionTitle }: ResumeDocumentProps) => { const TemplatePageComponent = getTemplatePage(template); const creationDate = useMemo(() => new Date(), []); const hasCjkContent = useMemo(() => resumeContentContainsCJK(data), [data]); const scripts = useMemo(() => resumeContentScripts(data), [data]); const typography = registerFonts( data.metadata.typography, data.metadata.page.locale as Locale, hasCjkContent, scripts, ) as Typography; // `registerFonts` widens `fontFamily` to `string | string[]` for CJK // fallback (#2986); the cast carries that wider runtime value through // `ResumeData` without changing the public schema. const resumeData = useMemo(() => ({ ...data, metadata: { ...data.metadata, typography } }), [data, typography]); return ( {resumeData.metadata.layout.pages.map((page, index) => ( ))} ); };