@cardenelabs/cdl 0.36.0 → 0.37.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.
@@ -424,18 +424,29 @@ type CdlNode = {
424
424
  */
425
425
  chartPieForm?: ChartPieForm;
426
426
  /**
427
- * chart-slope の見せ方 (cdl#702)。 右の列に何の数を出すかを決める。
427
+ * chart-slope の見せ方 (cdl#702 / cdl#707)。
428
428
  *
429
- * - `values` ... 今の値
430
- * - `delta` ... 増減 (`+40` / `-90`)
429
+ * | 値 | 縦の位置 | 左の列 | 右の列 |
430
+ * |---|---|---|---|
431
+ * | `values` | 値 | 前の値 | 今の値 |
432
+ * | `delta` | 値 | 前の値 | 増減 (`+40` / `-90`) |
433
+ * | `rank` | 順位の段 (等間隔) | 前の値 | 今の値 |
431
434
  *
432
- * 左の列は どちらでも前の値。 `前 + 増減 = 今` なので、 `delta` でも今の値は足せば戻る。
435
+ * `values` と `delta` は縦の位置が同じで、右の列の字だけが違う。
436
+ * `前 + 増減 = 今` なので、 `delta` でも今の値は足せば戻る。
433
437
  * 3 つ目の数を足さないので、 名札の高さも線を引く幅も変わらない。
434
438
  *
439
+ * `rank` は **縦の位置** を変える (cdl#707)。 段を等間隔に置くので、線の交差が
440
+ * 順位の入れ替わりと 1 対 1 になり、水平線が「順位が動かなかった」 を意味する。
441
+ * 字は値のままにして、量が図から消えないようにしている。
442
+ *
443
+ * `rank` では「線の傾きが動いた量」 という読み方が成立しない (`+40` と `+30` が
444
+ * どちらも水平線になる)。 書いた図だけに効く割り切りで、量は字を読む。
445
+ *
435
446
  * 型の外の値は `values` として描く = 見せ方が決まらないより、既定の形が出る方がよい。
436
447
  *
437
- * 前の時点を持たない図 (`previous` が 1 件も無い) は右の列そのものが無いため、
438
- * この欄を書いても絵は変わらない。
448
+ * 前の時点を持たない図 (`previous` が 1 件も無い) は軸が 1 本で並べ替える相手が
449
+ * いないため、 この欄を書いても絵は変わらない。
439
450
  */
440
451
  chartSlopeForm?: ChartSlopeForm;
441
452
  /**
@@ -493,8 +504,8 @@ type BoundEnum<T extends string> = T | (string & {});
493
504
  /** Chart 系 kind の 1 datum payload。 label + value + optional tone (color) */
494
505
  /** chart-pie の見せ方 (cdl#684)。 SSOT は `kinds/chart-pie.tsx` */
495
506
  type ChartPieForm = "ring" | "arcs" | "table";
496
- /** chart-slope の見せ方 (cdl#702)。 SSOT は `kinds/chart-slope.tsx` */
497
- type ChartSlopeForm = "values" | "delta";
507
+ /** chart-slope の見せ方 (cdl#702 / cdl#707)。 SSOT は `kinds/chart-slope.tsx` */
508
+ type ChartSlopeForm = "values" | "delta" | "rank";
498
509
  type ChartDatumPayload = {
499
510
  label: string;
500
511
  /** 棒 / 折れ線 / 扇の大きさ。 `{signal}` で状態に追随する */
@@ -424,18 +424,29 @@ type CdlNode = {
424
424
  */
425
425
  chartPieForm?: ChartPieForm;
426
426
  /**
427
- * chart-slope の見せ方 (cdl#702)。 右の列に何の数を出すかを決める。
427
+ * chart-slope の見せ方 (cdl#702 / cdl#707)。
428
428
  *
429
- * - `values` ... 今の値
430
- * - `delta` ... 増減 (`+40` / `-90`)
429
+ * | 値 | 縦の位置 | 左の列 | 右の列 |
430
+ * |---|---|---|---|
431
+ * | `values` | 値 | 前の値 | 今の値 |
432
+ * | `delta` | 値 | 前の値 | 増減 (`+40` / `-90`) |
433
+ * | `rank` | 順位の段 (等間隔) | 前の値 | 今の値 |
431
434
  *
432
- * 左の列は どちらでも前の値。 `前 + 増減 = 今` なので、 `delta` でも今の値は足せば戻る。
435
+ * `values` と `delta` は縦の位置が同じで、右の列の字だけが違う。
436
+ * `前 + 増減 = 今` なので、 `delta` でも今の値は足せば戻る。
433
437
  * 3 つ目の数を足さないので、 名札の高さも線を引く幅も変わらない。
434
438
  *
439
+ * `rank` は **縦の位置** を変える (cdl#707)。 段を等間隔に置くので、線の交差が
440
+ * 順位の入れ替わりと 1 対 1 になり、水平線が「順位が動かなかった」 を意味する。
441
+ * 字は値のままにして、量が図から消えないようにしている。
442
+ *
443
+ * `rank` では「線の傾きが動いた量」 という読み方が成立しない (`+40` と `+30` が
444
+ * どちらも水平線になる)。 書いた図だけに効く割り切りで、量は字を読む。
445
+ *
435
446
  * 型の外の値は `values` として描く = 見せ方が決まらないより、既定の形が出る方がよい。
436
447
  *
437
- * 前の時点を持たない図 (`previous` が 1 件も無い) は右の列そのものが無いため、
438
- * この欄を書いても絵は変わらない。
448
+ * 前の時点を持たない図 (`previous` が 1 件も無い) は軸が 1 本で並べ替える相手が
449
+ * いないため、 この欄を書いても絵は変わらない。
439
450
  */
440
451
  chartSlopeForm?: ChartSlopeForm;
441
452
  /**
@@ -493,8 +504,8 @@ type BoundEnum<T extends string> = T | (string & {});
493
504
  /** Chart 系 kind の 1 datum payload。 label + value + optional tone (color) */
494
505
  /** chart-pie の見せ方 (cdl#684)。 SSOT は `kinds/chart-pie.tsx` */
495
506
  type ChartPieForm = "ring" | "arcs" | "table";
496
- /** chart-slope の見せ方 (cdl#702)。 SSOT は `kinds/chart-slope.tsx` */
497
- type ChartSlopeForm = "values" | "delta";
507
+ /** chart-slope の見せ方 (cdl#702 / cdl#707)。 SSOT は `kinds/chart-slope.tsx` */
508
+ type ChartSlopeForm = "values" | "delta" | "rank";
498
509
  type ChartDatumPayload = {
499
510
  label: string;
500
511
  /** 棒 / 折れ線 / 扇の大きさ。 `{signal}` で状態に追随する */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cardenelabs/cdl",
3
- "version": "0.36.0",
3
+ "version": "0.37.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",
@@ -50,6 +50,24 @@ import { 進みを畳む, 伸ばすdash } from "./draw-progress";
50
50
  *
51
51
  * 色を持たせるのは **名前だけ**。 値は太字の濃い色のままにして、数の読み比べを保つ。
52
52
  * identity は色が、量は字が担う。
53
+ *
54
+ * ## 順位で見せる形は縦の位置を変える (cdl#707)
55
+ *
56
+ * この図は「線の交差が順位の入れ替わり」 を読ませるが、縦の位置は値なので **交差点の
57
+ * 位置が順位と噛み合わない**。 どの交差が本当に順位を変えた交差なのかは、値を読み比べ
58
+ * ないと決まらない。
59
+ *
60
+ * `rank` は段を等間隔に置く。 交差が入れ替わりと 1 対 1 になり、水平線が「順位が
61
+ * 動かなかった」 を意味する。
62
+ *
63
+ * **字は値のままにする**。 字も順位にすると `380 → 420` と `60 → 90` がどちらも
64
+ * 同じ水平線になり、量が図から完全に消える。 位置が順位を、字が量を担う。
65
+ *
66
+ * 順位と値を **両方** 出す案は落とした = 3 つ目の数を足す形で、実物に当てると値の列が
67
+ * 伸びて名前と重なった (`delta` で落としたのと同じ形、cdl#702)。
68
+ *
69
+ * **この形では「線の傾きが動いた量」 が成立しない**。 `+40` と `+30` がどちらも水平線に
70
+ * なる。 書いた図だけに効く割り切りで、量は字を読む。
53
71
  */
54
72
 
55
73
  /** 線を引くのに最低限要る横幅。 名札が長い図でもこれだけは残す */
@@ -113,14 +131,39 @@ export function ChartSlopeNode({
113
131
  尺の幅 > 0 ? 下端 - ((v - 最小) / 尺の幅) * (下端 - 上端) : (上端 + 下端) / 2;
114
132
 
115
133
  /**
116
- * 見せ方 (cdl#702)。 **型の外の値は `values` に落とす** = 見せ方が決まらないより、
117
- * 既定の形が出る方がよい (円グラフと同じ判断)。
134
+ * 見せ方 (cdl#702 / cdl#707)。 **型の外の値は `values` に落とす** = 見せ方が
135
+ * 決まらないより、既定の形が出る方がよい (円グラフと同じ判断)。
136
+ *
137
+ * **前の時点を持たない図では `values` に落とす**。 `delta` は引く相手がいないので、
138
+ * 増減を出すと「0 から増えた」 という書いていない主張になる (前を持たない件を 0 から
139
+ * 立ち上げるのは線を引くための扱いで、前が 0 だったという意味ではない)。
140
+ * `rank` は軸が 1 本で並べ替える相手がいない。
141
+ */
142
+ const 書いた形 = node.chartSlopeForm;
143
+ const 形: ChartSlopeForm =
144
+ 前あり && (書いた形 === "delta" || 書いた形 === "rank") ? 書いた形 : "values";
145
+
146
+ /**
147
+ * 順位。 **自分より大きい値の件数 + 1** で決める。
148
+ *
149
+ * 同じ値なら同じ順位になり、段も重なる。 無理に 1 つずつずらすと、書いていない差を
150
+ * 絵が主張することになる。
151
+ */
152
+ const 順位を取る = (v: number, 全部: number[]): number =>
153
+ 全部.filter((x) => x > v).length + 1;
154
+
155
+ const 前の順位 = 系列たち.map((s) => 順位を取る(s.前, 系列たち.map((x) => x.前)));
156
+ const 今の順位 = 系列たち.map((s) => 順位を取る(s.今, 系列たち.map((x) => x.今)));
157
+
158
+ /**
159
+ * 段の y。 1 位を上端、系列の数を下端にして等間隔に置く。
118
160
  *
119
- * **前の時点を持たない図では `values` に落とす**。 引く相手がいないので、増減を出すと
120
- * 「0 から増えた」 という書いていない主張になる (前を持たない件を 0 から立ち上げるのは
121
- * 線を引くための扱いで、前が 0 だったという意味ではない)。
161
+ * **系列が 1 本の図では割り算ができない**ので縦の中央に置く (尺の幅が 0 の時と同じ扱い)。
122
162
  */
123
- const 形: ChartSlopeForm = 前あり && node.chartSlopeForm === "delta" ? "delta" : "values";
163
+ const 段のyを取る = (順位: number): number =>
164
+ 系列たち.length > 1
165
+ ? 上端 + ((順位 - 1) / (系列たち.length - 1)) * (下端 - 上端)
166
+ : (上端 + 下端) / 2;
124
167
 
125
168
  /**
126
169
  * 増減の表記。 符号を前に付ける。
@@ -233,8 +276,9 @@ export function ChartSlopeNode({
233
276
  )}
234
277
 
235
278
  {系列たち.map((s, i) => {
236
- const 左y = yを取る(s.前);
237
- const 右y = yを取る(s.今);
279
+ // `rank` は縦の位置を順位の段にする (cdl#707)。 値の尺は使わない
280
+ const 左y = 形 === "rank" ? 段のyを取る(前の順位[i]!) : yを取る(s.前);
281
+ const 右y = 形 === "rank" ? 段のyを取る(今の順位[i]!) : yを取る(s.今);
238
282
  const 未解決 = s.未解決 ? "true" : undefined;
239
283
  return (
240
284
  <g key={`slope-${i}`}>
package/src/types.ts CHANGED
@@ -483,18 +483,29 @@ export type CdlNode = {
483
483
  */
484
484
  chartPieForm?: ChartPieForm;
485
485
  /**
486
- * chart-slope の見せ方 (cdl#702)。 右の列に何の数を出すかを決める。
486
+ * chart-slope の見せ方 (cdl#702 / cdl#707)。
487
487
  *
488
- * - `values` ... 今の値
489
- * - `delta` ... 増減 (`+40` / `-90`)
488
+ * | 値 | 縦の位置 | 左の列 | 右の列 |
489
+ * |---|---|---|---|
490
+ * | `values` | 値 | 前の値 | 今の値 |
491
+ * | `delta` | 値 | 前の値 | 増減 (`+40` / `-90`) |
492
+ * | `rank` | 順位の段 (等間隔) | 前の値 | 今の値 |
490
493
  *
491
- * 左の列は どちらでも前の値。 `前 + 増減 = 今` なので、 `delta` でも今の値は足せば戻る。
494
+ * `values` と `delta` は縦の位置が同じで、右の列の字だけが違う。
495
+ * `前 + 増減 = 今` なので、 `delta` でも今の値は足せば戻る。
492
496
  * 3 つ目の数を足さないので、 名札の高さも線を引く幅も変わらない。
493
497
  *
498
+ * `rank` は **縦の位置** を変える (cdl#707)。 段を等間隔に置くので、線の交差が
499
+ * 順位の入れ替わりと 1 対 1 になり、水平線が「順位が動かなかった」 を意味する。
500
+ * 字は値のままにして、量が図から消えないようにしている。
501
+ *
502
+ * `rank` では「線の傾きが動いた量」 という読み方が成立しない (`+40` と `+30` が
503
+ * どちらも水平線になる)。 書いた図だけに効く割り切りで、量は字を読む。
504
+ *
494
505
  * 型の外の値は `values` として描く = 見せ方が決まらないより、既定の形が出る方がよい。
495
506
  *
496
- * 前の時点を持たない図 (`previous` が 1 件も無い) は右の列そのものが無いため、
497
- * この欄を書いても絵は変わらない。
507
+ * 前の時点を持たない図 (`previous` が 1 件も無い) は軸が 1 本で並べ替える相手が
508
+ * いないため、 この欄を書いても絵は変わらない。
498
509
  */
499
510
  chartSlopeForm?: ChartSlopeForm;
500
511
  /**
@@ -556,8 +567,8 @@ export type BoundEnum<T extends string> = T | (string & {});
556
567
  /** chart-pie の見せ方 (cdl#684)。 SSOT は `kinds/chart-pie.tsx` */
557
568
  export type ChartPieForm = "ring" | "arcs" | "table";
558
569
 
559
- /** chart-slope の見せ方 (cdl#702)。 SSOT は `kinds/chart-slope.tsx` */
560
- export type ChartSlopeForm = "values" | "delta";
570
+ /** chart-slope の見せ方 (cdl#702 / cdl#707)。 SSOT は `kinds/chart-slope.tsx` */
571
+ export type ChartSlopeForm = "values" | "delta" | "rank";
561
572
 
562
573
  export type ChartDatumPayload = {
563
574
  label: string;