@cardenelabs/cdl 0.32.0 → 0.34.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 CHANGED
@@ -5,6 +5,40 @@ CDL (Chainome Diagram Language) の主要変更履歴。
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.34.0] - 2026-09-07
9
+
10
+ ### Changed
11
+
12
+ - **傾き図の名札の役割を値と名前で分けた** (#693)
13
+
14
+ `chart-slope-label` を `chart-slope-value` (軸の脇に置く値) と `chart-slope-name`
15
+ (その外に置く系列の名前) の 2 つにした。 古い役割は残していない。
16
+
17
+ 1 つにまとめていると、使う側が値だけに字体を当てられず、寸法を記録する側も級 14 と
18
+ 級 9-13 の 2 つを 1 行に潰してしまう。 他の図表 (`chart-stat` / `chart-stacked-bar`) も
19
+ 字を役割で分けている。
20
+
21
+ `chart-slope` は `0.33.0` で入ったばかりで、この役割で selector を書いている消費側は無い。
22
+
23
+ ## [0.33.0] - 2026-09-07
24
+
25
+ ### Added
26
+
27
+ - **2 時点をつなぐ線で増減と順位の入れ替わりを見せる図を新設した** (#688)
28
+
29
+ `chart-slope` を足した。 左右に縦軸を置き、系列ごとに 前 と 今 を直線で結ぶ。
30
+ 線の向きが増減、傾きが動いた量、線の交差が順位の入れ替わりを表す。
31
+
32
+ 値は `chart-stacked-bar` と同じ datum の `previous` から読む。 新しい欄は足していない。
33
+
34
+ 尺は 0 に固定せず両時点の最小と最大から取る = 近い値どうしの差を傾きで読ませる図なので、
35
+ 0 まで伸ばすと線が全部水平に潰れる。
36
+
37
+ `previous` を 1 件も書かない図は線を引かず、軸 1 本に点を並べる。 2 点が無いと傾きが
38
+ 定義できず、水平線を引くと「動かなかった」 という別の意味になる。
39
+
40
+ 段の `draw` に載せると線が左の軸から右の軸へ伸びる。
41
+
8
42
  ## [0.32.0] - 2026-09-07
9
43
 
10
44
  ### Added
@@ -1629,7 +1663,9 @@ Initial OSS release.
1629
1663
  使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
1630
1664
  行き止まりになる。
1631
1665
 
1632
- [Unreleased]: https://github.com/cardene777/cdl/compare/v0.32.0...HEAD
1666
+ [Unreleased]: https://github.com/cardene777/cdl/compare/v0.34.0...HEAD
1667
+ [0.34.0]: https://github.com/cardene777/cdl/compare/v0.33.0...v0.34.0
1668
+ [0.33.0]: https://github.com/cardene777/cdl/compare/v0.32.0...v0.33.0
1633
1669
  [0.32.0]: https://github.com/cardene777/cdl/compare/v0.31.1...v0.32.0
1634
1670
  [0.31.1]: https://github.com/cardene777/cdl/compare/v0.31.0...v0.31.1
1635
1671
  [0.31.0]: https://github.com/cardene777/cdl/compare/v0.30.3...v0.31.0
package/README.md CHANGED
@@ -246,7 +246,7 @@ phase 切替に連動して `status: idle` → `status: running` のように描
246
246
 
247
247
  ## 2 時点の構成比
248
248
 
249
- `chart-pie` と `chart-stacked-bar` は datum の `previous` で前の時点を受け取る。
249
+ `chart-pie` と `chart-stacked-bar` と `chart-slope` は datum の `previous` で前の時点を受け取る。
250
250
  `previous` を 1 件でも書くと、書かない datum も前の時点では 0 として扱うため、系列の色と
251
251
  並びが時点間で対応する。
252
252
 
@@ -267,6 +267,35 @@ phase 切替に連動して `status: idle` → `status: running` のように描
267
267
  `chart-stacked-bar` は前から今の順に帯を並べる。`previous` を書かない図は、どちらも今だけを描く。
268
268
  3 時点以上は持たない。
269
269
 
270
+ ## 2 時点の増減と順位
271
+
272
+ `chart-slope` は同じ `previous` を読むが、構成比ではなく **値そのもの** を左右に打ち、系列ごとに
273
+ 直線で結ぶ。 線の向きが増減、傾きが動いた量、線の交差が順位の入れ替わりを表す。
274
+
275
+ ```ts
276
+ .node("trend", {
277
+ lane: "l",
278
+ stack: 0,
279
+ kind: "chart-slope",
280
+ chartData: [
281
+ { label: "Web", previous: 45, value: 30 },
282
+ { label: "Mobile", previous: 35, value: 45 },
283
+ { label: "API", previous: 20, value: 25 },
284
+ ],
285
+ })
286
+ ```
287
+
288
+ 尺は 0 に固定せず、両時点の最小と最大から取る。 近い値どうしの差を傾きで読ませる図なので、
289
+ 0 まで伸ばすと線が全部水平に潰れるため。
290
+
291
+ `previous` を 1 件も書かない図は線を引かず、軸 1 本に点を並べる。 2 点が無いと傾きが定義できず、
292
+ 水平線を引くと「動かなかった」 という別の意味になる。
293
+
294
+ 段の `draw` にこの node を載せると、線が左の軸から右の軸へ伸びる。
295
+
296
+ 名札の字は値と名前で role が分かれる (`chart-slope-value` / `chart-slope-name`)。
297
+ 値だけに字体を当てられるようにするため。
298
+
270
299
  ## 円グラフの見せ方
271
300
 
272
301
  `chart-pie` は `chartPieForm` で見せ方を選ぶ。 欄を書かない図は `ring` と同じ。
@@ -310,9 +339,13 @@ cdl は形だけを描き、 色や影は持たない (geometry only、 style
310
339
 
311
340
  明暗の切替は consumer 側の仕組み (`html` の class 等) で行う = cdl は明暗の概念を持たない。
312
341
 
313
- **`CdlRole` 型は実装にある role の全部ではない**。 実装には 32 種の role があり、
314
- 型に載っているのは 12 種。 残り 20 種 (`chart-line` / `tree-edge` / `funnel-stage` /
315
- `edge-glow` 等) は型を持たないが、 属性は付くので selector は書ける。
342
+ **`CdlRole` 型は実装にある role の全部ではない**。 型に載っているのは共通の描画で使う
343
+ ものだけで、 種別ごとの role (`chart-line` / `tree-edge` / `funnel-stage` / `edge-glow` 等)
344
+ は型を持たないが、 属性は付くので selector は書ける。
345
+
346
+ **件数は書かない**。 role は種別を足すたびに増えるため、 数を書くと必ずずれる
347
+ (実際に 32 種と書いてあった時点の実物は 85 種だった)。 一覧が要る時は source を
348
+ `data-cdl-role=` で検索する。
316
349
 
317
350
  型の内外は「共通か kind 固有か」 では分かれていない (共通の描画で使う `edge-glow` が型の外に
318
351
  あり、 枝分かれ図でしか使わない `mind-edge` も型の外にある)。 **型に載っているかどうかは
package/dist/index.cjs CHANGED
@@ -11748,6 +11748,7 @@ var KINDS_WITHOUT_TITLE_TEXT = /* @__PURE__ */ new Set([
11748
11748
  "chart-stat",
11749
11749
  "chart-waffle",
11750
11750
  "chart-stacked-bar",
11751
+ "chart-slope",
11751
11752
  "gantt-timeline",
11752
11753
  "mind-map",
11753
11754
  "funnel-stages",
@@ -13656,8 +13657,10 @@ var NODE_KINDS = [
13656
13657
  "chart-radial",
13657
13658
  "chart-stat",
13658
13659
  // chart-stacked-bar は帯を割合で区切り時点を並べる形 (cdl#551)
13660
+ // chart-slope は 2 時点を直線でつなぎ増減と順位の入れ替わりを見せる形 (cdl#688)
13659
13661
  "chart-waffle",
13660
13662
  "chart-stacked-bar",
13663
+ "chart-slope",
13661
13664
  // Timeline / Mind 系 (2、 CAR-994 Phase B) ... 1 node に payload 配列、 SVG geometry render
13662
13665
  "gantt-timeline",
13663
13666
  "mind-map",
@@ -15462,6 +15465,7 @@ var GRID_ALIGNED_KINDS = /* @__PURE__ */ new Set([
15462
15465
  "chart-stat",
15463
15466
  "chart-waffle",
15464
15467
  "chart-stacked-bar",
15468
+ "chart-slope",
15465
15469
  "funnel-stages",
15466
15470
  "quadrant-matrix"
15467
15471
  ]);
@@ -18068,6 +18072,8 @@ var TOKENS = {
18068
18072
  "chart-waffle": { w: 640, h: 320 },
18069
18073
  // 帯を最大 2 本 + 下に一覧。 縦は帯 2 本ぶんで足りる (cdl#551)
18070
18074
  "chart-stacked-bar": { w: 640, h: 320 },
18075
+ // 左右 2 本の縦軸と、その外に名札。 縦は系列が縦に並ぶぶん要る (cdl#688)
18076
+ "chart-slope": { w: 640, h: 360 },
18071
18077
  // Timeline / Mind 系 (CAR-994 Phase B)
18072
18078
  "gantt-timeline": { w: 720, h: 360 },
18073
18079
  "mind-map": { w: 720, h: 480 },
@@ -20781,6 +20787,7 @@ var DRAW_KINDS = /* @__PURE__ */ new Set([
20781
20787
  "chart-line",
20782
20788
  "chart-bar",
20783
20789
  "chart-pie",
20790
+ "chart-slope",
20784
20791
  "journey-map",
20785
20792
  "mind-map",
20786
20793
  "tree-hierarchy",
@@ -25514,6 +25521,238 @@ function \u4E00\u89A7\u306E\u4E26\u3073(data, \u5DE6, \u53F3\u7AEF, \u7D1A) {
25514
25521
  });
25515
25522
  return out;
25516
25523
  }
25524
+
25525
+ // src/kinds/chart-number.ts
25526
+ function \u5B9F\u5024\u8868\u8A187(v) {
25527
+ return Number.isInteger(v) ? v.toLocaleString("en-US") : v.toLocaleString("en-US", { maximumFractionDigits: 1 });
25528
+ }
25529
+ var \u7DDA\u306E\u6700\u5C0F\u5E45 = 120;
25530
+ function ChartSlopeNode({
25531
+ node,
25532
+ active,
25533
+ stateValues = {},
25534
+ drawing = false,
25535
+ progress = 1
25536
+ }) {
25537
+ const x0 = node.cx - node.w / 2;
25538
+ const y0 = node.cy - node.h / 2;
25539
+ const data = resolveChartData(node.chartData ?? [], stateValues);
25540
+ const PAD = 24;
25541
+ const \u6642\u70B9\u306E\u7D1A = 12;
25542
+ const \u5024\u306E\u7D1A = 14;
25543
+ const \u540D\u524D\u306E\u4E0A\u9650\u7D1A = 13;
25544
+ const \u540D\u524D\u306E\u4E0B\u9650\u7D1A = 9;
25545
+ const \u8EF8\u304B\u3089\u5024\u307E\u3067 = 10;
25546
+ const \u5024\u304B\u3089\u540D\u524D\u307E\u3067 = 8;
25547
+ const \u524D\u3042\u308A = data.some((d) => d.previous !== void 0);
25548
+ const \u7CFB\u5217\u305F\u3061 = data.map((d, i) => ({
25549
+ \u540D\u524D: d.label ?? "",
25550
+ // 前を持たない件は 0 から立ち上げる。 件を落とすと左右で系列の数が変わり、色の並びが
25551
+ // 対応しなくなる (`chart-stacked-bar` と同じ判断)
25552
+ \u524D: d.previous ?? 0,
25553
+ \u4ECA: d.value,
25554
+ \u8272: \u5370\u306E\u82724(d.tone, i),
25555
+ \u672A\u89E3\u6C7A: d.unresolved === true
25556
+ }));
25557
+ const \u5168\u90E8\u306E\u5024 = \u524D\u3042\u308A ? \u7CFB\u5217\u305F\u3061.flatMap((s) => [s.\u524D, s.\u4ECA]) : \u7CFB\u5217\u305F\u3061.map((s) => s.\u4ECA);
25558
+ const \u6700\u5C0F = \u5168\u90E8\u306E\u5024.length > 0 ? Math.min(...\u5168\u90E8\u306E\u5024) : 0;
25559
+ const \u6700\u5927 = \u5168\u90E8\u306E\u5024.length > 0 ? Math.max(...\u5168\u90E8\u306E\u5024) : 0;
25560
+ const \u5C3A\u306E\u5E45 = \u6700\u5927 - \u6700\u5C0F;
25561
+ const \u4E0A\u7AEF = PAD + (\u524D\u3042\u308A ? \u6642\u70B9\u306E\u7D1A + 12 : 0) + 6;
25562
+ const \u4E0B\u7AEF = Math.max(\u4E0A\u7AEF + 10, node.h - PAD - 6);
25563
+ const y\u3092\u53D6\u308B = (v) => \u5C3A\u306E\u5E45 > 0 ? \u4E0B\u7AEF - (v - \u6700\u5C0F) / \u5C3A\u306E\u5E45 * (\u4E0B\u7AEF - \u4E0A\u7AEF) : (\u4E0A\u7AEF + \u4E0B\u7AEF) / 2;
25564
+ const \u5DE6\u306E\u5B57 = \u7CFB\u5217\u305F\u3061.map((s) => \u5B9F\u5024\u8868\u8A187(s.\u524D));
25565
+ const \u53F3\u306E\u5B57 = \u7CFB\u5217\u305F\u3061.map((s) => \u5B9F\u5024\u8868\u8A187(s.\u4ECA));
25566
+ const \u5DE6\u5024\u5E45 = Math.max(0, ...\u5DE6\u306E\u5B57.map((t) => textWidth(t, \u5024\u306E\u7D1A)));
25567
+ const \u53F3\u5024\u5E45 = Math.max(0, ...\u53F3\u306E\u5B57.map((t) => textWidth(t, \u5024\u306E\u7D1A)));
25568
+ const \u540D\u524D\u306B\u4F7F\u3048\u308B = Math.max(
25569
+ 0,
25570
+ (node.w - PAD * 2 - \u7DDA\u306E\u6700\u5C0F\u5E45 - (\u5DE6\u5024\u5E45 + \u8EF8\u304B\u3089\u5024\u307E\u3067 + \u5024\u304B\u3089\u540D\u524D\u307E\u3067) - (\u53F3\u5024\u5E45 + \u8EF8\u304B\u3089\u5024\u307E\u3067 + \u5024\u304B\u3089\u540D\u524D\u307E\u3067)) / 2
25571
+ );
25572
+ const \u540D\u524D\u306E\u7D1A = \u53CE\u3081\u308B\u7D1A2(\u7CFB\u5217\u305F\u3061.map((s) => s.\u540D\u524D), \u540D\u524D\u306B\u4F7F\u3048\u308B, \u540D\u524D\u306E\u4E0A\u9650\u7D1A, \u540D\u524D\u306E\u4E0B\u9650\u7D1A);
25573
+ const \u540D\u524D\u5E45 = Math.min(
25574
+ \u540D\u524D\u306B\u4F7F\u3048\u308B,
25575
+ Math.max(0, ...\u7CFB\u5217\u305F\u3061.map((s) => textWidth(s.\u540D\u524D, \u540D\u524D\u306E\u7D1A)))
25576
+ );
25577
+ const \u5DE6\u306E\u4F59\u767D = \u540D\u524D\u5E45 + \u5024\u304B\u3089\u540D\u524D\u307E\u3067 + \u5DE6\u5024\u5E45 + \u8EF8\u304B\u3089\u5024\u307E\u3067;
25578
+ const \u53F3\u306E\u4F59\u767D = \u8EF8\u304B\u3089\u5024\u307E\u3067 + \u53F3\u5024\u5E45 + \u5024\u304B\u3089\u540D\u524D\u307E\u3067 + \u540D\u524D\u5E45;
25579
+ const \u5DE6\u8EF8x = \u524D\u3042\u308A ? Math.max(PAD, Math.min(PAD + \u5DE6\u306E\u4F59\u767D, node.w / 2 - \u7DDA\u306E\u6700\u5C0F\u5E45 / 2)) : Math.max(PAD, Math.min(node.w / 2, node.w - PAD));
25580
+ const \u53F3\u8EF8x = \u524D\u3042\u308A ? Math.min(node.w - PAD, Math.max(node.w - PAD - \u53F3\u306E\u4F59\u767D, node.w / 2 + \u7DDA\u306E\u6700\u5C0F\u5E45 / 2)) : \u5DE6\u8EF8x;
25581
+ const \u4F38\u3073 = \u9032\u307F\u3092\u7573\u3080(drawing, progress);
25582
+ const \u53F3\u3092\u51FA\u3059 = !drawing || \u4F38\u3073 >= 1;
25583
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${x0} ${y0})`, children: [
25584
+ /* @__PURE__ */ jsxRuntime.jsx(
25585
+ "rect",
25586
+ {
25587
+ "data-cdl-role": "node-body",
25588
+ x: 0,
25589
+ y: 0,
25590
+ width: node.w,
25591
+ height: node.h,
25592
+ rx: 16,
25593
+ fill: "var(--cdl-node-fill, #ffffff)",
25594
+ stroke: active ? "var(--cdl-tone-accent, #2d6a8f)" : "var(--cdl-divider, #d4d4d8)",
25595
+ strokeWidth: active ? 3 : 1.25
25596
+ }
25597
+ ),
25598
+ (\u524D\u3042\u308A ? [\u5DE6\u8EF8x, \u53F3\u8EF8x] : [\u5DE6\u8EF8x]).map((x, i) => /* @__PURE__ */ jsxRuntime.jsx(
25599
+ "line",
25600
+ {
25601
+ "data-cdl-role": "chart-slope-axis",
25602
+ x1: x,
25603
+ y1: \u4E0A\u7AEF - 6,
25604
+ x2: x,
25605
+ y2: \u4E0B\u7AEF + 6,
25606
+ stroke: "var(--cdl-divider, #d4d4d8)",
25607
+ strokeWidth: 1
25608
+ },
25609
+ `axis-${i}`
25610
+ )),
25611
+ \u524D\u3042\u308A && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
25612
+ /* @__PURE__ */ jsxRuntime.jsx(
25613
+ "text",
25614
+ {
25615
+ "data-cdl-role": "chart-slope-period",
25616
+ x: \u5DE6\u8EF8x,
25617
+ y: PAD + \u6642\u70B9\u306E\u7D1A,
25618
+ textAnchor: "middle",
25619
+ fontSize: \u6642\u70B9\u306E\u7D1A,
25620
+ fontWeight: 700,
25621
+ fill: "var(--cdl-text-dim, #5a6270)",
25622
+ children: "\u524D"
25623
+ }
25624
+ ),
25625
+ /* @__PURE__ */ jsxRuntime.jsx(
25626
+ "text",
25627
+ {
25628
+ "data-cdl-role": "chart-slope-period",
25629
+ x: \u53F3\u8EF8x,
25630
+ y: PAD + \u6642\u70B9\u306E\u7D1A,
25631
+ textAnchor: "middle",
25632
+ fontSize: \u6642\u70B9\u306E\u7D1A,
25633
+ fontWeight: 700,
25634
+ fill: "var(--cdl-text-dim, #5a6270)",
25635
+ children: "\u4ECA"
25636
+ }
25637
+ )
25638
+ ] }),
25639
+ \u7CFB\u5217\u305F\u3061.map((s, i) => {
25640
+ const \u5DE6y = y\u3092\u53D6\u308B(s.\u524D);
25641
+ const \u53F3y = y\u3092\u53D6\u308B(s.\u4ECA);
25642
+ const \u672A\u89E3\u6C7A = s.\u672A\u89E3\u6C7A ? "true" : void 0;
25643
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
25644
+ \u524D\u3042\u308A && /* @__PURE__ */ jsxRuntime.jsx(
25645
+ "path",
25646
+ {
25647
+ "data-cdl-role": "chart-slope-line",
25648
+ "data-cdl-unresolved": \u672A\u89E3\u6C7A,
25649
+ d: `M ${\u5DE6\u8EF8x} ${\u5DE6y} L ${\u53F3\u8EF8x} ${\u53F3y}`,
25650
+ fill: "none",
25651
+ stroke: s.\u8272,
25652
+ strokeWidth: 2.5,
25653
+ strokeLinecap: "round",
25654
+ ...\u4F38\u3070\u3059dash(drawing, \u4F38\u3073)
25655
+ }
25656
+ ),
25657
+ \u524D\u3042\u308A && /* @__PURE__ */ jsxRuntime.jsx(
25658
+ "circle",
25659
+ {
25660
+ "data-cdl-role": "chart-slope-dot",
25661
+ "data-cdl-unresolved": \u672A\u89E3\u6C7A,
25662
+ cx: \u5DE6\u8EF8x,
25663
+ cy: \u5DE6y,
25664
+ r: 4,
25665
+ fill: s.\u8272
25666
+ }
25667
+ ),
25668
+ \u53F3\u3092\u51FA\u3059 && /* @__PURE__ */ jsxRuntime.jsx(
25669
+ "circle",
25670
+ {
25671
+ "data-cdl-role": "chart-slope-dot",
25672
+ "data-cdl-unresolved": \u672A\u89E3\u6C7A,
25673
+ cx: \u53F3\u8EF8x,
25674
+ cy: \u53F3y,
25675
+ r: 4,
25676
+ fill: s.\u8272
25677
+ }
25678
+ ),
25679
+ \u524D\u3042\u308A ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
25680
+ /* @__PURE__ */ jsxRuntime.jsx(
25681
+ "text",
25682
+ {
25683
+ "data-cdl-role": "chart-slope-value",
25684
+ x: \u5DE6\u8EF8x - \u8EF8\u304B\u3089\u5024\u307E\u3067,
25685
+ y: \u5DE6y + 5,
25686
+ textAnchor: "end",
25687
+ fontSize: \u5024\u306E\u7D1A,
25688
+ fontWeight: 600,
25689
+ fill: "var(--cdl-text, #1a1f2a)",
25690
+ children: \u5DE6\u306E\u5B57[i]
25691
+ }
25692
+ ),
25693
+ /* @__PURE__ */ jsxRuntime.jsx(
25694
+ "text",
25695
+ {
25696
+ "data-cdl-role": "chart-slope-name",
25697
+ x: \u5DE6\u8EF8x - \u8EF8\u304B\u3089\u5024\u307E\u3067 - \u5DE6\u5024\u5E45 - \u5024\u304B\u3089\u540D\u524D\u307E\u3067,
25698
+ y: \u5DE6y + 5,
25699
+ textAnchor: "end",
25700
+ fontSize: \u540D\u524D\u306E\u7D1A,
25701
+ fill: "var(--cdl-text-dim, #5a6270)",
25702
+ children: s.\u540D\u524D
25703
+ }
25704
+ )
25705
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx(
25706
+ "text",
25707
+ {
25708
+ "data-cdl-role": "chart-slope-name",
25709
+ x: \u5DE6\u8EF8x - \u8EF8\u304B\u3089\u5024\u307E\u3067,
25710
+ y: \u53F3y + 5,
25711
+ textAnchor: "end",
25712
+ fontSize: \u540D\u524D\u306E\u7D1A,
25713
+ fill: "var(--cdl-text-dim, #5a6270)",
25714
+ children: s.\u540D\u524D
25715
+ }
25716
+ ),
25717
+ \u53F3\u3092\u51FA\u3059 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
25718
+ /* @__PURE__ */ jsxRuntime.jsx(
25719
+ "text",
25720
+ {
25721
+ "data-cdl-role": "chart-slope-value",
25722
+ x: \u53F3\u8EF8x + \u8EF8\u304B\u3089\u5024\u307E\u3067,
25723
+ y: \u53F3y + 5,
25724
+ fontSize: \u5024\u306E\u7D1A,
25725
+ fontWeight: 600,
25726
+ fill: "var(--cdl-text, #1a1f2a)",
25727
+ children: \u53F3\u306E\u5B57[i]
25728
+ }
25729
+ ),
25730
+ \u524D\u3042\u308A && /* @__PURE__ */ jsxRuntime.jsx(
25731
+ "text",
25732
+ {
25733
+ "data-cdl-role": "chart-slope-name",
25734
+ x: \u53F3\u8EF8x + \u8EF8\u304B\u3089\u5024\u307E\u3067 + \u53F3\u5024\u5E45 + \u5024\u304B\u3089\u540D\u524D\u307E\u3067,
25735
+ y: \u53F3y + 5,
25736
+ fontSize: \u540D\u524D\u306E\u7D1A,
25737
+ fill: "var(--cdl-text-dim, #5a6270)",
25738
+ children: s.\u540D\u524D
25739
+ }
25740
+ )
25741
+ ] })
25742
+ ] }, `slope-${i}`);
25743
+ })
25744
+ ] });
25745
+ }
25746
+ function \u5370\u306E\u82724(tone, idx) {
25747
+ if (tone) return TONE[tone];
25748
+ return chartSeriesColor(idx);
25749
+ }
25750
+ function \u53CE\u3081\u308B\u7D1A2(\u540D\u524D\u305F\u3061, \u5E45, \u4E0A\u9650, \u4E0B\u9650) {
25751
+ if (\u540D\u524D\u305F\u3061.length === 0) return \u4E0A\u9650;
25752
+ let \u7D1A = \u4E0A\u9650;
25753
+ while (\u7D1A > \u4E0B\u9650 && Math.max(...\u540D\u524D\u305F\u3061.map((n) => textWidth(n, \u7D1A))) > \u5E45) \u7D1A -= 1;
25754
+ return \u7D1A;
25755
+ }
25517
25756
  function ChartBarNode({
25518
25757
  node,
25519
25758
  active,
@@ -30193,6 +30432,17 @@ function CdlNodeView({
30193
30432
  return /* @__PURE__ */ jsxRuntime.jsx(ChartGaugeNode, { node: resolvedNode, active, stateValues });
30194
30433
  case "chart-stacked-bar":
30195
30434
  return /* @__PURE__ */ jsxRuntime.jsx(ChartStackedBarNode, { node: resolvedNode, active, stateValues });
30435
+ case "chart-slope":
30436
+ return /* @__PURE__ */ jsxRuntime.jsx(
30437
+ ChartSlopeNode,
30438
+ {
30439
+ node: resolvedNode,
30440
+ active,
30441
+ stateValues,
30442
+ drawing,
30443
+ progress
30444
+ }
30445
+ );
30196
30446
  case "chart-waffle":
30197
30447
  return /* @__PURE__ */ jsxRuntime.jsx(ChartWaffleNode, { node: resolvedNode, active, stateValues });
30198
30448
  case "chart-stat":
@@ -31974,7 +32224,8 @@ function chart(preset) {
31974
32224
  radial: "chart-radial",
31975
32225
  stat: "chart-stat",
31976
32226
  waffle: "chart-waffle",
31977
- "stacked-bar": "chart-stacked-bar"
32227
+ "stacked-bar": "chart-stacked-bar",
32228
+ slope: "chart-slope"
31978
32229
  };
31979
32230
  const api = {
31980
32231
  datum(d) {