@cardenelabs/cdl 0.26.0 → 0.28.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 +99 -1
- package/dist/index.cjs +21 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -3
- package/dist/index.d.ts +7 -3
- package/dist/index.js +21 -3
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +11 -1
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +11 -1
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
- package/src/layout/nodes.ts +8 -4
- package/src/layout/spec.ts +31 -3
- package/src/presets.ts +40 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cardenelabs/cdl",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.28.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/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
|
@@ -1347,6 +1347,38 @@ export const CLASS_RELATION_LOOK: Record<
|
|
|
1347
1347
|
uses: { head: "open", fill: "solid", tailHead: "none", tailFill: "solid", style: "dashed" },
|
|
1348
1348
|
};
|
|
1349
1349
|
|
|
1350
|
+
/**
|
|
1351
|
+
* 関係の 6 種を 3 群に寄せた色み (#641)。
|
|
1352
|
+
*
|
|
1353
|
+
* 足す前は 6 種とも 1 色で、種類の違いが色に出なかった。 見分けを担うのは 線 / 印の形 /
|
|
1354
|
+
* 印が付く側 の 3 軸だけで、6 種を 1 枚に並べると印の形まで見ないとどれがどれか判らない。
|
|
1355
|
+
*
|
|
1356
|
+
* **群の中は色を分けない**。 群の中の 2 種は既に線か印の塗りで分かれているので、色まで足すと
|
|
1357
|
+
* 同じことを 2 回言うことになる。 色が担うのは群の見分けだけ。
|
|
1358
|
+
*
|
|
1359
|
+
* | 群 | 種類 | 群の中の見分け |
|
|
1360
|
+
* |---|---|---|
|
|
1361
|
+
* | 縦の関係 | `extends` / `implements` | 線 (実線 / 破線) |
|
|
1362
|
+
* | 所有 | `aggregates` / `composes` | 印の塗り (白抜き / 塗る) |
|
|
1363
|
+
* | 向きだけ | `associates` / `uses` | 線 (実線 / 破線) |
|
|
1364
|
+
*
|
|
1365
|
+
* 群の分け方は `CLASS_RELATION_LOOK` と同じ = あちらの 印の形 が群を表しており、
|
|
1366
|
+
* 三角 = 縦の関係 / 菱 = 所有 / 開いた矢 = 向きだけ に 1 対 1 で対応する。
|
|
1367
|
+
*
|
|
1368
|
+
* **色の値は持たない**。 描き手は名前だけを図に載せ、実際の色は消費側が `data-cdl-tone` を
|
|
1369
|
+
* 見て当てる。 値を持たせると、色を変えるたびに描き手を出し直すことになる。
|
|
1370
|
+
*
|
|
1371
|
+
* `Record<ClassRelationType, Tone>` なので、種類を足すと色みも要る。
|
|
1372
|
+
*/
|
|
1373
|
+
export const CLASS_RELATION_TONE: Record<ClassRelationType, Tone> = {
|
|
1374
|
+
extends: "accent",
|
|
1375
|
+
implements: "accent",
|
|
1376
|
+
aggregates: "teal",
|
|
1377
|
+
composes: "teal",
|
|
1378
|
+
associates: "success",
|
|
1379
|
+
uses: "success",
|
|
1380
|
+
};
|
|
1381
|
+
|
|
1350
1382
|
/** 端の形だけを引く経路 (cdl#574 からの名前を残す)。 実体は `CLASS_RELATION_LOOK` */
|
|
1351
1383
|
export const CLASS_RELATION_HEAD: Record<ClassRelationType, EdgeHead> = Object.fromEntries(
|
|
1352
1384
|
Object.entries(CLASS_RELATION_LOOK).map(([k, v]) => [k, v.head]),
|
|
@@ -1457,7 +1489,13 @@ export type ClassDiagramBuilder = {
|
|
|
1457
1489
|
*/
|
|
1458
1490
|
export function classDiagram(preset: ClassDiagramPreset): ClassDiagramBuilder {
|
|
1459
1491
|
const classW = resolveStorageBoxW(preset.classWidth, "classDiagram", "classWidth");
|
|
1460
|
-
|
|
1492
|
+
/**
|
|
1493
|
+
* 図ぜんぶに効く色み (#641)。 **書かなければ種類ごとに決まる**。
|
|
1494
|
+
*
|
|
1495
|
+
* 書いた図は「全部同じ色みにする」 と宣言しているので、種類の既定より勝たせる。
|
|
1496
|
+
* 優先順位は 関係に書いた色み > 図に書いた既定 > 種類から決まる既定 の 3 段。
|
|
1497
|
+
*/
|
|
1498
|
+
const 図の既定 = preset.defaultTone;
|
|
1461
1499
|
// 縞と配色は `er()` と同じ扱い (#627)。 箱の作りが同じなので、既定も揃える
|
|
1462
1500
|
const 縞を敷く = preset.rowStripe ?? true;
|
|
1463
1501
|
const b = diagram(preset.id, { topic: preset.topic, palette: preset.palette });
|
|
@@ -1536,7 +1574,7 @@ export function classDiagram(preset: ClassDiagramPreset): ClassDiagramBuilder {
|
|
|
1536
1574
|
id: edgeId,
|
|
1537
1575
|
label: r.label ?? r.type,
|
|
1538
1576
|
...(r.cardinality ? { sub: r.cardinality } : {}),
|
|
1539
|
-
tone: r.tone ??
|
|
1577
|
+
tone: r.tone ?? 図の既定 ?? CLASS_RELATION_TONE[r.type],
|
|
1540
1578
|
// 関係の種類から線と端の形を決める (cdl#574 / #578)。 書いた値が勝つ
|
|
1541
1579
|
style: r.style ?? 見た目.style,
|
|
1542
1580
|
head: r.head ?? 見た目.head,
|