React example
npm install @domdoc/core @domdoc/react
npx @domdoc/ui add viewer-shell toolbar
import { useMemo, useState } from "react";
import { bundlesFromCdn } from "@domdoc/core";
import { DomdocViewer, type Viewer } from "@domdoc/react";
import { DomdocProvider } from "@/components/domdoc/domdoc-provider";
import { Toolbar } from "@/components/domdoc/toolbar";
import { ViewerShell } from "@/components/domdoc/viewer-shell";
const BUNDLE_BASE = import.meta.env.DOMDOC_EXAMPLES_BUNDLES || "/api/bundles/0.0.1";
export function App() {
const options = useMemo(
() => ({
bundles: bundlesFromCdn(BUNDLE_BASE),
toolbar: false as const,
fontsWasmBase: `${BUNDLE_BASE.replace(/\/$/, "")}/fonts/`,
}),
[],
);
const [viewer, setViewer] = useState<Viewer | null>(null);
return (
<DomdocProvider viewer={viewer}>
<div className="flex h-dvh flex-col bg-background font-sans text-foreground">
<Toolbar />
<ViewerShell>
<DomdocViewer options={options} onReady={setViewer} className="h-full w-full" />
</ViewerShell>
</div>
</DomdocProvider>
);
}
@import "tailwindcss";
@import "@domdoc/ui/theme.css";
html,
body,
#root {
height: 100%;
margin: 0;
}
import tailwindcss from "@tailwindcss/vite";
import react from "@vitejs/plugin-react";
import { createRequire } from "node:module";
import { fileURLToPath, URL } from "node:url";
import { defineConfig } from "vite";
const { excludeEngineWasm } = createRequire(import.meta.url)("../exclude-engine-wasm.cjs") as {
excludeEngineWasm: () => { name: string };
};
function publicBase(fallback: string): string {
const raw = process.env.DOMDOC_BASE || fallback;
return raw.endsWith("/") ? raw : `${raw}/`;
}
export default defineConfig({
base: publicBase("/sdk-docs/examples/react/"),
envPrefix: ["VITE_", "DOMDOC_"],
plugins: [excludeEngineWasm(), react(), tailwindcss()],
resolve: {
alias: {
"@": fileURLToPath(new URL("./src", import.meta.url)),
},
},
});