@cardenelabs/cdl 0.83.0 → 0.102.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/CHANGELOG.md +851 -1
- package/dist/index.cjs +878 -186
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +17 -3
- package/dist/index.d.ts +17 -3
- package/dist/index.js +878 -186
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +869 -178
- 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 +869 -178
- package/dist/react.js.map +1 -1
- package/dist/{render-DfXCs3Eh.d.cts → render-oEmwYN-q.d.cts} +21 -3
- package/dist/{render-DfXCs3Eh.d.ts → render-oEmwYN-q.d.ts} +21 -3
- package/package.json +1 -1
- package/src/kinds/chart-gauge.tsx +20 -3
- package/src/kinds/chart-legend-number.tsx +33 -0
- package/src/kinds/chart-number.ts +33 -0
- package/src/kinds/chart-radial.tsx +24 -7
- package/src/kinds/chart-stat.tsx +35 -5
- package/src/kinds/chart-waffle.tsx +25 -7
- package/src/kinds/dyn-shape.tsx +72 -12
- package/src/kinds/funnel.tsx +50 -2
- package/src/kinds/mind-map.tsx +206 -64
- package/src/kinds/quadrant.tsx +318 -45
- package/src/kinds/shape-blockchain.tsx +50 -18
- package/src/kinds/shape-commerce.tsx +27 -4
- package/src/kinds/shape-region.tsx +42 -1
- package/src/kinds/shape-software.tsx +51 -12
- package/src/kinds/storage.tsx +16 -8
- package/src/kinds/tree.tsx +46 -10
- package/src/lang.ts +5 -5
- package/src/layout/nodes.ts +3 -1
- package/src/layout/spec.ts +154 -25
- package/src/layout/text-width.ts +25 -0
- package/src/layout/viewbox.ts +32 -0
- package/src/presets.ts +21 -7
- package/src/render/nodes.tsx +77 -0
- package/src/render/payload-binding.ts +108 -25
- package/src/render/stage.tsx +24 -2
- package/src/types.ts +117 -38
- package/src/visual-validate.ts +61 -1
package/src/types.ts
CHANGED
|
@@ -64,57 +64,128 @@ export type CdlRole =
|
|
|
64
64
|
export const NODE_KINDS = [
|
|
65
65
|
// dynamic shape (CAR: shape primitive) ... signal 値で内部 fill / radius / angle 等が
|
|
66
66
|
// リアルタイム変化する汎用 container、 shape spec は node.shape に格納
|
|
67
|
-
"dyn-rect",
|
|
67
|
+
"dyn-rect",
|
|
68
|
+
"dyn-circle",
|
|
69
|
+
"dyn-arc",
|
|
70
|
+
"dyn-wave",
|
|
71
|
+
"dyn-polygon",
|
|
68
72
|
// 既存 5 種
|
|
69
|
-
"actor",
|
|
73
|
+
"actor",
|
|
74
|
+
"function",
|
|
75
|
+
"storage",
|
|
76
|
+
"event",
|
|
77
|
+
"card",
|
|
70
78
|
// 人系 (5)
|
|
71
|
-
"person",
|
|
79
|
+
"person",
|
|
80
|
+
"user-group",
|
|
81
|
+
"admin",
|
|
82
|
+
"developer",
|
|
83
|
+
"external-user",
|
|
72
84
|
// インフラ (6)
|
|
73
|
-
"database",
|
|
85
|
+
"database",
|
|
86
|
+
"cache",
|
|
87
|
+
"queue",
|
|
88
|
+
"message-bus",
|
|
89
|
+
"cloud",
|
|
90
|
+
"cdn",
|
|
74
91
|
// アプリ系 (6)
|
|
75
|
-
"service",
|
|
92
|
+
"service",
|
|
93
|
+
"api",
|
|
94
|
+
"frontend",
|
|
95
|
+
"backend",
|
|
96
|
+
"webhook",
|
|
97
|
+
"microservice",
|
|
76
98
|
// データ / 判定 (4)
|
|
77
|
-
"signer",
|
|
99
|
+
"signer",
|
|
100
|
+
"oracle",
|
|
101
|
+
"merkle-tree",
|
|
102
|
+
"decision",
|
|
78
103
|
// Chart 系 (5) ... 1 node に datum 配列を持ち、 kind 内で全 datum を SVG 描画。
|
|
79
104
|
// chart-gauge は合計を主役に置く形 (cdl#549)、 chart-radial は弧の長さで比べる形 (cdl#550)、
|
|
80
105
|
// chart-stat は数値そのものを主役に置く形 (cdl#553)
|
|
81
106
|
// chart-waffle は 100 個の印で割合を数えて確かめる形 (cdl#552)
|
|
82
|
-
"chart-pie",
|
|
107
|
+
"chart-pie",
|
|
108
|
+
"chart-line",
|
|
109
|
+
"chart-bar",
|
|
110
|
+
"chart-gauge",
|
|
111
|
+
"chart-radial",
|
|
112
|
+
"chart-stat",
|
|
83
113
|
// chart-stacked-bar は帯を割合で区切り時点を並べる形 (cdl#551)
|
|
84
114
|
// chart-slope は 2 時点を直線でつなぎ増減と順位の入れ替わりを見せる形 (cdl#688)
|
|
85
|
-
"chart-waffle",
|
|
115
|
+
"chart-waffle",
|
|
116
|
+
"chart-stacked-bar",
|
|
117
|
+
"chart-slope",
|
|
86
118
|
// Timeline / Mind 系 (2、 CAR-994 Phase B) ... 1 node に payload 配列、 SVG geometry render
|
|
87
|
-
"gantt-timeline",
|
|
119
|
+
"gantt-timeline",
|
|
120
|
+
"mind-map",
|
|
88
121
|
// Analytic 系 (4、 CAR-994 Phase C) ... 1 node に payload 配列、 SVG geometry render
|
|
89
|
-
"funnel-stages",
|
|
122
|
+
"funnel-stages",
|
|
123
|
+
"quadrant-matrix",
|
|
124
|
+
"tree-hierarchy",
|
|
125
|
+
"journey-map",
|
|
90
126
|
// Shape-driven basement 8 (CAR-1099) ... 要素形状自体が意味を持つ SVG path node、
|
|
91
127
|
// 「icon 右上」 型ではなく shape 自体がパーツ表現
|
|
92
|
-
"shape-file",
|
|
93
|
-
"shape-
|
|
128
|
+
"shape-file",
|
|
129
|
+
"shape-folder",
|
|
130
|
+
"shape-cloud",
|
|
131
|
+
"shape-cylinder",
|
|
132
|
+
"shape-hexagon",
|
|
133
|
+
"shape-diamond",
|
|
134
|
+
"shape-stack",
|
|
135
|
+
"shape-person",
|
|
94
136
|
// Shape-driven software 6 (CAR-1111 Phase 2-B) ... ソフトウェア開発領域の視覚要素、
|
|
95
137
|
// OS ウィンドウ / 端末 / コード block / kanban ticket / チャット吹き出し / 歯車
|
|
96
|
-
"shape-window",
|
|
97
|
-
"shape-
|
|
138
|
+
"shape-window",
|
|
139
|
+
"shape-terminal",
|
|
140
|
+
"shape-code-block",
|
|
141
|
+
"shape-kanban-card",
|
|
142
|
+
"shape-message-bubble",
|
|
143
|
+
"shape-gear",
|
|
98
144
|
// Shape-driven hardware 6 (CAR-1111 Phase 2-C) ... ハードウェア / IoT / エッジ領域の視覚要素、
|
|
99
145
|
// rack 筐体 / network hub / スマホ / IoT sensor / ロボアーム / 人工衛星
|
|
100
|
-
"shape-server-rack",
|
|
101
|
-
"shape-
|
|
146
|
+
"shape-server-rack",
|
|
147
|
+
"shape-network-node",
|
|
148
|
+
"shape-mobile-device",
|
|
149
|
+
"shape-iot-sensor",
|
|
150
|
+
"shape-robot-arm",
|
|
151
|
+
"shape-satellite",
|
|
102
152
|
// Shape-driven blockchain / web3 10 (CAR-1111 Phase 2-D) ... Solidity / EVM 系開発 diagram 主体
|
|
103
|
-
"shape-smart-contract",
|
|
104
|
-
"shape-
|
|
105
|
-
"shape-
|
|
153
|
+
"shape-smart-contract",
|
|
154
|
+
"shape-blockchain-block",
|
|
155
|
+
"shape-rpc-node",
|
|
156
|
+
"shape-wallet",
|
|
157
|
+
"shape-nft",
|
|
158
|
+
"shape-token",
|
|
159
|
+
"shape-blockchain",
|
|
160
|
+
"shape-bitcoin-chain",
|
|
161
|
+
"shape-ethereum-chain",
|
|
162
|
+
"shape-blockchain-node",
|
|
106
163
|
// Shape-driven finance 7 (CAR-1111 Phase 2-D) ... 銀行 / 決済 / 信託 / 取引所主体
|
|
107
|
-
"shape-bank",
|
|
108
|
-
"shape-
|
|
164
|
+
"shape-bank",
|
|
165
|
+
"shape-trust-bank",
|
|
166
|
+
"shape-payment-provider",
|
|
167
|
+
"shape-credit-card",
|
|
168
|
+
"shape-brokerage",
|
|
169
|
+
"shape-exchange",
|
|
170
|
+
"shape-atm",
|
|
109
171
|
// Shape-driven commerce / web 6 (CAR-1111 Phase 2-D) ... web / EC / インフラ主体
|
|
110
|
-
"shape-website",
|
|
111
|
-
"shape-
|
|
172
|
+
"shape-website",
|
|
173
|
+
"shape-storefront",
|
|
174
|
+
"shape-warehouse",
|
|
175
|
+
"shape-online-shop",
|
|
176
|
+
"shape-cdn-edge",
|
|
177
|
+
"shape-api-gateway",
|
|
112
178
|
// Shape-driven people 6 (CAR-1111 Phase 2-D) ... 職種別 person 型 (監査 / 規制 / 公証 / 弁護 / トレーダ / CS)
|
|
113
|
-
"shape-auditor",
|
|
114
|
-
"shape-
|
|
179
|
+
"shape-auditor",
|
|
180
|
+
"shape-regulator",
|
|
181
|
+
"shape-notary",
|
|
182
|
+
"shape-lawyer",
|
|
183
|
+
"shape-trader",
|
|
184
|
+
"shape-customer-service",
|
|
115
185
|
// 流れの始まりと終わりの印 2 種 (#560) ... 塗った丸と輪で囲んだ丸。
|
|
116
186
|
// 状態遷移図が使う。 印そのものが意味を持つので文字は描かない
|
|
117
|
-
"mark-start",
|
|
187
|
+
"mark-start",
|
|
188
|
+
"mark-end",
|
|
118
189
|
// 時系列のやり取り (#578) ... 1 つの箱が図を丸ごと描く。 縦が時間で、参加者は箱を持たない
|
|
119
190
|
"sequence-board",
|
|
120
191
|
] as const;
|
|
@@ -173,15 +244,7 @@ export const EDGE_STYLES: readonly EdgeStyle[] = ["solid", "dotted-flow", "dashe
|
|
|
173
244
|
* 1 つの欄に畳むと 2 軸の積を名前で列挙することになり、組合せが増えるたびに語が増える。
|
|
174
245
|
*/
|
|
175
246
|
export type EdgeHead =
|
|
176
|
-
| "
|
|
177
|
-
| "triangle"
|
|
178
|
-
| "diamond"
|
|
179
|
-
| "open"
|
|
180
|
-
| "crow"
|
|
181
|
-
| "one"
|
|
182
|
-
| "zero-one"
|
|
183
|
-
| "many"
|
|
184
|
-
| "zero-many";
|
|
247
|
+
"none" | "triangle" | "diamond" | "open" | "crow" | "one" | "zero-one" | "many" | "zero-many";
|
|
185
248
|
|
|
186
249
|
/** 書かなかった時の端の形。 既存の図はすべてこれで描かれている */
|
|
187
250
|
export const EDGE_HEAD_DEFAULT: EdgeHead = "triangle";
|
|
@@ -670,12 +733,28 @@ export type QuadrantPayload = {
|
|
|
670
733
|
/** quadrant-matrix の象限 4 種 */
|
|
671
734
|
export type QuadrantKey = "topLeft" | "topRight" | "bottomLeft" | "bottomRight";
|
|
672
735
|
|
|
673
|
-
/**
|
|
736
|
+
/**
|
|
737
|
+
* quadrant-matrix の中の位置。 描画域の左下を (0, 0)、 右上を (1, 1) とする。
|
|
738
|
+
*
|
|
739
|
+
* **y は上向き**。 SVG の座標とは逆で、 図に出る軸の名前 (`↑ 大きい`) と同じ向きにする。
|
|
740
|
+
* 書き手が読む向きと書く向きが逆だと、 値を反転して書くことになる。
|
|
741
|
+
*/
|
|
742
|
+
export type QuadrantAt = { x: BoundNumber; y: BoundNumber };
|
|
743
|
+
|
|
744
|
+
/**
|
|
745
|
+
* quadrant-matrix の 1 item payload。
|
|
746
|
+
*
|
|
747
|
+
* 位置の決め方は 2 通りで、**どちらか片方だけを読む**。 `at` があれば座標で置き、
|
|
748
|
+
* 無ければ `quadrant` の象限に積む。 両方を読むと同じことが 2 か所に書かれ、
|
|
749
|
+
* 食い違った時にどちらが正しいか決められない。
|
|
750
|
+
*/
|
|
674
751
|
export type QuadrantItemPayload = {
|
|
675
752
|
id: string;
|
|
676
753
|
title: string;
|
|
677
|
-
/** どの象限に居るか。 `{signal}`
|
|
678
|
-
quadrant
|
|
754
|
+
/** どの象限に居るか。 `{signal}` を書くと項目が象限を移る。 `at` がある項目では読まない */
|
|
755
|
+
quadrant?: BoundEnum<QuadrantKey>;
|
|
756
|
+
/** 描画域の中の位置。 書くと点として描かれ、象限は座標から決まる */
|
|
757
|
+
at?: QuadrantAt;
|
|
679
758
|
subtitle?: string;
|
|
680
759
|
};
|
|
681
760
|
|
package/src/visual-validate.ts
CHANGED
|
@@ -137,6 +137,9 @@ import {
|
|
|
137
137
|
isRenderedNode,
|
|
138
138
|
genericTitleBaselineY,
|
|
139
139
|
rendersRows,
|
|
140
|
+
rendersEyebrow,
|
|
141
|
+
rendersSubtitle,
|
|
142
|
+
rendersValue,
|
|
140
143
|
TITLE_ROW_MIN_GAP,
|
|
141
144
|
rendersTitleText,
|
|
142
145
|
fitsOwnTitleWidth,
|
|
@@ -356,6 +359,8 @@ export type VisualAxis =
|
|
|
356
359
|
| "shape-label-dropped"
|
|
357
360
|
// Axis 68 (`#538` 追加) = 木と放射の中の箱が低くて、 書いた補足が落ちたことを書き手に伝える。
|
|
358
361
|
| "box-line-dropped"
|
|
362
|
+
// Axis 70 (`#933` 追加) = その種別が一度も描かない欄に語が書かれていることを書き手に伝える。
|
|
363
|
+
| "node-field-unsupported"
|
|
359
364
|
// Axis 54 (2026-07-03 追加) = node bbox が所属 lane 内に収まっているか。
|
|
360
365
|
// Axis 15 (lane-cx-consistency) は中心 x のみ、 本 axis は node 4 辺と lane 4 辺の包含関係を検知。
|
|
361
366
|
| "node-inside-lane"
|
|
@@ -555,6 +560,7 @@ function emptyCounts(): Record<VisualAxis, number> {
|
|
|
555
560
|
"node-inside-lane": 0,
|
|
556
561
|
"shape-label-dropped": 0,
|
|
557
562
|
"box-line-dropped": 0,
|
|
563
|
+
"node-field-unsupported": 0,
|
|
558
564
|
"edge-inside-viewbox": 0,
|
|
559
565
|
"lane-label-inside-viewbox": 0,
|
|
560
566
|
"lane-label-overlap": 0,
|
|
@@ -2883,6 +2889,59 @@ function runAxes(
|
|
|
2883
2889
|
);
|
|
2884
2890
|
}
|
|
2885
2891
|
|
|
2892
|
+
// ───────────────────────────────────────────────────────────
|
|
2893
|
+
// Axis 70: node-field-unsupported (その種別が一度も描かない欄に語が書かれている、 #933)
|
|
2894
|
+
//
|
|
2895
|
+
// 判定 = 述語が偽の欄に語が在るか。 書いた語が画面に出ないまま消えるので、著者は
|
|
2896
|
+
// 書いたつもりでいる。 `rows-not-rendered` (軸 68) が `rows` について同じことを見ており、
|
|
2897
|
+
// 本軸は残る 3 欄 (肩書 / 説明 / 値) を同じ形で見る。
|
|
2898
|
+
//
|
|
2899
|
+
// 題 (`title`) は入れない。 呼び出し側が図全体の題を箱の題として渡すため
|
|
2900
|
+
// (`dragon` の `compile/funnel.ts` が `title: doc.title` を渡す)、題が在ることは
|
|
2901
|
+
// 書き手がその箱について選んだ結果ではない。 知らせても直す先が無い。
|
|
2902
|
+
//
|
|
2903
|
+
// `shape-label-dropped` (軸 67) との境界は **なぜ出ないか**。 あちらは箱が狭くて行が
|
|
2904
|
+
// 落ちた形で、箱を高くすれば出る。 こちらは種別が元からその欄を描かない形で、箱をどれだけ
|
|
2905
|
+
// 大きくしても出ない。 軸 67 の説明自身が「種別が元から対応しない欄は別の検査範囲」 と
|
|
2906
|
+
// 書いており、その範囲が本軸になる。
|
|
2907
|
+
//
|
|
2908
|
+
// 手で 3 件直した後に置いた (#927 形の絵の副題 / #929 図表の題 / #931 じょうごと四象限の
|
|
2909
|
+
// 項目の補足)。 いずれも種別を 1 つずつ探して気付いたもので、知らせる経路が無かった。
|
|
2910
|
+
//
|
|
2911
|
+
// **発火なしを許す一覧 (`DEAD_ALLOWLIST`) には入れない**。 実在の見本 374 枚に通したら
|
|
2912
|
+
// 51 件出た (`storage` の説明 / 図表の肩書 に型の名前が残っている 等)。 稀な形だと見込んで
|
|
2913
|
+
// 許可すると、出ているのに誰も見ない軸になる。
|
|
2914
|
+
// ───────────────────────────────────────────────────────────
|
|
2915
|
+
const 欄の描き分け: readonly {
|
|
2916
|
+
欄: "eyebrow" | "subtitle" | "value";
|
|
2917
|
+
語: string;
|
|
2918
|
+
描くか: (kind: string | undefined) => boolean;
|
|
2919
|
+
}[] = [
|
|
2920
|
+
{ 欄: "eyebrow", 語: "肩書", 描くか: rendersEyebrow },
|
|
2921
|
+
{ 欄: "subtitle", 語: "説明", 描くか: rendersSubtitle },
|
|
2922
|
+
{ 欄: "value", 語: "値", 描くか: rendersValue },
|
|
2923
|
+
];
|
|
2924
|
+
for (const n of diag.nodes) {
|
|
2925
|
+
// 常時非表示の node は対象外。 `rows-not-rendered` と同じ理由で、節ごと出ない形は
|
|
2926
|
+
// 「欄が描かれない」 とは別の話になる (見本には配置の足場として置く書き方が実在する)
|
|
2927
|
+
if (!isRenderedNode(n)) continue;
|
|
2928
|
+
for (const { 欄, 語, 描くか } of 欄の描き分け) {
|
|
2929
|
+
const 書いた = (n[欄] ?? "").trim();
|
|
2930
|
+
// 空文字と空白だけは書いていないのと同じ。 描く側も空なら何も出さない
|
|
2931
|
+
if (書いた === "") continue;
|
|
2932
|
+
if (描くか(n.kind)) continue;
|
|
2933
|
+
push(
|
|
2934
|
+
"node-field-unsupported",
|
|
2935
|
+
`node "${n.id}" (kind=${n.kind ?? "未指定"}) が ${欄} (${語}) に "${書いた}" を持つが、 この種別はその欄を描かない (書いた語が画面に出ない)`,
|
|
2936
|
+
// 図そのものは正しく描かれており、効かない語が書かれているだけなので警告にする。
|
|
2937
|
+
// 誤り扱いにすると、既に書いている図が 1 枚も通らなくなる (実測 = engine の検査
|
|
2938
|
+
// だけで 8 file が落ちた)。 `rows-not-rendered` は誤り扱いだが、あちらは行が
|
|
2939
|
+
// 箱の主な中身になる種別を相手にしており、落ちた時の図の壊れ方が違う
|
|
2940
|
+
"warn",
|
|
2941
|
+
);
|
|
2942
|
+
}
|
|
2943
|
+
}
|
|
2944
|
+
|
|
2886
2945
|
// ───────────────────────────────────────────────────────────
|
|
2887
2946
|
// Axis 69: title-row-overlap (題の字と 1 行目の字が重なる)
|
|
2888
2947
|
//
|
|
@@ -4720,6 +4779,7 @@ function validateMetaAxes(
|
|
|
4720
4779
|
"column-gap-uniform",
|
|
4721
4780
|
];
|
|
4722
4781
|
const allAxes: VisualAxis[] = [
|
|
4782
|
+
"node-field-unsupported",
|
|
4723
4783
|
"node-visibility",
|
|
4724
4784
|
"edge-label-overlap",
|
|
4725
4785
|
"edge-label-proximity",
|
|
@@ -4808,7 +4868,7 @@ function validateMetaAxes(
|
|
|
4808
4868
|
// 軸 30 (neumorphism-shadow-budget、 どちらも #426 で主題の廃止に伴い削除) /
|
|
4809
4869
|
// 軸 40 (memory-budget、 #775 で軸 34 に一本化) /
|
|
4810
4870
|
// 軸 33 (subpixel-precision、 #783 で削除)。
|
|
4811
|
-
const EXPECTED_AXIS_COUNT =
|
|
4871
|
+
const EXPECTED_AXIS_COUNT = 67;
|
|
4812
4872
|
if (allAxes.length !== EXPECTED_AXIS_COUNT) {
|
|
4813
4873
|
out.push({
|
|
4814
4874
|
axis: "axis-documentation-completeness",
|