compasso 0.1.0 → 0.3.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 (83) hide show
  1. package/README.md +126 -8
  2. package/dist/chunk-F47C6ZEB.js +1041 -0
  3. package/dist/chunk-F47C6ZEB.js.map +1 -0
  4. package/dist/chunk-JP4N42AY.js +497 -0
  5. package/dist/chunk-JP4N42AY.js.map +1 -0
  6. package/dist/chunk-LRHHUJFZ.js +703 -0
  7. package/dist/chunk-LRHHUJFZ.js.map +1 -0
  8. package/dist/{chunk-E456YKAJ.js → chunk-O3BT2O42.js} +69 -10
  9. package/dist/chunk-O3BT2O42.js.map +1 -0
  10. package/dist/{chunk-L5CYESBI.js → chunk-Q6DVTCXD.js} +9 -24
  11. package/dist/chunk-Q6DVTCXD.js.map +1 -0
  12. package/dist/{chunk-5RRRE2GF.js → chunk-RWPGGWO5.js} +9 -28
  13. package/dist/chunk-RWPGGWO5.js.map +1 -0
  14. package/dist/chunk-ZBDABVIO.js +252 -0
  15. package/dist/chunk-ZBDABVIO.js.map +1 -0
  16. package/dist/core/index.cjs +74 -7
  17. package/dist/core/index.cjs.map +1 -1
  18. package/dist/core/index.d.cts +33 -29
  19. package/dist/core/index.d.ts +33 -29
  20. package/dist/core/index.js +1 -1
  21. package/dist/ecomap/index.cjs +43 -28
  22. package/dist/ecomap/index.cjs.map +1 -1
  23. package/dist/ecomap/index.js +2 -2
  24. package/dist/fault-tree/index.cjs +782 -0
  25. package/dist/fault-tree/index.cjs.map +1 -0
  26. package/dist/fault-tree/index.d.cts +148 -0
  27. package/dist/fault-tree/index.d.ts +148 -0
  28. package/dist/fault-tree/index.js +4 -0
  29. package/dist/fault-tree/index.js.map +1 -0
  30. package/dist/fishbone/index.cjs +314 -0
  31. package/dist/fishbone/index.cjs.map +1 -0
  32. package/dist/fishbone/index.d.cts +91 -0
  33. package/dist/fishbone/index.d.ts +91 -0
  34. package/dist/fishbone/index.js +4 -0
  35. package/dist/fishbone/index.js.map +1 -0
  36. package/dist/genogram/index.cjs +47 -32
  37. package/dist/genogram/index.cjs.map +1 -1
  38. package/dist/genogram/index.d.cts +7 -4
  39. package/dist/genogram/index.d.ts +7 -4
  40. package/dist/genogram/index.js +2 -2
  41. package/dist/index.cjs +2622 -55
  42. package/dist/index.cjs.map +1 -1
  43. package/dist/index.d.cts +12 -2
  44. package/dist/index.d.ts +12 -2
  45. package/dist/index.js +7 -3
  46. package/dist/kinship-DqEklrDN.d.ts +51 -0
  47. package/dist/kinship-Dy_ijjJV.d.cts +51 -0
  48. package/dist/labels-CBQ_3Ec9.d.cts +123 -0
  49. package/dist/labels-CYbM5XV7.d.cts +83 -0
  50. package/dist/labels-CYbM5XV7.d.ts +83 -0
  51. package/dist/labels-DNqRkWuI.d.ts +123 -0
  52. package/dist/labels-iZjijjtK.d.cts +64 -0
  53. package/dist/labels-iZjijjtK.d.ts +64 -0
  54. package/dist/locales/pt-br.cjs +94 -0
  55. package/dist/locales/pt-br.cjs.map +1 -1
  56. package/dist/locales/pt-br.d.cts +14 -2
  57. package/dist/locales/pt-br.d.ts +14 -2
  58. package/dist/locales/pt-br.js +88 -1
  59. package/dist/locales/pt-br.js.map +1 -1
  60. package/dist/pedigree/index.cjs +1151 -0
  61. package/dist/pedigree/index.cjs.map +1 -0
  62. package/dist/pedigree/index.d.cts +155 -0
  63. package/dist/pedigree/index.d.ts +155 -0
  64. package/dist/pedigree/index.js +4 -0
  65. package/dist/pedigree/index.js.map +1 -0
  66. package/dist/phylo/index.cjs +553 -0
  67. package/dist/phylo/index.cjs.map +1 -0
  68. package/dist/phylo/index.d.cts +158 -0
  69. package/dist/phylo/index.d.ts +158 -0
  70. package/dist/phylo/index.js +4 -0
  71. package/dist/phylo/index.js.map +1 -0
  72. package/dist/text-DuO_PwYw.d.cts +45 -0
  73. package/dist/text-DuO_PwYw.d.ts +45 -0
  74. package/dist/types-BnMG7TCd.d.cts +66 -0
  75. package/dist/types-BnMG7TCd.d.ts +66 -0
  76. package/dist/xml-DDae1eUr.d.cts +4 -0
  77. package/dist/xml-DDae1eUr.d.ts +4 -0
  78. package/package.json +100 -26
  79. package/dist/chunk-5RRRE2GF.js.map +0 -1
  80. package/dist/chunk-E456YKAJ.js.map +0 -1
  81. package/dist/chunk-L5CYESBI.js.map +0 -1
  82. package/dist/kinship-BARO5-qz.d.cts +0 -115
  83. package/dist/kinship-Bkf87Jhu.d.ts +0 -115
@@ -51,22 +51,56 @@ var CHAR_W = 0.6;
51
51
  function estimateTextWidth(text, fontPx) {
52
52
  return text.length * fontPx * CHAR_W;
53
53
  }
54
- function wrapLabel(label, perLine) {
54
+ function wrapLabel(label, perLine, maxLines = 2) {
55
55
  if (label.length <= perLine) return [label];
56
56
  const cap = (s) => s.length > perLine ? s.slice(0, Math.max(1, perLine - 1)) + "\u2026" : s;
57
- let line1 = "";
58
- let line2 = "";
57
+ const lines = [""];
59
58
  for (const word of label.split(/\s+/)) {
60
- if (line2 === "" && (line1 === "" || (line1 + " " + word).length <= perLine)) {
61
- line1 = line1 === "" ? word : `${line1} ${word}`;
59
+ const last = lines.length - 1;
60
+ const current = lines[last];
61
+ if (current === "" || (current + " " + word).length <= perLine) {
62
+ lines[last] = current === "" ? word : `${current} ${word}`;
63
+ } else if (lines.length < maxLines) {
64
+ lines.push(word);
62
65
  } else {
63
- line2 = line2 === "" ? word : `${line2} ${word}`;
66
+ lines[last] = `${current} ${word}`;
64
67
  }
65
68
  }
66
- return line2 === "" ? [cap(line1)] : [cap(line1), cap(line2)];
69
+ if (lines.length > 1 && lines[lines.length - 1] === "") lines.pop();
70
+ return lines.map(cap);
71
+ }
72
+ function wrapLabelBalanced(label, maxLines) {
73
+ const perLine = Math.min(26, Math.max(14, Math.ceil(label.length / 2) + 2));
74
+ return wrapLabel(label, perLine, maxLines);
75
+ }
76
+ function clampLabel(label, maxChars) {
77
+ if (maxChars === void 0 || label.length <= maxChars) return label;
78
+ return label.slice(0, Math.max(1, maxChars - 1)) + "\u2026";
67
79
  }
68
80
  var FONT_FAMILY = "Helvetica, Arial, sans-serif";
69
81
 
82
+ // src/core/legend.ts
83
+ var LEGEND_ROW_H = 18;
84
+ var LEGEND_PAD = 16;
85
+ var LEGEND_SWATCH_W = 22;
86
+ var LEGEND_GAP = 14;
87
+ var LEGEND_FONT = 11;
88
+ var LEGEND_TEXT_FILL = "#52525b";
89
+ function legendBlock(entries, startY) {
90
+ if (entries.length === 0) return { svg: "", width: 0, height: startY };
91
+ const rows = entries.map((entry, i) => {
92
+ const rowCenterY = startY + i * LEGEND_ROW_H + LEGEND_ROW_H / 2;
93
+ const textX = LEGEND_PAD + LEGEND_SWATCH_W + LEGEND_GAP;
94
+ return entry.swatch(LEGEND_PAD, rowCenterY) + `<text x="${textX}" y="${rowCenterY + LEGEND_FONT * 0.32}" font-family="${FONT_FAMILY}" font-size="${LEGEND_FONT}" fill="${LEGEND_TEXT_FILL}">${xmlEscape(entry.label)}</text>`;
95
+ });
96
+ const widestLabel = entries.reduce((m, e) => Math.max(m, estimateTextWidth(e.label, LEGEND_FONT)), 0);
97
+ return {
98
+ svg: `<g data-compasso-legend="true">${rows.join("")}</g>`,
99
+ width: LEGEND_PAD + LEGEND_SWATCH_W + LEGEND_GAP + widestLabel + LEGEND_PAD,
100
+ height: startY + entries.length * LEGEND_ROW_H + LEGEND_PAD / 2
101
+ };
102
+ }
103
+
70
104
  // src/core/stroke.ts
71
105
  var EDGE_STROKE = {
72
106
  plain: { width: 1.5, dash: null, opacity: 0.6 },
@@ -197,14 +231,6 @@ function shapeForSex(sex) {
197
231
  if (sex === "female") return "circle";
198
232
  return "diamond";
199
233
  }
200
- function wrapNodeLabel(displayLabel) {
201
- const perLine = Math.min(26, Math.max(14, Math.ceil(displayLabel.length / 2) + 2));
202
- return wrapLabel(displayLabel, perLine);
203
- }
204
- function clampLabel2(label, maxChars) {
205
- if (maxChars === void 0 || label.length <= maxChars) return label;
206
- return label.slice(0, Math.max(1, maxChars - 1)) + "\u2026";
207
- }
208
234
  var STUB_OFFSETS = [9, -9, 18, -18, 26, -26];
209
235
  var ARRIVAL_HALF = NODE_SIZE / 2 - 8;
210
236
  function stubOffset(slot) {
@@ -428,7 +454,7 @@ function computeGenogramLayout(people, unions, parentLinks, relationships, opts
428
454
  }
429
455
  const measured = /* @__PURE__ */ new Map();
430
456
  for (const p of people) {
431
- const lines = wrapNodeLabel(clampLabel2(p.label, opts.maxLabelChars));
457
+ const lines = wrapLabelBalanced(clampLabel(p.label, opts.maxLabelChars));
432
458
  const contentW = Math.max(NODE_SIZE, lines.reduce((m, l) => Math.max(m, estimateTextWidth(l, LABEL_FONT)), 0));
433
459
  measured.set(p.id, { person: p, lines, contentW });
434
460
  }
@@ -992,11 +1018,6 @@ var STRUCT_WIDTH = 1.5;
992
1018
  var STRUCT_OPACITY = 0.75;
993
1019
  var DOTTED_DASH = [2, 3];
994
1020
  var DOTTED_OPACITY = 0.55;
995
- var LEGEND_ROW_H = 18;
996
- var LEGEND_PAD = 16;
997
- var LEGEND_SWATCH_W = 22;
998
- var LEGEND_GAP = 14;
999
- var LEGEND_FONT = 11;
1000
1021
  function glyphSvg(shape, cx, cy, half) {
1001
1022
  const stroke = `fill="transparent" stroke="${GLYPH_STROKE}" stroke-width="2"`;
1002
1023
  if (shape === "square") {
@@ -1132,17 +1153,11 @@ function genogramLayoutSvg(layout, opts = {}) {
1132
1153
  label: labels.isolated
1133
1154
  });
1134
1155
  }
1135
- if (entries.length > 0) {
1136
- const startY = layout.height;
1137
- const rows = entries.map((entry, i) => {
1138
- const rowCenterY = startY + i * LEGEND_ROW_H + LEGEND_ROW_H / 2;
1139
- const textX = LEGEND_PAD + LEGEND_SWATCH_W + LEGEND_GAP;
1140
- return entry.swatch(LEGEND_PAD, rowCenterY) + `<text x="${textX}" y="${rowCenterY + LEGEND_FONT * 0.32}" font-family="${FONT_FAMILY}" font-size="${LEGEND_FONT}" fill="${GLYPH_STROKE}">${xmlEscape(entry.label)}</text>`;
1141
- });
1142
- parts.push(`<g data-compasso-legend="true">${rows.join("")}</g>`);
1143
- const widestLabel = entries.reduce((m, e) => Math.max(m, estimateTextWidth(e.label, LEGEND_FONT)), 0);
1144
- width = Math.max(width, LEGEND_PAD + LEGEND_SWATCH_W + LEGEND_GAP + widestLabel + LEGEND_PAD);
1145
- height = startY + entries.length * LEGEND_ROW_H + LEGEND_PAD / 2;
1156
+ const block = legendBlock(entries, layout.height);
1157
+ if (block.svg !== "") {
1158
+ parts.push(block.svg);
1159
+ width = Math.max(width, block.width);
1160
+ height = block.height;
1146
1161
  }
1147
1162
  }
1148
1163
  return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${width} ${height}" width="${width}" height="${height}" role="img" aria-label="${xmlEscape(labels.ariaLabel)}">` + parts.join("") + `</svg>`;