@cardenelabs/cdl 0.21.0 → 0.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cardenelabs/cdl",
3
- "version": "0.21.0",
3
+ "version": "0.21.1",
4
4
  "description": "CDL (Chainome Diagram Language). Mermaid-like declarative DSL that compiles to animated SVG diagrams. Built for blockchain / Solidity flows, generic enough for sequence / flow / state / ER / topology diagrams.",
5
5
  "license": "MIT",
6
6
  "author": "cardene777",
@@ -1869,8 +1869,22 @@ export function resolveEdgeLabelOverlapsWithChainAndPropagate(
1869
1869
  for (const { p } of ordered) {
1870
1870
  const axis = p.axis as "x" | "y";
1871
1871
  if (!pathShiftIsSafe(e.id, axis, p.sign, amount)) continue;
1872
+ /*
1873
+ * **動かした先で離れるかを見る**。 「壊さない」 だけを見て動かすと、離れない向きへ
1874
+ * 動かして終わることがある (実測 = 説明が別の線の縦区間の真下に居る形で、繰り返しを
1875
+ * 12 回まで回しても隙間は 0 のまま)。 その時 `線を動かせた` が立つので、下の逃がしにも
1876
+ * 回らない。
1877
+ *
1878
+ * **押し出しは今までどおり出す**。 出さない形にすると、離れないなりに効いていた
1879
+ * 押し出しが消えて別の図が壊れる (実測で 3 図が `overlap=-1`)。 離れなかった時に
1880
+ * 「線で逃がせた」 と数えないことだけを変える = 下の逃がしにも回るようになる。
1881
+ */
1882
+ const 動かした後 = measurePathLabelGapSegs(
1883
+ simulateShiftedSegments(e, axis === "x" ? p.sign * amount : 0, axis === "y" ? p.sign * amount : 0),
1884
+ label,
1885
+ );
1872
1886
  out.push({ target: { kind: "edge-path", id: e.id }, axis, sign: p.sign, amount });
1873
- 線を動かせた = true;
1887
+ 線を動かせた = 動かした後 > gap;
1874
1888
  break;
1875
1889
  }
1876
1890
  /*
@@ -1903,16 +1917,64 @@ export function resolveEdgeLabelOverlapsWithChainAndPropagate(
1903
1917
  if (近い点) {
1904
1918
  const dx = 芯.x - 近い点.x;
1905
1919
  const dy = 芯.y - 近い点.y;
1906
- const axis: "x" | "y" = Math.abs(dx) >= Math.abs(dy) ? "x" : "y";
1907
- const 向き = axis === "x" ? dx : dy;
1908
- const sign: 1 | -1 = 向き >= 0 ? 1 : -1;
1909
- out.push({
1910
- target: { kind: "label", id: label.id },
1911
- axis,
1912
- sign,
1913
- amount: pathLabelClearance - gap + NEAR_MISS_MARGIN,
1914
- chain: false,
1920
+ const = pathLabelClearance - gap + NEAR_MISS_MARGIN;
1921
+ /*
1922
+ * **行き先を確かめてから動かす**。 近い点から離れる向きへ出すだけだと、その先に
1923
+ * 別の線が居ることがある (実測で 3 図が `overlap=-1` になった)。
1924
+ *
1925
+ * 縦横それぞれの向きを、離れている方から順に試す。 動かした先で **どの線とも
1926
+ * いまより近づかない** 向きだけを採る。
1927
+ */
1928
+ const 候補: Array<{ axis: "x" | "y"; sign: 1 | -1 }> =
1929
+ Math.abs(dx) >= Math.abs(dy)
1930
+ ? [
1931
+ { axis: "x", sign: dx >= 0 ? 1 : -1 },
1932
+ { axis: "y", sign: dy >= 0 ? 1 : -1 },
1933
+ ]
1934
+ : [
1935
+ { axis: "y", sign: dy >= 0 ? 1 : -1 },
1936
+ { axis: "x", sign: dx >= 0 ? 1 : -1 },
1937
+ ];
1938
+ const 動かした箱 = (axis: "x" | "y", sign: 1 | -1): BBox => ({
1939
+ ...label,
1940
+ x: label.x + (axis === "x" ? sign * 量 : 0),
1941
+ y: label.y + (axis === "y" ? sign * 量 : 0),
1915
1942
  });
1943
+ /*
1944
+ * **線ごとに見る**。 全体の最小距離だけを比べると、いま 0 の線が離れるぶん、
1945
+ * 別の線が 0 になっても「悪くなっていない」 と読める (実測でその形になった)。
1946
+ */
1947
+ const 線ごとの距離 = (箱: BBox): Map<string, number> => {
1948
+ const 出 = new Map<string, number>();
1949
+ for (const 他 of edges) {
1950
+ if (他.id === label.id) continue;
1951
+ const segs2 = segmentsExcludingOwnPath(shiftedSegments(他.id, 他.d), ownSegsOf(label.id));
1952
+ if (segs2.length === 0) continue;
1953
+ 出.set(他.id, measurePathLabelGapSegs(segs2, 箱));
1954
+ }
1955
+ return 出;
1956
+ };
1957
+ const いまの距離 = 線ごとの距離(label);
1958
+ const 悪くする = (箱: BBox): boolean => {
1959
+ const 後 = 線ごとの距離(箱);
1960
+ for (const [id, 前の値] of いまの距離) {
1961
+ const 後の値 = 後.get(id) ?? Infinity;
1962
+ // 前より縮めない。 前が要求を満たしていたなら、その要求も割らない
1963
+ if (後の値 < Math.min(前の値, pathLabelClearance)) return true;
1964
+ }
1965
+ return false;
1966
+ };
1967
+ for (const 候 of 候補) {
1968
+ if (悪くする(動かした箱(候.axis, 候.sign))) continue;
1969
+ out.push({
1970
+ target: { kind: "label", id: label.id },
1971
+ axis: 候.axis,
1972
+ sign: 候.sign,
1973
+ amount: 量,
1974
+ chain: false,
1975
+ });
1976
+ break;
1977
+ }
1916
1978
  }
1917
1979
  }
1918
1980
  }