@cardenelabs/cdl 0.116.0 → 0.118.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/CHANGELOG.md +74 -1
- package/dist/index.cjs +16 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +16 -4
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +16 -4
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +16 -4
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
- package/src/kinds/storage.tsx +14 -4
- package/src/layout/nodes.ts +6 -1
- package/src/layout/spec.ts +26 -0
- package/src/visual-validate.ts +22 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cardenelabs/cdl",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.118.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",
|
package/src/kinds/storage.tsx
CHANGED
|
@@ -8,6 +8,8 @@ import {
|
|
|
8
8
|
ROW_PITCH_STORAGE,
|
|
9
9
|
ROW_TOP_STORAGE,
|
|
10
10
|
STORAGE_ROW_DIVIDER_Y,
|
|
11
|
+
STORAGE_SUBTITLE_BASELINE,
|
|
12
|
+
STORAGE_SUBTITLE_FONT,
|
|
11
13
|
STORAGE_TITLE_BASELINE,
|
|
12
14
|
STORAGE_TITLE_FONT,
|
|
13
15
|
SUBTITLE_ROW_SHIFT,
|
|
@@ -49,10 +51,13 @@ const ROW_GLYPH_RISE = 8;
|
|
|
49
51
|
/**
|
|
50
52
|
* 題の下に置く呼び名の baseline (#578)。
|
|
51
53
|
*
|
|
52
|
-
* 題 (
|
|
54
|
+
* 題 (86) と 1 行目 (130) の間。 印で分ける箱では区切り線を引かないので、その分の余白が空く。
|
|
53
55
|
* ER の表名や状態の名前は識別子なので、その下に日本語の呼び名を薄く添える。
|
|
56
|
+
*
|
|
57
|
+
* **値は `layout/spec.ts` が持つ** (#974)。 高さを出す側が同じ値を読むため、
|
|
58
|
+
* ここで別に持つと片方だけ動いて箱の下が空く。
|
|
54
59
|
*/
|
|
55
|
-
const SUBTITLE_BASELINE =
|
|
60
|
+
const SUBTITLE_BASELINE = STORAGE_SUBTITLE_BASELINE;
|
|
56
61
|
|
|
57
62
|
/**
|
|
58
63
|
* 縞を敷く最少の行数 (#627)。
|
|
@@ -63,8 +68,13 @@ const SUBTITLE_BASELINE = 118;
|
|
|
63
68
|
*/
|
|
64
69
|
const STRIPE_MIN_ROWS = 2;
|
|
65
70
|
|
|
66
|
-
/**
|
|
67
|
-
|
|
71
|
+
/**
|
|
72
|
+
* 呼び名の級。 行の名前 (26) より小さく、型 (24) と同じ。
|
|
73
|
+
*
|
|
74
|
+
* **値は `layout/spec.ts` が持つ** (#974)。 高さを出す側が字形の深さをこの級から
|
|
75
|
+
* 見込むため、ここで別に持つと片方だけ動く。
|
|
76
|
+
*/
|
|
77
|
+
const SUBTITLE_FONT = STORAGE_SUBTITLE_FONT;
|
|
68
78
|
|
|
69
79
|
/** 主キーの下線を名前の baseline からどれだけ下に引くか */
|
|
70
80
|
const UNDERLINE_DROP = 7;
|
package/src/layout/nodes.ts
CHANGED
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
requiredVerticalLabelGap,
|
|
10
10
|
SUBTITLE_ROW_SHIFT,
|
|
11
11
|
中身から出す高さ,
|
|
12
|
+
呼び名で伸びる量,
|
|
12
13
|
目印なしの繰り上げ,
|
|
13
14
|
} from "./spec";
|
|
14
15
|
import { DEFAULT_NODE_GAP, HEADER_RESERVE, LANE_TOP_PAD, NODE_SIZE, STACK_GAP } from "./tokens";
|
|
@@ -47,7 +48,11 @@ function autoStorageHeight(
|
|
|
47
48
|
const 呼び名の分 = n.subtitle ? SUBTITLE_ROW_SHIFT : 0;
|
|
48
49
|
// 小見出しを書かない形では字を上へ繰り上げるので、その分だけ箱も低くする (#589)
|
|
49
50
|
const 繰り上げ = n.eyebrow ? 0 : 目印なしの繰り上げ("storage");
|
|
50
|
-
|
|
51
|
+
// 行を持たない箱は **下げる相手が居ない** ので、行の下げ幅ではなく字の塊が下に伸びる分を
|
|
52
|
+
// 足す (#974)。 46 を足していた間は上 17 に対し下 39 と、下だけ 22 空いていた
|
|
53
|
+
if (!n.rows || n.rows.length === 0) {
|
|
54
|
+
return 115 + (n.subtitle ? 呼び名で伸びる量 : 0) - 繰り上げ;
|
|
55
|
+
}
|
|
51
56
|
const 必要 = requiredRowsHeight("storage", n.rows.length) ?? defaultH;
|
|
52
57
|
// 行頭の印を持つ箱は **中身の足し算だけ** で高さを決める (#578)。 下限を残すと、行が
|
|
53
58
|
// 1 つしか無い箱が 4 行の箱と同じ高さになり、下が空いたまま並ぶ。
|
package/src/layout/spec.ts
CHANGED
|
@@ -658,6 +658,16 @@ export const STORAGE_TITLE_FONT = 34;
|
|
|
658
658
|
*/
|
|
659
659
|
export const SUBTITLE_ROW_SHIFT = 46;
|
|
660
660
|
|
|
661
|
+
/**
|
|
662
|
+
* `kinds/storage.tsx` の呼び名 (subtitle) の baseline (#578)。
|
|
663
|
+
*
|
|
664
|
+
* 題 (86) と 1 行目 (130) の間に置く。 描き手が字を置く位置で、高さの計算もここを読む。
|
|
665
|
+
*/
|
|
666
|
+
export const STORAGE_SUBTITLE_BASELINE = 118;
|
|
667
|
+
|
|
668
|
+
/** `kinds/storage.tsx` の呼び名の字の大きさ。 題 (34) より小さくして題を先に読ませる */
|
|
669
|
+
export const STORAGE_SUBTITLE_FONT = 20;
|
|
670
|
+
|
|
661
671
|
/**
|
|
662
672
|
* `storage` の名前と列の間に引く区切り線の Y。
|
|
663
673
|
*
|
|
@@ -701,6 +711,22 @@ export const ROW_GLYPH_DEPTH_RATIO = 0.4;
|
|
|
701
711
|
export const TITLE_ROW_MIN_GAP =
|
|
702
712
|
GENERIC_TITLE_FONT * ROW_GLYPH_DEPTH_RATIO + ROW_FONT_GENERIC * GLYPH_CAP_RATIO;
|
|
703
713
|
|
|
714
|
+
/**
|
|
715
|
+
* 行を持たない `storage` に呼び名を書いた時、箱がどれだけ高くなるか (#974)。
|
|
716
|
+
*
|
|
717
|
+
* **`SUBTITLE_ROW_SHIFT` を流用しない**。 あちらは行の群を下げる幅で、下げる相手が
|
|
718
|
+
* 居ない箱に足すと下だけ空く (実測で上 17 に対し下 39、許容は 7)。
|
|
719
|
+
*
|
|
720
|
+
* 足すべきなのは **字の塊の下端が下がる分** になる。 下端は題の字形の底から呼び名の
|
|
721
|
+
* 字形の底へ移るので、baseline の差に字形の深さの差を足す。 呼び名の方が字が小さいぶん
|
|
722
|
+
* 深さは浅く、差は引き算になる。
|
|
723
|
+
*/
|
|
724
|
+
export const 呼び名で伸びる量 = Math.round(
|
|
725
|
+
STORAGE_SUBTITLE_BASELINE -
|
|
726
|
+
STORAGE_TITLE_BASELINE +
|
|
727
|
+
(STORAGE_SUBTITLE_FONT - STORAGE_TITLE_FONT) * ROW_GLYPH_DEPTH_RATIO,
|
|
728
|
+
);
|
|
729
|
+
|
|
704
730
|
/**
|
|
705
731
|
* 最終行の baseline から下に、 字形が枠に触れないために要ると **見込む** 量。
|
|
706
732
|
*
|
package/src/visual-validate.ts
CHANGED
|
@@ -1945,6 +1945,21 @@ function visualValidateInner(
|
|
|
1945
1945
|
}
|
|
1946
1946
|
}
|
|
1947
1947
|
|
|
1948
|
+
/**
|
|
1949
|
+
* 位置を手で書いた箱か (#972)。
|
|
1950
|
+
*
|
|
1951
|
+
* `posX` と `posY` を **両方** 書いた箱は、自動の配置の並びから外して置くためにある
|
|
1952
|
+
* (`types.ts` の `posX` の説明が「置いた位置に置く」 と定める)。 揃っていないこと自体が
|
|
1953
|
+
* 書き手の指定なので、揃えを見る軸の判定から外す。
|
|
1954
|
+
*
|
|
1955
|
+
* 軸 15 (`lane-cx-consistency`) が同じ条件を先に持っており、その 1 行をここへ括り出した。
|
|
1956
|
+
* **片方だけ書いた箱は外さない** = 片方だけでは自動の配置が生きており、並びから外す指定に
|
|
1957
|
+
* ならない (採用の条件も `posX !== undefined && posY !== undefined` で揃えてある)。
|
|
1958
|
+
*/
|
|
1959
|
+
function 位置を手で書いた(n: { posX?: number; posY?: number }): boolean {
|
|
1960
|
+
return n.posX !== undefined && n.posY !== undefined;
|
|
1961
|
+
}
|
|
1962
|
+
|
|
1948
1963
|
function runAxes(
|
|
1949
1964
|
laid: LaidDiagram,
|
|
1950
1965
|
diag: CdlDiagram,
|
|
@@ -2087,8 +2102,12 @@ function runAxes(
|
|
|
2087
2102
|
// ───────────────────────────────────────────────────────────
|
|
2088
2103
|
// Axis 5: alignment (同 lane 内 node の cx 一致)
|
|
2089
2104
|
// ───────────────────────────────────────────────────────────
|
|
2105
|
+
//
|
|
2106
|
+
// 位置を手で書いた箱は判定にも基準にも使わない (#972)。 **基準から先に外す** =
|
|
2107
|
+
// 先頭の 1 つが手で置かれていると、自動で置いた箱が全部その位置と比べられて落ちる。
|
|
2090
2108
|
const byLane = new Map<string, typeof laid.nodes>();
|
|
2091
2109
|
for (const n of laid.nodes) {
|
|
2110
|
+
if (位置を手で書いた(n)) continue;
|
|
2092
2111
|
const list = byLane.get(n.lane) ?? [];
|
|
2093
2112
|
list.push(n);
|
|
2094
2113
|
byLane.set(n.lane, list);
|
|
@@ -2691,11 +2710,13 @@ function runAxes(
|
|
|
2691
2710
|
// positive-check 経路 (両者 同 tolerance を持つが、 SSOT 経由で spec-driven 判定にする)。
|
|
2692
2711
|
//
|
|
2693
2712
|
// spacer / lifeline は intentional な cx 差を持つので判定対象外。
|
|
2713
|
+
// 位置を手で書いた箱も同じ理由で外す (#972、 軸 5 と同じ条件)。
|
|
2694
2714
|
// ───────────────────────────────────────────────────────────
|
|
2695
2715
|
{
|
|
2696
2716
|
const byLaneCol = new Map<string, LaidDiagram["nodes"]>();
|
|
2697
2717
|
for (const n of laid.nodes) {
|
|
2698
2718
|
if (n.id.endsWith("-spacer") || /^s\d+-/.test(n.id)) continue;
|
|
2719
|
+
if (位置を手で書いた(n)) continue;
|
|
2699
2720
|
const list = byLaneCol.get(n.lane) ?? [];
|
|
2700
2721
|
list.push(n);
|
|
2701
2722
|
byLaneCol.set(n.lane, list);
|
|
@@ -2846,7 +2867,7 @@ function runAxes(
|
|
|
2846
2867
|
if (n.id.endsWith("-spacer") || /^s\d+-/.test(n.id)) continue;
|
|
2847
2868
|
// 座標を明示した node は lane 中心から外れているのが指定どおりの状態なので対象外。
|
|
2848
2869
|
// 「lane 中心と一致しない」 を症状として報告すると、 意図した配置が毎回 warn になる。
|
|
2849
|
-
if (n
|
|
2870
|
+
if (位置を手で書いた(n)) continue;
|
|
2850
2871
|
const lane = laneById.get(n.lane);
|
|
2851
2872
|
if (!lane) continue;
|
|
2852
2873
|
const laneCx = lane.x + lane.width / 2;
|