@cardenelabs/dragon 0.12.0 → 0.14.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/src/types.ts CHANGED
@@ -3,9 +3,49 @@
3
3
  * docs/cdl/text-dsl-spec.md の文法を AST に変換した中間表現
4
4
  */
5
5
 
6
- import type { NodeKind, Tone, EdgeStyle } from "@cardenelabs/cdl";
6
+ import type { CdlDiagram, NodeKind, Tone, EdgeStyle } from "@cardenelabs/cdl";
7
7
  import type { RelativePos } from "./relative-pos";
8
8
 
9
+ /**
10
+ * 箱の中に描く図形 (#1374)。 **描画側の型をそのまま使う**。
11
+ *
12
+ * 写して持つと欄が増えた時にずれる。 指した先が変われば型検査が教える。
13
+ */
14
+ export type DslDynShape = NonNullable<CdlDiagram["nodes"][number]["shape"]>;
15
+
16
+ /** 値を見せる部品 (#1374)。 図形と同じ理由で描画側の型をそのまま使う */
17
+ export type DslReadout = NonNullable<CdlDiagram["readouts"]>[number];
18
+
19
+ /** 読む人が動かすつまみ (#1389)。 部品と同じ理由で描画側の型をそのまま使う */
20
+ export type DslInput = NonNullable<CdlDiagram["inputs"]>[number];
21
+
22
+ /** つまみの値から決まる値 (#1391)。 描画側の型に、知らせ用の記述位置だけを足す。 */
23
+ export type DslFormula = NonNullable<CdlDiagram["formulas"]>[number] & { pos?: Position };
24
+
25
+ /** 巻き上げに応じて進む値 (#1393)。 描画側の型をそのまま使う */
26
+ export type DslScrollTrigger = NonNullable<CdlDiagram["scrollTriggers"]>[number];
27
+
28
+ /**
29
+ * 押下などの出来事で動く仕掛け (`events:`、 #1393)。
30
+ *
31
+ * **描画側の型をそのまま使わない**。 描画側は相手を識別子で持つ (`{ kind: "node", id }`) が、
32
+ * 記法は識別子を書けず名前で指す。 名前から識別子への読み替えは組み立てが行うため、
33
+ * 記法の段階では「何をどう指したか」 だけを持つ。
34
+ */
35
+ export type DslEventBinding = {
36
+ /** 出来事の種類 (`click` / `hover` など、描画側の `CdlEventKind` と同じ語) */
37
+ event: NonNullable<CdlDiagram["eventBindings"]>[number]["event"];
38
+ /** 何を指したか。 名前は記法に書かれたまま持ち、組み立てが識別子へ直す */
39
+ target:
40
+ | { kind: "node"; name: string }
41
+ | { kind: "lane"; name: string }
42
+ | { kind: "edge"; from: string; to: string }
43
+ | { kind: "diagram" };
44
+ /** 呼び出す仕掛けの名前。 実体は画面側が持つ */
45
+ handlerId: string;
46
+ pos: Position;
47
+ };
48
+
9
49
  export type PresetType =
10
50
  | "sequence"
11
51
  | "flow"
@@ -96,6 +136,41 @@ export type DslDocument = {
96
136
  viewport?: DslViewport;
97
137
  lanes?: Record<string, DslLane>;
98
138
  groups?: Record<string, DslGroup>;
139
+ /**
140
+ * 値を見せる部品 (`readouts:`、 #1374)。 割合の輪や数え上げを図の脇に出す。
141
+ *
142
+ * 箱ではないので縦列に載らない。 図全体に 1 つの並びとして持つ。
143
+ */
144
+ readouts?: DslReadout[];
145
+ /**
146
+ * 読む人が動かすつまみ (`inputs:`、 #1389)。 つまみが握る値は状態と同じ名前で参照できる。
147
+ *
148
+ * 部品と同じく箱ではないので縦列に載らない。 図全体に 1 つの並びとして持つ。
149
+ */
150
+ inputs?: DslInput[];
151
+ /**
152
+ * つまみの値から決まる値 (`formulas:`、 #1391)。
153
+ *
154
+ * **`values:` とは経路が別**。 あちらは段が動かす状態を読んで毎 frame 決まり直す
155
+ * (`derived`) のに対し、こちらはつまみが握る値を読む反応の網に載る (`formulas`)。
156
+ * 描画側がこの 2 つを別の欄として持つため、記法でも別の項目にする。
157
+ *
158
+ * 式は描画側の書き方。 名前は中括弧で囲っても囲わなくてもよい (描画側の parser が
159
+ * どちらも同じ名前として読む)。
160
+ */
161
+ formulas?: DslFormula[];
162
+ /**
163
+ * 押下などの出来事で動く仕掛け (`events:`、 #1393)。
164
+ *
165
+ * 相手は名前で指す。 組み立てが識別子へ直し、指す先が無ければ知らせる。
166
+ */
167
+ events?: DslEventBinding[];
168
+ /**
169
+ * 巻き上げに応じて進む値 (`scrolls:`、 #1393)。
170
+ *
171
+ * 画面を巻き上げた量から 0 から 1 の進み具合を作る。 描画側はこれを値として読む。
172
+ */
173
+ scrolls?: DslScrollTrigger[];
99
174
  /**
100
175
  * canvas pivot (CAR-1693 Phase 1) diagram-level layout mode。 未指定は "auto" default で
101
176
  * catalog 100+ backward compat。 "manual" は Phase 4 で drag → pos: 保存の完全 manual mode。
@@ -128,6 +203,49 @@ export type DslActor = {
128
203
  eyebrow?: string;
129
204
  value?: string;
130
205
  rows?: string[];
206
+ /**
207
+ * 箱の中に描く図形 (`shape:`、 #1374)。 水位や角度を状態で動かせる。
208
+ *
209
+ * 種類ごとに書ける欄が違う (`図形の表`)。 知らない種類と欄は読み取りが知らせる。
210
+ */
211
+ shape?: DslDynShape;
212
+ /**
213
+ * 箱に出す題 (`title:`、 #1381)。 書かなければ名前がそのまま題になる。
214
+ *
215
+ * 名前は図の中で 1 つに決まる必要がある (`focus:` と `flow:` が名前で指すため) 一方、
216
+ * 題は重なってよい。 同じ題の箱を並べる図と、題を持たない箱を、名前と切り離して書ける。
217
+ */
218
+ title?: string;
219
+ /**
220
+ * その箱を出すかどうかの条件 (`visibleIf:`、 #1381)。
221
+ *
222
+ * 状態を差し込める文字列で、描画側が真偽を判定する。 `"0"` / `"false"` / 空文字が偽で、
223
+ * それ以外は真。 値だけを見せる図が、場所を空けるためだけの見えない箱を置くのに使う。
224
+ */
225
+ visibleIf?: string;
226
+ /**
227
+ * 箱の幅と高さを値に追随させる (`wBind:` / `hBind:`、 #1392)。
228
+ *
229
+ * 状態の名前を `{名前}` の形で書く。 配置計算は追随前の `posW` / `posH` を使い、
230
+ * 描く時だけ値に合わせて伸び縮みする (矢印の通り道が動かないようにするための分離)。
231
+ */
232
+ wBind?: string;
233
+ hBind?: string;
234
+ /**
235
+ * 箱の濃さ (`opacity:`、 #1392)。 0 から 1 の数か、状態の名前を書く。
236
+ *
237
+ * 書かなければ完全に見える状態になる。 `visibleIf` が出す / 出さないの 2 値なのに対し、
238
+ * こちらは途中の濃さを持てる。
239
+ */
240
+ opacity?: number | string;
241
+ /**
242
+ * 描く時だけ箱をずらす量 (`renderOffsetX:` / `renderOffsetY:`、 #1392)。
243
+ *
244
+ * 配置計算と矢印はずらす前の位置を使うため、円周上に並べて見せる等の見た目専用。
245
+ * 数か、状態の名前を書く。
246
+ */
247
+ renderOffsetX?: number | string;
248
+ renderOffsetY?: number | string;
131
249
  /**
132
250
  * 工程の並び (`type: gantt`) で、その工程の担当 (#1251)。
133
251
  *
@@ -261,6 +379,17 @@ export type DslStep = {
261
379
  /** v0.5+ inline option */
262
380
  guard?: string;
263
381
  cardinality?: string;
382
+ /**
383
+ * 矢印を値に追随させる欄 (`widthBind:` / `strokeBind:` / `dashOffsetBind:`、 #1396)。
384
+ *
385
+ * 箱の `wBind` (#1392) と同じ形で、状態やつまみの名前を `{名前}` で書く。
386
+ * 太さ / 色 / 破線の位置がその値に合わせて動く。 通り道そのものは動かない。
387
+ */
388
+ widthBind?: string;
389
+ strokeBind?: string;
390
+ dashOffsetBind?: string;
391
+ /** 矢印がどの辺から出るか (#1385)。 書かなければ描画側が自動で選ぶ */
392
+ side?: "top" | "right" | "bottom" | "left";
264
393
  labelOffsetX?: number;
265
394
  labelOffsetY?: number;
266
395
  /** true で説明文を矢印の線の上に重ねる。 分岐図の条件ラベル用。 */
@@ -0,0 +1,136 @@
1
+ // このファイルは自動生成です。 手で編集しないでください。
2
+ //
3
+ // 出どころ = 描画側 (`@cardenelabs/cdl`) の型定義 `CdlInput`。
4
+ // 作り直す = `node packages/dragon/scripts/gen-input-table.mjs`
5
+ // ずれの検知 = `packages/dragon/test/input-table-generated.test.ts`
6
+
7
+ import type { 図形の定義 } from "./parser-types";
8
+
9
+ /** 記法が受けるつまみと、その欄 (`CdlInput` の全種を覆う) */
10
+ export const つまみの表: Record<string, 図形の定義> = {
11
+ color: {
12
+ 必須: ["defaultValue"],
13
+ 欄: {
14
+ defaultValue: "文字列",
15
+ label: "文字列",
16
+ },
17
+ },
18
+ datetime: {
19
+ 必須: ["defaultValue"],
20
+ 欄: {
21
+ defaultValue: "文字列",
22
+ label: "文字列",
23
+ },
24
+ },
25
+ dropdown: {
26
+ 必須: ["options", "defaultValue"],
27
+ 欄: {
28
+ options: "文字列の並び",
29
+ defaultValue: "文字列",
30
+ label: "文字列",
31
+ },
32
+ },
33
+ "multi-select": {
34
+ 必須: ["options", "defaultValues"],
35
+ 欄: {
36
+ options: "文字列の並び",
37
+ defaultValues: "文字列の並び",
38
+ label: "文字列",
39
+ },
40
+ },
41
+ number: {
42
+ 必須: ["defaultValue"],
43
+ 欄: {
44
+ min: "数",
45
+ max: "数",
46
+ defaultValue: "数",
47
+ label: "文字列",
48
+ },
49
+ },
50
+ radio: {
51
+ 必須: ["options", "defaultValue"],
52
+ 欄: {
53
+ options: "文字列の並び",
54
+ defaultValue: "文字列",
55
+ label: "文字列",
56
+ },
57
+ },
58
+ range: {
59
+ 必須: ["min", "max", "defaultLo", "defaultHi"],
60
+ 欄: {
61
+ min: "数",
62
+ max: "数",
63
+ step: "数",
64
+ defaultLo: "数",
65
+ defaultHi: "数",
66
+ label: "文字列",
67
+ },
68
+ },
69
+ slider: {
70
+ 必須: ["min", "max", "defaultValue"],
71
+ 欄: {
72
+ min: "数",
73
+ max: "数",
74
+ step: "数",
75
+ defaultValue: "数",
76
+ label: "文字列",
77
+ },
78
+ },
79
+ stepper: {
80
+ 必須: ["defaultValue"],
81
+ 欄: {
82
+ min: "数",
83
+ max: "数",
84
+ step: "数",
85
+ defaultValue: "数",
86
+ label: "文字列",
87
+ },
88
+ },
89
+ tabs: {
90
+ 必須: ["options", "defaultValue"],
91
+ 欄: {
92
+ options: "文字列の並び",
93
+ defaultValue: "文字列",
94
+ label: "文字列",
95
+ },
96
+ },
97
+ text: {
98
+ 必須: ["defaultValue"],
99
+ 欄: {
100
+ defaultValue: "文字列",
101
+ placeholder: "文字列",
102
+ maxLength: "数",
103
+ label: "文字列",
104
+ },
105
+ },
106
+ timeline: {
107
+ 必須: ["duration"],
108
+ 欄: {
109
+ duration: "数",
110
+ autoplay: "真偽",
111
+ loop: "真偽",
112
+ speeds: "数の並び",
113
+ defaultSpeedIdx: "数",
114
+ label: "文字列",
115
+ },
116
+ },
117
+ toggle: {
118
+ 必須: ["defaultValue"],
119
+ 欄: {
120
+ defaultValue: "真偽",
121
+ label: "文字列",
122
+ },
123
+ },
124
+ xypad: {
125
+ 必須: ["xMin", "xMax", "yMin", "yMax", "defaultX", "defaultY"],
126
+ 欄: {
127
+ xMin: "数",
128
+ xMax: "数",
129
+ yMin: "数",
130
+ yMax: "数",
131
+ defaultX: "数",
132
+ defaultY: "数",
133
+ label: "文字列",
134
+ },
135
+ },
136
+ };
@@ -0,0 +1,21 @@
1
+ /**
2
+ * 中括弧の中身を表で読むための型 (#1385 で `parser.ts` から切り出した)。
3
+ *
4
+ * **生成した表 (`readout-table.generated.ts`) がこの型を使う**。 `parser.ts` に置いたままだと
5
+ * 生成した表 → `parser.ts` → 生成した表 の輪ができる。 型だけを別に置けば輪が消える。
6
+ */
7
+
8
+ /**
9
+ * 欄に書ける値の形。
10
+ *
11
+ * `真偽` は #1385 で足した。 描画側の部品に `boolean` の欄が 2 つあり、それまでの 5 形では
12
+ * 書けなかった。
13
+ *
14
+ * `数の並び` は #1389 で足した。 描画側のつまみに `readonly number[]` の欄が 1 つあり
15
+ * (`timeline` の再生速度の候補)、`文字列の並び` として読むと数が文字列のまま図に載る。
16
+ */
17
+ export type 欄の形 =
18
+ "数" | "文字列" | "数か文字列" | "文字列の並び" | "数の並び" | "向き" | "組の並び" | "真偽";
19
+
20
+ /** 1 つの種類が受ける、必須の欄と全欄の形 */
21
+ export type 図形の定義 = { 必須: readonly string[]; 欄: Record<string, 欄の形> };