@adminide-stack/yantra-mobile 12.0.131 → 12.0.132

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.
Files changed (149) hide show
  1. package/lib/components/CustomDrawer.js +2 -2
  2. package/lib/components/CustomDrawer.js.map +1 -1
  3. package/lib/features/apps/AppsCatalog.js +7 -1
  4. package/lib/features/apps/AppsCatalog.js.map +1 -1
  5. package/lib/features/apps/nativeSurfaceTwin.js +35 -0
  6. package/lib/features/apps/nativeSurfaceTwin.js.map +1 -0
  7. package/lib/features/canvas/CanvasBoardsGrid.js +49 -49
  8. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
  9. package/lib/features/canvas/CanvasExperience.js +69 -28
  10. package/lib/features/canvas/CanvasExperience.js.map +1 -1
  11. package/lib/features/canvas/audioEditor/AudioWaveform.js +1 -1
  12. package/lib/features/canvas/designCatalog.js +63 -39
  13. package/lib/features/canvas/designCatalog.js.map +1 -1
  14. package/lib/features/canvas/designCategories.js +56 -0
  15. package/lib/features/canvas/designCategories.js.map +1 -1
  16. package/lib/features/canvas/generator/DirectorSheet.js +3 -2
  17. package/lib/features/canvas/generator/DirectorSheet.js.map +1 -1
  18. package/lib/features/canvas/home/HeroComposer.js +165 -76
  19. package/lib/features/canvas/home/HeroComposer.js.map +1 -1
  20. package/lib/features/canvas/home/HeroMonitor.js +75 -46
  21. package/lib/features/canvas/home/HeroMonitor.js.map +1 -1
  22. package/lib/features/canvas/home/TemplatesGallery.js +273 -138
  23. package/lib/features/canvas/home/TemplatesGallery.js.map +1 -1
  24. package/lib/features/canvas/home/templatesGallerySources.js +221 -0
  25. package/lib/features/canvas/home/templatesGallerySources.js.map +1 -0
  26. package/lib/features/canvas/homeWork.js +12 -11
  27. package/lib/features/canvas/homeWork.js.map +1 -1
  28. package/lib/features/canvas/lazyEditors.js +51 -0
  29. package/lib/features/canvas/lazyEditors.js.map +1 -0
  30. package/lib/features/canvas/rankedCatalogSearch.js +33 -23
  31. package/lib/features/canvas/rankedCatalogSearch.js.map +1 -1
  32. package/lib/features/canvas/set/SetViewportWebView.js +1 -1
  33. package/lib/features/canvas/set/agent/tools.js +1 -1
  34. package/lib/features/canvas/studioCatalog.js +2 -2
  35. package/lib/features/canvas/studioCatalog.js.map +1 -1
  36. package/lib/features/canvas/templateSearch.js +8 -1
  37. package/lib/features/canvas/templateSearch.js.map +1 -1
  38. package/lib/features/canvas/videoEditor/BlurBoxOverlay.js +1 -1
  39. package/lib/features/design/DesignEditorExperience.js +103 -29
  40. package/lib/features/design/DesignEditorExperience.js.map +1 -1
  41. package/lib/features/design/DesignExperience.js +4 -3
  42. package/lib/features/design/DesignExperience.js.map +1 -1
  43. package/lib/features/design/doc/aiDesign.js +1 -1
  44. package/lib/features/design/doc/aiDesign.js.map +1 -1
  45. package/lib/features/design/doc/artifacts.js +40 -13
  46. package/lib/features/design/doc/artifacts.js.map +1 -1
  47. package/lib/features/design/doc/chart.js +387 -13
  48. package/lib/features/design/doc/chart.js.map +1 -1
  49. package/lib/features/design/doc/copyStyle.js +47 -0
  50. package/lib/features/design/doc/copyStyle.js.map +1 -0
  51. package/lib/features/design/doc/docOps.js +22 -4
  52. package/lib/features/design/doc/docOps.js.map +1 -1
  53. package/lib/features/design/doc/geometry.js +32 -18
  54. package/lib/features/design/doc/geometry.js.map +1 -1
  55. package/lib/features/design/doc/newDoc.js +5 -1
  56. package/lib/features/design/doc/newDoc.js.map +1 -1
  57. package/lib/features/design/doc/resize.js +101 -0
  58. package/lib/features/design/doc/resize.js.map +1 -0
  59. package/lib/features/design/doc/sizes.js +15 -2
  60. package/lib/features/design/doc/sizes.js.map +1 -1
  61. package/lib/features/design/editor/ChartDataPanel.js +49 -9
  62. package/lib/features/design/editor/ChartDataPanel.js.map +1 -1
  63. package/lib/features/design/editor/CropOverlay.js +1 -1
  64. package/lib/features/design/editor/DesignCanvas.js +14 -13
  65. package/lib/features/design/editor/DesignCanvas.js.map +1 -1
  66. package/lib/features/design/editor/ExportSheet.js +8 -4
  67. package/lib/features/design/editor/ExportSheet.js.map +1 -1
  68. package/lib/features/design/editor/LayerTools.js +37 -5
  69. package/lib/features/design/editor/LayerTools.js.map +1 -1
  70. package/lib/features/design/editor/Slideshow.js +30 -5
  71. package/lib/features/design/editor/Slideshow.js.map +1 -1
  72. package/lib/features/design/editor/useDesignSave.js +21 -36
  73. package/lib/features/design/editor/useDesignSave.js.map +1 -1
  74. package/lib/features/design/export/exportDesign.js +3 -1
  75. package/lib/features/design/export/exportDesign.js.map +1 -1
  76. package/lib/features/design/home/DesignHome.js +7 -2
  77. package/lib/features/design/home/DesignHome.js.map +1 -1
  78. package/lib/features/design/render/DesignPageView.js +1 -1
  79. package/lib/features/design/render/DesignPageView.js.map +1 -1
  80. package/lib/features/design/render/PageCapture.js +11 -10
  81. package/lib/features/design/render/PageCapture.js.map +1 -1
  82. package/lib/features/design/render/fontRegistry.js +27 -3
  83. package/lib/features/design/render/fontRegistry.js.map +1 -1
  84. package/lib/features/design/render/svgParts.js +27 -74
  85. package/lib/features/design/render/svgParts.js.map +1 -1
  86. package/lib/features/devices/brands/qnScale.js +7 -2
  87. package/lib/features/devices/brands/qnScale.js.map +1 -1
  88. package/lib/features/devices/brands/uuids.js +2 -1
  89. package/lib/features/devices/brands/uuids.js.map +1 -1
  90. package/lib/features/devices/devices.js +2 -1
  91. package/lib/features/devices/devices.js.map +1 -1
  92. package/lib/features/docs/DocBlockRow.js +1 -1
  93. package/lib/features/docs/docArtifacts.js +2 -2
  94. package/lib/features/docs/docArtifacts.js.map +1 -1
  95. package/lib/features/health/healthSync.js +3 -1
  96. package/lib/features/health/healthSync.js.map +1 -1
  97. package/lib/features/health/nativeHealth.js +8 -0
  98. package/lib/features/health/nativeHealth.js.map +1 -0
  99. package/lib/features/links/openInApp.js +11 -1
  100. package/lib/features/links/openInApp.js.map +1 -1
  101. package/lib/features/webbuilder/WebBuilderExperience.js +135 -28
  102. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  103. package/lib/features/webbuilder/buildFragments.js +14 -6
  104. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  105. package/lib/features/webbuilder/components/PreviewFrame.js +28 -3
  106. package/lib/features/webbuilder/components/PreviewFrame.js.map +1 -1
  107. package/lib/features/webbuilder/components/PreviewScreen.js +1 -1
  108. package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
  109. package/lib/features/webbuilder/components/ProjectChat.js +24 -5
  110. package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
  111. package/lib/features/webbuilder/components/ProjectsScreen.js +18 -2
  112. package/lib/features/webbuilder/components/ProjectsScreen.js.map +1 -1
  113. package/lib/features/webbuilder/components/ui.js +20 -6
  114. package/lib/features/webbuilder/components/ui.js.map +1 -1
  115. package/lib/features/webbuilder/exportCode.js +52 -0
  116. package/lib/features/webbuilder/exportCode.js.map +1 -0
  117. package/lib/features/webbuilder/siteAddress.js +71 -0
  118. package/lib/features/webbuilder/siteAddress.js.map +1 -0
  119. package/lib/features/webbuilder/widgetBlocks.js +30 -0
  120. package/lib/features/webbuilder/widgetBlocks.js.map +1 -0
  121. package/lib/screens/Chat/index.js +5 -6
  122. package/lib/screens/Chat/index.js.map +1 -1
  123. package/lib/screens/ChatHistory/index.js +3 -2
  124. package/lib/screens/ChatHistory/index.js.map +1 -1
  125. package/lib/screens/Home/HomeScreen.js +20 -4
  126. package/lib/screens/Home/HomeScreen.js.map +1 -1
  127. package/lib/screens/Home/components/WebBuilderCodePrewarm.js +18 -0
  128. package/lib/screens/Home/components/WebBuilderCodePrewarm.js.map +1 -0
  129. package/lib/screens/WebBuilderNative/index.js +1 -1
  130. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  131. package/lib/screens/WebBuilderNative/keepAlive.js +112 -0
  132. package/lib/screens/WebBuilderNative/keepAlive.js.map +1 -0
  133. package/lib/screens/WebBuilderNative/runningBuilds.js +40 -0
  134. package/lib/screens/WebBuilderNative/runningBuilds.js.map +1 -0
  135. package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js +57 -0
  136. package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js.map +1 -0
  137. package/lib/screens/WebBuilderNative/useWebBuilderGallery.js +73 -14
  138. package/lib/screens/WebBuilderNative/useWebBuilderGallery.js.map +1 -1
  139. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +143 -34
  140. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  141. package/lib/screens/WebBuilderNative/useWebBuilderJobs.js +17 -5
  142. package/lib/screens/WebBuilderNative/useWebBuilderJobs.js.map +1 -1
  143. package/lib/screens/WebBuilderNative/versionUndo.js +144 -0
  144. package/lib/screens/WebBuilderNative/versionUndo.js.map +1 -0
  145. package/lib/screens/WebBuilderNative/webbuilderSnapshotKey.js +1 -0
  146. package/lib/screens/WebBuilderNative/webbuilderSnapshotKey.js.map +1 -0
  147. package/lib/screens/WebBuilderNative/webbuilderTransport.js +90 -6
  148. package/lib/screens/WebBuilderNative/webbuilderTransport.js.map +1 -1
  149. 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'>;\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);\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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"}
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":";;;;;;;;;;;;;;;;;;;AAgDA,MAAM,aAAgB,GAAA,GAAA;AACtB,SAAS,YAAA,CAAa,IAAkB,EAAA,WAAA,GAAc,KAAe,EAAA;AAjDrE,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAkDE,EAAA,IAAI,CAAI,GAAA,CAAA;AAER,EAAI,IAAA,CAAC,eAAe,IAAK,CAAA,GAAA,IAAO,GAAC,EAAK,GAAA,IAAA,CAAA,MAAA,KAAL,IAAa,GAAA,MAAA,GAAA,EAAA,CAAA,MAAA,CAAA,EAAa,CAAA,IAAA,CAAA;AAAA,OAAW,IAAA,CAAC,WAAe,IAAA,CAAA,CAAA,EAAA,GAAA,IAAA,CAAK,UAAL,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAiB,UAAS,OAAW,IAAA,IAAA,CAAK,UAAW,CAAA,GAAA,EAAU,CAAA,IAAA,CAAA;AACrJ,EAAA,KAAA,MAAW,CAAK,IAAA,CAAA,EAAA,GAAA,IAAA,CAAK,MAAL,KAAA,IAAA,GAAA,EAAA,GAAe,EAAC,EAAO,IAAA,CAAA,CAAE,IAAS,KAAA,OAAA,IAAW,CAAE,CAAA,GAAA,EAAU,CAAA,IAAA,CAAA;AACzE,EAAO,OAAA,CAAA;AACT;AAGgB,SAAA,OAAA,CAAQ,KAAgB,GAA+D,EAAA,IAAA,EAAkB,OAAuC,MAAuC,EAAA,MAAA,EAAqB,cAAc,KAA2B,EAAA;AA1DrQ,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA2DE,EAAM,MAAA;AAAA,IACJ,CAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,cAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAO,EAAA;AAAA,GACL,GAAA,GAAA;AACJ,EAAA,MAAM,IAAI,GAAI,CAAA,SAAA;AACd,EAAA,MAAM,IAAI,GAAI,CAAA,UAAA;AACd,EAAA,MAAM,KAAK,IAAK,CAAA,UAAA;AAChB,EAAA,IAAI,MAA0B,mBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,KAAA,EAAO,CAAG,EAAA,MAAA,EAAQ,CAAG,EAAA,IAAA,EAAK,SAAU,EAAA,CAAA;AACpF,EAAA,IAAI,KAAK,GAAO,IAAA,EAAA,CAAC,EAAK,GAAA,IAAA,CAAA,MAAA,KAAL,mBAAa,MAAQ,CAAA,EAAA;AACpC,IAAS,MAAA,mBAAA,GAAA,CAAC,YAAS,IAAM,EAAA;AAAA,MACvB,KAAK,IAAK,CAAA;AAAA,KACZ,EAAG,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,KAAO,EAAA,CAAA,EAAG,MAAQ,EAAA,CAAA,EAAG,mBAAoB,EAAA,gBAAA,EAAiB,MAAgB,EAAA,CAAA;AAAA,GAChF,MAAA,IAAA,CAAA,EAAA,IAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAI,IAAS,MAAA,OAAA,IAAW,GAAG,GAAK,EAAA;AACzC,IAAS,MAAA,mBAAA,GAAA,CAAC,YAAS,IAAM,EAAA;AAAA,MACvB,KAAK,EAAG,CAAA;AAAA,KACV,EAAG,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,KAAO,EAAA,CAAA,EAAG,MAAQ,EAAA,CAAA,EAAG,mBAAoB,EAAA,gBAAA,EAAiB,MAAgB,EAAA,CAAA;AAAA,cAChF,EAAI,IAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,MAAS,cAAc,EAAG,CAAA,IAAA,IAAQ,GAAG,EAAI,EAAA;AACtD,IAAA,MAAM,CAAC,EAAA,EAAI,EAAI,EAAA,EAAA,EAAI,EAAE,CAAI,GAAA,YAAA,CAAa,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAA,CAAG,EAAG,GAAA,EAAA,CAAA,KAAA,KAAH,YAAY,GAAG,CAAA;AACjE,IAAA,MAAA,wBAAU,CACE,EAAA,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,IAAA,EAAA,EACG,QAAC,kBAAA,IAAA,CAAA,cAAA,EAAA,EAAe,EAAG,EAAA,SAAA,EAAU,eAAc,gBAAiB,EAAA,EAAA,EAAQ,EAAQ,EAAA,EAAA,EAAQ,EAChF,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,MAAA,EAAO,GAAI,EAAA,SAAA,EAAW,GAAG,IAAM,EAAA,CAAA;AAAA,4BACpC,IAAK,EAAA,EAAA,MAAA,EAAO,GAAI,EAAA,SAAA,EAAW,GAAG,EAAI,EAAA;AAAA,OAAA,EACvC,CACJ,EAAA,CAAA;AAAA,sBACA,GAAA,CAAC,IAAK,EAAA,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,KAAA,EAAO,CAAG,EAAA,MAAA,EAAQ,CAAG,EAAA,IAAA,EAAK,eAAgB,EAAA;AAAA,KAChE,EAAA,CAAA;AAAA,aACC,EAAI,EAAA;AACb,IAAA,MAAA,mBAAU,GAAA,CAAA,IAAA,EAAA,EAAK,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,KAAO,EAAA,CAAA,EAAG,MAAQ,EAAA,CAAA,EAAG,IAAM,EAAA,EAAA,CAAG,SAAS,SAAW,EAAA,CAAA;AAAA;AAE/E,EAAA,4BAAQ,CACG,EAAA,EAAA,QAAA,EAAA;AAAA,IAAA,WAAA,GAAc,IAAO,mBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,KAAA,EAAO,CAAG,EAAA,MAAA,EAAQ,CAAG,EAAA,IAAA,EAAK,SAAU,EAAA,CAAA;AAAA,IAC3E,cAAc,IAAO,GAAA,MAAA;AAAA,IAAA,CAAA,CACpB,EAAK,GAAA,IAAA,CAAA,MAAA,KAAL,IAAe,GAAA,EAAA,GAAA,EAAI,EAAA,GAAA,CAAI,CAAS,KAAA,qBAAA,GAAA,CAAC,MAAsB,EAAA,EAAA,GAAA,EAAU,KAAc,EAAA,CAAA,EAAM,CAAM,EAAA,QAAA,EAAU,GAAI,CAAA,QAAA,EAAU,KAAO,EAAA,KAAA,CAAM,KAAM,CAAA,EAAE,CAAG,EAAA,KAAA,EAAO,MAAO,CAAA,KAAA,CAAM,EAAE,CAAA,EAAG,MAAvH,EAAA,EAAA,KAAA,CAAM,EAAiI,CAAE;AAAA,GAC5L,EAAA,CAAA;AACR;AACA,SAAS,MAAO,CAAA;AAAA,EACd,GAAA;AAAA,EACA,KAAA;AAAA,EACA,CAAA;AAAA,EACA,CAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CASG,EAAA;AArHH,EAAA,IAAA,EAAA,EAAA,EAAA;AAsHE,EAAM,MAAA,EAAA,GAAK,MAAM,CAAI,GAAA,CAAA;AACrB,EAAI,IAAA,EAAA,GAAK,MAAM,CAAI,GAAA,CAAA;AACnB,EAAA,IAAI,IAAwB,GAAA,IAAA;AAC5B,EAAI,IAAA,KAAA,CAAM,SAAS,MAAQ,EAAA;AACzB,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,EAAc,OAAA,IAAA;AAC7B,IAAA,MAAM,QAAQ,KAAQ,GAAA,KAAA,CAAM,MAAO,CAAA,CAAC,GAAG,CAAM,KAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,EAAE,CAAI,GAAA,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,CAAI,GAAA,CAAA;AAC/E,IAAK,EAAA,GAAA,IAAA,CAAK,GAAI,CAAA,EAAA,EAAI,KAAK,CAAA;AACvB,IAAO,IAAA,GAAA,OAAA,CAAQ,GAAK,EAAA,KAAA,EAAO,KAAS,IAAA,IAAA,GAAA,KAAA,GAAA,EAAI,EAAA,CAAA,EAAG,QAAU,EAAA,KAAA,CAAM,KAAQ,GAAA,KAAA,GAAQ,IAAI,CAAA;AAAA,GACjF,MAAA,IAAW,KAAM,CAAA,IAAA,KAAS,OAAS,EAAA,IAAA,GAAO,SAAS,GAAK,EAAA,KAAA,EAAO,EAAI,EAAA,EAAA,EAAI,CAAC,CAAA;AAAA,OAAW,IAAA,KAAA,CAAM,IAAS,KAAA,OAAA,EAAgB,IAAA,GAAA,QAAA,CAAS,KAAK,KAAO,EAAA,EAAA,EAAI,EAAI,EAAA,CAAA,EAAG,MAAM,CAAA;AAAA,OAAW,IAAA,KAAA,CAAM,SAAS,OAAS,EAAA,IAAA,GAAO,SAAS,GAAK,EAAA,KAAA,EAAO,IAAI,EAAE,CAAA;AAC7N,EAAA,MAAM,IAAO,GAAA,KAAA,CAAM,QAAY,IAAA,KAAA,CAAM,SAAS,KAAM,CAAA,KAAA;AACpD,EAAA,MAAM,YAAY,CAAa,UAAA,EAAA,KAAA,CAAM,IAAI,CAAC,CAAA,EAAA,EAAK,MAAM,CAAI,GAAA,CAAC,CAAO,CAAA,CAAA,IAAA,IAAA,GAAO,cAAc,EAAK,GAAA,CAAC,KAAK,EAAK,GAAA,CAAC,aAAY,EAAM,GAAA,KAAA,CAAA,QAAA,KAAN,IAAkB,GAAA,EAAA,GAAA,CAAC,WAAW,KAAM,CAAA,KAAA,GAAQ,KAAK,CAAC,CAAA,EAAA,EAAK,MAAM,KAAQ,GAAA,EAAA,GAAK,CAAC,CAAA,YAAA,EAAe,CAAC,EAAK,GAAA,CAAC,KAAK,CAAC,EAAA,GAAK,CAAC,CAAM,CAAA,CAAA,GAAA,EAAA,CAAA;AACtO,EAAO,uBAAA,GAAA,CAAC,GAAI,CAAA,CAAA,EAAJ,EAAM,SAAA,EAAsB,UAAS,EAAM,GAAA,KAAA,CAAA,OAAA,KAAN,IAAiB,GAAA,EAAA,GAAA,CAAA,EACnD,QACL,EAAA,IAAA,EAAA,CAAA;AACR;AACa,MAAA,WAAA,GAAc,UAExB,CAAA,SAASA,YAAY,CAAA;AAAA,EACtB;AACF,CAAA,EAAG,GAAK,EAAA;AACN,EAAM,MAAA,KAAA,GAAQ,MAAc,CAAA,EAAE,CAAA;AAC9B,EAAM,MAAA,GAAA,GAAM,OAAO,CAAC,CAAA;AACpB,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,SAAqB,IAAI,CAAA;AAC/C,EAAM,MAAA,IAAA,GAAO,YAAY,MAAG;AA7I9B,IAAA,IAAA,EAAA;AA6IiC,IAAA,OAAA,MAAA,CAAA,CAAO,EAAM,GAAA,KAAA,CAAA,OAAA,CAAQ,KAAM,EAAA,KAApB,YAAyB,IAAI,CAAA;AAAA,GAAA,EAAG,EAAE,CAAA;AACxE,EAAA,mBAAA,CAAoB,KAAK,OAAO;AAAA,IAC9B,OAAA,EAAS,CAAC,IAAM,EAAA,UAAA,EAAY,SAAS,IAAI,OAAA,CAAgB,CAAC,OAAA,EAAS,MAAW,KAAA;AAC5E,MAAI,IAAA,CAAC,QAAU,EAAA;AACb,QAAO,MAAA,CAAA,IAAI,KAAM,CAAA,sDAAsD,CAAC,CAAA;AACxE,QAAA;AAAA;AAEF,MAAA,GAAA,CAAI,OAAW,IAAA,CAAA;AACf,MAAA,KAAA,CAAM,QAAQ,IAAK,CAAA;AAAA,QACjB,IAAI,GAAI,CAAA,OAAA;AAAA,QACR,IAAA;AAAA,QACA,UAAA;AAAA,QACA,aAAa,IAAM,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,WAAA;AAAA,QACnB,OAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA,MAAA,CAAO,CAAQ,OAAA,KAAA;AA7JrB,QAAA,IAAA,EAAA;AA6JwB,QAAA,OAAA,CAAA,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,OAAA,GAAW,KAAM,CAAA,OAAA,CAAQ,KAAM,EAAA,KAA/B,IAAoC,GAAA,EAAA,GAAA,IAAA;AAAA,OAAI,CAAA;AAAA,KAC3D,CAAA;AAAA,IACD,UAAA,EAAY,CAAC,MAAA,EAAQ,KAAO,EAAA,MAAA,EAAQ,eAAe,IAAI,OAAA,CAAgB,CAAC,OAAA,EAAS,MAAW,KAAA;AAC1F,MAAI,IAAA,CAAC,QAAU,EAAA;AACb,QAAO,MAAA,CAAA,IAAI,KAAM,CAAA,sDAAsD,CAAC,CAAA;AACxE,QAAA;AAAA;AAEF,MAAA,GAAA,CAAI,OAAW,IAAA,CAAA;AACf,MAAA,MAAM,IAAmB,GAAA;AAAA,QACvB,EAAA,EAAI,CAAO,IAAA,EAAA,GAAA,CAAI,OAAO,CAAA,CAAA;AAAA,QACtB,MAAQ,EAAA,EAAA;AAAA,QACR,GAAK,EAAA,IAAA;AAAA,QACL,MAAQ,EAAA,OAAA;AAAA,QACR,QAAQ;AAAC,OACX;AACA,MAAA,KAAA,CAAM,QAAQ,IAAK,CAAA;AAAA,QACjB,IAAI,GAAI,CAAA,OAAA;AAAA,QACR,IAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA;AAAA,QACA,IAAM,EAAA;AAAA,UACJ,MAAA;AAAA,UACA,KAAA;AAAA,UACA;AAAA;AACF,OACD,CAAA;AACD,MAAA,MAAA,CAAO,CAAQ,OAAA,KAAA;AAxLrB,QAAA,IAAA,EAAA;AAwLwB,QAAA,OAAA,CAAA,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,OAAA,GAAW,KAAM,CAAA,OAAA,CAAQ,KAAM,EAAA,KAA/B,IAAoC,GAAA,EAAA,GAAA,IAAA;AAAA,OAAI,CAAA;AAAA,KAC3D;AAAA,GACH,CAAA,EAAI,EAAE,CAAA;AACN,EAAI,IAAA,CAAC,KAAY,OAAA,IAAA;AACjB,EAAM,MAAA,MAAA,GAAS,CAAC,GAAA,EAAoB,GAAgB,KAAA;AAClD,IAAI,IAAA,GAAA,EAAS,GAAA,CAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,aAAW,MAAO,CAAA,GAAA,IAAA,IAAA,GAAA,GAAA,GAAO,IAAI,KAAA,CAAM,8BAA8B,CAAC,CAAA;AAC1F,IAAK,IAAA,EAAA;AAAA,GACP;AACA,EAAI,IAAA,GAAA,CAAI,MAAa,uBAAA,GAAA,CAAC,WAAqB,GAAU,EAAA,MAAA,EAAQ,MAA1B,EAAA,EAAA,GAAA,CAAI,EAA8B,CAAA;AACrE,EAAA,2BAAQ,UAAwB,EAAA,EAAA,GAAA,EAAU,KAAU,MAAQ,EAAA,MAAA,EAAA,EAApC,IAAI,EAAwC,CAAA;AACtE,CAAC;AAMD,SAAS,SAAU,CAAA,IAAA,EAAkB,EAAY,EAAA,MAAA,EAAgB,IAAiD,EAAA;AAChH,EAAI,IAAA,EAAC,6BAAM,SAAW,CAAA,EAAA;AACpB,IAAA,IAAA,CAAK,IAAM,EAAA,IAAI,KAAM,CAAA,sDAAsD,CAAC,CAAA;AAC5E,IAAA;AAAA;AAEF,EAAA,MAAM,IAAI,IAAK,CAAA,GAAA,CAAI,GAAG,IAAK,CAAA,KAAA,CAAM,EAAE,CAAC,CAAA;AACpC,EAAM,MAAA,CAAA,GAAI,KAAK,GAAI,CAAA,CAAA,EAAG,KAAK,KAAM,CAAA,CAAA,GAAI,MAAM,CAAC,CAAA;AAC5C,EAAA,MAAM,IAAI,QAAS,CAAA,EAAA,KAAO,KAAQ,GAAA,UAAA,CAAW,KAAQ,GAAA,CAAA;AACrD,EAAI,IAAA;AACF,IAAA,IAAA,CAAK,SAAU,CAAA,CAAA,GAAA,KAAO,IAAK,CAAA,GAAA,IAAO,IAAI,CAAG,EAAA;AAAA,MACvC,KAAA,EAAO,KAAK,GAAI,CAAA,CAAA,EAAG,KAAK,KAAM,CAAA,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,MACpC,MAAA,EAAQ,KAAK,GAAI,CAAA,CAAA,EAAG,KAAK,KAAM,CAAA,CAAA,GAAI,CAAC,CAAC;AAAA,KACtC,CAAA;AAAA,WACM,GAAK,EAAA;AACZ,IAAK,IAAA,CAAA,IAAA,EAAM,eAAe,KAAQ,GAAA,GAAA,GAAM,IAAI,KAAM,CAAA,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAAA;AAElE;AACA,SAAS,OAAQ,CAAA;AAAA,EACf,GAAA;AAAA,EACA;AACF,CAGG,EAAA;AACD,EAAA,MAAM,MAAM,MAAO,EAAA;AACnB,EAAM,MAAA,GAAA,GAAM,OAAmB,IAAI,CAAA;AACnC,EAAA,MAAM,OAAO,GAAI,CAAA,IAAA;AACjB,EAAM,MAAA,MAAA,GAAS,OAAO,MAAM,CAAA;AAC5B,EAAA,MAAA,CAAO,OAAU,GAAA,MAAA;AACjB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,KAAQ,GAAA,KAAA;AACZ,IAAA,MAAM,MAAM,qBAAsB,CAAA,MAAM,qBAAsB,CAAA,MAAM,UAAU,GAAI,CAAA,OAAA,EAAS,GAAI,CAAA,UAAA,EAAY,KAAK,MAAS,GAAA,IAAA,CAAK,KAAO,EAAA,CAAC,KAAK,GAAQ,KAAA;AACjJ,MAAA,IAAI,KAAO,EAAA;AACX,MAAQ,KAAA,GAAA,IAAA;AACR,MAAO,MAAA,CAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,KACxB,CAAC,CAAC,CAAA;AACH,IAAO,OAAA,MAAM,qBAAqB,GAAG,CAAA;AAAA,GACvC,EAAG,CAAC,GAAI,CAAA,UAAA,EAAY,KAAK,MAAQ,EAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AAC5C,EAAA,uBAAQ,GAAA,CAAA,IAAA,EAAA,EAAK,aAAc,EAAA,MAAA,EAAO,OAAO,MAAO,CAAA,SAAA,EAAW,WAAa,EAAA,KAAA,EAC9D,8BAAC,GAAI,CAAA,GAAA,EAAJ,EAAQ,GAAA,EAAmB,OAAO,GAAK,EAAA,MAAA,EAAQ,GAAM,GAAA,IAAA,CAAK,MAAS,GAAA,IAAA,CAAK,KAAO,EAAA,OAAA,EAAS,OAAO,IAAK,CAAA,KAAK,CAAI,CAAA,EAAA,IAAA,CAAK,MAAM,CACpH,CAAA,EAAA,QAAA,EAAA,IAAA,CAAK,MAAO,CAAA,GAAG,GACpB,CACJ,EAAA,CAAA;AACR;AACA,SAAS,UAAW,CAAA;AAAA,EAClB,GAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAIG,EAAA;AACD,EAAA,MAAM,MAAM,MAAO,EAAA;AACnB,EAAM,MAAA;AAAA,IACJ;AAAA,GACE,GAAA,GAAA;AACJ,EAAA,MAAM,IAAI,GAAI,CAAA,SAAA;AACd,EAAA,MAAM,IAAI,GAAI,CAAA,UAAA;AACd,EAAM,MAAA,KAAA,GAAQ,QAAQ,MAAG;AAnQ3B,IAAA,IAAA,EAAA;AAmQ+B,IAAK,OAAA,CAAA,CAAA,EAAA,GAAA,IAAA,CAAA,MAAA,KAAL,YAAe,EAAC,EAAG,OAAO,CAAC,CAAA,KAAsB,CAAE,CAAA,IAAA,KAAS,MAAM,CAAA;AAAA,GAAG,EAAA,CAAC,IAAI,CAAC,CAAA;AACxG,EAAA,MAAM,KAAQ,GAAA,OAAA,CAAQ,MAAM,SAAA,CAAU,IAAM,EAAA,GAAA,CAAI,QAAQ,CAAA,EAAG,CAAC,IAAA,EAAM,GAAI,CAAA,QAAQ,CAAC,CAAA;AAC/E,EAAe,cAAA,CAAA,KAAA,EAAO,IAAI,KAAK,CAAA;AAC/B,EAAA,MAAM,CAAC,KAAO,EAAA,QAAQ,CAAI,GAAA,QAAA,CAAyC,EAAE,CAAA;AACrE,EAAA,MAAM,CAAC,MAAQ,EAAA,SAAS,CAAI,GAAA,QAAA,CAAwC,EAAE,CAAA;AACtE,EAAA,MAAM,QAAW,GAAA,KAAA,CAAM,KAAM,CAAA,CAAA,CAAA,KAAK,CAAE,CAAA,KAAA,GAAQ,MAAO,CAAA,CAAA,CAAE,EAAE,CAAA,GAAI,KAAM,CAAA,CAAA,CAAE,EAAE,CAAC,CAAA;AACtE,EAAA,MAAM,QAAW,GAAA,OAAA,CAAQ,MAAM,YAAA,CAAa,IAAM,EAAA,GAAA,CAAI,WAAW,CAAA,EAAG,CAAC,IAAA,EAAM,GAAI,CAAA,WAAW,CAAC,CAAA;AAC3F,EAAM,MAAA,MAAA,GAAS,OAAO,CAAC,CAAA;AACvB,EAAA,MAAM,CAAC,aAAe,EAAA,gBAAgB,CAAI,GAAA,QAAA,CAAS,aAAa,CAAC,CAAA;AACjE,EAAM,MAAA,MAAA,GAAS,OAAmB,IAAI,CAAA;AACtC,EAAM,MAAA,IAAA,GAAO,OAAO,KAAK,CAAA;AACzB,EAAM,MAAA,MAAA,GAAS,OAAO,MAAM,CAAA;AAC5B,EAAA,MAAA,CAAO,OAAU,GAAA,MAAA;AACjB,EAAM,MAAA,MAAA,GAAS,YAAY,MAAM;AAC/B,IAAA,MAAA,CAAO,OAAW,IAAA,CAAA;AAClB,IAAA,IAAI,MAAO,CAAA,OAAA,IAAW,QAAU,EAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,GACvD,EAAG,CAAC,QAAQ,CAAC,CAAA;AACb,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,CAAC,QAAY,IAAA,aAAA,EAAsB,OAAA,MAAA;AACvC,IAAA,MAAM,IAAI,UAAW,CAAA,MAAM,gBAAiB,CAAA,IAAI,GAAG,aAAa,CAAA;AAChE,IAAO,OAAA,MAAM,aAAa,CAAC,CAAA;AAAA,GAC1B,EAAA,CAAC,QAAU,EAAA,aAAa,CAAC,CAAA;AAG5B,EAAA,SAAA,CAAU,MAAM;AACd,IAAM,MAAA,CAAA,GAAI,WAAW,MAAM;AACzB,MAAI,IAAA,CAAC,KAAK,OAAS,EAAA;AACjB,QAAA,IAAA,CAAK,OAAU,GAAA,IAAA;AACf,QAAA,MAAA,CAAO,OAAQ,CAAA,IAAA,EAAM,IAAI,KAAA,CAAM,iCAAiC,CAAC,CAAA;AAAA;AACnE,KACF,EAAG,gBAAgB,GAAM,CAAA;AACzB,IAAO,OAAA,MAAM,aAAa,CAAC,CAAA;AAAA,GAC7B,EAAG,EAAE,CAAA;AACL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAY,IAAA,CAAC,aAAiB,IAAA,IAAA,CAAK,SAAgB,OAAA,MAAA;AACxD,IAAA,IAAI,SAAY,GAAA,KAAA;AAEhB,IAAA,MAAM,GAAM,GAAA,qBAAA,CAAsB,MAAM,qBAAA,CAAsB,MAAM;AAClE,MAAI,IAAA,SAAA,IAAa,KAAK,OAAS,EAAA;AAC/B,MAAU,SAAA,CAAA,MAAA,CAAO,SAAS,GAAI,CAAA,UAAA,EAAY,IAAI,CAAG,EAAA,CAAC,KAAK,GAAQ,KAAA;AAC7D,QAAA,IAAI,KAAK,OAAS,EAAA;AAClB,QAAA,IAAA,CAAK,OAAU,GAAA,IAAA;AACf,QAAO,MAAA,CAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,OACxB,CAAA;AAAA,KACF,CAAC,CAAA;AACF,IAAA,OAAO,MAAM;AACX,MAAY,SAAA,GAAA,IAAA;AACZ,MAAA,oBAAA,CAAqB,GAAG,CAAA;AAAA,KAC1B;AAAA,GACF,EAAG,CAAC,QAAU,EAAA,aAAA,EAAe,IAAI,UAAY,EAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAClD,EAAA,MAAM,KAAQ,GAAA,GAAA;AACd,EAAM,MAAA,KAAA,GAAQ,QAAQ,CAAI,GAAA,CAAA;AAC1B,EAAA,4BAAQ,IAAK,EAAA,EAAA,aAAA,EAAc,QAAO,KAAO,EAAA,CAAC,OAAO,SAAW,EAAA;AAAA,IAC1D,KAAO,EAAA,CAAA;AAAA,IACP,MAAQ,EAAA;AAAA,GACT,CAAG,EAAA,WAAA,EAAa,KACN,EAAA,QAAA,EAAA;AAAA,IAAM,KAAA,CAAA,GAAA,CAAI,OAAK,CAAE,CAAA,KAAA,uBAAS,YAAwB,EAAA,EAAA,KAAA,EAAO,CAAG,EAAA,CAAA,EAAM,QAAU,EAAA,GAAA,CAAI,UAAU,OAAS,EAAA,CAAA,CAAA,KAAK,UAAU,CAAK,CAAA,KAAA,CAAA,CAAE,EAAE,EAAE,CAAA,GAAI,CAAI,GAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EACzI,CADyI,CAAA,EAAA;AAAA,MAE5I,CAAC,CAAE,CAAA,EAAE,GAAG;AAAA,KACV,CAAC,CAHoD,EAAA,EAAA,CAAA,CAAE,EAGnD,CAAA,uBAAM,WAAuB,EAAA,EAAA,KAAA,EAAO,CAAG,EAAA,CAAA,EAAM,QAAU,EAAA,GAAA,CAAI,UAAU,QAAQ,EAAA,IAAA,EAAC,OAAS,EAAA,CAAA,CAAA,KAAK,QAAS,CAAA,CAAA,CAAA,KAAK,CAAE,CAAA,CAAA,CAAE,EAAE,CAAA,GAAI,CAAI,GAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EACvH,CADuH,CAAA,EAAA;AAAA,MAE1H,CAAC,CAAE,CAAA,EAAE,GAAG;AAAA,KACT,CAAA,CAAA,EAAA,EAH0B,CAAE,CAAA,EAGzB,CAAE,CAAA;AAAA,IACG,QAAW,mBAAA,GAAA,CAAC,GAAI,CAAA,GAAA,EAAJ,EAAQ,GAAK,EAAA,MAAA,EAAiB,KAAO,EAAA,KAAA,EAAO,MAAQ,EAAA,KAAA,EAAO,OAAS,EAAA,CAAA,IAAA,EAAO,CAAC,CAAI,CAAA,EAAA,CAAC,CAAI,CAAA,EAAA,mBAAA,EAAoB,MAAO,EAAA,KAAA,EAAO,MAAO,CAAA,GAAA,EAClI,kBAAQ,GAAK,EAAA,GAAA,EAAK,IAAM,EAAA,KAAA,EAAO,MAAQ,EAAA,MAAA,EAAQ,GAAI,CAAA,WAAW,GACnE,CAAa,GAAA;AAAA,GACrB,EAAA,CAAA;AACR;AACA,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,SAAW,EAAA;AAAA,IACT,QAAU,EAAA,UAAA;AAAA,IACV,IAAM,EAAA,IAAA;AAAA,IACN,GAAK,EAAA,CAAA;AAAA,IACL,OAAS,EAAA;AAAA,GACX;AAAA,EACA,GAAK,EAAA;AAAA,IACH,QAAU,EAAA,UAAA;AAAA,IACV,IAAM,EAAA,CAAA;AAAA,IACN,GAAK,EAAA;AAAA;AAET,CAAC,CAAA"}
@@ -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 {readChartData,pieSlices,slicePath,chartMax}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;
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
- Polyline,
64
+ Line,
67
65
  G,
68
66
  Text: SvgText,
69
67
  Circle
70
68
  } = svg;
71
- const data = readChartData(layer);
72
- const colors = ((_a = layer.colors) == null ? void 0 : _a.length) ? layer.colors : ["#38bdf8"];
73
- if (data.categories.length === 0) return null;
74
- const ink = (_b = layer.ink) != null ? _b : "#475569";
75
- const n = data.categories.length;
76
- const legend = Boolean(layer.legend) && data.series.length > 0;
77
- const legendH = legend ? Math.max(10, bh * 0.08) : 0;
78
- const ph = bh - legendH;
79
- let body;
80
- if (layer.chart === "pie" || layer.chart === "donut") {
81
- const r = Math.min(bw, ph) / 2;
82
- const inner = layer.chart === "donut" ? r * ((_c = layer.holeFrac) != null ? _c : 0.55) : 0;
83
- body = pieSlices((_e = (_d = data.series[0]) == null ? void 0 : _d.values) != null ? _e : []).map((s) => /* @__PURE__ */ jsx(Path, { d: slicePath(bw / 2, ph / 2, r, s.start, s.sweep, inner), fill: colors[s.index % colors.length] }, s.index));
84
- } else if (layer.chart === "line" || layer.chart === "area") {
85
- const stacked = layer.chart === "area" && Boolean(layer.stacked);
86
- const max = chartMax(data, stacked);
87
- const x = (i) => n === 1 ? bw / 2 : i / (n - 1) * bw;
88
- const y = (v) => ph - Math.max(0, v) / max * ph;
89
- const base = new Array(n).fill(0);
90
- body = data.series.map((s, si) => {
91
- const color = colors[si % colors.length];
92
- const tops = s.values.map((v, i) => stacked ? base[i] + Math.max(0, v) : v);
93
- const bottoms = stacked ? [...base] : new Array(n).fill(0);
94
- if (stacked) tops.forEach((t, i) => base[i] = t);
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
- body = rects;
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 : {