@cardenelabs/cdl 0.32.0 → 0.33.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/dist/react.cjs CHANGED
@@ -579,6 +579,7 @@ var KINDS_WITHOUT_TITLE_TEXT = /* @__PURE__ */ new Set([
579
579
  "chart-stat",
580
580
  "chart-waffle",
581
581
  "chart-stacked-bar",
582
+ "chart-slope",
582
583
  "gantt-timeline",
583
584
  "mind-map",
584
585
  "funnel-stages",
@@ -2314,8 +2315,10 @@ var NODE_KINDS = [
2314
2315
  "chart-radial",
2315
2316
  "chart-stat",
2316
2317
  // chart-stacked-bar は帯を割合で区切り時点を並べる形 (cdl#551)
2318
+ // chart-slope は 2 時点を直線でつなぎ増減と順位の入れ替わりを見せる形 (cdl#688)
2317
2319
  "chart-waffle",
2318
2320
  "chart-stacked-bar",
2321
+ "chart-slope",
2319
2322
  // Timeline / Mind 系 (2、 CAR-994 Phase B) ... 1 node に payload 配列、 SVG geometry render
2320
2323
  "gantt-timeline",
2321
2324
  "mind-map",
@@ -4450,6 +4453,7 @@ var GRID_ALIGNED_KINDS = /* @__PURE__ */ new Set([
4450
4453
  "chart-stat",
4451
4454
  "chart-waffle",
4452
4455
  "chart-stacked-bar",
4456
+ "chart-slope",
4453
4457
  "funnel-stages",
4454
4458
  "quadrant-matrix"
4455
4459
  ]);
@@ -6786,6 +6790,8 @@ var TOKENS = {
6786
6790
  "chart-waffle": { w: 640, h: 320 },
6787
6791
  // 帯を最大 2 本 + 下に一覧。 縦は帯 2 本ぶんで足りる (cdl#551)
6788
6792
  "chart-stacked-bar": { w: 640, h: 320 },
6793
+ // 左右 2 本の縦軸と、その外に名札。 縦は系列が縦に並ぶぶん要る (cdl#688)
6794
+ "chart-slope": { w: 640, h: 360 },
6789
6795
  // Timeline / Mind 系 (CAR-994 Phase B)
6790
6796
  "gantt-timeline": { w: 720, h: 360 },
6791
6797
  "mind-map": { w: 720, h: 480 },
@@ -9499,6 +9505,7 @@ var DRAW_KINDS = /* @__PURE__ */ new Set([
9499
9505
  "chart-line",
9500
9506
  "chart-bar",
9501
9507
  "chart-pie",
9508
+ "chart-slope",
9502
9509
  "journey-map",
9503
9510
  "mind-map",
9504
9511
  "tree-hierarchy",
@@ -13015,6 +13022,238 @@ function \u4E00\u89A7\u306E\u4E26\u3073(data, \u5DE6, \u53F3\u7AEF, \u7D1A) {
13015
13022
  });
13016
13023
  return out;
13017
13024
  }
13025
+
13026
+ // src/kinds/chart-number.ts
13027
+ function \u5B9F\u5024\u8868\u8A187(v) {
13028
+ return Number.isInteger(v) ? v.toLocaleString("en-US") : v.toLocaleString("en-US", { maximumFractionDigits: 1 });
13029
+ }
13030
+ var \u7DDA\u306E\u6700\u5C0F\u5E45 = 120;
13031
+ function ChartSlopeNode({
13032
+ node,
13033
+ active,
13034
+ stateValues = {},
13035
+ drawing = false,
13036
+ progress = 1
13037
+ }) {
13038
+ const x0 = node.cx - node.w / 2;
13039
+ const y0 = node.cy - node.h / 2;
13040
+ const data = resolveChartData(node.chartData ?? [], stateValues);
13041
+ const PAD = 24;
13042
+ const \u6642\u70B9\u306E\u7D1A = 12;
13043
+ const \u5024\u306E\u7D1A = 14;
13044
+ const \u540D\u524D\u306E\u4E0A\u9650\u7D1A = 13;
13045
+ const \u540D\u524D\u306E\u4E0B\u9650\u7D1A = 9;
13046
+ const \u8EF8\u304B\u3089\u5024\u307E\u3067 = 10;
13047
+ const \u5024\u304B\u3089\u540D\u524D\u307E\u3067 = 8;
13048
+ const \u524D\u3042\u308A = data.some((d) => d.previous !== void 0);
13049
+ const \u7CFB\u5217\u305F\u3061 = data.map((d, i) => ({
13050
+ \u540D\u524D: d.label ?? "",
13051
+ // 前を持たない件は 0 から立ち上げる。 件を落とすと左右で系列の数が変わり、色の並びが
13052
+ // 対応しなくなる (`chart-stacked-bar` と同じ判断)
13053
+ \u524D: d.previous ?? 0,
13054
+ \u4ECA: d.value,
13055
+ \u8272: \u5370\u306E\u82724(d.tone, i),
13056
+ \u672A\u89E3\u6C7A: d.unresolved === true
13057
+ }));
13058
+ 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);
13059
+ const \u6700\u5C0F = \u5168\u90E8\u306E\u5024.length > 0 ? Math.min(...\u5168\u90E8\u306E\u5024) : 0;
13060
+ const \u6700\u5927 = \u5168\u90E8\u306E\u5024.length > 0 ? Math.max(...\u5168\u90E8\u306E\u5024) : 0;
13061
+ const \u5C3A\u306E\u5E45 = \u6700\u5927 - \u6700\u5C0F;
13062
+ const \u4E0A\u7AEF = PAD + (\u524D\u3042\u308A ? \u6642\u70B9\u306E\u7D1A + 12 : 0) + 6;
13063
+ const \u4E0B\u7AEF = Math.max(\u4E0A\u7AEF + 10, node.h - PAD - 6);
13064
+ 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;
13065
+ const \u5DE6\u306E\u5B57 = \u7CFB\u5217\u305F\u3061.map((s) => \u5B9F\u5024\u8868\u8A187(s.\u524D));
13066
+ const \u53F3\u306E\u5B57 = \u7CFB\u5217\u305F\u3061.map((s) => \u5B9F\u5024\u8868\u8A187(s.\u4ECA));
13067
+ const \u5DE6\u5024\u5E45 = Math.max(0, ...\u5DE6\u306E\u5B57.map((t) => textWidth(t, \u5024\u306E\u7D1A)));
13068
+ const \u53F3\u5024\u5E45 = Math.max(0, ...\u53F3\u306E\u5B57.map((t) => textWidth(t, \u5024\u306E\u7D1A)));
13069
+ const \u540D\u524D\u306B\u4F7F\u3048\u308B = Math.max(
13070
+ 0,
13071
+ (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
13072
+ );
13073
+ 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);
13074
+ const \u540D\u524D\u5E45 = Math.min(
13075
+ \u540D\u524D\u306B\u4F7F\u3048\u308B,
13076
+ Math.max(0, ...\u7CFB\u5217\u305F\u3061.map((s) => textWidth(s.\u540D\u524D, \u540D\u524D\u306E\u7D1A)))
13077
+ );
13078
+ const \u5DE6\u306E\u4F59\u767D = \u540D\u524D\u5E45 + \u5024\u304B\u3089\u540D\u524D\u307E\u3067 + \u5DE6\u5024\u5E45 + \u8EF8\u304B\u3089\u5024\u307E\u3067;
13079
+ const \u53F3\u306E\u4F59\u767D = \u8EF8\u304B\u3089\u5024\u307E\u3067 + \u53F3\u5024\u5E45 + \u5024\u304B\u3089\u540D\u524D\u307E\u3067 + \u540D\u524D\u5E45;
13080
+ 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));
13081
+ 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;
13082
+ const \u4F38\u3073 = \u9032\u307F\u3092\u7573\u3080(drawing, progress);
13083
+ const \u53F3\u3092\u51FA\u3059 = !drawing || \u4F38\u3073 >= 1;
13084
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${x0} ${y0})`, children: [
13085
+ /* @__PURE__ */ jsxRuntime.jsx(
13086
+ "rect",
13087
+ {
13088
+ "data-cdl-role": "node-body",
13089
+ x: 0,
13090
+ y: 0,
13091
+ width: node.w,
13092
+ height: node.h,
13093
+ rx: 16,
13094
+ fill: "var(--cdl-node-fill, #ffffff)",
13095
+ stroke: active ? "var(--cdl-tone-accent, #2d6a8f)" : "var(--cdl-divider, #d4d4d8)",
13096
+ strokeWidth: active ? 3 : 1.25
13097
+ }
13098
+ ),
13099
+ (\u524D\u3042\u308A ? [\u5DE6\u8EF8x, \u53F3\u8EF8x] : [\u5DE6\u8EF8x]).map((x, i) => /* @__PURE__ */ jsxRuntime.jsx(
13100
+ "line",
13101
+ {
13102
+ "data-cdl-role": "chart-slope-axis",
13103
+ x1: x,
13104
+ y1: \u4E0A\u7AEF - 6,
13105
+ x2: x,
13106
+ y2: \u4E0B\u7AEF + 6,
13107
+ stroke: "var(--cdl-divider, #d4d4d8)",
13108
+ strokeWidth: 1
13109
+ },
13110
+ `axis-${i}`
13111
+ )),
13112
+ \u524D\u3042\u308A && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
13113
+ /* @__PURE__ */ jsxRuntime.jsx(
13114
+ "text",
13115
+ {
13116
+ "data-cdl-role": "chart-slope-period",
13117
+ x: \u5DE6\u8EF8x,
13118
+ y: PAD + \u6642\u70B9\u306E\u7D1A,
13119
+ textAnchor: "middle",
13120
+ fontSize: \u6642\u70B9\u306E\u7D1A,
13121
+ fontWeight: 700,
13122
+ fill: "var(--cdl-text-dim, #5a6270)",
13123
+ children: "\u524D"
13124
+ }
13125
+ ),
13126
+ /* @__PURE__ */ jsxRuntime.jsx(
13127
+ "text",
13128
+ {
13129
+ "data-cdl-role": "chart-slope-period",
13130
+ x: \u53F3\u8EF8x,
13131
+ y: PAD + \u6642\u70B9\u306E\u7D1A,
13132
+ textAnchor: "middle",
13133
+ fontSize: \u6642\u70B9\u306E\u7D1A,
13134
+ fontWeight: 700,
13135
+ fill: "var(--cdl-text-dim, #5a6270)",
13136
+ children: "\u4ECA"
13137
+ }
13138
+ )
13139
+ ] }),
13140
+ \u7CFB\u5217\u305F\u3061.map((s, i) => {
13141
+ const \u5DE6y = y\u3092\u53D6\u308B(s.\u524D);
13142
+ const \u53F3y = y\u3092\u53D6\u308B(s.\u4ECA);
13143
+ const \u672A\u89E3\u6C7A = s.\u672A\u89E3\u6C7A ? "true" : void 0;
13144
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
13145
+ \u524D\u3042\u308A && /* @__PURE__ */ jsxRuntime.jsx(
13146
+ "path",
13147
+ {
13148
+ "data-cdl-role": "chart-slope-line",
13149
+ "data-cdl-unresolved": \u672A\u89E3\u6C7A,
13150
+ d: `M ${\u5DE6\u8EF8x} ${\u5DE6y} L ${\u53F3\u8EF8x} ${\u53F3y}`,
13151
+ fill: "none",
13152
+ stroke: s.\u8272,
13153
+ strokeWidth: 2.5,
13154
+ strokeLinecap: "round",
13155
+ ...\u4F38\u3070\u3059dash(drawing, \u4F38\u3073)
13156
+ }
13157
+ ),
13158
+ \u524D\u3042\u308A && /* @__PURE__ */ jsxRuntime.jsx(
13159
+ "circle",
13160
+ {
13161
+ "data-cdl-role": "chart-slope-dot",
13162
+ "data-cdl-unresolved": \u672A\u89E3\u6C7A,
13163
+ cx: \u5DE6\u8EF8x,
13164
+ cy: \u5DE6y,
13165
+ r: 4,
13166
+ fill: s.\u8272
13167
+ }
13168
+ ),
13169
+ \u53F3\u3092\u51FA\u3059 && /* @__PURE__ */ jsxRuntime.jsx(
13170
+ "circle",
13171
+ {
13172
+ "data-cdl-role": "chart-slope-dot",
13173
+ "data-cdl-unresolved": \u672A\u89E3\u6C7A,
13174
+ cx: \u53F3\u8EF8x,
13175
+ cy: \u53F3y,
13176
+ r: 4,
13177
+ fill: s.\u8272
13178
+ }
13179
+ ),
13180
+ \u524D\u3042\u308A ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
13181
+ /* @__PURE__ */ jsxRuntime.jsx(
13182
+ "text",
13183
+ {
13184
+ "data-cdl-role": "chart-slope-label",
13185
+ x: \u5DE6\u8EF8x - \u8EF8\u304B\u3089\u5024\u307E\u3067,
13186
+ y: \u5DE6y + 5,
13187
+ textAnchor: "end",
13188
+ fontSize: \u5024\u306E\u7D1A,
13189
+ fontWeight: 600,
13190
+ fill: "var(--cdl-text, #1a1f2a)",
13191
+ children: \u5DE6\u306E\u5B57[i]
13192
+ }
13193
+ ),
13194
+ /* @__PURE__ */ jsxRuntime.jsx(
13195
+ "text",
13196
+ {
13197
+ "data-cdl-role": "chart-slope-label",
13198
+ x: \u5DE6\u8EF8x - \u8EF8\u304B\u3089\u5024\u307E\u3067 - \u5DE6\u5024\u5E45 - \u5024\u304B\u3089\u540D\u524D\u307E\u3067,
13199
+ y: \u5DE6y + 5,
13200
+ textAnchor: "end",
13201
+ fontSize: \u540D\u524D\u306E\u7D1A,
13202
+ fill: "var(--cdl-text-dim, #5a6270)",
13203
+ children: s.\u540D\u524D
13204
+ }
13205
+ )
13206
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx(
13207
+ "text",
13208
+ {
13209
+ "data-cdl-role": "chart-slope-label",
13210
+ x: \u5DE6\u8EF8x - \u8EF8\u304B\u3089\u5024\u307E\u3067,
13211
+ y: \u53F3y + 5,
13212
+ textAnchor: "end",
13213
+ fontSize: \u540D\u524D\u306E\u7D1A,
13214
+ fill: "var(--cdl-text-dim, #5a6270)",
13215
+ children: s.\u540D\u524D
13216
+ }
13217
+ ),
13218
+ \u53F3\u3092\u51FA\u3059 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
13219
+ /* @__PURE__ */ jsxRuntime.jsx(
13220
+ "text",
13221
+ {
13222
+ "data-cdl-role": "chart-slope-label",
13223
+ x: \u53F3\u8EF8x + \u8EF8\u304B\u3089\u5024\u307E\u3067,
13224
+ y: \u53F3y + 5,
13225
+ fontSize: \u5024\u306E\u7D1A,
13226
+ fontWeight: 600,
13227
+ fill: "var(--cdl-text, #1a1f2a)",
13228
+ children: \u53F3\u306E\u5B57[i]
13229
+ }
13230
+ ),
13231
+ \u524D\u3042\u308A && /* @__PURE__ */ jsxRuntime.jsx(
13232
+ "text",
13233
+ {
13234
+ "data-cdl-role": "chart-slope-label",
13235
+ x: \u53F3\u8EF8x + \u8EF8\u304B\u3089\u5024\u307E\u3067 + \u53F3\u5024\u5E45 + \u5024\u304B\u3089\u540D\u524D\u307E\u3067,
13236
+ y: \u53F3y + 5,
13237
+ fontSize: \u540D\u524D\u306E\u7D1A,
13238
+ fill: "var(--cdl-text-dim, #5a6270)",
13239
+ children: s.\u540D\u524D
13240
+ }
13241
+ )
13242
+ ] })
13243
+ ] }, `slope-${i}`);
13244
+ })
13245
+ ] });
13246
+ }
13247
+ function \u5370\u306E\u82724(tone, idx) {
13248
+ if (tone) return TONE[tone];
13249
+ return chartSeriesColor(idx);
13250
+ }
13251
+ function \u53CE\u3081\u308B\u7D1A2(\u540D\u524D\u305F\u3061, \u5E45, \u4E0A\u9650, \u4E0B\u9650) {
13252
+ if (\u540D\u524D\u305F\u3061.length === 0) return \u4E0A\u9650;
13253
+ let \u7D1A = \u4E0A\u9650;
13254
+ while (\u7D1A > \u4E0B\u9650 && Math.max(...\u540D\u524D\u305F\u3061.map((n) => textWidth(n, \u7D1A))) > \u5E45) \u7D1A -= 1;
13255
+ return \u7D1A;
13256
+ }
13018
13257
  function ChartBarNode({
13019
13258
  node,
13020
13259
  active,
@@ -17694,6 +17933,17 @@ function CdlNodeView({
17694
17933
  return /* @__PURE__ */ jsxRuntime.jsx(ChartGaugeNode, { node: resolvedNode, active, stateValues });
17695
17934
  case "chart-stacked-bar":
17696
17935
  return /* @__PURE__ */ jsxRuntime.jsx(ChartStackedBarNode, { node: resolvedNode, active, stateValues });
17936
+ case "chart-slope":
17937
+ return /* @__PURE__ */ jsxRuntime.jsx(
17938
+ ChartSlopeNode,
17939
+ {
17940
+ node: resolvedNode,
17941
+ active,
17942
+ stateValues,
17943
+ drawing,
17944
+ progress
17945
+ }
17946
+ );
17697
17947
  case "chart-waffle":
17698
17948
  return /* @__PURE__ */ jsxRuntime.jsx(ChartWaffleNode, { node: resolvedNode, active, stateValues });
17699
17949
  case "chart-stat":