@windrun-huaiin/third-ui 26.0.0 → 28.0.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/dist/ai/ai-prompt-textarea.d.ts +72 -0
- package/dist/ai/ai-prompt-textarea.js +114 -0
- package/dist/ai/ai-prompt-textarea.mjs +112 -0
- package/dist/ai/index.d.ts +1 -0
- package/dist/ai/index.js +2 -0
- package/dist/ai/index.mjs +1 -0
- package/dist/clerk/clerk-provider-client.js +0 -1
- package/dist/clerk/clerk-provider-client.mjs +0 -1
- package/dist/clerk/fingerprint/fingerprint-client.js +0 -4
- package/dist/clerk/fingerprint/fingerprint-client.mjs +0 -4
- package/dist/clerk/fingerprint/use-fingerprint.js +0 -6
- package/dist/clerk/fingerprint/use-fingerprint.mjs +0 -6
- package/dist/clerk/signin-with-fingerprint-client.js +0 -9
- package/dist/clerk/signin-with-fingerprint-client.mjs +0 -9
- package/dist/clerk/signup-button-with-fingerprint-client.js +0 -16
- package/dist/clerk/signup-button-with-fingerprint-client.mjs +0 -16
- package/dist/clerk/signup-with-fingerprint-client.js +0 -9
- package/dist/clerk/signup-with-fingerprint-client.mjs +0 -9
- package/dist/fuma/base/custom-header.js +10 -8
- package/dist/fuma/base/custom-header.mjs +10 -8
- package/dist/fuma/base/custom-home-layout.d.ts +0 -4
- package/dist/fuma/base/docs-root-provider.d.ts +19 -0
- package/dist/fuma/base/docs-root-provider.js +17 -0
- package/dist/fuma/base/docs-root-provider.mjs +15 -0
- package/dist/fuma/base/index.d.ts +5 -0
- package/dist/fuma/base/index.js +16 -7
- package/dist/fuma/base/index.mjs +5 -1
- package/dist/fuma/base/nav-config.d.ts +10 -0
- package/dist/fuma/base/nav-config.js +32 -0
- package/dist/fuma/base/nav-config.mjs +28 -0
- package/dist/fuma/base/site-docs-layout.d.ts +11 -0
- package/dist/fuma/base/site-docs-layout.js +15 -0
- package/dist/fuma/base/site-docs-layout.mjs +13 -0
- package/dist/fuma/base/site-home-layout.d.ts +24 -0
- package/dist/fuma/base/site-home-layout.js +16 -0
- package/dist/fuma/base/site-home-layout.mjs +14 -0
- package/dist/fuma/base/site-layout-shared.d.ts +89 -0
- package/dist/fuma/base/site-layout-shared.js +48 -0
- package/dist/fuma/base/site-layout-shared.mjs +42 -0
- package/dist/fuma/base/site-layout.d.ts +4 -116
- package/dist/fuma/base/site-layout.js +2 -2
- package/dist/fuma/base/site-layout.mjs +2 -2
- package/dist/fuma/fuma-page-genarator.d.ts +1 -1
- package/dist/fuma/fuma-page-genarator.js +65 -10
- package/dist/fuma/fuma-page-genarator.mjs +61 -6
- package/dist/fuma/llm-copy-handler.js +0 -9
- package/dist/fuma/llm-copy-handler.mjs +0 -9
- package/dist/fuma/mdx/index.d.ts +0 -1
- package/dist/fuma/mdx/index.js +0 -2
- package/dist/fuma/mdx/index.mjs +0 -1
- package/dist/fuma/mdx/suno-embed.js +3 -1
- package/dist/fuma/mdx/suno-embed.mjs +3 -1
- package/dist/fuma/mdx/toc-base.js +0 -1
- package/dist/fuma/mdx/toc-base.mjs +0 -1
- package/dist/fuma/server/features/widgets.js +5 -1
- package/dist/fuma/server/features/widgets.mjs +5 -1
- package/dist/fuma/server/llm-copy-handler.d.ts +2 -0
- package/dist/fuma/server/llm-copy-handler.js +7 -0
- package/dist/fuma/server/llm-copy-handler.mjs +1 -0
- package/dist/fuma/server/page-generator.d.ts +2 -0
- package/dist/fuma/server/page-generator.js +7 -0
- package/dist/fuma/server/page-generator.mjs +1 -0
- package/dist/lib/seo-metadata.js +3 -3
- package/dist/lib/seo-metadata.mjs +1 -1
- package/dist/lib/seo-util.js +4 -4
- package/dist/lib/seo-util.mjs +1 -1
- package/dist/lib/site-docs-helper.d.ts +51 -0
- package/dist/lib/site-docs-helper.js +68 -0
- package/dist/lib/site-docs-helper.mjs +66 -0
- package/dist/main/alert-dialog/index.js +14 -0
- package/dist/main/alert-dialog/index.mjs +5 -0
- package/dist/main/buttons/gradient-button.d.ts +20 -0
- package/dist/main/buttons/gradient-button.js +88 -0
- package/dist/main/buttons/gradient-button.mjs +86 -0
- package/dist/main/buttons/index.d.ts +3 -0
- package/dist/main/buttons/index.js +12 -0
- package/dist/main/buttons/index.mjs +4 -0
- package/dist/main/buttons/x-button.d.ts +39 -0
- package/dist/main/buttons/x-button.js +92 -0
- package/dist/main/buttons/x-button.mjs +90 -0
- package/dist/main/buttons/x-toggle-button.d.ts +32 -0
- package/dist/main/buttons/x-toggle-button.js +95 -0
- package/dist/main/buttons/x-toggle-button.mjs +74 -0
- package/dist/main/credit/credit-nav-button.js +25 -1
- package/dist/main/credit/credit-nav-button.mjs +25 -1
- package/dist/main/credit/credit-overview-client.js +3 -2
- package/dist/main/credit/credit-overview-client.mjs +3 -2
- package/dist/main/credit/index.d.ts +4 -0
- package/dist/main/credit/index.js +10 -0
- package/dist/main/credit/index.mjs +3 -0
- package/dist/main/credit/server.d.ts +2 -0
- package/dist/main/credit/server.js +7 -0
- package/dist/main/credit/server.mjs +1 -0
- package/dist/main/cta.js +4 -2
- package/dist/main/cta.mjs +4 -2
- package/dist/main/footer.js +3 -3
- package/dist/main/footer.mjs +1 -1
- package/dist/main/hero/index.d.ts +2 -0
- package/dist/main/hero/index.js +10 -0
- package/dist/main/hero/index.mjs +3 -0
- package/dist/main/home/server.d.ts +7 -0
- package/dist/main/home/server.js +19 -0
- package/dist/main/home/server.mjs +7 -0
- package/dist/main/index.d.ts +0 -15
- package/dist/main/index.js +0 -43
- package/dist/main/index.mjs +0 -21
- package/dist/main/loading/index.d.ts +1 -0
- package/dist/main/loading/index.js +9 -0
- package/dist/main/loading/index.mjs +2 -0
- package/dist/main/loading-frame/index.d.ts +1 -0
- package/dist/main/loading-frame/index.js +9 -0
- package/dist/main/loading-frame/index.mjs +2 -0
- package/dist/main/money-price/index.d.ts +4 -0
- package/dist/main/money-price/index.js +15 -0
- package/dist/main/money-price/index.mjs +4 -0
- package/dist/main/money-price/money-price-button.d.ts +1 -1
- package/dist/main/money-price/money-price-button.js +12 -9
- package/dist/main/money-price/money-price-button.mjs +12 -9
- package/dist/main/money-price/money-price-interactive.d.ts +1 -1
- package/dist/main/money-price/money-price-interactive.js +22 -25
- package/dist/main/money-price/money-price-interactive.mjs +22 -25
- package/dist/main/money-price/money-price-types.d.ts +2 -0
- package/dist/main/money-price/server.d.ts +5 -0
- package/dist/main/money-price/server.js +18 -0
- package/dist/main/money-price/server.mjs +4 -0
- package/package.json +94 -4
- package/src/ai/index.ts +1 -0
- package/src/clerk/clerk-provider-client.tsx +1 -3
- package/src/clerk/fingerprint/fingerprint-client.ts +0 -4
- package/src/clerk/fingerprint/use-fingerprint.ts +0 -6
- package/src/clerk/signin-with-fingerprint-client.tsx +0 -10
- package/src/clerk/signup-button-with-fingerprint-client.tsx +0 -17
- package/src/clerk/signup-with-fingerprint-client.tsx +0 -10
- package/src/fuma/base/custom-header.tsx +12 -8
- package/src/fuma/base/custom-home-layout.tsx +3 -6
- package/src/fuma/base/docs-root-provider.tsx +58 -0
- package/src/fuma/base/index.ts +5 -0
- package/src/fuma/base/nav-config.ts +81 -0
- package/src/fuma/base/site-docs-layout.tsx +35 -0
- package/src/fuma/base/site-home-layout.tsx +78 -0
- package/src/fuma/base/site-layout-shared.tsx +190 -0
- package/src/fuma/base/site-layout.tsx +4 -289
- package/src/fuma/fuma-banner-suit.tsx +1 -1
- package/src/fuma/fuma-page-genarator.tsx +61 -8
- package/src/fuma/llm-copy-handler.ts +0 -11
- package/src/fuma/mdx/index.ts +0 -1
- package/src/fuma/mdx/suno-embed.tsx +1 -1
- package/src/fuma/mdx/toc-base.tsx +0 -1
- package/src/fuma/mdx/toc-footer-wrapper.tsx +2 -2
- package/src/fuma/server/features/widgets.tsx +1 -1
- package/src/fuma/server/llm-copy-handler.ts +2 -0
- package/src/fuma/server/page-generator.ts +2 -0
- package/src/lib/seo-metadata.ts +1 -1
- package/src/lib/seo-util.ts +2 -2
- package/src/lib/server.ts +1 -1
- package/src/{fuma/mdx → main/buttons}/gradient-button.tsx +10 -21
- package/src/main/buttons/index.ts +5 -0
- package/src/main/{x-button.tsx → buttons/x-button.tsx} +28 -42
- package/src/main/credit/credit-nav-button.tsx +36 -3
- package/src/main/credit/credit-overview-client.tsx +1 -1
- package/src/main/credit/index.ts +11 -0
- package/src/main/credit/server.ts +7 -0
- package/src/main/cta.tsx +1 -1
- package/src/main/footer.tsx +1 -2
- package/src/main/hero/index.ts +4 -0
- package/src/main/home/server.ts +7 -0
- package/src/main/index.ts +1 -20
- package/src/main/language-detector.tsx +0 -1
- package/src/main/loading/index.ts +3 -0
- package/src/main/loading-frame/index.ts +3 -0
- package/src/main/money-price/index.ts +18 -0
- package/src/main/money-price/money-price-button.tsx +17 -9
- package/src/main/money-price/money-price-interactive.tsx +30 -25
- package/src/main/money-price/money-price-types.ts +2 -0
- package/src/main/money-price/server.ts +22 -0
- package/dist/fuma/mdx/features.d.ts +0 -8
- package/dist/fuma/mdx/features.js +0 -92
- package/dist/fuma/mdx/features.mjs +0 -85
- package/dist/fuma/mdx/image-grid.d.ts +0 -6
- package/dist/fuma/mdx/image-grid.js +0 -17
- package/dist/fuma/mdx/image-grid.mjs +0 -15
- package/dist/fuma/mdx/image-zoom.d.ts +0 -22
- package/dist/fuma/mdx/image-zoom.js +0 -39
- package/dist/fuma/mdx/image-zoom.mjs +0 -37
- package/dist/fuma/mdx/markdown-component-map.d.ts +0 -3
- package/dist/fuma/mdx/markdown-component-map.js +0 -79
- package/dist/fuma/mdx/markdown-component-map.mjs +0 -77
- package/dist/fuma/mdx/math.d.ts +0 -17
- package/dist/fuma/mdx/math.js +0 -60
- package/dist/fuma/mdx/math.mjs +0 -57
- package/dist/fuma/mdx/mermaid.d.ts +0 -13
- package/dist/fuma/mdx/mermaid.js +0 -360
- package/dist/fuma/mdx/mermaid.mjs +0 -358
- package/dist/fuma/mdx/site-mdx-components.d.ts +0 -13
- package/dist/fuma/mdx/site-mdx-components.js +0 -19
- package/dist/fuma/mdx/site-mdx-components.mjs +0 -17
- package/dist/fuma/mdx/site-mdx-presets.d.ts +0 -13
- package/dist/fuma/mdx/site-mdx-presets.js +0 -49
- package/dist/fuma/mdx/site-mdx-presets.mjs +0 -45
- package/dist/fuma/server/optional-features.d.ts +0 -6
- package/dist/fuma/server/optional-features.js +0 -17
- package/dist/fuma/server/optional-features.mjs +0 -6
- package/dist/fuma/server/site-mdx-components.d.ts +0 -13
- package/dist/fuma/server/site-mdx-components.js +0 -18
- package/dist/fuma/server/site-mdx-components.mjs +0 -16
- package/dist/fuma/server/site-mdx-presets.d.ts +0 -195
- package/dist/fuma/server/site-mdx-presets.js +0 -55
- package/dist/fuma/server/site-mdx-presets.mjs +0 -52
- /package/src/{main → ai}/ai-prompt-textarea.tsx +0 -0
- /package/src/main/{x-toggle-button.tsx → buttons/x-toggle-button.tsx} +0 -0
|
@@ -1,358 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { __awaiter } from 'tslib';
|
|
3
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
|
-
import { MmdIcon, RefreshCcwIcon, DownloadIcon, XIcon } from '@windrun-huaiin/base-ui/icons';
|
|
5
|
-
import { cn } from '@windrun-huaiin/lib/utils';
|
|
6
|
-
import { useTheme } from 'next-themes';
|
|
7
|
-
import rough from 'roughjs';
|
|
8
|
-
import { useId, useState, useRef, useEffect, useCallback } from 'react';
|
|
9
|
-
import { themeSvgIconColor, themeIconColor } from '@windrun-huaiin/base-ui/lib';
|
|
10
|
-
|
|
11
|
-
function sanitizeFilename(name) {
|
|
12
|
-
return name
|
|
13
|
-
.replace(/[\/:*?"<>|]/g, '_')
|
|
14
|
-
.replace(/\s+/g, '_')
|
|
15
|
-
.slice(0, 120);
|
|
16
|
-
}
|
|
17
|
-
function Mermaid({ chart, title, watermarkEnabled, watermarkText, handDrawn = true, enablePreview = true }) {
|
|
18
|
-
const id = useId();
|
|
19
|
-
const [svg, setSvg] = useState('');
|
|
20
|
-
const { resolvedTheme } = useTheme();
|
|
21
|
-
const [open, setOpen] = useState(false);
|
|
22
|
-
// zoom & pan states for preview dialog
|
|
23
|
-
const [scale, setScale] = useState(1);
|
|
24
|
-
const [translate, setTranslate] = useState({ x: 0, y: 0 });
|
|
25
|
-
const isPanningRef = useRef(false);
|
|
26
|
-
const startPointRef = useRef({ x: 0, y: 0 });
|
|
27
|
-
const startTranslateRef = useRef({ x: 0, y: 0 });
|
|
28
|
-
const activePointersRef = useRef(new Map());
|
|
29
|
-
const pinchStartDistanceRef = useRef(0);
|
|
30
|
-
const pinchStartScaleRef = useRef(1);
|
|
31
|
-
useEffect(() => {
|
|
32
|
-
let isMounted = true;
|
|
33
|
-
void renderChart();
|
|
34
|
-
function renderChart() {
|
|
35
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
36
|
-
const mermaidConfig = {
|
|
37
|
-
startOnLoad: false,
|
|
38
|
-
securityLevel: 'loose',
|
|
39
|
-
fontFamily: 'inherit',
|
|
40
|
-
themeCSS: 'margin: 1.5rem auto 0;',
|
|
41
|
-
theme: resolvedTheme === 'dark' ? 'dark' : 'default',
|
|
42
|
-
};
|
|
43
|
-
const { default: mermaid } = yield import('mermaid');
|
|
44
|
-
try {
|
|
45
|
-
mermaid.initialize(mermaidConfig);
|
|
46
|
-
const { svg } = yield mermaid.render(id.replaceAll(':', ''), chart.replaceAll('\\n', '\n'));
|
|
47
|
-
let svgWithWatermark = handDrawn ? applyHandDrawnStyle(svg) : svg;
|
|
48
|
-
if (watermarkEnabled && watermarkText) {
|
|
49
|
-
svgWithWatermark = addWatermarkToSvg(svgWithWatermark, watermarkText, themeSvgIconColor);
|
|
50
|
-
}
|
|
51
|
-
if (isMounted)
|
|
52
|
-
setSvg(svgWithWatermark);
|
|
53
|
-
}
|
|
54
|
-
catch (error) {
|
|
55
|
-
console.error('Error while rendering mermaid', error);
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
return () => {
|
|
60
|
-
isMounted = false;
|
|
61
|
-
setSvg('');
|
|
62
|
-
};
|
|
63
|
-
}, [chart, id, resolvedTheme, watermarkEnabled, watermarkText, handDrawn]);
|
|
64
|
-
// helpers for preview zoom
|
|
65
|
-
const clamp = (v, min, max) => Math.min(Math.max(v, min), max);
|
|
66
|
-
const resetTransform = useCallback(() => {
|
|
67
|
-
setScale(4); // 400%
|
|
68
|
-
setTranslate({ x: 0, y: 0 });
|
|
69
|
-
}, []);
|
|
70
|
-
const zoomBy = useCallback((delta) => {
|
|
71
|
-
// zoom by center: keep the zoom center at the center of the canvas, without introducing displacement
|
|
72
|
-
setScale((prev) => clamp(prev + delta, 0.25, 10));
|
|
73
|
-
}, []);
|
|
74
|
-
const onWheel = useCallback((e) => {
|
|
75
|
-
// Cmd/Ctrl + wheel zoom (around the center point), otherwise up and down panning
|
|
76
|
-
if (e.metaKey || e.ctrlKey) {
|
|
77
|
-
e.preventDefault();
|
|
78
|
-
e.stopPropagation();
|
|
79
|
-
const delta = e.deltaY > 0 ? -0.1 : 0.1;
|
|
80
|
-
setScale((prev) => clamp(prev + delta, 0.25, 10));
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
// two-finger pan on touchpad: support both horizontal (deltaX) and vertical (deltaY)
|
|
84
|
-
e.preventDefault();
|
|
85
|
-
e.stopPropagation();
|
|
86
|
-
setTranslate((prev) => ({ x: prev.x - e.deltaX, y: prev.y - e.deltaY }));
|
|
87
|
-
}
|
|
88
|
-
}, []);
|
|
89
|
-
const onPointerDown = useCallback((e) => {
|
|
90
|
-
activePointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });
|
|
91
|
-
if (activePointersRef.current.size === 2) {
|
|
92
|
-
const [first, second] = Array.from(activePointersRef.current.values());
|
|
93
|
-
pinchStartDistanceRef.current = Math.hypot(second.x - first.x, second.y - first.y);
|
|
94
|
-
pinchStartScaleRef.current = scale;
|
|
95
|
-
isPanningRef.current = false;
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
isPanningRef.current = true;
|
|
99
|
-
startPointRef.current = { x: e.clientX, y: e.clientY };
|
|
100
|
-
startTranslateRef.current = Object.assign({}, translate);
|
|
101
|
-
}
|
|
102
|
-
e.currentTarget.setPointerCapture(e.pointerId);
|
|
103
|
-
}, [scale, translate]);
|
|
104
|
-
const onPointerMove = useCallback((e) => {
|
|
105
|
-
if (!activePointersRef.current.has(e.pointerId))
|
|
106
|
-
return;
|
|
107
|
-
activePointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });
|
|
108
|
-
if (activePointersRef.current.size === 2) {
|
|
109
|
-
const [first, second] = Array.from(activePointersRef.current.values());
|
|
110
|
-
const distance = Math.hypot(second.x - first.x, second.y - first.y);
|
|
111
|
-
if (pinchStartDistanceRef.current > 0) {
|
|
112
|
-
setScale(clamp((distance / pinchStartDistanceRef.current) * pinchStartScaleRef.current, 0.25, 10));
|
|
113
|
-
}
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
if (!isPanningRef.current)
|
|
117
|
-
return;
|
|
118
|
-
const dx = e.clientX - startPointRef.current.x;
|
|
119
|
-
const dy = e.clientY - startPointRef.current.y;
|
|
120
|
-
setTranslate({ x: startTranslateRef.current.x + dx, y: startTranslateRef.current.y + dy });
|
|
121
|
-
}, []);
|
|
122
|
-
const onPointerUp = useCallback((e) => {
|
|
123
|
-
activePointersRef.current.delete(e.pointerId);
|
|
124
|
-
isPanningRef.current = false;
|
|
125
|
-
if (activePointersRef.current.size === 1) {
|
|
126
|
-
const remaining = Array.from(activePointersRef.current.values())[0];
|
|
127
|
-
startPointRef.current = remaining;
|
|
128
|
-
startTranslateRef.current = Object.assign({}, translate);
|
|
129
|
-
isPanningRef.current = true;
|
|
130
|
-
}
|
|
131
|
-
if (e.currentTarget.hasPointerCapture(e.pointerId)) {
|
|
132
|
-
e.currentTarget.releasePointerCapture(e.pointerId);
|
|
133
|
-
}
|
|
134
|
-
}, [translate]);
|
|
135
|
-
const onPointerCancel = useCallback((e) => {
|
|
136
|
-
activePointersRef.current.delete(e.pointerId);
|
|
137
|
-
isPanningRef.current = false;
|
|
138
|
-
if (e.currentTarget.hasPointerCapture(e.pointerId)) {
|
|
139
|
-
e.currentTarget.releasePointerCapture(e.pointerId);
|
|
140
|
-
}
|
|
141
|
-
}, []);
|
|
142
|
-
const handleDownload = useCallback(() => {
|
|
143
|
-
if (!svg)
|
|
144
|
-
return;
|
|
145
|
-
const fileName = `${sanitizeFilename(title !== null && title !== void 0 ? title : 'mermaid')}.svg`;
|
|
146
|
-
const blob = new Blob([svg], { type: 'image/svg+xml;charset=utf-8' });
|
|
147
|
-
const url = URL.createObjectURL(blob);
|
|
148
|
-
const a = document.createElement('a');
|
|
149
|
-
a.href = url;
|
|
150
|
-
a.download = fileName;
|
|
151
|
-
document.body.appendChild(a);
|
|
152
|
-
a.click();
|
|
153
|
-
a.remove();
|
|
154
|
-
URL.revokeObjectURL(url);
|
|
155
|
-
}, [svg, title]);
|
|
156
|
-
// prevent browser-level zoom (touchpad pinch/shortcut) from taking effect when the dialog is open
|
|
157
|
-
useEffect(() => {
|
|
158
|
-
if (!open)
|
|
159
|
-
return;
|
|
160
|
-
// 初次打开时,默认放大到 400%
|
|
161
|
-
resetTransform();
|
|
162
|
-
const onGlobalWheel = (ev) => {
|
|
163
|
-
if (ev.ctrlKey || ev.metaKey) {
|
|
164
|
-
ev.preventDefault();
|
|
165
|
-
}
|
|
166
|
-
};
|
|
167
|
-
const onKeyDown = (ev) => {
|
|
168
|
-
if (!(ev.ctrlKey || ev.metaKey))
|
|
169
|
-
return;
|
|
170
|
-
const k = ev.key;
|
|
171
|
-
if (k === '=' || k === '+') {
|
|
172
|
-
ev.preventDefault();
|
|
173
|
-
setScale((prev) => clamp(prev + 0.2, 0.25, 10));
|
|
174
|
-
}
|
|
175
|
-
else if (k === '-') {
|
|
176
|
-
ev.preventDefault();
|
|
177
|
-
setScale((prev) => clamp(prev - 0.2, 0.25, 10));
|
|
178
|
-
}
|
|
179
|
-
else if (k === '0') {
|
|
180
|
-
ev.preventDefault();
|
|
181
|
-
resetTransform();
|
|
182
|
-
}
|
|
183
|
-
};
|
|
184
|
-
window.addEventListener('wheel', onGlobalWheel, { passive: false, capture: true });
|
|
185
|
-
window.addEventListener('keydown', onKeyDown, { capture: true });
|
|
186
|
-
return () => {
|
|
187
|
-
window.removeEventListener('wheel', onGlobalWheel, true);
|
|
188
|
-
window.removeEventListener('keydown', onKeyDown, true);
|
|
189
|
-
};
|
|
190
|
-
}, [open, resetTransform]);
|
|
191
|
-
// Lock background scroll when dialog is open
|
|
192
|
-
useEffect(() => {
|
|
193
|
-
if (!open)
|
|
194
|
-
return;
|
|
195
|
-
const previousPosition = document.body.style.position;
|
|
196
|
-
const previousTop = document.body.style.top;
|
|
197
|
-
const previousLeft = document.body.style.left;
|
|
198
|
-
const previousRight = document.body.style.right;
|
|
199
|
-
const previousWidth = document.body.style.width;
|
|
200
|
-
const scrollY = window.scrollY;
|
|
201
|
-
document.body.style.position = 'fixed';
|
|
202
|
-
document.body.style.top = `-${scrollY}px`;
|
|
203
|
-
document.body.style.left = '0';
|
|
204
|
-
document.body.style.right = '0';
|
|
205
|
-
document.body.style.width = '100%';
|
|
206
|
-
return () => {
|
|
207
|
-
document.body.style.position = previousPosition;
|
|
208
|
-
document.body.style.top = previousTop;
|
|
209
|
-
document.body.style.left = previousLeft;
|
|
210
|
-
document.body.style.right = previousRight;
|
|
211
|
-
document.body.style.width = previousWidth;
|
|
212
|
-
window.scrollTo(0, scrollY);
|
|
213
|
-
};
|
|
214
|
-
}, [open]);
|
|
215
|
-
return (jsxs("div", { children: [jsxs("div", { className: enablePreview ? 'group relative cursor-zoom-in' : undefined, onClick: () => enablePreview && svg && setOpen(true), children: [jsx("div", { dangerouslySetInnerHTML: { __html: svg } }), enablePreview && svg && (jsx("div", { className: "pointer-events-none absolute right-2 top-2 hidden rounded bg-black/50 px-2 py-0.5 text-[12px] text-white group-hover:block", children: "Preview Chart" }))] }), title && (jsxs("div", { className: cn("mt-2 flex items-center justify-center text-center text-[13px] font-italic", themeIconColor), children: [jsx(MmdIcon, { className: 'mr-1 h-4 w-4' }), jsx("span", { children: title })] })), enablePreview && open && (jsxs("div", { role: "dialog", "aria-modal": "true", "aria-label": typeof title === 'string' ? title : 'Mermaid Preview', className: "fixed inset-0 z-9999 flex items-center justify-center", children: [jsx("div", { className: "absolute inset-0 bg-black/60", onClick: () => { setOpen(false); resetTransform(); }, onWheel: (e) => { e.preventDefault(); e.stopPropagation(); }, onTouchMove: (e) => { e.preventDefault(); e.stopPropagation(); } }), jsxs("div", { className: "relative z-1 max-w-[95vw] w-[95vw] h-[88vh] p-0 bg-white dark:bg-neutral-900 border border-neutral-200 dark:border-neutral-700 rounded-md shadow-2xl overflow-hidden", children: [jsxs("div", { className: "flex items-center justify-between gap-3 px-3 py-2 border-b border-neutral-200 dark:border-neutral-700", children: [jsxs("div", { className: cn("min-w-0 flex items-center gap-2 text-sm", themeIconColor), children: [jsx(MmdIcon, { className: "h-4 w-4" }), jsx("span", { className: "truncate max-w-[50vw]", children: title !== null && title !== void 0 ? title : 'Mermaid Preview' })] }), jsxs("div", { className: "flex shrink-0 items-center gap-0.5", children: [jsx("button", { "aria-label": "Zoom out", className: "hidden h-6 w-6 items-center justify-center rounded border border-neutral-300 text-[13px] transition-colors hover:bg-neutral-100 active:bg-neutral-200 hover:border-neutral-400 active:border-neutral-500 dark:border-neutral-600 dark:hover:bg-neutral-700 dark:active:bg-neutral-600 dark:hover:border-neutral-500 dark:active:border-neutral-400 sm:flex", onClick: () => zoomBy(-0.5), children: "\uFF0D" }), jsxs("span", { className: "mx-0.5 w-12 text-center text-[12px] select-none", children: [Math.round(scale * 100), "%"] }), jsx("button", { "aria-label": "Zoom in", className: "hidden h-6 w-6 items-center justify-center rounded border border-neutral-300 text-[13px] transition-colors hover:bg-neutral-100 active:bg-neutral-200 hover:border-neutral-400 active:border-neutral-500 dark:border-neutral-600 dark:hover:bg-neutral-700 dark:active:bg-neutral-600 dark:hover:border-neutral-500 dark:active:border-neutral-400 sm:flex", onClick: () => zoomBy(0.5), children: "\uFF0B" }), jsx("div", { className: "mx-1 hidden h-4 w-px bg-neutral-300 dark:bg-neutral-700 sm:block" }), jsx("button", { "aria-label": "Zoom 100%", className: "hidden h-6 min-w-8 items-center justify-center rounded border border-neutral-300 px-1.5 text-[12px] transition-colors hover:bg-neutral-100 active:bg-neutral-200 hover:border-neutral-400 active:border-neutral-500 dark:border-neutral-600 dark:hover:bg-neutral-700 dark:active:bg-neutral-600 dark:hover:border-neutral-500 dark:active:border-neutral-400 sm:inline-flex", onClick: () => setScale(1), children: "X1" }), jsx("button", { "aria-label": "Zoom 200%", className: "ml-1 hidden h-6 min-w-8 items-center justify-center rounded border border-neutral-300 px-1.5 text-[12px] transition-colors hover:bg-neutral-100 active:bg-neutral-200 hover:border-neutral-400 active:border-neutral-500 dark:border-neutral-600 dark:hover:bg-neutral-700 dark:active:bg-neutral-600 dark:hover:border-neutral-500 dark:active:border-neutral-400 sm:inline-flex", onClick: () => setScale(2), children: "X2" }), jsx("button", { "aria-label": "Zoom 300%", className: "ml-1 hidden h-6 min-w-8 items-center justify-center rounded border border-neutral-300 px-1.5 text-[12px] transition-colors hover:bg-neutral-100 active:bg-neutral-200 hover:border-neutral-400 active:border-neutral-500 dark:border-neutral-600 dark:hover:bg-neutral-700 dark:active:bg-neutral-600 dark:hover:border-neutral-500 dark:active:border-neutral-400 sm:inline-flex", onClick: () => setScale(3), children: "X3" }), jsx("button", { "aria-label": "Zoom 1000%", className: "ml-1 hidden h-6 min-w-10 items-center justify-center rounded border border-neutral-300 px-1.5 text-[12px] transition-colors hover:bg-neutral-100 active:bg-neutral-200 hover:border-neutral-400 active:border-neutral-500 dark:border-neutral-600 dark:hover:bg-neutral-700 dark:active:bg-neutral-600 dark:hover:border-neutral-500 dark:active:border-neutral-400 sm:inline-flex", onClick: () => setScale(10), children: "X10" }), jsx("button", { "aria-label": "Reset", className: cn("ml-1 flex h-6 w-6 items-center justify-center rounded transition-colors hover:bg-neutral-100 active:bg-neutral-200 dark:hover:bg-neutral-700 dark:active:bg-neutral-600", themeIconColor), onClick: resetTransform, children: jsx(RefreshCcwIcon, { className: "h-3.5 w-3.5" }) }), jsx("button", { "aria-label": "Download SVG", className: cn("ml-1 flex h-6 w-6 items-center justify-center rounded transition-colors hover:bg-neutral-100 active:bg-neutral-200 dark:hover:bg-neutral-700 dark:active:bg-neutral-600", themeIconColor), onClick: handleDownload, children: jsx(DownloadIcon, { className: "h-3.5 w-3.5" }) }), jsx("button", { "aria-label": "Close", className: cn("ml-1 flex h-6 w-6 items-center justify-center rounded transition-colors hover:bg-neutral-100 active:bg-neutral-200 dark:hover:bg-neutral-700 dark:active:bg-neutral-600", themeIconColor), onClick: () => { setOpen(false); resetTransform(); }, children: jsx(XIcon, { className: "h-3.5 w-3.5" }) })] })] }), jsxs("div", { className: "relative h-[calc(88vh-40px)] w-full overflow-hidden bg-white dark:bg-neutral-900 overscroll-contain touch-none", onWheel: onWheel, onPointerDown: onPointerDown, onPointerMove: onPointerMove, onPointerUp: onPointerUp, onPointerCancel: onPointerCancel, children: [jsx("div", { className: "absolute left-1/2 top-1/2", style: { transform: `translate(-50%, -50%) translate(${translate.x}px, ${translate.y}px)` }, children: jsx("div", { style: { transform: `scale(${scale})`, transformOrigin: '50% 50%' }, dangerouslySetInnerHTML: { __html: svg } }) }), jsxs("div", { className: "absolute inset-x-3 bottom-3 rounded-md bg-white/92 px-3 py-2 shadow-sm backdrop-blur sm:hidden dark:bg-neutral-900/92", children: [jsxs("label", { className: "mb-1 flex items-center justify-between text-[11px] text-neutral-600 dark:text-neutral-300", children: [jsx("span", { children: "Zoom" }), jsxs("span", { children: [Math.round(scale * 100), "%"] })] }), jsx("input", { "aria-label": "Zoom slider", className: "block w-full", type: "range", min: "25", max: "1000", step: "5", value: Math.round(scale * 100), style: { accentColor: themeSvgIconColor }, onChange: (e) => setScale(clamp(Number(e.target.value) / 100, 0.25, 10)) })] }), jsx("div", { className: "pointer-events-none absolute bottom-2 right-3 hidden rounded bg-black/40 px-2 py-1 text-xs text-white sm:block", children: "Drag to pan, click button to zoom-out or zoom-in" }), jsx("div", { className: "pointer-events-none absolute left-3 top-3 rounded bg-black/40 px-2 py-1 text-[11px] text-white sm:hidden", children: "Drag to pan, pinch to zoom-out or zoom-in" })] })] })] }))] }));
|
|
216
|
-
}
|
|
217
|
-
function addWatermarkToSvg(svg, watermark, watermarkColor) {
|
|
218
|
-
const watermarkText = `
|
|
219
|
-
<text
|
|
220
|
-
x="100%"
|
|
221
|
-
y="98%"
|
|
222
|
-
text-anchor="end"
|
|
223
|
-
font-size="12"
|
|
224
|
-
font-style="italic"
|
|
225
|
-
fill="${watermarkColor}"
|
|
226
|
-
opacity="0.40"
|
|
227
|
-
class="pointer-events-none"
|
|
228
|
-
dx="-8"
|
|
229
|
-
dy="-4"
|
|
230
|
-
>${watermark}</text>
|
|
231
|
-
`;
|
|
232
|
-
return svg.replace('</svg>', `${watermarkText}</svg>`);
|
|
233
|
-
}
|
|
234
|
-
function applyHandDrawnStyle(svg) {
|
|
235
|
-
if (typeof window === 'undefined')
|
|
236
|
-
return svg;
|
|
237
|
-
try {
|
|
238
|
-
const parser = new DOMParser();
|
|
239
|
-
const doc = parser.parseFromString(svg, 'image/svg+xml');
|
|
240
|
-
const svgElement = doc.documentElement;
|
|
241
|
-
if (!svgElement || svgElement.tagName.toLowerCase() !== 'svg')
|
|
242
|
-
return svg;
|
|
243
|
-
const rc = rough.svg(svgElement);
|
|
244
|
-
const serializer = new XMLSerializer();
|
|
245
|
-
const getNumber = (value) => Number.parseFloat(value !== null && value !== void 0 ? value : '') || 0;
|
|
246
|
-
const getStyleValue = (element, name) => {
|
|
247
|
-
const inlineStyle = element.getAttribute('style');
|
|
248
|
-
if (inlineStyle) {
|
|
249
|
-
const match = inlineStyle.match(new RegExp(`(?:^|;)\\s*${name}\\s*:\\s*([^;]+)`));
|
|
250
|
-
if (match === null || match === void 0 ? void 0 : match[1])
|
|
251
|
-
return match[1].trim();
|
|
252
|
-
}
|
|
253
|
-
return element.getAttribute(name);
|
|
254
|
-
};
|
|
255
|
-
const applyAttributes = (source, target) => {
|
|
256
|
-
var _a;
|
|
257
|
-
for (const attr of source.getAttributeNames()) {
|
|
258
|
-
if (attr === 'x' || attr === 'y' || attr === 'x1' || attr === 'y1' || attr === 'x2' || attr === 'y2' || attr === 'width' || attr === 'height' || attr === 'rx' || attr === 'ry' || attr === 'points' || attr === 'd')
|
|
259
|
-
continue;
|
|
260
|
-
target.setAttribute(attr, (_a = source.getAttribute(attr)) !== null && _a !== void 0 ? _a : '');
|
|
261
|
-
}
|
|
262
|
-
};
|
|
263
|
-
const createOptions = (element) => {
|
|
264
|
-
var _a, _b;
|
|
265
|
-
const stroke = (_a = getStyleValue(element, 'stroke')) !== null && _a !== void 0 ? _a : '#000';
|
|
266
|
-
const fill = (_b = getStyleValue(element, 'fill')) !== null && _b !== void 0 ? _b : 'none';
|
|
267
|
-
const strokeWidth = getNumber(getStyleValue(element, 'stroke-width')) || 1.5;
|
|
268
|
-
return {
|
|
269
|
-
stroke,
|
|
270
|
-
fill: fill === 'none' ? undefined : fill,
|
|
271
|
-
strokeWidth,
|
|
272
|
-
roughness: 1.6,
|
|
273
|
-
bowing: 1.25,
|
|
274
|
-
fillStyle: fill === 'none' ? 'hachure' : 'solid',
|
|
275
|
-
fillWeight: 0.8,
|
|
276
|
-
hachureGap: 10,
|
|
277
|
-
preserveVertices: true,
|
|
278
|
-
seed: 7,
|
|
279
|
-
};
|
|
280
|
-
};
|
|
281
|
-
const replaceShape = (element, node) => {
|
|
282
|
-
var _a, _b;
|
|
283
|
-
if (!node || !element.parentNode)
|
|
284
|
-
return;
|
|
285
|
-
applyAttributes(element, node);
|
|
286
|
-
if (element.getAttribute('class')) {
|
|
287
|
-
node.setAttribute('class', (_a = element.getAttribute('class')) !== null && _a !== void 0 ? _a : '');
|
|
288
|
-
}
|
|
289
|
-
if (element.getAttribute('style')) {
|
|
290
|
-
node.setAttribute('style', (_b = element.getAttribute('style')) !== null && _b !== void 0 ? _b : '');
|
|
291
|
-
}
|
|
292
|
-
element.parentNode.replaceChild(node, element);
|
|
293
|
-
};
|
|
294
|
-
svgElement.querySelectorAll('rect').forEach((element) => {
|
|
295
|
-
const x = getNumber(element.getAttribute('x'));
|
|
296
|
-
const y = getNumber(element.getAttribute('y'));
|
|
297
|
-
const width = getNumber(element.getAttribute('width'));
|
|
298
|
-
const height = getNumber(element.getAttribute('height'));
|
|
299
|
-
const rx = getNumber(element.getAttribute('rx'));
|
|
300
|
-
const ry = getNumber(element.getAttribute('ry'));
|
|
301
|
-
const node = rx > 0 || ry > 0
|
|
302
|
-
? rc.path(`M ${x + rx} ${y}
|
|
303
|
-
H ${x + width - rx}
|
|
304
|
-
Q ${x + width} ${y} ${x + width} ${y + ry}
|
|
305
|
-
V ${y + height - ry}
|
|
306
|
-
Q ${x + width} ${y + height} ${x + width - rx} ${y + height}
|
|
307
|
-
H ${x + rx}
|
|
308
|
-
Q ${x} ${y + height} ${x} ${y + height - ry}
|
|
309
|
-
V ${y + ry}
|
|
310
|
-
Q ${x} ${y} ${x + rx} ${y}
|
|
311
|
-
Z`, createOptions(element))
|
|
312
|
-
: rc.rectangle(x, y, width, height, createOptions(element));
|
|
313
|
-
replaceShape(element, node);
|
|
314
|
-
});
|
|
315
|
-
svgElement.querySelectorAll('line').forEach((element) => {
|
|
316
|
-
const node = rc.line(getNumber(element.getAttribute('x1')), getNumber(element.getAttribute('y1')), getNumber(element.getAttribute('x2')), getNumber(element.getAttribute('y2')), createOptions(element));
|
|
317
|
-
replaceShape(element, node);
|
|
318
|
-
});
|
|
319
|
-
svgElement.querySelectorAll('polyline').forEach((element) => {
|
|
320
|
-
var _a;
|
|
321
|
-
const points = ((_a = element.getAttribute('points')) !== null && _a !== void 0 ? _a : '')
|
|
322
|
-
.trim()
|
|
323
|
-
.split(/\s+/)
|
|
324
|
-
.map((pair) => pair.split(',').map(Number))
|
|
325
|
-
.filter((point) => point.length === 2 && Number.isFinite(point[0]) && Number.isFinite(point[1]));
|
|
326
|
-
if (points.length < 2)
|
|
327
|
-
return;
|
|
328
|
-
const node = rc.linearPath(points, createOptions(element));
|
|
329
|
-
replaceShape(element, node);
|
|
330
|
-
});
|
|
331
|
-
svgElement.querySelectorAll('polygon').forEach((element) => {
|
|
332
|
-
var _a;
|
|
333
|
-
const points = ((_a = element.getAttribute('points')) !== null && _a !== void 0 ? _a : '')
|
|
334
|
-
.trim()
|
|
335
|
-
.split(/\s+/)
|
|
336
|
-
.map((pair) => pair.split(',').map(Number))
|
|
337
|
-
.filter((point) => point.length === 2 && Number.isFinite(point[0]) && Number.isFinite(point[1]));
|
|
338
|
-
if (points.length < 2)
|
|
339
|
-
return;
|
|
340
|
-
const node = rc.polygon(points, createOptions(element));
|
|
341
|
-
replaceShape(element, node);
|
|
342
|
-
});
|
|
343
|
-
svgElement.querySelectorAll('path').forEach((element) => {
|
|
344
|
-
const d = element.getAttribute('d');
|
|
345
|
-
if (!d)
|
|
346
|
-
return;
|
|
347
|
-
const node = rc.path(d, createOptions(element));
|
|
348
|
-
replaceShape(element, node);
|
|
349
|
-
});
|
|
350
|
-
return serializer.serializeToString(svgElement);
|
|
351
|
-
}
|
|
352
|
-
catch (error) {
|
|
353
|
-
console.error('Error while applying hand-drawn mermaid style', error);
|
|
354
|
-
return svg;
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
export { Mermaid };
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { MDXComponents } from 'mdx/types';
|
|
2
|
-
import type { ReactNode } from 'react';
|
|
3
|
-
export type SiteMdxFeature = 'base' | 'code' | 'math' | 'mermaid' | 'type-table' | 'fuma-ui' | 'widgets';
|
|
4
|
-
export interface SiteMdxComponentsOptions {
|
|
5
|
-
imageFallbackSrc?: string;
|
|
6
|
-
cdnBaseUrl?: string;
|
|
7
|
-
watermarkEnabled?: boolean;
|
|
8
|
-
watermarkText?: string;
|
|
9
|
-
additionalComponents?: MDXComponents;
|
|
10
|
-
iconMap?: Record<string, ReactNode>;
|
|
11
|
-
features?: SiteMdxFeature[];
|
|
12
|
-
}
|
|
13
|
-
export declare function createSiteMdxComponents(options: SiteMdxComponentsOptions): (components?: MDXComponents) => MDXComponents;
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var siteMdxPresets = require('./site-mdx-presets.js');
|
|
4
|
-
|
|
5
|
-
function createSiteMdxComponents(options) {
|
|
6
|
-
const { additionalComponents, cdnBaseUrl, features = siteMdxPresets.DEFAULT_SITE_MDX_FEATURES, iconMap = {}, imageFallbackSrc, watermarkEnabled, watermarkText, } = options;
|
|
7
|
-
const featureMap = siteMdxPresets.createSiteFeatureComponentMap({
|
|
8
|
-
cdnBaseUrl,
|
|
9
|
-
iconMap,
|
|
10
|
-
imageFallbackSrc,
|
|
11
|
-
watermarkEnabled,
|
|
12
|
-
watermarkText,
|
|
13
|
-
});
|
|
14
|
-
return function getMDXComponents(components) {
|
|
15
|
-
return siteMdxPresets.composeSiteMdxComponents(features, featureMap, additionalComponents, components);
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
exports.createSiteMdxComponents = createSiteMdxComponents;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { DEFAULT_SITE_MDX_FEATURES, createSiteFeatureComponentMap, composeSiteMdxComponents } from './site-mdx-presets.mjs';
|
|
2
|
-
|
|
3
|
-
function createSiteMdxComponents(options) {
|
|
4
|
-
const { additionalComponents, cdnBaseUrl, features = DEFAULT_SITE_MDX_FEATURES, iconMap = {}, imageFallbackSrc, watermarkEnabled, watermarkText, } = options;
|
|
5
|
-
const featureMap = createSiteFeatureComponentMap({
|
|
6
|
-
cdnBaseUrl,
|
|
7
|
-
iconMap,
|
|
8
|
-
imageFallbackSrc,
|
|
9
|
-
watermarkEnabled,
|
|
10
|
-
watermarkText,
|
|
11
|
-
});
|
|
12
|
-
return function getMDXComponents(components) {
|
|
13
|
-
return composeSiteMdxComponents(features, featureMap, additionalComponents, components);
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export { createSiteMdxComponents };
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { MDXComponents } from 'mdx/types';
|
|
2
|
-
import type { SiteMdxFeature, SiteMdxComponentsOptions } from './site-mdx-components';
|
|
3
|
-
export declare const DEFAULT_SITE_MDX_FEATURES: SiteMdxFeature[];
|
|
4
|
-
export declare function createSiteFeatureComponentMap(options: SiteMdxComponentsOptions): {
|
|
5
|
-
base: MDXComponents;
|
|
6
|
-
code: MDXComponents;
|
|
7
|
-
math: MDXComponents;
|
|
8
|
-
mermaid: MDXComponents;
|
|
9
|
-
'type-table': MDXComponents;
|
|
10
|
-
'fuma-ui': MDXComponents;
|
|
11
|
-
widgets: MDXComponents;
|
|
12
|
-
};
|
|
13
|
-
export declare function composeSiteMdxComponents(features: readonly SiteMdxFeature[], featureMap: Record<SiteMdxFeature, MDXComponents>, additionalComponents?: MDXComponents, components?: MDXComponents): MDXComponents;
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var defaultMdxComponents = require('fumadocs-ui/mdx');
|
|
4
|
-
var tabs = require('fumadocs-ui/components/tabs');
|
|
5
|
-
var callout = require('fumadocs-ui/components/callout');
|
|
6
|
-
var files = require('fumadocs-ui/components/files');
|
|
7
|
-
var accordion = require('fumadocs-ui/components/accordion');
|
|
8
|
-
var features = require('./features.js');
|
|
9
|
-
|
|
10
|
-
const defaultFumaUiComponents = {
|
|
11
|
-
Callout: callout.Callout,
|
|
12
|
-
File: files.File,
|
|
13
|
-
Folder: files.Folder,
|
|
14
|
-
Files: files.Files,
|
|
15
|
-
Accordion: accordion.Accordion,
|
|
16
|
-
Accordions: accordion.Accordions,
|
|
17
|
-
Tab: tabs.Tab,
|
|
18
|
-
Tabs: tabs.Tabs,
|
|
19
|
-
};
|
|
20
|
-
const DEFAULT_SITE_MDX_FEATURES = [
|
|
21
|
-
'base',
|
|
22
|
-
'code',
|
|
23
|
-
'math',
|
|
24
|
-
'mermaid',
|
|
25
|
-
'type-table',
|
|
26
|
-
'fuma-ui',
|
|
27
|
-
'widgets',
|
|
28
|
-
];
|
|
29
|
-
function createSiteFeatureComponentMap(options) {
|
|
30
|
-
const { cdnBaseUrl, iconMap = {}, imageFallbackSrc, watermarkEnabled, watermarkText, } = options;
|
|
31
|
-
return {
|
|
32
|
-
base: features.createBaseMdxComponents(imageFallbackSrc),
|
|
33
|
-
code: features.createCodeMdxComponents(iconMap),
|
|
34
|
-
math: features.createMathMdxComponents(),
|
|
35
|
-
mermaid: features.createMermaidMdxComponents(watermarkEnabled, watermarkText),
|
|
36
|
-
'type-table': features.createTypeTableMdxComponents(),
|
|
37
|
-
'fuma-ui': defaultFumaUiComponents,
|
|
38
|
-
widgets: features.createWidgetMdxComponents(cdnBaseUrl, imageFallbackSrc),
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
function composeSiteMdxComponents(features, featureMap, additionalComponents, components) {
|
|
42
|
-
return Object.assign(Object.assign(Object.assign(Object.assign({}, defaultMdxComponents), features.reduce((acc, feature) => {
|
|
43
|
-
return Object.assign(Object.assign({}, acc), featureMap[feature]);
|
|
44
|
-
}, {})), additionalComponents), components);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
exports.DEFAULT_SITE_MDX_FEATURES = DEFAULT_SITE_MDX_FEATURES;
|
|
48
|
-
exports.composeSiteMdxComponents = composeSiteMdxComponents;
|
|
49
|
-
exports.createSiteFeatureComponentMap = createSiteFeatureComponentMap;
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import defaultMdxComponents from 'fumadocs-ui/mdx';
|
|
2
|
-
import { Tabs, Tab } from 'fumadocs-ui/components/tabs';
|
|
3
|
-
import { Callout } from 'fumadocs-ui/components/callout';
|
|
4
|
-
import { Files, Folder, File } from 'fumadocs-ui/components/files';
|
|
5
|
-
import { Accordions, Accordion } from 'fumadocs-ui/components/accordion';
|
|
6
|
-
import { createWidgetMdxComponents, createTypeTableMdxComponents, createMermaidMdxComponents, createMathMdxComponents, createCodeMdxComponents, createBaseMdxComponents } from './features.mjs';
|
|
7
|
-
|
|
8
|
-
const defaultFumaUiComponents = {
|
|
9
|
-
Callout,
|
|
10
|
-
File,
|
|
11
|
-
Folder,
|
|
12
|
-
Files,
|
|
13
|
-
Accordion,
|
|
14
|
-
Accordions,
|
|
15
|
-
Tab,
|
|
16
|
-
Tabs,
|
|
17
|
-
};
|
|
18
|
-
const DEFAULT_SITE_MDX_FEATURES = [
|
|
19
|
-
'base',
|
|
20
|
-
'code',
|
|
21
|
-
'math',
|
|
22
|
-
'mermaid',
|
|
23
|
-
'type-table',
|
|
24
|
-
'fuma-ui',
|
|
25
|
-
'widgets',
|
|
26
|
-
];
|
|
27
|
-
function createSiteFeatureComponentMap(options) {
|
|
28
|
-
const { cdnBaseUrl, iconMap = {}, imageFallbackSrc, watermarkEnabled, watermarkText, } = options;
|
|
29
|
-
return {
|
|
30
|
-
base: createBaseMdxComponents(imageFallbackSrc),
|
|
31
|
-
code: createCodeMdxComponents(iconMap),
|
|
32
|
-
math: createMathMdxComponents(),
|
|
33
|
-
mermaid: createMermaidMdxComponents(watermarkEnabled, watermarkText),
|
|
34
|
-
'type-table': createTypeTableMdxComponents(),
|
|
35
|
-
'fuma-ui': defaultFumaUiComponents,
|
|
36
|
-
widgets: createWidgetMdxComponents(cdnBaseUrl, imageFallbackSrc),
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
function composeSiteMdxComponents(features, featureMap, additionalComponents, components) {
|
|
40
|
-
return Object.assign(Object.assign(Object.assign(Object.assign({}, defaultMdxComponents), features.reduce((acc, feature) => {
|
|
41
|
-
return Object.assign(Object.assign({}, acc), featureMap[feature]);
|
|
42
|
-
}, {})), additionalComponents), components);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export { DEFAULT_SITE_MDX_FEATURES, composeSiteMdxComponents, createSiteFeatureComponentMap };
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export { createBaseMdxComponents } from './features/base';
|
|
2
|
-
export { createCodeMdxComponents } from './features/code';
|
|
3
|
-
export { createMathMdxComponents } from './features/math';
|
|
4
|
-
export { createMermaidMdxComponents } from './features/mermaid';
|
|
5
|
-
export { createTypeTableMdxComponents } from './features/type-table';
|
|
6
|
-
export { createWidgetMdxComponents } from './features/widgets';
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var base = require('./features/base.js');
|
|
4
|
-
var code = require('./features/code.js');
|
|
5
|
-
var math = require('./features/math.js');
|
|
6
|
-
var mermaid = require('./features/mermaid.js');
|
|
7
|
-
var typeTable = require('./features/type-table.js');
|
|
8
|
-
var widgets = require('./features/widgets.js');
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
exports.createBaseMdxComponents = base.createBaseMdxComponents;
|
|
13
|
-
exports.createCodeMdxComponents = code.createCodeMdxComponents;
|
|
14
|
-
exports.createMathMdxComponents = math.createMathMdxComponents;
|
|
15
|
-
exports.createMermaidMdxComponents = mermaid.createMermaidMdxComponents;
|
|
16
|
-
exports.createTypeTableMdxComponents = typeTable.createTypeTableMdxComponents;
|
|
17
|
-
exports.createWidgetMdxComponents = widgets.createWidgetMdxComponents;
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export { createBaseMdxComponents } from './features/base.mjs';
|
|
2
|
-
export { createCodeMdxComponents } from './features/code.mjs';
|
|
3
|
-
export { createMathMdxComponents } from './features/math.mjs';
|
|
4
|
-
export { createMermaidMdxComponents } from './features/mermaid.mjs';
|
|
5
|
-
export { createTypeTableMdxComponents } from './features/type-table.mjs';
|
|
6
|
-
export { createWidgetMdxComponents } from './features/widgets.mjs';
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { MDXComponents } from 'mdx/types';
|
|
2
|
-
import type { ReactNode } from 'react';
|
|
3
|
-
import { type SiteMdxFeature } from './site-mdx-presets';
|
|
4
|
-
export interface SiteMdxComponentsOptions {
|
|
5
|
-
imageFallbackSrc?: string;
|
|
6
|
-
cdnBaseUrl?: string;
|
|
7
|
-
watermarkEnabled?: boolean;
|
|
8
|
-
watermarkText?: string;
|
|
9
|
-
additionalComponents?: MDXComponents;
|
|
10
|
-
iconMap?: Record<string, ReactNode>;
|
|
11
|
-
features?: SiteMdxFeature[];
|
|
12
|
-
}
|
|
13
|
-
export declare function createSiteMdxComponents(options: SiteMdxComponentsOptions): (components?: MDXComponents) => MDXComponents;
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var siteMdxPresets = require('./site-mdx-presets.js');
|
|
4
|
-
|
|
5
|
-
function createSiteMdxComponents(options) {
|
|
6
|
-
const { additionalComponents, cdnBaseUrl, features = siteMdxPresets.DEFAULT_SITE_MDX_FEATURES, iconMap = {}, imageFallbackSrc, watermarkEnabled, watermarkText, } = options;
|
|
7
|
-
return function getMDXComponents(components) {
|
|
8
|
-
return siteMdxPresets.createComposedSiteMdxComponents(features, {
|
|
9
|
-
cdnBaseUrl,
|
|
10
|
-
iconMap,
|
|
11
|
-
imageFallbackSrc,
|
|
12
|
-
watermarkEnabled,
|
|
13
|
-
watermarkText,
|
|
14
|
-
}, additionalComponents, components);
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
exports.createSiteMdxComponents = createSiteMdxComponents;
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { DEFAULT_SITE_MDX_FEATURES, createComposedSiteMdxComponents } from './site-mdx-presets.mjs';
|
|
2
|
-
|
|
3
|
-
function createSiteMdxComponents(options) {
|
|
4
|
-
const { additionalComponents, cdnBaseUrl, features = DEFAULT_SITE_MDX_FEATURES, iconMap = {}, imageFallbackSrc, watermarkEnabled, watermarkText, } = options;
|
|
5
|
-
return function getMDXComponents(components) {
|
|
6
|
-
return createComposedSiteMdxComponents(features, {
|
|
7
|
-
cdnBaseUrl,
|
|
8
|
-
iconMap,
|
|
9
|
-
imageFallbackSrc,
|
|
10
|
-
watermarkEnabled,
|
|
11
|
-
watermarkText,
|
|
12
|
-
}, additionalComponents, components);
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export { createSiteMdxComponents };
|