@brett_lamy/docstream 1.2.4 → 1.4.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 +76 -14
- package/dist/assets.d.ts +3 -0
- package/dist/assets.d.ts.map +1 -0
- package/dist/assets.js +20 -0
- package/dist/assets.js.map +1 -0
- package/dist/demo/DemoViewer.d.ts +64 -0
- package/dist/demo/DemoViewer.d.ts.map +1 -0
- package/dist/demo/DemoViewer.js +426 -0
- package/dist/demo/DemoViewer.js.map +1 -0
- package/dist/demo/context.d.ts +14 -0
- package/dist/demo/context.d.ts.map +1 -0
- package/dist/demo/context.js +25 -0
- package/dist/demo/context.js.map +1 -0
- package/dist/demo/glob.d.ts +60 -0
- package/dist/demo/glob.d.ts.map +1 -0
- package/dist/demo/glob.js +158 -0
- package/dist/demo/glob.js.map +1 -0
- package/dist/demo/index.d.ts +10 -0
- package/dist/demo/index.d.ts.map +1 -0
- package/dist/demo/index.js +6 -0
- package/dist/demo/index.js.map +1 -0
- package/dist/demo/markdown.d.ts +60 -0
- package/dist/demo/markdown.d.ts.map +1 -0
- package/dist/demo/markdown.js +181 -0
- package/dist/demo/markdown.js.map +1 -0
- package/dist/demo/surface.d.ts +11 -0
- package/dist/demo/surface.d.ts.map +1 -0
- package/dist/demo/surface.js +69 -0
- package/dist/demo/surface.js.map +1 -0
- package/dist/demo/types.d.ts +91 -0
- package/dist/demo/types.d.ts.map +1 -0
- package/dist/demo/types.js +2 -0
- package/dist/demo/types.js.map +1 -0
- package/dist/docs/CollapsibleCode.d.ts +14 -0
- package/dist/docs/CollapsibleCode.d.ts.map +1 -0
- package/dist/docs/CollapsibleCode.js +19 -0
- package/dist/docs/CollapsibleCode.js.map +1 -0
- package/dist/docs/DocsRenderer.d.ts +49 -0
- package/dist/docs/DocsRenderer.d.ts.map +1 -0
- package/dist/docs/DocsRenderer.js +277 -0
- package/dist/docs/DocsRenderer.js.map +1 -0
- package/dist/docs/HighlightedCode.d.ts +6 -0
- package/dist/docs/HighlightedCode.d.ts.map +1 -0
- package/dist/docs/HighlightedCode.js +40 -0
- package/dist/docs/HighlightedCode.js.map +1 -0
- package/dist/docs/Mermaid.d.ts +7 -0
- package/dist/docs/Mermaid.d.ts.map +1 -0
- package/dist/docs/Mermaid.js +39 -0
- package/dist/docs/Mermaid.js.map +1 -0
- package/dist/docs/PageActions.d.ts +33 -0
- package/dist/docs/PageActions.d.ts.map +1 -0
- package/dist/docs/PageActions.js +115 -0
- package/dist/docs/PageActions.js.map +1 -0
- package/dist/docs/controls.d.ts +29 -0
- package/dist/docs/controls.d.ts.map +1 -0
- package/dist/docs/controls.js +46 -0
- package/dist/docs/controls.js.map +1 -0
- package/dist/docs/copy.d.ts +24 -0
- package/dist/docs/copy.d.ts.map +1 -0
- package/dist/docs/copy.js +62 -0
- package/dist/docs/copy.js.map +1 -0
- package/dist/docs/math.d.ts +3 -0
- package/dist/docs/math.d.ts.map +1 -0
- package/dist/docs/math.js +12 -0
- package/dist/docs/math.js.map +1 -0
- package/dist/docs/reference.d.ts +27 -0
- package/dist/docs/reference.d.ts.map +1 -0
- package/dist/docs/reference.js +73 -0
- package/dist/docs/reference.js.map +1 -0
- package/dist/docs/tabs-sync.d.ts +5 -0
- package/dist/docs/tabs-sync.d.ts.map +1 -0
- package/dist/docs/tabs-sync.js +58 -0
- package/dist/docs/tabs-sync.js.map +1 -0
- package/dist/gitbook/ast.d.ts +506 -0
- package/dist/gitbook/ast.d.ts.map +1 -0
- package/dist/gitbook/ast.js +8 -0
- package/dist/gitbook/ast.js.map +1 -0
- package/dist/gitbook/attrs.d.ts +14 -0
- package/dist/gitbook/attrs.d.ts.map +1 -0
- package/dist/gitbook/attrs.js +36 -0
- package/dist/gitbook/attrs.js.map +1 -0
- package/dist/gitbook/flatten.d.ts +14 -0
- package/dist/gitbook/flatten.d.ts.map +1 -0
- package/dist/gitbook/flatten.js +45 -0
- package/dist/gitbook/flatten.js.map +1 -0
- package/dist/gitbook/index.d.ts +10 -0
- package/dist/gitbook/index.d.ts.map +1 -0
- package/dist/gitbook/index.js +8 -0
- package/dist/gitbook/index.js.map +1 -0
- package/dist/gitbook/inline.d.ts +28 -0
- package/dist/gitbook/inline.d.ts.map +1 -0
- package/dist/gitbook/inline.js +956 -0
- package/dist/gitbook/inline.js.map +1 -0
- package/dist/gitbook/outline.d.ts +16 -0
- package/dist/gitbook/outline.d.ts.map +1 -0
- package/dist/gitbook/outline.js +44 -0
- package/dist/gitbook/outline.js.map +1 -0
- package/dist/gitbook/package-managers.d.ts +12 -0
- package/dist/gitbook/package-managers.d.ts.map +1 -0
- package/dist/gitbook/package-managers.js +93 -0
- package/dist/gitbook/package-managers.js.map +1 -0
- package/dist/gitbook/parse.d.ts +44 -0
- package/dist/gitbook/parse.d.ts.map +1 -0
- package/dist/gitbook/parse.js +1113 -0
- package/dist/gitbook/parse.js.map +1 -0
- package/dist/gitbook/serialize.d.ts +23 -0
- package/dist/gitbook/serialize.d.ts.map +1 -0
- package/dist/gitbook/serialize.js +498 -0
- package/dist/gitbook/serialize.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/openapi/OpenApiOperation.d.ts +6 -0
- package/dist/openapi/OpenApiOperation.d.ts.map +1 -0
- package/dist/openapi/OpenApiOperation.js +112 -0
- package/dist/openapi/OpenApiOperation.js.map +1 -0
- package/dist/playground/InlineDemoPreview.d.ts +24 -0
- package/dist/playground/InlineDemoPreview.d.ts.map +1 -0
- package/dist/playground/InlineDemoPreview.js +48 -0
- package/dist/playground/InlineDemoPreview.js.map +1 -0
- package/dist/playground/PlaygroundStreamdown.d.ts +16 -0
- package/dist/playground/PlaygroundStreamdown.d.ts.map +1 -0
- package/dist/playground/PlaygroundStreamdown.js +22 -0
- package/dist/playground/PlaygroundStreamdown.js.map +1 -0
- package/dist/playground/ReactCodePreview.d.ts +64 -0
- package/dist/playground/ReactCodePreview.d.ts.map +1 -0
- package/dist/playground/ReactCodePreview.js +108 -0
- package/dist/playground/ReactCodePreview.js.map +1 -0
- package/dist/playground/filesystem.d.ts +27 -0
- package/dist/playground/filesystem.d.ts.map +1 -0
- package/dist/playground/filesystem.js +65 -0
- package/dist/playground/filesystem.js.map +1 -0
- package/dist/playground/index.d.ts +9 -0
- package/dist/playground/index.d.ts.map +1 -0
- package/dist/playground/index.js +7 -0
- package/dist/playground/index.js.map +1 -0
- package/dist/playground/project.d.ts +57 -0
- package/dist/playground/project.d.ts.map +1 -0
- package/dist/playground/project.js +137 -0
- package/dist/playground/project.js.map +1 -0
- package/dist/replay/NativeReplay.d.ts +9 -0
- package/dist/replay/NativeReplay.d.ts.map +1 -0
- package/dist/replay/NativeReplay.js +173 -0
- package/dist/replay/NativeReplay.js.map +1 -0
- package/dist/replay/ReplayPreview.d.ts +33 -0
- package/dist/replay/ReplayPreview.d.ts.map +1 -0
- package/dist/replay/ReplayPreview.js +91 -0
- package/dist/replay/ReplayPreview.js.map +1 -0
- package/dist/replay/index.d.ts +5 -0
- package/dist/replay/index.d.ts.map +1 -0
- package/dist/replay/index.js +4 -0
- package/dist/replay/index.js.map +1 -0
- package/dist/replay/sanitize.d.ts +4 -0
- package/dist/replay/sanitize.d.ts.map +1 -0
- package/dist/replay/sanitize.js +86 -0
- package/dist/replay/sanitize.js.map +1 -0
- package/dist/replay/url.d.ts +8 -0
- package/dist/replay/url.d.ts.map +1 -0
- package/dist/replay/url.js +41 -0
- package/dist/replay/url.js.map +1 -0
- package/dist/source/SourcePreview.d.ts +13 -0
- package/dist/source/SourcePreview.d.ts.map +1 -0
- package/dist/source/SourcePreview.js +47 -0
- package/dist/source/SourcePreview.js.map +1 -0
- package/dist/source/client.d.ts +7 -0
- package/dist/source/client.d.ts.map +1 -0
- package/dist/source/client.js +52 -0
- package/dist/source/client.js.map +1 -0
- package/dist/source/index.d.ts +6 -0
- package/dist/source/index.d.ts.map +1 -0
- package/dist/source/index.js +3 -0
- package/dist/source/index.js.map +1 -0
- package/dist/source/types.d.ts +33 -0
- package/dist/source/types.d.ts.map +1 -0
- package/dist/source/types.js +2 -0
- package/dist/source/types.js.map +1 -0
- package/dist/streamdown.d.ts +19 -0
- package/dist/streamdown.d.ts.map +1 -0
- package/dist/streamdown.js +15 -0
- package/dist/streamdown.js.map +1 -0
- package/dist/styles.css +2441 -0
- package/dist/video/VideoEmbed.d.ts +17 -0
- package/dist/video/VideoEmbed.d.ts.map +1 -0
- package/dist/video/VideoEmbed.js +12 -0
- package/dist/video/VideoEmbed.js.map +1 -0
- package/dist/video/index.d.ts +3 -0
- package/dist/video/index.d.ts.map +1 -0
- package/dist/video/index.js +2 -0
- package/dist/video/index.js.map +1 -0
- package/dist/vite/index.d.ts +21 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +137 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/viz/VizEmbed.d.ts +18 -0
- package/dist/viz/VizEmbed.d.ts.map +1 -0
- package/dist/viz/VizEmbed.js +12 -0
- package/dist/viz/VizEmbed.js.map +1 -0
- package/dist/viz/index.d.ts +4 -0
- package/dist/viz/index.d.ts.map +1 -0
- package/dist/viz/index.js +3 -0
- package/dist/viz/index.js.map +1 -0
- package/package.json +70 -34
- package/src/demo/types.ts +2 -2
- package/src/docs/DocsRenderer.tsx +31 -7
- package/src/docs/Mermaid.tsx +5 -3
- package/src/docs/math.ts +3 -0
- package/src/index.ts +10 -28
- package/src/playground/PlaygroundStreamdown.tsx +28 -61
- package/src/playground/filesystem.ts +10 -190
- package/src/playground/index.ts +4 -0
- package/src/playground/project.ts +194 -0
- package/src/replay/NativeReplay.tsx +236 -0
- package/src/replay/ReplayPreview.tsx +7 -226
- package/src/styles.css +91 -1
- package/src/replay/styles.css +0 -87
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useId, useState } from "react";
|
|
3
|
+
import { HighlightedCode } from "./HighlightedCode.js";
|
|
4
|
+
let seq = 0;
|
|
5
|
+
function positiveLineCount(value, fallback) {
|
|
6
|
+
return value !== undefined && Number.isFinite(value) && value > 0 ? Math.floor(value) : fallback;
|
|
7
|
+
}
|
|
8
|
+
export function Mermaid({ code, collapsedCodeLines = 3, expandedCodeLines = 30 }) {
|
|
9
|
+
const [svg, setSvg] = useState(null);
|
|
10
|
+
const [error, setError] = useState(null);
|
|
11
|
+
const [codeExpanded, setCodeExpanded] = useState(false);
|
|
12
|
+
const codePanelId = useId();
|
|
13
|
+
const collapsedLines = positiveLineCount(collapsedCodeLines, 3);
|
|
14
|
+
const expandedLines = Math.max(collapsedLines, positiveLineCount(expandedCodeLines, 30));
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
let cancelled = false;
|
|
17
|
+
import("mermaid")
|
|
18
|
+
.then(async ({ default: mermaid }) => {
|
|
19
|
+
mermaid.initialize({ startOnLoad: false, securityLevel: "strict" });
|
|
20
|
+
// A fresh id per render: mermaid.render removes any element with the id it is given,
|
|
21
|
+
// so reusing one (StrictMode's double effect, a code change) deleted the diagram an
|
|
22
|
+
// earlier render had already mounted.
|
|
23
|
+
const { svg } = await mermaid.render(`mermaid-${++seq}`, code);
|
|
24
|
+
if (!cancelled)
|
|
25
|
+
setSvg(svg);
|
|
26
|
+
})
|
|
27
|
+
.catch((e) => {
|
|
28
|
+
if (!cancelled)
|
|
29
|
+
setError(String(e.message ?? e));
|
|
30
|
+
});
|
|
31
|
+
return () => {
|
|
32
|
+
cancelled = true;
|
|
33
|
+
};
|
|
34
|
+
}, [code]);
|
|
35
|
+
return (_jsxs("section", { className: "docs-mermaid-preview", "data-docstream-mermaid": "", children: [error ? (_jsxs("pre", { className: "docs-mermaid-error", children: ["mermaid error: ", error] })) : svg ? (_jsx("div", { className: "docs-mermaid", dangerouslySetInnerHTML: { __html: svg } })) : (_jsx("div", { className: "docs-mermaid", children: "Rendering diagram\u2026" })), _jsxs("div", { className: "docs-react-demo-code docs-mermaid-code", children: [_jsx("pre", { id: codePanelId, className: codeExpanded ? "docs-react-demo-code-body docs-react-demo-code-body-expanded" : "docs-react-demo-code-body", style: {
|
|
36
|
+
"--docs-react-demo-code-lines": codeExpanded ? expandedLines : collapsedLines,
|
|
37
|
+
}, children: _jsx(HighlightedCode, { code: code, language: "mermaid", lineNumbers: true }) }), _jsx("button", { type: "button", className: "docs-react-demo-code-toggle", "aria-controls": codePanelId, "aria-expanded": codeExpanded, onClick: () => setCodeExpanded((value) => !value), children: codeExpanded ? "Hide Code" : "View Code" })] })] }));
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=Mermaid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Mermaid.js","sourceRoot":"","sources":["../../src/docs/Mermaid.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type ResolveDemosOptions } from "../demo/markdown.js";
|
|
2
|
+
import type { DemoResolver } from "../demo/types.js";
|
|
3
|
+
export type DocPageAction = "copy" | "view" | "chatgpt" | "claude";
|
|
4
|
+
export interface DocPageActionsOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Public URL of this page as Markdown (e.g. `/md/button.md`). "View as Markdown" opens it and the
|
|
7
|
+
* ChatGPT / Claude prompts reference it. Without it, "View" opens the resolved Markdown as a
|
|
8
|
+
* blob and the prompts reference `pageUrl` (default: the current location).
|
|
9
|
+
*/
|
|
10
|
+
markdownUrl?: string;
|
|
11
|
+
pageUrl?: string;
|
|
12
|
+
/** The question handed to ChatGPT / Claude. */
|
|
13
|
+
prompt?: (url: string) => string;
|
|
14
|
+
/** Which menu entries to show, in order. Defaults to all four. */
|
|
15
|
+
actions?: DocPageAction[];
|
|
16
|
+
/** Final touch on the copied Markdown (e.g. append a "Source:" footer). */
|
|
17
|
+
transform?: (markdown: string) => string;
|
|
18
|
+
/**
|
|
19
|
+
* Options for resolving `{% demo %}` blocks. The default `format: "inline"` keeps the page
|
|
20
|
+
* renderable by docstream; `{ format: "plain" }` gives the pre-1.2 prose + fences form.
|
|
21
|
+
*/
|
|
22
|
+
demoOptions?: ResolveDemosOptions;
|
|
23
|
+
/** Overrides the resolver from context. */
|
|
24
|
+
resolver?: DemoResolver;
|
|
25
|
+
className?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface DocPageActionsProps extends DocPageActionsOptions {
|
|
28
|
+
/** The page's Markdown source (or a function producing it on demand). */
|
|
29
|
+
markdown: string | (() => string | Promise<string>);
|
|
30
|
+
}
|
|
31
|
+
/** A shadcn-style split button: "Copy page" plus a menu of Markdown / AI actions. */
|
|
32
|
+
export declare function DocPageActions(props: DocPageActionsProps): import("react").JSX.Element;
|
|
33
|
+
//# sourceMappingURL=PageActions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageActions.d.ts","sourceRoot":"","sources":["../../src/docs/PageActions.tsx"],"names":[],"mappings":"AAQA,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAGjD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAA;AAElE,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IAChC,kEAAkE;IAClE,OAAO,CAAC,EAAE,aAAa,EAAE,CAAA;IACzB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAA;IACxC;;;OAGG;IACH,WAAW,CAAC,EAAE,mBAAmB,CAAA;IACjC,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,mBAAoB,SAAQ,qBAAqB;IAChE,yEAAyE;IACzE,QAAQ,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;CACpD;AAkCD,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,+BAyIxD"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/* "Copy page ▾": copy the page as Markdown, view it as Markdown, or open it in ChatGPT / Claude.
|
|
3
|
+
Copy and View give renderable docstream Markdown: each {% demo %} keeps its tag and carries its
|
|
4
|
+
real files inline, so pasting the page into docstream renders the same page (demos included). */
|
|
5
|
+
import { useEffect, useId, useRef, useState } from "react";
|
|
6
|
+
import { AnimatePresence, motion, useReducedMotion } from "framer-motion";
|
|
7
|
+
import { ArrowUpRight, ChevronDown, FileText } from "lucide-react";
|
|
8
|
+
import { useDemoResolver } from "../demo/context.js";
|
|
9
|
+
import { resolveDemosToMarkdown } from "../demo/markdown.js";
|
|
10
|
+
import { CopyIcon, useCopied } from "./copy.js";
|
|
11
|
+
const OpenAIGlyph = () => (_jsx("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.9", "aria-hidden": "true", children: [0, 60, 120].map((a) => (_jsx("rect", { x: "8.6", y: "2.6", width: "6.8", height: "18.8", rx: "3.4", transform: `rotate(${a} 12 12)` }, a))) }));
|
|
12
|
+
const AnthropicGlyph = () => (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", children: _jsx("path", { d: "M17.3 3.54h-3.67l6.7 16.92H24zM6.7 3.54 0 20.46h3.74l1.37-3.55h7.01l1.37 3.55h3.74L10.54 3.54zm-.37 10.22 2.29-5.94 2.29 5.94z" }) }));
|
|
13
|
+
const defaultPrompt = (url) => `Read ${url}, I want to ask questions about it.`;
|
|
14
|
+
/** The page as renderable Markdown (demo files inline) for copying or exporting. */
|
|
15
|
+
async function pageMarkdown(props, resolver) {
|
|
16
|
+
const source = typeof props.markdown === "function" ? await props.markdown() : props.markdown;
|
|
17
|
+
const resolved = await resolveDemosToMarkdown(source, resolver, props.demoOptions);
|
|
18
|
+
return props.transform ? props.transform(resolved) : resolved;
|
|
19
|
+
}
|
|
20
|
+
/** A shadcn-style split button: "Copy page" plus a menu of Markdown / AI actions. */
|
|
21
|
+
export function DocPageActions(props) {
|
|
22
|
+
const resolver = useDemoResolver(props.resolver);
|
|
23
|
+
const { copied, copy } = useCopied();
|
|
24
|
+
const [open, setOpen] = useState(false);
|
|
25
|
+
const reduced = useReducedMotion();
|
|
26
|
+
const root = useRef(null);
|
|
27
|
+
const trigger = useRef(null);
|
|
28
|
+
const menuId = useId();
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
if (!open)
|
|
31
|
+
return;
|
|
32
|
+
const onDown = (event) => {
|
|
33
|
+
if (!root.current?.contains(event.target))
|
|
34
|
+
setOpen(false);
|
|
35
|
+
};
|
|
36
|
+
document.addEventListener("pointerdown", onDown);
|
|
37
|
+
// Focus the first item once the menu is in the DOM.
|
|
38
|
+
const frame = requestAnimationFrame(() => root.current?.querySelector("[role=menuitem]")?.focus());
|
|
39
|
+
return () => {
|
|
40
|
+
document.removeEventListener("pointerdown", onDown);
|
|
41
|
+
cancelAnimationFrame(frame);
|
|
42
|
+
};
|
|
43
|
+
}, [open]);
|
|
44
|
+
const copyPage = () => copy(() => pageMarkdown(props, resolver));
|
|
45
|
+
const here = typeof location === "undefined" ? "" : location.href;
|
|
46
|
+
const target = props.markdownUrl ? absolute(props.markdownUrl) : props.pageUrl ?? here;
|
|
47
|
+
const ask = (props.prompt ?? defaultPrompt)(target);
|
|
48
|
+
const viewMarkdown = async () => {
|
|
49
|
+
const text = await pageMarkdown(props, resolver);
|
|
50
|
+
const url = URL.createObjectURL(new Blob([text], { type: "text/plain;charset=utf-8" }));
|
|
51
|
+
window.open(url, "_blank", "noopener");
|
|
52
|
+
setTimeout(() => URL.revokeObjectURL(url), 60_000);
|
|
53
|
+
};
|
|
54
|
+
const all = [
|
|
55
|
+
{ id: "copy", icon: _jsx(CopyIcon, { copied: false }), label: "Copy as Markdown", hint: "Copy this page, demos included", run: () => void copyPage() },
|
|
56
|
+
props.markdownUrl
|
|
57
|
+
? { id: "view", icon: _jsx(FileText, { width: 15, height: 15, "aria-hidden": "true" }), label: "View as Markdown", hint: "Open the page as plain text", href: props.markdownUrl }
|
|
58
|
+
: { id: "view", icon: _jsx(FileText, { width: 15, height: 15, "aria-hidden": "true" }), label: "View as Markdown", hint: "Open the page as plain text", run: () => void viewMarkdown() },
|
|
59
|
+
{ id: "chatgpt", icon: _jsx(OpenAIGlyph, {}), label: "Open in ChatGPT", hint: "Ask questions about this page", href: `https://chatgpt.com/?hints=search&q=${encodeURIComponent(ask)}` },
|
|
60
|
+
{ id: "claude", icon: _jsx(AnthropicGlyph, {}), label: "Open in Claude", hint: "Ask questions about this page", href: `https://claude.ai/new?q=${encodeURIComponent(ask)}` },
|
|
61
|
+
];
|
|
62
|
+
const wanted = props.actions ?? ["copy", "view", "chatgpt", "claude"];
|
|
63
|
+
const items = wanted.map((id) => all.find((item) => item.id === id)).filter((item) => !!item);
|
|
64
|
+
const close = (refocus = true) => {
|
|
65
|
+
setOpen(false);
|
|
66
|
+
if (refocus)
|
|
67
|
+
trigger.current?.focus();
|
|
68
|
+
};
|
|
69
|
+
const onMenuKey = (event) => {
|
|
70
|
+
const entries = Array.from(event.currentTarget.querySelectorAll("[role=menuitem]"));
|
|
71
|
+
const index = entries.indexOf(document.activeElement);
|
|
72
|
+
let next = -1;
|
|
73
|
+
if (event.key === "ArrowDown")
|
|
74
|
+
next = (index + 1) % entries.length;
|
|
75
|
+
else if (event.key === "ArrowUp")
|
|
76
|
+
next = (index - 1 + entries.length) % entries.length;
|
|
77
|
+
else if (event.key === "Home")
|
|
78
|
+
next = 0;
|
|
79
|
+
else if (event.key === "End")
|
|
80
|
+
next = entries.length - 1;
|
|
81
|
+
else if (event.key === "Escape") {
|
|
82
|
+
event.preventDefault();
|
|
83
|
+
close();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
else if (event.key === "Tab") {
|
|
87
|
+
close(false);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (next < 0)
|
|
91
|
+
return;
|
|
92
|
+
event.preventDefault();
|
|
93
|
+
entries[next]?.focus();
|
|
94
|
+
};
|
|
95
|
+
return (_jsxs("div", { ref: root, className: props.className ? `docs-page-actions ${props.className}` : "docs-page-actions", children: [_jsxs("button", { type: "button", className: "docs-page-actions-main", onClick: () => void copyPage(), "aria-label": "Copy page as Markdown", children: [_jsx(CopyIcon, { copied: copied, size: 13 }), _jsx("span", { "aria-live": "polite", children: copied ? "Copied" : "Copy page" })] }), _jsx("button", { ref: trigger, type: "button", className: "docs-page-actions-more", "aria-label": "More page actions", "aria-haspopup": "menu", "aria-expanded": open, "aria-controls": open ? menuId : undefined, onClick: () => setOpen((value) => !value), onKeyDown: (event) => {
|
|
96
|
+
if (event.key === "ArrowDown" && !open) {
|
|
97
|
+
event.preventDefault();
|
|
98
|
+
setOpen(true);
|
|
99
|
+
}
|
|
100
|
+
}, children: _jsx(ChevronDown, { width: 13, height: 13, strokeWidth: 2.4, "aria-hidden": "true", className: open ? "docs-page-actions-caret-open" : undefined }) }), _jsx(AnimatePresence, { children: open ? (_jsx(motion.div, { id: menuId, role: "menu", "aria-label": "Page actions", className: "docs-page-actions-menu", onKeyDown: onMenuKey, initial: reduced ? { opacity: 0 } : { opacity: 0, scale: 0.95, y: -4 }, animate: { opacity: 1, scale: 1, y: 0, transition: reduced ? { duration: 0.1 } : { type: "spring", bounce: 0.2, duration: 0.32 } }, exit: { opacity: 0, scale: reduced ? 1 : 0.97, transition: { duration: 0.12 } }, style: { transformOrigin: "top right" }, children: items.map((item) => {
|
|
101
|
+
const body = (_jsxs(_Fragment, { children: [_jsx("span", { className: "docs-page-actions-icon", children: item.icon }), _jsxs("span", { className: "docs-page-actions-text", children: [_jsxs("span", { className: "docs-page-actions-label", children: [item.label, item.href ? _jsx(ArrowUpRight, { width: 12, height: 12, "aria-hidden": "true" }) : null] }), _jsx("span", { className: "docs-page-actions-hint", children: item.hint })] })] }));
|
|
102
|
+
return item.href ? (_jsx("a", { role: "menuitem", tabIndex: -1, className: "docs-page-actions-item", href: item.href, target: "_blank", rel: "noreferrer", onClick: () => close(false), children: body }, item.id)) : (_jsx("button", { type: "button", role: "menuitem", tabIndex: -1, className: "docs-page-actions-item", onClick: () => { item.run?.(); close(); }, children: body }, item.id));
|
|
103
|
+
}) })) : null })] }));
|
|
104
|
+
}
|
|
105
|
+
function absolute(url) {
|
|
106
|
+
if (typeof location === "undefined")
|
|
107
|
+
return url;
|
|
108
|
+
try {
|
|
109
|
+
return new URL(url, location.href).toString();
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return url;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=PageActions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageActions.js","sourceRoot":"","sources":["../../src/docs/PageActions.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type CSSProperties, type KeyboardEvent, type ReactNode } from "react";
|
|
2
|
+
export interface PillOption<T extends string> {
|
|
3
|
+
id: T;
|
|
4
|
+
label: ReactNode;
|
|
5
|
+
/** Accessible name when `label` is not plain text. */
|
|
6
|
+
ariaLabel?: string;
|
|
7
|
+
}
|
|
8
|
+
/** Arrow/Home/End move focus (and selection) across a row of buttons. */
|
|
9
|
+
export declare function rovingKeyDown<T extends string>(event: KeyboardEvent<HTMLElement>, ids: readonly T[], current: T, select: (id: T) => void, orientation?: "horizontal" | "vertical"): void;
|
|
10
|
+
/** A tab strip with a sliding pill. `panelId(id)` wires aria-controls when the panels exist. */
|
|
11
|
+
export declare function PillTabs<T extends string>({ options, value, onChange, label, panelId, tabId, className, }: {
|
|
12
|
+
options: readonly PillOption<T>[];
|
|
13
|
+
value: T;
|
|
14
|
+
onChange: (id: T) => void;
|
|
15
|
+
label: string;
|
|
16
|
+
panelId?: (id: T) => string;
|
|
17
|
+
tabId?: (id: T) => string;
|
|
18
|
+
className?: string;
|
|
19
|
+
}): import("react").JSX.Element;
|
|
20
|
+
/** A segmented single choice (radio semantics), styled like the pill tabs. */
|
|
21
|
+
export declare function Segmented<T extends string>({ options, value, onChange, label, className, style, }: {
|
|
22
|
+
options: readonly PillOption<T>[];
|
|
23
|
+
value: T;
|
|
24
|
+
onChange: (id: T) => void;
|
|
25
|
+
label: string;
|
|
26
|
+
className?: string;
|
|
27
|
+
style?: CSSProperties;
|
|
28
|
+
}): import("react").JSX.Element;
|
|
29
|
+
//# sourceMappingURL=controls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controls.d.ts","sourceRoot":"","sources":["../../src/docs/controls.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAS,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAGrF,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,MAAM;IAC1C,EAAE,EAAE,CAAC,CAAA;IACL,KAAK,EAAE,SAAS,CAAA;IAChB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAID,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC5C,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,EACjC,GAAG,EAAE,SAAS,CAAC,EAAE,EACjB,OAAO,EAAE,CAAC,EACV,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,EACvB,WAAW,GAAE,YAAY,GAAG,UAAyB,QAetD;AAED,gGAAgG;AAChG,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,EACzC,OAAO,EACP,KAAK,EACL,QAAQ,EACR,KAAK,EACL,OAAO,EACP,KAAK,EACL,SAAS,GACV,EAAE;IACD,OAAO,EAAE,SAAS,UAAU,CAAC,CAAC,CAAC,EAAE,CAAA;IACjC,KAAK,EAAE,CAAC,CAAA;IACR,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,MAAM,CAAA;IAC3B,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,+BAmCA;AAED,8EAA8E;AAC9E,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,EAC1C,OAAO,EACP,KAAK,EACL,QAAQ,EACR,KAAK,EACL,SAAS,EACT,KAAK,GACN,EAAE;IACD,OAAO,EAAE,SAAS,UAAU,CAAC,CAAC,CAAC,EAAE,CAAA;IACjC,KAAK,EAAE,CAAC,CAAA;IACR,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,aAAa,CAAA;CACtB,+BAkCA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/* Small accessible controls shared by the demo viewer, tabs and page actions: a pill tab strip
|
|
3
|
+
(tabs semantics, roving focus) and a segmented radio group. */
|
|
4
|
+
import { useId } from "react";
|
|
5
|
+
import { motion, useReducedMotion } from "framer-motion";
|
|
6
|
+
const SPRING = { type: "spring", bounce: 0.18, duration: 0.45 };
|
|
7
|
+
/** Arrow/Home/End move focus (and selection) across a row of buttons. */
|
|
8
|
+
export function rovingKeyDown(event, ids, current, select, orientation = "horizontal") {
|
|
9
|
+
const prev = orientation === "horizontal" ? "ArrowLeft" : "ArrowUp";
|
|
10
|
+
const next = orientation === "horizontal" ? "ArrowRight" : "ArrowDown";
|
|
11
|
+
const index = ids.indexOf(current);
|
|
12
|
+
let target = -1;
|
|
13
|
+
if (event.key === prev)
|
|
14
|
+
target = (index - 1 + ids.length) % ids.length;
|
|
15
|
+
else if (event.key === next)
|
|
16
|
+
target = (index + 1) % ids.length;
|
|
17
|
+
else if (event.key === "Home")
|
|
18
|
+
target = 0;
|
|
19
|
+
else if (event.key === "End")
|
|
20
|
+
target = ids.length - 1;
|
|
21
|
+
if (target < 0)
|
|
22
|
+
return;
|
|
23
|
+
event.preventDefault();
|
|
24
|
+
select(ids[target]);
|
|
25
|
+
const buttons = event.currentTarget.querySelectorAll("[data-roving]");
|
|
26
|
+
buttons[target]?.focus();
|
|
27
|
+
}
|
|
28
|
+
/** A tab strip with a sliding pill. `panelId(id)` wires aria-controls when the panels exist. */
|
|
29
|
+
export function PillTabs({ options, value, onChange, label, panelId, tabId, className, }) {
|
|
30
|
+
const layoutId = useId();
|
|
31
|
+
const reduced = useReducedMotion();
|
|
32
|
+
return (_jsx("div", { className: className ? `docs-pills ${className}` : "docs-pills", role: "tablist", "aria-label": label, onKeyDown: (event) => rovingKeyDown(event, options.map((o) => o.id), value, onChange), children: options.map((option) => {
|
|
33
|
+
const selected = option.id === value;
|
|
34
|
+
return (_jsxs("button", { id: tabId?.(option.id), type: "button", role: "tab", "data-roving": "", "aria-selected": selected, "aria-controls": panelId?.(option.id), "aria-label": option.ariaLabel, tabIndex: selected ? 0 : -1, className: "docs-pill", onClick: () => onChange(option.id), children: [selected ? (_jsx(motion.span, { layoutId: `pill-${layoutId}`, className: "docs-pill-indicator", transition: reduced ? { duration: 0 } : SPRING })) : null, _jsx("span", { className: "docs-pill-label", children: option.label })] }, option.id));
|
|
35
|
+
}) }));
|
|
36
|
+
}
|
|
37
|
+
/** A segmented single choice (radio semantics), styled like the pill tabs. */
|
|
38
|
+
export function Segmented({ options, value, onChange, label, className, style, }) {
|
|
39
|
+
const layoutId = useId();
|
|
40
|
+
const reduced = useReducedMotion();
|
|
41
|
+
return (_jsx("div", { className: className ? `docs-pills docs-segmented ${className}` : "docs-pills docs-segmented", style: style, role: "radiogroup", "aria-label": label, onKeyDown: (event) => rovingKeyDown(event, options.map((o) => o.id), value, onChange), children: options.map((option) => {
|
|
42
|
+
const selected = option.id === value;
|
|
43
|
+
return (_jsxs("button", { type: "button", role: "radio", "data-roving": "", "aria-checked": selected, "aria-label": option.ariaLabel, tabIndex: selected ? 0 : -1, className: "docs-pill", onClick: () => onChange(option.id), children: [selected ? (_jsx(motion.span, { layoutId: `seg-${layoutId}`, className: "docs-pill-indicator", transition: reduced ? { duration: 0 } : SPRING })) : null, _jsx("span", { className: "docs-pill-label", children: option.label })] }, option.id));
|
|
44
|
+
}) }));
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=controls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controls.js","sourceRoot":"","sources":["../../src/docs/controls.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Copies text, falling back to a selection copy where the Clipboard API is unavailable. */
|
|
2
|
+
export declare function copyText(text: string): Promise<void>;
|
|
3
|
+
/**
|
|
4
|
+
* Copies text that is still being produced. Hands the clipboard a pending
|
|
5
|
+
* ClipboardItem synchronously so Safari keeps the click's user activation.
|
|
6
|
+
*/
|
|
7
|
+
export declare function copyLazyText(produce: () => string | Promise<string>): Promise<void>;
|
|
8
|
+
/** `copied` flips true for a moment after `copy()`. */
|
|
9
|
+
export declare function useCopied(ms?: number): {
|
|
10
|
+
copied: boolean;
|
|
11
|
+
copy: (text: string | (() => string | Promise<string>)) => Promise<void>;
|
|
12
|
+
};
|
|
13
|
+
export declare function CopyIcon({ copied, size }: {
|
|
14
|
+
copied: boolean;
|
|
15
|
+
size?: number;
|
|
16
|
+
}): import("react").JSX.Element;
|
|
17
|
+
export interface CopyButtonProps {
|
|
18
|
+
text: string | (() => string | Promise<string>);
|
|
19
|
+
label?: string;
|
|
20
|
+
className?: string;
|
|
21
|
+
}
|
|
22
|
+
/** Icon button that copies `text` and swaps to a tick. */
|
|
23
|
+
export declare function CopyButton({ text, label, className }: CopyButtonProps): import("react").JSX.Element;
|
|
24
|
+
//# sourceMappingURL=copy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../src/docs/copy.tsx"],"names":[],"mappings":"AAGA,4FAA4F;AAC5F,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa1D;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAYzF;AAED,uDAAuD;AACvD,wBAAgB,SAAS,CAAC,EAAE,SAAO;;iBAIP,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;EAQpE;AAED,wBAAgB,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAS,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,+BAMjF;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,0DAA0D;AAC1D,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,KAAmB,EAAE,SAAS,EAAE,EAAE,eAAe,+BAcnF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import { Check, Copy } from "lucide-react";
|
|
4
|
+
/** Copies text, falling back to a selection copy where the Clipboard API is unavailable. */
|
|
5
|
+
export async function copyText(text) {
|
|
6
|
+
try {
|
|
7
|
+
await navigator.clipboard.writeText(text);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
const area = document.createElement("textarea");
|
|
11
|
+
area.value = text;
|
|
12
|
+
area.setAttribute("readonly", "");
|
|
13
|
+
area.style.cssText = "position:fixed;top:0;left:0;opacity:0";
|
|
14
|
+
document.body.appendChild(area);
|
|
15
|
+
area.select();
|
|
16
|
+
document.execCommand("copy");
|
|
17
|
+
area.remove();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Copies text that is still being produced. Hands the clipboard a pending
|
|
22
|
+
* ClipboardItem synchronously so Safari keeps the click's user activation.
|
|
23
|
+
*/
|
|
24
|
+
export async function copyLazyText(produce) {
|
|
25
|
+
const pending = Promise.resolve().then(produce);
|
|
26
|
+
if (typeof ClipboardItem !== "undefined" && navigator.clipboard?.write) {
|
|
27
|
+
try {
|
|
28
|
+
const blob = pending.then((text) => new Blob([text], { type: "text/plain" }));
|
|
29
|
+
await navigator.clipboard.write([new ClipboardItem({ "text/plain": blob })]);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// fall through to writeText / selection copy
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
await copyText(await pending);
|
|
37
|
+
}
|
|
38
|
+
/** `copied` flips true for a moment after `copy()`. */
|
|
39
|
+
export function useCopied(ms = 1600) {
|
|
40
|
+
const [copied, setCopied] = useState(false);
|
|
41
|
+
const timer = useRef(undefined);
|
|
42
|
+
useEffect(() => () => clearTimeout(timer.current), []);
|
|
43
|
+
const copy = async (text) => {
|
|
44
|
+
if (typeof text === "function")
|
|
45
|
+
await copyLazyText(text);
|
|
46
|
+
else
|
|
47
|
+
await copyText(text);
|
|
48
|
+
setCopied(true);
|
|
49
|
+
clearTimeout(timer.current);
|
|
50
|
+
timer.current = setTimeout(() => setCopied(false), ms);
|
|
51
|
+
};
|
|
52
|
+
return { copied, copy };
|
|
53
|
+
}
|
|
54
|
+
export function CopyIcon({ copied, size = 14 }) {
|
|
55
|
+
return copied ? (_jsx(Check, { className: "docs-copy-icon docs-copy-icon-done", width: size, height: size, strokeWidth: 2.4, "aria-hidden": "true" })) : (_jsx(Copy, { className: "docs-copy-icon", width: size, height: size, strokeWidth: 2, "aria-hidden": "true" }));
|
|
56
|
+
}
|
|
57
|
+
/** Icon button that copies `text` and swaps to a tick. */
|
|
58
|
+
export function CopyButton({ text, label = "Copy code", className }) {
|
|
59
|
+
const { copied, copy } = useCopied();
|
|
60
|
+
return (_jsx("button", { type: "button", className: className ? `docs-copy ${className}` : "docs-copy", onClick: () => void copy(text), "aria-label": copied ? "Copied" : label, title: copied ? "Copied" : label, "data-copied": copied || undefined, children: _jsx(CopyIcon, { copied: copied }) }));
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../src/docs/copy.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/docs/math.ts"],"names":[],"mappings":"AAGA,OAAO,0BAA0B,CAAA;AAEjC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMxD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/* KaTeX lives behind this module, which DocsRenderer loads with a dynamic import the
|
|
2
|
+
first time a page has a math block — pages without math never download KaTeX. */
|
|
3
|
+
import katex from "katex";
|
|
4
|
+
import "katex/dist/katex.min.css";
|
|
5
|
+
export function renderMathToHtml(formula) {
|
|
6
|
+
return katex.renderToString(formula, {
|
|
7
|
+
displayMode: true,
|
|
8
|
+
throwOnError: false,
|
|
9
|
+
output: "htmlAndMathml",
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=math.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/docs/math.ts"],"names":[],"mappings":"AAAA;mFACmF;AACnF,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,0BAA0B,CAAA;AAEjC,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE;QACnC,WAAW,EAAE,IAAI;QACjB,YAAY,EAAE,KAAK;QACnB,MAAM,EAAE,eAAe;KACxB,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import type { CitationDef, ReferenceNode } from "../gitbook/ast.js";
|
|
3
|
+
export interface CitationPreview {
|
|
4
|
+
title?: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
image?: string;
|
|
7
|
+
siteName?: string;
|
|
8
|
+
favicon?: string;
|
|
9
|
+
}
|
|
10
|
+
export type CitationPreviewResolver = (citation: ReferenceNode) => CitationPreview | null | Promise<CitationPreview | null>;
|
|
11
|
+
export interface DocstreamRefContextValue {
|
|
12
|
+
/** Called when a mention/tag chip (or a citation, if it has no url) is clicked. */
|
|
13
|
+
onReferenceClick?: (ref: ReferenceNode) => void;
|
|
14
|
+
/** Full override for chip rendering; return null to fall back to the default. */
|
|
15
|
+
renderReference?: (ref: ReferenceNode) => ReactNode | null;
|
|
16
|
+
/** Resolves Open Graph-style metadata when a linked citation is hovered or focused. */
|
|
17
|
+
resolveCitationPreview?: CitationPreviewResolver;
|
|
18
|
+
}
|
|
19
|
+
export declare const DocstreamRefContext: import("react").Context<DocstreamRefContextValue>;
|
|
20
|
+
export declare function InlineReference({ node }: {
|
|
21
|
+
node: ReferenceNode;
|
|
22
|
+
}): import("react").JSX.Element;
|
|
23
|
+
/** Row of source-domain pills for a document's citation definitions. */
|
|
24
|
+
export declare function CitationSources({ citations }: {
|
|
25
|
+
citations?: CitationDef[];
|
|
26
|
+
}): import("react").JSX.Element | null;
|
|
27
|
+
//# sourceMappingURL=reference.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference.d.ts","sourceRoot":"","sources":["../../src/docs/reference.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA8C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAGlF,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAEhE,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,MAAM,uBAAuB,GAAG,CAAC,QAAQ,EAAE,aAAa,KAAK,eAAe,GAAG,IAAI,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAA;AAE3H,MAAM,WAAW,wBAAwB;IACvC,mFAAmF;IACnF,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAA;IAC/C,iFAAiF;IACjF,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,SAAS,GAAG,IAAI,CAAA;IAC1D,uFAAuF;IACvF,sBAAsB,CAAC,EAAE,uBAAuB,CAAA;CACjD;AAED,eAAO,MAAM,mBAAmB,mDAA8C,CAAA;AAwE9E,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,+BA6BhE;AA8BD,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,WAAW,EAAE,CAAA;CAAE,sCAS3E"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useId, useState } from "react";
|
|
3
|
+
import { ArrowUpRight, AtSign, FolderGit2, Globe, Hash } from "lucide-react";
|
|
4
|
+
export const DocstreamRefContext = createContext({});
|
|
5
|
+
const previewCaches = new WeakMap();
|
|
6
|
+
function resolvePreview(resolver, citation) {
|
|
7
|
+
let cache = previewCaches.get(resolver);
|
|
8
|
+
if (!cache) {
|
|
9
|
+
cache = new Map();
|
|
10
|
+
previewCaches.set(resolver, cache);
|
|
11
|
+
}
|
|
12
|
+
const key = citation.url ?? citation.id;
|
|
13
|
+
let request = cache.get(key);
|
|
14
|
+
if (!request) {
|
|
15
|
+
request = Promise.resolve(resolver(citation)).catch(() => null);
|
|
16
|
+
cache.set(key, request);
|
|
17
|
+
}
|
|
18
|
+
return request;
|
|
19
|
+
}
|
|
20
|
+
function CitationHoverCard({ node }) {
|
|
21
|
+
const { onReferenceClick, resolveCitationPreview } = useContext(DocstreamRefContext);
|
|
22
|
+
const [preview, setPreview] = useState(null);
|
|
23
|
+
const [imageFailed, setImageFailed] = useState(false);
|
|
24
|
+
const [requested, setRequested] = useState(false);
|
|
25
|
+
const cardId = useId();
|
|
26
|
+
const host = node.url ? hostnameOf(node.url) : null;
|
|
27
|
+
const requestPreview = () => {
|
|
28
|
+
if (!resolveCitationPreview || requested)
|
|
29
|
+
return;
|
|
30
|
+
setRequested(true);
|
|
31
|
+
void resolvePreview(resolveCitationPreview, node).then((value) => setPreview(value));
|
|
32
|
+
};
|
|
33
|
+
const title = preview?.title ?? node.label ?? host ?? node.url;
|
|
34
|
+
const siteName = preview?.siteName ?? host;
|
|
35
|
+
const favicon = preview?.favicon ?? (host ? `https://www.google.com/s2/favicons?sz=32&domain=${host}` : undefined);
|
|
36
|
+
return (_jsxs("span", { className: "docs-cite-wrap", onMouseEnter: requestPreview, onFocus: requestPreview, children: [_jsx("a", { className: "docs-cite", href: node.url, target: "_blank", rel: "noreferrer", "aria-describedby": cardId, onClick: () => onReferenceClick?.(node), children: node.id }), _jsxs("span", { className: "docs-cite-card", id: cardId, role: "tooltip", children: [preview?.image && !imageFailed ? (_jsx("span", { className: "docs-cite-card-image-wrap", children: _jsx("img", { className: "docs-cite-card-image", src: preview.image, alt: "", onError: () => setImageFailed(true) }) })) : null, _jsxs("span", { className: "docs-cite-card-body", children: [_jsxs("span", { className: "docs-cite-card-source", children: [favicon ? _jsx("img", { className: "docs-cite-card-favicon", src: favicon, alt: "" }) : _jsx(Globe, { className: "docs-cite-card-favicon" }), _jsx("span", { children: siteName })] }), _jsx("span", { className: "docs-cite-card-title", children: title }), preview?.description ? _jsx("span", { className: "docs-cite-card-description", children: preview.description }) : null, _jsxs("span", { className: "docs-cite-card-url", children: [node.url, _jsx(ArrowUpRight, { "aria-hidden": "true" })] })] })] })] }));
|
|
37
|
+
}
|
|
38
|
+
export function InlineReference({ node }) {
|
|
39
|
+
const { onReferenceClick, renderReference } = useContext(DocstreamRefContext);
|
|
40
|
+
const custom = renderReference?.(node);
|
|
41
|
+
if (custom != null)
|
|
42
|
+
return _jsx(_Fragment, { children: custom });
|
|
43
|
+
if (node.kind === "citation") {
|
|
44
|
+
// Citations default to linking their source; hosts can still observe clicks.
|
|
45
|
+
if (node.url) {
|
|
46
|
+
return _jsx(CitationHoverCard, { node: node });
|
|
47
|
+
}
|
|
48
|
+
// Definition missing (not yet streamed, or standalone parseInline call).
|
|
49
|
+
return (_jsx("span", { className: "docs-cite", onClick: () => onReferenceClick?.(node), children: node.id }));
|
|
50
|
+
}
|
|
51
|
+
const Icon = node.kind === "mention" ? AtSign : node.kind === "codebase" ? FolderGit2 : Hash;
|
|
52
|
+
return (_jsxs("button", { type: "button", className: `docs-ref docs-ref-${node.kind}`, onClick: () => onReferenceClick?.(node), children: [_jsx(Icon, { className: "docs-ref-icon" }), node.id] }));
|
|
53
|
+
}
|
|
54
|
+
function hostnameOf(url) {
|
|
55
|
+
try {
|
|
56
|
+
return new URL(url).hostname.replace(/^www\./, "");
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function SourceChip({ def }) {
|
|
63
|
+
const [faviconFailed, setFaviconFailed] = useState(false);
|
|
64
|
+
const host = hostnameOf(def.url);
|
|
65
|
+
return (_jsxs("a", { className: "docs-source-chip", href: def.url, target: "_blank", rel: "noreferrer", title: def.label ?? def.url, children: [host && !faviconFailed ? (_jsx("img", { className: "docs-source-favicon", src: `https://www.google.com/s2/favicons?sz=32&domain=${host}`, alt: "", onError: () => setFaviconFailed(true) })) : (_jsx(Globe, { className: "docs-source-favicon" })), host ?? def.url] }));
|
|
66
|
+
}
|
|
67
|
+
/** Row of source-domain pills for a document's citation definitions. */
|
|
68
|
+
export function CitationSources({ citations }) {
|
|
69
|
+
if (!citations?.length)
|
|
70
|
+
return null;
|
|
71
|
+
return (_jsx("div", { className: "docs-sources", children: citations.map((def) => (_jsx(SourceChip, { def: def }, def.id))) }));
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=reference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference.js","sourceRoot":"","sources":["../../src/docs/reference.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function getSyncedTab(key: string): string | null;
|
|
2
|
+
export declare function setSyncedTab(key: string, title: string): void;
|
|
3
|
+
/** `[title, setTitle]` for a sync key; both are inert when `key` is undefined. */
|
|
4
|
+
export declare function useSyncedTab(key: string | undefined): [string | null, (title: string) => void];
|
|
5
|
+
//# sourceMappingURL=tabs-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs-sync.d.ts","sourceRoot":"","sources":["../../src/docs/tabs-sync.ts"],"names":[],"mappings":"AAiBA,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKvD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAQ7D;AAiBD,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,CAU9F"}
|