@cardenelabs/cdl 0.68.0 → 0.69.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 +34 -1
- package/dist/index.cjs +27 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +27 -4
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +27 -4
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +27 -4
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
- package/src/kinds/gantt.tsx +65 -14
- package/src/presets.ts +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cardenelabs/cdl",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.69.0",
|
|
4
4
|
"description": "CDL (Chainome Diagram Language). Mermaid-like declarative DSL that compiles to animated SVG diagrams. Built for blockchain / Solidity flows, generic enough for sequence / flow / state / ER / topology diagrams.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "cardene777",
|
package/src/kinds/gantt.tsx
CHANGED
|
@@ -2,7 +2,7 @@ import type { JSX } from "react";
|
|
|
2
2
|
import type { LaidNode, Tone } from "../types";
|
|
3
3
|
import { TONE } from "../render/tone";
|
|
4
4
|
import { resolveGanttData } from "../render/payload-binding";
|
|
5
|
-
import { 進みを畳む, 段の伸び } from "./draw-progress";
|
|
5
|
+
import { 伸ばすdash, 進みを畳む, 段の伸び } from "./draw-progress";
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* gantt-timeline kind ... 1 node に task 配列 (ganttData) を保持し、 帯状 timeline を SVG 描画する。
|
|
@@ -170,7 +170,7 @@ export function GanttNode({
|
|
|
170
170
|
//
|
|
171
171
|
// 固定 (6) だと、 目盛りが細かい図で帯が消える。 1 目盛りの幅が 6 ちょうどだと幅 0、
|
|
172
172
|
// それより小さいと負になる (実測 = 位置 1e6 で -5.999、 位置 85 で 0)。
|
|
173
|
-
// 目盛りが広い図 (
|
|
173
|
+
// 目盛りが広い図 (通常のガントチャート) では 6 のままなので見た目は変わらない。
|
|
174
174
|
const 帯の余白 = Math.min(6, cellW / 2);
|
|
175
175
|
// 帯の左端と右端。 **依存矢印も同じ式を使う** (#468 Round 9)。 別々に持つと、 余白を
|
|
176
176
|
// 可変にした時に矢印の基準点だけが旧い端に取り残される
|
|
@@ -180,7 +180,7 @@ export function GanttNode({
|
|
|
180
180
|
/**
|
|
181
181
|
* 帯がどこまで伸びたか (0..1、 cdl#521)。 描く指定が無ければ常に 1 = 全長。
|
|
182
182
|
*
|
|
183
|
-
* **帯ごとに始端が違う**。
|
|
183
|
+
* **帯ごとに始端が違う**。 棒グラフは全部が同じ横軸から伸びるが、ガントチャートは工程ごとに
|
|
184
184
|
* 始まる位置が違うため、包みも帯ごとに作って不動点をその帯の左端に置く。
|
|
185
185
|
*/
|
|
186
186
|
const 伸び = 進みを畳む(drawing, progress);
|
|
@@ -203,6 +203,54 @@ export function GanttNode({
|
|
|
203
203
|
const taskById = new Map(整えた.map((t) => [t.id, t]));
|
|
204
204
|
const rowOf = new Map(整えた.map((t, i) => [t.id, i]));
|
|
205
205
|
|
|
206
|
+
/**
|
|
207
|
+
* 行の時間のうち、**入ってくる依存の線を引くのに使う割合** (cdl#877)。
|
|
208
|
+
*
|
|
209
|
+
* 残りで帯を伸ばす。 行の持ち時間そのものは変えないので、図全体の長さは変わらない。
|
|
210
|
+
*/
|
|
211
|
+
const 線の取り分 = 0.35;
|
|
212
|
+
|
|
213
|
+
const 区切る = (v: number): number => Math.min(1, Math.max(0, v));
|
|
214
|
+
|
|
215
|
+
/** その行に、上の行から入ってくる依存の線があるか */
|
|
216
|
+
const 上から来る線 = (row: number): boolean => {
|
|
217
|
+
const t = 整えた[row];
|
|
218
|
+
if (t === undefined || t.dependsOn === undefined) return false;
|
|
219
|
+
const 親 = taskById.get(t.dependsOn);
|
|
220
|
+
if (親 === undefined) return false;
|
|
221
|
+
const 親の行 = rowOf.get(親.id);
|
|
222
|
+
return 親の行 !== undefined && 親の行 < row;
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* その行の帯がどこまで伸びたか (0..1、 cdl#877)。
|
|
227
|
+
*
|
|
228
|
+
* **入ってくる線がある行は、線を引き終えてから伸び始める**。 前の工程が終わり、線が
|
|
229
|
+
* 次の工程へ届き、そこから帯が伸びる = 図が示している順序をそのまま時間に写す。
|
|
230
|
+
* 線の無い行 (最初の工程や、下から上へ戻る依存) は行の時間を丸ごと使う。
|
|
231
|
+
*/
|
|
232
|
+
const 帯の伸び = (row: number): number => {
|
|
233
|
+
const r = 行の伸び(row);
|
|
234
|
+
return 上から来る線(row) ? 区切る((r - 線の取り分) / (1 - 線の取り分)) : r;
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* その線がどこまで引けたか (0..1、 cdl#877)。
|
|
239
|
+
*
|
|
240
|
+
* 以前は両端の行が伸び切った瞬間に線が丸ごと現れていた。 線が根元から先へ伸びれば
|
|
241
|
+
* 「どちらからどちらへ」 が動きそのもので読める。
|
|
242
|
+
*
|
|
243
|
+
* **親が下にある依存は順に読ませる向きが無い**。 その時だけは両端が伸び切ってから
|
|
244
|
+
* 一度に出す (上から下へ読む図で、下から戻る線を先に引くと順序が逆に見える)。
|
|
245
|
+
*/
|
|
246
|
+
const 線の伸び = (親の行: number, 子の行: number): number => {
|
|
247
|
+
if (!drawing) return 1;
|
|
248
|
+
if (親の行 >= 子の行) {
|
|
249
|
+
return 行の伸び(親の行) >= 1 && 行の伸び(子の行) >= 1 ? 1 : 0;
|
|
250
|
+
}
|
|
251
|
+
return 区切る(行の伸び(子の行) / 線の取り分);
|
|
252
|
+
};
|
|
253
|
+
|
|
206
254
|
return (
|
|
207
255
|
<g transform={`translate(${x0} ${y0})`}>
|
|
208
256
|
<rect
|
|
@@ -310,7 +358,7 @@ export function GanttNode({
|
|
|
310
358
|
// 目盛りの幅の半分以上になる = **この分岐に届く入力を今は作れない** (変異試験で確認)。
|
|
311
359
|
// 余白の決め方を変えた時に負の幅を出さないために残す
|
|
312
360
|
const bw = Math.max(0, 帯の右(t.endIdx) - bx);
|
|
313
|
-
const この行 =
|
|
361
|
+
const この行 = 帯の伸び(row);
|
|
314
362
|
/*
|
|
315
363
|
* 伸びは **幅そのもの** を変える (cdl#875)。
|
|
316
364
|
*
|
|
@@ -410,8 +458,8 @@ export function GanttNode({
|
|
|
410
458
|
`M ${着地X} ${着地Y}` +
|
|
411
459
|
` L ${着地X - 矢じりの幅 / 2} ${縦の終わりY}` +
|
|
412
460
|
` L ${着地X + 矢じりの幅 / 2} ${縦の終わりY} Z`;
|
|
413
|
-
|
|
414
|
-
|
|
461
|
+
const 引けた = 線の伸び(parentRow, childRow);
|
|
462
|
+
return 引けた <= 0 ? null : (
|
|
415
463
|
<g key={`dep-${parent.id}-${t.id}`} data-cdl-role="gantt-arrow">
|
|
416
464
|
<path
|
|
417
465
|
d={path}
|
|
@@ -420,16 +468,19 @@ export function GanttNode({
|
|
|
420
468
|
strokeWidth={2.4}
|
|
421
469
|
strokeLinejoin="round"
|
|
422
470
|
strokeLinecap="round"
|
|
471
|
+
{...伸ばすdash(drawing, 引けた)}
|
|
423
472
|
/>
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
473
|
+
{/* 矢じりは線が届いてから置く。 先に出すと、線の無い所に三角が浮く */}
|
|
474
|
+
{引けた < 1 ? null : (
|
|
475
|
+
<path
|
|
476
|
+
d={arrowHeadPath}
|
|
477
|
+
fill="var(--cdl-text-mute, #8a8678)"
|
|
478
|
+
stroke="var(--cdl-text-mute, #8a8678)"
|
|
479
|
+
strokeWidth={0.5}
|
|
480
|
+
strokeLinejoin="round"
|
|
481
|
+
/>
|
|
482
|
+
)}
|
|
431
483
|
</g>
|
|
432
|
-
)
|
|
433
484
|
);
|
|
434
485
|
})}
|
|
435
486
|
</g>
|
package/src/presets.ts
CHANGED
|
@@ -34,7 +34,7 @@ export type BindingRef = `{${名前の頭}${string}}`;
|
|
|
34
34
|
* その文字列が **全体で** 状態を読む書き方かどうか (#468 Round 5)。
|
|
35
35
|
*
|
|
36
36
|
* `hasUnresolvedRef` は「参照らしい部分を含むか」 を見るため、 `Phase {A}` のような通常の
|
|
37
|
-
* 名前まで参照とみなす。
|
|
37
|
+
* 名前まで参照とみなす。 ガントチャートの入口は名前と参照を同じ欄で受けるので、 部分一致で判定すると
|
|
38
38
|
* **正当な名前が黙って消える** (実測 = `start: "Phase {A}"` が位置 `"Phase {A}"` になり、
|
|
39
39
|
* 名前の欄が空になった)。
|
|
40
40
|
*
|