@adminide-stack/yantra-mobile 12.0.131 → 12.0.132-alpha.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/lib/components/CustomDrawer.js +2 -2
- package/lib/components/CustomDrawer.js.map +1 -1
- package/lib/features/apps/AppsCatalog.js +7 -1
- package/lib/features/apps/AppsCatalog.js.map +1 -1
- package/lib/features/apps/nativeSurfaceTwin.js +35 -0
- package/lib/features/apps/nativeSurfaceTwin.js.map +1 -0
- package/lib/features/canvas/CanvasBoardsGrid.js +49 -49
- package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
- package/lib/features/canvas/CanvasExperience.js +69 -28
- package/lib/features/canvas/CanvasExperience.js.map +1 -1
- package/lib/features/canvas/audioEditor/AudioWaveform.js +1 -1
- package/lib/features/canvas/designCatalog.js +63 -39
- package/lib/features/canvas/designCatalog.js.map +1 -1
- package/lib/features/canvas/designCategories.js +56 -0
- package/lib/features/canvas/designCategories.js.map +1 -1
- package/lib/features/canvas/generator/DirectorSheet.js +3 -2
- package/lib/features/canvas/generator/DirectorSheet.js.map +1 -1
- package/lib/features/canvas/home/HeroComposer.js +165 -76
- package/lib/features/canvas/home/HeroComposer.js.map +1 -1
- package/lib/features/canvas/home/HeroMonitor.js +75 -46
- package/lib/features/canvas/home/HeroMonitor.js.map +1 -1
- package/lib/features/canvas/home/TemplatesGallery.js +273 -138
- package/lib/features/canvas/home/TemplatesGallery.js.map +1 -1
- package/lib/features/canvas/home/templatesGallerySources.js +221 -0
- package/lib/features/canvas/home/templatesGallerySources.js.map +1 -0
- package/lib/features/canvas/homeWork.js +12 -11
- package/lib/features/canvas/homeWork.js.map +1 -1
- package/lib/features/canvas/lazyEditors.js +51 -0
- package/lib/features/canvas/lazyEditors.js.map +1 -0
- package/lib/features/canvas/rankedCatalogSearch.js +33 -23
- package/lib/features/canvas/rankedCatalogSearch.js.map +1 -1
- package/lib/features/canvas/set/SetViewportWebView.js +1 -1
- package/lib/features/canvas/set/agent/tools.js +1 -1
- package/lib/features/canvas/studioCatalog.js +2 -2
- package/lib/features/canvas/studioCatalog.js.map +1 -1
- package/lib/features/canvas/templateSearch.js +8 -1
- package/lib/features/canvas/templateSearch.js.map +1 -1
- package/lib/features/canvas/videoEditor/BlurBoxOverlay.js +1 -1
- package/lib/features/design/DesignEditorExperience.js +103 -29
- package/lib/features/design/DesignEditorExperience.js.map +1 -1
- package/lib/features/design/DesignExperience.js +4 -3
- package/lib/features/design/DesignExperience.js.map +1 -1
- package/lib/features/design/doc/aiDesign.js +1 -1
- package/lib/features/design/doc/aiDesign.js.map +1 -1
- package/lib/features/design/doc/artifacts.js +40 -13
- package/lib/features/design/doc/artifacts.js.map +1 -1
- package/lib/features/design/doc/chart.js +387 -13
- package/lib/features/design/doc/chart.js.map +1 -1
- package/lib/features/design/doc/copyStyle.js +47 -0
- package/lib/features/design/doc/copyStyle.js.map +1 -0
- package/lib/features/design/doc/docOps.js +22 -4
- package/lib/features/design/doc/docOps.js.map +1 -1
- package/lib/features/design/doc/geometry.js +32 -18
- package/lib/features/design/doc/geometry.js.map +1 -1
- package/lib/features/design/doc/newDoc.js +5 -1
- package/lib/features/design/doc/newDoc.js.map +1 -1
- package/lib/features/design/doc/resize.js +101 -0
- package/lib/features/design/doc/resize.js.map +1 -0
- package/lib/features/design/doc/sizes.js +15 -2
- package/lib/features/design/doc/sizes.js.map +1 -1
- package/lib/features/design/editor/ChartDataPanel.js +49 -9
- package/lib/features/design/editor/ChartDataPanel.js.map +1 -1
- package/lib/features/design/editor/CropOverlay.js +1 -1
- package/lib/features/design/editor/DesignCanvas.js +14 -13
- package/lib/features/design/editor/DesignCanvas.js.map +1 -1
- package/lib/features/design/editor/ExportSheet.js +8 -4
- package/lib/features/design/editor/ExportSheet.js.map +1 -1
- package/lib/features/design/editor/LayerTools.js +37 -5
- package/lib/features/design/editor/LayerTools.js.map +1 -1
- package/lib/features/design/editor/Slideshow.js +30 -5
- package/lib/features/design/editor/Slideshow.js.map +1 -1
- package/lib/features/design/editor/useDesignSave.js +21 -36
- package/lib/features/design/editor/useDesignSave.js.map +1 -1
- package/lib/features/design/export/exportDesign.js +3 -1
- package/lib/features/design/export/exportDesign.js.map +1 -1
- package/lib/features/design/home/DesignHome.js +7 -2
- package/lib/features/design/home/DesignHome.js.map +1 -1
- package/lib/features/design/render/DesignPageView.js +1 -1
- package/lib/features/design/render/DesignPageView.js.map +1 -1
- package/lib/features/design/render/PageCapture.js +11 -10
- package/lib/features/design/render/PageCapture.js.map +1 -1
- package/lib/features/design/render/fontRegistry.js +27 -3
- package/lib/features/design/render/fontRegistry.js.map +1 -1
- package/lib/features/design/render/svgParts.js +27 -74
- package/lib/features/design/render/svgParts.js.map +1 -1
- package/lib/features/devices/brands/qnScale.js +7 -2
- package/lib/features/devices/brands/qnScale.js.map +1 -1
- package/lib/features/devices/brands/uuids.js +2 -1
- package/lib/features/devices/brands/uuids.js.map +1 -1
- package/lib/features/devices/devices.js +2 -1
- package/lib/features/devices/devices.js.map +1 -1
- package/lib/features/docs/DocBlockRow.js +1 -1
- package/lib/features/docs/docArtifacts.js +2 -2
- package/lib/features/docs/docArtifacts.js.map +1 -1
- package/lib/features/health/healthSync.js +3 -1
- package/lib/features/health/healthSync.js.map +1 -1
- package/lib/features/health/nativeHealth.js +8 -0
- package/lib/features/health/nativeHealth.js.map +1 -0
- package/lib/features/links/openInApp.js +11 -1
- package/lib/features/links/openInApp.js.map +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +135 -28
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
- package/lib/features/webbuilder/buildFragments.js +14 -6
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/components/PreviewFrame.js +28 -3
- package/lib/features/webbuilder/components/PreviewFrame.js.map +1 -1
- package/lib/features/webbuilder/components/PreviewScreen.js +1 -1
- package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
- package/lib/features/webbuilder/components/ProjectChat.js +24 -5
- package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
- package/lib/features/webbuilder/components/ProjectsScreen.js +18 -2
- package/lib/features/webbuilder/components/ProjectsScreen.js.map +1 -1
- package/lib/features/webbuilder/components/ui.js +20 -6
- package/lib/features/webbuilder/components/ui.js.map +1 -1
- package/lib/features/webbuilder/exportCode.js +52 -0
- package/lib/features/webbuilder/exportCode.js.map +1 -0
- package/lib/features/webbuilder/siteAddress.js +71 -0
- package/lib/features/webbuilder/siteAddress.js.map +1 -0
- package/lib/features/webbuilder/widgetBlocks.js +30 -0
- package/lib/features/webbuilder/widgetBlocks.js.map +1 -0
- package/lib/screens/Chat/index.js +5 -6
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/ChatHistory/index.js +3 -2
- package/lib/screens/ChatHistory/index.js.map +1 -1
- package/lib/screens/Home/HomeScreen.js +20 -4
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/Home/components/WebBuilderCodePrewarm.js +18 -0
- package/lib/screens/Home/components/WebBuilderCodePrewarm.js.map +1 -0
- package/lib/screens/WebBuilderNative/index.js +1 -1
- package/lib/screens/WebBuilderNative/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/keepAlive.js +112 -0
- package/lib/screens/WebBuilderNative/keepAlive.js.map +1 -0
- package/lib/screens/WebBuilderNative/runningBuilds.js +40 -0
- package/lib/screens/WebBuilderNative/runningBuilds.js.map +1 -0
- package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js +57 -0
- package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js.map +1 -0
- package/lib/screens/WebBuilderNative/useWebBuilderGallery.js +73 -14
- package/lib/screens/WebBuilderNative/useWebBuilderGallery.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +143 -34
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderJobs.js +17 -5
- package/lib/screens/WebBuilderNative/useWebBuilderJobs.js.map +1 -1
- package/lib/screens/WebBuilderNative/versionUndo.js +144 -0
- package/lib/screens/WebBuilderNative/versionUndo.js.map +1 -0
- package/lib/screens/WebBuilderNative/webbuilderSnapshotKey.js +1 -0
- package/lib/screens/WebBuilderNative/webbuilderSnapshotKey.js.map +1 -0
- package/lib/screens/WebBuilderNative/webbuilderTransport.js +90 -6
- package/lib/screens/WebBuilderNative/webbuilderTransport.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DesignPageView.js","sources":["../../../../src/features/design/render/DesignPageView.tsx"],"sourcesContent":["/**\n * One design page drawn natively at any width - the editor's canvas, a page\n * strip thumbnail and a Recent designs tile are all this view at different\n * sizes. Layers paint in array order, background first, exactly as the web\n * renderer stacks them.\n */\nimport React, { memo, useMemo } from 'react';\nimport { StyleSheet, View, type StyleProp, type ViewStyle } from 'react-native';\nimport { Image } from 'expo-image';\nimport { gradientLine } from '../doc/shapes';\nimport { facesUsed } from '../doc/textLayout';\nimport type { DesignDoc, DesignPage, PageBackground } from '../doc/types';\nimport { useDesignFonts } from './fontRegistry';\nimport { LayerView } from './layers';\nimport { SvgBoundary, getSvg, svgUsable } from './svg';\n\nfunction Background({ background, W, H }: { background?: PageBackground; W: number; H: number }) {\n if (!background) return <View style={[StyleSheet.absoluteFill, styles.white]} />;\n if (background.kind === 'image' && background.src) {\n return (\n <Image\n source={{ uri: background.src }}\n style={StyleSheet.absoluteFill}\n contentFit=\"cover\"\n transition={120}\n />\n );\n }\n if (background.kind === 'gradient' && background.from && background.to) {\n const svg = getSvg();\n const flat = <View style={[StyleSheet.absoluteFill, { backgroundColor: background.from }]} />;\n if (!svg || !svgUsable()) return flat;\n const { Svg, Defs, LinearGradient, Stop, Rect } = svg;\n const [x1, y1, x2, y2] = gradientLine(0, 0, W, H, background.angle ?? 180);\n return (\n <SvgBoundary fallback={flat}>\n <Svg width={W} height={H} style={StyleSheet.absoluteFill}>\n <Defs>\n <LinearGradient id=\"bg\" gradientUnits=\"userSpaceOnUse\" x1={x1} y1={y1} x2={x2} y2={y2}>\n <Stop offset=\"0\" stopColor={background.from} />\n <Stop offset=\"1\" stopColor={background.to} />\n </LinearGradient>\n </Defs>\n <Rect x={0} y={0} width={W} height={H} fill=\"url(#bg)\" />\n </Svg>\n </SvgBoundary>\n );\n }\n return <View style={[StyleSheet.absoluteFill, { backgroundColor: background.color || '#ffffff' }]} />;\n}\n\nexport interface DesignPageViewProps {\n doc: Pick<DesignDoc, 'pageWidth' | 'pageHeight' | 'fontPair'
|
|
1
|
+
{"version":3,"file":"DesignPageView.js","sources":["../../../../src/features/design/render/DesignPageView.tsx"],"sourcesContent":["/**\n * One design page drawn natively at any width - the editor's canvas, a page\n * strip thumbnail and a Recent designs tile are all this view at different\n * sizes. Layers paint in array order, background first, exactly as the web\n * renderer stacks them.\n */\nimport React, { memo, useMemo } from 'react';\nimport { StyleSheet, View, type StyleProp, type ViewStyle } from 'react-native';\nimport { Image } from 'expo-image';\nimport { gradientLine } from '../doc/shapes';\nimport { facesUsed } from '../doc/textLayout';\nimport type { DesignDoc, DesignPage, PageBackground } from '../doc/types';\nimport { useDesignFonts } from './fontRegistry';\nimport { LayerView } from './layers';\nimport { SvgBoundary, getSvg, svgUsable } from './svg';\n\nfunction Background({ background, W, H }: { background?: PageBackground; W: number; H: number }) {\n if (!background) return <View style={[StyleSheet.absoluteFill, styles.white]} />;\n if (background.kind === 'image' && background.src) {\n return (\n <Image\n source={{ uri: background.src }}\n style={StyleSheet.absoluteFill}\n contentFit=\"cover\"\n transition={120}\n />\n );\n }\n if (background.kind === 'gradient' && background.from && background.to) {\n const svg = getSvg();\n const flat = <View style={[StyleSheet.absoluteFill, { backgroundColor: background.from }]} />;\n if (!svg || !svgUsable()) return flat;\n const { Svg, Defs, LinearGradient, Stop, Rect } = svg;\n const [x1, y1, x2, y2] = gradientLine(0, 0, W, H, background.angle ?? 180);\n return (\n <SvgBoundary fallback={flat}>\n <Svg width={W} height={H} style={StyleSheet.absoluteFill}>\n <Defs>\n <LinearGradient id=\"bg\" gradientUnits=\"userSpaceOnUse\" x1={x1} y1={y1} x2={x2} y2={y2}>\n <Stop offset=\"0\" stopColor={background.from} />\n <Stop offset=\"1\" stopColor={background.to} />\n </LinearGradient>\n </Defs>\n <Rect x={0} y={0} width={W} height={H} fill=\"url(#bg)\" />\n </Svg>\n </SvgBoundary>\n );\n }\n return <View style={[StyleSheet.absoluteFill, { backgroundColor: background.color || '#ffffff' }]} />;\n}\n\nexport interface DesignPageViewProps {\n doc: Pick<DesignDoc, 'pageWidth' | 'pageHeight' | 'fontPair'> & Partial<Pick<DesignDoc, 'fonts'>>;\n page: DesignPage;\n /** Drawn width in dp; the height follows the page's own proportions. */\n width: number;\n /** Layers not to draw (the one being typed into is drawn by its editor). */\n hiddenLayerId?: string | null;\n style?: StyleProp<ViewStyle>;\n}\n\nexport const DesignPageView = memo(function DesignPageView({\n doc,\n page,\n width,\n hiddenLayerId,\n style,\n}: DesignPageViewProps) {\n const W = Math.max(1, width);\n const H = (W * doc.pageHeight) / Math.max(1, doc.pageWidth);\n const faces = useMemo(() => facesUsed(page, doc.fontPair), [page, doc.fontPair]);\n useDesignFonts(faces, doc.fonts);\n return (\n <View style={[{ width: W, height: H }, styles.page, style]}>\n {page.src && !page.layers?.length ? (\n <Image source={{ uri: page.src }} style={StyleSheet.absoluteFill} contentFit=\"cover\" />\n ) : (\n <Background background={page.background} W={W} H={H} />\n )}\n {(page.layers ?? []).map((layer) =>\n layer.id === hiddenLayerId ? null : (\n <LayerView key={layer.id} layer={layer} W={W} H={H} fontPair={doc.fontPair} />\n ),\n )}\n </View>\n );\n});\n\nconst styles = StyleSheet.create({\n page: { overflow: 'hidden', backgroundColor: '#ffffff' },\n white: { backgroundColor: '#ffffff' },\n});\n"],"names":["DesignPageView"],"mappings":"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"}
|
|
@@ -18,15 +18,15 @@ var __spreadValues = (a, b) => {
|
|
|
18
18
|
};
|
|
19
19
|
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
20
|
const IMAGE_WAIT_MS = 1e4;
|
|
21
|
-
function pictureCount(page) {
|
|
21
|
+
function pictureCount(page, transparent = false) {
|
|
22
22
|
var _a, _b, _c;
|
|
23
23
|
let n = 0;
|
|
24
|
-
if (page.src && !((_a = page.layers) == null ? void 0 : _a.length)) n += 1;
|
|
25
|
-
else if (((_b = page.background) == null ? void 0 : _b.kind) === "image" && page.background.src) n += 1;
|
|
24
|
+
if (!transparent && page.src && !((_a = page.layers) == null ? void 0 : _a.length)) n += 1;
|
|
25
|
+
else if (!transparent && ((_b = page.background) == null ? void 0 : _b.kind) === "image" && page.background.src) n += 1;
|
|
26
26
|
for (const l of (_c = page.layers) != null ? _c : []) if (l.kind === "image" && l.src) n += 1;
|
|
27
27
|
return n;
|
|
28
28
|
}
|
|
29
|
-
function pageSvg(svg, doc, page, lines, curves, onLoad) {
|
|
29
|
+
function pageSvg(svg, doc, page, lines, curves, onLoad, transparent = false) {
|
|
30
30
|
var _a, _b, _c;
|
|
31
31
|
const {
|
|
32
32
|
G,
|
|
@@ -61,8 +61,8 @@ function pageSvg(svg, doc, page, lines, curves, onLoad) {
|
|
|
61
61
|
ground = /* @__PURE__ */ jsx(Rect, { x: 0, y: 0, width: W, height: H, fill: bg.color || "#ffffff" });
|
|
62
62
|
}
|
|
63
63
|
return /* @__PURE__ */ jsxs(G, { children: [
|
|
64
|
-
/* @__PURE__ */ jsx(Rect, { x: 0, y: 0, width: W, height: H, fill: "#ffffff" }),
|
|
65
|
-
ground,
|
|
64
|
+
transparent ? null : /* @__PURE__ */ jsx(Rect, { x: 0, y: 0, width: W, height: H, fill: "#ffffff" }),
|
|
65
|
+
transparent ? null : ground,
|
|
66
66
|
((_c = page.layers) != null ? _c : []).map((layer) => /* @__PURE__ */ jsx(LayerG, { svg, layer, W, H, fontPair: doc.fontPair, lines: lines[layer.id], curve: curves[layer.id], onLoad }, layer.id))
|
|
67
67
|
] });
|
|
68
68
|
}
|
|
@@ -103,7 +103,7 @@ const PageCapture = forwardRef(function PageCapture2({
|
|
|
103
103
|
return setJob((_a = queue.current.shift()) != null ? _a : null);
|
|
104
104
|
}, []);
|
|
105
105
|
useImperativeHandle(ref, () => ({
|
|
106
|
-
capture: (page, pixelWidth) => new Promise((resolve, reject) => {
|
|
106
|
+
capture: (page, pixelWidth, opts) => new Promise((resolve, reject) => {
|
|
107
107
|
if (!getSvg()) {
|
|
108
108
|
reject(new Error("Drawing is not available in this version of the app."));
|
|
109
109
|
return;
|
|
@@ -113,6 +113,7 @@ const PageCapture = forwardRef(function PageCapture2({
|
|
|
113
113
|
id: seq.current,
|
|
114
114
|
page,
|
|
115
115
|
pixelWidth,
|
|
116
|
+
transparent: opts == null ? void 0 : opts.transparent,
|
|
116
117
|
resolve,
|
|
117
118
|
reject
|
|
118
119
|
});
|
|
@@ -214,11 +215,11 @@ function CaptureJob({
|
|
|
214
215
|
return ((_a = page.layers) != null ? _a : []).filter((l) => l.kind === "text");
|
|
215
216
|
}, [page]);
|
|
216
217
|
const faces = useMemo(() => facesUsed(page, doc.fontPair), [page, doc.fontPair]);
|
|
217
|
-
useDesignFonts(faces);
|
|
218
|
+
useDesignFonts(faces, doc.fonts);
|
|
218
219
|
const [lines, setLines] = useState({});
|
|
219
220
|
const [curves, setCurves] = useState({});
|
|
220
221
|
const measured = texts.every((t) => t.curve ? curves[t.id] : lines[t.id]);
|
|
221
|
-
const pictures = useMemo(() => pictureCount(page), [page]);
|
|
222
|
+
const pictures = useMemo(() => pictureCount(page, job.transparent), [page, job.transparent]);
|
|
222
223
|
const loaded = useRef(0);
|
|
223
224
|
const [picturesReady, setPicturesReady] = useState(pictures === 0);
|
|
224
225
|
const svgRef = useRef(null);
|
|
@@ -270,7 +271,7 @@ function CaptureJob({
|
|
|
270
271
|
})) }, t.id) : /* @__PURE__ */ jsx(LineMeasure, { layer: t, W, fontPair: doc.fontPair, absolute: true, onLines: (l) => setLines((m) => m[t.id] ? m : __spreadProps(__spreadValues({}, m), {
|
|
271
272
|
[t.id]: l
|
|
272
273
|
})) }, t.id)),
|
|
273
|
-
measured ? /* @__PURE__ */ jsx(svg.Svg, { ref: svgRef, width: viewW, height: viewH, viewBox: `0 0 ${W} ${H}`, preserveAspectRatio: "none", style: styles.svg, children: pageSvg(svg, doc, page, lines, curves, onLoad) }) : null
|
|
274
|
+
measured ? /* @__PURE__ */ jsx(svg.Svg, { ref: svgRef, width: viewW, height: viewH, viewBox: `0 0 ${W} ${H}`, preserveAspectRatio: "none", style: styles.svg, children: pageSvg(svg, doc, page, lines, curves, onLoad, job.transparent) }) : null
|
|
274
275
|
] });
|
|
275
276
|
}
|
|
276
277
|
const styles = StyleSheet.create({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageCapture.js","sources":["../../../../src/features/design/render/PageCapture.tsx"],"sourcesContent":["/**\n * A design page as a PNG, made on the phone - the native twin of web's\n * `utils/exporter.ts` (which re-composes a page on an OffscreenCanvas).\n *\n * The app ships no view snapshotter, so the page is re-composed as ONE\n * react-native-svg drawing at page size (background, shapes, charts,\n * pictures, text) and that svg rasterises itself (`toDataURL`). Text lines\n * come from a hidden RN layout of each text layer first (render/TextMeasure),\n * so the words wrap exactly where the canvas wraps them; the capture waits for\n * every picture to load before it draws.\n *\n * Mounted once, off screen, by the editor; `capture(page, px)` queues a page.\n */\nimport React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';\nimport { PixelRatio, Platform, StyleSheet, View } from 'react-native';\nimport { gradientLine } from '../doc/shapes';\nimport { facesUsed } from '../doc/textLayout';\nimport type { DesignDoc, DesignFontPair, DesignPage, EditorLayer, TextLayer } from '../doc/types';\nimport { useDesignFonts } from './fontRegistry';\nimport {\n chartSvg,\n imageSvg,\n shapeSvg,\n textSvg,\n type MeasuredCurve,\n type MeasuredLine,\n type SvgModule,\n} from './svgParts';\nimport { getSvg } from './svg';\nimport { CurveMeasure, LineMeasure } from './TextMeasure';\n\nexport interface PageCaptureHandle {\n /** The page as a base64 PNG `pixelWidth` wide (height by the page's proportions). */\n capture: (page: DesignPage, pixelWidth: number) => Promise<string>;\n /** Any svg drawing (`width` x `height` user units) as a base64 PNG `pixelWidth` wide - a QR code. */\n captureSvg: (\n render: (svg: SvgModule) => React.ReactElement,\n width: number,\n height: number,\n pixelWidth: number,\n ) => Promise<string>;\n}\n\ninterface Job {\n id: number;\n page: DesignPage;\n pixelWidth: number;\n draw?: { render: (svg: SvgModule) => React.ReactElement; width: number; height: number };\n resolve: (b64: string) => void;\n reject: (err: Error) => void;\n}\n\n/** How long a capture waits for its pictures before drawing what it has. */\nconst IMAGE_WAIT_MS = 10_000;\n\nfunction pictureCount(page: DesignPage): number {\n let n = 0;\n if (page.src && !page.layers?.length) n += 1;\n else if (page.background?.kind === 'image' && page.background.src) n += 1;\n for (const l of page.layers ?? []) if (l.kind === 'image' && l.src) n += 1;\n return n;\n}\n\n/** The whole page as svg elements, in page px. */\nexport function pageSvg(\n svg: SvgModule,\n doc: Pick<DesignDoc, 'pageWidth' | 'pageHeight' | 'fontPair'>,\n page: DesignPage,\n lines: Record<string, MeasuredLine[]>,\n curves: Record<string, MeasuredCurve>,\n onLoad?: () => void,\n): React.ReactElement {\n const { G, Rect, Defs, LinearGradient, Stop, Image: SvgImage } = svg;\n const W = doc.pageWidth;\n const H = doc.pageHeight;\n const bg = page.background;\n let ground: React.ReactNode = <Rect x={0} y={0} width={W} height={H} fill=\"#ffffff\" />;\n if (page.src && !page.layers?.length) {\n ground = (\n <SvgImage\n href={{ uri: page.src }}\n x={0}\n y={0}\n width={W}\n height={H}\n preserveAspectRatio=\"xMidYMid slice\"\n onLoad={onLoad}\n />\n );\n } else if (bg?.kind === 'image' && bg.src) {\n ground = (\n <SvgImage\n href={{ uri: bg.src }}\n x={0}\n y={0}\n width={W}\n height={H}\n preserveAspectRatio=\"xMidYMid slice\"\n onLoad={onLoad}\n />\n );\n } else if (bg?.kind === 'gradient' && bg.from && bg.to) {\n const [x1, y1, x2, y2] = gradientLine(0, 0, W, H, bg.angle ?? 180);\n ground = (\n <G>\n <Defs>\n <LinearGradient id=\"page-bg\" gradientUnits=\"userSpaceOnUse\" x1={x1} y1={y1} x2={x2} y2={y2}>\n <Stop offset=\"0\" stopColor={bg.from} />\n <Stop offset=\"1\" stopColor={bg.to} />\n </LinearGradient>\n </Defs>\n <Rect x={0} y={0} width={W} height={H} fill=\"url(#page-bg)\" />\n </G>\n );\n } else if (bg) {\n ground = <Rect x={0} y={0} width={W} height={H} fill={bg.color || '#ffffff'} />;\n }\n return (\n <G>\n <Rect x={0} y={0} width={W} height={H} fill=\"#ffffff\" />\n {ground}\n {(page.layers ?? []).map((layer) => (\n <LayerG\n key={layer.id}\n svg={svg}\n layer={layer}\n W={W}\n H={H}\n fontPair={doc.fontPair}\n lines={lines[layer.id]}\n curve={curves[layer.id]}\n onLoad={onLoad}\n />\n ))}\n </G>\n );\n}\n\nfunction LayerG({\n svg,\n layer,\n W,\n H,\n fontPair,\n lines,\n curve,\n onLoad,\n}: {\n svg: SvgModule;\n layer: EditorLayer;\n W: number;\n H: number;\n fontPair?: DesignFontPair;\n lines?: MeasuredLine[];\n curve?: MeasuredCurve;\n onLoad?: () => void;\n}) {\n const bw = layer.w * W;\n let bh = layer.h * H;\n let body: React.ReactNode = null;\n if (layer.kind === 'text') {\n if (!lines && !curve) return null;\n const textH = lines ? lines.reduce((m, l) => Math.max(m, l.y + l.height), 0) : 0;\n bh = Math.max(bh, textH);\n body = textSvg(svg, layer, lines ?? [], W, fontPair, layer.curve ? curve : null);\n } else if (layer.kind === 'shape') body = shapeSvg(svg, layer, bw, bh, W);\n else if (layer.kind === 'image') body = imageSvg(svg, layer, bw, bh, W, onLoad);\n else if (layer.kind === 'chart') body = chartSvg(svg, layer, bw, bh);\n const turn = layer.rotation || layer.flipX || layer.flipY;\n const transform =\n `translate(${layer.x * W}, ${layer.y * H})` +\n (turn\n ? ` translate(${bw / 2}, ${bh / 2}) rotate(${layer.rotation ?? 0}) scale(${layer.flipX ? -1 : 1}, ${layer.flipY ? -1 : 1}) translate(${-bw / 2}, ${-bh / 2})`\n : '');\n return (\n <svg.G transform={transform} opacity={layer.opacity ?? 1}>\n {body}\n </svg.G>\n );\n}\n\nexport const PageCapture = forwardRef<PageCaptureHandle, { doc: DesignDoc }>(function PageCapture({ doc }, ref) {\n const queue = useRef<Job[]>([]);\n const seq = useRef(0);\n const [job, setJob] = useState<Job | null>(null);\n const next = useCallback(() => setJob(queue.current.shift() ?? null), []);\n\n useImperativeHandle(\n ref,\n () => ({\n capture: (page, pixelWidth) =>\n new Promise<string>((resolve, reject) => {\n if (!getSvg()) {\n reject(new Error('Drawing is not available in this version of the app.'));\n return;\n }\n seq.current += 1;\n queue.current.push({ id: seq.current, page, pixelWidth, resolve, reject });\n setJob((current) => current ?? queue.current.shift() ?? null);\n }),\n captureSvg: (render, width, height, pixelWidth) =>\n new Promise<string>((resolve, reject) => {\n if (!getSvg()) {\n reject(new Error('Drawing is not available in this version of the app.'));\n return;\n }\n seq.current += 1;\n const page: DesignPage = {\n id: `svg-${seq.current}`,\n prompt: '',\n src: null,\n status: 'ready',\n layers: [],\n };\n queue.current.push({\n id: seq.current,\n page,\n pixelWidth,\n resolve,\n reject,\n draw: { render, width, height },\n });\n setJob((current) => current ?? queue.current.shift() ?? null);\n }),\n }),\n [],\n );\n\n if (!job) return null;\n const settle = (b64: string | null, err?: Error) => {\n if (b64) job.resolve(b64);\n else job.reject(err ?? new Error('The page could not be drawn.'));\n next();\n };\n if (job.draw) return <DrawJob key={job.id} job={job} onDone={settle} />;\n return <CaptureJob key={job.id} doc={doc} job={job} onDone={settle} />;\n});\n\ntype SvgViewRef = { toDataURL: (cb: (b64: string) => void, opts?: object) => void } | null;\n\n/** Rasterise a mounted svg at `px` wide (iOS draws at the screen's scale; Android the pixels asked for). */\nfunction rasterise(view: SvgViewRef, px: number, aspect: number, done: (b64: string | null, err?: Error) => void) {\n if (!view?.toDataURL) {\n done(null, new Error('Drawing is not available in this version of the app.'));\n return;\n }\n const w = Math.max(1, Math.round(px));\n const h = Math.max(1, Math.round(w * aspect));\n const k = Platform.OS === 'ios' ? PixelRatio.get() : 1;\n try {\n view.toDataURL((b64) => done(b64 || null), {\n width: Math.max(1, Math.round(w / k)),\n height: Math.max(1, Math.round(h / k)),\n });\n } catch (err) {\n done(null, err instanceof Error ? err : new Error(String(err)));\n }\n}\n\nfunction DrawJob({ job, onDone }: { job: Job; onDone: (b64: string | null, err?: Error) => void }) {\n const svg = getSvg()!;\n const ref = useRef<SvgViewRef>(null);\n const draw = job.draw!;\n const finish = useRef(onDone);\n finish.current = onDone;\n useEffect(() => {\n let fired = false;\n const raf = requestAnimationFrame(() =>\n requestAnimationFrame(() =>\n rasterise(ref.current, job.pixelWidth, draw.height / draw.width, (b64, err) => {\n if (fired) return;\n fired = true;\n finish.current(b64, err);\n }),\n ),\n );\n return () => cancelAnimationFrame(raf);\n }, [job.pixelWidth, draw.height, draw.width]);\n return (\n <View pointerEvents=\"none\" style={styles.offscreen} collapsable={false}>\n <svg.Svg\n ref={ref as never}\n width={120}\n height={(120 * draw.height) / draw.width}\n viewBox={`0 0 ${draw.width} ${draw.height}`}\n >\n {draw.render(svg)}\n </svg.Svg>\n </View>\n );\n}\n\nfunction CaptureJob({\n doc,\n job,\n onDone,\n}: {\n doc: DesignDoc;\n job: Job;\n onDone: (b64: string | null, err?: Error) => void;\n}) {\n const svg = getSvg()!;\n const { page } = job;\n const W = doc.pageWidth;\n const H = doc.pageHeight;\n const texts = useMemo(() => (page.layers ?? []).filter((l): l is TextLayer => l.kind === 'text'), [page]);\n const faces = useMemo(() => facesUsed(page, doc.fontPair), [page, doc.fontPair]);\n useDesignFonts(faces);\n const [lines, setLines] = useState<Record<string, MeasuredLine[]>>({});\n const [curves, setCurves] = useState<Record<string, MeasuredCurve>>({});\n const measured = texts.every((t) => (t.curve ? curves[t.id] : lines[t.id]));\n const pictures = useMemo(() => pictureCount(page), [page]);\n const loaded = useRef(0);\n const [picturesReady, setPicturesReady] = useState(pictures === 0);\n const svgRef = useRef<SvgViewRef>(null);\n const done = useRef(false);\n const finish = useRef(onDone);\n finish.current = onDone;\n\n const onLoad = useCallback(() => {\n loaded.current += 1;\n if (loaded.current >= pictures) setPicturesReady(true);\n }, [pictures]);\n\n useEffect(() => {\n if (!measured || picturesReady) return undefined;\n const t = setTimeout(() => setPicturesReady(true), IMAGE_WAIT_MS);\n return () => clearTimeout(t);\n }, [measured, picturesReady]);\n\n // A layout that never reports (a broken face) still ends the capture.\n useEffect(() => {\n const t = setTimeout(() => {\n if (!done.current) {\n done.current = true;\n finish.current(null, new Error('The page took too long to draw.'));\n }\n }, IMAGE_WAIT_MS + 20_000);\n return () => clearTimeout(t);\n }, []);\n\n useEffect(() => {\n if (!measured || !picturesReady || done.current) return undefined;\n let cancelled = false;\n // Two frames: the svg has committed its last image before it is drawn.\n const raf = requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n if (cancelled || done.current) return;\n rasterise(svgRef.current, job.pixelWidth, H / W, (b64, err) => {\n if (done.current) return;\n done.current = true;\n finish.current(b64, err);\n });\n }),\n );\n return () => {\n cancelled = true;\n cancelAnimationFrame(raf);\n };\n }, [measured, picturesReady, job.pixelWidth, W, H]);\n\n const viewW = 120;\n const viewH = (viewW * H) / W;\n return (\n <View pointerEvents=\"none\" style={[styles.offscreen, { width: W, height: H }]} collapsable={false}>\n {texts.map((t) =>\n t.curve ? (\n <CurveMeasure\n key={t.id}\n layer={t}\n W={W}\n fontPair={doc.fontPair}\n onCurve={(c) => setCurves((m) => (m[t.id] ? m : { ...m, [t.id]: c }))}\n />\n ) : (\n <LineMeasure\n key={t.id}\n layer={t}\n W={W}\n fontPair={doc.fontPair}\n absolute\n onLines={(l) => setLines((m) => (m[t.id] ? m : { ...m, [t.id]: l }))}\n />\n ),\n )}\n {measured ? (\n <svg.Svg\n ref={svgRef as never}\n width={viewW}\n height={viewH}\n viewBox={`0 0 ${W} ${H}`}\n preserveAspectRatio=\"none\"\n style={styles.svg}\n >\n {pageSvg(svg, doc, page, lines, curves, onLoad)}\n </svg.Svg>\n ) : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n offscreen: { position: 'absolute', left: -100000, top: 0, opacity: 1 },\n svg: { position: 'absolute', left: 0, top: 0 },\n});\n"],"names":["PageCapture"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PageCapture.js","sources":["../../../../src/features/design/render/PageCapture.tsx"],"sourcesContent":["/**\n * A design page as a PNG, made on the phone - the native twin of web's\n * `utils/exporter.ts` (which re-composes a page on an OffscreenCanvas).\n *\n * The app ships no view snapshotter, so the page is re-composed as ONE\n * react-native-svg drawing at page size (background, shapes, charts,\n * pictures, text) and that svg rasterises itself (`toDataURL`). Text lines\n * come from a hidden RN layout of each text layer first (render/TextMeasure),\n * so the words wrap exactly where the canvas wraps them; the capture waits for\n * every picture to load before it draws.\n *\n * Mounted once, off screen, by the editor; `capture(page, px)` queues a page.\n */\nimport React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';\nimport { PixelRatio, Platform, StyleSheet, View } from 'react-native';\nimport { gradientLine } from '../doc/shapes';\nimport { facesUsed } from '../doc/textLayout';\nimport type { DesignDoc, DesignFontPair, DesignPage, EditorLayer, TextLayer } from '../doc/types';\nimport { useDesignFonts } from './fontRegistry';\nimport {\n chartSvg,\n imageSvg,\n shapeSvg,\n textSvg,\n type MeasuredCurve,\n type MeasuredLine,\n type SvgModule,\n} from './svgParts';\nimport { getSvg } from './svg';\nimport { CurveMeasure, LineMeasure } from './TextMeasure';\n\nexport interface PageCaptureHandle {\n /**\n * The page as a base64 PNG `pixelWidth` wide (height by the page's proportions);\n * `transparent` leaves the page background out (web's transparent PNG).\n */\n capture: (page: DesignPage, pixelWidth: number, opts?: { transparent?: boolean }) => Promise<string>;\n /** Any svg drawing (`width` x `height` user units) as a base64 PNG `pixelWidth` wide - a QR code. */\n captureSvg: (\n render: (svg: SvgModule) => React.ReactElement,\n width: number,\n height: number,\n pixelWidth: number,\n ) => Promise<string>;\n}\n\ninterface Job {\n id: number;\n page: DesignPage;\n pixelWidth: number;\n transparent?: boolean;\n draw?: { render: (svg: SvgModule) => React.ReactElement; width: number; height: number };\n resolve: (b64: string) => void;\n reject: (err: Error) => void;\n}\n\n/** How long a capture waits for its pictures before drawing what it has. */\nconst IMAGE_WAIT_MS = 10_000;\n\nfunction pictureCount(page: DesignPage, transparent = false): number {\n let n = 0;\n // A transparent capture draws no ground, so its picture never loads.\n if (!transparent && page.src && !page.layers?.length) n += 1;\n else if (!transparent && page.background?.kind === 'image' && page.background.src) n += 1;\n for (const l of page.layers ?? []) if (l.kind === 'image' && l.src) n += 1;\n return n;\n}\n\n/** The whole page as svg elements, in page px. */\nexport function pageSvg(\n svg: SvgModule,\n doc: Pick<DesignDoc, 'pageWidth' | 'pageHeight' | 'fontPair'>,\n page: DesignPage,\n lines: Record<string, MeasuredLine[]>,\n curves: Record<string, MeasuredCurve>,\n onLoad?: () => void,\n transparent = false,\n): React.ReactElement {\n const { G, Rect, Defs, LinearGradient, Stop, Image: SvgImage } = svg;\n const W = doc.pageWidth;\n const H = doc.pageHeight;\n const bg = page.background;\n let ground: React.ReactNode = <Rect x={0} y={0} width={W} height={H} fill=\"#ffffff\" />;\n if (page.src && !page.layers?.length) {\n ground = (\n <SvgImage\n href={{ uri: page.src }}\n x={0}\n y={0}\n width={W}\n height={H}\n preserveAspectRatio=\"xMidYMid slice\"\n onLoad={onLoad}\n />\n );\n } else if (bg?.kind === 'image' && bg.src) {\n ground = (\n <SvgImage\n href={{ uri: bg.src }}\n x={0}\n y={0}\n width={W}\n height={H}\n preserveAspectRatio=\"xMidYMid slice\"\n onLoad={onLoad}\n />\n );\n } else if (bg?.kind === 'gradient' && bg.from && bg.to) {\n const [x1, y1, x2, y2] = gradientLine(0, 0, W, H, bg.angle ?? 180);\n ground = (\n <G>\n <Defs>\n <LinearGradient id=\"page-bg\" gradientUnits=\"userSpaceOnUse\" x1={x1} y1={y1} x2={x2} y2={y2}>\n <Stop offset=\"0\" stopColor={bg.from} />\n <Stop offset=\"1\" stopColor={bg.to} />\n </LinearGradient>\n </Defs>\n <Rect x={0} y={0} width={W} height={H} fill=\"url(#page-bg)\" />\n </G>\n );\n } else if (bg) {\n ground = <Rect x={0} y={0} width={W} height={H} fill={bg.color || '#ffffff'} />;\n }\n return (\n <G>\n {transparent ? null : <Rect x={0} y={0} width={W} height={H} fill=\"#ffffff\" />}\n {transparent ? null : ground}\n {(page.layers ?? []).map((layer) => (\n <LayerG\n key={layer.id}\n svg={svg}\n layer={layer}\n W={W}\n H={H}\n fontPair={doc.fontPair}\n lines={lines[layer.id]}\n curve={curves[layer.id]}\n onLoad={onLoad}\n />\n ))}\n </G>\n );\n}\n\nfunction LayerG({\n svg,\n layer,\n W,\n H,\n fontPair,\n lines,\n curve,\n onLoad,\n}: {\n svg: SvgModule;\n layer: EditorLayer;\n W: number;\n H: number;\n fontPair?: DesignFontPair;\n lines?: MeasuredLine[];\n curve?: MeasuredCurve;\n onLoad?: () => void;\n}) {\n const bw = layer.w * W;\n let bh = layer.h * H;\n let body: React.ReactNode = null;\n if (layer.kind === 'text') {\n if (!lines && !curve) return null;\n const textH = lines ? lines.reduce((m, l) => Math.max(m, l.y + l.height), 0) : 0;\n bh = Math.max(bh, textH);\n body = textSvg(svg, layer, lines ?? [], W, fontPair, layer.curve ? curve : null);\n } else if (layer.kind === 'shape') body = shapeSvg(svg, layer, bw, bh, W);\n else if (layer.kind === 'image') body = imageSvg(svg, layer, bw, bh, W, onLoad);\n else if (layer.kind === 'chart') body = chartSvg(svg, layer, bw, bh);\n const turn = layer.rotation || layer.flipX || layer.flipY;\n const transform =\n `translate(${layer.x * W}, ${layer.y * H})` +\n (turn\n ? ` translate(${bw / 2}, ${bh / 2}) rotate(${layer.rotation ?? 0}) scale(${layer.flipX ? -1 : 1}, ${layer.flipY ? -1 : 1}) translate(${-bw / 2}, ${-bh / 2})`\n : '');\n return (\n <svg.G transform={transform} opacity={layer.opacity ?? 1}>\n {body}\n </svg.G>\n );\n}\n\nexport const PageCapture = forwardRef<PageCaptureHandle, { doc: DesignDoc }>(function PageCapture({ doc }, ref) {\n const queue = useRef<Job[]>([]);\n const seq = useRef(0);\n const [job, setJob] = useState<Job | null>(null);\n const next = useCallback(() => setJob(queue.current.shift() ?? null), []);\n\n useImperativeHandle(\n ref,\n () => ({\n capture: (page, pixelWidth, opts) =>\n new Promise<string>((resolve, reject) => {\n if (!getSvg()) {\n reject(new Error('Drawing is not available in this version of the app.'));\n return;\n }\n seq.current += 1;\n queue.current.push({\n id: seq.current,\n page,\n pixelWidth,\n transparent: opts?.transparent,\n resolve,\n reject,\n });\n setJob((current) => current ?? queue.current.shift() ?? null);\n }),\n captureSvg: (render, width, height, pixelWidth) =>\n new Promise<string>((resolve, reject) => {\n if (!getSvg()) {\n reject(new Error('Drawing is not available in this version of the app.'));\n return;\n }\n seq.current += 1;\n const page: DesignPage = {\n id: `svg-${seq.current}`,\n prompt: '',\n src: null,\n status: 'ready',\n layers: [],\n };\n queue.current.push({\n id: seq.current,\n page,\n pixelWidth,\n resolve,\n reject,\n draw: { render, width, height },\n });\n setJob((current) => current ?? queue.current.shift() ?? null);\n }),\n }),\n [],\n );\n\n if (!job) return null;\n const settle = (b64: string | null, err?: Error) => {\n if (b64) job.resolve(b64);\n else job.reject(err ?? new Error('The page could not be drawn.'));\n next();\n };\n if (job.draw) return <DrawJob key={job.id} job={job} onDone={settle} />;\n return <CaptureJob key={job.id} doc={doc} job={job} onDone={settle} />;\n});\n\ntype SvgViewRef = { toDataURL: (cb: (b64: string) => void, opts?: object) => void } | null;\n\n/** Rasterise a mounted svg at `px` wide (iOS draws at the screen's scale; Android the pixels asked for). */\nfunction rasterise(view: SvgViewRef, px: number, aspect: number, done: (b64: string | null, err?: Error) => void) {\n if (!view?.toDataURL) {\n done(null, new Error('Drawing is not available in this version of the app.'));\n return;\n }\n const w = Math.max(1, Math.round(px));\n const h = Math.max(1, Math.round(w * aspect));\n const k = Platform.OS === 'ios' ? PixelRatio.get() : 1;\n try {\n view.toDataURL((b64) => done(b64 || null), {\n width: Math.max(1, Math.round(w / k)),\n height: Math.max(1, Math.round(h / k)),\n });\n } catch (err) {\n done(null, err instanceof Error ? err : new Error(String(err)));\n }\n}\n\nfunction DrawJob({ job, onDone }: { job: Job; onDone: (b64: string | null, err?: Error) => void }) {\n const svg = getSvg()!;\n const ref = useRef<SvgViewRef>(null);\n const draw = job.draw!;\n const finish = useRef(onDone);\n finish.current = onDone;\n useEffect(() => {\n let fired = false;\n const raf = requestAnimationFrame(() =>\n requestAnimationFrame(() =>\n rasterise(ref.current, job.pixelWidth, draw.height / draw.width, (b64, err) => {\n if (fired) return;\n fired = true;\n finish.current(b64, err);\n }),\n ),\n );\n return () => cancelAnimationFrame(raf);\n }, [job.pixelWidth, draw.height, draw.width]);\n return (\n <View pointerEvents=\"none\" style={styles.offscreen} collapsable={false}>\n <svg.Svg\n ref={ref as never}\n width={120}\n height={(120 * draw.height) / draw.width}\n viewBox={`0 0 ${draw.width} ${draw.height}`}\n >\n {draw.render(svg)}\n </svg.Svg>\n </View>\n );\n}\n\nfunction CaptureJob({\n doc,\n job,\n onDone,\n}: {\n doc: DesignDoc;\n job: Job;\n onDone: (b64: string | null, err?: Error) => void;\n}) {\n const svg = getSvg()!;\n const { page } = job;\n const W = doc.pageWidth;\n const H = doc.pageHeight;\n const texts = useMemo(() => (page.layers ?? []).filter((l): l is TextLayer => l.kind === 'text'), [page]);\n const faces = useMemo(() => facesUsed(page, doc.fontPair), [page, doc.fontPair]);\n useDesignFonts(faces, doc.fonts);\n const [lines, setLines] = useState<Record<string, MeasuredLine[]>>({});\n const [curves, setCurves] = useState<Record<string, MeasuredCurve>>({});\n const measured = texts.every((t) => (t.curve ? curves[t.id] : lines[t.id]));\n const pictures = useMemo(() => pictureCount(page, job.transparent), [page, job.transparent]);\n const loaded = useRef(0);\n const [picturesReady, setPicturesReady] = useState(pictures === 0);\n const svgRef = useRef<SvgViewRef>(null);\n const done = useRef(false);\n const finish = useRef(onDone);\n finish.current = onDone;\n\n const onLoad = useCallback(() => {\n loaded.current += 1;\n if (loaded.current >= pictures) setPicturesReady(true);\n }, [pictures]);\n\n useEffect(() => {\n if (!measured || picturesReady) return undefined;\n const t = setTimeout(() => setPicturesReady(true), IMAGE_WAIT_MS);\n return () => clearTimeout(t);\n }, [measured, picturesReady]);\n\n // A layout that never reports (a broken face) still ends the capture.\n useEffect(() => {\n const t = setTimeout(() => {\n if (!done.current) {\n done.current = true;\n finish.current(null, new Error('The page took too long to draw.'));\n }\n }, IMAGE_WAIT_MS + 20_000);\n return () => clearTimeout(t);\n }, []);\n\n useEffect(() => {\n if (!measured || !picturesReady || done.current) return undefined;\n let cancelled = false;\n // Two frames: the svg has committed its last image before it is drawn.\n const raf = requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n if (cancelled || done.current) return;\n rasterise(svgRef.current, job.pixelWidth, H / W, (b64, err) => {\n if (done.current) return;\n done.current = true;\n finish.current(b64, err);\n });\n }),\n );\n return () => {\n cancelled = true;\n cancelAnimationFrame(raf);\n };\n }, [measured, picturesReady, job.pixelWidth, W, H]);\n\n const viewW = 120;\n const viewH = (viewW * H) / W;\n return (\n <View pointerEvents=\"none\" style={[styles.offscreen, { width: W, height: H }]} collapsable={false}>\n {texts.map((t) =>\n t.curve ? (\n <CurveMeasure\n key={t.id}\n layer={t}\n W={W}\n fontPair={doc.fontPair}\n onCurve={(c) => setCurves((m) => (m[t.id] ? m : { ...m, [t.id]: c }))}\n />\n ) : (\n <LineMeasure\n key={t.id}\n layer={t}\n W={W}\n fontPair={doc.fontPair}\n absolute\n onLines={(l) => setLines((m) => (m[t.id] ? m : { ...m, [t.id]: l }))}\n />\n ),\n )}\n {measured ? (\n <svg.Svg\n ref={svgRef as never}\n width={viewW}\n height={viewH}\n viewBox={`0 0 ${W} ${H}`}\n preserveAspectRatio=\"none\"\n style={styles.svg}\n >\n {pageSvg(svg, doc, page, lines, curves, onLoad, job.transparent)}\n </svg.Svg>\n ) : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n offscreen: { position: 'absolute', left: -100000, top: 0, opacity: 1 },\n svg: { position: 'absolute', left: 0, top: 0 },\n});\n"],"names":["PageCapture"],"mappings":"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"}
|
|
@@ -39,6 +39,28 @@ function bump() {
|
|
|
39
39
|
version += 1;
|
|
40
40
|
for (const listener of listeners) listener();
|
|
41
41
|
}
|
|
42
|
+
function registerUploadedFonts(fonts) {
|
|
43
|
+
var _a, _b, _c, _d, _e;
|
|
44
|
+
if (!(fonts == null ? void 0 : fonts.length)) return;
|
|
45
|
+
const byFamily = /* @__PURE__ */ new Map();
|
|
46
|
+
for (const f of fonts) {
|
|
47
|
+
const family = (_a = f.family) == null ? void 0 : _a.trim();
|
|
48
|
+
if (!family || !/^https?:\/\//i.test((_b = f.url) != null ? _b : "")) continue;
|
|
49
|
+
const list = (_c = byFamily.get(family)) != null ? _c : [];
|
|
50
|
+
if (!list.some((x) => x.url === f.url)) list.push({
|
|
51
|
+
weight: (_d = f.weight) != null ? _d : 400,
|
|
52
|
+
italic: Boolean(f.italic),
|
|
53
|
+
url: f.url
|
|
54
|
+
});
|
|
55
|
+
byFamily.set(family, list);
|
|
56
|
+
}
|
|
57
|
+
for (const [family, faces] of byFamily) {
|
|
58
|
+
const known = (_e = knownFaces.get(family)) != null ? _e : [];
|
|
59
|
+
const merged = [...faces, ...known.filter((k) => !faces.some((f) => f.weight === k.weight && f.italic === k.italic))];
|
|
60
|
+
knownFaces.set(family, merged);
|
|
61
|
+
familyFaces.set(family, Promise.resolve(merged));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
42
64
|
function readFamily(family) {
|
|
43
65
|
const hit = familyFaces.get(family);
|
|
44
66
|
if (hit) return hit;
|
|
@@ -94,7 +116,7 @@ function resolveTextFont(family, weight, italic) {
|
|
|
94
116
|
fontStyle: "italic"
|
|
95
117
|
} : {});
|
|
96
118
|
}
|
|
97
|
-
function useDesignFonts(requests) {
|
|
119
|
+
function useDesignFonts(requests, uploaded) {
|
|
98
120
|
const [, rerender] = useReducer((n) => n + 1, 0);
|
|
99
121
|
useEffect(() => {
|
|
100
122
|
listeners.add(rerender);
|
|
@@ -103,8 +125,10 @@ function useDesignFonts(requests) {
|
|
|
103
125
|
};
|
|
104
126
|
}, []);
|
|
105
127
|
const key = requests.map((r) => `${r.family}|${r.weight}|${r.italic ? 1 : 0}`).join(",");
|
|
128
|
+
const uploadedKey = (uploaded != null ? uploaded : []).map((f) => f.url).join(",");
|
|
106
129
|
useEffect(() => {
|
|
130
|
+
registerUploadedFonts(uploaded);
|
|
107
131
|
for (const r of requests) void requestFace(r.family, r.weight, r.italic);
|
|
108
|
-
}, [key]);
|
|
132
|
+
}, [key, uploadedKey]);
|
|
109
133
|
return version;
|
|
110
|
-
}export{requestFace,resolveTextFont,useDesignFonts};//# sourceMappingURL=fontRegistry.js.map
|
|
134
|
+
}export{registerUploadedFonts,requestFace,resolveTextFont,useDesignFonts};//# sourceMappingURL=fontRegistry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fontRegistry.js","sources":["../../../../src/features/design/render/fontRegistry.ts"],"sourcesContent":["/**\n * Real faces for text layers, loaded on demand (see doc/fonts.ts for why).\n *\n * A family's Google stylesheet is read once; then only the faces a design\n * actually draws (its weights and postures) are downloaded and registered\n * through expo-font, each under its own alias. Until a face lands - or for a\n * family Google does not host - the layer draws in the closest device family,\n * and every subscribed page re-renders when a face arrives.\n *\n * expo-font is required lazily: a remote must never fail to open a design\n * because a font could not load.\n */\nimport { useEffect, useReducer } from 'react';\nimport { Platform, type TextStyle } from 'react-native';\nimport {\n faceAlias,\n googleFontCssUrl,\n nearestFace,\n parseGoogleFontCss,\n rnWeight,\n systemFontFor,\n type FontFace,\n} from '../doc/fonts';\n\ntype FontModule = { loadAsync: (map: Record<string, string>) => Promise<void> };\n\nlet fontModule: FontModule | null | undefined;\n\nfunction getFontModule(): FontModule | null {\n if (fontModule === undefined) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires, global-require\n fontModule = require('expo-font') as FontModule;\n } catch {\n fontModule = null;\n }\n }\n return fontModule;\n}\n\nconst platform = Platform.OS === 'android' ? 'android' : 'ios';\n\n/** Families the device already draws as themselves: nothing to fetch. */\nconst NEVER_FETCH =\n /^(system|sans-serif|serif|monospace|arial|helvetica( neue)?|georgia|times new roman|courier new|verdana|trebuchet ms|impact|comic sans ms|palatino|garamond)$/i;\n\nconst familyFaces = new Map<string, Promise<FontFace[]>>();\nconst knownFaces = new Map<string, FontFace[]>();\nconst faceState = new Map<string, 'loading' | 'ready' | 'failed'>();\n\nlet version = 0;\nconst listeners = new Set<() => void>();\n\nfunction bump(): void {\n version += 1;\n for (const listener of listeners) listener();\n}\n\nfunction readFamily(family: string): Promise<FontFace[]> {\n const hit = familyFaces.get(family);\n if (hit) return hit;\n const read = fetch(googleFontCssUrl(family), { headers: { 'user-agent': 'yantra-design/1' } })\n .then((res) => (res.ok ? res.text() : ''))\n .then((css) => parseGoogleFontCss(css))\n .catch(() => [] as FontFace[]);\n familyFaces.set(family, read);\n void read.then((faces) => knownFaces.set(family, faces));\n return read;\n}\n\n/** Ask for one face; resolves once it is drawable (or will never be). */\nexport async function requestFace(family: string, weight: number, italic: boolean): Promise<void> {\n const name = family.trim();\n if (!name || NEVER_FETCH.test(name)) return;\n const loader = getFontModule();\n if (!loader) return;\n const faces = await readFamily(name);\n const face = nearestFace(faces, weight, italic);\n if (!face) return;\n const alias = faceAlias(name, face.weight, face.italic);\n if (faceState.has(alias)) return;\n faceState.set(alias, 'loading');\n try {\n await loader.loadAsync({ [alias]: face.url });\n faceState.set(alias, 'ready');\n } catch {\n faceState.set(alias, 'failed');\n }\n bump();\n}\n\n/** The RN text style for a family at a weight and posture: the loaded face, else the device's closest. */\nexport function resolveTextFont(\n family: string | undefined,\n weight: number | undefined,\n italic: boolean | undefined,\n): Pick<TextStyle, 'fontFamily' | 'fontWeight' | 'fontStyle'> {\n const name = (family ?? '').trim();\n const faces = name ? knownFaces.get(name) : undefined;\n const face = faces ? nearestFace(faces, weight ?? 400, Boolean(italic)) : undefined;\n if (face && faceState.get(faceAlias(name, face.weight, face.italic)) === 'ready') {\n return {\n fontFamily: faceAlias(name, face.weight, face.italic),\n // The alias IS the weight; asking the platform to embolden it again would double it.\n fontWeight: 'normal',\n ...(italic && !face.italic ? { fontStyle: 'italic' as const } : {}),\n };\n }\n const fallback = systemFontFor(name, platform);\n return {\n ...(fallback ? { fontFamily: fallback } : {}),\n fontWeight: rnWeight(weight),\n ...(italic ? { fontStyle: 'italic' as const } : {}),\n };\n}\n\nexport interface FaceRequest {\n family: string;\n weight: number;\n italic: boolean;\n}\n\n/** Load these faces, and re-render the caller whenever any face lands. */\nexport function useDesignFonts(requests: readonly FaceRequest[]): number {\n const [, rerender] = useReducer((n: number) => n + 1, 0);\n useEffect(() => {\n listeners.add(rerender);\n return () => {\n listeners.delete(rerender);\n };\n }, []);\n const key = requests.map((r) => `${r.family}|${r.weight}|${r.italic ? 1 : 0}`).join(',');\n useEffect(() => {\n for (const r of requests) void requestFace(r.family, r.weight, r.italic);\n // `key` stands for `requests`: a new array with the same faces asks for nothing new.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key]);\n return version;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fontRegistry.js","sources":["../../../../src/features/design/render/fontRegistry.ts"],"sourcesContent":["/**\n * Real faces for text layers, loaded on demand (see doc/fonts.ts for why).\n *\n * A family's Google stylesheet is read once; then only the faces a design\n * actually draws (its weights and postures) are downloaded and registered\n * through expo-font, each under its own alias. Until a face lands - or for a\n * family Google does not host - the layer draws in the closest device family,\n * and every subscribed page re-renders when a face arrives. A design's own\n * uploaded fonts (`doc.fonts`, web font upload) are faces too, read from their\n * hosted files instead of Google.\n *\n * expo-font is required lazily: a remote must never fail to open a design\n * because a font could not load.\n */\nimport { useEffect, useReducer } from 'react';\nimport { Platform, type TextStyle } from 'react-native';\nimport {\n faceAlias,\n googleFontCssUrl,\n nearestFace,\n parseGoogleFontCss,\n rnWeight,\n systemFontFor,\n type FontFace,\n} from '../doc/fonts';\n\ntype FontModule = { loadAsync: (map: Record<string, string>) => Promise<void> };\n\nlet fontModule: FontModule | null | undefined;\n\nfunction getFontModule(): FontModule | null {\n if (fontModule === undefined) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires, global-require\n fontModule = require('expo-font') as FontModule;\n } catch {\n fontModule = null;\n }\n }\n return fontModule;\n}\n\nconst platform = Platform.OS === 'android' ? 'android' : 'ios';\n\n/** Families the device already draws as themselves: nothing to fetch. */\nconst NEVER_FETCH =\n /^(system|sans-serif|serif|monospace|arial|helvetica( neue)?|georgia|times new roman|courier new|verdana|trebuchet ms|impact|comic sans ms|palatino|garamond)$/i;\n\nconst familyFaces = new Map<string, Promise<FontFace[]>>();\nconst knownFaces = new Map<string, FontFace[]>();\nconst faceState = new Map<string, 'loading' | 'ready' | 'failed'>();\n\nlet version = 0;\nconst listeners = new Set<() => void>();\n\nfunction bump(): void {\n version += 1;\n for (const listener of listeners) listener();\n}\n\n/** A design's uploaded faces (web UploadedFont), registered before Google is asked. */\nexport function registerUploadedFonts(\n fonts: ReadonlyArray<{ family: string; url: string; weight?: number; italic?: boolean }> | undefined,\n): void {\n if (!fonts?.length) return;\n const byFamily = new Map<string, FontFace[]>();\n for (const f of fonts) {\n const family = f.family?.trim();\n if (!family || !/^https?:\\/\\//i.test(f.url ?? '')) continue;\n const list = byFamily.get(family) ?? [];\n if (!list.some((x) => x.url === f.url))\n list.push({ weight: f.weight ?? 400, italic: Boolean(f.italic), url: f.url });\n byFamily.set(family, list);\n }\n for (const [family, faces] of byFamily) {\n const known = knownFaces.get(family) ?? [];\n const merged = [\n ...faces,\n ...known.filter((k) => !faces.some((f) => f.weight === k.weight && f.italic === k.italic)),\n ];\n knownFaces.set(family, merged);\n familyFaces.set(family, Promise.resolve(merged));\n }\n}\n\nfunction readFamily(family: string): Promise<FontFace[]> {\n const hit = familyFaces.get(family);\n if (hit) return hit;\n const read = fetch(googleFontCssUrl(family), { headers: { 'user-agent': 'yantra-design/1' } })\n .then((res) => (res.ok ? res.text() : ''))\n .then((css) => parseGoogleFontCss(css))\n .catch(() => [] as FontFace[]);\n familyFaces.set(family, read);\n void read.then((faces) => knownFaces.set(family, faces));\n return read;\n}\n\n/** Ask for one face; resolves once it is drawable (or will never be). */\nexport async function requestFace(family: string, weight: number, italic: boolean): Promise<void> {\n const name = family.trim();\n if (!name || NEVER_FETCH.test(name)) return;\n const loader = getFontModule();\n if (!loader) return;\n const faces = await readFamily(name);\n const face = nearestFace(faces, weight, italic);\n if (!face) return;\n const alias = faceAlias(name, face.weight, face.italic);\n if (faceState.has(alias)) return;\n faceState.set(alias, 'loading');\n try {\n await loader.loadAsync({ [alias]: face.url });\n faceState.set(alias, 'ready');\n } catch {\n faceState.set(alias, 'failed');\n }\n bump();\n}\n\n/** The RN text style for a family at a weight and posture: the loaded face, else the device's closest. */\nexport function resolveTextFont(\n family: string | undefined,\n weight: number | undefined,\n italic: boolean | undefined,\n): Pick<TextStyle, 'fontFamily' | 'fontWeight' | 'fontStyle'> {\n const name = (family ?? '').trim();\n const faces = name ? knownFaces.get(name) : undefined;\n const face = faces ? nearestFace(faces, weight ?? 400, Boolean(italic)) : undefined;\n if (face && faceState.get(faceAlias(name, face.weight, face.italic)) === 'ready') {\n return {\n fontFamily: faceAlias(name, face.weight, face.italic),\n // The alias IS the weight; asking the platform to embolden it again would double it.\n fontWeight: 'normal',\n ...(italic && !face.italic ? { fontStyle: 'italic' as const } : {}),\n };\n }\n const fallback = systemFontFor(name, platform);\n return {\n ...(fallback ? { fontFamily: fallback } : {}),\n fontWeight: rnWeight(weight),\n ...(italic ? { fontStyle: 'italic' as const } : {}),\n };\n}\n\nexport interface FaceRequest {\n family: string;\n weight: number;\n italic: boolean;\n}\n\n/** Load these faces (a design's uploaded ones first), and re-render the caller whenever any face lands. */\nexport function useDesignFonts(\n requests: readonly FaceRequest[],\n uploaded?: ReadonlyArray<{ family: string; url: string; weight?: number; italic?: boolean }>,\n): number {\n const [, rerender] = useReducer((n: number) => n + 1, 0);\n useEffect(() => {\n listeners.add(rerender);\n return () => {\n listeners.delete(rerender);\n };\n }, []);\n const key = requests.map((r) => `${r.family}|${r.weight}|${r.italic ? 1 : 0}`).join(',');\n const uploadedKey = (uploaded ?? []).map((f) => f.url).join(',');\n useEffect(() => {\n registerUploadedFonts(uploaded);\n for (const r of requests) void requestFace(r.family, r.weight, r.italic);\n // `key` stands for `requests`: a new array with the same faces asks for nothing new.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key, uploadedKey]);\n return version;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {
|
|
1
|
+
import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {chartMarks}from'../doc/chart.js';import {curveArc}from'../doc/curve.js';import {adjustColorMatrix}from'../doc/imageAdjust.js';import {scalePath}from'../doc/pathScale.js';import {gradientLine,isStrokeShape,roundRectD,shapeSpec}from'../doc/shapes.js';import {layerSpans}from'../doc/textLayout.js';import {offsetAlong,rgbaOf,GLITCH_COLORS,spliceFillOf,liftShadow,neonBlur,tintOf}from'../doc/textEffects.js';import {layerFontFamily}from'../doc/types.js';import {resolveTextFont}from'./fontRegistry.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -59,86 +59,39 @@ function shapeSvg(svg, layer, bw, bh, W) {
|
|
|
59
59
|
] });
|
|
60
60
|
}
|
|
61
61
|
function chartSvg(svg, layer, bw, bh) {
|
|
62
|
-
var _a, _b, _c, _d, _e;
|
|
63
62
|
const {
|
|
64
|
-
Rect,
|
|
65
63
|
Path,
|
|
66
|
-
|
|
64
|
+
Line,
|
|
67
65
|
G,
|
|
68
66
|
Text: SvgText,
|
|
69
67
|
Circle
|
|
70
68
|
} = svg;
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
if (layer.chart === "area") {
|
|
96
|
-
const top = tops.map((v, i) => `${i === 0 ? "M" : "L"}${x(i)} ${y(v)}`).join("");
|
|
97
|
-
const bottom = bottoms.map((v, i) => [i, v]).reverse().map(([i, v]) => `L${x(i)} ${y(v)}`).join("");
|
|
98
|
-
return /* @__PURE__ */ jsx(Path, { d: `${top}${bottom}Z`, fill: color, opacity: stacked ? 0.85 : 0.55 }, si);
|
|
99
|
-
}
|
|
100
|
-
const pts = tops.map((v, i) => `${x(i)},${y(v)}`).join(" ");
|
|
101
|
-
const sw = Math.max(1.5, ph * 0.012);
|
|
102
|
-
return /* @__PURE__ */ jsxs(G, { children: [
|
|
103
|
-
/* @__PURE__ */ jsx(Polyline, { points: pts, fill: "none", stroke: color, strokeWidth: sw, strokeLinejoin: "round", strokeLinecap: "round" }),
|
|
104
|
-
tops.map((v, i) => /* @__PURE__ */ jsx(Circle, { cx: x(i), cy: y(v), r: sw * 1.3, fill: color }, i))
|
|
105
|
-
] }, si);
|
|
106
|
-
});
|
|
107
|
-
} else {
|
|
108
|
-
const horizontal = layer.chart === "row";
|
|
109
|
-
const stacked = Boolean(layer.stacked);
|
|
110
|
-
const max = chartMax(data, stacked);
|
|
111
|
-
const band = (horizontal ? ph : bw) / n;
|
|
112
|
-
const groups = stacked ? 1 : data.series.length;
|
|
113
|
-
const barW = band * 0.7 / groups;
|
|
114
|
-
const length = horizontal ? bw : ph;
|
|
115
|
-
const rects = [];
|
|
116
|
-
for (let i = 0; i < n; i += 1) {
|
|
117
|
-
let offset = 0;
|
|
118
|
-
data.series.forEach((s, si) => {
|
|
119
|
-
var _a2;
|
|
120
|
-
const v = Math.max(0, (_a2 = s.values[i]) != null ? _a2 : 0);
|
|
121
|
-
const size = v / max * length;
|
|
122
|
-
const across = i * band + band * 0.15 + (stacked ? 0 : si * barW);
|
|
123
|
-
const along = stacked ? offset : 0;
|
|
124
|
-
offset += size;
|
|
125
|
-
const color = colors[si % colors.length];
|
|
126
|
-
rects.push(horizontal ? /* @__PURE__ */ jsx(Rect, { x: along, y: across, width: size, height: barW, fill: color }, `${i}-${si}`) : /* @__PURE__ */ jsx(Rect, { x: across, y: ph - along - size, width: barW, height: size, fill: color }, `${i}-${si}`));
|
|
127
|
-
});
|
|
69
|
+
const marks = chartMarks(layer, bw, bh);
|
|
70
|
+
if (!marks.length) return null;
|
|
71
|
+
return /* @__PURE__ */ jsx(G, { children: marks.map((m, i) => {
|
|
72
|
+
var _a;
|
|
73
|
+
switch (m.t) {
|
|
74
|
+
case "path":
|
|
75
|
+
return /* @__PURE__ */ jsx(Path, __spreadValues(__spreadValues({ d: m.d, fill: (_a = m.fill) != null ? _a : "none" }, m.stroke ? {
|
|
76
|
+
stroke: m.stroke,
|
|
77
|
+
strokeWidth: m.sw,
|
|
78
|
+
strokeLinejoin: "round",
|
|
79
|
+
strokeLinecap: "round"
|
|
80
|
+
} : {}), m.opacity !== void 0 ? {
|
|
81
|
+
opacity: m.opacity
|
|
82
|
+
} : {}), i);
|
|
83
|
+
case "line":
|
|
84
|
+
return Line ? /* @__PURE__ */ jsx(Line, { x1: m.x1, y1: m.y1, x2: m.x2, y2: m.y2, stroke: m.stroke, strokeWidth: m.sw, opacity: m.opacity }, i) : /* @__PURE__ */ jsx(Path, { d: `M${m.x1} ${m.y1}L${m.x2} ${m.y2}`, stroke: m.stroke, strokeWidth: m.sw, opacity: m.opacity }, i);
|
|
85
|
+
case "circle":
|
|
86
|
+
return /* @__PURE__ */ jsx(Circle, { cx: m.cx, cy: m.cy, r: m.r, fill: m.fill }, i);
|
|
87
|
+
case "text":
|
|
88
|
+
return /* @__PURE__ */ jsx(SvgText, __spreadProps(__spreadValues({ x: m.x, y: m.y, fontSize: m.size }, m.weight ? {
|
|
89
|
+
fontWeight: m.weight
|
|
90
|
+
} : {}), { fill: m.fill, textAnchor: m.anchor, children: m.text }), i);
|
|
91
|
+
default:
|
|
92
|
+
return null;
|
|
128
93
|
}
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
const legendFont = Math.max(6, legendH * 0.6);
|
|
132
|
-
const pie = layer.chart === "pie" || layer.chart === "donut";
|
|
133
|
-
const entries = pie ? data.categories : data.series.map((s) => s.name);
|
|
134
|
-
const slot = entries.length ? bw / entries.length : bw;
|
|
135
|
-
return /* @__PURE__ */ jsxs(G, { children: [
|
|
136
|
-
body,
|
|
137
|
-
legend ? entries.map((name, i) => /* @__PURE__ */ jsxs(G, { children: [
|
|
138
|
-
/* @__PURE__ */ jsx(Rect, { x: i * slot, y: ph + legendH * 0.3, width: legendFont * 0.8, height: legendFont * 0.8, rx: legendFont * 0.2, fill: colors[i % colors.length] }),
|
|
139
|
-
/* @__PURE__ */ jsx(SvgText, { x: i * slot + legendFont * 1.1, y: ph + legendH * 0.3 + legendFont * 0.75, fontSize: legendFont, fill: ink, children: name || `Series ${i + 1}` })
|
|
140
|
-
] }, `lg${i}`)) : null
|
|
141
|
-
] });
|
|
94
|
+
}) });
|
|
142
95
|
}
|
|
143
96
|
function croppedPlacement(bw, bh, crop) {
|
|
144
97
|
const c = crop && crop.w > 0 && crop.h > 0 ? crop : {
|