@cardenelabs/cdl 0.25.0 → 0.27.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 +66 -1
- package/dist/index.cjs +18 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +18 -3
- package/dist/index.d.ts +18 -3
- package/dist/index.js +18 -4
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +13 -2
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +13 -2
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
- package/src/kinds/storage.tsx +14 -0
- package/src/layout/nodes.ts +8 -4
- package/src/layout/spec.ts +31 -3
- package/src/presets.ts +16 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cardenelabs/cdl",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.27.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
|
@@ -53,6 +53,15 @@ const ROW_GLYPH_RISE = 8;
|
|
|
53
53
|
*/
|
|
54
54
|
const SUBTITLE_BASELINE = 118;
|
|
55
55
|
|
|
56
|
+
/**
|
|
57
|
+
* 縞を敷く最少の行数 (#627)。
|
|
58
|
+
*
|
|
59
|
+
* 縞の役目は「隣り合う行を見分ける」 こと。 1 行しか無い箱には見分ける相手が居ないので、
|
|
60
|
+
* 敷くとその 1 行が「主役」 に見える。 閾値ではなく役目から導いた値なので、
|
|
61
|
+
* 図種を増やしても同じ規則が効く。
|
|
62
|
+
*/
|
|
63
|
+
const STRIPE_MIN_ROWS = 2;
|
|
64
|
+
|
|
56
65
|
/** 呼び名の級。 行の名前 (26) より小さく、型 (24) と同じ */
|
|
57
66
|
const SUBTITLE_FONT = 20;
|
|
58
67
|
|
|
@@ -169,8 +178,13 @@ export function StorageNode({
|
|
|
169
178
|
|
|
170
179
|
帯の左右は枠の内側に 1 だけ寄せる。 枠と同じ x に置くと、角の丸みから帯の角が
|
|
171
180
|
はみ出して四隅に色が出る。
|
|
181
|
+
|
|
182
|
+
**行が 1 つの箱には敷かない** (#627)。 縞の役目は「隣り合う行を見分ける」 ことで、
|
|
183
|
+
1 行しか無い箱には見分ける相手が居ない。 敷くとその 1 行が「主役」 に見える
|
|
184
|
+
(実測 = クラス図の 1 行の箱で縞が強調に読めた)。
|
|
172
185
|
*/}
|
|
173
186
|
{node.rowStripe &&
|
|
187
|
+
rows.length >= STRIPE_MIN_ROWS &&
|
|
174
188
|
rows.map((_, idx) => {
|
|
175
189
|
if (idx % 2 !== 0) return null;
|
|
176
190
|
const 帯 = rowStripeBand("storage", idx, 行の下げ);
|
package/src/layout/nodes.ts
CHANGED
|
@@ -3,8 +3,9 @@ import type { CdlDiagram, LaidLane, LaidNode } from "../types";
|
|
|
3
3
|
import {
|
|
4
4
|
hasRenderedLabel,
|
|
5
5
|
labelPillH,
|
|
6
|
-
|
|
6
|
+
requiredMarkedRowsHeight,
|
|
7
7
|
requiredRowsHeight,
|
|
8
|
+
requiredVerticalLabelGap,
|
|
8
9
|
SUBTITLE_ROW_SHIFT,
|
|
9
10
|
中身から出す高さ,
|
|
10
11
|
目印なしの繰り上げ,
|
|
@@ -15,8 +16,8 @@ import { DEFAULT_NODE_GAP, HEADER_RESERVE, LANE_TOP_PAD, NODE_SIZE, STACK_GAP }
|
|
|
15
16
|
* kind=storage で rows[] を持つ node の自動 h を計算する。
|
|
16
17
|
*
|
|
17
18
|
* rows 数に応じて h が足りないと最後の rows が node 枠外にはみ出す (ER preset User entity 等)。
|
|
18
|
-
*
|
|
19
|
-
*
|
|
19
|
+
* 行頭の印を持たない箱は最終行の baseline、 持つ箱は最後の縞の帯から必要 h を出す。
|
|
20
|
+
* 描画側の式を SSOT にすることで、行送りを変えた時も字・帯・箱の下余白を一緒に動かす。
|
|
20
21
|
*
|
|
21
22
|
* 本関数が扱うのは `storage` だけ。 `GenericNode` 側の 21 種も rows を描くが、 そちらは
|
|
22
23
|
* 自動で h を伸ばさない (著者が指定した h をそのまま使う)。 行が枠外に出ていないかは
|
|
@@ -51,7 +52,10 @@ function autoStorageHeight(
|
|
|
51
52
|
// 下限を全体から外さないのは、印を持たない既存の図がすべて縮むため。 印を持つ行は
|
|
52
53
|
// 書き方そのものが変わる形なので、高さの決め方もそちらに寄せる
|
|
53
54
|
// 呼び名を出す箱は題の段が 1 行ぶん増える。 描き手 (`storage.tsx`) が行を下げる値と同じ
|
|
54
|
-
if (印あり)
|
|
55
|
+
if (印あり) {
|
|
56
|
+
const 帯から必要 = requiredMarkedRowsHeight("storage", n.rows.length) ?? defaultH;
|
|
57
|
+
return 帯から必要 + 呼び名の分;
|
|
58
|
+
}
|
|
55
59
|
return Math.max(defaultH, 必要);
|
|
56
60
|
}
|
|
57
61
|
|
package/src/layout/spec.ts
CHANGED
|
@@ -400,12 +400,24 @@ export function rowGlyphDepth(kind: string | undefined): number | null {
|
|
|
400
400
|
export const ROW_LAYOUT_BOTTOM_PAD = 20;
|
|
401
401
|
|
|
402
402
|
/**
|
|
403
|
-
*
|
|
403
|
+
* 行頭の印を持つ箱で、最後の縞の帯から枠の下端までに確保する余白。
|
|
404
|
+
*
|
|
405
|
+
* `kinds/storage.tsx` の枠の角の丸み (`rx={16}`) より大きくする。 角の丸みを下回ると、
|
|
406
|
+
* 縞の四角い角が丸みからはみ出して四隅に色が出る。
|
|
407
|
+
*/
|
|
408
|
+
export const ROW_STRIPE_BOTTOM_PAD = 24;
|
|
409
|
+
|
|
410
|
+
/**
|
|
411
|
+
* 行頭の印を **持たない** node に必要な高さ (SSOT)。
|
|
404
412
|
*
|
|
405
413
|
* 最終行の baseline から 1 行送りぶんとレイアウト余白を確保する。 行を描かない種別は `null`。
|
|
406
414
|
*
|
|
407
|
-
*
|
|
408
|
-
*
|
|
415
|
+
* **印を持つ箱はこの式で決まらない**。 そちらは縞の帯の下端を起点にする
|
|
416
|
+
* (`requiredMarkedRowsHeight`) = 帯を敷く箱では「行が終わる位置」 が帯の下端になるため、
|
|
417
|
+
* baseline から数えると帯の下に 1 行ぶんに近い余白が残る。
|
|
418
|
+
*
|
|
419
|
+
* 使うのは `layout/nodes.ts` の `autoStorageHeight` の印なし経路。 各所で式を写すと、
|
|
420
|
+
* 描画を変えた時に一部だけ古くなるので、下流も同じ形が要る時はここを引く。
|
|
409
421
|
*
|
|
410
422
|
* これは「そう置くとよい高さ」 で、 「これを下回ると破綻する高さ」 ではない。 後者は
|
|
411
423
|
* `rowBaselineY` + `rowGlyphDepth` で、 軸 16 はそちらを見る。
|
|
@@ -418,6 +430,22 @@ export function requiredRowsHeight(kind: string | undefined, rowCount: number):
|
|
|
418
430
|
return lastBaseline + pitch + ROW_LAYOUT_BOTTOM_PAD;
|
|
419
431
|
}
|
|
420
432
|
|
|
433
|
+
/**
|
|
434
|
+
* 行頭の印を持つ箱で、`rows` に必要な高さ。
|
|
435
|
+
*
|
|
436
|
+
* 最後の縞の帯の下端から `ROW_STRIPE_BOTTOM_PAD` を確保する。 帯と別の位置定数から
|
|
437
|
+
* 足し算すると、行送りを変えた時に字と帯だけが動いて下余白が取り残される。
|
|
438
|
+
*/
|
|
439
|
+
export function requiredMarkedRowsHeight(
|
|
440
|
+
kind: string | undefined,
|
|
441
|
+
rowCount: number,
|
|
442
|
+
): number | null {
|
|
443
|
+
if (rowCount <= 0) return null;
|
|
444
|
+
const lastBand = rowStripeBand(kind, rowCount - 1, 0);
|
|
445
|
+
if (lastBand === null) return null;
|
|
446
|
+
return lastBand.y + lastBand.h + ROW_STRIPE_BOTTOM_PAD;
|
|
447
|
+
}
|
|
448
|
+
|
|
421
449
|
/**
|
|
422
450
|
* その node が画面に出るか (SSOT)。
|
|
423
451
|
*
|
package/src/presets.ts
CHANGED
|
@@ -1425,6 +1425,17 @@ export type ClassDiagramPreset = {
|
|
|
1425
1425
|
* 帯ではなく **箱** の幅。 帯は `箱の幅 + 余白 × 2` で宣言する。
|
|
1426
1426
|
*/
|
|
1427
1427
|
classWidth?: number;
|
|
1428
|
+
/**
|
|
1429
|
+
* 行に 1 行おきの縞を敷くか (既定 = 敷く、 #627)。
|
|
1430
|
+
*
|
|
1431
|
+
* クラス図の箱は ER 図と同じ作り (行頭の印 + 左に名前 + 右に型) をしており、名前と型が
|
|
1432
|
+
* 離れて並ぶので行を横に追う目印が要る。 `er()` と同じ既定にする。
|
|
1433
|
+
*/
|
|
1434
|
+
rowStripe?: boolean;
|
|
1435
|
+
/**
|
|
1436
|
+
* 図の配色の名前 (#627)。 描き手は色を持たないので、名前をそのまま markup に出す。
|
|
1437
|
+
*/
|
|
1438
|
+
palette?: string;
|
|
1428
1439
|
};
|
|
1429
1440
|
|
|
1430
1441
|
export type ClassDiagramBuilder = {
|
|
@@ -1447,7 +1458,9 @@ export type ClassDiagramBuilder = {
|
|
|
1447
1458
|
export function classDiagram(preset: ClassDiagramPreset): ClassDiagramBuilder {
|
|
1448
1459
|
const classW = resolveStorageBoxW(preset.classWidth, "classDiagram", "classWidth");
|
|
1449
1460
|
const tone: Tone = preset.defaultTone ?? "info";
|
|
1450
|
-
|
|
1461
|
+
// 縞と配色は `er()` と同じ扱い (#627)。 箱の作りが同じなので、既定も揃える
|
|
1462
|
+
const 縞を敷く = preset.rowStripe ?? true;
|
|
1463
|
+
const b = diagram(preset.id, { topic: preset.topic, palette: preset.palette });
|
|
1451
1464
|
|
|
1452
1465
|
const classes: string[] = [];
|
|
1453
1466
|
const phaseActivate: string[] = [];
|
|
@@ -1509,6 +1522,8 @@ export function classDiagram(preset: ClassDiagramPreset): ClassDiagramBuilder {
|
|
|
1509
1522
|
// あることしか言わず、図の中の全ての箱に同じ字が並ぶ
|
|
1510
1523
|
...(m.c.stereotype ? { eyebrow: m.c.stereotype } : {}),
|
|
1511
1524
|
...(m.rows.length > 0 ? { rows: m.rows, rowMarks: m.rowMarks } : {}),
|
|
1525
|
+
// 縞は行を持つ箱にだけ敷く (#627)。 行が無い箱に書いても描き手が読まない
|
|
1526
|
+
...(m.rows.length > 0 && 縞を敷く ? { rowStripe: true } : {}),
|
|
1512
1527
|
});
|
|
1513
1528
|
classes.push(m.c.id);
|
|
1514
1529
|
phaseActivate.push(m.c.id);
|