@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,3 +1,22 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
1
20
  const num = (v) => {
2
21
  const n = typeof v === "number" ? v : Number(v);
3
22
  return Number.isFinite(n) ? n : 0;
@@ -38,18 +57,6 @@ function readChartData(layer) {
38
57
  })
39
58
  };
40
59
  }
41
- function chartMax(data, stacked) {
42
- var _a;
43
- let max = 0;
44
- for (let i = 0; i < data.categories.length; i += 1) {
45
- if (stacked) max = Math.max(max, data.series.reduce((sum, s) => {
46
- var _a2;
47
- return sum + Math.max(0, (_a2 = s.values[i]) != null ? _a2 : 0);
48
- }, 0));
49
- else for (const s of data.series) max = Math.max(max, (_a = s.values[i]) != null ? _a : 0);
50
- }
51
- return max > 0 ? max : 1;
52
- }
53
60
  function pieSlices(values) {
54
61
  const positive = values.map((v) => Math.max(0, v));
55
62
  const total = positive.reduce((a, b) => a + b, 0);
@@ -95,4 +102,371 @@ function writeChartData(data) {
95
102
  function parseCell(text) {
96
103
  const n = Number(text.replace(/[\s,]/g, ""));
97
104
  return Number.isFinite(n) ? n : 0;
98
- }export{chartMax,parseCell,pieSlices,readChartData,slicePath,writeChartData};//# sourceMappingURL=chart.js.map
105
+ }
106
+ const DEFAULT_CHART_COLORS = ["#38bdf8", "#818cf8", "#f472b6", "#fbbf24", "#34d399", "#f87171", "#a78bfa"];
107
+ const INK_DARK = "#334155";
108
+ const INK_LIGHT = "#f8fafc";
109
+ function niceTicks(min, max, count = 5) {
110
+ if (!Number.isFinite(min) || !Number.isFinite(max)) return [0];
111
+ if (min === max) return [min];
112
+ const raw = Math.abs(max - min) / Math.max(1, count);
113
+ const mag = 10 ** Math.floor(Math.log10(raw));
114
+ const norm = raw / mag;
115
+ const step = (norm <= 1 ? 1 : norm <= 2 ? 2 : norm <= 5 ? 5 : 10) * mag;
116
+ const start = Math.floor(min / step) * step;
117
+ const end = Math.ceil(max / step) * step;
118
+ const out = [];
119
+ for (let v = start; v <= end + step * 1e-9; v += step) out.push(Number(v.toPrecision(12)));
120
+ return out;
121
+ }
122
+ function seriesExtent(data, stacked = false) {
123
+ let min = 0;
124
+ let max = 0;
125
+ if (stacked) {
126
+ data.categories.forEach((_, i) => {
127
+ var _a;
128
+ let pos = 0;
129
+ let neg = 0;
130
+ for (const s of data.series) {
131
+ const v = (_a = s.values[i]) != null ? _a : 0;
132
+ if (v >= 0) pos += v;
133
+ else neg += v;
134
+ }
135
+ max = Math.max(max, pos);
136
+ min = Math.min(min, neg);
137
+ });
138
+ } else {
139
+ for (const s of data.series) for (const v of s.values) {
140
+ max = Math.max(max, v);
141
+ min = Math.min(min, v);
142
+ }
143
+ }
144
+ if (max === min) max = min + 1;
145
+ return [min, max];
146
+ }
147
+ function barSlots(categories, series, span, stacked = false) {
148
+ if (categories <= 0 || series <= 0 || span <= 0) return [];
149
+ const slot = span / categories;
150
+ const band = slot * 0.7;
151
+ const size = stacked ? band : band / series;
152
+ return Array.from({
153
+ length: categories
154
+ }, (_, c) => Array.from({
155
+ length: series
156
+ }, (_2, s) => ({
157
+ pos: slot * c + (slot - band) / 2 + (stacked ? 0 : size * s),
158
+ size
159
+ })));
160
+ }
161
+ function formatValue(v) {
162
+ const abs = Math.abs(v);
163
+ if (abs >= 1e6) return `${Number((v / 1e6).toFixed(1))}M`;
164
+ if (abs >= 1e4) return `${Number((v / 1e3).toFixed(1))}k`;
165
+ const fixed = Number(v.toFixed(2));
166
+ const [int, frac] = String(fixed).split(".");
167
+ return `${int.replace(/\B(?=(\d{3})+(?!\d))/g, ",")}${frac ? `.${frac}` : ""}`;
168
+ }
169
+ function lightness(hex) {
170
+ const m = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec((hex != null ? hex : "").trim());
171
+ if (!m) return -1;
172
+ const h = m[1].length === 3 ? [...m[1]].map((c) => c + c).join("") : m[1];
173
+ const n = parseInt(h, 16);
174
+ const [r, g, b] = [n >> 16 & 255, n >> 8 & 255, n & 255];
175
+ return (0.299 * r + 0.587 * g + 0.114 * b) / 255;
176
+ }
177
+ function labelInkOn(fill, ink) {
178
+ const f = lightness(fill);
179
+ const i = lightness(ink);
180
+ if (f < 0 || i >= 0 && Math.abs(f - i) >= 0.4) return ink;
181
+ return f > 0.55 ? INK_DARK : INK_LIGHT;
182
+ }
183
+ function legendEntries(kind, data, colors) {
184
+ const palette = colors.length ? colors : DEFAULT_CHART_COLORS;
185
+ if (kind === "pie" || kind === "donut") return data.categories.map((name, i) => ({
186
+ name,
187
+ color: palette[i % palette.length]
188
+ }));
189
+ return data.series.map((s, i) => ({
190
+ name: s.name || `Series ${i + 1}`,
191
+ color: palette[i % palette.length]
192
+ }));
193
+ }
194
+ function textWidth(text, size) {
195
+ return text.length * size * 0.56;
196
+ }
197
+ function fit(text, size, maxW) {
198
+ if (maxW <= 0) return "";
199
+ if (textWidth(text, size) <= maxW) return text;
200
+ const keep = Math.max(0, Math.floor(maxW / (size * 0.56)) - 1);
201
+ return keep > 0 ? `${text.slice(0, keep)}\u2026` : "";
202
+ }
203
+ const baselineY = (y, size, b) => b === "top" ? y + size * 0.8 : b === "middle" ? y + size * 0.35 : y - size * 0.2;
204
+ function roundRectD(x, y, w, h, r) {
205
+ const rr = Math.max(0, Math.min(r, w / 2, h / 2));
206
+ if (!rr) return `M${x} ${y}H${x + w}V${y + h}H${x}Z`;
207
+ return `M${x + rr} ${y}H${x + w - rr}A${rr} ${rr} 0 0 1 ${x + w} ${y + rr}V${y + h - rr}A${rr} ${rr} 0 0 1 ${x + w - rr} ${y + h}H${x + rr}A${rr} ${rr} 0 0 1 ${x} ${y + h - rr}V${y + rr}A${rr} ${rr} 0 0 1 ${x + rr} ${y}Z`;
208
+ }
209
+ function chartMarks(layer, w, h) {
210
+ var _a, _b, _c, _d, _e;
211
+ const data = readChartData(layer);
212
+ if (data.categories.length === 0 || data.series.length === 0 || w <= 0 || h <= 0) return [];
213
+ const marks = [];
214
+ const kind = layer.chart;
215
+ const colors = ((_a = layer.colors) == null ? void 0 : _a.length) ? layer.colors : DEFAULT_CHART_COLORS;
216
+ const ink = (_b = layer.ink) != null ? _b : INK_DARK;
217
+ const stacked = Boolean(layer.stacked);
218
+ const legend = legendEntries(kind, data, colors);
219
+ const showLegend = layer.legend !== false && legend.length > 1;
220
+ const showGrid = layer.gridlines !== false;
221
+ const showAxis = layer.axisLabels !== false;
222
+ const fs = Math.max(8, Math.min(h * 0.055, w * 0.05));
223
+ const text = (x, y, s, b, anchor, fill = ink, size = fs, maxW) => {
224
+ const shown = maxW === void 0 ? s : fit(s, size, maxW);
225
+ if (shown) marks.push({
226
+ t: "text",
227
+ x,
228
+ y: baselineY(y, size, b),
229
+ text: shown,
230
+ size,
231
+ fill,
232
+ anchor
233
+ });
234
+ };
235
+ let top = 0;
236
+ if (layer.title) {
237
+ const size = fs * 1.15;
238
+ const shown = fit(layer.title, size, w);
239
+ if (shown) marks.push({
240
+ t: "text",
241
+ x: w / 2,
242
+ y: baselineY(0, size, "top"),
243
+ text: shown,
244
+ size,
245
+ weight: "600",
246
+ fill: ink,
247
+ anchor: "middle"
248
+ });
249
+ top += fs * 1.7;
250
+ }
251
+ if (showLegend) {
252
+ const dot = fs * 0.55;
253
+ const gap = fs * 0.7;
254
+ const rows = [];
255
+ let used = 0;
256
+ for (const e of legend) {
257
+ const inkW = Math.min(w, dot + gap * 0.5 + textWidth(e.name, fs));
258
+ const chip = __spreadProps(__spreadValues({}, e), {
259
+ ink: inkW,
260
+ advance: inkW + gap * 1.1
261
+ });
262
+ const row = rows[rows.length - 1];
263
+ if (row && used + inkW <= w) {
264
+ row.push(chip);
265
+ used += chip.advance;
266
+ } else {
267
+ rows.push([chip]);
268
+ used = chip.advance;
269
+ }
270
+ }
271
+ rows.forEach((row, r) => {
272
+ const total = row.slice(0, -1).reduce((a, e) => a + e.advance, 0) + row[row.length - 1].ink;
273
+ let cx = Math.max(0, (w - total) / 2);
274
+ const cy = top + fs * 1.6 * (r + 0.5);
275
+ for (const e of row) {
276
+ marks.push({
277
+ t: "circle",
278
+ cx: cx + dot / 2,
279
+ cy,
280
+ r: dot / 2,
281
+ fill: e.color
282
+ });
283
+ text(cx + dot + gap * 0.5, cy, e.name, "middle", "start", ink, fs, Math.max(0, e.ink - dot - gap * 0.5));
284
+ cx += e.advance;
285
+ }
286
+ });
287
+ top += fs * 1.6 * rows.length + fs * 0.4;
288
+ }
289
+ if (kind === "pie" || kind === "donut") {
290
+ const pad = fs * 0.3;
291
+ const pw = w - pad * 2;
292
+ const ph = h - top - pad * 2;
293
+ const cx = pad + pw / 2;
294
+ const cy = top + pad + ph / 2;
295
+ const r = Math.max(0, Math.min(pw, ph) / 2);
296
+ const hole = kind === "donut" ? r * Math.max(0, Math.min(0.9, (_c = layer.holeFrac) != null ? _c : 0.55)) : 0;
297
+ const values = (_e = (_d = data.series[0]) == null ? void 0 : _d.values) != null ? _e : [];
298
+ const total = values.reduce((s, v) => s + Math.max(0, v), 0);
299
+ for (const s of pieSlices(values)) {
300
+ if (s.sweep <= 0) continue;
301
+ const fill = colors[s.index % colors.length];
302
+ marks.push({
303
+ t: "path",
304
+ d: slicePath(cx, cy, r, s.start, s.sweep, hole),
305
+ fill
306
+ });
307
+ if (layer.valueLabels && total > 0) {
308
+ const mid = s.start + s.sweep / 2;
309
+ const lr = hole > 0 ? (r + hole) / 2 : r * 0.65;
310
+ text(cx + Math.sin(mid) * lr, cy - Math.cos(mid) * lr, `${Math.round(s.sweep / (Math.PI * 2) * 100)}%`, "middle", "middle", labelInkOn(fill, ink));
311
+ }
312
+ }
313
+ return marks;
314
+ }
315
+ const [minV, maxV] = seriesExtent(data, stacked);
316
+ const ticks = niceTicks(minV, maxV);
317
+ const lo = ticks[0];
318
+ const hi = ticks[ticks.length - 1];
319
+ const range = hi - lo || 1;
320
+ const horizontal = kind === "row";
321
+ const tickText = ticks.map(formatValue);
322
+ const valueGutter = showAxis ? Math.max(...tickText.map((t) => textWidth(t, fs))) + fs * 0.5 : 0;
323
+ const catGutter = showAxis ? horizontal ? Math.min(w * 0.4, Math.max(...data.categories.map((c) => textWidth(c, fs))) + fs * 0.5) : fs * 1.4 : 0;
324
+ const labelRoom = layer.valueLabels ? horizontal ? Math.max(...data.series.flatMap((s) => s.values.map((v) => textWidth(formatValue(v), fs)))) + fs * 0.4 : fs * 1.4 : 0;
325
+ const plot = horizontal ? {
326
+ x: catGutter,
327
+ y: top,
328
+ w: w - catGutter - labelRoom,
329
+ h: h - top - (showAxis ? fs * 1.4 : 0)
330
+ } : {
331
+ x: valueGutter,
332
+ y: top + labelRoom,
333
+ w: w - valueGutter,
334
+ h: h - top - labelRoom - catGutter
335
+ };
336
+ if (plot.w <= 0 || plot.h <= 0) return marks;
337
+ const vPos = (v) => horizontal ? plot.x + (v - lo) / range * plot.w : plot.y + plot.h - (v - lo) / range * plot.h;
338
+ const zero = vPos(Math.max(lo, Math.min(hi, 0)));
339
+ const sw = Math.max(1, h * 3e-3);
340
+ ticks.forEach((t, i) => {
341
+ const p = vPos(t);
342
+ if (showGrid) {
343
+ marks.push(horizontal ? {
344
+ t: "line",
345
+ x1: p,
346
+ y1: plot.y,
347
+ x2: p,
348
+ y2: plot.y + plot.h,
349
+ stroke: ink,
350
+ sw,
351
+ opacity: t === 0 ? 0.35 : 0.16
352
+ } : {
353
+ t: "line",
354
+ x1: plot.x,
355
+ y1: p,
356
+ x2: plot.x + plot.w,
357
+ y2: p,
358
+ stroke: ink,
359
+ sw,
360
+ opacity: t === 0 ? 0.35 : 0.16
361
+ });
362
+ }
363
+ if (showAxis) {
364
+ if (horizontal) text(p, plot.y + plot.h + fs * 0.3, tickText[i], "top", "middle");
365
+ else text(plot.x - fs * 0.4, p, tickText[i], "middle", "end");
366
+ }
367
+ });
368
+ const catSpan = horizontal ? plot.h : plot.w;
369
+ const catStart = horizontal ? plot.y : plot.x;
370
+ const slotSize = catSpan / data.categories.length;
371
+ if (showAxis) {
372
+ data.categories.forEach((c, i) => {
373
+ const mid = catStart + slotSize * (i + 0.5);
374
+ if (horizontal) text(plot.x - fs * 0.4, mid, c, "middle", "end", ink, fs, catGutter);
375
+ else text(mid, plot.y + plot.h + fs * 0.3, c, "top", "middle", ink, fs, slotSize);
376
+ });
377
+ }
378
+ if (kind === "bar" || kind === "row") {
379
+ const slots = barSlots(data.categories.length, data.series.length, catSpan, stacked);
380
+ const radius = Math.min(slotSize * 0.12, fs * 0.35);
381
+ const stackPos = data.categories.map(() => 0);
382
+ const stackNeg = data.categories.map(() => 0);
383
+ data.series.forEach((s, si) => {
384
+ const fill = colors[si % colors.length];
385
+ s.values.forEach((v, ci) => {
386
+ var _a2;
387
+ const slot = (_a2 = slots[ci]) == null ? void 0 : _a2[si];
388
+ if (!slot) return;
389
+ const from = v >= 0 ? stackPos[ci] : stackNeg[ci];
390
+ const base = stacked ? vPos(from) : zero;
391
+ const tip = stacked ? vPos(from + v) : vPos(v);
392
+ if (stacked) {
393
+ if (v >= 0) stackPos[ci] += v;
394
+ else stackNeg[ci] += v;
395
+ }
396
+ const along = catStart + slot.pos;
397
+ const rect = horizontal ? {
398
+ x: Math.min(base, tip),
399
+ y: along,
400
+ w: Math.abs(tip - base),
401
+ h: slot.size
402
+ } : {
403
+ x: along,
404
+ y: Math.min(base, tip),
405
+ w: slot.size,
406
+ h: Math.abs(tip - base)
407
+ };
408
+ marks.push({
409
+ t: "path",
410
+ d: roundRectD(rect.x, rect.y, rect.w, rect.h, radius),
411
+ fill
412
+ });
413
+ if (layer.valueLabels) {
414
+ if (horizontal) text(tip + fs * 0.25, along + slot.size / 2, formatValue(v), "middle", "start");
415
+ else text(along + slot.size / 2, tip - fs * 0.25, formatValue(v), "bottom", "middle");
416
+ }
417
+ });
418
+ });
419
+ return marks;
420
+ }
421
+ const pointAt = (ci, v) => {
422
+ const mid = catStart + slotSize * (ci + 0.5);
423
+ const p = vPos(v);
424
+ return horizontal ? {
425
+ px: p,
426
+ py: mid
427
+ } : {
428
+ px: mid,
429
+ py: p
430
+ };
431
+ };
432
+ const below = data.categories.map(() => 0);
433
+ data.series.forEach((s, si) => {
434
+ const lower = [...below];
435
+ if (stacked) s.values.forEach((v, ci) => below[ci] += v);
436
+ const tops = stacked ? [...below] : s.values;
437
+ const pts = tops.map((v, ci) => pointAt(ci, v != null ? v : 0));
438
+ const color = colors[si % colors.length];
439
+ const line = pts.map((p, i) => `${i === 0 ? "M" : "L"}${p.px} ${p.py}`).join("");
440
+ if (kind === "area") {
441
+ let back = "";
442
+ for (let ci = pts.length - 1; ci >= 0; ci--) {
443
+ const b = pointAt(ci, stacked ? lower[ci] : 0);
444
+ back += `L${b.px} ${b.py}`;
445
+ }
446
+ marks.push({
447
+ t: "path",
448
+ d: `${line}${back}Z`,
449
+ fill: color,
450
+ opacity: 0.45
451
+ });
452
+ }
453
+ marks.push({
454
+ t: "path",
455
+ d: line,
456
+ stroke: color,
457
+ sw: Math.max(1.5, h * 8e-3)
458
+ });
459
+ if (kind === "line") for (const p of pts) marks.push({
460
+ t: "circle",
461
+ cx: p.px,
462
+ cy: p.py,
463
+ r: Math.max(2, h * 0.012),
464
+ fill: color
465
+ });
466
+ if (layer.valueLabels) pts.forEach((p, ci) => {
467
+ var _a2;
468
+ return text(p.px, p.py - fs * 0.4, formatValue((_a2 = s.values[ci]) != null ? _a2 : 0), "bottom", "middle");
469
+ });
470
+ });
471
+ return marks;
472
+ }export{DEFAULT_CHART_COLORS,barSlots,chartMarks,formatValue,labelInkOn,legendEntries,niceTicks,parseCell,pieSlices,readChartData,seriesExtent,slicePath,textWidth,writeChartData};//# sourceMappingURL=chart.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart.js","sources":["../../../../src/features/design/doc/chart.ts"],"sourcesContent":["/**\n * Chart data as the renderer reads it - native twin of canvas-surface\n * `utils/chart.ts` `readChartData`: `categories`/`series` when present, else\n * the legacy single-series `data` rows, and `writeChartData` for the chart\n * data sheet (editor/ChartDataPanel.tsx).\n *\n * Pure: runs under jest as-is.\n */\nimport type { ChartLayer } from './types';\n\nexport interface ChartData {\n categories: string[];\n series: { name: string; values: number[] }[];\n}\n\nconst num = (v: unknown): number => {\n const n = typeof v === 'number' ? v : Number(v);\n return Number.isFinite(n) ? n : 0;\n};\n\nexport function readChartData(layer: Pick<ChartLayer, 'data' | 'categories' | 'series'>): ChartData {\n const legacy = layer.data ?? [];\n const rawCats = layer.categories?.length ? layer.categories : legacy.map((d) => String(d?.label ?? ''));\n const rawSeries = layer.series?.length ? layer.series : [{ name: '', values: legacy.map((d) => num(d?.value)) }];\n const len = Math.max(rawCats.length, ...rawSeries.map((s) => s.values?.length ?? 0), 0);\n return {\n categories: Array.from({ length: len }, (_, i) => rawCats[i] ?? ''),\n series: rawSeries.map((s) => ({\n name: s.name ?? '',\n values: Array.from({ length: len }, (_, i) => num(s.values?.[i])),\n })),\n };\n}\n\n/** The largest value an axis has to reach: per bar, or per stacked column. */\nexport function chartMax(data: ChartData, stacked: boolean): number {\n let max = 0;\n for (let i = 0; i < data.categories.length; i += 1) {\n if (stacked)\n max = Math.max(\n max,\n data.series.reduce((sum, s) => sum + Math.max(0, s.values[i] ?? 0), 0),\n );\n else for (const s of data.series) max = Math.max(max, s.values[i] ?? 0);\n }\n return max > 0 ? max : 1;\n}\n\n/** Pie / donut slices of the first series: start and sweep in radians, clockwise from 12 o'clock. */\nexport function pieSlices(values: readonly number[]): Array<{ start: number; sweep: number; index: number }> {\n const positive = values.map((v) => Math.max(0, v));\n const total = positive.reduce((a, b) => a + b, 0);\n if (total <= 0) return [];\n let at = 0;\n return positive.map((v, index) => {\n const sweep = (v / total) * Math.PI * 2;\n const slice = { start: at, sweep, index };\n at += sweep;\n return slice;\n });\n}\n\n/** An SVG arc path for one slice of a circle of radius `r` at (cx, cy); `inner` > 0 makes a donut ring. */\nexport function slicePath(cx: number, cy: number, r: number, start: number, sweep: number, inner = 0): string {\n const pt = (radius: number, a: number) => [cx + radius * Math.sin(a), cy - radius * Math.cos(a)];\n // A full circle cannot be one arc; draw it a hair short.\n const s = Math.min(sweep, Math.PI * 2 - 1e-4);\n const large = s > Math.PI ? 1 : 0;\n const [x0, y0] = pt(r, start);\n const [x1, y1] = pt(r, start + s);\n if (inner <= 0) return `M${cx} ${cy}L${x0} ${y0}A${r} ${r} 0 ${large} 1 ${x1} ${y1}Z`;\n const [x2, y2] = pt(inner, start + s);\n const [x3, y3] = pt(inner, start);\n return `M${x0} ${y0}A${r} ${r} 0 ${large} 1 ${x1} ${y1}L${x2} ${y2}A${inner} ${inner} 0 ${large} 0 ${x3} ${y3}Z`;\n}\n\n/** The fields a data edit writes (web `writeChartData`): series 0 mirrored into `data` for older readers. */\nexport function writeChartData(data: ChartData): Pick<ChartLayer, 'categories' | 'series' | 'data'> {\n const first = data.series[0]?.values ?? [];\n return {\n categories: [...data.categories],\n series: data.series.map((s) => ({ name: s.name, values: [...s.values] })),\n data: data.categories.map((label, i) => ({ label, value: num(first[i]) })),\n };\n}\n\n/** A typed cell as a number: commas and spaces dropped; anything unreadable is 0. */\nexport function parseCell(text: string): number {\n const n = Number(text.replace(/[\\s,]/g, ''));\n return Number.isFinite(n) ? n : 0;\n}\n"],"names":["_a","_b"],"mappings":"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"}
1
+ {"version":3,"file":"chart.js","sources":["../../../../src/features/design/doc/chart.ts"],"sourcesContent":["/**\n * Chart data as the renderer reads it - native twin of canvas-surface\n * `utils/chart.ts` `readChartData`: `categories`/`series` when present, else\n * the legacy single-series `data` rows, and `writeChartData` for the chart\n * data sheet (editor/ChartDataPanel.tsx).\n *\n * Pure: runs under jest as-is.\n */\nimport type { ChartLayer } from './types';\n\nexport interface ChartData {\n categories: string[];\n series: { name: string; values: number[] }[];\n}\n\nconst num = (v: unknown): number => {\n const n = typeof v === 'number' ? v : Number(v);\n return Number.isFinite(n) ? n : 0;\n};\n\nexport function readChartData(layer: Pick<ChartLayer, 'data' | 'categories' | 'series'>): ChartData {\n const legacy = layer.data ?? [];\n const rawCats = layer.categories?.length ? layer.categories : legacy.map((d) => String(d?.label ?? ''));\n const rawSeries = layer.series?.length ? layer.series : [{ name: '', values: legacy.map((d) => num(d?.value)) }];\n const len = Math.max(rawCats.length, ...rawSeries.map((s) => s.values?.length ?? 0), 0);\n return {\n categories: Array.from({ length: len }, (_, i) => rawCats[i] ?? ''),\n series: rawSeries.map((s) => ({\n name: s.name ?? '',\n values: Array.from({ length: len }, (_, i) => num(s.values?.[i])),\n })),\n };\n}\n\n/** The largest value an axis has to reach: per bar, or per stacked column. */\nexport function chartMax(data: ChartData, stacked: boolean): number {\n let max = 0;\n for (let i = 0; i < data.categories.length; i += 1) {\n if (stacked)\n max = Math.max(\n max,\n data.series.reduce((sum, s) => sum + Math.max(0, s.values[i] ?? 0), 0),\n );\n else for (const s of data.series) max = Math.max(max, s.values[i] ?? 0);\n }\n return max > 0 ? max : 1;\n}\n\n/** Pie / donut slices of the first series: start and sweep in radians, clockwise from 12 o'clock. */\nexport function pieSlices(values: readonly number[]): Array<{ start: number; sweep: number; index: number }> {\n const positive = values.map((v) => Math.max(0, v));\n const total = positive.reduce((a, b) => a + b, 0);\n if (total <= 0) return [];\n let at = 0;\n return positive.map((v, index) => {\n const sweep = (v / total) * Math.PI * 2;\n const slice = { start: at, sweep, index };\n at += sweep;\n return slice;\n });\n}\n\n/** An SVG arc path for one slice of a circle of radius `r` at (cx, cy); `inner` > 0 makes a donut ring. */\nexport function slicePath(cx: number, cy: number, r: number, start: number, sweep: number, inner = 0): string {\n const pt = (radius: number, a: number) => [cx + radius * Math.sin(a), cy - radius * Math.cos(a)];\n // A full circle cannot be one arc; draw it a hair short.\n const s = Math.min(sweep, Math.PI * 2 - 1e-4);\n const large = s > Math.PI ? 1 : 0;\n const [x0, y0] = pt(r, start);\n const [x1, y1] = pt(r, start + s);\n if (inner <= 0) return `M${cx} ${cy}L${x0} ${y0}A${r} ${r} 0 ${large} 1 ${x1} ${y1}Z`;\n const [x2, y2] = pt(inner, start + s);\n const [x3, y3] = pt(inner, start);\n return `M${x0} ${y0}A${r} ${r} 0 ${large} 1 ${x1} ${y1}L${x2} ${y2}A${inner} ${inner} 0 ${large} 0 ${x3} ${y3}Z`;\n}\n\n/** The fields a data edit writes (web `writeChartData`): series 0 mirrored into `data` for older readers. */\nexport function writeChartData(data: ChartData): Pick<ChartLayer, 'categories' | 'series' | 'data'> {\n const first = data.series[0]?.values ?? [];\n return {\n categories: [...data.categories],\n series: data.series.map((s) => ({ name: s.name, values: [...s.values] })),\n data: data.categories.map((label, i) => ({ label, value: num(first[i]) })),\n };\n}\n\n/** A typed cell as a number: commas and spaces dropped; anything unreadable is 0. */\nexport function parseCell(text: string): number {\n const n = Number(text.replace(/[\\s,]/g, ''));\n return Number.isFinite(n) ? n : 0;\n}\n\n// ── Layout (web studio `utils/chart.ts` drawChart) ──────────────────────\n//\n// The chart as web draws it - title band, legend rows (on unless turned off),\n// nice value ticks with gridlines and axis labels, grouped or stacked bars\n// that go below zero, value labels - as plain marks the SVG renderer draws.\n// Text `y` is the alphabetic baseline; widths are estimated (no canvas here).\n\nexport const DEFAULT_CHART_COLORS = ['#38bdf8', '#818cf8', '#f472b6', '#fbbf24', '#34d399', '#f87171', '#a78bfa'];\nconst INK_DARK = '#334155';\nconst INK_LIGHT = '#f8fafc';\n\n/** 1/2/5 x 10^n ticks spanning both bounds, so the plot never clips a bar. */\nexport function niceTicks(min: number, max: number, count = 5): number[] {\n if (!Number.isFinite(min) || !Number.isFinite(max)) return [0];\n if (min === max) return [min];\n const raw = Math.abs(max - min) / Math.max(1, count);\n const mag = 10 ** Math.floor(Math.log10(raw));\n const norm = raw / mag;\n const step = (norm <= 1 ? 1 : norm <= 2 ? 2 : norm <= 5 ? 5 : 10) * mag;\n const start = Math.floor(min / step) * step;\n const end = Math.ceil(max / step) * step;\n const out: number[] = [];\n for (let v = start; v <= end + step * 1e-9; v += step) out.push(Number(v.toPrecision(12)));\n return out;\n}\n\n/** Value range to plot, always including the zero baseline. */\nexport function seriesExtent(data: ChartData, stacked = false): [number, number] {\n let min = 0;\n let max = 0;\n if (stacked) {\n data.categories.forEach((_, i) => {\n let pos = 0;\n let neg = 0;\n for (const s of data.series) {\n const v = s.values[i] ?? 0;\n if (v >= 0) pos += v;\n else neg += v;\n }\n max = Math.max(max, pos);\n min = Math.min(min, neg);\n });\n } else {\n for (const s of data.series)\n for (const v of s.values) {\n max = Math.max(max, v);\n min = Math.min(min, v);\n }\n }\n if (max === min) max = min + 1;\n return [min, max];\n}\n\n/** Grouped bars divide a category slot; stacked bars share it. 0.7 of the slot is bars. */\nexport function barSlots(\n categories: number,\n series: number,\n span: number,\n stacked = false,\n): { pos: number; size: number }[][] {\n if (categories <= 0 || series <= 0 || span <= 0) return [];\n const slot = span / categories;\n const band = slot * 0.7;\n const size = stacked ? band : band / series;\n return Array.from({ length: categories }, (_, c) =>\n Array.from({ length: series }, (_, s) => ({\n pos: slot * c + (slot - band) / 2 + (stacked ? 0 : size * s),\n size,\n })),\n );\n}\n\n/** Compact axis/value text: 12.5k rather than 12,500 once the numbers get long. */\nexport function formatValue(v: number): string {\n const abs = Math.abs(v);\n if (abs >= 1_000_000) return `${Number((v / 1_000_000).toFixed(1))}M`;\n if (abs >= 10_000) return `${Number((v / 1000).toFixed(1))}k`;\n const fixed = Number(v.toFixed(2));\n // Hermes' toLocaleString ignores locales: group thousands by hand.\n const [int, frac] = String(fixed).split('.');\n return `${int.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')}${frac ? `.${frac}` : ''}`;\n}\n\nfunction lightness(hex: string | undefined): number {\n const m = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec((hex ?? '').trim());\n if (!m) return -1;\n const h = m[1].length === 3 ? [...m[1]].map((c) => c + c).join('') : m[1];\n const n = parseInt(h, 16);\n const [r, g, b] = [(n >> 16) & 255, (n >> 8) & 255, n & 255];\n return (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n}\n\n/** Slice-label ink that stays visible on its slice colour. */\nexport function labelInkOn(fill: string, ink: string): string {\n const f = lightness(fill);\n const i = lightness(ink);\n if (f < 0 || (i >= 0 && Math.abs(f - i) >= 0.4)) return ink;\n return f > 0.55 ? INK_DARK : INK_LIGHT;\n}\n\n/** Pie and donut legends name slices (only the first series is drawn); the rest name series. */\nexport function legendEntries(\n kind: ChartLayer['chart'],\n data: ChartData,\n colors: string[],\n): Array<{ name: string; color: string }> {\n const palette = colors.length ? colors : DEFAULT_CHART_COLORS;\n if (kind === 'pie' || kind === 'donut')\n return data.categories.map((name, i) => ({ name, color: palette[i % palette.length] }));\n return data.series.map((s, i) => ({ name: s.name || `Series ${i + 1}`, color: palette[i % palette.length] }));\n}\n\nexport type ChartMark =\n | { t: 'rect'; x: number; y: number; w: number; h: number; r: number; fill: string }\n | { t: 'path'; d: string; fill?: string; stroke?: string; sw?: number; opacity?: number }\n | { t: 'line'; x1: number; y1: number; x2: number; y2: number; stroke: string; sw: number; opacity: number }\n | { t: 'circle'; cx: number; cy: number; r: number; fill: string }\n | {\n t: 'text';\n x: number;\n y: number;\n text: string;\n size: number;\n weight?: '600';\n fill: string;\n anchor: 'start' | 'middle' | 'end';\n };\n\n/** Estimated advance of `text` at `size` (no canvas to measure with). */\nexport function textWidth(text: string, size: number): number {\n return text.length * size * 0.56;\n}\n\nfunction fit(text: string, size: number, maxW: number): string {\n if (maxW <= 0) return '';\n if (textWidth(text, size) <= maxW) return text;\n const keep = Math.max(0, Math.floor(maxW / (size * 0.56)) - 1);\n return keep > 0 ? `${text.slice(0, keep)}…` : '';\n}\n\ntype Baseline = 'top' | 'middle' | 'bottom';\nconst baselineY = (y: number, size: number, b: Baseline) =>\n b === 'top' ? y + size * 0.8 : b === 'middle' ? y + size * 0.35 : y - size * 0.2;\n\nfunction roundRectD(x: number, y: number, w: number, h: number, r: number): string {\n const rr = Math.max(0, Math.min(r, w / 2, h / 2));\n if (!rr) return `M${x} ${y}H${x + w}V${y + h}H${x}Z`;\n return (\n `M${x + rr} ${y}H${x + w - rr}A${rr} ${rr} 0 0 1 ${x + w} ${y + rr}V${y + h - rr}` +\n `A${rr} ${rr} 0 0 1 ${x + w - rr} ${y + h}H${x + rr}A${rr} ${rr} 0 0 1 ${x} ${y + h - rr}V${y + rr}A${rr} ${rr} 0 0 1 ${x + rr} ${y}Z`\n );\n}\n\nexport function chartMarks(layer: ChartLayer, w: number, h: number): ChartMark[] {\n const data = readChartData(layer);\n if (data.categories.length === 0 || data.series.length === 0 || w <= 0 || h <= 0) return [];\n const marks: ChartMark[] = [];\n const kind = layer.chart;\n const colors = layer.colors?.length ? layer.colors : DEFAULT_CHART_COLORS;\n const ink = layer.ink ?? INK_DARK;\n const stacked = Boolean(layer.stacked);\n const legend = legendEntries(kind, data, colors);\n const showLegend = layer.legend !== false && legend.length > 1;\n const showGrid = layer.gridlines !== false;\n const showAxis = layer.axisLabels !== false;\n const fs = Math.max(8, Math.min(h * 0.055, w * 0.05));\n const text = (\n x: number,\n y: number,\n s: string,\n b: Baseline,\n anchor: 'start' | 'middle' | 'end',\n fill = ink,\n size = fs,\n maxW?: number,\n ) => {\n const shown = maxW === undefined ? s : fit(s, size, maxW);\n if (shown) marks.push({ t: 'text', x, y: baselineY(y, size, b), text: shown, size, fill, anchor });\n };\n\n let top = 0;\n if (layer.title) {\n const size = fs * 1.15;\n const shown = fit(layer.title, size, w);\n if (shown)\n marks.push({\n t: 'text',\n x: w / 2,\n y: baselineY(0, size, 'top'),\n text: shown,\n size,\n weight: '600',\n fill: ink,\n anchor: 'middle',\n });\n top += fs * 1.7;\n }\n if (showLegend) {\n const dot = fs * 0.55;\n const gap = fs * 0.7;\n const rows: Array<Array<{ name: string; color: string; ink: number; advance: number }>> = [];\n let used = 0;\n for (const e of legend) {\n const inkW = Math.min(w, dot + gap * 0.5 + textWidth(e.name, fs));\n const chip = { ...e, ink: inkW, advance: inkW + gap * 1.1 };\n const row = rows[rows.length - 1];\n if (row && used + inkW <= w) {\n row.push(chip);\n used += chip.advance;\n } else {\n rows.push([chip]);\n used = chip.advance;\n }\n }\n rows.forEach((row, r) => {\n const total = row.slice(0, -1).reduce((a, e) => a + e.advance, 0) + row[row.length - 1].ink;\n let cx = Math.max(0, (w - total) / 2);\n const cy = top + fs * 1.6 * (r + 0.5);\n for (const e of row) {\n marks.push({ t: 'circle', cx: cx + dot / 2, cy, r: dot / 2, fill: e.color });\n text(\n cx + dot + gap * 0.5,\n cy,\n e.name,\n 'middle',\n 'start',\n ink,\n fs,\n Math.max(0, e.ink - dot - gap * 0.5),\n );\n cx += e.advance;\n }\n });\n top += fs * 1.6 * rows.length + fs * 0.4;\n }\n\n if (kind === 'pie' || kind === 'donut') {\n const pad = fs * 0.3;\n const pw = w - pad * 2;\n const ph = h - top - pad * 2;\n const cx = pad + pw / 2;\n const cy = top + pad + ph / 2;\n const r = Math.max(0, Math.min(pw, ph) / 2);\n const hole = kind === 'donut' ? r * Math.max(0, Math.min(0.9, layer.holeFrac ?? 0.55)) : 0;\n const values = data.series[0]?.values ?? [];\n const total = values.reduce((s, v) => s + Math.max(0, v), 0);\n for (const s of pieSlices(values)) {\n if (s.sweep <= 0) continue;\n const fill = colors[s.index % colors.length];\n marks.push({ t: 'path', d: slicePath(cx, cy, r, s.start, s.sweep, hole), fill });\n if (layer.valueLabels && total > 0) {\n const mid = s.start + s.sweep / 2;\n const lr = hole > 0 ? (r + hole) / 2 : r * 0.65;\n text(\n cx + Math.sin(mid) * lr,\n cy - Math.cos(mid) * lr,\n `${Math.round((s.sweep / (Math.PI * 2)) * 100)}%`,\n 'middle',\n 'middle',\n labelInkOn(fill, ink),\n );\n }\n }\n return marks;\n }\n\n const [minV, maxV] = seriesExtent(data, stacked);\n const ticks = niceTicks(minV, maxV);\n const lo = ticks[0];\n const hi = ticks[ticks.length - 1];\n const range = hi - lo || 1;\n const horizontal = kind === 'row';\n const tickText = ticks.map(formatValue);\n const valueGutter = showAxis ? Math.max(...tickText.map((t) => textWidth(t, fs))) + fs * 0.5 : 0;\n const catGutter = showAxis\n ? horizontal\n ? Math.min(w * 0.4, Math.max(...data.categories.map((c) => textWidth(c, fs))) + fs * 0.5)\n : fs * 1.4\n : 0;\n const labelRoom = layer.valueLabels\n ? horizontal\n ? Math.max(...data.series.flatMap((s) => s.values.map((v) => textWidth(formatValue(v), fs)))) + fs * 0.4\n : fs * 1.4\n : 0;\n const plot = horizontal\n ? { x: catGutter, y: top, w: w - catGutter - labelRoom, h: h - top - (showAxis ? fs * 1.4 : 0) }\n : { x: valueGutter, y: top + labelRoom, w: w - valueGutter, h: h - top - labelRoom - catGutter };\n if (plot.w <= 0 || plot.h <= 0) return marks;\n\n const vPos = (v: number) =>\n horizontal ? plot.x + ((v - lo) / range) * plot.w : plot.y + plot.h - ((v - lo) / range) * plot.h;\n const zero = vPos(Math.max(lo, Math.min(hi, 0)));\n const sw = Math.max(1, h * 0.003);\n ticks.forEach((t, i) => {\n const p = vPos(t);\n if (showGrid) {\n marks.push(\n horizontal\n ? {\n t: 'line',\n x1: p,\n y1: plot.y,\n x2: p,\n y2: plot.y + plot.h,\n stroke: ink,\n sw,\n opacity: t === 0 ? 0.35 : 0.16,\n }\n : {\n t: 'line',\n x1: plot.x,\n y1: p,\n x2: plot.x + plot.w,\n y2: p,\n stroke: ink,\n sw,\n opacity: t === 0 ? 0.35 : 0.16,\n },\n );\n }\n if (showAxis) {\n if (horizontal) text(p, plot.y + plot.h + fs * 0.3, tickText[i], 'top', 'middle');\n else text(plot.x - fs * 0.4, p, tickText[i], 'middle', 'end');\n }\n });\n\n const catSpan = horizontal ? plot.h : plot.w;\n const catStart = horizontal ? plot.y : plot.x;\n const slotSize = catSpan / data.categories.length;\n if (showAxis) {\n data.categories.forEach((c, i) => {\n const mid = catStart + slotSize * (i + 0.5);\n if (horizontal) text(plot.x - fs * 0.4, mid, c, 'middle', 'end', ink, fs, catGutter);\n else text(mid, plot.y + plot.h + fs * 0.3, c, 'top', 'middle', ink, fs, slotSize);\n });\n }\n\n if (kind === 'bar' || kind === 'row') {\n const slots = barSlots(data.categories.length, data.series.length, catSpan, stacked);\n const radius = Math.min(slotSize * 0.12, fs * 0.35);\n const stackPos = data.categories.map(() => 0);\n const stackNeg = data.categories.map(() => 0);\n data.series.forEach((s, si) => {\n const fill = colors[si % colors.length];\n s.values.forEach((v, ci) => {\n const slot = slots[ci]?.[si];\n if (!slot) return;\n const from = v >= 0 ? stackPos[ci] : stackNeg[ci];\n const base = stacked ? vPos(from) : zero;\n const tip = stacked ? vPos(from + v) : vPos(v);\n if (stacked) {\n if (v >= 0) stackPos[ci] += v;\n else stackNeg[ci] += v;\n }\n const along = catStart + slot.pos;\n const rect = horizontal\n ? { x: Math.min(base, tip), y: along, w: Math.abs(tip - base), h: slot.size }\n : { x: along, y: Math.min(base, tip), w: slot.size, h: Math.abs(tip - base) };\n marks.push({ t: 'path', d: roundRectD(rect.x, rect.y, rect.w, rect.h, radius), fill });\n if (layer.valueLabels) {\n if (horizontal) text(tip + fs * 0.25, along + slot.size / 2, formatValue(v), 'middle', 'start');\n else text(along + slot.size / 2, tip - fs * 0.25, formatValue(v), 'bottom', 'middle');\n }\n });\n });\n return marks;\n }\n\n // line | area: one polyline per series through the middle of each category slot.\n const pointAt = (ci: number, v: number) => {\n const mid = catStart + slotSize * (ci + 0.5);\n const p = vPos(v);\n return horizontal ? { px: p, py: mid } : { px: mid, py: p };\n };\n const below = data.categories.map(() => 0);\n data.series.forEach((s, si) => {\n const lower = [...below];\n if (stacked) s.values.forEach((v, ci) => (below[ci] += v));\n const tops = stacked ? [...below] : s.values;\n const pts = tops.map((v, ci) => pointAt(ci, v ?? 0));\n const color = colors[si % colors.length];\n const line = pts.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.px} ${p.py}`).join('');\n if (kind === 'area') {\n let back = '';\n for (let ci = pts.length - 1; ci >= 0; ci--) {\n const b = pointAt(ci, stacked ? lower[ci] : 0);\n back += `L${b.px} ${b.py}`;\n }\n marks.push({ t: 'path', d: `${line}${back}Z`, fill: color, opacity: 0.45 });\n }\n marks.push({ t: 'path', d: line, stroke: color, sw: Math.max(1.5, h * 0.008) });\n if (kind === 'line')\n for (const p of pts)\n marks.push({ t: 'circle', cx: p.px, cy: p.py, r: Math.max(2, h * 0.012), fill: color });\n if (layer.valueLabels)\n pts.forEach((p, ci) => text(p.px, p.py - fs * 0.4, formatValue(s.values[ci] ?? 0), 'bottom', 'middle'));\n });\n return marks;\n}\n"],"names":["_a","_b","_"],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ const TEXT_FIELDS = ["fontToken", "fontFamily", "fontWeight", "fontSizeFrac", "color", "align", "justify", "lineHeight", "italic", "underline", "strike", "uppercase", "letterSpacingFrac", "listStyle", "outline", "shadow", "effect", "curve", "opacity"];
2
+ const SHAPE_FIELDS = ["fill", "fillTo", "fillAngle", "stroke", "strokeWidthFrac", "radiusFrac", "opacity"];
3
+ const IMAGE_FIELDS = ["adjust", "shadow", "opacity"];
4
+ const CHART_FIELDS = ["colors", "opacity", "legend", "gridlines", "valueLabels", "axisLabels", "ink", "holeFrac"];
5
+ const FIELDS = {
6
+ text: TEXT_FIELDS,
7
+ shape: SHAPE_FIELDS,
8
+ image: IMAGE_FIELDS,
9
+ chart: CHART_FIELDS
10
+ };
11
+ const clone = (v) => v === void 0 ? v : JSON.parse(JSON.stringify(v));
12
+ function copyStyle(layer) {
13
+ const fields = {};
14
+ for (const key of FIELDS[layer.kind]) fields[key] = clone(layer[key]);
15
+ return {
16
+ kind: layer.kind,
17
+ fields
18
+ };
19
+ }
20
+ function leadColor(style) {
21
+ var _a;
22
+ const f = style.fields;
23
+ if (style.kind === "text") return f.color;
24
+ if (style.kind === "shape") return f.fill;
25
+ if (style.kind === "chart") return (_a = f.colors) == null ? void 0 : _a[0];
26
+ return void 0;
27
+ }
28
+ function pasteStylePatch(style, target) {
29
+ if (style.kind === target.kind) {
30
+ const out2 = {};
31
+ for (const [key, value] of Object.entries(style.fields)) out2[key] = clone(value);
32
+ if (target.kind === "text") out2.runs = void 0;
33
+ return out2;
34
+ }
35
+ const color = leadColor(style);
36
+ const opacity = style.fields.opacity;
37
+ const out = {};
38
+ if (opacity != null) out.opacity = opacity;
39
+ if (color) {
40
+ if (target.kind === "text") out.color = color;
41
+ else if (target.kind === "shape") {
42
+ out.fill = color;
43
+ out.fillTo = void 0;
44
+ }
45
+ }
46
+ return out;
47
+ }export{copyStyle,pasteStylePatch};//# sourceMappingURL=copyStyle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copyStyle.js","sources":["../../../../src/features/design/doc/copyStyle.ts"],"sourcesContent":["/**\n * Copy style / Paste style - native twin of web studio `utils/copyStyle.ts`,\n * field for field. A same-kind paste carries the whole look (and clears what\n * the source lacks, its text runs too); across kinds only colour and opacity.\n * Pure: runs under jest as-is.\n */\nimport type { EditorLayer } from './types';\n\nexport interface CopiedStyle {\n kind: EditorLayer['kind'];\n fields: Partial<EditorLayer>;\n}\n\nconst TEXT_FIELDS = [\n 'fontToken',\n 'fontFamily',\n 'fontWeight',\n 'fontSizeFrac',\n 'color',\n 'align',\n 'justify',\n 'lineHeight',\n 'italic',\n 'underline',\n 'strike',\n 'uppercase',\n 'letterSpacingFrac',\n 'listStyle',\n 'outline',\n 'shadow',\n 'effect',\n 'curve',\n 'opacity',\n] as const;\nconst SHAPE_FIELDS = ['fill', 'fillTo', 'fillAngle', 'stroke', 'strokeWidthFrac', 'radiusFrac', 'opacity'] as const;\nconst IMAGE_FIELDS = ['adjust', 'shadow', 'opacity'] as const;\nconst CHART_FIELDS = [\n 'colors',\n 'opacity',\n 'legend',\n 'gridlines',\n 'valueLabels',\n 'axisLabels',\n 'ink',\n 'holeFrac',\n] as const;\n\nconst FIELDS: Record<EditorLayer['kind'], readonly string[]> = {\n text: TEXT_FIELDS,\n shape: SHAPE_FIELDS,\n image: IMAGE_FIELDS,\n chart: CHART_FIELDS,\n};\n\n/** Deep enough for the nested looks (shadow, effect, adjust, colours) that a later edit must not reach back into. */\nconst clone = <T>(v: T): T => (v === undefined ? v : (JSON.parse(JSON.stringify(v)) as T));\n\nexport function copyStyle(layer: EditorLayer): CopiedStyle {\n const fields: Record<string, unknown> = {};\n // Every field, set or not: pasting must also clear what the source doesn't have (an effect, a shadow).\n for (const key of FIELDS[layer.kind]) fields[key] = clone((layer as unknown as Record<string, unknown>)[key]);\n return { kind: layer.kind, fields: fields as Partial<EditorLayer> };\n}\n\nfunction leadColor(style: CopiedStyle): string | undefined {\n const f = style.fields as Record<string, unknown>;\n if (style.kind === 'text') return f.color as string | undefined;\n if (style.kind === 'shape') return f.fill as string | undefined;\n if (style.kind === 'chart') return (f.colors as string[] | undefined)?.[0];\n return undefined;\n}\n\nexport function pasteStylePatch(style: CopiedStyle, target: EditorLayer): Partial<EditorLayer> {\n if (style.kind === target.kind) {\n // Field by field: a whole-object JSON clone would drop the unset ones, and those are what clear the target's.\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(style.fields)) out[key] = clone(value);\n // The copied look takes over every word, as Canva's does; the target's own mixed styles go.\n if (target.kind === 'text') out.runs = undefined;\n return out as Partial<EditorLayer>;\n }\n const color = leadColor(style);\n const opacity = (style.fields as { opacity?: number }).opacity;\n const out: Record<string, unknown> = {};\n if (opacity != null) out.opacity = opacity;\n if (color) {\n if (target.kind === 'text') out.color = color;\n else if (target.kind === 'shape') {\n out.fill = color;\n out.fillTo = undefined;\n }\n }\n return out as Partial<EditorLayer>;\n}\n"],"names":["out"],"mappings":"AAWA,MAAM,WAAA,GAAc,CAAC,WAAa,EAAA,YAAA,EAAc,cAAc,cAAgB,EAAA,OAAA,EAAS,SAAS,SAAW,EAAA,YAAA,EAAc,UAAU,WAAa,EAAA,QAAA,EAAU,aAAa,mBAAqB,EAAA,WAAA,EAAa,WAAW,QAAU,EAAA,QAAA,EAAU,SAAS,SAAS,CAAA;AAC1P,MAAM,YAAA,GAAe,CAAC,MAAQ,EAAA,QAAA,EAAU,aAAa,QAAU,EAAA,iBAAA,EAAmB,cAAc,SAAS,CAAA;AACzG,MAAM,YAAe,GAAA,CAAC,QAAU,EAAA,QAAA,EAAU,SAAS,CAAA;AACnD,MAAM,YAAA,GAAe,CAAC,QAAU,EAAA,SAAA,EAAW,UAAU,WAAa,EAAA,aAAA,EAAe,YAAc,EAAA,KAAA,EAAO,UAAU,CAAA;AAChH,MAAM,MAAyD,GAAA;AAAA,EAC7D,IAAM,EAAA,WAAA;AAAA,EACN,KAAO,EAAA,YAAA;AAAA,EACP,KAAO,EAAA,YAAA;AAAA,EACP,KAAO,EAAA;AACT,CAAA;AAGA,MAAM,KAAA,GAAQ,CAAK,CAAA,KAAY,CAAM,KAAA,MAAA,GAAY,CAAI,GAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,SAAU,CAAA,CAAC,CAAC,CAAA;AAC1E,SAAS,UAAU,KAAiC,EAAA;AACzD,EAAA,MAAM,SAAkC,EAAC;AAEzC,EAAW,KAAA,MAAA,GAAA,IAAO,MAAO,CAAA,KAAA,CAAM,IAAI,CAAA,EAAU,MAAA,CAAA,GAAG,CAAI,GAAA,KAAA,CAAO,KAA6C,CAAA,GAAG,CAAC,CAAA;AAC5G,EAAO,OAAA;AAAA,IACL,MAAM,KAAM,CAAA,IAAA;AAAA,IACZ;AAAA,GACF;AACF;AACA,SAAS,UAAU,KAAwC,EAAA;AAjC3D,EAAA,IAAA,EAAA;AAkCE,EAAA,MAAM,IAAI,KAAM,CAAA,MAAA;AAChB,EAAA,IAAI,KAAM,CAAA,IAAA,KAAS,MAAQ,EAAA,OAAO,CAAE,CAAA,KAAA;AACpC,EAAA,IAAI,KAAM,CAAA,IAAA,KAAS,OAAS,EAAA,OAAO,CAAE,CAAA,IAAA;AACrC,EAAA,IAAI,MAAM,IAAS,KAAA,OAAA,EAAiB,OAAA,CAAA,EAAA,GAAA,CAAA,CAAE,WAAF,IAAoC,GAAA,MAAA,GAAA,EAAA,CAAA,CAAA,CAAA;AACxE,EAAO,OAAA,MAAA;AACT;AACgB,SAAA,eAAA,CAAgB,OAAoB,MAA2C,EAAA;AAC7F,EAAI,IAAA,KAAA,CAAM,IAAS,KAAA,MAAA,CAAO,IAAM,EAAA;AAE9B,IAAA,MAAMA,OAA+B,EAAC;AACtC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,OAAO,OAAQ,CAAA,KAAA,CAAM,MAAM,CAAA,EAAGA,IAAAA,CAAI,GAAG,CAAA,GAAI,MAAM,KAAK,CAAA;AAE/E,IAAA,IAAI,MAAO,CAAA,IAAA,KAAS,MAAQ,EAAAA,KAAI,IAAO,GAAA,MAAA;AACvC,IAAOA,OAAAA,IAAAA;AAAA;AAET,EAAM,MAAA,KAAA,GAAQ,UAAU,KAAK,CAAA;AAC7B,EAAM,MAAA,OAAA,GAAW,MAAM,MAEpB,CAAA,OAAA;AACH,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAI,IAAA,OAAA,IAAW,IAAM,EAAA,GAAA,CAAI,OAAU,GAAA,OAAA;AACnC,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,IAAI,MAAO,CAAA,IAAA,KAAS,MAAQ,EAAA,GAAA,CAAI,KAAQ,GAAA,KAAA;AAAA,SAAe,IAAA,MAAA,CAAO,SAAS,OAAS,EAAA;AAC9E,MAAA,GAAA,CAAI,IAAO,GAAA,KAAA;AACX,MAAA,GAAA,CAAI,MAAS,GAAA,MAAA;AAAA;AACf;AAEF,EAAO,OAAA,GAAA;AACT"}
@@ -51,6 +51,22 @@ function mapLayers(doc, pageId, fn) {
51
51
  });
52
52
  });
53
53
  }
54
+ const RUN_STYLE_KEYS = ["fontFamily", "fontWeight", "fontSizeFrac", "italic", "underline", "strike", "color", "lineHeight", "letterSpacingFrac"];
55
+ function withRunsCleared(layer, patch) {
56
+ var _a;
57
+ const next = __spreadValues(__spreadValues({}, layer), patch);
58
+ if (layer.kind !== "text" || !((_a = layer.runs) == null ? void 0 : _a.length) || "runs" in patch) return next;
59
+ const keys = RUN_STYLE_KEYS.filter((k) => k in patch);
60
+ if (!keys.length) return next;
61
+ const runs = layer.runs.map((run) => {
62
+ const kept = __spreadValues({}, run);
63
+ for (const k of keys) delete kept[k];
64
+ return kept;
65
+ }).filter((run) => RUN_STYLE_KEYS.some((k) => run[k] !== void 0));
66
+ return __spreadProps(__spreadValues({}, next), {
67
+ runs: runs.length ? runs : void 0
68
+ });
69
+ }
54
70
  function cloneLayer(layer) {
55
71
  const copy = JSON.parse(JSON.stringify(layer));
56
72
  return __spreadProps(__spreadValues({}, copy), {
@@ -87,7 +103,7 @@ function editorReducer(state, action) {
87
103
  });
88
104
  }
89
105
  case "patchLayer": {
90
- const next = mapLayers(doc, action.pageId, (layers) => layers.map((l) => l.id === action.layerId ? __spreadValues(__spreadValues({}, l), action.patch) : l));
106
+ const next = mapLayers(doc, action.pageId, (layers) => layers.map((l) => l.id === action.layerId ? withRunsCleared(l, action.patch) : l));
91
107
  if (action.silent) return __spreadProps(__spreadValues({}, state), {
92
108
  doc: next
93
109
  });
@@ -111,11 +127,13 @@ function editorReducer(state, action) {
111
127
  const index = layers.findIndex((l) => l.id === action.layerId);
112
128
  if (index < 0) return state;
113
129
  const source = layers[index];
114
- const copy = __spreadProps(__spreadValues({}, cloneLayer(source)), {
130
+ const copy = __spreadValues(__spreadProps(__spreadValues({}, cloneLayer(source)), {
115
131
  x: Math.min(1 - source.w, source.x + 0.03),
116
132
  y: Math.min(1 - source.h, source.y + 0.03),
117
133
  locked: void 0
118
- });
134
+ }), source.groupId ? {
135
+ groupId: `group-${newLayerId()}`
136
+ } : {});
119
137
  const next = mapLayers(doc, action.pageId, (all) => [...all.slice(0, index + 1), copy, ...all.slice(index + 1)]);
120
138
  return commit(state, next, {
121
139
  layerId: copy.id
@@ -394,4 +412,4 @@ function makeImageLayer(src, pageW, pageH, size) {
394
412
  w,
395
413
  h
396
414
  };
397
- }export{COALESCE_MS,TEXT_PRESETS,currentPage,editorReducer,initEditorState,makeChartLayer,makeImageLayer,makeShapeLayer,makeStickerLayer,makeTextBox,makeTextLayer,selectedLayer};//# sourceMappingURL=docOps.js.map
415
+ }export{COALESCE_MS,TEXT_PRESETS,currentPage,editorReducer,initEditorState,makeChartLayer,makeImageLayer,makeShapeLayer,makeStickerLayer,makeTextBox,makeTextLayer,selectedLayer,withRunsCleared};//# sourceMappingURL=docOps.js.map