@cardenelabs/cdl 0.118.0 → 0.119.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cardenelabs/cdl",
3
- "version": "0.118.0",
3
+ "version": "0.119.0",
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",
@@ -17,21 +17,40 @@
17
17
  * 使う。 弦の向きを使うと、大きく膨らむ曲線で線が端へ入ってくる向きと別の向きが出る。
18
18
  */
19
19
  import { EDGE_LABEL_TEXT } from "../label-text";
20
+ import { EDGE_HEAD_MARKER_SIZE } from "../types";
20
21
  import { extractPathSegments } from "./collisions";
21
22
  import { hasRenderedLabel } from "./spec";
22
23
  import { measureTextWidth } from "./text-width";
23
24
 
25
+ /** 端の印と端の字の間に空ける余白 (world)。 線に沿う向きと直角の向きで同じ値を使う */
26
+ export const 端の字と印の余白 = 8;
27
+
28
+ /** 端の印が線の芯から左右へ張り出す長さ (world)。 印の縦の半分 */
29
+ export const 端の印の張り出し = EDGE_HEAD_MARKER_SIZE.既定 / 2;
30
+
24
31
  /**
25
32
  * 端から字までの、線に沿った距離 (world)。
26
33
  *
27
- * 端の印の長さの最大 (光っている時の 14、 `render/stage.tsx` の marker の大きさ) に隙間 8 を足す。
34
+ * 端の印の長さの最大 (光っている時の大きさ) に余白を足す。
28
35
  * 印を持たない端 (菱が出どころ側にある「集約」 「コンポジション」 の行き先) でも同じ距離にする = 端ごとに
29
36
  * 距離が変わると、図の中で多重度の位置が揃わない。
37
+ *
38
+ * **この値は箱と箱の間隔にも入る** (`端の字に要る線の長さ` を `layout/nodes.ts` が引く)。
39
+ * 変えると図の高さが動くので、印との重なりは直角の向き (`端の字と線の隙間`) で解く。
30
40
  */
31
- export const 端の字を戻す距離 = 22;
41
+ export const 端の字を戻す距離 = EDGE_HEAD_MARKER_SIZE.既定 + 端の字と印の余白;
32
42
 
33
- /** 線と字の間の隙間 (world) */
34
- export const 端の字と線の隙間 = 8;
43
+ /**
44
+ * 線と字の間の隙間 (world)。 線の芯から字の箱までを測る。
45
+ *
46
+ * **印の張り出しに余白を足す** (#984)。 印は線に沿う向きだけでなく直角の向きにも広がり、
47
+ * 菱と三角は線の芯から 7 ある。 隙間を 8 にしていた頃は印の縁と字の箱が 1 しか空かず、
48
+ * 端の数が印に貼り付いて読めた (見本帳のクラス図の集約とコンポジションの両方で出た)。
49
+ *
50
+ * 余白は `端の字を戻す距離` が印の長さに足しているものと同じ値にする = 線に沿う向きと
51
+ * 直角の向きで、印から字までの空き方が揃う。
52
+ */
53
+ export const 端の字と線の隙間 = 端の印の張り出し + 端の字と印の余白;
35
54
 
36
55
  /** 端の字の大きさ。 札の下の行と同じ等幅の字 = 多重度を札に入れていた頃と同じ見え方 */
37
56
  export const 端の字の大きさ = EDGE_LABEL_TEXT.sub.fontSize;
@@ -7,6 +7,7 @@ import { buildDiagramAltText, isRenderedNode } from "../layout/spec";
7
7
  import {
8
8
  EDGE_HEADS,
9
9
  EDGE_HEAD_FILLS,
10
+ EDGE_HEAD_MARKER_SIZE,
10
11
  EDGE_HEAD_FILL_DEFAULT,
11
12
  EDGE_REVEAL_DEFAULT,
12
13
  RELATION_FOCUS_DEFAULT,
@@ -238,8 +239,8 @@ export function CdlStage({
238
239
  return Object.entries(TONE).flatMap(([tone, color]) =>
239
240
  (
240
241
  [
241
- [false, 14],
242
- [true, 10],
242
+ [false, EDGE_HEAD_MARKER_SIZE.既定],
243
+ [true, EDGE_HEAD_MARKER_SIZE.小],
243
244
  ] as const
244
245
  ).flatMap(([small, size]) =>
245
246
  EDGE_HEADS.flatMap((head) =>
package/src/types.ts CHANGED
@@ -282,6 +282,17 @@ export const EDGE_HEAD_FILL_DEFAULT: EdgeHeadFill = "solid";
282
282
  /** 塗り方の全種。 marker の定義と検査の走査がこの並びを引く */
283
283
  export const EDGE_HEAD_FILLS: readonly EdgeHeadFill[] = ["solid", "hollow"];
284
284
 
285
+ /**
286
+ * 端の印の大きさ (world)。 `markerHeight` そのもので、形の枠の縦 10 に掛かる倍率ではない。
287
+ *
288
+ * `render/stage.tsx` が marker を定義する時と、`layout/head-label.ts` が端の字を印から
289
+ * 離す時の 2 箇所が引く。 片方に数を直に書くと、印を大きくした時に字だけが元の位置に残る
290
+ * (#984 では印の縦を見ずに字を置いており、菱の縁と字の間が 1 しか空いていなかった)。
291
+ *
292
+ * 縦は形によらず この値。 横だけが形の枠の縦横比で伸びる (`EDGE_HEAD_SHAPE.w / .h`)。
293
+ */
294
+ export const EDGE_HEAD_MARKER_SIZE = { 既定: 14, 小: 10 } as const;
295
+
285
296
  /** 矢印をいつ出すか (#582)。 `CdlDiagram.edgeReveal` が取る値と 1 対 1 */
286
297
  export type EdgeReveal = "phase" | "all";
287
298