@cardenelabs/cdl 0.39.0 → 0.40.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.
@@ -2356,6 +2356,7 @@ type CdlPhase = {
2356
2356
  * | `chart-gauge` | 9 時 | 弧が上を通って 3 時へ伸びる | 合計と内訳は最初から出る |
2357
2357
  * | `chart-radial` | 12 時 | 各輪が時計回りに開く | 軌道と一覧は最初から出る |
2358
2358
  * | `chart-stacked-bar` | 左端 | 帯が右へ伸びる | 区画の字はその区画が広がった時 |
2359
+ * | `chart-waffle` | 左上 | 印が読む向きに 1 個ずつ埋まる | 一覧は最初から出る |
2359
2360
  *
2360
2361
  * 対象種別の一覧は `validate.ts` の `DRAW_KINDS` が持つ。
2361
2362
  *
@@ -2356,6 +2356,7 @@ type CdlPhase = {
2356
2356
  * | `chart-gauge` | 9 時 | 弧が上を通って 3 時へ伸びる | 合計と内訳は最初から出る |
2357
2357
  * | `chart-radial` | 12 時 | 各輪が時計回りに開く | 軌道と一覧は最初から出る |
2358
2358
  * | `chart-stacked-bar` | 左端 | 帯が右へ伸びる | 区画の字はその区画が広がった時 |
2359
+ * | `chart-waffle` | 左上 | 印が読む向きに 1 個ずつ埋まる | 一覧は最初から出る |
2359
2360
  *
2360
2361
  * 対象種別の一覧は `validate.ts` の `DRAW_KINDS` が持つ。
2361
2362
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cardenelabs/cdl",
3
- "version": "0.39.0",
3
+ "version": "0.40.0",
4
4
  "description": "CDL (Chainome Diagram Language). Mermaid-like declarative DSL that compiles to animated SVG diagrams. Built for blockchain / Solidity flows, generic enough for sequence / flow / state / ER / topology diagrams.",
5
5
  "license": "MIT",
6
6
  "author": "cardene777",
@@ -4,6 +4,7 @@ import { TONE, chartSeriesColor } from "../render/tone";
4
4
  import { resolveChartData } from "../render/payload-binding";
5
5
  import { textWidth } from "./text-width";
6
6
  import { 実値表記 } from "./chart-number";
7
+ import { 進みを畳む } from "./draw-progress";
7
8
 
8
9
  /**
9
10
  * chart-waffle kind ... 100 個の印で割合を **数えて確かめられる** 図 (cdl#552)。
@@ -24,6 +25,16 @@ import { 実値表記 } from "./chart-number";
24
25
  *
25
26
  * `印の割付` が最大剰余法で配る = まず切り捨てで配り、余った分を小数部の大きい件から 1 個ずつ
26
27
  * 足す。 合計は定義上ちょうど 100 になる。
28
+ *
29
+ * ## 段の `draw` では印が読む向きに埋まる (cdl#719)
30
+ *
31
+ * 印は上の行から左詰めで配るので、埋まる順もそのまま読む向きになる。
32
+ *
33
+ * **切り抜きでは表せない**。 弧の 3 種 (cdl#715) は切り抜きで隠したが、この図に当てると
34
+ * 升の途中が斜めや半分で切れる = 1 個 = 1% の印が半分だけ出て、数えられない図になる。
35
+ *
36
+ * 代わりに **塗りだけを変える**。 印は 100 個とも最初から描き、進みまで届いていない印を
37
+ * 持ち主のいない印と同じ地の色にする。 升の形も持ち主の欄も触らない。
27
38
  */
28
39
 
29
40
  /** 印の総数。 1 個 = 1% にするための値で、変えると「数えれば分かる」 が成り立たない */
@@ -70,10 +81,16 @@ export function ChartWaffleNode({
70
81
  node,
71
82
  active,
72
83
  stateValues = {},
84
+ drawing = false,
85
+ progress = 1,
73
86
  }: {
74
87
  node: LaidNode;
75
88
  active: boolean;
76
89
  stateValues?: Record<string, string>;
90
+ /** この phase の `draw` に載っているか (cdl#719) */
91
+ drawing?: boolean;
92
+ /** phase の進み (0→1)。 `drawing` が true の時だけ読む */
93
+ progress?: number;
77
94
  }): JSX.Element {
78
95
  const x0 = node.cx - node.w / 2;
79
96
  const y0 = node.cy - node.h / 2;
@@ -112,6 +129,14 @@ export function ChartWaffleNode({
112
129
  for (let k = 0; k < n; k++) 持ち主.push(idx);
113
130
  });
114
131
 
132
+ /**
133
+ * 埋まった印の数 (cdl#719)。 畳み方は `draw-progress.ts` が持つ。
134
+ *
135
+ * **四捨五入する**。 切り捨てると進み 1 の手前で 1 個足りない図が続き、切り上げると
136
+ * 進み 0 の時点で 1 個埋まる。 どちらも「数えれば分かる」 が崩れる。
137
+ */
138
+ const 埋まった = Math.round(進みを畳む(drawing, progress) * WAFFLE_TOTAL);
139
+
115
140
  const 一覧の始まり = PAD + (使える高さ - 行の高さ * data.length) / 2 + 行の高さ / 2;
116
141
 
117
142
  return (
@@ -136,6 +161,11 @@ export function ChartWaffleNode({
136
161
  const 行 = Math.floor(k / WAFFLE_COLS);
137
162
  const 列 = k % WAFFLE_COLS;
138
163
  const owner = 持ち主[k];
164
+ /**
165
+ * 色を付けるか (cdl#719)。 **持ち主の欄は触らない** = 印から持ち主を読む利用側が、
166
+ * 進みの途中で別の値を読まないようにする (形を表す属性と同じ扱い)。
167
+ */
168
+ const 埋まっている = owner !== undefined && k < 埋まった;
139
169
  return (
140
170
  <rect
141
171
  key={`cell-${k}`}
@@ -146,8 +176,8 @@ export function ChartWaffleNode({
146
176
  width={印}
147
177
  height={印}
148
178
  rx={2}
149
- fill={owner === undefined ? "var(--cdl-divider, #d4d4d8)" : 印の色(data[owner]!.tone, owner)}
150
- fillOpacity={owner === undefined ? 0.35 : 1}
179
+ fill={埋まっている ? 印の色(data[owner]!.tone, owner) : "var(--cdl-divider, #d4d4d8)"}
180
+ fillOpacity={埋まっている ? 1 : 0.35}
151
181
  />
152
182
  );
153
183
  })}
@@ -228,8 +228,16 @@ export function CdlNodeView({
228
228
  />
229
229
  );
230
230
  case "chart-waffle":
231
- // 1 個 = 1% の印を 100 個。 段の進みで印が埋まる動きは別 Issue (cdl#552 で対象外)
232
- return <ChartWaffleNode node={resolvedNode} active={active} stateValues={stateValues} />;
231
+ // 1 個 = 1% の印を 100 個。 段の進みでは読む向きに 1 個ずつ埋まる (cdl#719)
232
+ return (
233
+ <ChartWaffleNode
234
+ node={resolvedNode}
235
+ active={active}
236
+ stateValues={stateValues}
237
+ drawing={drawing}
238
+ progress={progress}
239
+ />
240
+ );
233
241
  case "chart-stat":
234
242
  // 数値が主役で、弧は輪郭だけの補助。 段の進みで数値が動く演出は既存の tween が担う
235
243
  return <ChartStatNode node={resolvedNode} active={active} stateValues={stateValues} />;
package/src/types.ts CHANGED
@@ -2433,6 +2433,7 @@ export type CdlPhase = {
2433
2433
  * | `chart-gauge` | 9 時 | 弧が上を通って 3 時へ伸びる | 合計と内訳は最初から出る |
2434
2434
  * | `chart-radial` | 12 時 | 各輪が時計回りに開く | 軌道と一覧は最初から出る |
2435
2435
  * | `chart-stacked-bar` | 左端 | 帯が右へ伸びる | 区画の字はその区画が広がった時 |
2436
+ * | `chart-waffle` | 左上 | 印が読む向きに 1 個ずつ埋まる | 一覧は最初から出る |
2436
2437
  *
2437
2438
  * 対象種別の一覧は `validate.ts` の `DRAW_KINDS` が持つ。
2438
2439
  *
package/src/validate.ts CHANGED
@@ -26,6 +26,7 @@ const TONES = new Set<string>(TONE_NAMES);
26
26
  * | `chart-gauge` | 9 時 | 弧が上を通って 3 時へ伸びる |
27
27
  * | `chart-radial` | 12 時 | 各輪が時計回りに開く |
28
28
  * | `chart-stacked-bar` | 左端 | 帯が右へ伸びる |
29
+ * | `chart-waffle` | 左上 | 印が読む向きに 1 個ずつ埋まる |
29
30
  */
30
31
  export const DRAW_KINDS: ReadonlySet<string> = new Set([
31
32
  "chart-line",
@@ -40,6 +41,7 @@ export const DRAW_KINDS: ReadonlySet<string> = new Set([
40
41
  "chart-gauge",
41
42
  "chart-radial",
42
43
  "chart-stacked-bar",
44
+ "chart-waffle",
43
45
  ]);
44
46
  const KINDS = new Set<string>(NODE_KINDS);
45
47
  const ENG_BANNED = /\b(FUNCTION|STORAGE|EVENT LOG|BALANCES MAPPING|READ|WRITE|EMIT|CALL)\b/;