@cardenelabs/cdl 0.120.0 → 0.122.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/README.md +73 -0
- package/SPEC.md +1 -1
- package/dist/index.cjs +470 -70
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -10
- package/dist/index.d.ts +16 -10
- package/dist/index.js +470 -70
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +459 -61
- 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 +459 -61
- package/dist/react.js.map +1 -1
- package/dist/{render-A5AKjNuy.d.cts → render-U_pC-Ksh.d.cts} +21 -6
- package/dist/{render-A5AKjNuy.d.ts → render-U_pC-Ksh.d.ts} +21 -6
- package/package.json +1 -1
- package/src/builder.ts +3 -2
- package/src/index.ts +1 -0
- package/src/kinds/dyn-shape.tsx +22 -9
- package/src/kinds/station.tsx +29 -0
- package/src/layout/collisions.ts +29 -20
- package/src/layout/curve-path.ts +125 -0
- package/src/layout/edges.ts +207 -39
- package/src/layout/head-label.ts +26 -12
- package/src/layout/metro-path.ts +184 -0
- package/src/layout/spec.ts +16 -1
- package/src/layout/tokens.ts +2 -0
- package/src/layout-with-validation.ts +10 -5
- package/src/layout.ts +22 -12
- package/src/render/edges.tsx +19 -3
- package/src/render/nodes.tsx +3 -0
- package/src/types.ts +22 -4
- package/src/visual-validate.ts +24 -4
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,78 @@ CDL (Chainome Diagram Language) の主要変更履歴。
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.122.0] - 2026-10-04
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **2 つの箱を、水平に出て水平に入る曲線でつなげるようにした** (#997)
|
|
13
|
+
|
|
14
|
+
`routing: "curve"` で、段や列をまたぐ箱を 3 次曲線で結べる。
|
|
15
|
+
2 点が同じ高さなら直線になり、終点の矢印は水平を向く。
|
|
16
|
+
既存の図は `routing` を書かなければ出力が変わらない。
|
|
17
|
+
曲線は書いた形を優先するため、途中の箱は避けない。
|
|
18
|
+
|
|
19
|
+
- **路線図の線と、線路上に置く駅を足した** (#996)
|
|
20
|
+
|
|
21
|
+
`routing: "metro"` で、横線と傾き ±1 の斜線を円弧でつなげられる。
|
|
22
|
+
駅は `station` で描き、`posX` / `posY` に小さな丸を置いて名前と説明を外へ出す。
|
|
23
|
+
`metro` は途中の箱を避けず、既存の道筋と座標を固定した線の出力は変わらない。
|
|
24
|
+
同じ lane に横並びで置いた箱を、縦の隙間の検査 (`node-vertical-clearance`) が縦の隣として測らなくなった。
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
|
|
28
|
+
- **終点をずらした線の名札を置き直す処理が、名札を箱から離す処理と別の基準で置き場所を決めていた** (#1002)
|
|
29
|
+
|
|
30
|
+
名札を置けるかの判定を 1 つにまとめた。
|
|
31
|
+
置き直した名札が箱との余白と自分の線からの距離の上限を守り、後の処理に押し直されない。
|
|
32
|
+
線の上に重ねる名札 (`overlay`) のうち線の上に載っているものは動かさない。
|
|
33
|
+
|
|
34
|
+
### Fixed
|
|
35
|
+
|
|
36
|
+
- **同じ辺に 2 本入る線の名札が、ずらす前の位置に残って線を覆い、線が切れ端に見えた** (#1000)
|
|
37
|
+
|
|
38
|
+
終点だけを辺に沿って動かし、名札を動かしていなかった。
|
|
39
|
+
経路を動かし終えた後に、最後の区間を覆う名札だけを線と一緒に動かす。
|
|
40
|
+
同じ辺に 2 本入らない図の出力は変わらない。
|
|
41
|
+
|
|
42
|
+
## [0.121.0] - 2026-10-02
|
|
43
|
+
|
|
44
|
+
### Fixed
|
|
45
|
+
|
|
46
|
+
- **線の端に添える数が、縮めて出すと箱の中の字より一段小さく見えた** (#994)
|
|
47
|
+
|
|
48
|
+
大きさを札の下の行 (`EDGE_LABEL_TEXT.sub.fontSize`) から引いていた。
|
|
49
|
+
札は箱と箱の間に置くので縮めても読めるが、端の字は線の脇で単独に立つので同じ大きさでは負ける。
|
|
50
|
+
見本帳はクラス図を 0.42 倍で出しており、19 は画面で 8 画素、箱の中の字は 11 画素だった。
|
|
51
|
+
|
|
52
|
+
端の字の大きさを札から切り離して 26 にした。
|
|
53
|
+
画面では 11 画素になり、箱の中の字と並ぶ。
|
|
54
|
+
|
|
55
|
+
あわせて **余白を字の大きさに連れて広げない形に戻した**。
|
|
56
|
+
[#989](https://github.com/cardene777/cdl/issues/989) は字の箱の高さの半分から導いていたので、
|
|
57
|
+
字を 26 に上げると余白まで 16 に広がり、印の大きさは変わらないのに字だけが線から遠ざかった。
|
|
58
|
+
実機で見た言葉は「間伸びしてる」 で、図も縦に伸びていた。
|
|
59
|
+
この余白が避ける相手は印で、印は字に連れて変わらないため、避ける幅も動かさない。
|
|
60
|
+
|
|
61
|
+
| 何を | 前 | 後 |
|
|
62
|
+
|---|---|---|
|
|
63
|
+
| 端の字の大きさ | 19 (札の下の行と同じ) | 26 (独立) |
|
|
64
|
+
| 印と字の余白 | 12 (箱の半分から導く) | 12 (据え置き) |
|
|
65
|
+
| 線の脇へ離す | 19 | 19 |
|
|
66
|
+
| 端から線に沿って戻る | 26 | 26 |
|
|
67
|
+
|
|
68
|
+
線に沿って戻る距離は変えていないので、箱の間隔は字の箱が高くなった分 (23 から 31) だけ伸びる。
|
|
69
|
+
|
|
70
|
+
- **走る丸を太らせると端の印に食い込んだ** (#994)
|
|
71
|
+
|
|
72
|
+
通り道を縮める幅を **芯の半径** で測っていた。
|
|
73
|
+
使う側は紙の色の縁を回して玉を線から浮かせるので、実際の外側は芯より太い
|
|
74
|
+
(見本帳は 3.5 の縁を足しており、外側は芯 + 1.75 になる)。
|
|
75
|
+
縁は CSS で足されるため描く側からは見えない。
|
|
76
|
+
|
|
77
|
+
芯を 11 から 12 に上げ、縮める幅の基準を **玉の一番外の縁** (芯 + 縁の見込み 2) に変えた。
|
|
78
|
+
これより太い縁を足すと印に入るので、見込みの値は描く側が持つ。
|
|
79
|
+
|
|
8
80
|
## [0.120.0] - 2026-10-02
|
|
9
81
|
|
|
10
82
|
### Fixed
|
|
@@ -4778,7 +4850,9 @@ Initial OSS release.
|
|
|
4778
4850
|
使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
|
|
4779
4851
|
行き止まりになる。
|
|
4780
4852
|
|
|
4781
|
-
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.
|
|
4853
|
+
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.122.0...HEAD
|
|
4854
|
+
[0.122.0]: https://github.com/cardene777/cdl/compare/v0.121.0...v0.122.0
|
|
4855
|
+
[0.121.0]: https://github.com/cardene777/cdl/compare/v0.120.0...v0.121.0
|
|
4782
4856
|
[0.120.0]: https://github.com/cardene777/cdl/compare/v0.119.0...v0.120.0
|
|
4783
4857
|
[0.119.0]: https://github.com/cardene777/cdl/compare/v0.118.0...v0.119.0
|
|
4784
4858
|
[0.118.0]: https://github.com/cardene777/cdl/compare/v0.117.0...v0.118.0
|
package/README.md
CHANGED
|
@@ -189,6 +189,11 @@ export const custom = diagram("custom", { topic: "Custom" })
|
|
|
189
189
|
流れの始まりと終わりを示す印として `mark-start` (塗った丸) と `mark-end` (輪で囲んだ丸) がある。
|
|
190
190
|
印そのものが意味を持つので文字は描かない。
|
|
191
191
|
|
|
192
|
+
路線図の駅には `station` を使う。
|
|
193
|
+
駅は小さな丸で、名前を丸の上、説明 (`subtitle`) を丸の下に描く。
|
|
194
|
+
`posX` / `posY` で線路上の点へ置き、既定の大きさは 24×24 になる。
|
|
195
|
+
`tone` を指定すると丸の枠色が変わる。
|
|
196
|
+
|
|
192
197
|
書ける種類の全件は `NODE_KINDS` を値として公開しているので、記法を書く側は手書きせずに引ける
|
|
193
198
|
(上の表は代表例で、全件ではない)。
|
|
194
199
|
|
|
@@ -221,6 +226,67 @@ export const custom = diagram("custom", { topic: "Custom" })
|
|
|
221
226
|
| `warning` | `#c9a23e` | 警告 |
|
|
222
227
|
| `info` | `#5a8ec1` | 情報 |
|
|
223
228
|
|
|
229
|
+
## 線の道筋 (routing)
|
|
230
|
+
|
|
231
|
+
| 値 | 道筋 | 向く場面 |
|
|
232
|
+
|---|---|---|
|
|
233
|
+
| `default` | 箱を避け、角を丸めた直角の線 | 箱を避けたい図、直角の線に揃えたい図 |
|
|
234
|
+
| `back-detour` | 箱の上を回って戻る線 | 前の箱へ戻る関係 |
|
|
235
|
+
| `curve` | 両端で水平になる 3 次曲線 | 段や列をまたぐ関係を柔らかくつなぐ図 |
|
|
236
|
+
| `metro` | 横線と傾き ±1 の斜線を円弧で結ぶ線 | 路線図の線路と乗り換え |
|
|
237
|
+
|
|
238
|
+
`curve` は、行き先が右なら始点の右辺から終点の左辺へ、左なら始点の左辺から終点の右辺へ結ぶ。
|
|
239
|
+
2 つの箱の横の範囲が重なる時は、両方の右辺を結ぶ。
|
|
240
|
+
2 点の高さが同じなら直線になる。
|
|
241
|
+
線が終点へ水平に入るため、終点の矢印も線の向きに沿って水平を向く。
|
|
242
|
+
途中の箱は避けない。
|
|
243
|
+
箱を避けたい時は `routing` を書かずに `default` のままにする。
|
|
244
|
+
|
|
245
|
+
```ts
|
|
246
|
+
import { diagram } from "@cardenelabs/cdl";
|
|
247
|
+
|
|
248
|
+
export const curvedRelation = diagram("curved-relation", { topic: "曲線で結ぶ" })
|
|
249
|
+
.lane("left", { x: 0, width: 300 })
|
|
250
|
+
.lane("right", { x: 600, width: 300 })
|
|
251
|
+
.node("source", { lane: "left", stack: 0, kind: "card", title: "始点" })
|
|
252
|
+
.node("target", { lane: "right", stack: 1, kind: "card", title: "終点" })
|
|
253
|
+
.edge("source", "target", { id: "curve", label: "柔らかくつなぐ", routing: "curve" })
|
|
254
|
+
.build();
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
`metro` は、行き先が右なら始点の右辺から終点の左辺へ、左なら始点の左辺から終点の右辺へ結ぶ。
|
|
258
|
+
両端の間に高さの差以上の横幅があれば、傾き ±1 の斜線を中央に置く。
|
|
259
|
+
横線と斜線は半径 24 を上限とする円弧でつなぎ、横線か斜線が短い時は収まる半径まで縮める。
|
|
260
|
+
横の余裕が高さの差に足りない時と、箱の横の範囲が重なる時は、両方の右辺をくの字で結ぶ。
|
|
261
|
+
同じ高さなら横の直線になり、途中の箱は避けない。
|
|
262
|
+
|
|
263
|
+
`metro` を使う図だけがこの道筋を選ぶ。
|
|
264
|
+
`default` / `back-detour` / `curve` の線と、座標を固定した線の出力は変わらない。
|
|
265
|
+
|
|
266
|
+
```ts
|
|
267
|
+
import { diagram } from "@cardenelabs/cdl";
|
|
268
|
+
|
|
269
|
+
export const metroMap = diagram("metro-map", { topic: "路線図" })
|
|
270
|
+
.lane("upper", { x: 0, width: 700 })
|
|
271
|
+
.lane("lower", { x: 800, width: 700 })
|
|
272
|
+
.node("central", {
|
|
273
|
+
lane: "upper", stack: 0, kind: "station", title: "中央", posX: 100, posY: 200,
|
|
274
|
+
})
|
|
275
|
+
.node("museum", {
|
|
276
|
+
lane: "upper", stack: 1, kind: "station", title: "美術館", posX: 500, posY: 200,
|
|
277
|
+
})
|
|
278
|
+
.node("river", {
|
|
279
|
+
lane: "lower", stack: 0, kind: "station", title: "川辺", posX: 900, posY: 400,
|
|
280
|
+
})
|
|
281
|
+
.node("park", {
|
|
282
|
+
lane: "lower", stack: 1, kind: "station", title: "公園", posX: 1300, posY: 400,
|
|
283
|
+
})
|
|
284
|
+
.edge("central", "museum", { id: "upper-line", label: "", routing: "metro" })
|
|
285
|
+
.edge("river", "park", { id: "lower-line", label: "", routing: "metro" })
|
|
286
|
+
.edge("museum", "river", { id: "transfer", label: "乗り換え", routing: "metro" })
|
|
287
|
+
.build();
|
|
288
|
+
```
|
|
289
|
+
|
|
224
290
|
## phase / state / tween / set / badge
|
|
225
291
|
|
|
226
292
|
phase 内で state を tween / set し、 badge を出す。
|
|
@@ -384,6 +450,13 @@ cdl は形だけを描き、 色や影は持たない (geometry only、 style
|
|
|
384
450
|
}
|
|
385
451
|
```
|
|
386
452
|
|
|
453
|
+
駅と路線図の線は、次の selector で個別に選べる。
|
|
454
|
+
|
|
455
|
+
```css
|
|
456
|
+
[data-cdl-role="node-body"][data-cdl-mark="station"] { /* 駅 */ }
|
|
457
|
+
[data-cdl-routing="metro"] [data-cdl-role="edge-line"] { /* 路線図の線 */ }
|
|
458
|
+
```
|
|
459
|
+
|
|
387
460
|
明暗の切替は consumer 側の仕組み (`html` の class 等) で行う = cdl は明暗の概念を持たない。
|
|
388
461
|
|
|
389
462
|
**`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
|
|