@cardenelabs/dragon 0.27.0 → 0.30.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.
Files changed (60) hide show
  1. package/README.md +119 -12
  2. package/dist/index.cjs +9619 -8023
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.cts +407 -175
  5. package/dist/index.d.ts +407 -175
  6. package/dist/index.js +9617 -8024
  7. package/dist/index.js.map +1 -1
  8. package/package.json +2 -2
  9. package/src/compile/actor-ids.ts +306 -0
  10. package/src/compile/actors.ts +74 -0
  11. package/src/compile/c4.ts +77 -0
  12. package/src/compile/chain.ts +54 -0
  13. package/src/compile/chart-fields.ts +178 -0
  14. package/src/compile/class.ts +100 -0
  15. package/src/compile/deep-rewrite.ts +30 -0
  16. package/src/compile/derived-source.ts +18 -0
  17. package/src/compile/direction.ts +63 -0
  18. package/src/compile/er-relation.ts +200 -0
  19. package/src/compile/er.ts +44 -0
  20. package/src/compile/flow.ts +54 -0
  21. package/src/compile/funnel.ts +75 -0
  22. package/src/compile/gantt.ts +232 -0
  23. package/src/compile/generic.ts +284 -0
  24. package/src/compile/hierarchy.ts +92 -0
  25. package/src/compile/journey.ts +84 -0
  26. package/src/compile/kinds.ts +156 -0
  27. package/src/compile/lanes.ts +56 -0
  28. package/src/compile/mind.ts +343 -0
  29. package/src/compile/node-title.ts +24 -0
  30. package/src/compile/notice.ts +94 -0
  31. package/src/compile/parts-lookup.ts +17 -0
  32. package/src/compile/parts.ts +2635 -0
  33. package/src/compile/placement-apply.ts +673 -0
  34. package/src/compile/placement.ts +15 -0
  35. package/src/compile/quadrant.ts +110 -0
  36. package/src/compile/rows.ts +40 -0
  37. package/src/compile/sequence.ts +226 -0
  38. package/src/compile/slug.ts +29 -0
  39. package/src/compile/solidity.ts +39 -0
  40. package/src/compile/state.ts +71 -0
  41. package/src/compile/subtitle.ts +22 -0
  42. package/src/compile/swimlane.ts +83 -0
  43. package/src/compile/topology.ts +50 -0
  44. package/src/compile/tree.ts +60 -0
  45. package/src/compile/value-chart.ts +183 -0
  46. package/src/compile/values.ts +432 -0
  47. package/src/compile/word-state.ts +82 -0
  48. package/src/compile.ts +596 -5672
  49. package/src/index.ts +13 -10
  50. package/src/json-line-map.ts +30 -0
  51. package/src/json-parser.ts +509 -176
  52. package/src/near-name.ts +42 -0
  53. package/src/notation-lint.ts +112 -74
  54. package/src/relative-pos.ts +71 -2
  55. package/src/schema.ts +1 -1
  56. package/src/schemas/diagram.json +130 -34
  57. package/src/types.ts +60 -41
  58. package/src/v05/input-table.generated.ts +6 -4
  59. package/src/v05/parser-types.ts +12 -1
  60. package/src/v05/parser.ts +503 -149
@@ -106,7 +106,7 @@
106
106
  },
107
107
  "kind": {
108
108
  "type": "string",
109
- "description": "node kind。 shape-* を指定して 49 shape 中から選ぶ。 例: 'shape-wallet' / 'shape-smart-contract' / 'shape-cloud' / 'shape-file' / 'actor' (default) / 'function' / 'storage' / 'event' 等"
109
+ "description": "node kind。 shape-* を指定して 49 shape 中から選ぶ。 例: 'shape-wallet' / 'shape-smart-contract' / 'shape-cloud' / 'shape-file' / 'actor' (default) / 'function' / 'storage' / 'event' 等。 種別に無い名前は部品の名前として部品の一覧 (partsCatalog) から引き、一覧にも無ければ種別を書かなかった箱になる。 部品を持つ一覧を渡した時は知らせを出し、綴りの近い名前を案内する。"
110
110
  },
111
111
  "subtitle": {
112
112
  "type": "string",
@@ -215,7 +215,7 @@
215
215
  },
216
216
  "end": {
217
217
  "type": "string",
218
- "description": "gantt の工程が終わる時期。"
218
+ "description": "gantt の工程が終わる時期。 始まりより前の時期は始まりと同じに倒し、知らせを出す。"
219
219
  },
220
220
  "touchpoint": {
221
221
  "type": "string",
@@ -241,32 +241,14 @@
241
241
  "type": "number",
242
242
  "description": "箱の高さ。"
243
243
  },
244
- "nodes": {
245
- "type": "object",
246
- "description": "箱の中の要素ごとの位置と大きさ。 key は header / footer / s0 等の要素名。",
247
- "additionalProperties": {
248
- "type": "object",
249
- "additionalProperties": false,
250
- "properties": {
251
- "posX": {
252
- "type": "number"
253
- },
254
- "posY": {
255
- "type": "number"
256
- },
257
- "posW": {
258
- "type": "number"
259
- },
260
- "posH": {
261
- "type": "number"
262
- }
263
- }
264
- }
265
- },
266
244
  "scale": {
267
245
  "type": "number",
268
246
  "description": "parts の描画倍率。 kind に parts identifier を指定した時だけ使える。"
269
247
  },
248
+ "phase": {
249
+ "type": "boolean",
250
+ "description": "parts が持つ段を使うか。 既定は書いた段と番号ごとに並べて再生する。 false を書くと parts の段の中身を空にし、値は animation に書いた段だけが動かす。 kind に parts identifier を指定した時だけ使える。"
251
+ },
270
252
  "pos": {
271
253
  "type": "object",
272
254
  "additionalProperties": false,
@@ -284,6 +266,36 @@
284
266
  }
285
267
  }
286
268
  },
269
+ "posRel": {
270
+ "type": "object",
271
+ "additionalProperties": false,
272
+ "description": "位置を他の要素からの相対で書く指定。 座標を知らなくても「誰の」「どちら側に」「どれだけ離して」 で置ける。 解決した後は posX / posY を書いた時と同じ経路を通る。",
273
+ "required": [
274
+ "anchor",
275
+ "dir"
276
+ ],
277
+ "properties": {
278
+ "anchor": {
279
+ "type": "string",
280
+ "minLength": 1,
281
+ "description": "基準にする相手の名前。 actors に書かれた名前をそのまま書く。"
282
+ },
283
+ "dir": {
284
+ "type": "string",
285
+ "enum": [
286
+ "right",
287
+ "left",
288
+ "above",
289
+ "below"
290
+ ],
291
+ "description": "基準からどちら側に置くか。"
292
+ },
293
+ "gap": {
294
+ "type": "number",
295
+ "description": "相手の縁との間隔。 書かなければ 160 で置く。"
296
+ }
297
+ }
298
+ },
287
299
  "visibleIf": {
288
300
  "type": "string",
289
301
  "description": "その箱を出すかどうかの条件。 状態を差し込める文字列で、\"0\" / \"false\" / 空文字が偽、それ以外は真。"
@@ -523,6 +535,10 @@
523
535
  "type": "string",
524
536
  "description": "ラベル下の補足"
525
537
  },
538
+ "tailSub": {
539
+ "type": "string",
540
+ "description": "クラス図の出どころ側の多重度 (例 \"1\")。 sub が行き先の端の多重度。 クラス図でだけ効く"
541
+ },
526
542
  "tone": {
527
543
  "type": "string",
528
544
  "enum": [
@@ -556,7 +572,7 @@
556
572
  },
557
573
  "cardinality": {
558
574
  "type": "string",
559
- "description": "ER の多重度 (1..N 等、 kind: er 用)"
575
+ "description": "ER の多重度 (type: er 用)。 1:1 / 1:N / N:1 / N:M / 0..1 / 1..* のどれかを書くと、 両端の形がその語から決まり (tailHead / head を書けばそちらが勝つ)、 語は説明文の下の行に出る。 説明文に書いた同じ語は説明文から外す。 6 語以外を書くと説明文に (語) と添えるだけで、 端の形は決まらない (tailHead と head を両方書かなければ、 描かない端を知らせる)。 type: er 以外の図種では描かず、 そのことを知らせる"
560
576
  },
561
577
  "side": {
562
578
  "type": "string",
@@ -581,7 +597,7 @@
581
597
  "many",
582
598
  "zero-many"
583
599
  ],
584
- "description": "着き先側の端の形。 端の形で関係の種類を示す = triangle (継ぐ) / diamond (持つ) / open (使う) / crow (多) / one / zero-one / many / zero-many (個数)。 書かなければ塗った三角になる。"
600
+ "description": "着き先側の端の形。 端の形で関係の種類を示す = triangle (継承・実装) / diamond (集約・コンポジション) / open (関連・依存) / crow (多) / one / zero-one / many / zero-many (個数)。 書かなければ塗った三角になる。"
585
601
  },
586
602
  "tailHead": {
587
603
  "type": "string",
@@ -658,6 +674,18 @@
658
674
  "type": "boolean",
659
675
  "description": "true で説明文を矢印の線の上に重ねる (分岐図の条件ラベル用)"
660
676
  },
677
+ "fromPartNode": {
678
+ "type": "string",
679
+ "minLength": 1,
680
+ "pattern": "\\S",
681
+ "description": "from が部品の時、矢印を繋ぐ部品の中の要素の id。 要素を 1 つだけ持つ部品は書かなくてもその要素に繋ぐ。 要素を 2 つ以上持つ部品は書かないと矢印を外して知らせる"
682
+ },
683
+ "toPartNode": {
684
+ "type": "string",
685
+ "minLength": 1,
686
+ "pattern": "\\S",
687
+ "description": "to が部品の時、矢印を繋ぐ部品の中の要素の id。 要素を 1 つだけ持つ部品は書かなくてもその要素に繋ぐ。 要素を 2 つ以上持つ部品は書かないと矢印を外して知らせる"
688
+ },
661
689
  "pos": {
662
690
  "type": "object",
663
691
  "additionalProperties": false,
@@ -780,9 +808,13 @@
780
808
  "tree",
781
809
  "gantt",
782
810
  "funnel",
783
- "slope"
811
+ "slope",
812
+ "gauge",
813
+ "radial",
814
+ "stacked",
815
+ "waffle"
784
816
  ],
785
- "description": "この phase で起点から描くもの。 語は図種と揃える。 line / journey = 線が左端から右へ伸びる / bar = 棒が横軸から上へ伸びる / pie = 扇が 12 時から時計回りに開く / mind = 枝が中心から外へ伸びる / tree = 枝が根から下へ伸びる / gantt = 帯が各始端から右へ伸びる / funnel = 段が上端から順に積まれる / slope = 線が左の軸から右の軸へ伸びる"
817
+ "description": "この phase で起点から描くもの。 語は図種と揃える。 line / journey = 線が左端から右へ伸びる / bar = 棒が横軸から上へ伸びる / pie = 扇が 12 時から時計回りに開く / mind = 枝が中心から外へ伸びる / tree = 枝が根から下へ伸びる / gantt = 帯が各始端から右へ伸びる / funnel = 段が上端から順に積まれる / slope = 線が左の軸から右の軸へ伸びる / gauge = 弧が 9 時から上を通って 3 時へ伸びる / radial = 各輪が 12 時から時計回りに開く / stacked = 帯が左端から右へ伸びる / waffle = 印が左上から読む向きに 1 個ずつ埋まる"
786
818
  },
787
819
  "drawRatio": {
788
820
  "type": "number",
@@ -2017,10 +2049,43 @@
2017
2049
  "min": {
2018
2050
  "type": "number"
2019
2051
  },
2052
+ "offLabel": {
2053
+ "type": "string",
2054
+ "minLength": 1,
2055
+ "description": "切り替え (toggle) が切の時に、箱の字の差し込みへ描く名前。 省略すると false を描く。"
2056
+ },
2057
+ "onLabel": {
2058
+ "type": "string",
2059
+ "minLength": 1,
2060
+ "description": "切り替え (toggle) が入の時に、箱の字の差し込みへ描く名前。 省略すると true を描く。"
2061
+ },
2020
2062
  "options": {
2021
2063
  "type": "array",
2064
+ "description": "選択肢。 文字列は値と名前を兼ね、{ value, label } の組は value を値にして label を操作部の選択肢と箱の字の差し込みに描く。 2 つを混ぜて書ける。",
2022
2065
  "items": {
2023
- "type": "string"
2066
+ "oneOf": [
2067
+ {
2068
+ "type": "string"
2069
+ },
2070
+ {
2071
+ "type": "object",
2072
+ "additionalProperties": false,
2073
+ "required": [
2074
+ "value",
2075
+ "label"
2076
+ ],
2077
+ "properties": {
2078
+ "value": {
2079
+ "type": "string",
2080
+ "minLength": 1
2081
+ },
2082
+ "label": {
2083
+ "type": "string",
2084
+ "minLength": 1
2085
+ }
2086
+ }
2087
+ }
2088
+ ]
2024
2089
  }
2025
2090
  },
2026
2091
  "placeholder": {
@@ -2194,11 +2259,34 @@
2194
2259
  },
2195
2260
  "formulas": {
2196
2261
  "type": "object",
2197
- "description": "つまみの値から決まる値。 名前を鍵、式を値に書く。 `values` とは経路が別で、式は名前を中括弧で囲わない (例 \"input * 2\")。",
2262
+ "description": "つまみの値から決まる値。 名前を鍵、式を値に書く。 `values` とは経路が別で、式は名前を中括弧で囲わない (例 \"input * 2\")。 操作部に出す名札を付ける時は { \"expression\": \"input * 2\", \"label\": \"2 倍\" } の組で書く。",
2198
2263
  "additionalProperties": {
2199
- "type": "string",
2200
- "minLength": 1,
2201
- "pattern": "\\S"
2264
+ "oneOf": [
2265
+ {
2266
+ "type": "string",
2267
+ "minLength": 1,
2268
+ "pattern": "\\S"
2269
+ },
2270
+ {
2271
+ "type": "object",
2272
+ "additionalProperties": false,
2273
+ "required": ["expression"],
2274
+ "properties": {
2275
+ "expression": {
2276
+ "type": "string",
2277
+ "minLength": 1,
2278
+ "pattern": "\\S",
2279
+ "description": "式 (例 \"input * 2\")"
2280
+ },
2281
+ "label": {
2282
+ "type": "string",
2283
+ "minLength": 1,
2284
+ "pattern": "\\S",
2285
+ "description": "操作部に式の名前として出す名札。 書かなければ名前をそのまま出す"
2286
+ }
2287
+ }
2288
+ }
2289
+ ]
2202
2290
  },
2203
2291
  "propertyNames": {
2204
2292
  "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
@@ -2228,6 +2316,14 @@
2228
2316
  ],
2229
2317
  "description": "矢印をいつ出すか。 phase (既定) = 段が名指しする矢印はその段が来るまで描かない。 all = 段に関わらず最初から全部描く。"
2230
2318
  },
2319
+ "relations": {
2320
+ "type": "string",
2321
+ "enum": [
2322
+ "off",
2323
+ "hover"
2324
+ ],
2325
+ "description": "箱に触れると関係する線だけを光らせるか。 off (既定) = 何もしない。 hover = 箱に触れた時にその箱と繋がる線と相手の箱だけが光り、他が沈む。 順番を持たないクラス図と ER 図で使う。"
2326
+ },
2231
2327
  "bands": {
2232
2328
  "type": "array",
2233
2329
  "description": "順序図で面が動いている間の帯。 書かなければ面ごとに「最初に関わった段から最後まで」 の 1 本になる。",
@@ -2259,7 +2355,7 @@
2259
2355
  },
2260
2356
  "events": {
2261
2357
  "type": "array",
2262
- "description": "押下などの出来事で動く仕掛け。 相手は名前で指す (box / lane / arrow / diagram のどれか 1 つ)。",
2358
+ "description": "押下などの出来事で動く仕掛け。 相手は名前で指し、指し方の項目をちょうど 1 つだけ書く。",
2263
2359
  "items": {
2264
2360
  "type": "object",
2265
2361
  "required": [
package/src/types.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  * docs/cdl/text-dsl-spec.md の文法を AST に変換した中間表現
4
4
  */
5
5
 
6
- import type { CdlDiagram, NodeKind, Tone, EdgeStyle, EdgeHead, EdgeHeadFill, EdgeReveal, ClassRelationType, SequenceMessageKind } from "@cardenelabs/cdl";
6
+ import type { CdlDiagram, NodeKind, Tone, EdgeStyle, EdgeHead, EdgeHeadFill, EdgeReveal, RelationFocus, ClassRelationType, SequenceMessageKind } from "@cardenelabs/cdl";
7
7
  import type { DslOnlyKind } from "./v05/parser";
8
8
  import type { DslDirection, DslPalette } from "./keywords";
9
9
 
@@ -91,13 +91,13 @@ export type Position = {
91
91
  };
92
92
 
93
93
  /**
94
- * canvas pivot (CAR-1693 Phase 1) の DSL 表面 `pos: {x, y}` を保持する型。
95
- * auto layout の compute value からの offset (dx, dy) を表す。 element の `layoutPos:` が
96
- * undefined なら auto layout の値をそのまま採用 (catalog 100+ backward compat)、 set 済なら
97
- * Phase 2 の applyPosOffset pass が offset として適用する。
94
+ * 自動で決まった位置からのずらし (dx, dy) (#1971)。
98
95
  *
99
- * naming = DSL 表面 syntax は user 提案 wording (`pos:`) を維持、 内部 AST は既存 `pos: Position`
100
- * (source line/column) との collision 回避のため `layoutPos:` に rename する 2 層設計。
96
+ * JSON は `pos: { x, y }`、記法は `offsetX` / `offsetY` で書く。 内部では、行番号を持つ
97
+ * `pos: Position` と名前が重ならないよう `layoutPos` に入れる。
98
+ *
99
+ * 書かなければ自動の配置のまま。 書くと組み立ての出口 (`applyLayoutOffsets`) が 1 度配置してから
100
+ * 配置後の位置に足して置き直す。 箱と縦列は位置が動き、矢印は名前のずらしに足す。
101
101
  */
102
102
  export type LayoutPos = {
103
103
  x: number;
@@ -168,6 +168,16 @@ export type DslDocument = {
168
168
  * 段に関わらず最初から全部描く。 描き手の `CdlDiagram.edgeReveal` にそのまま渡る。
169
169
  */
170
170
  reveal?: EdgeReveal;
171
+ /**
172
+ * 箱に触れると関係する線だけを光らせるか (`relations:`、 #1757)。
173
+ *
174
+ * 既定 (`off`) は何もしない。 `hover` と書くと、箱に触れた時に その箱 ・ 繋がる線 ・
175
+ * 相手の箱だけが光り、他が沈む。 描き手の `CdlDiagram.relationFocus` にそのまま渡る。
176
+ *
177
+ * クラス図と ER 図は **順番を持たない** 図で、段を追う見せ方は「どの順で読ませるか」 しか
178
+ * 運ばない。 触れた箱の関係を光らせれば、読み手の問いにその場で答えられる。
179
+ */
180
+ relations?: RelationFocus;
171
181
  /**
172
182
  * 図の並ぶ向き (`direction:`、 #1494)。
173
183
  *
@@ -371,6 +381,14 @@ export type DslActor = {
371
381
  * 解析の時点ではパーツの定義を知らないため、 名前を決めずに持っておく。
372
382
  */
373
383
  colorHex?: string;
384
+ /**
385
+ * 部品に `color:` で書いた色の名前 (`成功` 等) (#1973)。
386
+ *
387
+ * 部品の色の状態は色番号しか受けず、色の名前は箱の色 (`tone`) にしか効かない。 部品には
388
+ * 箱の色を渡さないため、書いても絵が変わらない。 黙って捨てると手掛かりが残らないので、
389
+ * 書いた名前を残して組み立て側が知らせる。
390
+ */
391
+ partColorName?: Tone;
374
392
  /**
375
393
  * parts state override (partId set 時のみ有効)。 kind + 既存 reserved fields を除いた
376
394
  * inline option の残り (`v: 50` / `count: 100` 等) を state 名 → initial 値 map として保持。
@@ -410,35 +428,14 @@ export type DslActor = {
410
428
  */
411
429
  posRel?: RelativePos;
412
430
  /**
413
- * canvas pivot UX 修正 (B1 individual node isolation)。 actor 1 件が生成する複数 sub-node
414
- * (sequence の header / spacer / footer / s{N} 等) の中で「特定 sub-node だけを固定 / resize」
415
- * するための nested override map。 key = sub-node id 相当の short key (`header` / `footer` /
416
- * `spacer` / `s0` 等)、 value = posX/Y/W/H の 4 field。 compile 側は対応 CDL node に単独反映、
417
- * 同 actor の他 sub-node は影響を受けない (lane 全体 posX とは独立経路)。
418
- */
419
- nodes?: Record<string, DslActorNodeOverride>;
420
- /**
421
- * canvas pivot (CAR-1693 Phase 1) DSL 表面 `pos: {x, y}` 由来の layout offset。 未指定は auto
422
- * layout の compute value そのまま (backward compat)、 set 済なら Phase 2 の applyPosOffset で
423
- * (auto x + layoutPos.x, auto y + layoutPos.y) に shift される。 既存 posX/posY (絶対座標) は
424
- * 別 mechanism で、 layoutPos は auto layout からの nudge (dx, dy)。
431
+ * 箱の位置のずらし (#1971)。 配置後の箱の中心を (x, y) だけ動かす。 `posX` / `posY` (座標) とは
432
+ * 別の欄で、座標も書いた時は座標で置いた位置からずらす。 見本 (parts) は見本 1 つ分をまとめて動かす。
433
+ * 同じ縦列の箱に近づくと、描画側が間隔を保つようそちらを押し下げる。
425
434
  */
426
435
  layoutPos?: LayoutPos;
427
436
  pos: Position;
428
437
  };
429
438
 
430
- /**
431
- * canvas pivot UX 修正 (B1) = actor 内 sub-node 単位で「絶対座標 / サイズ」 を固定するための
432
- * override 値。 全 field optional、 posX / posY が両方 set 済なら CDL 側で該当 sub-node の
433
- * auto layout を skip、 明示座標をそのまま採用する。 posW / posH は width / height の上書き。
434
- */
435
- export type DslActorNodeOverride = {
436
- posX?: number;
437
- posY?: number;
438
- posW?: number;
439
- posH?: number;
440
- };
441
-
442
439
  /** 流れ (1 行 = 1 step) (v0.5+ ... inline option 拡張) */
443
440
  export type DslStep = {
444
441
  no: number;
@@ -465,8 +462,8 @@ export type DslStep = {
465
462
  /**
466
463
  * 矢印の先の形 (#1462)。 書かなければ従来どおり塗った三角。
467
464
  *
468
- * 4 図の設計は **端の形で関係の種類を示す** = 三角 (継ぐ) / 菱 (持つ) /
469
- * 開いた矢 (使う) / 鳥の足 (多)。 書けないと 4 種とも同じ三角になり、
465
+ * 4 図の設計は **端の形で関係の種類を示す** = 三角 (継承・実装) / 菱 (集約・コンポジション) /
466
+ * 開いた矢 (関連・依存) / 鳥の足 (多)。 書けないと 4 種とも同じ三角になり、
470
467
  * 線の種類 (実線 / 点線) だけで 6 種の関係を区別することになる。
471
468
  *
472
469
  * 受ける語は描画側の `EDGE_HEADS` から導く = 描画側が増やせば書けるようになる。
@@ -474,10 +471,16 @@ export type DslStep = {
474
471
  head?: EdgeHead;
475
472
  /** 出どころ側の端の形 (#1466)。 ER は端ごとに違う個数を示すので両端に要る */
476
473
  tailHead?: EdgeHead;
477
- /** 端の印の塗り (#1466)。 白抜きの菱が「持つ」、塗った菱が「抱える」 */
474
+ /** 端の印の塗り (#1466)。 白抜きの菱が集約、塗った菱がコンポジション */
478
475
  headFill?: EdgeHeadFill;
479
476
  /** 出どころ側の印の塗り (#1466) */
480
477
  tailHeadFill?: EdgeHeadFill;
478
+ /**
479
+ * クラス図の出どころ側の多重度 (#1771)。 `sub` (行き先の端の多重度) と対。
480
+ *
481
+ * クラス図でだけ効く (関係の語 `relation` と同じ)。 engine が出どころの端の近くに添える。
482
+ */
483
+ tailSub?: string;
481
484
  /**
482
485
  * クラス図の関係の種類 (#1466)。 書くと線と端の形と塗りと付く側がまとめて決まる。
483
486
  *
@@ -500,10 +503,19 @@ export type DslStep = {
500
503
  /** true で説明文を矢印の線の上に重ねる。 分岐図の条件ラベル用。 */
501
504
  overlay?: boolean;
502
505
  /**
503
- * canvas pivot (CAR-1693 Phase 1) DSL 表面 `pos: {x, y}` 由来の layout offset。 step の edge
504
- * label 位置を auto layout compute から (dx, dy) shift する。 未指定は auto、 set 済は Phase 2 で適用。
506
+ * 矢印の位置のずらし (#1971)。 矢印の通り道は両端の箱で決まるので、名前のずらし
507
+ * (`labelOffsetX` / `labelOffsetY`) に足して名前だけを動かす。
505
508
  */
506
509
  layoutPos?: LayoutPos;
510
+ /**
511
+ * 部品 (parts) の端で、矢印を繋ぐ部品の中の要素の id (#1979)。 出どころ側が `fromPartNode`、
512
+ * 行き先側が `toPartNode`。
513
+ *
514
+ * 要素を 1 つだけ持つ部品は書かなくてもその要素に繋ぐ。 要素を 2 つ以上持つ部品は外枠を持たず
515
+ * 同格の要素が並ぶため、1 つを自動で選ぶと「その要素だけ」 を指す矢印に見える。 書き手が名指しする。
516
+ */
517
+ fromPartNode?: string;
518
+ toPartNode?: string;
507
519
  pos: Position;
508
520
  };
509
521
 
@@ -516,18 +528,25 @@ export type DslLane = {
516
528
  contain?: boolean;
517
529
  lifeline?: boolean;
518
530
  /**
519
- * canvas pivot (CAR-1693 Phase 1) DSL 表面 `pos: {x, y}` 由来の layout offset。 lane の x 座標を
520
- * auto layout compute から (dx, dy) shift する。 未指定は auto、 set 済は Phase 2 で適用。
531
+ * 縦列の位置のずらし (#1971)。 配置後の縦列の左上を (x, y) だけ動かし、中の箱も一緒に動く。
532
+ * 1 本でもずらすと全ての縦列を配置後の位置と大きさで固定し、動いた箱を元の位置に留めるので、
533
+ * 他の縦列とその箱は動かない。
521
534
  */
522
535
  layoutPos?: LayoutPos;
523
536
  pos: Position;
524
537
  };
525
538
 
526
- /** group 宣言 (v0.5+ top-level groups section、 topology preset 専用) */
539
+ /**
540
+ * 組の宣言 (v0.5+ top-level groups section)。
541
+ *
542
+ * `lanes` に並べた縦列とその中の箱を、 縦列の位置が決まった後に 1 つの枠 (`group-{id}`) で囲む (#1972)。
543
+ * 図に無い縦列は除いて囲み、 1 本も無ければ枠を描かない。 間に束ねない縦列を挟むと、 その縦列ごと囲む。
544
+ * どちらも知らせで伝える。
545
+ */
527
546
  export type DslGroup = {
528
547
  id: string;
529
548
  label?: string;
530
- lanes: string[]; // 内包する lane id
549
+ lanes: string[]; // 囲む縦列の id
531
550
  pos: Position;
532
551
  };
533
552
 
@@ -618,10 +637,10 @@ export type DslValue = {
618
637
  }
619
638
  );
620
639
 
621
- /** ステップ (phase) */
622
640
  /** 動いている間の帯 (#1466)。 順序図で、面がいつ動いているかを段の番号で持つ */
623
641
  export type DslBand = { actor: string; from: number; to: number };
624
642
 
643
+ /** ステップ (phase) */
625
644
  export type DslPhase = {
626
645
  name: string;
627
646
  durationMs: number;
@@ -25,7 +25,7 @@ export const つまみの表: Record<string, 図形の定義> = {
25
25
  dropdown: {
26
26
  必須: ["options", "defaultValue"],
27
27
  欄: {
28
- options: "文字列の並び",
28
+ options: "選択肢の並び",
29
29
  defaultValue: "文字列",
30
30
  label: "文字列",
31
31
  },
@@ -33,7 +33,7 @@ export const つまみの表: Record<string, 図形の定義> = {
33
33
  "multi-select": {
34
34
  必須: ["options", "defaultValues"],
35
35
  欄: {
36
- options: "文字列の並び",
36
+ options: "選択肢の並び",
37
37
  defaultValues: "文字列の並び",
38
38
  label: "文字列",
39
39
  },
@@ -50,7 +50,7 @@ export const つまみの表: Record<string, 図形の定義> = {
50
50
  radio: {
51
51
  必須: ["options", "defaultValue"],
52
52
  欄: {
53
- options: "文字列の並び",
53
+ options: "選択肢の並び",
54
54
  defaultValue: "文字列",
55
55
  label: "文字列",
56
56
  },
@@ -89,7 +89,7 @@ export const つまみの表: Record<string, 図形の定義> = {
89
89
  tabs: {
90
90
  必須: ["options", "defaultValue"],
91
91
  欄: {
92
- options: "文字列の並び",
92
+ options: "選択肢の並び",
93
93
  defaultValue: "文字列",
94
94
  label: "文字列",
95
95
  },
@@ -119,6 +119,8 @@ export const つまみの表: Record<string, 図形の定義> = {
119
119
  欄: {
120
120
  defaultValue: "真偽",
121
121
  label: "文字列",
122
+ onLabel: "文字列",
123
+ offLabel: "文字列",
122
124
  },
123
125
  },
124
126
  xypad: {
@@ -13,9 +13,20 @@
13
13
  *
14
14
  * `数の並び` は #1389 で足した。 描画側のつまみに `readonly number[]` の欄が 1 つあり
15
15
  * (`timeline` の再生速度の候補)、`文字列の並び` として読むと数が文字列のまま図に載る。
16
+ *
17
+ * `選択肢の並び` は #1920 で足した。 選択肢を持つ入力欄の `options` で、要素は文字列か
18
+ * `{ value, label }` の組 (描画側の `CdlInputOption`)。 `文字列の並び` として読むと組を `,` で割る。
16
19
  */
17
20
  export type 欄の形 =
18
- "数" | "文字列" | "数か文字列" | "文字列の並び" | "数の並び" | "向き" | "組の並び" | "真偽";
21
+ | "数"
22
+ | "文字列"
23
+ | "数か文字列"
24
+ | "文字列の並び"
25
+ | "数の並び"
26
+ | "向き"
27
+ | "組の並び"
28
+ | "真偽"
29
+ | "選択肢の並び";
19
30
 
20
31
  /** 1 つの種類が受ける、必須の欄と全欄の形 */
21
32
  export type 図形の定義 = { 必須: readonly string[]; 欄: Record<string, 欄の形> };