@cardenelabs/cdl 0.121.0 → 0.123.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 +51 -1
- package/README.md +137 -0
- package/SPEC.md +1 -1
- package/dist/index.cjs +1513 -667
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +51 -33
- package/dist/index.d.ts +51 -33
- package/dist/index.js +1513 -668
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +1271 -444
- 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 +1271 -444
- package/dist/react.js.map +1 -1
- package/dist/{render-A5AKjNuy.d.cts → render-CVczwfRb.d.cts} +40 -7
- package/dist/{render-A5AKjNuy.d.ts → render-CVczwfRb.d.ts} +40 -7
- package/package.json +9 -12
- package/src/builder.ts +8 -2
- package/src/index.ts +3 -0
- package/src/kinds/box-lines.ts +17 -4
- package/src/kinds/chart-bar.tsx +4 -0
- package/src/kinds/chart-gauge.tsx +20 -9
- package/src/kinds/chart-pie.tsx +67 -17
- package/src/kinds/chart-radial.tsx +7 -2
- package/src/kinds/chart-slope.tsx +26 -7
- package/src/kinds/chart-stacked-bar.tsx +8 -4
- package/src/kinds/chart-stat.tsx +19 -4
- package/src/kinds/chart-waffle.tsx +7 -2
- package/src/kinds/dyn-shape.tsx +22 -9
- package/src/kinds/funnel.tsx +9 -2
- package/src/kinds/generic.tsx +5 -2
- package/src/kinds/mind-map.tsx +26 -10
- package/src/kinds/quadrant.tsx +14 -4
- package/src/kinds/row-align.ts +19 -7
- package/src/kinds/sequence-board-metrics.ts +13 -3
- package/src/kinds/sequence-board.tsx +4 -2
- package/src/kinds/shape-basement.tsx +57 -32
- package/src/kinds/shape-blockchain.tsx +83 -34
- package/src/kinds/shape-commerce.tsx +65 -24
- package/src/kinds/shape-finance.tsx +90 -26
- package/src/kinds/shape-hardware.tsx +48 -17
- package/src/kinds/shape-region.tsx +16 -6
- package/src/kinds/shape-software.tsx +30 -8
- package/src/kinds/station.tsx +29 -0
- package/src/kinds/text-width.ts +17 -3
- package/src/kinds/tree.tsx +25 -7
- package/src/layout/collisions.ts +50 -28
- package/src/layout/curve-path.ts +126 -0
- package/src/layout/edges.ts +271 -58
- package/src/layout/head-label.ts +11 -5
- package/src/layout/lanes.ts +3 -2
- package/src/layout/metro-path.ts +185 -0
- package/src/layout/nodes.ts +14 -6
- package/src/layout/predict-bbox.ts +6 -3
- package/src/layout/self-loop.ts +10 -4
- package/src/layout/spec.ts +36 -7
- package/src/layout/text-width.ts +25 -8
- package/src/layout/tokens.ts +2 -0
- package/src/layout-with-validation.ts +10 -5
- package/src/layout.ts +55 -21
- package/src/presets.ts +69 -43
- package/src/render/edges.tsx +19 -3
- package/src/render/interactive-panel.tsx +34 -7
- package/src/render/nodes.tsx +100 -48
- package/src/render/stage.tsx +3 -0
- package/src/text-metrics.ts +9 -0
- package/src/types.ts +41 -4
- package/src/visual-validate.ts +91 -21
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,54 @@ CDL (Chainome Diagram Language) の主要変更履歴。
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.123.0] - 2026-10-05
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **図ごとに等幅書体の字幅で配置を計算できる `textMetrics` を足した** (#1006, #1009)
|
|
13
|
+
|
|
14
|
+
`textMetrics: "monospace"` では半角を 0.63 em、全角を 1.08 em の実測幅で測り、箱・札・衝突判定に加えて図表・マインドマップ・絵の中の字も同じ幅に揃える。
|
|
15
|
+
`textMetrics` を書かない既存の図は `proportional` のままで、出力は変わらない。
|
|
16
|
+
|
|
17
|
+
- **線の札と主役の線・棒を属性で選べるようにした** (#1008)
|
|
18
|
+
|
|
19
|
+
中ほどと端の札へ `data-cdl-tone`、主役の線と札へ `data-cdl-edge-role`、最大値の棒へ `data-cdl-emphasis` を出す。
|
|
20
|
+
既存の図の色と不透明度は変わらないが、`[data-cdl-tone]` を祖先に置く selector は札にも当たり始める。
|
|
21
|
+
|
|
22
|
+
## [0.122.0] - 2026-10-04
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- **2 つの箱を、水平に出て水平に入る曲線でつなげるようにした** (#997)
|
|
27
|
+
|
|
28
|
+
`routing: "curve"` で、段や列をまたぐ箱を 3 次曲線で結べる。
|
|
29
|
+
2 点が同じ高さなら直線になり、終点の矢印は水平を向く。
|
|
30
|
+
既存の図は `routing` を書かなければ出力が変わらない。
|
|
31
|
+
曲線は書いた形を優先するため、途中の箱は避けない。
|
|
32
|
+
|
|
33
|
+
- **路線図の線と、線路上に置く駅を足した** (#996)
|
|
34
|
+
|
|
35
|
+
`routing: "metro"` で、横線と傾き ±1 の斜線を円弧でつなげられる。
|
|
36
|
+
駅は `station` で描き、`posX` / `posY` に小さな丸を置いて名前と説明を外へ出す。
|
|
37
|
+
`metro` は途中の箱を避けず、既存の道筋と座標を固定した線の出力は変わらない。
|
|
38
|
+
同じ lane に横並びで置いた箱を、縦の隙間の検査 (`node-vertical-clearance`) が縦の隣として測らなくなった。
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
|
|
42
|
+
- **終点をずらした線の名札を置き直す処理が、名札を箱から離す処理と別の基準で置き場所を決めていた** (#1002)
|
|
43
|
+
|
|
44
|
+
名札を置けるかの判定を 1 つにまとめた。
|
|
45
|
+
置き直した名札が箱との余白と自分の線からの距離の上限を守り、後の処理に押し直されない。
|
|
46
|
+
線の上に重ねる名札 (`overlay`) のうち線の上に載っているものは動かさない。
|
|
47
|
+
|
|
48
|
+
### Fixed
|
|
49
|
+
|
|
50
|
+
- **同じ辺に 2 本入る線の名札が、ずらす前の位置に残って線を覆い、線が切れ端に見えた** (#1000)
|
|
51
|
+
|
|
52
|
+
終点だけを辺に沿って動かし、名札を動かしていなかった。
|
|
53
|
+
経路を動かし終えた後に、最後の区間を覆う名札だけを線と一緒に動かす。
|
|
54
|
+
同じ辺に 2 本入らない図の出力は変わらない。
|
|
55
|
+
|
|
8
56
|
## [0.121.0] - 2026-10-02
|
|
9
57
|
|
|
10
58
|
### Fixed
|
|
@@ -4816,7 +4864,9 @@ Initial OSS release.
|
|
|
4816
4864
|
使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
|
|
4817
4865
|
行き止まりになる。
|
|
4818
4866
|
|
|
4819
|
-
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.
|
|
4867
|
+
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.123.0...HEAD
|
|
4868
|
+
[0.123.0]: https://github.com/cardene777/cdl/compare/v0.122.0...v0.123.0
|
|
4869
|
+
[0.122.0]: https://github.com/cardene777/cdl/compare/v0.121.0...v0.122.0
|
|
4820
4870
|
[0.121.0]: https://github.com/cardene777/cdl/compare/v0.120.0...v0.121.0
|
|
4821
4871
|
[0.120.0]: https://github.com/cardene777/cdl/compare/v0.119.0...v0.120.0
|
|
4822
4872
|
[0.119.0]: https://github.com/cardene777/cdl/compare/v0.118.0...v0.119.0
|
package/README.md
CHANGED
|
@@ -66,6 +66,43 @@ export function AuthSequenceDemo() {
|
|
|
66
66
|
|
|
67
67
|
これで UML sequence diagram が phase 切替 + state diff + 進行点 glow で animated に表示。
|
|
68
68
|
|
|
69
|
+
### 等幅書体で描く図の字幅
|
|
70
|
+
|
|
71
|
+
`textMetrics` は `proportional` (既定) または `monospace` を取る。
|
|
72
|
+
消費側が図全体を等幅書体で描く場合は `monospace` を指定すると、配置計算と描画の字幅を揃えられる。
|
|
73
|
+
|
|
74
|
+
`monospace` は `fontFamily: "mono"` と同じ JetBrains Mono の実測で、ASCII・半角カナ・記号を 0.63 em、
|
|
75
|
+
和字と全角 (CJK) を 1.08 em、絵文字を 1.16 em として書記素ごとに加算する。
|
|
76
|
+
図表の字、マインドマップの名前、絵の中の字も同じ測り方になる。
|
|
77
|
+
|
|
78
|
+
preset では options に指定する。
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
const terminalFlow = sequence({
|
|
82
|
+
id: "terminal-flow",
|
|
83
|
+
topic: "Terminal flow",
|
|
84
|
+
actors: ["CLI", "Worker"],
|
|
85
|
+
textMetrics: "monospace",
|
|
86
|
+
});
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
`CdlDiagram` を直接組み立てる場合は field に指定する。
|
|
90
|
+
|
|
91
|
+
```ts
|
|
92
|
+
import type { CdlDiagram } from "@cardenelabs/cdl";
|
|
93
|
+
|
|
94
|
+
const terminalDiagram: CdlDiagram = {
|
|
95
|
+
id: "terminal",
|
|
96
|
+
topic: "Terminal",
|
|
97
|
+
textMetrics: "monospace",
|
|
98
|
+
lanes: [],
|
|
99
|
+
nodes: [],
|
|
100
|
+
edges: [],
|
|
101
|
+
states: [],
|
|
102
|
+
phases: [],
|
|
103
|
+
};
|
|
104
|
+
```
|
|
105
|
+
|
|
69
106
|
## 6 つの preset
|
|
70
107
|
|
|
71
108
|
低位 API (lane / node / edge 個別宣言) + 高位 preset (1 行で典型図生成)。
|
|
@@ -189,6 +226,11 @@ export const custom = diagram("custom", { topic: "Custom" })
|
|
|
189
226
|
流れの始まりと終わりを示す印として `mark-start` (塗った丸) と `mark-end` (輪で囲んだ丸) がある。
|
|
190
227
|
印そのものが意味を持つので文字は描かない。
|
|
191
228
|
|
|
229
|
+
路線図の駅には `station` を使う。
|
|
230
|
+
駅は小さな丸で、名前を丸の上、説明 (`subtitle`) を丸の下に描く。
|
|
231
|
+
`posX` / `posY` で線路上の点へ置き、既定の大きさは 24×24 になる。
|
|
232
|
+
`tone` を指定すると丸の枠色が変わる。
|
|
233
|
+
|
|
192
234
|
書ける種類の全件は `NODE_KINDS` を値として公開しているので、記法を書く側は手書きせずに引ける
|
|
193
235
|
(上の表は代表例で、全件ではない)。
|
|
194
236
|
|
|
@@ -221,6 +263,67 @@ export const custom = diagram("custom", { topic: "Custom" })
|
|
|
221
263
|
| `warning` | `#c9a23e` | 警告 |
|
|
222
264
|
| `info` | `#5a8ec1` | 情報 |
|
|
223
265
|
|
|
266
|
+
## 線の道筋 (routing)
|
|
267
|
+
|
|
268
|
+
| 値 | 道筋 | 向く場面 |
|
|
269
|
+
|---|---|---|
|
|
270
|
+
| `default` | 箱を避け、角を丸めた直角の線 | 箱を避けたい図、直角の線に揃えたい図 |
|
|
271
|
+
| `back-detour` | 箱の上を回って戻る線 | 前の箱へ戻る関係 |
|
|
272
|
+
| `curve` | 両端で水平になる 3 次曲線 | 段や列をまたぐ関係を柔らかくつなぐ図 |
|
|
273
|
+
| `metro` | 横線と傾き ±1 の斜線を円弧で結ぶ線 | 路線図の線路と乗り換え |
|
|
274
|
+
|
|
275
|
+
`curve` は、行き先が右なら始点の右辺から終点の左辺へ、左なら始点の左辺から終点の右辺へ結ぶ。
|
|
276
|
+
2 つの箱の横の範囲が重なる時は、両方の右辺を結ぶ。
|
|
277
|
+
2 点の高さが同じなら直線になる。
|
|
278
|
+
線が終点へ水平に入るため、終点の矢印も線の向きに沿って水平を向く。
|
|
279
|
+
途中の箱は避けない。
|
|
280
|
+
箱を避けたい時は `routing` を書かずに `default` のままにする。
|
|
281
|
+
|
|
282
|
+
```ts
|
|
283
|
+
import { diagram } from "@cardenelabs/cdl";
|
|
284
|
+
|
|
285
|
+
export const curvedRelation = diagram("curved-relation", { topic: "曲線で結ぶ" })
|
|
286
|
+
.lane("left", { x: 0, width: 300 })
|
|
287
|
+
.lane("right", { x: 600, width: 300 })
|
|
288
|
+
.node("source", { lane: "left", stack: 0, kind: "card", title: "始点" })
|
|
289
|
+
.node("target", { lane: "right", stack: 1, kind: "card", title: "終点" })
|
|
290
|
+
.edge("source", "target", { id: "curve", label: "柔らかくつなぐ", routing: "curve" })
|
|
291
|
+
.build();
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
`metro` は、行き先が右なら始点の右辺から終点の左辺へ、左なら始点の左辺から終点の右辺へ結ぶ。
|
|
295
|
+
両端の間に高さの差以上の横幅があれば、傾き ±1 の斜線を中央に置く。
|
|
296
|
+
横線と斜線は半径 24 を上限とする円弧でつなぎ、横線か斜線が短い時は収まる半径まで縮める。
|
|
297
|
+
横の余裕が高さの差に足りない時と、箱の横の範囲が重なる時は、両方の右辺をくの字で結ぶ。
|
|
298
|
+
同じ高さなら横の直線になり、途中の箱は避けない。
|
|
299
|
+
|
|
300
|
+
`metro` を使う図だけがこの道筋を選ぶ。
|
|
301
|
+
`default` / `back-detour` / `curve` の線と、座標を固定した線の出力は変わらない。
|
|
302
|
+
|
|
303
|
+
```ts
|
|
304
|
+
import { diagram } from "@cardenelabs/cdl";
|
|
305
|
+
|
|
306
|
+
export const metroMap = diagram("metro-map", { topic: "路線図" })
|
|
307
|
+
.lane("upper", { x: 0, width: 700 })
|
|
308
|
+
.lane("lower", { x: 800, width: 700 })
|
|
309
|
+
.node("central", {
|
|
310
|
+
lane: "upper", stack: 0, kind: "station", title: "中央", posX: 100, posY: 200,
|
|
311
|
+
})
|
|
312
|
+
.node("museum", {
|
|
313
|
+
lane: "upper", stack: 1, kind: "station", title: "美術館", posX: 500, posY: 200,
|
|
314
|
+
})
|
|
315
|
+
.node("river", {
|
|
316
|
+
lane: "lower", stack: 0, kind: "station", title: "川辺", posX: 900, posY: 400,
|
|
317
|
+
})
|
|
318
|
+
.node("park", {
|
|
319
|
+
lane: "lower", stack: 1, kind: "station", title: "公園", posX: 1300, posY: 400,
|
|
320
|
+
})
|
|
321
|
+
.edge("central", "museum", { id: "upper-line", label: "", routing: "metro" })
|
|
322
|
+
.edge("river", "park", { id: "lower-line", label: "", routing: "metro" })
|
|
323
|
+
.edge("museum", "river", { id: "transfer", label: "乗り換え", routing: "metro" })
|
|
324
|
+
.build();
|
|
325
|
+
```
|
|
326
|
+
|
|
224
327
|
## phase / state / tween / set / badge
|
|
225
328
|
|
|
226
329
|
phase 内で state を tween / set し、 badge を出す。
|
|
@@ -384,6 +487,40 @@ cdl は形だけを描き、 色や影は持たない (geometry only、 style
|
|
|
384
487
|
}
|
|
385
488
|
```
|
|
386
489
|
|
|
490
|
+
駅と路線図の線は、次の selector で個別に選べる。
|
|
491
|
+
|
|
492
|
+
```css
|
|
493
|
+
[data-cdl-role="node-body"][data-cdl-mark="station"] { /* 駅 */ }
|
|
494
|
+
[data-cdl-routing="metro"] [data-cdl-role="edge-line"] { /* 路線図の線 */ }
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
線の札と主役は、次の属性で選べる。
|
|
498
|
+
|
|
499
|
+
| 属性 | 付く要素 | 値 |
|
|
500
|
+
|---|---|---|
|
|
501
|
+
| `data-cdl-tone` | 線の要素の `g`、中ほどの札の `g` (`[data-cdl-edge-label-for]`)、端の札の `text` (`[data-cdl-edge-end-label-for]`) | 線の tone 名 (`accent` / `teal` / `success` / `error` / `warning` / `info`)。主役の線でも tone 名のまま |
|
|
502
|
+
| `data-cdl-edge-role` | 主役の線 (`role: "main"`) の線の要素の `g`・中ほどの札の `g`・端の札の `text` | `main`。主役でない線には付かない |
|
|
503
|
+
| `data-cdl-emphasis` | 棒グラフ (`chart-bar`) の棒 `rect` | `primary`。値が最大の棒すべてに付く (同率なら全部)。全ての値が 0 以下なら付かない |
|
|
504
|
+
|
|
505
|
+
```css
|
|
506
|
+
[data-cdl-edge-label-for][data-cdl-tone="accent"] [data-cdl-role="edge-label-bg"],
|
|
507
|
+
[data-cdl-edge-end-label-for][data-cdl-tone="accent"] {
|
|
508
|
+
fill: var(--cdl-tone-accent);
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
[data-cdl-edge-label-for][data-cdl-edge-role="main"] [data-cdl-role="edge-label-bg"],
|
|
512
|
+
[data-cdl-edge-end-label-for][data-cdl-edge-role="main"] {
|
|
513
|
+
fill: var(--cdl-now);
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
[data-cdl-role="chart-bar"][data-cdl-emphasis="primary"] {
|
|
517
|
+
stroke: var(--cdl-now);
|
|
518
|
+
}
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
`[data-cdl-tone="accent"] text` のように `data-cdl-tone` を祖先に置く selector は、札にも当たり始める。
|
|
522
|
+
札だけを除きたい時は `[data-cdl-edge][data-cdl-tone="accent"] text` のように `[data-cdl-edge]` を前に付け、線の要素に絞る。
|
|
523
|
+
|
|
387
524
|
明暗の切替は consumer 側の仕組み (`html` の class 等) で行う = cdl は明暗の概念を持たない。
|
|
388
525
|
|
|
389
526
|
**`CdlRole` 型は実装にある role の全部ではない**。 型に載っているのは共通の描画で使う
|
package/SPEC.md
CHANGED
|
@@ -177,7 +177,7 @@ phase が定義されると自動的に。
|
|
|
177
177
|
2. **node** は lane 内で stack 順に上から並ぶ、 各 stack の高さは kind の default (actor 140 / function 110 / storage 180 / event 130 / card 110)、 上下 gap 80px 固定
|
|
178
178
|
3. **lane label** は lane 上部に 30px の高さで表示
|
|
179
179
|
4. **contain: true** の lane は内部 node を 24px padding で破線 boundary 描く
|
|
180
|
-
5. **edge** routing
|
|
180
|
+
5. **edge** の自動 routing は角を丸めた orthogonal L 字 (起点 side → 中継 90° → 終点 side)。 `routing: "curve"` は両端で水平になる 3 次曲線、`routing: "metro"` は横線と傾き ±1 の斜線を円弧で結ぶ線を使う
|
|
181
181
|
6. **edge label** は path 中点から「path 進行方向の垂直方向」 に 50-80px 離して配置、 lane / node bbox との overlap を計算で避ける
|
|
182
182
|
7. **viewBox** は cdl が auto 計算 (全 lane の右端 + 余白 80px、 全 node の下端 + 余白 80px)
|
|
183
183
|
|