@cardenelabs/cdl 0.72.0 → 0.74.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 +68 -1
- package/dist/index.cjs +77 -23
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +77 -23
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +137 -83
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +137 -83
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
- package/src/kinds/shape-blockchain.tsx +58 -12
- package/src/kinds/shape-region.tsx +113 -7
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,71 @@ CDL (Chainome Diagram Language) の主要変更履歴。
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.74.0] - 2026-09-26
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- **縮めた絵の字の打ち消しに共通の上限の仕組みを置いた** (#886 / #889)
|
|
13
|
+
|
|
14
|
+
0.73.0 で連鎖の箱 (`shape-blockchain-block`) に入れた打ち消しを、絵が使い回せる形へ出した。
|
|
15
|
+
|
|
16
|
+
```ts
|
|
17
|
+
打ち消しの倍率(倍率, [{ text, size, letterSpacing, 帯: { 幅, 高さ } }])
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
絵が「その字が座る場所の広さ」 を渡し、上限を **幅と高さの両方から出して小さい方を採る**。
|
|
21
|
+
0.73.0 は高さ 2 本 (行の間隔 22 と見出しの帯 32) からしか出しておらず、中央揃えの看板の
|
|
22
|
+
ように幅が字数に比例して伸びる字を横へ出す形だった。
|
|
23
|
+
|
|
24
|
+
| 軸 | 8 割で止めるか | 理由 |
|
|
25
|
+
|---|---|---|
|
|
26
|
+
| 高さ | 止める | 帯の高さは次の行までの距離で、そのまま使うと上下が触れる |
|
|
27
|
+
| 幅 | 止めない | 絵が余白を引いた内側の幅を渡すので、8 割にすると字を切る予算より狭い所で止まる |
|
|
28
|
+
|
|
29
|
+
帯に収まっていない字がある絵では 1 を返す (打ち消すと確実に外へ出る)。
|
|
30
|
+
実測 = 判子の中の `印` は半径 8 の丸に収まる四角の 1 辺 11.3 を指定 10 の 1 字でほぼ
|
|
31
|
+
使い切っており、幅から出る上限が 1 を下回る。
|
|
32
|
+
|
|
33
|
+
連鎖の箱をこの仕組みに乗せ替えた。 幅の上限が加わったぶん、強く縮めた箱での打ち消しが
|
|
34
|
+
1.6 倍から 1.43 倍に下がる。 代わりに 240x220 と 400x400 の箱で 3 行目の値が切れなくなった
|
|
35
|
+
(小さい箱では切れたままで、そちらは #885 が持つ)。
|
|
36
|
+
|
|
37
|
+
**包みに印を付けた** (`data-cdl-art-fit`)。 `scale(` を持つ変換は絵の縮小だけではない =
|
|
38
|
+
`event` は目立たせるための脈動を `scale(0.78)` から `scale(1)` で描いており、
|
|
39
|
+
変換を正規表現で探す形だとその脈動まで絵の縮小として数える (実測で 16 件目に出た)。
|
|
40
|
+
|
|
41
|
+
打ち消した字にも印を付けた (`data-cdl-counter-scaled`)。
|
|
42
|
+
実物を描いて打ち消しが行き渡っていない種別を数える検査がこの印を読む。
|
|
43
|
+
残りの 14 種別を乗せるのは #887。
|
|
44
|
+
|
|
45
|
+
## [0.73.0] - 2026-09-26
|
|
46
|
+
|
|
47
|
+
### Fixed
|
|
48
|
+
|
|
49
|
+
- **縮めた絵の中の字を指定どおりの大きさで描くようにした** (#871 / #884)
|
|
50
|
+
|
|
51
|
+
入れ子の絵は決まった大きさで組んでから、箱に収まる倍率で丸ごと縮めている。
|
|
52
|
+
字も一緒に縮むので、指定した大きさより小さく描かれていた。
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
<g transform="translate(288.07 59.79) scale(0.7190297684674752)">
|
|
56
|
+
ハッシュ / 直前 / 木の根 / ノンス 指定 10.5 × 0.719 = 実効 7.55
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
包む側 (`fitArt`) が倍率を絵へ渡せるようにした。
|
|
60
|
+
関数を渡さない絵は今までどおり縮むだけで、1 つも描き方が変わらない。
|
|
61
|
+
|
|
62
|
+
**包む側で一律に打ち消さない** = 絵が自分で計算している「その字が収まる幅」 が指定の
|
|
63
|
+
大きさのまま残り、字だけ大きくなって切った字が枠から出る。
|
|
64
|
+
打ち消すかどうかは絵に決めさせる。
|
|
65
|
+
|
|
66
|
+
連鎖の箱 (`shape-blockchain-block`) を打ち消す側にした。
|
|
67
|
+
幅の予算も打ち消した後の大きさで計算する。
|
|
68
|
+
|
|
69
|
+
上限は絵の中の帯から出す。
|
|
70
|
+
5 行は 22 ずつ空けて並び、見出しは高さ 32 の帯に乗るので、字がその 8 割を超えると
|
|
71
|
+
上下の行や帯の縁に触れる。 小さいほうを採って 1.6 倍で止める。
|
|
72
|
+
|
|
8
73
|
## [0.72.0] - 2026-09-26
|
|
9
74
|
|
|
10
75
|
### Fixed
|
|
@@ -3024,7 +3089,9 @@ Initial OSS release.
|
|
|
3024
3089
|
使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
|
|
3025
3090
|
行き止まりになる。
|
|
3026
3091
|
|
|
3027
|
-
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.
|
|
3092
|
+
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.74.0...HEAD
|
|
3093
|
+
[0.74.0]: https://github.com/cardene777/cdl/compare/v0.73.0...v0.74.0
|
|
3094
|
+
[0.73.0]: https://github.com/cardene777/cdl/compare/v0.72.0...v0.73.0
|
|
3028
3095
|
[0.72.0]: https://github.com/cardene777/cdl/compare/v0.71.0...v0.72.0
|
|
3029
3096
|
[0.71.0]: https://github.com/cardene777/cdl/compare/v0.70.0...v0.71.0
|
|
3030
3097
|
[0.70.0]: https://github.com/cardene777/cdl/compare/v0.69.0...v0.70.0
|
package/dist/index.cjs
CHANGED
|
@@ -14596,20 +14596,52 @@ function fitLabel(band, block, pos) {
|
|
|
14596
14596
|
};
|
|
14597
14597
|
}
|
|
14598
14598
|
function fitArt(region, extent, art) {
|
|
14599
|
+
const \u7D44\u3080 = (k) => typeof art === "function" ? art(k) : art;
|
|
14599
14600
|
const \u7E26 = extent.\u4E0A + extent.\u4E0B;
|
|
14600
14601
|
const \u6A2A = extent.\u5DE6 + extent.\u53F3;
|
|
14601
|
-
if (!Number.isFinite(\u7E26) || !Number.isFinite(\u6A2A) || \u7E26 <= 0 || \u6A2A <= 0) return
|
|
14602
|
+
if (!Number.isFinite(\u7E26) || !Number.isFinite(\u6A2A) || \u7E26 <= 0 || \u6A2A <= 0) return \u7D44\u3080(1);
|
|
14602
14603
|
if (!Number.isFinite(region.availH) || !Number.isFinite(region.availW) || region.availH <= 0 || region.availW <= 0) {
|
|
14603
|
-
return
|
|
14604
|
+
return \u7D44\u3080(1);
|
|
14604
14605
|
}
|
|
14605
14606
|
const s = Math.min(1, region.availH / \u7E26, region.availW / \u6A2A);
|
|
14606
|
-
if (!Number.isFinite(s) || s <= 0) return
|
|
14607
|
+
if (!Number.isFinite(s) || s <= 0) return \u7D44\u3080(1);
|
|
14607
14608
|
const \u7D75cx = region.cx + (extent.\u53F3 - extent.\u5DE6) / 2;
|
|
14608
14609
|
const \u7D75cy = region.cy + (extent.\u4E0B - extent.\u4E0A) / 2;
|
|
14609
14610
|
const dx = region.cx - s * \u7D75cx;
|
|
14610
14611
|
const dy = region.cy - s * \u7D75cy;
|
|
14611
|
-
if (s >= 1 && dx === 0 && dy === 0) return
|
|
14612
|
-
return
|
|
14612
|
+
if (s >= 1 && dx === 0 && dy === 0) return \u7D44\u3080(1);
|
|
14613
|
+
return (
|
|
14614
|
+
/*
|
|
14615
|
+
* 包みに印を付ける (#886)。 **`scale(` を持つ変換は他にもある** = `event` は目立たせる
|
|
14616
|
+
* ための脈動を `scale(0.78)` から `scale(1)` で描き、絵を箱に収める縮小ではない。
|
|
14617
|
+
* 祖先の変換を正規表現で見る形だと、その脈動まで「絵の縮小」 として数える。
|
|
14618
|
+
*/
|
|
14619
|
+
/* @__PURE__ */ jsxRuntime.jsx("g", { "data-cdl-art-fit": "1", transform: `translate(${dx} ${dy}) scale(${s})`, children: \u7D44\u3080(s) })
|
|
14620
|
+
);
|
|
14621
|
+
}
|
|
14622
|
+
var \u5E2F\u306E\u9AD8\u3055\u306B\u5BFE\u3059\u308B\u4E0A\u9650 = 0.8;
|
|
14623
|
+
function \u7D75\u306E\u4E2D\u306E\u5B57\u306E\u5E45(text, size, letterSpacing = 0) {
|
|
14624
|
+
return Math.max(
|
|
14625
|
+
displayWidth(text) * size * MONO_ADVANCE_RATIO,
|
|
14626
|
+
textWidth(text, size, letterSpacing)
|
|
14627
|
+
);
|
|
14628
|
+
}
|
|
14629
|
+
function \u6253\u3061\u6D88\u3057\u306E\u500D\u7387(\u500D\u7387, \u5B57\u3089) {
|
|
14630
|
+
const \u623B\u3057 = Number.isFinite(\u500D\u7387) && \u500D\u7387 > 0 ? 1 / \u500D\u7387 : 1;
|
|
14631
|
+
let \u4E0A\u9650 = Number.POSITIVE_INFINITY;
|
|
14632
|
+
for (const \u5B572 of \u5B57\u3089) {
|
|
14633
|
+
if (!(Number.isFinite(\u5B572.size) && \u5B572.size > 0)) continue;
|
|
14634
|
+
const { \u5E45, \u9AD8\u3055 } = \u5B572.\u5E2F;
|
|
14635
|
+
if (Number.isFinite(\u9AD8\u3055) && \u9AD8\u3055 > 0) {
|
|
14636
|
+
\u4E0A\u9650 = Math.min(\u4E0A\u9650, \u9AD8\u3055 * \u5E2F\u306E\u9AD8\u3055\u306B\u5BFE\u3059\u308B\u4E0A\u9650 / \u5B572.size);
|
|
14637
|
+
}
|
|
14638
|
+
const \u5B9F\u5E45 = \u7D75\u306E\u4E2D\u306E\u5B57\u306E\u5E45(\u5B572.text, \u5B572.size, \u5B572.letterSpacing ?? 0);
|
|
14639
|
+
if (Number.isFinite(\u5E45) && \u5E45 > 0 && \u5B9F\u5E45 > 0) {
|
|
14640
|
+
\u4E0A\u9650 = Math.min(\u4E0A\u9650, \u5E45 / \u5B9F\u5E45);
|
|
14641
|
+
}
|
|
14642
|
+
}
|
|
14643
|
+
if (!Number.isFinite(\u4E0A\u9650)) return 1;
|
|
14644
|
+
return Math.max(1, Math.min(\u623B\u3057, \u4E0A\u9650));
|
|
14613
14645
|
}
|
|
14614
14646
|
|
|
14615
14647
|
// src/render/tone.ts
|
|
@@ -29843,6 +29875,11 @@ var SMART_CONTRACT_W = 220;
|
|
|
29843
29875
|
var SMART_CONTRACT_H = 220;
|
|
29844
29876
|
var BLOCK_W = 240;
|
|
29845
29877
|
var BLOCK_H = 220;
|
|
29878
|
+
var \u898B\u51FA\u3057\u306E\u5B57 = 13;
|
|
29879
|
+
var \u540D\u306E\u5B57 = 10.5;
|
|
29880
|
+
var \u5024\u306E\u5B57 = 11;
|
|
29881
|
+
var \u884C\u306E\u9593\u9694 = 22;
|
|
29882
|
+
var \u898B\u51FA\u3057\u306E\u5E2F = 32;
|
|
29846
29883
|
var BLOCK_SHADOW = 6;
|
|
29847
29884
|
var NFT_W = 220;
|
|
29848
29885
|
var NFT_H = 240;
|
|
@@ -29989,7 +30026,7 @@ function ShapeSmartContractNode({ node, active, lang }) {
|
|
|
29989
30026
|
bottomLabel2(node, r.cx, r.label)
|
|
29990
30027
|
] });
|
|
29991
30028
|
}
|
|
29992
|
-
var \u5B57\u306E\u5E45 = (text, size) =>
|
|
30029
|
+
var \u5B57\u306E\u5E45 = (text, size) => \u7D75\u306E\u4E2D\u306E\u5B57\u306E\u5E45(text, size);
|
|
29993
30030
|
var BLOCK_DEFAULT_FIELDS = [
|
|
29994
30031
|
{ key: "hash", label: "blockchainBlock.hash", value: { text: "0xaf31c9d2..." } },
|
|
29995
30032
|
{ key: "prev", label: "blockchainBlock.prev", value: { text: "0x7b3f92c1..." } },
|
|
@@ -30018,23 +30055,40 @@ function ShapeBlockchainBlockNode({ node, active, lang }) {
|
|
|
30018
30055
|
};
|
|
30019
30056
|
});
|
|
30020
30057
|
const \u898B\u51FA\u3057\u306E\u5E45 = bw - 14 - 30;
|
|
30021
|
-
const
|
|
30022
|
-
|
|
30023
|
-
|
|
30024
|
-
|
|
30025
|
-
|
|
30026
|
-
|
|
30027
|
-
|
|
30028
|
-
|
|
30029
|
-
|
|
30030
|
-
|
|
30031
|
-
|
|
30032
|
-
|
|
30033
|
-
|
|
30034
|
-
|
|
30035
|
-
|
|
30036
|
-
|
|
30037
|
-
|
|
30058
|
+
const \u6253\u3061\u6D88\u3059\u5B57\u3089 = [
|
|
30059
|
+
{ text: \u898B\u51FA\u3057, size: \u898B\u51FA\u3057\u306E\u5B57, \u5E2F: { \u5E45: \u898B\u51FA\u3057\u306E\u5E45, \u9AD8\u3055: \u898B\u51FA\u3057\u306E\u5E2F } },
|
|
30060
|
+
...fields.flatMap((f) => [
|
|
30061
|
+
{ text: f.label, size: \u540D\u306E\u5B57, \u5E2F: { \u5E45: bw - 28, \u9AD8\u3055: \u884C\u306E\u9593\u9694 } },
|
|
30062
|
+
{
|
|
30063
|
+
text: f.value,
|
|
30064
|
+
size: \u5024\u306E\u5B57,
|
|
30065
|
+
\u5E2F: { \u5E45: bw - 28 - \u5B57\u306E\u5E45(f.label, \u540D\u306E\u5B57) - 8, \u9AD8\u3055: \u884C\u306E\u9593\u9694 }
|
|
30066
|
+
}
|
|
30067
|
+
])
|
|
30068
|
+
];
|
|
30069
|
+
const art = (\u500D\u7387) => {
|
|
30070
|
+
const \u500D = \u6253\u3061\u6D88\u3057\u306E\u500D\u7387(\u500D\u7387, \u6253\u3061\u6D88\u3059\u5B57\u3089);
|
|
30071
|
+
const \u984C\u306E\u5927\u304D\u3055 = \u898B\u51FA\u3057\u306E\u5B57 * \u500D;
|
|
30072
|
+
const \u540D\u306E\u5927\u304D\u3055 = \u540D\u306E\u5B57 * \u500D;
|
|
30073
|
+
const \u5024\u306E\u5927\u304D\u3055 = \u5024\u306E\u5B57 * \u500D;
|
|
30074
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
|
|
30075
|
+
/* @__PURE__ */ jsxRuntime.jsx("rect", { x: x + 6, y: y + 6, width: bw, height: bh, rx: 8, fill: frame.stroke, opacity: 0.2, stroke: "none" }),
|
|
30076
|
+
/* @__PURE__ */ jsxRuntime.jsx("rect", { "data-cdl-role": "node-body", x, y, width: bw, height: bh, rx: 8, ...frame }),
|
|
30077
|
+
/* @__PURE__ */ jsxRuntime.jsx("path", { d: `M ${x} ${y + 32} L ${x} ${y + 8} Q ${x} ${y}, ${x + 8} ${y} L ${x + bw - 8} ${y} Q ${x + bw} ${y}, ${x + bw} ${y + 8} L ${x + bw} ${y + 32} Z`, fill: "var(--cdl-tone-accent, #2d6a8f)", fillOpacity: 0.9, stroke: "none" }),
|
|
30078
|
+
/* @__PURE__ */ jsxRuntime.jsx("text", { "data-cdl-role": "blockchain-block-title", "data-cdl-counter-scaled": "1", x: x + 14, y: y + 22, fontSize: \u984C\u306E\u5927\u304D\u3055, fontWeight: 700, fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", fill: "#ffffff", children: \u5E45\u3067\u5207\u308B(\u898B\u51FA\u3057, \u984C\u306E\u5927\u304D\u3055, \u898B\u51FA\u3057\u306E\u5E45, \u5B57\u306E\u5E45) }),
|
|
30079
|
+
/* @__PURE__ */ jsxRuntime.jsx("circle", { cx: x + bw - 16, cy: y + 16, r: 5.5, fill: "#7cd88f", stroke: "#ffffff", strokeWidth: 1.5 }),
|
|
30080
|
+
fields.map((f, i) => /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
|
|
30081
|
+
/* @__PURE__ */ jsxRuntime.jsx("text", { "data-cdl-counter-scaled": "1", x: x + 14, y: y + 54 + i * \u884C\u306E\u9593\u9694, fontSize: \u540D\u306E\u5927\u304D\u3055, fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", fill: "var(--cdl-text-dim, #5a6270)", children: f.label }),
|
|
30082
|
+
/* @__PURE__ */ jsxRuntime.jsx("text", { "data-cdl-role": `blockchain-block-${f.key}`, "data-cdl-counter-scaled": "1", x: x + bw - 14, y: y + 54 + i * \u884C\u306E\u9593\u9694, fontSize: \u5024\u306E\u5927\u304D\u3055, fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", fontWeight: 600, textAnchor: "end", fill: "var(--cdl-text, #1a1f2a)", children: \u5E45\u3067\u5207\u308B(f.value, \u5024\u306E\u5927\u304D\u3055, bw - 28 - \u5B57\u306E\u5E45(f.label, \u540D\u306E\u5927\u304D\u3055) - 8, \u5B57\u306E\u5E45) }),
|
|
30083
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: x + 14, y1: y + 60 + i * \u884C\u306E\u9593\u9694, x2: x + bw - 14, y2: y + 60 + i * \u884C\u306E\u9593\u9694, stroke: "var(--cdl-divider, #d4d4d8)", strokeWidth: 0.5, opacity: 0.5 })
|
|
30084
|
+
] }, i)),
|
|
30085
|
+
/* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${cx - 32}, ${y + bh - 26})`, children: [
|
|
30086
|
+
/* @__PURE__ */ jsxRuntime.jsx("rect", { x: 0, y: 0, width: 22, height: 18, rx: 3, fill: "none", stroke: frame.stroke, strokeWidth: 1.5 }),
|
|
30087
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: 22, y1: 9, x2: 42, y2: 9, stroke: frame.stroke, strokeWidth: 1.5 }),
|
|
30088
|
+
/* @__PURE__ */ jsxRuntime.jsx("rect", { x: 42, y: 0, width: 22, height: 18, rx: 3, fill: "var(--cdl-tone-accent, #2d6a8f)", fillOpacity: 0.5, stroke: frame.stroke, strokeWidth: 1.5 })
|
|
30089
|
+
] })
|
|
30090
|
+
] });
|
|
30091
|
+
};
|
|
30038
30092
|
return /* @__PURE__ */ jsxRuntime.jsx("g", { children: fitArt(r, blockchainBlockExtent(frame.strokeWidth), art) });
|
|
30039
30093
|
}
|
|
30040
30094
|
function ShapeBlockchainNode({ node, active }) {
|