@cardenelabs/cdl 0.40.1 → 0.40.2
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 +24 -1
- package/dist/index.cjs +56 -34
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +56 -34
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +56 -34
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +56 -34
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
- package/src/kinds/chart-pie.tsx +46 -4
- package/src/kinds/chart-slope.tsx +1 -65
- package/src/kinds/label-stack.ts +77 -0
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,28 @@ CDL (Chainome Diagram Language) の主要変更履歴。
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.40.2] - 2026-09-07
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- **円グラフで小さい取り分が続くと名札が重なるのを直した** (#727)
|
|
13
|
+
|
|
14
|
+
名札 (割合と名前) は扇の中央角の向きに置いていたので、**角度が近い扇が続くと同じ場所に
|
|
15
|
+
印字されて読めなかった**。 実測で 0.3% の小片 2 個が完全に重なり、割合の字 (級 19 の
|
|
16
|
+
太字) が真っ黒な塊になっていた。 小片を 5 個にすると重なりは 20 組に増える。
|
|
17
|
+
件数 12 の図でも上部の `5.4%` と `5.9%` がぶつかっていた。
|
|
18
|
+
|
|
19
|
+
**縦は重なりをほどく**。 傾き図で入れたのと同じ形 (#723) で、重なった連なりを元の位置の
|
|
20
|
+
平均を中心にして等間隔に置き直す。 ほどきの計算は `kinds/label-stack.ts` に移して
|
|
21
|
+
傾き図と共用する。
|
|
22
|
+
|
|
23
|
+
**横は左右の列に揃える**。 角度から決めたままだと、縦をずらした名札が円の上へ乗る。
|
|
24
|
+
引き出し線の肘も列の手前に置くので、線が円を横切らない。
|
|
25
|
+
|
|
26
|
+
扇と縁の点は動かさない = どの扇の名札かは引き出し線と縁の色の点が示す。
|
|
27
|
+
|
|
28
|
+
段の `draw` の途中でも名札は動かない。 まだ開いていない扇も数に入れてほどくため。
|
|
29
|
+
|
|
8
30
|
## [0.40.1] - 2026-09-07
|
|
9
31
|
|
|
10
32
|
### Fixed
|
|
@@ -1801,7 +1823,8 @@ Initial OSS release.
|
|
|
1801
1823
|
使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
|
|
1802
1824
|
行き止まりになる。
|
|
1803
1825
|
|
|
1804
|
-
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.40.
|
|
1826
|
+
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.40.2...HEAD
|
|
1827
|
+
[0.40.2]: https://github.com/cardene777/cdl/compare/v0.40.1...v0.40.2
|
|
1805
1828
|
[0.40.1]: https://github.com/cardene777/cdl/compare/v0.40.0...v0.40.1
|
|
1806
1829
|
[0.40.0]: https://github.com/cardene777/cdl/compare/v0.39.0...v0.40.0
|
|
1807
1830
|
[0.39.0]: https://github.com/cardene777/cdl/compare/v0.38.0...v0.39.0
|
package/dist/index.cjs
CHANGED
|
@@ -24358,6 +24358,38 @@ function interpolateColor(template, stateValues, fallback) {
|
|
|
24358
24358
|
if (!template) return fallback;
|
|
24359
24359
|
return interpolate(template, stateValues);
|
|
24360
24360
|
}
|
|
24361
|
+
|
|
24362
|
+
// src/kinds/label-stack.ts
|
|
24363
|
+
function \u540D\u672D\u306E\u6BB5\u3092\u307B\u3069\u304F(\u771F\u306Ey, \u9593\u9694, \u4E0A\u9650, \u4E0B\u9650) {
|
|
24364
|
+
const \u4EF6\u6570 = \u771F\u306Ey.length;
|
|
24365
|
+
if (\u4EF6\u6570 === 0) return [];
|
|
24366
|
+
const \u4E26\u3073 = \u771F\u306Ey.map((y, i) => ({ y, i })).sort((a, b) => a.y - b.y || a.i - b.i);
|
|
24367
|
+
const \u7D50\u679C = new Array(\u4EF6\u6570);
|
|
24368
|
+
if (\u9593\u9694 * (\u4EF6\u6570 - 1) > \u4E0B\u9650 - \u4E0A\u9650) {
|
|
24369
|
+
\u4E26\u3073.forEach((e, k) => {
|
|
24370
|
+
\u7D50\u679C[e.i] = \u4EF6\u6570 > 1 ? \u4E0A\u9650 + (\u4E0B\u9650 - \u4E0A\u9650) / (\u4EF6\u6570 - 1) * k : (\u4E0A\u9650 + \u4E0B\u9650) / 2;
|
|
24371
|
+
});
|
|
24372
|
+
return \u7D50\u679C;
|
|
24373
|
+
}
|
|
24374
|
+
const \u584A\u305F\u3061 = [];
|
|
24375
|
+
\u4E26\u3073.forEach((e, k) => {
|
|
24376
|
+
\u584A\u305F\u3061.push({ \u5408\u8A08: e.y - \u9593\u9694 * k, \u4EF6\u6570: 1 });
|
|
24377
|
+
while (\u584A\u305F\u3061.length >= 2) {
|
|
24378
|
+
const \u5F8C = \u584A\u305F\u3061[\u584A\u305F\u3061.length - 1];
|
|
24379
|
+
const \u524D = \u584A\u305F\u3061[\u584A\u305F\u3061.length - 2];
|
|
24380
|
+
if (\u524D.\u5408\u8A08 / \u524D.\u4EF6\u6570 <= \u5F8C.\u5408\u8A08 / \u5F8C.\u4EF6\u6570) break;
|
|
24381
|
+
\u584A\u305F\u3061.splice(\u584A\u305F\u3061.length - 2, 2, { \u5408\u8A08: \u524D.\u5408\u8A08 + \u5F8C.\u5408\u8A08, \u4EF6\u6570: \u524D.\u4EF6\u6570 + \u5F8C.\u4EF6\u6570 });
|
|
24382
|
+
}
|
|
24383
|
+
});
|
|
24384
|
+
const \u307B\u3069\u3044\u305F = [];
|
|
24385
|
+
\u584A\u305F\u3061.forEach((\u584A) => {
|
|
24386
|
+
const \u5E73\u5747 = \u584A.\u5408\u8A08 / \u584A.\u4EF6\u6570;
|
|
24387
|
+
for (let j = 0; j < \u584A.\u4EF6\u6570; j++) \u307B\u3069\u3044\u305F.push(\u5E73\u5747 + \u9593\u9694 * \u307B\u3069\u3044\u305F.length);
|
|
24388
|
+
});
|
|
24389
|
+
const \u305A\u308C = Math.max(0, \u4E0A\u9650 - \u307B\u3069\u3044\u305F[0]) - Math.max(0, \u307B\u3069\u3044\u305F[\u4EF6\u6570 - 1] - \u4E0B\u9650);
|
|
24390
|
+
\u4E26\u3073.forEach((e, k) => \u7D50\u679C[e.i] = \u307B\u3069\u3044\u305F[k] + \u305A\u308C);
|
|
24391
|
+
return \u7D50\u679C;
|
|
24392
|
+
}
|
|
24361
24393
|
function \u6247\u5F62\u306E\u5207\u308A\u629C\u304D(cx, cy, r, \u958B\u304D, \u8D77\u70B9 = -Math.PI / 2, \u5168\u5468 = Math.PI * 2) {
|
|
24362
24394
|
if (\u958B\u304D <= 0) return null;
|
|
24363
24395
|
if (\u958B\u304D >= 1 && \u5168\u5468 >= Math.PI * 2) return /* @__PURE__ */ jsxRuntime.jsx("circle", { cx, cy, r });
|
|
@@ -24438,6 +24470,26 @@ function ChartPieNode({
|
|
|
24438
24470
|
const \u5207\u308A\u629C\u304Did = `cdl-pie-draw-${instanceId}`;
|
|
24439
24471
|
const \u5F71id = `cdl-pie-shadow-${instanceId}`;
|
|
24440
24472
|
const \u958B\u304D\u59CB\u3081\u305F = (startFrac) => !drawing || \u958B\u304D > startFrac;
|
|
24473
|
+
const \u540D\u672D\u306E\u884C = \u5272\u5408\u306E\u7D1A + \u540D\u524D\u306E\u7D1A + 3;
|
|
24474
|
+
const \u540D\u672D\u306E\u5074 = slices.map((s) => Math.cos(s.\u4E2D\u592E\u89D2) >= 0);
|
|
24475
|
+
const \u540D\u672D\u306E\u771F\u306Ey = slices.map((s) => cy + (radius + \u5F15\u304D\u51FA\u3057) * Math.sin(s.\u4E2D\u592E\u89D2));
|
|
24476
|
+
const \u540D\u672D\u306Ey = (() => {
|
|
24477
|
+
const \u51FA\u3059 = [...\u540D\u672D\u306E\u771F\u306Ey];
|
|
24478
|
+
for (const \u5074 of [true, false]) {
|
|
24479
|
+
const \u756A\u53F7 = \u540D\u672D\u306E\u5074.flatMap((\u53F3, i) => \u53F3 === \u5074 ? [i] : []);
|
|
24480
|
+
if (\u756A\u53F7.length === 0) continue;
|
|
24481
|
+
const \u76F4\u3057\u305F = \u540D\u672D\u306E\u6BB5\u3092\u307B\u3069\u304F(
|
|
24482
|
+
\u756A\u53F7.map((i) => \u540D\u672D\u306E\u771F\u306Ey[i]),
|
|
24483
|
+
\u540D\u672D\u306E\u884C,
|
|
24484
|
+
PAD_TOP2 + \u540D\u672D\u306E\u7E26\u306E\u5F35\u308A\u51FA\u3057,
|
|
24485
|
+
node.h - PAD_BOTTOM2 - \u540D\u672D\u306E\u7E26\u306E\u5F35\u308A\u51FA\u3057
|
|
24486
|
+
);
|
|
24487
|
+
\u756A\u53F7.forEach((i, k) => \u51FA\u3059[i] = \u76F4\u3057\u305F[k]);
|
|
24488
|
+
}
|
|
24489
|
+
return \u51FA\u3059;
|
|
24490
|
+
})();
|
|
24491
|
+
const \u8098\u306Ex = (\u53F3) => cx + (\u53F3 ? 1 : -1) * (radius + \u5F15\u304D\u51FA\u3057);
|
|
24492
|
+
const \u5B57\u306Ex = (\u53F3) => \u8098\u306Ex(\u53F3) + (\u53F3 ? \u5B57\u307E\u3067\u306E\u9593 : -\u5B57\u307E\u3067\u306E\u9593);
|
|
24441
24493
|
return /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${x0} ${y0})`, children: [
|
|
24442
24494
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
24443
24495
|
"rect",
|
|
@@ -24510,12 +24562,12 @@ function ChartPieNode({
|
|
|
24510
24562
|
),
|
|
24511
24563
|
slices.map((s, idx) => {
|
|
24512
24564
|
if (!\u958B\u304D\u59CB\u3081\u305F(s.startFrac)) return null;
|
|
24513
|
-
const \u53F3 =
|
|
24565
|
+
const \u53F3 = \u540D\u672D\u306E\u5074[idx];
|
|
24514
24566
|
const \u7E01x = cx + radius * Math.cos(s.\u4E2D\u592E\u89D2);
|
|
24515
24567
|
const \u7E01y = cy + radius * Math.sin(s.\u4E2D\u592E\u89D2);
|
|
24516
|
-
const \u6298\u308Cx =
|
|
24517
|
-
const \u6298\u308Cy =
|
|
24518
|
-
const \u5B57x = \
|
|
24568
|
+
const \u6298\u308Cx = \u8098\u306Ex(\u53F3);
|
|
24569
|
+
const \u6298\u308Cy = \u540D\u672D\u306Ey[idx];
|
|
24570
|
+
const \u5B57x = \u5B57\u306Ex(\u53F3);
|
|
24519
24571
|
return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
|
|
24520
24572
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
24521
24573
|
"path",
|
|
@@ -25528,36 +25580,6 @@ function \u4E00\u89A7\u306E\u4E26\u3073(data, \u5DE6, \u53F3\u7AEF, \u7D1A) {
|
|
|
25528
25580
|
return out;
|
|
25529
25581
|
}
|
|
25530
25582
|
var \u7DDA\u306E\u6700\u5C0F\u5E45 = 120;
|
|
25531
|
-
function \u540D\u672D\u306E\u6BB5\u3092\u307B\u3069\u304F(\u771F\u306Ey, \u9593\u9694, \u4E0A\u9650, \u4E0B\u9650) {
|
|
25532
|
-
const \u4EF6\u6570 = \u771F\u306Ey.length;
|
|
25533
|
-
if (\u4EF6\u6570 === 0) return [];
|
|
25534
|
-
const \u4E26\u3073 = \u771F\u306Ey.map((y, i) => ({ y, i })).sort((a, b) => a.y - b.y || a.i - b.i);
|
|
25535
|
-
const \u7D50\u679C = new Array(\u4EF6\u6570);
|
|
25536
|
-
if (\u9593\u9694 * (\u4EF6\u6570 - 1) > \u4E0B\u9650 - \u4E0A\u9650) {
|
|
25537
|
-
\u4E26\u3073.forEach((e, k) => {
|
|
25538
|
-
\u7D50\u679C[e.i] = \u4EF6\u6570 > 1 ? \u4E0A\u9650 + (\u4E0B\u9650 - \u4E0A\u9650) / (\u4EF6\u6570 - 1) * k : (\u4E0A\u9650 + \u4E0B\u9650) / 2;
|
|
25539
|
-
});
|
|
25540
|
-
return \u7D50\u679C;
|
|
25541
|
-
}
|
|
25542
|
-
const \u584A\u305F\u3061 = [];
|
|
25543
|
-
\u4E26\u3073.forEach((e, k) => {
|
|
25544
|
-
\u584A\u305F\u3061.push({ \u5408\u8A08: e.y - \u9593\u9694 * k, \u4EF6\u6570: 1 });
|
|
25545
|
-
while (\u584A\u305F\u3061.length >= 2) {
|
|
25546
|
-
const \u5F8C = \u584A\u305F\u3061[\u584A\u305F\u3061.length - 1];
|
|
25547
|
-
const \u524D = \u584A\u305F\u3061[\u584A\u305F\u3061.length - 2];
|
|
25548
|
-
if (\u524D.\u5408\u8A08 / \u524D.\u4EF6\u6570 <= \u5F8C.\u5408\u8A08 / \u5F8C.\u4EF6\u6570) break;
|
|
25549
|
-
\u584A\u305F\u3061.splice(\u584A\u305F\u3061.length - 2, 2, { \u5408\u8A08: \u524D.\u5408\u8A08 + \u5F8C.\u5408\u8A08, \u4EF6\u6570: \u524D.\u4EF6\u6570 + \u5F8C.\u4EF6\u6570 });
|
|
25550
|
-
}
|
|
25551
|
-
});
|
|
25552
|
-
const \u307B\u3069\u3044\u305F = [];
|
|
25553
|
-
\u584A\u305F\u3061.forEach((\u584A) => {
|
|
25554
|
-
const \u5E73\u5747 = \u584A.\u5408\u8A08 / \u584A.\u4EF6\u6570;
|
|
25555
|
-
for (let j = 0; j < \u584A.\u4EF6\u6570; j++) \u307B\u3069\u3044\u305F.push(\u5E73\u5747 + \u9593\u9694 * \u307B\u3069\u3044\u305F.length);
|
|
25556
|
-
});
|
|
25557
|
-
const \u305A\u308C = Math.max(0, \u4E0A\u9650 - \u307B\u3069\u3044\u305F[0]) - Math.max(0, \u307B\u3069\u3044\u305F[\u4EF6\u6570 - 1] - \u4E0B\u9650);
|
|
25558
|
-
\u4E26\u3073.forEach((e, k) => \u7D50\u679C[e.i] = \u307B\u3069\u3044\u305F[k] + \u305A\u308C);
|
|
25559
|
-
return \u7D50\u679C;
|
|
25560
|
-
}
|
|
25561
25583
|
function ChartSlopeNode({
|
|
25562
25584
|
node,
|
|
25563
25585
|
active,
|