@cardenelabs/cdl 0.24.0 → 0.26.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 +75 -1
- package/dist/index.cjs +46 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +33 -2
- package/dist/index.d.ts +33 -2
- package/dist/index.js +46 -4
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +33 -0
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +1 -1
- package/dist/react.d.ts +1 -1
- package/dist/react.js +33 -0
- package/dist/react.js.map +1 -1
- package/dist/{render-CfXUl0Yz.d.cts → render-ViWKnlu1.d.cts} +23 -0
- package/dist/{render-CfXUl0Yz.d.ts → render-ViWKnlu1.d.ts} +23 -0
- package/package.json +1 -1
- package/src/builder.ts +6 -0
- package/src/kinds/storage.tsx +46 -0
- package/src/layout/spec.ts +23 -0
- package/src/layout.ts +6 -0
- package/src/presets.ts +38 -2
- package/src/render/stage.tsx +7 -0
- package/src/render/template-fields.ts +2 -0
- package/src/types.ts +23 -0
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,78 @@ CDL (Chainome Diagram Language) の主要変更履歴。
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.26.0] - 2026-09-03
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **クラス図の箱にも行の縞と配色を通した** (#627)
|
|
13
|
+
|
|
14
|
+
クラス図の箱は ER 図と同じ作り (行頭の印 + 左に名前 + 右に型) をしている。
|
|
15
|
+
名前と型が離れて並ぶので、行を横に追う目印が要るのは ER 図と同じだった。
|
|
16
|
+
|
|
17
|
+
`classDiagram` に `rowStripe` と `palette` を足し、既定を `er` と揃えた。
|
|
18
|
+
どちらも書けば上書きでき、`rowStripe: false` で縞を外せる。
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- **行が 1 つの箱には縞を敷かなくなった** (#627)
|
|
23
|
+
|
|
24
|
+
縞の役目は「隣り合う行を見分ける」 こと。
|
|
25
|
+
1 行しか無い箱には見分ける相手が居ないので、敷くとその 1 行が「主役」 に見える。
|
|
26
|
+
|
|
27
|
+
実際にクラス図へ当てて確かめると、1 行の箱 (`Auditable` / `Sku`) で縞が強調に読めた。
|
|
28
|
+
2 行以上の箱では意図どおり行の区切りとして読めた。
|
|
29
|
+
|
|
30
|
+
閾値ではなく **役目から導いた規則** なので、図種を増やしても同じ判断ができる。
|
|
31
|
+
判定は描き手 (`storage.tsx`) が持つ = 組み立て器ごとに書くと、次の図種で取り残される。
|
|
32
|
+
|
|
33
|
+
ER 図にも同じ規則が効く (1 行の表で縞が消える)。
|
|
34
|
+
|
|
35
|
+
## [0.25.0] - 2026-09-03
|
|
36
|
+
|
|
37
|
+
### Added
|
|
38
|
+
|
|
39
|
+
- **表の箱に 1 行おきの縞を敷けるようにした** (#1553)
|
|
40
|
+
|
|
41
|
+
ER 図は小さい字が密に並ぶので、行を横に追う時の目印が無い。
|
|
42
|
+
`id` の右端にある `bigint` がどの行のものか、目で辿り直すことになる。
|
|
43
|
+
|
|
44
|
+
色を増やさずに、面を 1 行おきに変えて追えるようにする。
|
|
45
|
+
色数を足して分ける形は 9 回試して全て外れており、増やすほど図が散らかった。
|
|
46
|
+
|
|
47
|
+
`rowStripe` を `CdlNode` に足し、`er` が設計の形 (`columns` を書いた実体) で立てた
|
|
48
|
+
実体に既定で敷く。 `er({ rowStripe: false })` で切れる。
|
|
49
|
+
|
|
50
|
+
**クラス図には敷かない**。 同じ `storage` を使うが、持ち物と振る舞いは行頭の印
|
|
51
|
+
(四角と山形) で既に分かれている。 縞を足すと手掛かりが 3 つになる。
|
|
52
|
+
|
|
53
|
+
縞の位置は `rowStripeBand` が行の baseline から導く。
|
|
54
|
+
縞だけが自前の定数を持つと、行送りを変えた時に字だけ動いて縞が取り残される。
|
|
55
|
+
呼び名で行の塊が下がる箱では、描画側が行に足すのと同じ値を帯にも足す。
|
|
56
|
+
|
|
57
|
+
帯は baseline を挟む。 上端を baseline に置くと字が帯の上へはみ出す。
|
|
58
|
+
|
|
59
|
+
箱の下端をまたぐ縞は描かない。 行数と箱の高さは独立に決まるので、行が多い図では
|
|
60
|
+
最後の行が箱の外に来る。
|
|
61
|
+
|
|
62
|
+
色は `--cdl-row-stripe` を読み、無ければ `--cdl-label-bg` に落ちる。
|
|
63
|
+
消費側が縞と札の下地を別に決めたくなった時に、engine を変えずに分けられる。
|
|
64
|
+
|
|
65
|
+
- **図に別の配色を名指しできるようにした** (#1553)
|
|
66
|
+
|
|
67
|
+
`palette` を `CdlDiagram` と `diagram()` と `er()` に足し、
|
|
68
|
+
`data-cdl-palette` として舞台の `<svg>` に出す。
|
|
69
|
+
|
|
70
|
+
**cdl は色の値を持たない**。 名前を markup に出すだけで、実際の値は消費側
|
|
71
|
+
(dragon の theme 等) が名前を見て決める。 値を engine に持たせると、
|
|
72
|
+
消費側が配色を変えるたびに engine の release が要る。
|
|
73
|
+
|
|
74
|
+
空文字は書かなかった扱いにする = 空の目印を出すと、消費側の `[data-cdl-palette]` が
|
|
75
|
+
配色を書いていない図にも当たる。
|
|
76
|
+
|
|
77
|
+
遮断は `layout` 1 箇所に置く。 描画は必ず組み立てを通るので、
|
|
78
|
+
組み立て API と `er` は素通しにしてある。 上流にも置くと、どの入力でも通らない分岐が残る。
|
|
79
|
+
|
|
8
80
|
## [0.24.0] - 2026-09-02
|
|
9
81
|
|
|
10
82
|
### Added
|
|
@@ -1243,7 +1315,9 @@ Initial OSS release.
|
|
|
1243
1315
|
使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
|
|
1244
1316
|
行き止まりになる。
|
|
1245
1317
|
|
|
1246
|
-
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.
|
|
1318
|
+
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.26.0...HEAD
|
|
1319
|
+
[0.26.0]: https://github.com/cardene777/cdl/compare/v0.25.0...v0.26.0
|
|
1320
|
+
[0.25.0]: https://github.com/cardene777/cdl/compare/v0.24.0...v0.25.0
|
|
1247
1321
|
[0.24.0]: https://github.com/cardene777/cdl/compare/v0.23.0...v0.24.0
|
|
1248
1322
|
[0.23.0]: https://github.com/cardene777/cdl/compare/v0.22.0...v0.23.0
|
|
1249
1323
|
[0.22.0]: https://github.com/cardene777/cdl/compare/v0.21.2...v0.22.0
|
package/dist/index.cjs
CHANGED
|
@@ -11484,6 +11484,8 @@ function diagram(id, options) {
|
|
|
11484
11484
|
topic: options.topic,
|
|
11485
11485
|
// 既定 (extract) は省略して JSON 形状を変えない。 exclude を明示した図だけ持たせる。
|
|
11486
11486
|
...options.structuredData === "exclude" ? { structuredData: "exclude" } : {},
|
|
11487
|
+
// 配色の名前は素通しする。 空文字の遮断は `layout` が持つ (後段が必ず通るため)
|
|
11488
|
+
...options.palette !== void 0 ? { palette: options.palette } : {},
|
|
11487
11489
|
// inputs / formulas / scrollTriggers / eventBindings は空なら省略 (static diagram の JSON 形状維持)
|
|
11488
11490
|
...inputs.length > 0 ? { inputs: [...inputs] } : {},
|
|
11489
11491
|
...formulas.length > 0 ? { formulas: [...formulas] } : {},
|
|
@@ -11794,6 +11796,12 @@ function rowBaselineY(kind, index) {
|
|
|
11794
11796
|
if (!rendersRows(kind)) return null;
|
|
11795
11797
|
return kind === "storage" ? ROW_TOP_STORAGE + index * ROW_PITCH_STORAGE : ROW_TOP_GENERIC + genericTextShift(kind) + index * ROW_PITCH_GENERIC;
|
|
11796
11798
|
}
|
|
11799
|
+
function rowStripeBand(kind, index, shift) {
|
|
11800
|
+
const baseline = rowBaselineY(kind, index);
|
|
11801
|
+
if (baseline === null) return null;
|
|
11802
|
+
const pitch = ROW_PITCH_STORAGE ;
|
|
11803
|
+
return { y: baseline + shift - pitch / 2, h: pitch };
|
|
11804
|
+
}
|
|
11797
11805
|
function genericTextShift(kind) {
|
|
11798
11806
|
return KINDS_SHAPE_CYLINDER.has(kind ?? "") ? GENERIC_TEXT_SHIFT_CYLINDER : 0;
|
|
11799
11807
|
}
|
|
@@ -20258,6 +20266,12 @@ function layout(diag) {
|
|
|
20258
20266
|
...diag.derived ? { derived: diag.derived } : {},
|
|
20259
20267
|
// 矢印をいつ出すか (#582)。 描き手が読む欄なので、そのまま持ち越す
|
|
20260
20268
|
...diag.edgeReveal ? { edgeReveal: diag.edgeReveal } : {},
|
|
20269
|
+
// どの配色で描くか (#1553)。 空文字は書かなかった扱いにする = 空の目印を出すと、
|
|
20270
|
+
// 消費側の `[data-cdl-palette]` が配色を書いていない図にも当たる。
|
|
20271
|
+
//
|
|
20272
|
+
// **遮断はここだけに置く**。 描画は必ず組み立てを通り、組み立て API も `er` も
|
|
20273
|
+
// 素通しにしてある。 上流にも置くと、どの入力でも通らない分岐が残る
|
|
20274
|
+
...diag.palette ? { palette: diag.palette } : {},
|
|
20261
20275
|
bboxes,
|
|
20262
20276
|
collisions,
|
|
20263
20277
|
nearCollisions,
|
|
@@ -22752,6 +22766,7 @@ var ROW_GLYPH_CX = ROW_PAD_X_PX + ROW_GLYPH_HALF + 1;
|
|
|
22752
22766
|
var ROW_GLYPH_LEAD = 40;
|
|
22753
22767
|
var ROW_TYPE_FONT = 22;
|
|
22754
22768
|
var SUBTITLE_BASELINE = 118;
|
|
22769
|
+
var STRIPE_MIN_ROWS = 2;
|
|
22755
22770
|
var SUBTITLE_FONT = 20;
|
|
22756
22771
|
var UNDERLINE_DROP = 7;
|
|
22757
22772
|
function RowGlyph({ mark, x, y, color }) {
|
|
@@ -22809,6 +22824,25 @@ function StorageNode({
|
|
|
22809
22824
|
strokeWidth: active ? 3 : 1.25
|
|
22810
22825
|
}
|
|
22811
22826
|
),
|
|
22827
|
+
node.rowStripe && rows.length >= STRIPE_MIN_ROWS && rows.map((_, idx) => {
|
|
22828
|
+
if (idx % 2 !== 0) return null;
|
|
22829
|
+
const \u5E2F = rowStripeBand("storage", idx, \u884C\u306E\u4E0B\u3052);
|
|
22830
|
+
if (!\u5E2F) return null;
|
|
22831
|
+
if (\u5E2F.y + \u5E2F.h > node.h) return null;
|
|
22832
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
22833
|
+
"rect",
|
|
22834
|
+
{
|
|
22835
|
+
"data-cdl-role": "node-row-stripe",
|
|
22836
|
+
"data-cdl-row-index": idx,
|
|
22837
|
+
x: 1,
|
|
22838
|
+
y: \u5E2F.y,
|
|
22839
|
+
width: node.w - 2,
|
|
22840
|
+
height: \u5E2F.h,
|
|
22841
|
+
fill: "var(--cdl-row-stripe, var(--cdl-label-bg, #f3f4f6))"
|
|
22842
|
+
},
|
|
22843
|
+
`stripe-${idx}`
|
|
22844
|
+
);
|
|
22845
|
+
}),
|
|
22812
22846
|
node.eyebrow && /* @__PURE__ */ jsxRuntime.jsx("text", { x: 26, y: 38, fontSize: 18, fontWeight: 700, letterSpacing: 2, fill: accent, children: node.eyebrow }),
|
|
22813
22847
|
\u5370\u3067\u5206\u3051\u308B && node.subtitle && // 呼び名は **印で分ける箱でだけ** 出す (#578)。 従来の箱は題の下に区切り線が来るので
|
|
22814
22848
|
// 置き場が無い
|
|
@@ -29656,6 +29690,7 @@ function CdlStage({
|
|
|
29656
29690
|
"aria-label": buildDiagramAltText(laid.topic, currentPhase),
|
|
29657
29691
|
"data-cdl-stage": "",
|
|
29658
29692
|
"data-cdl-scale": diagramScale === 1 ? void 0 : diagramScale,
|
|
29693
|
+
"data-cdl-palette": laid.palette,
|
|
29659
29694
|
children: [
|
|
29660
29695
|
/* @__PURE__ */ jsxRuntime.jsxs("defs", { children: [
|
|
29661
29696
|
Object.entries(TONE).flatMap(
|
|
@@ -30529,7 +30564,8 @@ var ER_CARDINALITY_HEAD = {
|
|
|
30529
30564
|
function er(preset) {
|
|
30530
30565
|
const entityW = resolveStorageBoxW(preset.entityWidth, "er", "entityWidth");
|
|
30531
30566
|
const tone = preset.defaultTone ?? "info";
|
|
30532
|
-
const
|
|
30567
|
+
const \u7E1E\u3092\u6577\u304F = preset.rowStripe ?? true;
|
|
30568
|
+
const b = diagram(preset.id, { topic: preset.topic, palette: preset.palette });
|
|
30533
30569
|
const entities = [];
|
|
30534
30570
|
const phaseActivate = [];
|
|
30535
30571
|
let relIdx = 0;
|
|
@@ -30565,7 +30601,10 @@ function er(preset) {
|
|
|
30565
30601
|
...\u8A2D\u8A08\u306E\u5F62 ? {} : { eyebrow: "\u30A8\u30F3\u30C6\u30A3\u30C6\u30A3" },
|
|
30566
30602
|
...\u8A2D\u8A08\u306E\u5F62 && e.subtitle ? { subtitle: e.subtitle } : {},
|
|
30567
30603
|
rows,
|
|
30568
|
-
...\u8A2D\u8A08\u306E\u5F62 ? { rowMarks: \u5370 } : {}
|
|
30604
|
+
...\u8A2D\u8A08\u306E\u5F62 ? { rowMarks: \u5370 } : {},
|
|
30605
|
+
// 縞は設計の形だけに敷く (#1553)。 `rows` を直接書いた古い形は行頭の印を持たず、
|
|
30606
|
+
// 群の区切りも線で表しているので、縞を足すと手掛かりが 3 つになる
|
|
30607
|
+
...\u8A2D\u8A08\u306E\u5F62 && \u7E1E\u3092\u6577\u304F ? { rowStripe: true } : {}
|
|
30569
30608
|
});
|
|
30570
30609
|
entities.push(e.id);
|
|
30571
30610
|
phaseActivate.push(e.id);
|
|
@@ -30796,7 +30835,8 @@ function stripAccess(row) {
|
|
|
30796
30835
|
function classDiagram(preset) {
|
|
30797
30836
|
const classW = resolveStorageBoxW(preset.classWidth, "classDiagram", "classWidth");
|
|
30798
30837
|
const tone = preset.defaultTone ?? "info";
|
|
30799
|
-
const
|
|
30838
|
+
const \u7E1E\u3092\u6577\u304F = preset.rowStripe ?? true;
|
|
30839
|
+
const b = diagram(preset.id, { topic: preset.topic, palette: preset.palette });
|
|
30800
30840
|
const classes = [];
|
|
30801
30841
|
const phaseActivate = [];
|
|
30802
30842
|
const \u7BB1 = [];
|
|
@@ -30844,7 +30884,9 @@ function classDiagram(preset) {
|
|
|
30844
30884
|
// 種類の札は **書いた時だけ** 出す (#578)。 「クラス」 と書いた札は箱がクラスで
|
|
30845
30885
|
// あることしか言わず、図の中の全ての箱に同じ字が並ぶ
|
|
30846
30886
|
...m.c.stereotype ? { eyebrow: m.c.stereotype } : {},
|
|
30847
|
-
...m.rows.length > 0 ? { rows: m.rows, rowMarks: m.rowMarks } : {}
|
|
30887
|
+
...m.rows.length > 0 ? { rows: m.rows, rowMarks: m.rowMarks } : {},
|
|
30888
|
+
// 縞は行を持つ箱にだけ敷く (#627)。 行が無い箱に書いても描き手が読まない
|
|
30889
|
+
...m.rows.length > 0 && \u7E1E\u3092\u6577\u304F ? { rowStripe: true } : {}
|
|
30848
30890
|
});
|
|
30849
30891
|
classes.push(m.c.id);
|
|
30850
30892
|
phaseActivate.push(m.c.id);
|