@cardenelabs/cdl 0.55.0 → 0.57.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 +30 -1
- package/dist/index.cjs +74 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +74 -3
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +74 -3
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +74 -3
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
- package/src/kinds/card.tsx +27 -7
- package/src/kinds/compact-title.ts +2 -2
- package/src/kinds/subtitle-lines.ts +99 -0
- package/src/kinds/user-journey.tsx +9 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,33 @@ CDL (Chainome Diagram Language) の主要変更履歴。
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.57.0] - 2026-09-11
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- **箱の説明文が幅に入らない時、字を縮めずに 2 行へ折るようにした** (#843)
|
|
13
|
+
|
|
14
|
+
説明文 (`subtitle`) は幅に入らないと字を 21 から 11 まで小さくして 1 行に収めていた。 下限まで縮むと、
|
|
15
|
+
同じ図の中で同じ役割の字が 2 倍近く違って見える (実測 = 状態図で 待機 の説明文が 19、読み込み が 11)。
|
|
16
|
+
|
|
17
|
+
読みやすさの下限 (12) を割る時は 2 行に折る。 折る位置は ` / ` のような区切りを優先し、無ければ空白、
|
|
18
|
+
それも無ければ字の境目で割る。 2 行にしても入らない時と、2 行を置く余白が無い低い箱は、今までどおり
|
|
19
|
+
縮めて 1 行で描く。
|
|
20
|
+
|
|
21
|
+
箱の幅と高さは変えていない。 幅を広げると状態を横に並べる図が横長になり、器に収めた時に題名の方が
|
|
22
|
+
小さくなるため (#357 で幅を絞った経緯)。 2 行は、説明文の下の余白と題名との間に収める。
|
|
23
|
+
|
|
24
|
+
## [0.56.0] - 2026-09-11
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
|
|
28
|
+
- **ユーザージャーニーの気持ちの行の名前を、日本語で描くようにした** (#841)
|
|
29
|
+
|
|
30
|
+
気持ちの曲線の左に並ぶ 5 段の行は、型の値 (`delighted` `happy` `neutral` `frustrated` `angry`) を
|
|
31
|
+
そのまま描いていた。 書き手の入力ではなく描く側が足す字なので、日本語の図でも英語の 5 語が並んでいた。
|
|
32
|
+
行の字を 大満足 / 満足 / ふつう / 不満 / 怒り に引き替える。 型の値は書き手が記法と組み立て API に書く値なので
|
|
33
|
+
変えていない。 絵文字と行の色も変えていない。
|
|
34
|
+
|
|
8
35
|
## [0.55.0] - 2026-09-11
|
|
9
36
|
|
|
10
37
|
### Changed
|
|
@@ -2498,7 +2525,9 @@ Initial OSS release.
|
|
|
2498
2525
|
使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
|
|
2499
2526
|
行き止まりになる。
|
|
2500
2527
|
|
|
2501
|
-
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.
|
|
2528
|
+
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.57.0...HEAD
|
|
2529
|
+
[0.57.0]: https://github.com/cardene777/cdl/compare/v0.56.0...v0.57.0
|
|
2530
|
+
[0.56.0]: https://github.com/cardene777/cdl/compare/v0.55.0...v0.56.0
|
|
2502
2531
|
[0.55.0]: https://github.com/cardene777/cdl/compare/v0.54.0...v0.55.0
|
|
2503
2532
|
[0.54.0]: https://github.com/cardene777/cdl/compare/v0.53.0...v0.54.0
|
|
2504
2533
|
[0.53.0]: https://github.com/cardene777/cdl/compare/v0.52.0...v0.53.0
|
package/dist/index.cjs
CHANGED
|
@@ -23387,6 +23387,55 @@ function ActorNode({ node, active, value }) {
|
|
|
23387
23387
|
)
|
|
23388
23388
|
] });
|
|
23389
23389
|
}
|
|
23390
|
+
|
|
23391
|
+
// src/kinds/subtitle-lines.ts
|
|
23392
|
+
var SUBTITLE_SIZE = 21;
|
|
23393
|
+
var SUBTITLE_MIN_SIZE = 12;
|
|
23394
|
+
var \u884C\u9001\u308A\u306E\u500D\u7387 = 1.2;
|
|
23395
|
+
function \u8AAC\u660E\u6587\u3092\u5272\u308A\u4ED8\u3051\u308B(text, maxWidth, opts) {
|
|
23396
|
+
const \u76EE\u6A19 = opts.targetSize ?? SUBTITLE_SIZE;
|
|
23397
|
+
const \u8AAD\u3081\u308B\u5927\u304D\u3055 = fitTextSize(text, maxWidth, \u76EE\u6A19, SUBTITLE_MIN_SIZE);
|
|
23398
|
+
if (estimateTextWidth(text, \u8AAD\u3081\u308B\u5927\u304D\u3055) <= maxWidth) return { size: \u8AAD\u3081\u308B\u5927\u304D\u3055, lines: [text] };
|
|
23399
|
+
if (opts.\u4E8C\u884C\u307E\u3067) {
|
|
23400
|
+
for (let size = \u76EE\u6A19; size >= SUBTITLE_MIN_SIZE; size -= 1) {
|
|
23401
|
+
const \u884C = \u4E8C\u884C\u306B\u5272\u308B(text, maxWidth, size);
|
|
23402
|
+
if (\u884C) return { size, lines: \u884C };
|
|
23403
|
+
}
|
|
23404
|
+
}
|
|
23405
|
+
return { size: fitTextSize(text, maxWidth, \u76EE\u6A19, MIN_TEXT_SIZE), lines: [text] };
|
|
23406
|
+
}
|
|
23407
|
+
function \u4E8C\u884C\u306B\u5272\u308B(text, maxWidth, size) {
|
|
23408
|
+
let \u4E00\u756A\u826F\u3044;
|
|
23409
|
+
let \u4E00\u756A\u72ED\u3044 = Infinity;
|
|
23410
|
+
for (const [\u5DE6, \u53F3] of \u5272\u308B\u5019\u88DC(text)) {
|
|
23411
|
+
const \u5E45 = Math.max(estimateTextWidth(\u5DE6, size), estimateTextWidth(\u53F3, size));
|
|
23412
|
+
if (\u5E45 > maxWidth || \u5E45 >= \u4E00\u756A\u72ED\u3044) continue;
|
|
23413
|
+
\u4E00\u756A\u72ED\u3044 = \u5E45;
|
|
23414
|
+
\u4E00\u756A\u826F\u3044 = [\u5DE6, \u53F3];
|
|
23415
|
+
}
|
|
23416
|
+
return \u4E00\u756A\u826F\u3044;
|
|
23417
|
+
}
|
|
23418
|
+
function \u5272\u308B\u5019\u88DC(text) {
|
|
23419
|
+
const \u533A\u5207\u308A = [];
|
|
23420
|
+
for (const m of text.matchAll(/\s*\/\s*/g)) {
|
|
23421
|
+
\u533A\u5207\u308A.push([text.slice(0, m.index).trim(), text.slice(m.index + m[0].length).trim()]);
|
|
23422
|
+
}
|
|
23423
|
+
if (\u533A\u5207\u308A.length > 0) return \u533A\u5207\u308A.filter(\u5165\u3063\u3066\u3044\u308B);
|
|
23424
|
+
const \u7A7A\u767D = [];
|
|
23425
|
+
for (const m of text.matchAll(/\s+/g)) {
|
|
23426
|
+
\u7A7A\u767D.push([text.slice(0, m.index).trim(), text.slice(m.index + m[0].length).trim()]);
|
|
23427
|
+
}
|
|
23428
|
+
if (\u7A7A\u767D.length > 0) return \u7A7A\u767D.filter(\u5165\u3063\u3066\u3044\u308B);
|
|
23429
|
+
const \u5B57 = [];
|
|
23430
|
+
const \u4E26\u3073 = [...text];
|
|
23431
|
+
for (let i = 1; i < \u4E26\u3073.length; i += 1) {
|
|
23432
|
+
\u5B57.push([\u4E26\u3073.slice(0, i).join(""), \u4E26\u3073.slice(i).join("")]);
|
|
23433
|
+
}
|
|
23434
|
+
return \u5B57.filter(\u5165\u3063\u3066\u3044\u308B);
|
|
23435
|
+
}
|
|
23436
|
+
function \u5165\u3063\u3066\u3044\u308B([\u5DE6, \u53F3]) {
|
|
23437
|
+
return \u5DE6 !== "" && \u53F3 !== "";
|
|
23438
|
+
}
|
|
23390
23439
|
function CardNode({ node, active }) {
|
|
23391
23440
|
const accent = nodeAccent(node, "var(--cdl-tone-accent, #2d6a8f)");
|
|
23392
23441
|
const x = node.cx - node.w / 2;
|
|
@@ -23411,7 +23460,12 @@ function CardNode({ node, active }) {
|
|
|
23411
23460
|
const initialTitleSize = compact ? 20 : 24;
|
|
23412
23461
|
const titleSize = fitTextSize(node.title, availableW, initialTitleSize, 11);
|
|
23413
23462
|
const textAnchor = compact ? "middle" : "start";
|
|
23414
|
-
const
|
|
23463
|
+
const subtitleY = 124 - \u305A\u3089\u3057;
|
|
23464
|
+
const \u6700\u5927\u306E\u884C\u9001\u308A = SUBTITLE_SIZE * \u884C\u9001\u308A\u306E\u500D\u7387;
|
|
23465
|
+
const \u4E8C\u884C\u304C\u5165\u308B = !compact && subtitleY - \u6700\u5927\u306E\u884C\u9001\u308A / 2 - SUBTITLE_SIZE * ASCENT2 > titleY + titleSize * DESCENT2 && subtitleY + \u6700\u5927\u306E\u884C\u9001\u308A / 2 + SUBTITLE_SIZE * DESCENT2 <= node.h - 4;
|
|
23466
|
+
const \u8AAC\u660E = node.subtitle ? \u8AAC\u660E\u6587\u3092\u5272\u308A\u4ED8\u3051\u308B(node.subtitle, availableW, { \u4E8C\u884C\u307E\u3067: \u4E8C\u884C\u304C\u5165\u308B }) : void 0;
|
|
23467
|
+
const subtitleSize = \u8AAC\u660E?.size ?? 21;
|
|
23468
|
+
const \u884C\u9001\u308A = subtitleSize * \u884C\u9001\u308A\u306E\u500D\u7387;
|
|
23415
23469
|
return /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${x} ${y})`, children: [
|
|
23416
23470
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
23417
23471
|
"rect",
|
|
@@ -23441,7 +23495,17 @@ function CardNode({ node, active }) {
|
|
|
23441
23495
|
children: node.title
|
|
23442
23496
|
}
|
|
23443
23497
|
),
|
|
23444
|
-
!compact &&
|
|
23498
|
+
!compact && \u8AAC\u660E?.lines.map((\u884C, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
23499
|
+
"text",
|
|
23500
|
+
{
|
|
23501
|
+
x: 26,
|
|
23502
|
+
y: subtitleY + (i - (\u8AAC\u660E.lines.length - 1) / 2) * \u884C\u9001\u308A,
|
|
23503
|
+
fontSize: subtitleSize,
|
|
23504
|
+
fill: "var(--cdl-text-dim, #5a6270)",
|
|
23505
|
+
children: \u884C
|
|
23506
|
+
},
|
|
23507
|
+
`sub-${i}`
|
|
23508
|
+
)),
|
|
23445
23509
|
\u5C0F\u578B\u306B\u547C\u3073\u540D && /* @__PURE__ */ jsxRuntime.jsx(
|
|
23446
23510
|
"text",
|
|
23447
23511
|
{
|
|
@@ -26976,6 +27040,13 @@ function UserJourneyNode({
|
|
|
26976
27040
|
frustrated: "\u{1F615}",
|
|
26977
27041
|
angry: "\u{1F620}"
|
|
26978
27042
|
};
|
|
27043
|
+
const emotionLabel = {
|
|
27044
|
+
delighted: "\u5927\u6E80\u8DB3",
|
|
27045
|
+
happy: "\u6E80\u8DB3",
|
|
27046
|
+
neutral: "\u3075\u3064\u3046",
|
|
27047
|
+
frustrated: "\u4E0D\u6E80",
|
|
27048
|
+
angry: "\u6012\u308A"
|
|
27049
|
+
};
|
|
26979
27050
|
const rowH = canvasH / 5;
|
|
26980
27051
|
const colW = canvasW / Math.max(steps.length, 1);
|
|
26981
27052
|
const xAt = (idx) => PAD_LEFT2 + (steps.length <= 1 ? canvasW / 2 : colW / 2 + colW * idx);
|
|
@@ -27040,7 +27111,7 @@ function UserJourneyNode({
|
|
|
27040
27111
|
fontWeight: 600,
|
|
27041
27112
|
textAnchor: "end",
|
|
27042
27113
|
fill: emotionColor[e],
|
|
27043
|
-
children: e
|
|
27114
|
+
children: emotionLabel[e]
|
|
27044
27115
|
}
|
|
27045
27116
|
)
|
|
27046
27117
|
] }, `band-${e}`)),
|