@cardenelabs/dragon 0.27.0 → 0.28.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/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { NodeKind, Tone, CdlDiagram, EdgeStyle, EdgeHead, EdgeHeadFill, ClassRelationType, SequenceMessageKind, EdgeReveal, LaidDiagram } from '@cardenelabs/cdl';
1
+ import { NodeKind, Tone, CdlDiagram, EdgeStyle, EdgeHead, EdgeHeadFill, ClassRelationType, SequenceMessageKind, EdgeReveal, RelationFocus, LaidDiagram } from '@cardenelabs/cdl';
2
2
  export { CdlDiagram } from '@cardenelabs/cdl';
3
3
 
4
4
  /**
@@ -58,7 +58,7 @@ type V05ParseResult = {
58
58
  * 書くと、項目を足した時に案内か一覧のどちらかが取り残される (実際に `states` / `values` が
59
59
  * 一覧に 1 件も無い状態で放置されていた)。
60
60
  */
61
- declare const TOP_LEVEL_KEYS: readonly ["title", "type", "actors", "flow", "states", "values", "animation", "viewport", "lanes", "groups", "eyebrow", "axes", "readouts", "inputs", "formulas", "events", "scrolls", "bands", "reveal", "direction", "palette"];
61
+ declare const TOP_LEVEL_KEYS: readonly ["title", "type", "actors", "flow", "states", "values", "animation", "viewport", "lanes", "groups", "eyebrow", "axes", "readouts", "inputs", "formulas", "events", "scrolls", "bands", "reveal", "relations", "direction", "palette"];
62
62
  /** 受け付ける図種。 記法一覧はここを見る。 */
63
63
  declare const PRESET_TYPES: ReadonlySet<PresetType>;
64
64
  /**
@@ -121,10 +121,19 @@ declare const PHASE_ITEM_WORDS: readonly ["focus", "badge", "body", "description
121
121
  * | `tree` | `tree` | 根から下へ枝が伸びる |
122
122
  * | `gantt` | `gantt` | 各帯の始端から右へ帯が伸びる |
123
123
  * | `funnel` | `funnel` | 上端から順に段が積まれる |
124
+ * | `slope` | `slope` | 左の軸から右の軸へ線が伸びる |
125
+ * | `gauge` | `gauge` | 9 時から上を通って 3 時へ弧が伸びる |
126
+ * | `radial` | `radial` | 各輪が 12 時から時計回りに開く |
127
+ * | `stacked` | `stacked` | 左端から右へ帯が伸びる |
128
+ * | `waffle` | `waffle` | 左上から読む向きに印が 1 個ずつ埋まる |
124
129
  *
125
130
  * `quadrant` は入れない。 4 つの区画に項目を置く図で **項目に順序が無く**、起点を決められない
126
131
  * (順番を書いた順で決めると、動きが図の意味を持たない)。
127
132
  *
133
+ * `stat` も入れない。 値 1 つを大きく示す図で、描画側が起点から描く動きを持たない
134
+ * (`cdl` の `DRAW_KINDS`)。 `waffle` は 1 個 = 1% の印を読む向きに埋める動きを
135
+ * 持つようになったので入れた (cdl#719)。
136
+ *
128
137
  * いまは語と図種が同じ綴りだが、**同じものとして扱わない**。 語は書き手が書く名前で、
129
138
  * 図種は `type:` が取る値。 片方だけ別名を足したくなった時に、対応が表に残っている形にする。
130
139
  */
@@ -146,6 +155,12 @@ declare const DRAW_WORDS: ReadonlySet<string>;
146
155
  */
147
156
  declare const DIRECTIONS: readonly ["縦", "横"];
148
157
  type DslDirection = (typeof DIRECTIONS)[number];
158
+ /**
159
+ * 向きの別名。 色 (`色` / `color` / `tone`) と同じく日本語と英語の両方で書ける。
160
+ *
161
+ * 正規の語を鍵にも入れておく = 引く側が別名かどうかを気にせず 1 度で解決できる。
162
+ */
163
+ declare const DIRECTION_ALIAS: Record<string, DslDirection>;
149
164
  /**
150
165
  * 図の配色 (`palette:`、 #1553)。
151
166
  *
@@ -306,13 +321,13 @@ type Position = {
306
321
  column?: number;
307
322
  };
308
323
  /**
309
- * canvas pivot (CAR-1693 Phase 1) の DSL 表面 `pos: {x, y}` を保持する型。
310
- * auto layout の compute value からの offset (dx, dy) を表す。 element の `layoutPos:` が
311
- * undefined なら auto layout の値をそのまま採用 (catalog 100+ backward compat)、 set 済なら
312
- * Phase 2 の applyPosOffset pass が offset として適用する。
324
+ * 自動で決まった位置からのずらし (dx, dy) (#1971)。
325
+ *
326
+ * JSON は `pos: { x, y }`、記法は `offsetX` / `offsetY` で書く。 内部では、行番号を持つ
327
+ * `pos: Position` と名前が重ならないよう `layoutPos` に入れる。
313
328
  *
314
- * naming = DSL 表面 syntax は user 提案 wording (`pos:`) を維持、 内部 AST は既存 `pos: Position`
315
- * (source line/column) との collision 回避のため `layoutPos:` に rename する 2 層設計。
329
+ * 書かなければ自動の配置のまま。 書くと組み立ての出口 (`applyLayoutOffsets`) が 1 度配置してから
330
+ * 配置後の位置に足して置き直す。 箱と縦列は位置が動き、矢印は名前のずらしに足す。
316
331
  */
317
332
  type LayoutPos = {
318
333
  x: number;
@@ -381,6 +396,16 @@ type DslDocument = {
381
396
  * 段に関わらず最初から全部描く。 描き手の `CdlDiagram.edgeReveal` にそのまま渡る。
382
397
  */
383
398
  reveal?: EdgeReveal;
399
+ /**
400
+ * 箱に触れると関係する線だけを光らせるか (`relations:`、 #1757)。
401
+ *
402
+ * 既定 (`off`) は何もしない。 `hover` と書くと、箱に触れた時に その箱 ・ 繋がる線 ・
403
+ * 相手の箱だけが光り、他が沈む。 描き手の `CdlDiagram.relationFocus` にそのまま渡る。
404
+ *
405
+ * クラス図と ER 図は **順番を持たない** 図で、段を追う見せ方は「どの順で読ませるか」 しか
406
+ * 運ばない。 触れた箱の関係を光らせれば、読み手の問いにその場で答えられる。
407
+ */
408
+ relations?: RelationFocus;
384
409
  /**
385
410
  * 図の並ぶ向き (`direction:`、 #1494)。
386
411
  *
@@ -590,6 +615,14 @@ type DslActor = {
590
615
  * 解析の時点ではパーツの定義を知らないため、 名前を決めずに持っておく。
591
616
  */
592
617
  colorHex?: string;
618
+ /**
619
+ * 部品に `color:` で書いた色の名前 (`成功` 等) (#1973)。
620
+ *
621
+ * 部品の色の状態は色番号しか受けず、色の名前は箱の色 (`tone`) にしか効かない。 部品には
622
+ * 箱の色を渡さないため、書いても絵が変わらない。 黙って捨てると手掛かりが残らないので、
623
+ * 書いた名前を残して組み立て側が知らせる。
624
+ */
625
+ partColorName?: Tone;
593
626
  /**
594
627
  * parts state override (partId set 時のみ有効)。 kind + 既存 reserved fields を除いた
595
628
  * inline option の残り (`v: 50` / `count: 100` 等) を state 名 → initial 値 map として保持。
@@ -629,33 +662,13 @@ type DslActor = {
629
662
  */
630
663
  posRel?: RelativePos;
631
664
  /**
632
- * canvas pivot UX 修正 (B1 individual node isolation)。 actor 1 件が生成する複数 sub-node
633
- * (sequence の header / spacer / footer / s{N} 等) の中で「特定 sub-node だけを固定 / resize」
634
- * するための nested override map。 key = sub-node id 相当の short key (`header` / `footer` /
635
- * `spacer` / `s0` 等)、 value = posX/Y/W/H の 4 field。 compile 側は対応 CDL node に単独反映、
636
- * 同 actor の他 sub-node は影響を受けない (lane 全体 posX とは独立経路)。
637
- */
638
- nodes?: Record<string, DslActorNodeOverride>;
639
- /**
640
- * canvas pivot (CAR-1693 Phase 1) DSL 表面 `pos: {x, y}` 由来の layout offset。 未指定は auto
641
- * layout の compute value そのまま (backward compat)、 set 済なら Phase 2 の applyPosOffset で
642
- * (auto x + layoutPos.x, auto y + layoutPos.y) に shift される。 既存 posX/posY (絶対座標) は
643
- * 別 mechanism で、 layoutPos は auto layout からの nudge (dx, dy)。
665
+ * 箱の位置のずらし (#1971)。 配置後の箱の中心を (x, y) だけ動かす。 `posX` / `posY` (座標) とは
666
+ * 別の欄で、座標も書いた時は座標で置いた位置からずらす。 見本 (parts) は見本 1 つ分をまとめて動かす。
667
+ * 同じ縦列の箱に近づくと、描画側が間隔を保つようそちらを押し下げる。
644
668
  */
645
669
  layoutPos?: LayoutPos;
646
670
  pos: Position;
647
671
  };
648
- /**
649
- * canvas pivot UX 修正 (B1) = actor 内 sub-node 単位で「絶対座標 / サイズ」 を固定するための
650
- * override 値。 全 field optional、 posX / posY が両方 set 済なら CDL 側で該当 sub-node の
651
- * auto layout を skip、 明示座標をそのまま採用する。 posW / posH は width / height の上書き。
652
- */
653
- type DslActorNodeOverride = {
654
- posX?: number;
655
- posY?: number;
656
- posW?: number;
657
- posH?: number;
658
- };
659
672
  /** 流れ (1 行 = 1 step) (v0.5+ ... inline option 拡張) */
660
673
  type DslStep = {
661
674
  no: number;
@@ -682,8 +695,8 @@ type DslStep = {
682
695
  /**
683
696
  * 矢印の先の形 (#1462)。 書かなければ従来どおり塗った三角。
684
697
  *
685
- * 4 図の設計は **端の形で関係の種類を示す** = 三角 (継ぐ) / 菱 (持つ) /
686
- * 開いた矢 (使う) / 鳥の足 (多)。 書けないと 4 種とも同じ三角になり、
698
+ * 4 図の設計は **端の形で関係の種類を示す** = 三角 (継承・実装) / 菱 (集約・コンポジション) /
699
+ * 開いた矢 (関連・依存) / 鳥の足 (多)。 書けないと 4 種とも同じ三角になり、
687
700
  * 線の種類 (実線 / 点線) だけで 6 種の関係を区別することになる。
688
701
  *
689
702
  * 受ける語は描画側の `EDGE_HEADS` から導く = 描画側が増やせば書けるようになる。
@@ -691,10 +704,16 @@ type DslStep = {
691
704
  head?: EdgeHead;
692
705
  /** 出どころ側の端の形 (#1466)。 ER は端ごとに違う個数を示すので両端に要る */
693
706
  tailHead?: EdgeHead;
694
- /** 端の印の塗り (#1466)。 白抜きの菱が「持つ」、塗った菱が「抱える」 */
707
+ /** 端の印の塗り (#1466)。 白抜きの菱が集約、塗った菱がコンポジション */
695
708
  headFill?: EdgeHeadFill;
696
709
  /** 出どころ側の印の塗り (#1466) */
697
710
  tailHeadFill?: EdgeHeadFill;
711
+ /**
712
+ * クラス図の出どころ側の多重度 (#1771)。 `sub` (行き先の端の多重度) と対。
713
+ *
714
+ * クラス図でだけ効く (関係の語 `relation` と同じ)。 engine が出どころの端の近くに添える。
715
+ */
716
+ tailSub?: string;
698
717
  /**
699
718
  * クラス図の関係の種類 (#1466)。 書くと線と端の形と塗りと付く側がまとめて決まる。
700
719
  *
@@ -717,10 +736,19 @@ type DslStep = {
717
736
  /** true で説明文を矢印の線の上に重ねる。 分岐図の条件ラベル用。 */
718
737
  overlay?: boolean;
719
738
  /**
720
- * canvas pivot (CAR-1693 Phase 1) DSL 表面 `pos: {x, y}` 由来の layout offset。 step の edge
721
- * label 位置を auto layout compute から (dx, dy) shift する。 未指定は auto、 set 済は Phase 2 で適用。
739
+ * 矢印の位置のずらし (#1971)。 矢印の通り道は両端の箱で決まるので、名前のずらし
740
+ * (`labelOffsetX` / `labelOffsetY`) に足して名前だけを動かす。
722
741
  */
723
742
  layoutPos?: LayoutPos;
743
+ /**
744
+ * 部品 (parts) の端で、矢印を繋ぐ部品の中の要素の id (#1979)。 出どころ側が `fromPartNode`、
745
+ * 行き先側が `toPartNode`。
746
+ *
747
+ * 要素を 1 つだけ持つ部品は書かなくてもその要素に繋ぐ。 要素を 2 つ以上持つ部品は外枠を持たず
748
+ * 同格の要素が並ぶため、1 つを自動で選ぶと「その要素だけ」 を指す矢印に見える。 書き手が名指しする。
749
+ */
750
+ fromPartNode?: string;
751
+ toPartNode?: string;
724
752
  pos: Position;
725
753
  };
726
754
  /** lane 宣言 (v0.5+ top-level lanes section) */
@@ -732,13 +760,20 @@ type DslLane = {
732
760
  contain?: boolean;
733
761
  lifeline?: boolean;
734
762
  /**
735
- * canvas pivot (CAR-1693 Phase 1) DSL 表面 `pos: {x, y}` 由来の layout offset。 lane の x 座標を
736
- * auto layout compute から (dx, dy) shift する。 未指定は auto、 set 済は Phase 2 で適用。
763
+ * 縦列の位置のずらし (#1971)。 配置後の縦列の左上を (x, y) だけ動かし、中の箱も一緒に動く。
764
+ * 1 本でもずらすと全ての縦列を配置後の位置と大きさで固定し、動いた箱を元の位置に留めるので、
765
+ * 他の縦列とその箱は動かない。
737
766
  */
738
767
  layoutPos?: LayoutPos;
739
768
  pos: Position;
740
769
  };
741
- /** group 宣言 (v0.5+ top-level groups section、 topology preset 専用) */
770
+ /**
771
+ * 組の宣言 (v0.5+ top-level groups section)。
772
+ *
773
+ * `lanes` に並べた縦列とその中の箱を、 縦列の位置が決まった後に 1 つの枠 (`group-{id}`) で囲む (#1972)。
774
+ * 図に無い縦列は除いて囲み、 1 本も無ければ枠を描かない。 間に束ねない縦列を挟むと、 その縦列ごと囲む。
775
+ * どちらも知らせで伝える。
776
+ */
742
777
  type DslGroup = {
743
778
  id: string;
744
779
  label?: string;
@@ -951,7 +986,7 @@ interface CompileToCdlOpts {
951
986
  }
952
987
  /** 図は出せるが書いた通りにならなかった、 という知らせ。 */
953
988
  type CompileNotice = {
954
- kind: "relative-position-ignored" | "focus-target-missing" | "state-override-rejected" | "external-paint-dropped" | "part-not-drawn" | "direction-not-honored" | "scale-reserved" | "chart-value-unreadable" | "chart-edge-dropped" | "value-shadows-state" | "value-unresolved" | "value-duplicate" | "flow-actor-missing" | "value-trigger-unresolved" | "lane-not-honored" | "lane-declared-empty" | "eyebrow-not-honored" | "flow-endpoint-not-honored" | "draw-not-honored" | "draw-target-mismatch" | "formula-unresolved" | "event-target-missing" | "actor-kind-not-honored" | "sub-node-not-found" | "message-option-not-honored";
989
+ kind: "relative-position-ignored" | "focus-target-missing" | "state-override-rejected" | "external-paint-dropped" | "part-not-drawn" | "direction-not-honored" | "scale-reserved" | "part-color-ignored" | "part-state-missing" | "part-edge-dropped" | "part-node-ignored" | "part-lane-ignored" | "chart-value-unreadable" | "chart-edge-dropped" | "value-shadows-state" | "value-unresolved" | "value-duplicate" | "flow-actor-missing" | "value-trigger-unresolved" | "lane-not-honored" | "lane-declared-empty" | "eyebrow-not-honored" | "flow-endpoint-not-honored" | "draw-not-honored" | "draw-target-mismatch" | "formula-unresolved" | "event-target-missing" | "actor-kind-not-honored" | "message-option-not-honored" | "position-offset-ignored" | "group-lane-missing" | "group-lanes-apart";
955
990
  /** 対象の名前。 光らせる相手なら書かれた指定そのまま */
956
991
  actor: string;
957
992
  /** 書かれていた行 */
@@ -1123,18 +1158,21 @@ declare function partVisualSize(part: CdlDiagram, targetW?: number, targetH?: nu
1123
1158
  h: number;
1124
1159
  };
1125
1160
  /**
1126
- * 既存の図が縦に何段ぶんを占めるかの目安 (#1481)。
1161
+ * 組み立てた図の下端 (#2002)。 箱が 1 つも無ければ `undefined`。
1127
1162
  *
1128
- * **箱の数では数えない**。 数で数えると、図を丸ごと 1 つの箱で描く種別が 1 段に潰れる。
1129
- * 順序図は `#1466` で 1 枚の板になり、高さ 432 の箱 1 つになった = 1 段 (280) と見積もられ、
1130
- * その下に置いたパーツが板に 31px 重なっていた (実測)。
1163
+ * **段数で概算しない**。 かつては箱の数から `箱 1 つ = 1 段 (280)` で見積もっていたが、
1164
+ * `flow` の箱は実際には高さ 68 で 168 おきに並ぶため 1 段あたり 112 ずつ余分に見積もる。
1165
+ * 誤差は箱の数に比例して積み上がり、実測で箱 2 つの図に 496、箱 4 つの図に 720 の空きが
1166
+ * 入っていた (部品どうしの間は 120)。
1131
1167
  *
1132
- * 大きさを自分で持つ箱は、その高さから段数を出す。 持たない箱は今までどおり 1 段と数えるので、
1133
- * 高さを書かない図の並び方は変わらない。
1168
+ * **箱の下端ではなく図枠の下端を返す**。 格子は図枠どうしを `PARTS_GAP` 空けて並べるので、
1169
+ * 既存の図との間も図枠で測らないと、部品どうしの間と既存の図との間が揃わない
1170
+ * (箱で測ると 180、図枠で測ると 240 で、後者が部品どうしの段の間と一致する)。
1171
+ *
1172
+ * **箱が無いことを 0 に潰さない**。 0 を下端として使うと、部品だけを並べた図で部品が
1173
+ * 図の上端へ貼り付く。 呼出側が「箱が無い」 と「下端が 0」 を分けられるように `undefined` を返す。
1134
1174
  */
1135
- declare function partsBaseRows(nodes: ReadonlyArray<{
1136
- h?: number;
1137
- }>): number;
1175
+ declare function partsBaseBottom(laid: LaidDiagram): number | undefined;
1138
1176
  /**
1139
1177
  * 位置を書かなかったパーツを格子に並べた時の、 矩形の中心。
1140
1178
  *
@@ -1145,9 +1183,10 @@ declare function partsBaseRows(nodes: ReadonlyArray<{
1145
1183
  * 隣と重なる (実測 = 400 の次に 200 を置くと 280 重なった)。 段の高さも段内の最大高で揃える。
1146
1184
  * 縦は自分の高さの半分だけ段の上端から下げて、 段内で上端を揃える。
1147
1185
  *
1148
- * @param baseRows 既存の図が占める段数の目安 (`partsBaseRows`)。 図の下から並べ始めるために使う
1186
+ * @param baseBottom 既存の図の下端 (`partsBaseBottom`)。 その下に間を空けて並べ始める。
1187
+ * 箱が 1 つも無い図では `undefined` を渡す
1149
1188
  */
1150
- declare function partsGridCenters(baseRows: number, items: ReadonlyArray<{
1189
+ declare function partsGridCenters(baseBottom: number | undefined, items: ReadonlyArray<{
1151
1190
  id: string;
1152
1191
  w: number;
1153
1192
  h: number;
@@ -1155,26 +1194,40 @@ declare function partsGridCenters(baseRows: number, items: ReadonlyArray<{
1155
1194
  cx: number;
1156
1195
  cy: number;
1157
1196
  }>;
1197
+ /**
1198
+ * 本文に書いた状態の上書きと色番号を、部品の図そのものに当てて返す (#1973)。
1199
+ *
1200
+ * 編集画面の本文欄は、部品を図から抜いて別に重ねて描く。 重ねる側が部品の図をそのまま
1201
+ * 描くと、`state: { lvl: 0.4 }` や `color: "#d9534f"` がカタログの絵にだけ効き、
1202
+ * 編集画面では既定の値で描かれる。 値の決め方は組み立て側と同じ 2 つの関数を通す。
1203
+ *
1204
+ * `phase: false` は組み立て側と同じく部品の段を外す。 段の数は残し、中身 (点灯と値の変化)
1205
+ * だけを空にする = 段を消すと、重ねた部品だけ段の進みが止まらない形になる。
1206
+ *
1207
+ * 色として読めない上書きは組み立て側と同じく捨てる。 知らせは組み立て側が出すため、
1208
+ * ここでは出さない (同じ本文で 2 度出さない)。
1209
+ */
1210
+ declare function 部品に上書きを当てる(part: CdlDiagram, actor: Pick<DslActor, "stateOverride" | "colorHex">): CdlDiagram;
1158
1211
 
1159
1212
  /**
1160
- * Notation lint (author 向け修正システム)。
1213
+ * 記法の検査 (図を書く人向けの修正システム)。
1161
1214
  *
1162
- * cdl / dragon 記法で書かれた CdlDiagram を rule-based に検査し、
1163
- * 「もっと良い書き方」 を suggestion として返す純粋関数。 LLM 不要、 rule のみ。
1215
+ * cdl / dragon の記法で書いた図 (`CdlDiagram`) を決まった規則で検査し、直し方を修正案
1216
+ * (`suggestion`) として返す純粋関数。 言語モデルは使わない。
1164
1217
  *
1165
- * 検知システム (`check:cdl` / `check:dragon` / `check:kind`) は開発陣向けで
1166
- * 「実装バグ」 を検出するが、 本 notation-lint は **author 向け** で
1167
- * 「書き方の癖 / 冗長表現 / 未定義参照 / 空 payload」 等を検出する。
1218
+ * 検知システム (`check:cdl` / `check:dragon` / `check:kind`) は開発者向けで実装の不具合を
1219
+ * 見つける。 こちらは図を書く人向けで、読む人へ伝わらない書き方 (図の説明に入り込んだ実装の
1220
+ * 書き方、無い部品を指す参照、値や項目が空の図表など) を見つける。
1168
1221
  *
1169
1222
  * 使い方:
1170
- * import { lintDiagram } from "@cardenelabs/dragon";
1223
+ * import { lintDiagram, autoFix } from "@cardenelabs/dragon";
1171
1224
  * const report = lintDiagram(diagram);
1172
- * // report.issues[] = LintIssue[]
1173
- * // report.fixed = LintIssue[] のうち自動修正で解消される件
1174
- * // report.autoFix(diagram) = 修正済 CdlDiagram
1225
+ * // report.issues = LintIssue[]
1226
+ * // report.autoFixableCount = 自動修正で実際に解消できる指摘の数
1227
+ * const patched = autoFix(diagram); // 自動修正を当てた新しい図 (元の図は変えない)
1175
1228
  *
1176
- * CLI:
1177
- * pnpm dragon-lint apps/playground-spa/src/topics/catalog/presets.cdl.ts
1229
+ * 道具:
1230
+ * node packages/dragon/scripts/dragon-lint.mjs apps/playground-spa/src/topics/catalog/presets.cdl.ts
1178
1231
  */
1179
1232
 
1180
1233
  type LintSeverity = "warn" | "info";
@@ -1184,9 +1237,12 @@ type LintIssue = {
1184
1237
  severity: LintSeverity;
1185
1238
  /** 該当対象 (node id / edge id / diagram id) */
1186
1239
  target: string;
1187
- /** 人間向けメッセージ */
1240
+ /**
1241
+ * 書き手向けの指摘の文。 書き手が打ち込む識別子と書き手の値は `` ` `` で囲み、 残りは日本語で書く
1242
+ * (画面側の `lint-message-words.test.ts` が全規則の文を判定に通す)
1243
+ */
1188
1244
  message: string;
1189
- /** 修正案 (自動修正可能なら適用後の値、 手動修正必要なら null) */
1245
+ /** 修正案。 自動修正できる指摘は自動修正が書く値そのもの、 できない指摘は直し方の文 */
1190
1246
  suggestion?: string;
1191
1247
  /** autoFix() が本 issue を自動解消できるか */
1192
1248
  autoFixable: boolean;
@@ -1545,8 +1601,14 @@ interface DragonJson {
1545
1601
  * つまみの値から決まる値 (optional、 #1391)。 記法の最上位 `formulas:` と同じ。
1546
1602
  *
1547
1603
  * 形は `{ 名前: "式" }`。 `values:` と経路が別で、式は名前を中括弧で囲わない。
1604
+ *
1605
+ * 名札を付ける時は `{ 名前: { expression: "式", label: "名札" } }` の組で書く (#1916)。
1606
+ * 描画側は名札を操作部の式の名前に描く (cdl#853)。
1548
1607
  */
1549
- formulas?: Record<string, string>;
1608
+ formulas?: Record<string, string | {
1609
+ expression: string;
1610
+ label?: string;
1611
+ }>;
1550
1612
  /**
1551
1613
  * 押下などの出来事で動く仕掛け (optional、 #1393)。 記法の最上位 `events:` と同じ。
1552
1614
  *
@@ -1604,8 +1666,8 @@ interface DragonJson {
1604
1666
  contain?: boolean;
1605
1667
  lifeline?: boolean;
1606
1668
  /**
1607
- * canvas pivot (CAR-1693 Phase 1) DSL 表面 `pos: {x, y}` = auto layout offset。 未指定は
1608
- * backward compat、 set 済は Phase 2 の applyPosOffset で lane 位置を shift する。
1669
+ * 縦列の位置のずらし (#1971)。 配置後の縦列の左上を (x, y) だけ動かす。 記法の `offsetX` / `offsetY`
1670
+ * と同じで、読み方は `DslLane.layoutPos` が持つ。
1609
1671
  */
1610
1672
  pos?: LayoutPos;
1611
1673
  }>;
@@ -1622,6 +1684,8 @@ interface DragonJson {
1622
1684
  }[];
1623
1685
  /** 矢印をいつ出すか (#1470)。 記法の最上位 `reveal:` と同じ */
1624
1686
  reveal?: EdgeReveal;
1687
+ /** 箱に触れると関係する線だけを光らせるか (#1757)。 記法の最上位 `relations:` と同じ */
1688
+ relations?: RelationFocus;
1625
1689
  /** 図の並ぶ向き (#1494)。 記法の最上位 `direction:` と同じ。 JSON は英語の語で書く */
1626
1690
  direction?: "vertical" | "horizontal";
1627
1691
  /**
@@ -1686,8 +1750,8 @@ interface JsonActor {
1686
1750
  initial?: boolean;
1687
1751
  final?: boolean;
1688
1752
  /**
1689
- * canvas pivot (CAR-1693 Phase 1) DSL 表面 `pos: {x, y}` = auto layout offset。 未指定は
1690
- * backward compat、 set 済は Phase 2 の applyPosOffset で actor 由来 lane / node の位置を shift。
1753
+ * 箱の位置のずらし (#1971)。 配置後の箱の中心を (x, y) だけ動かす。 記法の `offsetX` / `offsetY`
1754
+ * と同じで、読み方は `DslActor.layoutPos` が持つ。
1691
1755
  */
1692
1756
  pos?: LayoutPos;
1693
1757
  /**
@@ -1742,12 +1806,6 @@ interface JsonActor {
1742
1806
  posY?: number;
1743
1807
  posW?: number;
1744
1808
  posH?: number;
1745
- /**
1746
- * 箱の中の要素ごとに位置と大きさを固定する (#1294)。 記法の `nodes:` と同じ。
1747
- *
1748
- * key は箱が作る要素の名前 (`header` / `footer` / `spacer` / `s0` 等)。
1749
- */
1750
- nodes?: Record<string, JsonActorNodeOverride>;
1751
1809
  /**
1752
1810
  * 見本を何倍で描くか (#1294)。 記法の `scale:` / `倍率:` と同じ。
1753
1811
  *
@@ -1769,13 +1827,6 @@ interface JsonAxes {
1769
1827
  top?: string;
1770
1828
  };
1771
1829
  }
1772
- /** 箱の中の要素 1 つ分の位置と大きさ (#1294)。 記法の `nodes: { header: { ... } }` と同じ */
1773
- interface JsonActorNodeOverride {
1774
- posX?: number;
1775
- posY?: number;
1776
- posW?: number;
1777
- posH?: number;
1778
- }
1779
1830
  interface JsonStep {
1780
1831
  from: string;
1781
1832
  to: string;
@@ -1786,7 +1837,7 @@ interface JsonStep {
1786
1837
  /**
1787
1838
  * 矢印の先の形 (#1462)。 記法の `{ head: triangle }` と同じ。
1788
1839
  *
1789
- * 三角 (継ぐ) / 菱 (持つ) / 開いた矢 (使う) / 鳥の足 (多)。
1840
+ * 三角 (継承・実装) / 菱 (集約・コンポジション) / 開いた矢 (関連・依存) / 鳥の足 (多)。
1790
1841
  * 書かなければ従来どおり塗った三角になる。
1791
1842
  */
1792
1843
  head?: EdgeHead;
@@ -1794,6 +1845,8 @@ interface JsonStep {
1794
1845
  tailHead?: EdgeHead;
1795
1846
  headFill?: EdgeHeadFill;
1796
1847
  tailHeadFill?: EdgeHeadFill;
1848
+ /** クラス図の出どころ側の多重度 (#1771)。 記法の `{ tailSub: "1" }` と同じ */
1849
+ tailSub?: string;
1797
1850
  /**
1798
1851
  * 辺の役目 (cdl#618)。 記法の `{ role: main }` と同じ。
1799
1852
  *
@@ -1827,10 +1880,15 @@ interface JsonStep {
1827
1880
  /** true で説明文を矢印の線の上に重ねる。 分岐図の条件ラベル用。 */
1828
1881
  overlay?: boolean;
1829
1882
  /**
1830
- * canvas pivot (CAR-1693 Phase 1) DSL 表面 `pos: {x, y}` = edge label offset。 未指定は
1831
- * backward compat、 set 済は Phase 2 の applyPosOffset で edge label 位置を shift する。
1883
+ * 矢印の位置のずらし (#1971)。 名前のずらし (`labelOffsetX` / `labelOffsetY`) に足して名前を動かす。
1832
1884
  */
1833
1885
  pos?: LayoutPos;
1886
+ /**
1887
+ * 部品の端で矢印を繋ぐ部品の中の要素の id (#1979)。 記法の `{ fromPartNode: rC }` / `{ toPartNode: gC }` と同じ。
1888
+ * 要素を 1 つだけ持つ部品は書かなくてもその要素に繋ぐ
1889
+ */
1890
+ fromPartNode?: string;
1891
+ toPartNode?: string;
1834
1892
  }
1835
1893
  interface JsonPhase {
1836
1894
  /** phase name (必須) */
@@ -2116,28 +2174,6 @@ declare const diagramJsonSchema: {
2116
2174
  type: string;
2117
2175
  description: string;
2118
2176
  };
2119
- nodes: {
2120
- type: string;
2121
- description: string;
2122
- additionalProperties: {
2123
- type: string;
2124
- additionalProperties: boolean;
2125
- properties: {
2126
- posX: {
2127
- type: string;
2128
- };
2129
- posY: {
2130
- type: string;
2131
- };
2132
- posW: {
2133
- type: string;
2134
- };
2135
- posH: {
2136
- type: string;
2137
- };
2138
- };
2139
- };
2140
- };
2141
2177
  scale: {
2142
2178
  type: string;
2143
2179
  description: string;
@@ -2305,6 +2341,10 @@ declare const diagramJsonSchema: {
2305
2341
  type: string;
2306
2342
  description: string;
2307
2343
  };
2344
+ tailSub: {
2345
+ type: string;
2346
+ description: string;
2347
+ };
2308
2348
  tone: {
2309
2349
  type: string;
2310
2350
  enum: string[];
@@ -2379,6 +2419,18 @@ declare const diagramJsonSchema: {
2379
2419
  type: string;
2380
2420
  description: string;
2381
2421
  };
2422
+ fromPartNode: {
2423
+ type: string;
2424
+ minLength: number;
2425
+ pattern: string;
2426
+ description: string;
2427
+ };
2428
+ toPartNode: {
2429
+ type: string;
2430
+ minLength: number;
2431
+ pattern: string;
2432
+ description: string;
2433
+ };
2382
2434
  pos: {
2383
2435
  type: string;
2384
2436
  additionalProperties: boolean;
@@ -3067,10 +3119,40 @@ declare const diagramJsonSchema: {
3067
3119
  min: {
3068
3120
  type: string;
3069
3121
  };
3122
+ offLabel: {
3123
+ type: string;
3124
+ minLength: number;
3125
+ description: string;
3126
+ };
3127
+ onLabel: {
3128
+ type: string;
3129
+ minLength: number;
3130
+ description: string;
3131
+ };
3070
3132
  options: {
3071
3133
  type: string;
3134
+ description: string;
3072
3135
  items: {
3073
- type: string;
3136
+ oneOf: ({
3137
+ type: string;
3138
+ additionalProperties?: undefined;
3139
+ required?: undefined;
3140
+ properties?: undefined;
3141
+ } | {
3142
+ type: string;
3143
+ additionalProperties: boolean;
3144
+ required: string[];
3145
+ properties: {
3146
+ value: {
3147
+ type: string;
3148
+ minLength: number;
3149
+ };
3150
+ label: {
3151
+ type: string;
3152
+ minLength: number;
3153
+ };
3154
+ };
3155
+ })[];
3074
3156
  };
3075
3157
  };
3076
3158
  placeholder: {
@@ -3123,9 +3205,34 @@ declare const diagramJsonSchema: {
3123
3205
  type: string;
3124
3206
  description: string;
3125
3207
  additionalProperties: {
3126
- type: string;
3127
- minLength: number;
3128
- pattern: string;
3208
+ oneOf: ({
3209
+ type: string;
3210
+ minLength: number;
3211
+ pattern: string;
3212
+ additionalProperties?: undefined;
3213
+ required?: undefined;
3214
+ properties?: undefined;
3215
+ } | {
3216
+ type: string;
3217
+ additionalProperties: boolean;
3218
+ required: string[];
3219
+ properties: {
3220
+ expression: {
3221
+ type: string;
3222
+ minLength: number;
3223
+ pattern: string;
3224
+ description: string;
3225
+ };
3226
+ label: {
3227
+ type: string;
3228
+ minLength: number;
3229
+ pattern: string;
3230
+ description: string;
3231
+ };
3232
+ };
3233
+ minLength?: undefined;
3234
+ pattern?: undefined;
3235
+ })[];
3129
3236
  };
3130
3237
  propertyNames: {
3131
3238
  pattern: string;
@@ -3146,6 +3253,11 @@ declare const diagramJsonSchema: {
3146
3253
  enum: string[];
3147
3254
  description: string;
3148
3255
  };
3256
+ relations: {
3257
+ type: string;
3258
+ enum: string[];
3259
+ description: string;
3260
+ };
3149
3261
  bands: {
3150
3262
  type: string;
3151
3263
  description: string;
@@ -3295,4 +3407,4 @@ interface CompileOpts {
3295
3407
  */
3296
3408
  declare function textDslToDiagram(src: string, opts?: CompileOpts): CdlDiagram;
3297
3409
 
3298
- export { type AnchorBox, type CompileNotice, type CompileOpts, DIAGRAM_BOUNDARY_PADDING, DRAW_TARGETS, DRAW_WORDS, type DiagramBoundingBox, type DragonJson, type DslActor, type DslAnimate, type DslDocument, type DslError, type DslGroup, type DslLane, type DslPhase, type DslSet, type DslState, type DslStep, type DslTween, type DslValue, type DslViewport, type FocusEntry, type InputSize, JSONを分解する, type JsonActor, type JsonActorNodeOverride, type JsonAxes, type JsonDslError, type JsonPhase, type JsonStep, type LayoutMode, type LayoutPos, type LintIssue, type LintReport, type LintSeverity, MAX_INPUT_BYTES, MAX_INPUT_ELEMENTS, MAX_PART_SCALE, NODE_KIND_ALIAS, NODE_KIND_VALID, PHASE_ITEM_WORDS, PRESET_TYPES, type PresetType, RELATIVE_GAP_DEFAULT, type RelativeDirection, type RelativePos, TONE_ALIAS, TOP_LEVEL_KEYS, autoFix, compileToCdl, computeDiagramBoundingBox, countBytes, countDiagramElements, countDocElements, describeOversize, describeOversizeSource, diagramJsonSchema, isColorValue, jsonToDiagram, lintDiagram, measureActorBoxes, normalizePartScale, orderByDependency, parseFocusEntry, parseRelativePos, parseTextDsl, parseTextDslV05, partBoxInFrame, partDrawsInDiagram, partIsMeasurable, partRenderSize, partScaleFactor, partTargetScale, partTargetSize, partVisualSize, partsBaseRows, partsGridCenters, pointsOutside, rectsOverlap, resolveRelativePos, stripExternalPaint, stripQuotes, textDslToDiagram, validateDragonJson, writeActorPosition, type トークン, type トークンの種類, 区間に広げる, 記法を分解する };
3410
+ export { type AnchorBox, type CompileNotice, type CompileOpts, DIAGRAM_BOUNDARY_PADDING, DIRECTION_ALIAS, DRAW_TARGETS, DRAW_WORDS, type DiagramBoundingBox, type DragonJson, type DslActor, type DslAnimate, type DslDocument, type DslError, type DslGroup, type DslLane, type DslPhase, type DslSet, type DslState, type DslStep, type DslTween, type DslValue, type DslViewport, type FocusEntry, type InputSize, JSONを分解する, type JsonActor, type JsonAxes, type JsonDslError, type JsonPhase, type JsonStep, type LayoutMode, type LayoutPos, type LintIssue, type LintReport, type LintSeverity, MAX_INPUT_BYTES, MAX_INPUT_ELEMENTS, MAX_PART_SCALE, NODE_KIND_ALIAS, NODE_KIND_VALID, PHASE_ITEM_WORDS, PRESET_TYPES, type PresetType, RELATIVE_GAP_DEFAULT, type RelativeDirection, type RelativePos, TONE_ALIAS, TOP_LEVEL_KEYS, autoFix, compileToCdl, computeDiagramBoundingBox, countBytes, countDiagramElements, countDocElements, describeOversize, describeOversizeSource, diagramJsonSchema, isColorValue, jsonToDiagram, lintDiagram, measureActorBoxes, normalizePartScale, orderByDependency, parseFocusEntry, parseRelativePos, parseTextDsl, parseTextDslV05, partBoxInFrame, partDrawsInDiagram, partIsMeasurable, partRenderSize, partScaleFactor, partTargetScale, partTargetSize, partVisualSize, partsBaseBottom, partsGridCenters, pointsOutside, rectsOverlap, resolveRelativePos, stripExternalPaint, stripQuotes, textDslToDiagram, validateDragonJson, writeActorPosition, type トークン, type トークンの種類, 区間に広げる, 記法を分解する, 部品に上書きを当てる };