@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/CHANGELOG.md CHANGED
@@ -5,6 +5,25 @@ CDL (Chainome Diagram Language) の主要変更履歴。
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.21.1] - 2026-08-29
9
+
10
+ ### Fixed
11
+
12
+ - **線の縦区間に張り付いた説明を離すようにした** (#594)
13
+
14
+ 説明が別の線の縦区間の真下に居る形で、隙間が 0 のまま残っていた。
15
+
16
+ 線の押し出しは発火している。 ただし安全判定 (`pathShiftIsSafe`) は「経路を壊さないか」
17
+ しか見ないので、**離れない向きへ動かして終わる**。 その時「線で逃がせた」 と数えるため、
18
+ cardene777/cdl#592 で入れた逃がし (説明の側を動かす) にも回らなかった。 繰り返しを 12 回まで
19
+ 回しても隙間は 0 のままだと実測した。
20
+
21
+ 押し出しは今までどおり出したまま、**離れなかった時は「逃がせた」 と数えない**。
22
+ 出さない形にすると、離れないなりに効いていた押し出しが消えて別の 3 図が壊れる。
23
+
24
+ 逃がす向きは **行き先を線ごとに確かめて** 選ぶ。 全体の最小距離だけで比べると、いま 0 の
25
+ 線が離れるぶん別の線が 0 になっても「悪くなっていない」 と読める。
26
+
8
27
  ## [0.21.0] - 2026-08-29
9
28
 
10
29
  ### Fixed
@@ -1061,7 +1080,8 @@ Initial OSS release.
1061
1080
  使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
1062
1081
  行き止まりになる。
1063
1082
 
1064
- [Unreleased]: https://github.com/cardene777/cdl/compare/v0.21.0...HEAD
1083
+ [Unreleased]: https://github.com/cardene777/cdl/compare/v0.21.1...HEAD
1084
+ [0.21.1]: https://github.com/cardene777/cdl/compare/v0.21.0...v0.21.1
1065
1085
  [0.21.0]: https://github.com/cardene777/cdl/compare/v0.20.1...v0.21.0
1066
1086
  [0.20.1]: https://github.com/cardene777/cdl/compare/v0.20.0...v0.20.1
1067
1087
  [0.20.0]: https://github.com/cardene777/cdl/compare/v0.19.0...v0.20.0
package/dist/index.cjs CHANGED
@@ -13092,8 +13092,12 @@ function resolveEdgeLabelOverlapsWithChainAndPropagate(edges, obstacles, minClea
13092
13092
  for (const { p } of ordered) {
13093
13093
  const axis = p.axis;
13094
13094
  if (!pathShiftIsSafe(e.id, axis, p.sign, amount)) continue;
13095
+ const \u52D5\u304B\u3057\u305F\u5F8C = measurePathLabelGapSegs(
13096
+ simulateShiftedSegments(e, axis === "x" ? p.sign * amount : 0, axis === "y" ? p.sign * amount : 0),
13097
+ label
13098
+ );
13095
13099
  out.push({ target: { kind: "edge-path", id: e.id }, axis, sign: p.sign, amount });
13096
- \u7DDA\u3092\u52D5\u304B\u305B\u305F = true;
13100
+ \u7DDA\u3092\u52D5\u304B\u305B\u305F = \u52D5\u304B\u3057\u305F\u5F8C > gap;
13097
13101
  break;
13098
13102
  }
13099
13103
  if (!\u7DDA\u3092\u52D5\u304B\u305B\u305F) {
@@ -13116,16 +13120,49 @@ function resolveEdgeLabelOverlapsWithChainAndPropagate(edges, obstacles, minClea
13116
13120
  if (\u8FD1\u3044\u70B9) {
13117
13121
  const dx = \u82AF.x - \u8FD1\u3044\u70B9.x;
13118
13122
  const dy = \u82AF.y - \u8FD1\u3044\u70B9.y;
13119
- const axis = Math.abs(dx) >= Math.abs(dy) ? "x" : "y";
13120
- const \u5411\u304D = axis === "x" ? dx : dy;
13121
- const sign = \u5411\u304D >= 0 ? 1 : -1;
13122
- out.push({
13123
- target: { kind: "label", id: label.id },
13124
- axis,
13125
- sign,
13126
- amount: pathLabelClearance - gap + NEAR_MISS_MARGIN,
13127
- chain: false
13123
+ const \u91CF = pathLabelClearance - gap + NEAR_MISS_MARGIN;
13124
+ const \u5019\u88DC = Math.abs(dx) >= Math.abs(dy) ? [
13125
+ { axis: "x", sign: dx >= 0 ? 1 : -1 },
13126
+ { axis: "y", sign: dy >= 0 ? 1 : -1 }
13127
+ ] : [
13128
+ { axis: "y", sign: dy >= 0 ? 1 : -1 },
13129
+ { axis: "x", sign: dx >= 0 ? 1 : -1 }
13130
+ ];
13131
+ const \u52D5\u304B\u3057\u305F\u7BB1 = (axis, sign) => ({
13132
+ ...label,
13133
+ x: label.x + (axis === "x" ? sign * \u91CF : 0),
13134
+ y: label.y + (axis === "y" ? sign * \u91CF : 0)
13128
13135
  });
13136
+ const \u7DDA\u3054\u3068\u306E\u8DDD\u96E2 = (\u7BB1) => {
13137
+ const \u51FA = /* @__PURE__ */ new Map();
13138
+ for (const \u4ED6 of edges) {
13139
+ if (\u4ED6.id === label.id) continue;
13140
+ const segs2 = segmentsExcludingOwnPath(shiftedSegments(\u4ED6.id, \u4ED6.d), ownSegsOf(label.id));
13141
+ if (segs2.length === 0) continue;
13142
+ \u51FA.set(\u4ED6.id, measurePathLabelGapSegs(segs2, \u7BB1));
13143
+ }
13144
+ return \u51FA;
13145
+ };
13146
+ const \u3044\u307E\u306E\u8DDD\u96E2 = \u7DDA\u3054\u3068\u306E\u8DDD\u96E2(label);
13147
+ const \u60AA\u304F\u3059\u308B = (\u7BB1) => {
13148
+ const \u5F8C = \u7DDA\u3054\u3068\u306E\u8DDD\u96E2(\u7BB1);
13149
+ for (const [id, \u524D\u306E\u5024] of \u3044\u307E\u306E\u8DDD\u96E2) {
13150
+ const \u5F8C\u306E\u5024 = \u5F8C.get(id) ?? Infinity;
13151
+ if (\u5F8C\u306E\u5024 < Math.min(\u524D\u306E\u5024, pathLabelClearance)) return true;
13152
+ }
13153
+ return false;
13154
+ };
13155
+ for (const \u5019 of \u5019\u88DC) {
13156
+ if (\u60AA\u304F\u3059\u308B(\u52D5\u304B\u3057\u305F\u7BB1(\u5019.axis, \u5019.sign))) continue;
13157
+ out.push({
13158
+ target: { kind: "label", id: label.id },
13159
+ axis: \u5019.axis,
13160
+ sign: \u5019.sign,
13161
+ amount: \u91CF,
13162
+ chain: false
13163
+ });
13164
+ break;
13165
+ }
13129
13166
  }
13130
13167
  }
13131
13168
  }