@cardenelabs/cdl 0.18.0 → 0.18.1
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 +21 -1
- package/dist/index.cjs +42 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +42 -11
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +42 -11
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +42 -11
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
- package/src/render/edges.tsx +18 -2
- package/src/render/stage.tsx +36 -12
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cardenelabs/cdl",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.1",
|
|
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/render/edges.tsx
CHANGED
|
@@ -23,11 +23,19 @@ function labelTextOpacity(line: EdgeLabelLine): number | undefined {
|
|
|
23
23
|
export function CdlEdgeView({
|
|
24
24
|
edge,
|
|
25
25
|
active,
|
|
26
|
+
drawing,
|
|
26
27
|
progress,
|
|
27
28
|
stateValues,
|
|
28
29
|
}: {
|
|
29
30
|
edge: LaidEdge;
|
|
30
31
|
active: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* この段でこの矢印が **初めて出る** か (#584)。
|
|
34
|
+
*
|
|
35
|
+
* 真の時だけ起点から伸ばす。 光っているかで引くと、光り続ける図で段が変わるたびに引き直され、
|
|
36
|
+
* 既に見えている線が毎回動く (user 実機確認)。 「増えた」 のは 1 度だけなので、動くのも 1 度。
|
|
37
|
+
*/
|
|
38
|
+
drawing: boolean;
|
|
31
39
|
progress: number;
|
|
32
40
|
stateValues?: Record<string, string>;
|
|
33
41
|
}): JSX.Element {
|
|
@@ -77,6 +85,7 @@ export function CdlEdgeView({
|
|
|
77
85
|
data-cdl-from={edge.from}
|
|
78
86
|
data-cdl-to={edge.to}
|
|
79
87
|
data-cdl-active={active ? "true" : "false"}
|
|
88
|
+
data-cdl-drawing={drawing ? "true" : "false"}
|
|
80
89
|
data-cdl-path-d={edge.d}
|
|
81
90
|
data-cdl-label-x={edge.labelX}
|
|
82
91
|
data-cdl-label-y={edge.labelY}
|
|
@@ -106,6 +115,7 @@ export function CdlEdgeView({
|
|
|
106
115
|
<SolidEdgePath
|
|
107
116
|
edge={edge}
|
|
108
117
|
active={active}
|
|
118
|
+
drawing={drawing}
|
|
109
119
|
progress={progress}
|
|
110
120
|
color={color}
|
|
111
121
|
marker={marker}
|
|
@@ -130,13 +140,17 @@ export function CdlEdgeView({
|
|
|
130
140
|
}
|
|
131
141
|
|
|
132
142
|
/**
|
|
133
|
-
* SolidEdgePath ... solid edge の path を progress
|
|
143
|
+
* SolidEdgePath ... solid edge の path を progress 連動で「段の始まりで 0 → 進行と共に伸びる」 動きで描画。
|
|
134
144
|
* pathSubpath(d, progress) で d 自体を progress * totalLength の地点まで切り詰めて、
|
|
135
145
|
* SVG <path d=... markerEnd=...> で marker を path 末端 (= 現在進行位置) に atomic 配置。
|
|
146
|
+
*
|
|
147
|
+
* **伸ばすのは初めて出る段だけ** (#584)。 光っているかで引くと、段をまたいで光り続ける図で
|
|
148
|
+
* 既に見えている線が毎段引き直される。
|
|
136
149
|
*/
|
|
137
150
|
function SolidEdgePath({
|
|
138
151
|
edge,
|
|
139
152
|
active,
|
|
153
|
+
drawing,
|
|
140
154
|
progress,
|
|
141
155
|
color,
|
|
142
156
|
marker,
|
|
@@ -146,6 +160,7 @@ function SolidEdgePath({
|
|
|
146
160
|
}: {
|
|
147
161
|
edge: LaidEdge;
|
|
148
162
|
active: boolean;
|
|
163
|
+
drawing: boolean;
|
|
149
164
|
progress: number;
|
|
150
165
|
color: string;
|
|
151
166
|
marker: string | undefined;
|
|
@@ -153,7 +168,8 @@ function SolidEdgePath({
|
|
|
153
168
|
dashed: boolean;
|
|
154
169
|
stateValues?: Record<string, string>;
|
|
155
170
|
}): JSX.Element {
|
|
156
|
-
|
|
171
|
+
// 伸ばすのは初めて出る段だけ (#584)。 光っているかで引くと、光り続ける図で毎段引き直される
|
|
172
|
+
const visibleD = drawing ? pathSubpath(edge.d, progress) : edge.d;
|
|
157
173
|
// signal binding: widthBind / strokeBind / dashOffsetBind (CAR edge-signal-binding)
|
|
158
174
|
const defaultWidth = active ? 5 : 2.5;
|
|
159
175
|
const boundWidth = edge.widthBind && stateValues
|
package/src/render/stage.tsx
CHANGED
|
@@ -47,20 +47,37 @@ export function CdlStage({
|
|
|
47
47
|
*
|
|
48
48
|
* 著者が `edgeReveal: "all"` と書いた図では隠さない。
|
|
49
49
|
*/
|
|
50
|
-
const
|
|
51
|
-
// 著者が「最初から全部見せる」 と書いた図では隠さない (#582)
|
|
52
|
-
if ((laid.edgeReveal ?? EDGE_REVEAL_DEFAULT) === "all") return () => true;
|
|
50
|
+
const 矢印の出番 = useMemo(() => {
|
|
53
51
|
const 初出 = new Map<string, number>();
|
|
54
52
|
laid.phases.forEach((p, i) => {
|
|
55
53
|
for (const id of p.activate ?? []) if (!初出.has(id)) 初出.set(id, i);
|
|
56
54
|
});
|
|
57
55
|
const 今 = currentPhase === undefined ? -1 : laid.phases.findIndex((p) => p.id === currentPhase.id);
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
56
|
+
// 著者が「最初から全部見せる」 と書いた図では隠さない (#582)
|
|
57
|
+
const 隠す = (laid.edgeReveal ?? EDGE_REVEAL_DEFAULT) !== "all";
|
|
58
|
+
return {
|
|
59
|
+
出るか: (edgeId: string): boolean => {
|
|
60
|
+
if (!隠す) return true;
|
|
61
|
+
const first = 初出.get(edgeId);
|
|
62
|
+
if (first === undefined) return true;
|
|
63
|
+
return 今 < 0 || 今 >= first;
|
|
64
|
+
},
|
|
65
|
+
/*
|
|
66
|
+
* この段で初めて出るか (#584)。
|
|
67
|
+
*
|
|
68
|
+
* 起点から伸ばすのはこの段だけ。 光っているかで引くと、段をまたいで光り続ける図で
|
|
69
|
+
* 既に見えている線が毎段引き直される (実測 = 表の図で 3 本とも段が変わるたびに伸び直した)。
|
|
70
|
+
*
|
|
71
|
+
* **隠さない図でも初出は数える**。 `all` は「最初から見せる」 だけの指定で、
|
|
72
|
+
* 伸びる動きまで毎段繰り返してよいという意味ではない。
|
|
73
|
+
*/
|
|
74
|
+
伸ばすか: (edgeId: string): boolean => {
|
|
75
|
+
const first = 初出.get(edgeId);
|
|
76
|
+
if (first === undefined) return false;
|
|
77
|
+
return 今 === first;
|
|
78
|
+
},
|
|
62
79
|
};
|
|
63
|
-
}, [laid.phases, currentPhase]);
|
|
80
|
+
}, [laid.phases, currentPhase, laid.edgeReveal]);
|
|
64
81
|
// この phase で左の起点から描き始める node (cdl#512)。 `activate` とは別集合で持つ =
|
|
65
82
|
// 焦点が当たり続ける図で毎 phase 引き直すことになるため、 光っているかを引き金にしない
|
|
66
83
|
const drawSet = new Set(currentPhase?.draw ?? []);
|
|
@@ -265,8 +282,15 @@ export function CdlStage({
|
|
|
265
282
|
))}
|
|
266
283
|
|
|
267
284
|
{/* edges (1st pass) */}
|
|
268
|
-
{laid.edges.filter((edge) =>
|
|
269
|
-
<CdlEdgeView
|
|
285
|
+
{laid.edges.filter((edge) => 矢印の出番.出るか(edge.id)).map((edge) => (
|
|
286
|
+
<CdlEdgeView
|
|
287
|
+
key={edge.id}
|
|
288
|
+
edge={edge}
|
|
289
|
+
active={activeSet.has(edge.id)}
|
|
290
|
+
drawing={矢印の出番.伸ばすか(edge.id)}
|
|
291
|
+
progress={progress}
|
|
292
|
+
stateValues={stateValues}
|
|
293
|
+
/>
|
|
270
294
|
))}
|
|
271
295
|
|
|
272
296
|
{/* nodes (2nd pass) */}
|
|
@@ -290,13 +314,13 @@ export function CdlStage({
|
|
|
290
314
|
|
|
291
315
|
{/* 経由 node 貫通する dotted-flow edge の進行点 glow (3rd pass) */}
|
|
292
316
|
{laid.edges
|
|
293
|
-
.filter((edge) => Boolean(edge.dThrough) &&
|
|
317
|
+
.filter((edge) => Boolean(edge.dThrough) && 矢印の出番.出るか(edge.id))
|
|
294
318
|
.map((edge) => (
|
|
295
319
|
<CdlEdgeGlowView key={`glow-${edge.id}`} edge={edge} active={activeSet.has(edge.id)} />
|
|
296
320
|
))}
|
|
297
321
|
|
|
298
322
|
{/* edge labels (3rd pass) ... 全 edge の label を最前面に描画 */}
|
|
299
|
-
{laid.edges.filter((edge) =>
|
|
323
|
+
{laid.edges.filter((edge) => 矢印の出番.出るか(edge.id)).map((edge) => (
|
|
300
324
|
<CdlEdgeLabelView
|
|
301
325
|
key={`label-${edge.id}`}
|
|
302
326
|
edge={edge}
|