@diagrammo/dgmo 0.93.0 → 0.95.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/dist/advanced.d.ts +98 -21
  2. package/dist/advanced.js +79 -61
  3. package/dist/block.d.ts +6 -0
  4. package/dist/block.js +23 -20
  5. package/dist/chart-meta.js +9 -9
  6. package/dist/{charts-d3-ERYYVGP6.js → charts-d3-SZV2SFTM.js} +2 -2
  7. package/dist/{chunk-J6AEKIRQ.js → chunk-2I4UQG7W.js} +1 -1
  8. package/dist/{chunk-LDDDKWL6.js → chunk-2J2CWWWK.js} +1 -1
  9. package/dist/{chunk-QDRCWVV3.js → chunk-4EX4OKGZ.js} +71 -8
  10. package/dist/{chunk-A5WIAMCT.js → chunk-4UVCTLRH.js} +1 -1
  11. package/dist/{chunk-KCMGIYPO.js → chunk-5XBYLYYI.js} +1 -1
  12. package/dist/{chunk-XUTR7GNT.js → chunk-62GLKE6Q.js} +68 -29
  13. package/dist/{chunk-D6PVMUCX.js → chunk-67N26CER.js} +4 -4
  14. package/dist/{chunk-IIV4SMJL.js → chunk-6EFCOES2.js} +370 -285
  15. package/dist/{chunk-TNV4F5WA.js → chunk-7IALGIOI.js} +2 -2
  16. package/dist/{chunk-MB2SQF7N.js → chunk-7WEYXYLC.js} +1 -1
  17. package/dist/{chunk-4RY5D5RE.js → chunk-AM42TLSZ.js} +98 -93
  18. package/dist/{chunk-J43OCO22.js → chunk-BCV2VJTM.js} +2 -2
  19. package/dist/{chunk-7OWK5K5C.js → chunk-BH2SF4TT.js} +2 -2
  20. package/dist/{chunk-UVX3IYXF.js → chunk-BTP2BMWN.js} +4 -4
  21. package/dist/{chunk-MUJVNSEW.js → chunk-C6G36F5S.js} +1 -1
  22. package/dist/{chunk-ZTLMEBAC.js → chunk-E7F76M3U.js} +208 -26
  23. package/dist/{chunk-AUS7V54P.js → chunk-ERT7XDQW.js} +1 -1
  24. package/dist/{chunk-WK5QEYFA.js → chunk-EXHXTMVR.js} +3 -3
  25. package/dist/{chunk-YXXIRM4C.js → chunk-FWVE373X.js} +2 -2
  26. package/dist/{chunk-EQWC76GQ.js → chunk-GWQRTA5W.js} +2 -2
  27. package/dist/{chunk-GJXMG4S3.js → chunk-HHVIE45A.js} +1 -1
  28. package/dist/{chunk-4FT5KQ7H.js → chunk-IGJEKO2P.js} +1 -1
  29. package/dist/{chunk-KRU2LCIP.js → chunk-IHN6WDEY.js} +1 -1
  30. package/dist/{chunk-QT3KDDXK.js → chunk-IN7XI6NO.js} +0 -7
  31. package/dist/{chunk-NMK7KJZZ.js → chunk-IQN2NGEU.js} +4 -4
  32. package/dist/{chunk-M6ZQAFPD.js → chunk-IY62DXT2.js} +1 -1
  33. package/dist/{chunk-4WQX55VX.js → chunk-IZHGT5HD.js} +31 -5
  34. package/dist/{chunk-CYDM2XII.js → chunk-JJ7RGTAU.js} +56 -7
  35. package/dist/{chunk-NJJCTEBM.js → chunk-KLBTJEIK.js} +1 -1
  36. package/dist/{chunk-KHL652SX.js → chunk-KSZB7TIY.js} +1 -1
  37. package/dist/{chunk-KPSSNGAE.js → chunk-L5S32VZJ.js} +4 -4
  38. package/dist/{chunk-472EOHVW.js → chunk-LAXMUSGW.js} +31 -5
  39. package/dist/{chunk-M4NV5PPU.js → chunk-LJGE43SG.js} +1 -1
  40. package/dist/{chunk-VSOZZYLK.js → chunk-NERQSSYD.js} +20 -9
  41. package/dist/{chunk-UG7AQQNR.js → chunk-OSSTOSXU.js} +2 -2
  42. package/dist/{chunk-YDZIVDVR.js → chunk-P5XA627W.js} +7 -7
  43. package/dist/{chunk-DRQSB72S.js → chunk-PGBTUGDB.js} +2 -2
  44. package/dist/{chunk-65GPEV5V.js → chunk-QKPOIJBT.js} +2 -2
  45. package/dist/{chunk-QJOVZ4TC.js → chunk-QPQWY5RU.js} +1 -1
  46. package/dist/{chunk-P7TRFL4P.js → chunk-R46N5KR4.js} +2 -0
  47. package/dist/{chunk-LNVB75QU.js → chunk-RBVFNUAL.js} +1 -1
  48. package/dist/{chunk-DAHQL57W.js → chunk-RITTLIDJ.js} +1 -1
  49. package/dist/{chunk-2TFXRBCD.js → chunk-RQTDUZUH.js} +3 -3
  50. package/dist/{chunk-Q7Y6JQ3R.js → chunk-S4SJ4LLY.js} +1 -1
  51. package/dist/{chunk-LUDUDBO6.js → chunk-S5Y3OO3V.js} +2 -2
  52. package/dist/{chunk-3GCASUWA.js → chunk-TASRGDYP.js} +1 -1
  53. package/dist/{chunk-5HAYT43L.js → chunk-U6VS3T2M.js} +19 -3
  54. package/dist/{chunk-42UJ23H3.js → chunk-UIEKW4SG.js} +1 -0
  55. package/dist/{chunk-IESUM4N5.js → chunk-USE6HIOZ.js} +95 -62
  56. package/dist/{chunk-FIYW7JW4.js → chunk-USZLHYEQ.js} +1 -1
  57. package/dist/{chunk-U7U64UUN.js → chunk-V5D6GDNK.js} +4 -4
  58. package/dist/{chunk-ADVGV3P7.js → chunk-VB4VMB2I.js} +7 -5
  59. package/dist/{chunk-CQYFZOUC.js → chunk-VBMRZCMQ.js} +1 -1
  60. package/dist/{chunk-USAGHYRD.js → chunk-VF7IKIRS.js} +2 -2
  61. package/dist/{chunk-EJS3K44P.js → chunk-VGAMBOOC.js} +5 -3
  62. package/dist/{chunk-P5FUWXPW.js → chunk-VTESGA5F.js} +7 -5
  63. package/dist/chunk-WTTIODDV.js +9 -0
  64. package/dist/{chunk-5CBX66KB.js → chunk-XJQ6Z3FO.js} +2 -2
  65. package/dist/{chunk-KPGPK4SK.js → chunk-XOMIYMQ3.js} +6 -6
  66. package/dist/{chunk-KCHQVED5.js → chunk-YQMIKX54.js} +43 -7
  67. package/dist/completion-registry.js +3 -0
  68. package/dist/copy-image.d.ts +34 -0
  69. package/dist/copy-image.js +96 -0
  70. package/dist/countdown.js +1 -1
  71. package/dist/{dgmo-router-CZN36TR3.js → dgmo-router-6YLKM6WU.js} +13 -13
  72. package/dist/{dimensions-7HHKO5BS.js → dimensions-DS6FWLRY.js} +2 -2
  73. package/dist/{flowchart-parser-4MZPWYK6.js → flowchart-parser-J3VWIFWB.js} +5 -5
  74. package/dist/{flowchart-renderer-5XDN575E.js → flowchart-renderer-FECH5KK5.js} +14 -12
  75. package/dist/index.js +19 -19
  76. package/dist/layout-5SZ5A64I.js +24 -0
  77. package/dist/{layout-5GHV7HNM.js → layout-EWXHEXNS.js} +11 -10
  78. package/dist/{layout-QXGPY7KA.js → layout-TIBRMWHL.js} +7 -6
  79. package/dist/layout-VDCJOZSH.js +11 -0
  80. package/dist/layout-YBMT74MG.js +24 -0
  81. package/dist/{layout-search-EMTCDC3C.js → layout-search-AWPJWBKT.js} +9 -8
  82. package/dist/{parser-R3LPEQIT.js → parser-AR2GON37.js} +2 -2
  83. package/dist/{parser-YX72VLDZ.js → parser-BTSTKY5G.js} +5 -5
  84. package/dist/{parser-OGF2CDA6.js → parser-MA7L3XND.js} +5 -5
  85. package/dist/{parser-VKYUAT4Y.js → parser-ZRIZFDZY.js} +5 -5
  86. package/dist/{redraw-T324XAF3.js → redraw-AHW7EUUF.js} +2 -2
  87. package/dist/{redraw-MSXU4ZD2.js → redraw-STZ4WJAI.js} +3 -3
  88. package/dist/{renderer-HYGTMBHT.js → renderer-2LYX6NHN.js} +3 -3
  89. package/dist/{renderer-XJMVG2WJ.js → renderer-2QPHDBZY.js} +5 -5
  90. package/dist/{renderer-GPAVVUET.js → renderer-3NLDX7DQ.js} +3 -3
  91. package/dist/{renderer-IHCWBFPI.js → renderer-4VGO27EE.js} +14 -13
  92. package/dist/{renderer-JJ4QW3SK.js → renderer-6BDK47V6.js} +1 -1
  93. package/dist/{renderer-FL7EOSBU.js → renderer-7OGGV327.js} +3 -3
  94. package/dist/{renderer-5ITLW7MX.js → renderer-ACQQ2JXA.js} +6 -4
  95. package/dist/{renderer-37PLQHVB.js → renderer-BXD5KVSR.js} +2 -2
  96. package/dist/{renderer-TSCSZ6CL.js → renderer-HX6ICPDX.js} +2 -2
  97. package/dist/{renderer-BO73LSVT.js → renderer-IGSHD3OT.js} +4 -4
  98. package/dist/{renderer-DD6T3C4J.js → renderer-ISQJ2ELA.js} +2 -2
  99. package/dist/{renderer-CNRQFIEI.js → renderer-IVHD7ENY.js} +4 -4
  100. package/dist/{renderer-POBGKIUT.js → renderer-IXBOT6DU.js} +3 -3
  101. package/dist/{renderer-GFALLIYT.js → renderer-JYHA6R2D.js} +3 -3
  102. package/dist/{renderer-GOXAP2IE.js → renderer-KJ3V5BYP.js} +2 -2
  103. package/dist/{renderer-GFGFHYWY.js → renderer-MWZC7TMD.js} +2 -2
  104. package/dist/{renderer-3F47TPZ2.js → renderer-O6RP52CQ.js} +2 -2
  105. package/dist/{renderer-PBKTAWQV.js → renderer-P3WR7TKD.js} +14 -13
  106. package/dist/{renderer-VDBNC7A6.js → renderer-QTPWRRJ7.js} +2 -2
  107. package/dist/{renderer-J3QWK6IM.js → renderer-RUSQJFFC.js} +3 -3
  108. package/dist/{renderer-7Y3LR4R2.js → renderer-TINHO2IO.js} +2 -2
  109. package/dist/{renderer-J6H4Q3RM.js → renderer-UGW4N2W5.js} +4 -3
  110. package/dist/{renderer-EVKWGUGT.js → renderer-UTEEJDGB.js} +4 -3
  111. package/dist/{renderer-ISDKO3DI.js → renderer-WPN2SXGT.js} +2 -2
  112. package/dist/{renderer-6GJWADLO.js → renderer-XCLARXCK.js} +2 -2
  113. package/dist/{renderer-RDI2RYUP.js → renderer-XDX6S7OV.js} +3 -3
  114. package/dist/{renderer-VI34SD5V.js → renderer-Y47EM337.js} +6 -6
  115. package/dist/{renderer-HJ54YXT3.js → renderer-ZV6KCLCL.js} +14 -14
  116. package/dist/{state-parser-NPYTMRXP.js → state-parser-PMNHLHLE.js} +5 -5
  117. package/dist/{state-renderer-44K2KDX7.js → state-renderer-JQ5DS66J.js} +14 -13
  118. package/docs/language-reference.md +2 -2
  119. package/package.json +5 -1
  120. package/dist/layout-33FHGDEV.js +0 -23
  121. package/dist/layout-FTOGDNUL.js +0 -23
  122. package/dist/layout-J3AGFZZ7.js +0 -10
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-26EVL454.js";
5
5
  import {
6
6
  layoutGraph
7
- } from "./chunk-WK5QEYFA.js";
7
+ } from "./chunk-EXHXTMVR.js";
8
8
  import {
9
9
  appendArrowheadMarkers
10
10
  } from "./chunk-XBJJP2HN.js";
@@ -19,7 +19,7 @@ import {
19
19
  } from "./chunk-24YPR5EH.js";
20
20
  import {
21
21
  layoutInlineHeader
22
- } from "./chunk-42UJ23H3.js";
22
+ } from "./chunk-UIEKW4SG.js";
23
23
  import {
24
24
  TITLE_FONT_SIZE,
25
25
  TITLE_FONT_WEIGHT,
@@ -41,14 +41,14 @@ import {
41
41
  } from "./chunk-JILEYZ2V.js";
42
42
  import {
43
43
  parseState
44
- } from "./chunk-M4NV5PPU.js";
44
+ } from "./chunk-LJGE43SG.js";
45
45
  import {
46
46
  NOTE_BADGE_RADIUS,
47
47
  noteConnectorPoints,
48
48
  renderNoteBadge,
49
49
  renderNoteBox,
50
50
  renderNoteConnector
51
- } from "./chunk-D6PVMUCX.js";
51
+ } from "./chunk-67N26CER.js";
52
52
  import {
53
53
  FONT_FAMILY
54
54
  } from "./chunk-ICLB27PZ.js";
@@ -235,7 +235,7 @@ function renderState(container, graph, layout, palette, isDark, onClickItem, exp
235
235
  const groupOutline = fillModeFromOptions(graph.options ?? {}) === "outline";
236
236
  const fillColor = groupOutline ? themeBaseBg(palette, isDark) : groupColor ? mix(groupColor, themeBaseBg(palette, isDark), 10) : isDark ? palette.surface : mix(palette.border, palette.bg, 30);
237
237
  const strokeColor = groupColor ?? palette.textMuted;
238
- const groupWrapper = contentG.append("g").attr("class", "st-group-wrapper").attr("data-line-number", String(group.lineNumber)).attr("data-group-id", group.id).attr("data-group-toggle", group.id).attr("tabindex", "0").attr("role", "button").attr("aria-expanded", "true").attr("aria-label", `Collapse group ${group.label}`).style("cursor", "pointer");
238
+ const groupWrapper = contentG.append("g").attr("class", "st-group-wrapper").attr("data-line-number", String(group.lineNumber)).attr("data-group-id", group.id).attr("data-group-toggle", group.id).attr("role", "button").attr("aria-expanded", "true").attr("aria-label", `Collapse group ${group.label}`).style("cursor", "pointer");
239
239
  groupWrapper.append("rect").attr("x", gx).attr("y", gy).attr("width", gw).attr("height", gh).attr("rx", 6).attr("fill", fillColor).attr("stroke", strokeColor).attr("stroke-width", 1).attr("stroke-opacity", 0.5).attr("class", "st-group");
240
240
  groupWrapper.append("text").attr("x", gx + 8).attr("y", gy + sGroupLabelFontSize + 4).attr("fill", strokeColor).attr("font-size", sGroupLabelFontSize).attr("font-weight", "bold").attr("opacity", 0.7).attr("class", "st-group-label").text(group.label);
241
241
  }
@@ -336,7 +336,7 @@ function renderState(container, graph, layout, palette, isDark, onClickItem, exp
336
336
  }
337
337
  }
338
338
  if (isCollapsedGroup) {
339
- nodeG.attr("data-group-toggle", node.id).attr("tabindex", "0").attr("role", "button").attr("aria-expanded", "false").attr("aria-label", `Expand group ${node.label}`);
339
+ nodeG.attr("data-group-toggle", node.id).attr("role", "button").attr("aria-expanded", "false").attr("aria-label", `Expand group ${node.label}`);
340
340
  }
341
341
  if (onClickItem && !isCollapsedGroup) {
342
342
  nodeG.on("click", () => {
@@ -28,7 +28,7 @@ import {
28
28
  } from "./chunk-2CW5ZTNH.js";
29
29
  import {
30
30
  layoutInlineHeader
31
- } from "./chunk-42UJ23H3.js";
31
+ } from "./chunk-UIEKW4SG.js";
32
32
  import {
33
33
  TITLE_FONT_SIZE,
34
34
  TITLE_FONT_WEIGHT,
@@ -1219,6 +1219,13 @@ function renderFunnel(svg, chart, width, height, colors, palette, isDark, topIns
1219
1219
  }
1220
1220
 
1221
1221
  // src/charts-d3/heatmap.ts
1222
+ var ROW_LABEL_SHARE = 0.35;
1223
+ var COL_LABEL_MAX_W = 140;
1224
+ var COL_BAND_SHARE = 0.3;
1225
+ var COL_ANGLE = 40 * Math.PI / 180;
1226
+ var ROW_FONT = 13;
1227
+ var COL_FONT = 12;
1228
+ var EDGE_GAP = 4;
1222
1229
  function renderHeatmap(svg, chart, width, height, palette, isDark, textColor, bgColor, topInset) {
1223
1230
  const rows = chart.heatmapRows ?? [];
1224
1231
  if (rows.length === 0) return;
@@ -1257,11 +1264,39 @@ function renderHeatmap(svg, chart, width, height, palette, isDark, textColor, bg
1257
1264
  const targetL = isDark ? 72 : 30;
1258
1265
  return hslToHex(h, targetS, targetL);
1259
1266
  };
1260
- const rowLabelW = Math.max(0, ...rows.map((r) => measureText(r.label, 13))) + 16;
1267
+ const rowLabelMax = width * ROW_LABEL_SHARE;
1268
+ const rowShown = rows.map(
1269
+ (r) => truncateText(r.label, ROW_FONT, rowLabelMax)
1270
+ );
1271
+ const rowLabelW = Math.max(0, ...rowShown.map((t) => measureText(t, ROW_FONT))) + 16;
1261
1272
  const left = 20 + rowLabelW;
1262
- const top = topInset + 28;
1263
- const right = 24;
1264
1273
  const bottom = 24;
1274
+ const cw0 = (width - left - 24) / ncols;
1275
+ const rotate = cols.some((c) => measureText(c, COL_FONT) > cw0 * 0.85);
1276
+ const colShown = rotate ? cols.map(
1277
+ (c) => truncateText(
1278
+ c,
1279
+ COL_FONT,
1280
+ Math.min(
1281
+ COL_LABEL_MAX_W,
1282
+ height * COL_BAND_SHARE / Math.sin(COL_ANGLE)
1283
+ )
1284
+ )
1285
+ ) : cols;
1286
+ const colW = colShown.map((c) => measureText(c, COL_FONT));
1287
+ const sin = Math.sin(COL_ANGLE);
1288
+ const cos = Math.cos(COL_ANGLE);
1289
+ const band = rotate ? Math.max(28, 8 + Math.max(0, ...colW) * sin + COL_FONT * cos + EDGE_GAP) : 28;
1290
+ const top = topInset + band;
1291
+ let right = 24;
1292
+ if (rotate) {
1293
+ const P = width - left;
1294
+ colW.forEach((w, i) => {
1295
+ const reach = w * cos + COL_FONT * 0.25 * sin;
1296
+ const need = P - ncols * (P - EDGE_GAP - reach) / (i + 0.5);
1297
+ right = Math.max(right, need);
1298
+ });
1299
+ }
1265
1300
  const plotW = width - left - right;
1266
1301
  const plotH = height - top - bottom;
1267
1302
  const cw = plotW / ncols;
@@ -1277,10 +1312,10 @@ function renderHeatmap(svg, chart, width, height, palette, isDark, textColor, bg
1277
1312
  11,
1278
1313
  Math.min(ch * 0.55, cw * 0.7 * REF / maxValueW)
1279
1314
  );
1280
- const rotate = cols.some((c) => measureText(c, 12) > cw * 0.85);
1281
1315
  cols.forEach((c, ci) => {
1282
1316
  const x = left + ci * cw + cw / 2;
1283
- const t = svg.append("text").attr("class", "dgmo-axis-label").attr("data-filter-attr", "data-col-key").attr("data-filter-value", c).attr("fill", textColor).attr("font-size", 12).attr("font-family", FONT_FAMILY).text(c);
1317
+ const t = svg.append("text").attr("class", "dgmo-axis-label").attr("data-filter-attr", "data-col-key").attr("data-filter-value", c).attr("fill", textColor).attr("font-size", COL_FONT).attr("font-family", FONT_FAMILY).text(colShown[ci]);
1318
+ if (colShown[ci] !== c) t.append("title").text(c);
1284
1319
  if (rotate) {
1285
1320
  t.attr("transform", `translate(${x},${top - 8}) rotate(-40)`).attr(
1286
1321
  "text-anchor",
@@ -1291,7 +1326,8 @@ function renderHeatmap(svg, chart, width, height, palette, isDark, textColor, bg
1291
1326
  }
1292
1327
  });
1293
1328
  rows.forEach((row, ri) => {
1294
- svg.append("text").attr("class", "dgmo-axis-label").attr("data-filter-attr", "data-row-key").attr("data-filter-value", row.label).attr("x", left - 10).attr("y", top + ri * ch + ch / 2 + 4).attr("text-anchor", "end").attr("fill", textColor).attr("font-size", 13).attr("font-family", FONT_FAMILY).text(row.label);
1329
+ const rowLabel = svg.append("text").attr("class", "dgmo-axis-label").attr("data-filter-attr", "data-row-key").attr("data-filter-value", row.label).attr("x", left - 10).attr("y", top + ri * ch + ch / 2 + 4).attr("text-anchor", "end").attr("fill", textColor).attr("font-size", ROW_FONT).attr("font-family", FONT_FAMILY).text(rowShown[ri]);
1330
+ if (rowShown[ri] !== row.label) rowLabel.append("title").text(row.label);
1295
1331
  row.values.forEach((v, ci) => {
1296
1332
  const t = maxValue === minValue ? 0.5 : (v - minValue) / (maxValue - minValue);
1297
1333
  const ramp = gradientAt(t);
@@ -1041,6 +1041,9 @@ var PIPE_METADATA = /* @__PURE__ */ new Map([
1041
1041
  },
1042
1042
  fill: {
1043
1043
  description: "Shape fill: `solid` or `outline` (a pale tint is the default)"
1044
+ },
1045
+ label: {
1046
+ description: "Shape label position: `top` or `middle` (automatic: top on a rectangle holding shapes)"
1044
1047
  }
1045
1048
  }
1046
1049
  }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Copy-as-image for the embed toolbar's `.dgmo-copy-image` button — its own
3
+ * zero-import entry (`@diagrammo/dgmo/copy-image`) so every client surface
4
+ * (the auto script, remark-dgmo's `bindDgmo`, the Obsidian plugin) shares ONE
5
+ * rasterizer instead of mirroring it the way copy-source is mirrored.
6
+ *
7
+ * Copies the diagram as it is currently shown — the visible `.dgmo-light` /
8
+ * `.dgmo-dark` half of a dual render, or the single `.dgmo-svg` — as a PNG at
9
+ * `COPY_IMAGE_SCALE`, filled with the wrapper's `data-dgmo-bg` so a transparent
10
+ * embed doesn't paste as dark text on nothing.
11
+ *
12
+ * 🔴 `navigator.clipboard.write` must be CALLED inside the click, before any
13
+ * await: Safari drops the user activation across an await and then refuses the
14
+ * write. Hence the Blob goes in as a Promise and the PNG is drawn inside
15
+ * the ClipboardItem.
16
+ *
17
+ * Fonts: an SVG drawn through `<img>` cannot load web fonts. dgmo draws text in
18
+ * a system font stack, so labels still match; a host font injected by page CSS
19
+ * would not survive.
20
+ */
21
+ /**
22
+ * True when this browser can put a PNG on the clipboard. Hide the button if not.
23
+ * Pass the block's own window for a pop-out (Obsidian): the write is refused
24
+ * unless it goes through the window whose document has focus.
25
+ */
26
+ declare function canCopyDiagramImage(view?: Window | null): boolean;
27
+ /**
28
+ * Copy the diagram in the `.dgmo` block containing `fromButton` to the
29
+ * clipboard as a PNG. Resolves false on any failure (no SVG, a tainted canvas
30
+ * from an external `<image>`, a refused clipboard) — never throws.
31
+ */
32
+ declare function copyDiagramImage(fromButton: Element): Promise<boolean>;
33
+
34
+ export { canCopyDiagramImage, copyDiagramImage };
@@ -0,0 +1,96 @@
1
+ // src/embed/copy-image.ts
2
+ var SVG_NS = "http://www.w3.org/2000/svg";
3
+ var COPY_IMAGE_SCALE = 2;
4
+ function canCopyDiagramImage(view = typeof window === "undefined" ? null : window) {
5
+ return !!view && typeof view.navigator?.clipboard?.write === "function" && typeof view.ClipboardItem !== "undefined";
6
+ }
7
+ function copyDiagramImage(fromButton) {
8
+ const view = fromButton.ownerDocument.defaultView;
9
+ if (!view || !canCopyDiagramImage(view)) return Promise.resolve(false);
10
+ const found = visibleSvg(fromButton);
11
+ if (!found) return Promise.resolve(false);
12
+ try {
13
+ const Item = view.ClipboardItem;
14
+ return view.navigator.clipboard.write([
15
+ new Item({
16
+ "image/png": svgToPngBlob(found.svg, found.background)
17
+ })
18
+ ]).then(
19
+ () => true,
20
+ () => false
21
+ );
22
+ } catch {
23
+ return Promise.resolve(false);
24
+ }
25
+ }
26
+ function visibleSvg(fromButton) {
27
+ const block = fromButton.closest(".dgmo");
28
+ if (!block) return null;
29
+ const view = block.ownerDocument.defaultView ?? window;
30
+ const wrappers = block.querySelectorAll(
31
+ ".dgmo-light, .dgmo-dark, .dgmo-svg"
32
+ );
33
+ for (const w of Array.from(wrappers)) {
34
+ if (view.getComputedStyle(w).display === "none") continue;
35
+ const svg2 = w.querySelector("svg");
36
+ if (svg2) {
37
+ return { svg: svg2, background: w.dataset["dgmoBg"] ?? pageBackground(w) };
38
+ }
39
+ }
40
+ const svg = block.querySelector("svg");
41
+ return svg ? { svg, background: pageBackground(block) } : null;
42
+ }
43
+ function pageBackground(from) {
44
+ const view = from.ownerDocument.defaultView ?? window;
45
+ for (let el = from; el; el = el.parentElement) {
46
+ const bg = view.getComputedStyle(el).backgroundColor;
47
+ if (bg && bg !== "transparent" && !/^rgba\(.*,\s*0\)$/.test(bg)) return bg;
48
+ }
49
+ return void 0;
50
+ }
51
+ function intrinsicSize(svg) {
52
+ const vb = svg.viewBox?.baseVal;
53
+ if (vb && vb.width > 0 && vb.height > 0) {
54
+ return { width: vb.width, height: vb.height };
55
+ }
56
+ const rect = svg.getBoundingClientRect();
57
+ return { width: rect.width, height: rect.height };
58
+ }
59
+ async function svgToPngBlob(svg, background) {
60
+ const { width, height } = intrinsicSize(svg);
61
+ if (!(width > 0 && height > 0)) throw new Error("diagram has no size");
62
+ const clone = svg.cloneNode(true);
63
+ clone.setAttribute("xmlns", SVG_NS);
64
+ clone.setAttribute("width", String(width));
65
+ clone.setAttribute("height", String(height));
66
+ for (const prop of ["width", "height", "max-width", "aspect-ratio"]) {
67
+ clone.style.removeProperty(prop);
68
+ }
69
+ const xml = new XMLSerializer().serializeToString(clone);
70
+ const img = new Image();
71
+ await new Promise((resolve, reject) => {
72
+ img.onload = () => resolve();
73
+ img.onerror = () => reject(new Error("diagram SVG failed to load"));
74
+ img.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(xml)}`;
75
+ });
76
+ const canvas = document.createElement("canvas");
77
+ canvas.width = Math.round(width * COPY_IMAGE_SCALE);
78
+ canvas.height = Math.round(height * COPY_IMAGE_SCALE);
79
+ const ctx = canvas.getContext("2d");
80
+ if (!ctx) throw new Error("no 2d canvas context");
81
+ if (background) {
82
+ ctx.fillStyle = background;
83
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
84
+ }
85
+ ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
86
+ return new Promise((resolve, reject) => {
87
+ canvas.toBlob(
88
+ (blob) => blob ? resolve(blob) : reject(new Error("toBlob failed")),
89
+ "image/png"
90
+ );
91
+ });
92
+ }
93
+ export {
94
+ canCopyDiagramImage,
95
+ copyDiagramImage
96
+ };
package/dist/countdown.js CHANGED
@@ -217,7 +217,7 @@ function redrawIfStale(node, svg, now2, resolvedMs, tz) {
217
217
  }
218
218
  if (!svg.hasAttribute("data-dgmo-countdown-redraw")) return;
219
219
  redrawing.add(svg);
220
- void import("./redraw-T324XAF3.js").then((m) => {
220
+ void import("./redraw-AHW7EUUF.js").then((m) => {
221
221
  m.redrawCountdown(svg, resolvedMs);
222
222
  redrawing.delete(svg);
223
223
  }).catch(() => {
@@ -6,7 +6,7 @@ import {
6
6
  isExtendedChartType,
7
7
  knownChartTypeIds,
8
8
  parseDgmo
9
- } from "./chunk-YDZIVDVR.js";
9
+ } from "./chunk-P5XA627W.js";
10
10
  import "./chunk-H6BT45SN.js";
11
11
  import "./chunk-3PP746YM.js";
12
12
  import "./chunk-NM5V5EKY.js";
@@ -16,8 +16,8 @@ import "./chunk-2ZW4NBYX.js";
16
16
  import "./chunk-AULZD45V.js";
17
17
  import "./chunk-WZBZXZ6T.js";
18
18
  import "./chunk-NWSPPGIE.js";
19
- import "./chunk-5HAYT43L.js";
20
- import "./chunk-P7TRFL4P.js";
19
+ import "./chunk-U6VS3T2M.js";
20
+ import "./chunk-R46N5KR4.js";
21
21
  import "./chunk-J7Q4AB23.js";
22
22
  import "./chunk-XIUGSUE4.js";
23
23
  import "./chunk-EBVVMUAA.js";
@@ -43,12 +43,12 @@ import "./chunk-BRGRIZQB.js";
43
43
  import "./chunk-XSVWUOUZ.js";
44
44
  import "./chunk-JXGSTBW6.js";
45
45
  import "./chunk-H7AXCRO7.js";
46
- import "./chunk-A5WIAMCT.js";
46
+ import "./chunk-4UVCTLRH.js";
47
47
  import {
48
48
  looksLikeC4,
49
49
  looksLikeGantt,
50
50
  parseDgmoChartType
51
- } from "./chunk-UVX3IYXF.js";
51
+ } from "./chunk-BTP2BMWN.js";
52
52
  import "./chunk-KRPLP5LP.js";
53
53
  import "./chunk-KBDMEOLI.js";
54
54
  import "./chunk-VSAKEMDD.js";
@@ -56,25 +56,25 @@ import "./chunk-5OTA2PUH.js";
56
56
  import "./chunk-ZECJ7Q6C.js";
57
57
  import "./chunk-CDM6XMOT.js";
58
58
  import "./chunk-2SKMEL7V.js";
59
- import "./chunk-M6ZQAFPD.js";
59
+ import "./chunk-IY62DXT2.js";
60
60
  import "./chunk-TIVMAITN.js";
61
- import "./chunk-M4NV5PPU.js";
61
+ import "./chunk-LJGE43SG.js";
62
62
  import "./chunk-NXMESY4J.js";
63
63
  import "./chunk-EQW6HOP4.js";
64
64
  import "./chunk-MKSTL6DR.js";
65
65
  import "./chunk-CYTFO2LF.js";
66
- import "./chunk-Q7Y6JQ3R.js";
66
+ import "./chunk-S4SJ4LLY.js";
67
67
  import "./chunk-C3Z4DX3V.js";
68
68
  import "./chunk-IYULMRBE.js";
69
- import "./chunk-KCMGIYPO.js";
69
+ import "./chunk-5XBYLYYI.js";
70
70
  import "./chunk-GXCDD6NG.js";
71
71
  import "./chunk-FMAVHTYB.js";
72
72
  import "./chunk-N7VMGZCU.js";
73
- import "./chunk-NJJCTEBM.js";
73
+ import "./chunk-KLBTJEIK.js";
74
74
  import "./chunk-NOTA6TEI.js";
75
- import "./chunk-D6PVMUCX.js";
76
- import "./chunk-MB2SQF7N.js";
77
- import "./chunk-65GPEV5V.js";
75
+ import "./chunk-67N26CER.js";
76
+ import "./chunk-7WEYXYLC.js";
77
+ import "./chunk-QKPOIJBT.js";
78
78
  import "./chunk-ICLB27PZ.js";
79
79
  import "./chunk-GI5R5B3S.js";
80
80
  import "./chunk-4WW3SGMH.js";
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  mapContentAspect,
3
3
  mapExportDimensions
4
- } from "./chunk-J6AEKIRQ.js";
5
- import "./chunk-4RY5D5RE.js";
4
+ } from "./chunk-2I4UQG7W.js";
5
+ import "./chunk-AM42TLSZ.js";
6
6
  import "./chunk-AXLF3KRE.js";
7
7
  import "./chunk-KMU65FYM.js";
8
8
  import "./chunk-VLC6WNRD.js";
@@ -2,15 +2,15 @@ import {
2
2
  extractSymbols,
3
3
  looksLikeFlowchart,
4
4
  parseFlowchart
5
- } from "./chunk-M6ZQAFPD.js";
5
+ } from "./chunk-IY62DXT2.js";
6
6
  import "./chunk-TIVMAITN.js";
7
7
  import "./chunk-NXMESY4J.js";
8
8
  import "./chunk-N7VMGZCU.js";
9
- import "./chunk-NJJCTEBM.js";
9
+ import "./chunk-KLBTJEIK.js";
10
10
  import "./chunk-NOTA6TEI.js";
11
- import "./chunk-D6PVMUCX.js";
12
- import "./chunk-MB2SQF7N.js";
13
- import "./chunk-65GPEV5V.js";
11
+ import "./chunk-67N26CER.js";
12
+ import "./chunk-7WEYXYLC.js";
13
+ import "./chunk-QKPOIJBT.js";
14
14
  import "./chunk-ICLB27PZ.js";
15
15
  import "./chunk-TIIZIAGS.js";
16
16
  import "./chunk-KAO7JL4I.js";
@@ -1,29 +1,31 @@
1
1
  import {
2
2
  renderFlowchart,
3
3
  renderFlowchartForExport
4
- } from "./chunk-472EOHVW.js";
4
+ } from "./chunk-LAXMUSGW.js";
5
5
  import "./chunk-26EVL454.js";
6
- import "./chunk-WK5QEYFA.js";
7
- import "./chunk-LDDDKWL6.js";
6
+ import "./chunk-EXHXTMVR.js";
7
+ import "./chunk-2J2CWWWK.js";
8
8
  import "./chunk-XBJJP2HN.js";
9
- import "./chunk-ADVGV3P7.js";
10
- import "./chunk-EJS3K44P.js";
11
- import "./chunk-P5FUWXPW.js";
12
- import "./chunk-QT3KDDXK.js";
9
+ import "./chunk-VB4VMB2I.js";
10
+ import "./chunk-VGAMBOOC.js";
11
+ import "./chunk-VTESGA5F.js";
12
+ import "./chunk-WTTIODDV.js";
13
+ import "./chunk-IN7XI6NO.js";
13
14
  import "./chunk-EPDBWATV.js";
14
15
  import "./chunk-CYRB2JTN.js";
15
16
  import "./chunk-24YPR5EH.js";
17
+ import "./chunk-UIEKW4SG.js";
16
18
  import "./chunk-VLC6WNRD.js";
17
19
  import "./chunk-XCKNFFKM.js";
18
- import "./chunk-M6ZQAFPD.js";
20
+ import "./chunk-IY62DXT2.js";
19
21
  import "./chunk-TIVMAITN.js";
20
22
  import "./chunk-NXMESY4J.js";
21
23
  import "./chunk-N7VMGZCU.js";
22
- import "./chunk-NJJCTEBM.js";
24
+ import "./chunk-KLBTJEIK.js";
23
25
  import "./chunk-NOTA6TEI.js";
24
- import "./chunk-D6PVMUCX.js";
25
- import "./chunk-MB2SQF7N.js";
26
- import "./chunk-65GPEV5V.js";
26
+ import "./chunk-67N26CER.js";
27
+ import "./chunk-7WEYXYLC.js";
28
+ import "./chunk-QKPOIJBT.js";
27
29
  import "./chunk-ICLB27PZ.js";
28
30
  import "./chunk-TIIZIAGS.js";
29
31
  import "./chunk-UOCWYLYT.js";
package/dist/index.js CHANGED
@@ -11,20 +11,20 @@ import {
11
11
  } from "./chunk-SQAG3UXH.js";
12
12
  import {
13
13
  render
14
- } from "./chunk-IESUM4N5.js";
14
+ } from "./chunk-USE6HIOZ.js";
15
15
  import {
16
16
  D3_DATA_CHART_TYPES,
17
17
  renderDataChartD3,
18
18
  supportsD3DataChart
19
- } from "./chunk-KCHQVED5.js";
19
+ } from "./chunk-YQMIKX54.js";
20
20
  import {
21
21
  renderErrorCard
22
- } from "./chunk-FIYW7JW4.js";
22
+ } from "./chunk-USZLHYEQ.js";
23
23
  import {
24
24
  getDiagnosticSpec,
25
25
  listDiagnosticCodes,
26
26
  parseDgmo
27
- } from "./chunk-YDZIVDVR.js";
27
+ } from "./chunk-P5XA627W.js";
28
28
  import "./chunk-H6BT45SN.js";
29
29
  import "./chunk-3PP746YM.js";
30
30
  import "./chunk-NM5V5EKY.js";
@@ -40,8 +40,8 @@ import {
40
40
  INK_PRESSURE_LEVELS,
41
41
  decodeInk,
42
42
  encodeInk
43
- } from "./chunk-5HAYT43L.js";
44
- import "./chunk-P7TRFL4P.js";
43
+ } from "./chunk-U6VS3T2M.js";
44
+ import "./chunk-R46N5KR4.js";
45
45
  import "./chunk-J7Q4AB23.js";
46
46
  import "./chunk-XIUGSUE4.js";
47
47
  import "./chunk-EBVVMUAA.js";
@@ -51,9 +51,9 @@ import "./chunk-PGSGJLUR.js";
51
51
  import "./chunk-7PJBJ2DU.js";
52
52
  import "./chunk-EPDBWATV.js";
53
53
  import "./chunk-3GUEYQGL.js";
54
- import "./chunk-3GCASUWA.js";
54
+ import "./chunk-TASRGDYP.js";
55
55
  import "./chunk-6XLMTAEX.js";
56
- import "./chunk-VSOZZYLK.js";
56
+ import "./chunk-NERQSSYD.js";
57
57
  import "./chunk-BQO24BDM.js";
58
58
  import "./chunk-R6EGUTIV.js";
59
59
  import "./chunk-QQJUTGQH.js";
@@ -74,9 +74,9 @@ import "./chunk-BRGRIZQB.js";
74
74
  import "./chunk-XSVWUOUZ.js";
75
75
  import "./chunk-JXGSTBW6.js";
76
76
  import "./chunk-H7AXCRO7.js";
77
- import "./chunk-A5WIAMCT.js";
77
+ import "./chunk-4UVCTLRH.js";
78
78
  import "./chunk-24YPR5EH.js";
79
- import "./chunk-42UJ23H3.js";
79
+ import "./chunk-UIEKW4SG.js";
80
80
  import "./chunk-VLC6WNRD.js";
81
81
  import {
82
82
  GRID_DASH
@@ -87,7 +87,7 @@ import {
87
87
  decodeDiagramUrl,
88
88
  encodeDiagramUrl
89
89
  } from "./chunk-6OSGENN5.js";
90
- import "./chunk-UVX3IYXF.js";
90
+ import "./chunk-BTP2BMWN.js";
91
91
  import "./chunk-KRPLP5LP.js";
92
92
  import "./chunk-KBDMEOLI.js";
93
93
  import "./chunk-VSAKEMDD.js";
@@ -95,9 +95,9 @@ import "./chunk-5OTA2PUH.js";
95
95
  import "./chunk-ZECJ7Q6C.js";
96
96
  import "./chunk-CDM6XMOT.js";
97
97
  import "./chunk-2SKMEL7V.js";
98
- import "./chunk-M6ZQAFPD.js";
98
+ import "./chunk-IY62DXT2.js";
99
99
  import "./chunk-TIVMAITN.js";
100
- import "./chunk-M4NV5PPU.js";
100
+ import "./chunk-LJGE43SG.js";
101
101
  import "./chunk-NXMESY4J.js";
102
102
  import "./chunk-EQW6HOP4.js";
103
103
  import "./chunk-MKSTL6DR.js";
@@ -105,10 +105,10 @@ import {
105
105
  choosePalette,
106
106
  extractPaletteDirective
107
107
  } from "./chunk-CYTFO2LF.js";
108
- import "./chunk-Q7Y6JQ3R.js";
108
+ import "./chunk-S4SJ4LLY.js";
109
109
  import "./chunk-C3Z4DX3V.js";
110
110
  import "./chunk-IYULMRBE.js";
111
- import "./chunk-KCMGIYPO.js";
111
+ import "./chunk-5XBYLYYI.js";
112
112
  import {
113
113
  palettes
114
114
  } from "./chunk-GXCDD6NG.js";
@@ -117,13 +117,13 @@ import {
117
117
  resolvePaletteOrFallback
118
118
  } from "./chunk-FMAVHTYB.js";
119
119
  import "./chunk-N7VMGZCU.js";
120
- import "./chunk-NJJCTEBM.js";
120
+ import "./chunk-KLBTJEIK.js";
121
121
  import "./chunk-NOTA6TEI.js";
122
- import "./chunk-D6PVMUCX.js";
123
- import "./chunk-MB2SQF7N.js";
122
+ import "./chunk-67N26CER.js";
123
+ import "./chunk-7WEYXYLC.js";
124
124
  import {
125
125
  safeHref
126
- } from "./chunk-65GPEV5V.js";
126
+ } from "./chunk-QKPOIJBT.js";
127
127
  import "./chunk-ICLB27PZ.js";
128
128
  import "./chunk-GI5R5B3S.js";
129
129
  import "./chunk-4WW3SGMH.js";
@@ -0,0 +1,24 @@
1
+ import {
2
+ layoutClassDiagram
3
+ } from "./chunk-BCV2VJTM.js";
4
+ import "./chunk-2J2CWWWK.js";
5
+ import "./chunk-VB4VMB2I.js";
6
+ import "./chunk-VGAMBOOC.js";
7
+ import "./chunk-VTESGA5F.js";
8
+ import "./chunk-WTTIODDV.js";
9
+ import "./chunk-IN7XI6NO.js";
10
+ import "./chunk-KLBTJEIK.js";
11
+ import "./chunk-NOTA6TEI.js";
12
+ import "./chunk-67N26CER.js";
13
+ import "./chunk-7WEYXYLC.js";
14
+ import "./chunk-QKPOIJBT.js";
15
+ import "./chunk-ICLB27PZ.js";
16
+ import "./chunk-TIIZIAGS.js";
17
+ import "./chunk-KAO7JL4I.js";
18
+ import "./chunk-6GXLAKUH.js";
19
+ import "./chunk-3J7O3CU6.js";
20
+ import "./chunk-BYU54C3S.js";
21
+ import "./chunk-YLJ4XMA6.js";
22
+ export {
23
+ layoutClassDiagram
24
+ };
@@ -2,18 +2,19 @@ import {
2
2
  NODE_LABEL_LINE_HEIGHT,
3
3
  layoutGraph,
4
4
  wrapNodeLabel
5
- } from "./chunk-WK5QEYFA.js";
6
- import "./chunk-LDDDKWL6.js";
7
- import "./chunk-ADVGV3P7.js";
8
- import "./chunk-EJS3K44P.js";
9
- import "./chunk-P5FUWXPW.js";
10
- import "./chunk-QT3KDDXK.js";
5
+ } from "./chunk-EXHXTMVR.js";
6
+ import "./chunk-2J2CWWWK.js";
7
+ import "./chunk-VB4VMB2I.js";
8
+ import "./chunk-VGAMBOOC.js";
9
+ import "./chunk-VTESGA5F.js";
10
+ import "./chunk-WTTIODDV.js";
11
+ import "./chunk-IN7XI6NO.js";
11
12
  import "./chunk-NXMESY4J.js";
12
- import "./chunk-NJJCTEBM.js";
13
+ import "./chunk-KLBTJEIK.js";
13
14
  import "./chunk-NOTA6TEI.js";
14
- import "./chunk-D6PVMUCX.js";
15
- import "./chunk-MB2SQF7N.js";
16
- import "./chunk-65GPEV5V.js";
15
+ import "./chunk-67N26CER.js";
16
+ import "./chunk-7WEYXYLC.js";
17
+ import "./chunk-QKPOIJBT.js";
17
18
  import "./chunk-ICLB27PZ.js";
18
19
  import "./chunk-TIIZIAGS.js";
19
20
  import "./chunk-KAO7JL4I.js";
@@ -1,13 +1,14 @@
1
1
  import {
2
2
  computeNodeSize,
3
3
  layoutBoxesAndLines
4
- } from "./chunk-P5FUWXPW.js";
5
- import "./chunk-QT3KDDXK.js";
6
- import "./chunk-NJJCTEBM.js";
4
+ } from "./chunk-VTESGA5F.js";
5
+ import "./chunk-WTTIODDV.js";
6
+ import "./chunk-IN7XI6NO.js";
7
+ import "./chunk-KLBTJEIK.js";
7
8
  import "./chunk-NOTA6TEI.js";
8
- import "./chunk-D6PVMUCX.js";
9
- import "./chunk-MB2SQF7N.js";
10
- import "./chunk-65GPEV5V.js";
9
+ import "./chunk-67N26CER.js";
10
+ import "./chunk-7WEYXYLC.js";
11
+ import "./chunk-QKPOIJBT.js";
11
12
  import "./chunk-ICLB27PZ.js";
12
13
  import "./chunk-TIIZIAGS.js";
13
14
  import "./chunk-KAO7JL4I.js";
@@ -0,0 +1,11 @@
1
+ import {
2
+ layoutSwimlane
3
+ } from "./chunk-ERT7XDQW.js";
4
+ import "./chunk-VGAMBOOC.js";
5
+ import "./chunk-WTTIODDV.js";
6
+ import "./chunk-IN7XI6NO.js";
7
+ import "./chunk-KAO7JL4I.js";
8
+ import "./chunk-YLJ4XMA6.js";
9
+ export {
10
+ layoutSwimlane
11
+ };