@cardenelabs/dragon 0.30.0 → 0.32.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 (55) hide show
  1. package/README.md +314 -12
  2. package/dist/index.cjs +6966 -1438
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.cts +2150 -118
  5. package/dist/index.d.ts +2150 -118
  6. package/dist/index.js +6950 -1440
  7. package/dist/index.js.map +1 -1
  8. package/package.json +12 -13
  9. package/src/compile/actor-ids.ts +6 -15
  10. package/src/compile/actor-option-notice.ts +379 -0
  11. package/src/compile/actors.ts +32 -3
  12. package/src/compile/c4.ts +0 -3
  13. package/src/compile/chain.ts +43 -4
  14. package/src/compile/chart-fields.ts +16 -1
  15. package/src/compile/direction.ts +50 -11
  16. package/src/compile/edge-option-notice.ts +112 -0
  17. package/src/compile/flowchart.ts +344 -0
  18. package/src/compile/funnel.ts +14 -2
  19. package/src/compile/gantt.ts +141 -36
  20. package/src/compile/generic.ts +473 -61
  21. package/src/compile/journey.ts +14 -5
  22. package/src/compile/kinds.ts +5 -13
  23. package/src/compile/lanes.ts +95 -13
  24. package/src/compile/metro.ts +271 -0
  25. package/src/compile/mind.ts +55 -5
  26. package/src/compile/notice.ts +51 -4
  27. package/src/compile/order.ts +62 -0
  28. package/src/compile/parts.ts +107 -33
  29. package/src/compile/placement-apply.ts +27 -11
  30. package/src/compile/quadrant.ts +171 -16
  31. package/src/compile/record.ts +75 -0
  32. package/src/compile/row-marks.ts +128 -0
  33. package/src/compile/sequence.ts +105 -26
  34. package/src/compile/slug.ts +9 -1
  35. package/src/compile/stages.ts +247 -0
  36. package/src/compile/subtitle.ts +15 -2
  37. package/src/compile/swimlane-marks.ts +87 -0
  38. package/src/compile/swimlane.ts +13 -14
  39. package/src/compile/timeline.ts +213 -0
  40. package/src/compile/topology.ts +3 -9
  41. package/src/compile/tree.ts +13 -4
  42. package/src/compile/value-chart.ts +179 -25
  43. package/src/compile.ts +1550 -370
  44. package/src/focus.ts +2 -2
  45. package/src/index.ts +34 -2
  46. package/src/json-parser.ts +1407 -48
  47. package/src/keywords.ts +251 -17
  48. package/src/notation-lint.ts +41 -64
  49. package/src/schemas/diagram.json +643 -20
  50. package/src/types.ts +336 -35
  51. package/src/v05/parser.ts +2451 -271
  52. package/src/compile/class.ts +0 -100
  53. package/src/compile/er.ts +0 -44
  54. package/src/compile/solidity.ts +0 -39
  55. package/src/compile/state.ts +0 -71
package/src/types.ts CHANGED
@@ -3,9 +3,9 @@
3
3
  * docs/cdl/text-dsl-spec.md の文法を AST に変換した中間表現
4
4
  */
5
5
 
6
- import type { CdlDiagram, NodeKind, Tone, EdgeStyle, EdgeHead, EdgeHeadFill, EdgeReveal, RelationFocus, ClassRelationType, SequenceMessageKind } from "@cardenelabs/cdl";
6
+ import type { CdlDiagram, CdlLegendItem, NodeKind, Tone, EdgeStyle, EdgeHead, EdgeHeadFill, EdgeReveal, RelationFocus, ClassRelationType, SequenceMessageKind, RowWell } from "@cardenelabs/cdl";
7
7
  import type { DslOnlyKind } from "./v05/parser";
8
- import type { DslDirection, DslPalette } from "./keywords";
8
+ import type { DslDiagramShape, DslDirection, DslOrder, DslTheme } from "./keywords";
9
9
 
10
10
  /**
11
11
  * 記法が書ける箱の種類 (#1420)。
@@ -26,8 +26,14 @@ import type { RelativePos } from "./relative-pos";
26
26
  */
27
27
  export type DslDynShape = NonNullable<CdlDiagram["nodes"][number]["shape"]>;
28
28
 
29
- /** 値を見せる部品 (#1374)。 図形と同じ理由で描画側の型をそのまま使う */
30
- export type DslReadout = NonNullable<CdlDiagram["readouts"]>[number];
29
+ /**
30
+ * 値を見せる部品 (#1374)。 図形と同じ理由で描画側の型をそのまま使う。
31
+ *
32
+ * `pos` は書いた行 (#2405)。 読む元の名前を突き合わせた知らせが、直す行を指すのに使う。
33
+ * **図へ載せる時に外す** (`compile.ts` の読み取り値を載せる所) = 残すと、行を足しただけで
34
+ * 組み上がる図が変わる。 JSON から読んだ文書は行を持たないため `undefined` になる。
35
+ */
36
+ export type DslReadout = NonNullable<CdlDiagram["readouts"]>[number] & { pos?: Position };
31
37
 
32
38
  /** 読む人が動かすつまみ (#1389)。 部品と同じ理由で描画側の型をそのまま使う */
33
39
  export type DslInput = NonNullable<CdlDiagram["inputs"]>[number];
@@ -62,22 +68,30 @@ export type DslEventBinding = {
62
68
  export type PresetType =
63
69
  | "sequence"
64
70
  | "flow"
71
+ | "flowchart"
65
72
  | "swimlane"
66
- | "er"
67
- | "state"
73
+ /**
74
+ * 箱が行を持ち、箱どうしが関係を持つ図 (#2782)。
75
+ *
76
+ * 畳む前は `er` / `state` / `class` の 3 つに分かれていたが、描画側へ渡す形は同じだった。
77
+ * 箱はいずれも `storage`、行頭の印はいずれも 形 (四角 / 山形) × 塗り (塗る / 中空) の
78
+ * 2 軸で、違うのはその軸を何と呼ぶかだけだった (`pk` / `fk` / `opt` と
79
+ * `entry` / `exit` / `do` / `internal`)。
80
+ *
81
+ * dragon の語は 3 つ (`鍵` / `外` / `条件`) で、印の 3 軸と 1 対 1 に対応する。
82
+ * 古い語は読み取りの入口でこの 3 語へ読み替える (`compile/row-marks.ts` の `行頭の語の別名`)。
83
+ */
84
+ | "record"
68
85
  | "topology"
69
- | "solidity"
70
86
  | "gantt"
71
- | "class"
72
- | "pie"
73
- | "bar"
74
- | "line"
75
- | "gauge"
76
- | "radial"
77
- | "stat"
78
- | "waffle"
79
- | "stacked"
80
- | "slope"
87
+ /**
88
+ * 数を描く図 (#2657)。 形は `shape:` が決める。
89
+ *
90
+ * 畳む前は形ごとに 9 つの型 (`pie` / `bar` / …) を持っていたが、書き方も組み立ても
91
+ * 同じで、渡す文字列 2 つしか違わなかった。 古い綴りは読み替えの入口で この型と
92
+ * 形の語の組に読み替える。
93
+ */
94
+ | "chart"
81
95
  | "funnel"
82
96
  | "tree"
83
97
  | "journey"
@@ -115,6 +129,159 @@ export type LayoutMode = "auto" | "manual";
115
129
  export type DslDocument = {
116
130
  title: string;
117
131
  type: PresetType;
132
+ /** 円グラフの見せ方。 読めない語も組み立ての知らせにするため、入口では文字列で保持する。 */
133
+ form?: string;
134
+ /** `form` を書いた行。 */
135
+ formPos?: Position;
136
+ /** ガントチャートの目盛り。 書かなければ工程の始まりから作る従来の規則を使う。 */
137
+ ticks?: string[];
138
+ /** `ticks` を書いた行。 */
139
+ ticksPos?: Position;
140
+ /** ガントチャートの今日の線の位置と札。 */
141
+ ganttToday?: { index: number; label: string };
142
+ /** 工程の端とは独立して描く目盛り名。 */
143
+ ganttTickLabels?: string[];
144
+ /** 帯の終わりを位置として扱う。 */
145
+ ganttBarEnd?: "position";
146
+ /** 行の字に対して見本の比で細くする。 */
147
+ ganttBarThickness?: "thin";
148
+ /** 図表の系列色で `muted` の項目を数えない。 */
149
+ chartSeriesSkipMuted?: NonNullable<CdlDiagram["nodes"][number]["chartSeriesSkipMuted"]>;
150
+ /** 折れ線の複数系列。 */
151
+ chartLineSeries?: NonNullable<CdlDiagram["nodes"][number]["chartLineSeries"]>;
152
+ /** 円の中心で合計の下に置く字。 */
153
+ chartPieCenterLabel?: NonNullable<CdlDiagram["nodes"][number]["chartPieCenterLabel"]>;
154
+ /** 円の表に置く列。 */
155
+ chartPieTableColumns?: NonNullable<CdlDiagram["nodes"][number]["chartPieTableColumns"]>;
156
+ /** 円の輪の太さ。 */
157
+ chartPieRingWidth?: NonNullable<CdlDiagram["nodes"][number]["chartPieRingWidth"]>;
158
+ /** 傾き図の左右の時点名。 */
159
+ chartSlopePeriods?: NonNullable<CdlDiagram["nodes"][number]["chartSlopePeriods"]>;
160
+ /** 傾き図で主役にする項目の id。 */
161
+ chartSlopeEmphasisIds?: NonNullable<CdlDiagram["nodes"][number]["chartSlopeEmphasisIds"]>;
162
+ /** 傾き図の値に付ける単位。 */
163
+ chartSlopeUnit?: NonNullable<CdlDiagram["nodes"][number]["chartSlopeUnit"]>;
164
+ /** 内訳の帯の期間。 */
165
+ chartStackedPeriods?: NonNullable<CdlDiagram["nodes"][number]["chartStackedPeriods"]>;
166
+ /** 内訳の帯の右に率を描く項目の id。 */
167
+ chartStackedRateId?: NonNullable<CdlDiagram["nodes"][number]["chartStackedRateId"]>;
168
+ /** 内訳の帯の凡例の位置。 */
169
+ chartStackedLegendPosition?: NonNullable<
170
+ CdlDiagram["nodes"][number]["chartStackedLegendPosition"]
171
+ >;
172
+ /** 半円を固定の尺で読む値。 */
173
+ chartGaugeValue?: NonNullable<CdlDiagram["nodes"][number]["chartGaugeValue"]>;
174
+ /** 升目の一覧を置く側。 */
175
+ chartWaffleLegendPosition?: NonNullable<
176
+ CdlDiagram["nodes"][number]["chartWaffleLegendPosition"]
177
+ >;
178
+ /** 漏斗の形。 */
179
+ funnelForm?: NonNullable<CdlDiagram["nodes"][number]["funnelForm"]>;
180
+ /** 漏斗に描く率。 */
181
+ funnelRate?: NonNullable<CdlDiagram["nodes"][number]["funnelRate"]>;
182
+ /** 座標で置いた四象限の点の名前を置く側。 */
183
+ quadrantPointLabelSide?: NonNullable<
184
+ CdlDiagram["nodes"][number]["quadrantPointLabelSide"]
185
+ >;
186
+ /** 木の箱を根まで同じ枠で描くか。 */
187
+ treeNodeForm?: NonNullable<CdlDiagram["nodes"][number]["treeNodeForm"]>;
188
+ /** 木の札・字・枝間の寸法。 */
189
+ treeSize?: NonNullable<CdlDiagram["nodes"][number]["treeSize"]>;
190
+ /** 木の枝色を 1 色にするか、段ごとに分けるか。 */
191
+ treeEdgeTone?: NonNullable<CdlDiagram["nodes"][number]["treeEdgeTone"]>;
192
+ /** 木の枝先の印。 */
193
+ treeEdgeHead?: NonNullable<CdlDiagram["nodes"][number]["treeEdgeHead"]>;
194
+ /** 放射の中心・枝・葉を、面か輪郭のどちらで描くか。 */
195
+ mindForm?: NonNullable<CdlDiagram["nodes"][number]["mindForm"]>;
196
+ /** 放射の札・字・枝間の寸法。 */
197
+ mindSize?: NonNullable<CdlDiagram["nodes"][number]["mindSize"]>;
198
+ /** ジャーニーの段を帯か罫で描くか。 */
199
+ journeyForm?: NonNullable<CdlDiagram["nodes"][number]["journeyForm"]>;
200
+ /** ジャーニーの点を曲線か直線で結ぶか。 */
201
+ journeyLineForm?: NonNullable<CdlDiagram["nodes"][number]["journeyLineForm"]>;
202
+ /** ジャーニーの 5 段に描く名前。 */
203
+ journeyLabels?: NonNullable<CdlDiagram["nodes"][number]["journeyLabels"]>;
204
+ /** ジャーニーの描画面と点列の左右余白。 */
205
+ journeySize?: NonNullable<CdlDiagram["nodes"][number]["journeySize"]>;
206
+ /** 図表の見出し帯と足。 */
207
+ figureCard?: NonNullable<CdlDiagram["nodes"][number]["figureCard"]>;
208
+ /** 端末意匠用の窓操作・字送り・行番号。 */
209
+ terminalDecoration?: NonNullable<CdlDiagram["nodes"][number]["terminalDecoration"]>;
210
+ /** 矩形札の一様角と手描き角を意匠で選ぶ。 */
211
+ cornerForm?: NonNullable<CdlDiagram["nodes"][number]["cornerForm"]>;
212
+ /** 階層図とマインドマップの種類札。 */
213
+ figureKindLabel?: NonNullable<CdlDiagram["nodes"][number]["figureKindLabel"]>;
214
+ /** 図表札の見出しと足の間に置く飾りの凹み面。 */
215
+ figureInset?: {
216
+ top?: number;
217
+ right?: number;
218
+ bottom?: number;
219
+ left?: number;
220
+ radius?: number;
221
+ };
222
+ /** 棒グラフの見本寸法。 */
223
+ chartBarSize?: NonNullable<CdlDiagram["nodes"][number]["chartBarSize"]>;
224
+ /** 棒グラフの棒を分割するか、上だけ丸めて一体にするか。 */
225
+ chartBarShape?: NonNullable<CdlDiagram["nodes"][number]["chartBarShape"]>;
226
+ /** 折れ線グラフの見本寸法。 */
227
+ chartLineSize?: NonNullable<CdlDiagram["nodes"][number]["chartLineSize"]>;
228
+ /** 円グラフの見本寸法。 */
229
+ chartPieSize?: NonNullable<CdlDiagram["nodes"][number]["chartPieSize"]>;
230
+ /** 升目図の左端と升目の送り。 */
231
+ chartWaffleSize?: NonNullable<CdlDiagram["nodes"][number]["chartWaffleSize"]>;
232
+ /** 傾き図の左右の札の書式。 */
233
+ chartSlopeLabelTemplate?: NonNullable<
234
+ CdlDiagram["nodes"][number]["chartSlopeLabelTemplate"]
235
+ >;
236
+ /** 傾き図の見本寸法。 */
237
+ chartSlopeSize?: NonNullable<CdlDiagram["nodes"][number]["chartSlopeSize"]>;
238
+ /** 内訳の帯の見本配置。 */
239
+ chartStackedLayout?: NonNullable<CdlDiagram["nodes"][number]["chartStackedLayout"]>;
240
+ /** 半円図の見本寸法。 */
241
+ chartGaugeSize?: NonNullable<CdlDiagram["nodes"][number]["chartGaugeSize"]>;
242
+ /** ガント図の見本寸法。 */
243
+ ganttSize?: NonNullable<CdlDiagram["nodes"][number]["ganttSize"]>;
244
+ /** 四象限の区画名を置く位置。 */
245
+ quadrantLabelPosition?: NonNullable<
246
+ CdlDiagram["nodes"][number]["quadrantLabelPosition"]
247
+ >;
248
+ /** 四象限の見本寸法。 */
249
+ quadrantSize?: NonNullable<CdlDiagram["nodes"][number]["quadrantSize"]>;
250
+ /**
251
+ * 図全体を 1 箱にする図種の札の大きさ。
252
+ *
253
+ * `viewport` は図全体の画布なので分ける。`width` / `height` は既存の viewport と lane の
254
+ * 綴りに揃え、描画側だけが使う短い `w` / `h` を記法へ漏らさない。
255
+ */
256
+ figureSize?: { width: number; height: number };
257
+ /** 図の下へ指定順に置く凡例。 */
258
+ legend?: CdlLegendItem[];
259
+ /** 図全体の凡例の位置を既定位置からずらす。 */
260
+ legendOffset?: NonNullable<CdlDiagram["legendOffset"]>;
261
+ /** 線の両端と発着する箱の縁との隙間。 */
262
+ edgeEndGap?: NonNullable<CdlDiagram["edgeEndGap"]>;
263
+ /** 順序図の参加者を枠で囲む。 */
264
+ sequenceActorForm?: "box";
265
+ /** 順序図の段へ種類印と種類名を添える。 */
266
+ sequenceLabelForm?: "kind";
267
+ /** 順序図の返す言づてにも塗った三角の矢じりを使う。 */
268
+ sequenceReturnHead?: "solid";
269
+ /** 順序図の言づての段の間。 */
270
+ sequenceRowGap?: number;
271
+ /** 順序図の左の札の列幅。 */
272
+ sequenceGutter?: number;
273
+ /** 順序図の動いている間の帯幅。 */
274
+ sequenceBandWidth?: number;
275
+ /** 順序図の自分へ戻る線の形と寸法。 */
276
+ sequenceSelfLoop?: { form?: "orthogonal"; width?: number; drop?: number };
277
+ /** 順序図の種類名の表示語。 */
278
+ sequenceKindLabels?: Partial<Record<"call" | "return" | "fire", string>>;
279
+ /** 図の凡例の字の大きさ。 */
280
+ legendFontSize?: number;
281
+ /** 段の箱で全意匠に共通して使う見出しの寸法。 */
282
+ stageHeader?: DslStageHeader;
283
+ /** 段の列幅・列間と戻る線の迂回寸法。 */
284
+ stageLayout?: NonNullable<CdlDiagram["stageLayout"]>;
118
285
  /**
119
286
  * 図全体を 1 箱にする図種 (`pie` / `bar` / `line` / `funnel` / `tree` / `journey` /
120
287
  * `quadrant` / `mind` / `gantt`) で、 その箱の上に出す小見出し (#1247)。
@@ -141,6 +308,14 @@ export type DslDocument = {
141
308
  axes?: DslAxes;
142
309
  /** `axes` を書いた行 (#1251)。 知らせの行番号に使う */
143
310
  axesPos?: Position;
311
+ /**
312
+ * 2 軸で仕分ける図の区画の名前 (#2667)。
313
+ *
314
+ * `axes` が軸の両端の名前を持つのに対し、こちらは区画の中に出す名前を持つ。
315
+ * 軸の掛け合わせ (`効果が大きい × 手間が小さい`) から一段離れた言い方
316
+ * (`すぐやる`) を書くための欄。
317
+ */
318
+ regions?: DslRegions;
144
319
  actors: DslActor[];
145
320
  flow: DslStep[];
146
321
  animate?: DslAnimate;
@@ -174,14 +349,14 @@ export type DslDocument = {
174
349
  * 既定 (`off`) は何もしない。 `hover` と書くと、箱に触れた時に その箱 ・ 繋がる線 ・
175
350
  * 相手の箱だけが光り、他が沈む。 描き手の `CdlDiagram.relationFocus` にそのまま渡る。
176
351
  *
177
- * クラス図と ER 図は **順番を持たない** 図で、段を追う見せ方は「どの順で読ませるか」 しか
352
+ * UML の関係や表の関係を描く record は **順番を持たない** 図で、段を追う見せ方は「どの順で読ませるか」 しか
178
353
  * 運ばない。 触れた箱の関係を光らせれば、読み手の問いにその場で答えられる。
179
354
  */
180
355
  relations?: RelationFocus;
181
356
  /**
182
357
  * 図の並ぶ向き (`direction:`、 #1494)。
183
358
  *
184
- * `縦` は 1 つの縦列に積み、`横` は 1 人ずつ縦列を作る。 効くのは流れ図と泳法図だけで、
359
+ * `縦` は 1 つの縦列に積み、`横` は 1 人ずつ縦列を作る。 効くのはフローと泳法図だけで、
185
360
  * 他の図種は並び方そのものが読み方を担うため書いても効かない (知らせを出す)。
186
361
  *
187
362
  * 全ての箱が縦列を書いた形では、書いた縦列が勝つ (同じく知らせを出す)。
@@ -190,15 +365,32 @@ export type DslDocument = {
190
365
  /** `direction:` を書いた行。 効かない時の知らせで、書いた場所を指すために持つ */
191
366
  directionPos?: { line: number };
192
367
  /**
193
- * 図の配色 (`palette:`、 #1553)。
368
+ * 箱を並べる順 (`order:`、 #2655)。
369
+ *
370
+ * 書かなければ書いた順のまま。 `種類` と書くと箱の種類で並べ替えてから置く。
371
+ * 効くのは順序図だけで、他の図種は並び方そのものが読み方を担うため書いても効かない
372
+ * (知らせを出す)。
373
+ *
374
+ * 並べ替えの鍵しか持たない図種 (`solidity`) を畳んだ先。 読み取りの入口で
375
+ * 順序図 + この語 に読み替えるので、古い名前で書いた記法はそのまま動く。
376
+ */
377
+ order?: DslOrder;
378
+ /** `order:` を書いた行。 効かない時の知らせで、書いた場所を指すために持つ */
379
+ orderPos?: { line: number };
380
+ /** 図種ごとに選ぶ形 (#2657 / #2797)。 書ける語は `DIAGRAM_SHAPES` が決める */
381
+ shape?: DslDiagramShape;
382
+ /** `shape:` を書いた行。 効かない時の知らせで、書いた場所を指すために持つ */
383
+ shapePos?: { line: number };
384
+ /**
385
+ * 図の意匠 (`theme:`、 #1553 / #2790)。
194
386
  *
195
387
  * 名前だけを持つ。 実際の色は消費側 (`cdl-theme.css`) が決めるので、ここには値を書かない。
196
- * ER 図とクラス図は書かなくても `kinari` (生成りに茶) になる。 どちらも箱の作りが同じ
197
- * (行頭の印 + 左に名前 + 右に型) で、名前と型が離れて並ぶため、行を横に追う目印
198
- * (行の縞) が要る。 縞の色は配色からしか来ないので、既定が無いと縞が箱の面と同じ色に
199
- * 落ちて 1 本も出ない。 書き手が `palette:` を書いた時はそちらが勝つ。
388
+ * `palette:` も同じ意匠を書く別名として読む。record の用途は一つに決められないため、
389
+ * UML クラス図の生成り色が要る時も本文で明記する。
200
390
  */
201
- palette?: DslPalette;
391
+ theme?: DslTheme;
392
+ /** `theme:` と別名の `palette:` を両方書いた時の行 (#2790)。 */
393
+ themeAlsoPalettePos?: { themeLine: number; paletteLine: number };
202
394
  groups?: Record<string, DslGroup>;
203
395
  /**
204
396
  * 値を見せる部品 (`readouts:`、 #1374)。 割合の輪や数え上げを図の脇に出す。
@@ -245,10 +437,27 @@ export type DslDocument = {
245
437
 
246
438
  /** 2 軸で仕分ける図の軸の名前 (#1251) */
247
439
  export type DslAxes = {
248
- x?: { left?: string; right?: string };
249
- y?: { bottom?: string; top?: string };
440
+ x?: { left?: string; right?: string; label?: never; direction?: never } | DslAxisDirection;
441
+ y?: { bottom?: string; top?: string; label?: never; direction?: never } | DslAxisDirection;
442
+ };
443
+
444
+ /** 端の名前ではなく、向き付きの軸名を 1 つだけ描く形。 */
445
+ export type DslAxisDirection = { label: string; direction: true };
446
+
447
+ /**
448
+ * 2 軸で仕分ける図の区画の名前 (#2667)。
449
+ *
450
+ * 欄の名前は描画側の区画の綴りに揃える。 記法では `左上` のような語で書き、
451
+ * 解析の時にここへ直す = 区画を指す語を 2 通り持たないため。
452
+ */
453
+ export type DslRegions = {
454
+ topLeft?: string;
455
+ topRight?: string;
456
+ bottomLeft?: string;
457
+ bottomRight?: string;
250
458
  };
251
459
 
460
+
252
461
  /** 登場人物 (v0.5+ ... inline option 拡張) */
253
462
  export type DslActor = {
254
463
  name: string;
@@ -264,6 +473,38 @@ export type DslActor = {
264
473
  kindWritten?: boolean;
265
474
  /** v0.5+ inline option */
266
475
  subtitle?: string;
476
+ /** kind の意味を保ったまま共通の部品箱で描く。 */
477
+ kindForm?: "icon";
478
+ /** 共通の部品箱へ描く線画。 */
479
+ icon?: "person" | "box" | "database" | "lightning" | "cloud" | "terminal";
480
+ /** 行を持たない表の箱で行の代わりに描く注記。 */
481
+ emptyRowsNote?: string;
482
+ /** 表の箱の名前と小見出しを中央へ揃える。 */
483
+ titleAlign?: "center";
484
+ /** 表の箱の行の間に罫線を引く。 */
485
+ rowRules?: boolean;
486
+ /** 表の箱の行へ交互の縞を敷く。 */
487
+ rowStripe?: boolean;
488
+ /** 表の箱の題と行の baseline。 */
489
+ rowLayout?: NonNullable<CdlDiagram["nodes"][number]["rowLayout"]>;
490
+ /** 表の箱の見出し下の線を左右端まで引く。 */
491
+ rowDividerForm?: "full";
492
+ /** 表の箱の行のまとまりを収める透明な面。 */
493
+ rowWell?: RowWell;
494
+ /** 表の箱の行頭の印を色の段で分ける。 */
495
+ rowMarkForm?: "tone";
496
+ /** 表の箱を内側へ抱える親の表の箱の名前。 */
497
+ nestIn?: string;
498
+ /** 表または共通の部品箱の足。 */
499
+ figureCard?: NonNullable<CdlDiagram["nodes"][number]["figureCard"]>;
500
+ /** 路線図の駅名を駅の上下どちらへ置くか。 */
501
+ stationNamePosition?: "bottom";
502
+ /** 時間軸の担当を札のどちらへ置くか。 */
503
+ subtitlePlacement?: "right";
504
+ /** 流れ図の function の札の題の大きさ。 */
505
+ titleFontSize?: number;
506
+ /** 流れ図の始まり・終わりの印と次の箱との間。 */
507
+ markGap?: number;
267
508
  eyebrow?: string;
268
509
  value?: string;
269
510
  /**
@@ -284,7 +525,7 @@ export type DslActor = {
284
525
  * `entry` / `exit` / `do` / `internal`。 印の 2 軸 (形 × 塗り) は共通だが、その軸が
285
526
  * 何を指すかは種類ごとに違う。
286
527
  */
287
- marks?: string[];
528
+ marks?: Array<string | { mark: string; tone?: "primary" | "muted" }>;
288
529
  /**
289
530
  * 箱の中に描く図形 (`shape:`、 #1374)。 水位や角度を状態で動かせる。
290
531
  *
@@ -343,20 +584,43 @@ export type DslActor = {
343
584
  * 他の図種では相手が無いため、書かれていたら組み立て側が知らせる。
344
585
  */
345
586
  end?: string;
587
+ /** 工程の始まりに出す札。節目の位置名とは独立して書ける。 */
588
+ startLabel?: string;
589
+ /** 帯を菱形の節目として描く。 */
590
+ milestone?: boolean;
591
+ /** 工程の帯を主役として描く。 */
592
+ emphasis?: "primary";
593
+ /**
594
+ * 四象限の点を置く座標。 左下が (0, 0)、右上が (1, 1)。
595
+ * 数のほか `{名前}` を受け、描画側の BoundNumber へそのまま渡す。
596
+ */
597
+ at?: { x?: number | string; y?: number | string; raw: string };
598
+ /** `at` を書いた行。 */
599
+ atPos?: Position;
346
600
  /**
347
- * 体験の道筋 (`type: journey`) で、その段階が起きる場所 (#1251)。
601
+ * ユーザージャーニー (`type: journey`) で、その段階が起きる場所 (#1251)。
348
602
  *
349
603
  * 「どこで起きたか」 を段の下に出す。 他の図種では相手が無いため、書かれていたら
350
604
  * 組み立て側が知らせる。
351
605
  */
352
606
  touchpoint?: string;
353
607
  /**
354
- * 体験の道筋 (`type: journey`) で、その段階の改善の余地 (#1251)。
608
+ * ユーザージャーニー (`type: journey`) で、その段階の改善の余地 (#1251)。
355
609
  *
356
610
  * 気持ちが落ちる段に「何を直せるか」 を添える。 他の図種では相手が無いため、
357
611
  * 書かれていたら組み立て側が知らせる。
358
612
  */
359
613
  opportunity?: string;
614
+ /** ジャーニーの改善注記を置く場所。 */
615
+ opportunityPosition?: NonNullable<
616
+ NonNullable<CdlDiagram["nodes"][number]["journeyData"]>[number]["opportunityPosition"]
617
+ >;
618
+ /**
619
+ * 段階ごとの箱 (`type: swimlane` + `shape: stages`) で、この箱を入れる段階 (#2797)。
620
+ *
621
+ * 書かなければ担当 (`lane`)、担当も無ければ箱の名前を段階として使う。
622
+ */
623
+ stage?: string;
360
624
  lane?: string;
361
625
  stack?: number;
362
626
  initial?: boolean;
@@ -459,6 +723,9 @@ export type DslStep = {
459
723
  dashOffsetBind?: string;
460
724
  /** 矢印がどの辺から出るか (#1385)。 書かなければ描画側が自動で選ぶ */
461
725
  side?: "top" | "right" | "bottom" | "left";
726
+ /** 矢印の出どころと行き先で、個別に使う辺。 */
727
+ fromSide?: "top" | "right" | "bottom" | "left";
728
+ toSide?: "top" | "right" | "bottom" | "left";
462
729
  /**
463
730
  * 矢印の先の形 (#1462)。 書かなければ従来どおり塗った三角。
464
731
  *
@@ -476,13 +743,14 @@ export type DslStep = {
476
743
  /** 出どころ側の印の塗り (#1466) */
477
744
  tailHeadFill?: EdgeHeadFill;
478
745
  /**
479
- * クラス図の出どころ側の多重度 (#1771)。 `sub` (行き先の端の多重度) と対。
746
+ * UML の関係を持つ record の出どころ側の多重度 (#1771 / #2783)。
747
+ * `sub` (行き先の端の多重度) と対。
480
748
  *
481
- * クラス図でだけ効く (関係の語 `relation` と同じ)。 engine が出どころの端の近くに添える。
749
+ * `relation` を書いた edge で効き、engine が出どころの端の近くに添える。
482
750
  */
483
751
  tailSub?: string;
484
752
  /**
485
- * クラス図の関係の種類 (#1466)。 書くと線と端の形と塗りと付く側がまとめて決まる。
753
+ * UML の関係の種類 (#1466 / #2783)。record に書くと線と端の形と塗りと付く側がまとめて決まる。
486
754
  *
487
755
  * 4 つを個別に書かせないのは、組合せが 6 通りしか無く、1 つでも書き違えると読み手に
488
756
  * 別の意味で伝わるため (菱を逆に置くと持ち主が入れ替わる)。
@@ -500,6 +768,17 @@ export type DslStep = {
500
768
  labelPlate?: boolean;
501
769
  labelOffsetX?: number;
502
770
  labelOffsetY?: number;
771
+ /** cdl の固定直線経路。4 欄が全て揃った時だけ描画側が採用する。 */
772
+ posX1?: number;
773
+ posY1?: number;
774
+ posX2?: number;
775
+ posY2?: number;
776
+ /** 固定した両端の間を通る直角の折れ線の点。 */
777
+ waypoints?: NonNullable<CdlDiagram["edges"][number]["waypoints"]>;
778
+ /** 線の名札を自動回避するか、作者の位置に固定するか。 */
779
+ labelCollision?: NonNullable<CdlDiagram["edges"][number]["labelCollision"]>;
780
+ /** 線の名札の幅・高さ・字の大きさ。 */
781
+ labelSize?: NonNullable<CdlDiagram["edges"][number]["labelSize"]>;
503
782
  /** true で説明文を矢印の線の上に重ねる。 分岐図の条件ラベル用。 */
504
783
  overlay?: boolean;
505
784
  /**
@@ -525,6 +804,8 @@ export type DslLane = {
525
804
  x?: number;
526
805
  width?: number;
527
806
  label?: string;
807
+ /** 路線図の担当の名札で、名前の下へ出す補足。 */
808
+ subtitle?: string;
528
809
  contain?: boolean;
529
810
  lifeline?: boolean;
530
811
  /**
@@ -536,6 +817,16 @@ export type DslLane = {
536
817
  pos: Position;
537
818
  };
538
819
 
820
+ /** 段の箱の列見出しの寸法。 */
821
+ export type DslStageHeader = {
822
+ leftPad?: number;
823
+ topPad: number;
824
+ numberSize: number;
825
+ gap: number;
826
+ nameSize: number;
827
+ bottomPad: number;
828
+ };
829
+
539
830
  /**
540
831
  * 組の宣言 (v0.5+ top-level groups section)。
541
832
  *
@@ -554,6 +845,8 @@ export type DslGroup = {
554
845
  export type DslViewport = {
555
846
  width?: number;
556
847
  height?: number;
848
+ /** 描画内容だけを画布の中で横へずらす。 */
849
+ contentOffsetX?: number;
557
850
  /**
558
851
  * 図全体の倍率 (default 1)。 箱 / 文字 / 線 / 間隔のすべてが等比で拡大縮小される。
559
852
  *
@@ -637,8 +930,16 @@ export type DslValue = {
637
930
  }
638
931
  );
639
932
 
640
- /** 動いている間の帯 (#1466)。 順序図で、面がいつ動いているかを段の番号で持つ */
641
- export type DslBand = { actor: string; from: number; to: number };
933
+ /**
934
+ * 動いている間の帯 (#1466)。 順序図で、面がいつ動いているかを言づての番号で持つ。
935
+ *
936
+ * `from` / `to` が指すのは **板に載る言づての行** で、0 から数える (#2404 で実測)。
937
+ * 段 (`animation` の `step`) ではない = 数も起点も違う。
938
+ *
939
+ * `pos` は書いた行 (#2404)。 名前と番号を突き合わせた知らせが、直す行を指すのに使う。
940
+ * JSON から読んだ文書は行を持たないため `undefined` になる (矢印の飾りの知らせと同じ扱い)。
941
+ */
942
+ export type DslBand = { actor: string; from: number; to: number; pos?: Position };
642
943
 
643
944
  /** ステップ (phase) */
644
945
  export type DslPhase = {