@cardenelabs/cdl 0.16.0 → 0.17.1
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 +98 -1
- package/dist/index.cjs +743 -195
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +222 -10
- package/dist/index.d.ts +222 -10
- package/dist/index.js +735 -196
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +465 -62
- 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 +465 -62
- package/dist/react.js.map +1 -1
- package/dist/{render-BS1E6Mlo.d.cts → render-Dc5Pdf7e.d.cts} +175 -4
- package/dist/{render-BS1E6Mlo.d.ts → render-Dc5Pdf7e.d.ts} +175 -4
- package/package.json +1 -1
- package/src/builder.ts +19 -0
- package/src/index.ts +21 -1
- package/src/kinds/card.tsx +15 -1
- package/src/kinds/sequence-board-metrics.ts +118 -0
- package/src/kinds/sequence-board.tsx +297 -0
- package/src/kinds/storage.tsx +139 -12
- package/src/layout/nodes.ts +33 -6
- package/src/layout/spec.ts +36 -5
- package/src/layout/tokens.ts +3 -0
- package/src/presets.ts +563 -183
- package/src/render/edge-head.ts +72 -8
- package/src/render/edges.tsx +30 -9
- package/src/render/nodes.tsx +4 -0
- package/src/render/stage.tsx +40 -29
- package/src/render/template-fields.ts +6 -2
- package/src/types.ts +156 -3
- package/src/visual-validate.ts +33 -1
package/src/layout/nodes.ts
CHANGED
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
labelPillH,
|
|
6
6
|
requiredVerticalLabelGap,
|
|
7
7
|
requiredRowsHeight,
|
|
8
|
+
SUBTITLE_ROW_SHIFT,
|
|
8
9
|
} from "./spec";
|
|
9
10
|
import { DEFAULT_NODE_GAP, HEADER_RESERVE, LANE_TOP_PAD, NODE_SIZE, STACK_GAP } from "./tokens";
|
|
10
11
|
|
|
@@ -19,14 +20,26 @@ import { DEFAULT_NODE_GAP, HEADER_RESERVE, LANE_TOP_PAD, NODE_SIZE, STACK_GAP }
|
|
|
19
20
|
* 自動で h を伸ばさない (著者が指定した h をそのまま使う)。 行が枠外に出ていないかは
|
|
20
21
|
* `row-vertical-spacing` (軸 16) が同じ `rowBaselineY` を見て検査する。
|
|
21
22
|
*/
|
|
22
|
-
function autoStorageHeight(
|
|
23
|
+
function autoStorageHeight(
|
|
24
|
+
n: { kind: string; rows?: string[]; rowMarks?: readonly unknown[]; subtitle?: string; h?: number },
|
|
25
|
+
defaultH: number,
|
|
26
|
+
): number {
|
|
23
27
|
if (n.kind !== "storage") return n.h ?? defaultH;
|
|
24
28
|
if (n.h != null) return n.h;
|
|
25
29
|
// rows なし storage は title + divider のみで render されるため、 default h=240 では空白過大。
|
|
26
30
|
// title block (130px) + bottom padding (20px) = 150px に縮める。
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
31
|
+
const 印あり = n.rowMarks !== undefined;
|
|
32
|
+
const 呼び名の分 = 印あり && n.subtitle ? SUBTITLE_ROW_SHIFT : 0;
|
|
33
|
+
if (!n.rows || n.rows.length === 0) return 150 + 呼び名の分;
|
|
34
|
+
const 必要 = requiredRowsHeight("storage", n.rows.length) ?? defaultH;
|
|
35
|
+
// 行頭の印を持つ箱は **中身の足し算だけ** で高さを決める (#578)。 下限を残すと、行が
|
|
36
|
+
// 1 つしか無い箱が 4 行の箱と同じ高さになり、下が空いたまま並ぶ。
|
|
37
|
+
//
|
|
38
|
+
// 下限を全体から外さないのは、印を持たない既存の図がすべて縮むため。 印を持つ行は
|
|
39
|
+
// 書き方そのものが変わる形なので、高さの決め方もそちらに寄せる
|
|
40
|
+
// 呼び名を出す箱は題の段が 1 行ぶん増える。 描き手 (`storage.tsx`) が行を下げる値と同じ
|
|
41
|
+
if (印あり) return 必要 + 呼び名の分;
|
|
42
|
+
return Math.max(defaultH, 必要);
|
|
30
43
|
}
|
|
31
44
|
|
|
32
45
|
/**
|
|
@@ -173,8 +186,22 @@ export function layoutNodes(diag: CdlDiagram, lanes: LaidLane[]): LaidNode[] {
|
|
|
173
186
|
continue;
|
|
174
187
|
}
|
|
175
188
|
const cx = lane.x + lane.width / 2;
|
|
176
|
-
const
|
|
177
|
-
const
|
|
189
|
+
const 段の芯 = rowCy.get(n.stack)!;
|
|
190
|
+
const 段の高さ = rowH.get(n.stack)!;
|
|
191
|
+
/*
|
|
192
|
+
* 行頭の印を持つ箱は **自分の高さで、段の芯に揃える** (#578 → #580)。
|
|
193
|
+
*
|
|
194
|
+
* 既定は段の高さに合わせて伸ばす = 行が 1 つしか無い箱が 4 行の箱と同じ高さになり、
|
|
195
|
+
* 下が空いたまま並ぶ。 印を持つ箱は高さを中身から出しているので (`autoStorageHeight`)、
|
|
196
|
+
* 伸ばすとその値が捨てられる。
|
|
197
|
+
*
|
|
198
|
+
* **揃える先は芯**。 #578 では上端に揃えていたが、高さの違う箱が横に並ぶと
|
|
199
|
+
* 図全体が上へ寄って見えた (user 指摘)。 芯で揃えると上端も下端も箱ごとに違うが、
|
|
200
|
+
* 並びの重心が 1 本に通る。 見た目検査の `row-alignment` もこの前提で書かれている。
|
|
201
|
+
*/
|
|
202
|
+
const 自前の高さ = n.rowMarks !== undefined;
|
|
203
|
+
const h = n.h ?? (自前の高さ ? autoStorageHeight(n, size.h) : 段の高さ);
|
|
204
|
+
const cy = 段の芯;
|
|
178
205
|
// n.w 明示時は尊重、 未指定で rows[] を持つ node は内容長に合わせて auto 拡張。
|
|
179
206
|
const w = autoRowsWidth(n, size.w);
|
|
180
207
|
out.push({
|
package/src/layout/spec.ts
CHANGED
|
@@ -64,7 +64,7 @@ export function hasRenderedLabel(e: { label?: string; sub?: string }): boolean {
|
|
|
64
64
|
*
|
|
65
65
|
* 3 群ある。 形だけを描く `dyn-*` 5 種は `DynShapeNode` に回り、 `node.title` を一度も参照しない
|
|
66
66
|
* (描くのは形と数値の小さな label だけ)。 payload を自前 layout する chart / timeline / analytic
|
|
67
|
-
* 10 種は、 描くのが payload 側の label で `title` は使わない。 流れの始まりと終わりの印 2 種は
|
|
67
|
+
* 10 種と時系列のやり取り 1 種は、 描くのが payload 側の label で `title` は使わない。 流れの始まりと終わりの印 2 種は
|
|
68
68
|
* 印そのものが意味を持ち、 丸の中に名前を入れても読めない (#560)。
|
|
69
69
|
*
|
|
70
70
|
* 一覧は手で持つと描画側とずれるため、 `test/node-title-render.test.tsx` が `NODE_KINDS` を
|
|
@@ -72,6 +72,9 @@ export function hasRenderedLabel(e: { label?: string; sub?: string }): boolean {
|
|
|
72
72
|
* 足すと `NODE_KINDS` に載った時点で検査対象に入るので、 追記を忘れれば必ず落ちる。
|
|
73
73
|
*/
|
|
74
74
|
const KINDS_WITHOUT_TITLE_TEXT: ReadonlySet<string> = new Set([
|
|
75
|
+
// 時系列のやり取り (#578)。 図を丸ごと描く種別で、描くのは面々の名前と言づての語。
|
|
76
|
+
// 箱の `title` は使わない
|
|
77
|
+
"sequence-board",
|
|
75
78
|
// 形だけを描く (DynShapeNode)
|
|
76
79
|
"dyn-rect",
|
|
77
80
|
"dyn-circle",
|
|
@@ -239,8 +242,13 @@ export function genericTitleBaselineY(kind: string | undefined, h: number, hasRo
|
|
|
239
242
|
: GENERIC_TITLE_TOP + genericTextShift(kind);
|
|
240
243
|
}
|
|
241
244
|
|
|
242
|
-
/**
|
|
243
|
-
|
|
245
|
+
/**
|
|
246
|
+
* `kinds/storage.tsx` の 1 行目 baseline と行送り。
|
|
247
|
+
*
|
|
248
|
+
* 1 行目は #1468 で 130 から下げた。 題を 22 から 34 に上げたぶん、題の下に空きが要る
|
|
249
|
+
* (実測 = 130 のままだと題の descender と 1 行目の cap が 6 まで詰まる)。
|
|
250
|
+
*/
|
|
251
|
+
export const ROW_TOP_STORAGE = 152;
|
|
244
252
|
export const ROW_PITCH_STORAGE = 56;
|
|
245
253
|
|
|
246
254
|
/** `kinds/generic.tsx` の 1 行目 baseline と行送り。 */
|
|
@@ -273,8 +281,31 @@ export const GLYPH_CAP_RATIO = 0.72;
|
|
|
273
281
|
export const ROW_FONT_STORAGE = 26;
|
|
274
282
|
export const ROW_FONT_GENERIC = 21;
|
|
275
283
|
|
|
276
|
-
/**
|
|
277
|
-
|
|
284
|
+
/**
|
|
285
|
+
* `kinds/storage.tsx` の名前 (title) の baseline。
|
|
286
|
+
*
|
|
287
|
+
* #1468 で 78 から下げた。 題が 34 になり、上端から baseline までに cap 分の余白が要る。
|
|
288
|
+
*/
|
|
289
|
+
export const STORAGE_TITLE_BASELINE = 86;
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* `kinds/storage.tsx` の名前 (title) の字の大きさ (#1468)。
|
|
293
|
+
*
|
|
294
|
+
* **行 (`ROW_FONT_STORAGE` = 26) より大きい**。 22 だった間は題の方が小さく、箱の中で
|
|
295
|
+
* 何が見出しか読み取れなかった (user 指摘)。 題 34 / 行 26 / 型 22 の 3 段にして、
|
|
296
|
+
* 上から順に読む順序を字の大きさで示す。
|
|
297
|
+
*/
|
|
298
|
+
export const STORAGE_TITLE_FONT = 34;
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* 呼び名を出す箱で、行の群をどれだけ下げるか (#578)。
|
|
302
|
+
*
|
|
303
|
+
* 題の段が 1 行ぶん増えるので、その分だけ行を下へずらす。 ずらさないと呼び名と 1 行目が
|
|
304
|
+
* 詰まって、どちらも題の一部に見える。
|
|
305
|
+
*
|
|
306
|
+
* **描き手と高さの計算が同じ値を引く**。 片方だけ変えると、箱の下が空くか行が下端から出る。
|
|
307
|
+
*/
|
|
308
|
+
export const SUBTITLE_ROW_SHIFT = 46;
|
|
278
309
|
|
|
279
310
|
/**
|
|
280
311
|
* `storage` の名前と列の間に引く区切り線の Y。
|
package/src/layout/tokens.ts
CHANGED
|
@@ -138,6 +138,9 @@ export const TOKENS = {
|
|
|
138
138
|
// 箱としての最小 (80x40) より大きく、名前を持つ箱 (card 320x150) よりは明らかに小さい
|
|
139
139
|
"mark-start": { w: 96, h: 96 },
|
|
140
140
|
"mark-end": { w: 96, h: 96 },
|
|
141
|
+
// 時系列のやり取り (#578)。 実寸は中身から決まる (`sequenceBoardMetrics`) ので、
|
|
142
|
+
// ここは書かなかった時の受け皿
|
|
143
|
+
"sequence-board": { w: 960, h: 640 },
|
|
141
144
|
} as Record<NodeKind, { w: number; h: number }>,
|
|
142
145
|
|
|
143
146
|
// row gap (stack 間の vertical gap、 lane 内 / 跨ぎ共通)
|