@cardenelabs/cdl 0.9.0 → 0.11.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/dist/react.cjs CHANGED
@@ -4886,6 +4886,7 @@ function nodeTemplateTexts(node) {
4886
4886
 
4887
4887
  // src/validate.ts
4888
4888
  var TONES2 = new Set(TONES);
4889
+ var DRAW_KINDS = /* @__PURE__ */ new Set(["chart-line", "chart-bar", "chart-pie"]);
4889
4890
  var KINDS = new Set(NODE_KINDS);
4890
4891
  var ENG_BANNED = /\b(FUNCTION|STORAGE|EVENT LOG|BALANCES MAPPING|READ|WRITE|EMIT|CALL)\b/;
4891
4892
  function validate(diag) {
@@ -4949,7 +4950,7 @@ function validate(diag) {
4949
4950
  ...(diag.formulas ?? []).map((f) => f.id),
4950
4951
  ...(diag.scrollTriggers ?? []).map((t) => t.id)
4951
4952
  ]);
4952
- const suggest = (target, candidates) => {
4953
+ const suggest = (target, candidates, candidateKind = "lane") => {
4953
4954
  const list = [...candidates];
4954
4955
  if (list.length === 0) return "";
4955
4956
  let best = "";
@@ -4961,7 +4962,7 @@ function validate(diag) {
4961
4962
  best = c;
4962
4963
  }
4963
4964
  }
4964
- return bestD <= 2 ? ` (\u3082\u3057\u304B\u3057\u3066 "${best}"?)` : ` (\u5B9A\u7FA9\u6E08 lane: ${list.slice(0, 5).join(", ")}${list.length > 5 ? "..." : ""})`;
4965
+ return bestD <= 2 ? ` (\u3082\u3057\u304B\u3057\u3066 "${best}"?)` : ` (\u5B9A\u7FA9\u6E08 ${candidateKind}: ${list.slice(0, 5).join(", ")}${list.length > 5 ? "..." : ""})`;
4965
4966
  };
4966
4967
  for (const n of diag.nodes) {
4967
4968
  if (!laneIds.has(n.lane)) {
@@ -4974,13 +4975,13 @@ function validate(diag) {
4974
4975
  for (const e of diag.edges) {
4975
4976
  if (!nodeIds.has(e.from)) {
4976
4977
  errors.push(
4977
- `[cdl] unknown-ref: edge "${e.id}" \u306E from "${e.from}" \u304C node \u306B\u5B58\u5728\u3057\u307E\u305B\u3093${suggest(e.from, nodeIds)}
4978
+ `[cdl] unknown-ref: edge "${e.id}" \u306E from "${e.from}" \u304C node \u306B\u5B58\u5728\u3057\u307E\u305B\u3093${suggest(e.from, nodeIds, "node")}
4978
4979
  \u2192 \u4FEE\u6B63\u4F8B: .node("${e.from}", { lane: "...", stack: 0, kind: "actor", title: "..." }) \u3092 edge \u5BA3\u8A00\u524D\u306B\u8FFD\u52A0`
4979
4980
  );
4980
4981
  }
4981
4982
  if (!nodeIds.has(e.to)) {
4982
4983
  errors.push(
4983
- `[cdl] unknown-ref: edge "${e.id}" \u306E to "${e.to}" \u304C node \u306B\u5B58\u5728\u3057\u307E\u305B\u3093${suggest(e.to, nodeIds)}
4984
+ `[cdl] unknown-ref: edge "${e.id}" \u306E to "${e.to}" \u304C node \u306B\u5B58\u5728\u3057\u307E\u305B\u3093${suggest(e.to, nodeIds, "node")}
4984
4985
  \u2192 \u4FEE\u6B63\u4F8B: .node("${e.to}", { lane: "...", stack: 0, kind: "...", title: "..." }) \u3092 edge \u5BA3\u8A00\u524D\u306B\u8FFD\u52A0`
4985
4986
  );
4986
4987
  }
@@ -4997,6 +4998,18 @@ function validate(diag) {
4997
4998
  errors.push(`[cdl] unknown-ref: phase "${p.id}" \u306E activate "${id}" \u306F node \u3067\u3082 edge \u3067\u3082\u306A\u3044 (typo \u306E\u53EF\u80FD\u6027)`);
4998
4999
  }
4999
5000
  }
5001
+ for (const id of p.draw ?? []) {
5002
+ if (!nodeIds.has(id)) {
5003
+ errors.push(`[cdl] unknown-ref: phase "${p.id}" \u306E draw "${id}" \u306F node \u3067\u306F\u306A\u3044 (typo \u306E\u53EF\u80FD\u6027)${suggest(id, nodeIds, "node")}`);
5004
+ continue;
5005
+ }
5006
+ const kind = diag.nodes.find((n) => n.id === id)?.kind;
5007
+ if (!DRAW_KINDS.has(String(kind))) {
5008
+ warnings.push(
5009
+ `phase "${p.id}" \u306E draw "${id}" \u306F kind "${kind}" \u3067\u3001 \u8D77\u70B9\u304B\u3089\u63CF\u304F\u52D5\u304D\u3092\u6301\u305F\u306A\u3044 (\u5BFE\u8C61\u306F ${[...DRAW_KINDS].join(" / ")})`
5010
+ );
5011
+ }
5012
+ }
5000
5013
  for (const t of p.tweens) {
5001
5014
  if (!stateIds.has(t.stateId)) {
5002
5015
  errors.push(`[cdl] unknown-ref: phase "${p.id}" tween \u5BFE\u8C61 state "${t.stateId}" \u672A\u5B9A\u7FA9`);
@@ -6574,7 +6587,9 @@ function resolveMindData(data, values) {
6574
6587
  function ChartLineNode({
6575
6588
  node,
6576
6589
  active,
6577
- stateValues = {}
6590
+ stateValues = {},
6591
+ drawing = false,
6592
+ progress = 1
6578
6593
  }) {
6579
6594
  const x0 = node.cx - node.w / 2;
6580
6595
  const y0 = node.cy - node.h / 2;
@@ -6595,6 +6610,24 @@ function ChartLineNode({
6595
6610
  const xAt = (idx) => PAD_LEFT + (data.length <= 1 ? canvasW / 2 : canvasW * idx / (data.length - 1));
6596
6611
  const yAt = (v) => plotTop + plotH - (v - vMin) / vRange * plotH;
6597
6612
  const points = data.map((d, idx) => `${xAt(idx)},${yAt(d.value)}`).join(" ");
6613
+ const \u70B9\u307E\u3067\u306E\u9577\u3055 = [];
6614
+ let \u7DDA\u306E\u5168\u9577 = 0;
6615
+ let \u524D\u306E\u70B9;
6616
+ for (const [idx, datum] of data.entries()) {
6617
+ const \u4ECA\u306E\u70B9 = { x: xAt(idx), y: yAt(datum.value) };
6618
+ if (\u524D\u306E\u70B9) {
6619
+ \u7DDA\u306E\u5168\u9577 += Math.hypot(\u4ECA\u306E\u70B9.x - \u524D\u306E\u70B9.x, \u4ECA\u306E\u70B9.y - \u524D\u306E\u70B9.y);
6620
+ }
6621
+ \u70B9\u307E\u3067\u306E\u9577\u3055.push(\u7DDA\u306E\u5168\u9577);
6622
+ \u524D\u306E\u70B9 = \u4ECA\u306E\u70B9;
6623
+ }
6624
+ const \u4F38\u3073 = drawing ? Math.min(1, Math.max(0, Number.isFinite(progress) ? progress : 1)) : 1;
6625
+ const \u7DDA\u306E\u5148\u304C\u5C4A\u3044\u305F = (idx) => {
6626
+ if (!drawing) return true;
6627
+ if (data.length <= 1) return true;
6628
+ if (\u7DDA\u306E\u5168\u9577 === 0) return true;
6629
+ return \u4F38\u3073 >= (\u70B9\u307E\u3067\u306E\u9577\u3055[idx] ?? 0) / \u7DDA\u306E\u5168\u9577;
6630
+ };
6598
6631
  const gridCount = 4;
6599
6632
  const gridTicks = Array.from({ length: gridCount + 1 }, (_, i) => {
6600
6633
  const v = vMin + vRange * i / gridCount;
@@ -6672,7 +6705,8 @@ function ChartLineNode({
6672
6705
  stroke: "var(--cdl-tone-accent, #2d6a8f)",
6673
6706
  strokeWidth: 2.5,
6674
6707
  strokeLinejoin: "round",
6675
- strokeLinecap: "round"
6708
+ strokeLinecap: "round",
6709
+ ...drawing ? { pathLength: 1, strokeDasharray: 1, strokeDashoffset: 1 - \u4F38\u3073 } : {}
6676
6710
  }
6677
6711
  ),
6678
6712
  data.map((d, idx) => {
@@ -6683,40 +6717,43 @@ function ChartLineNode({
6683
6717
  const isValley = (prev === void 0 || d.value <= prev) && (next === void 0 || d.value <= next);
6684
6718
  const labelAbove = !isValley;
6685
6719
  const labelY = labelAbove ? cy - 12 : cy + 18;
6720
+ const \u51FA\u3059 = \u7DDA\u306E\u5148\u304C\u5C4A\u3044\u305F(idx);
6686
6721
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { "data-cdl-unresolved": d.unresolved ? "true" : void 0, children: [
6687
- /* @__PURE__ */ jsxRuntime.jsx(
6688
- "circle",
6689
- {
6690
- cx,
6691
- cy,
6692
- r: 5,
6693
- fill: "var(--cdl-node-fill, #ffffff)",
6694
- stroke: "var(--cdl-tone-accent, #2d6a8f)",
6695
- strokeWidth: 2.5
6696
- }
6697
- ),
6698
- /* @__PURE__ */ jsxRuntime.jsx(
6699
- "circle",
6700
- {
6701
- cx,
6702
- cy,
6703
- r: 2.5,
6704
- fill: "var(--cdl-tone-accent, #2d6a8f)"
6705
- }
6706
- ),
6707
- /* @__PURE__ */ jsxRuntime.jsx(
6708
- "text",
6709
- {
6710
- "data-cdl-role": "chart-line-value",
6711
- x: cx,
6712
- y: labelY,
6713
- fontSize: 11,
6714
- fontWeight: 600,
6715
- textAnchor: "middle",
6716
- fill: "var(--cdl-text, #1a1f2a)",
6717
- children: d.value.toLocaleString()
6718
- }
6719
- ),
6722
+ \u51FA\u3059 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
6723
+ /* @__PURE__ */ jsxRuntime.jsx(
6724
+ "circle",
6725
+ {
6726
+ cx,
6727
+ cy,
6728
+ r: 5,
6729
+ fill: "var(--cdl-node-fill, #ffffff)",
6730
+ stroke: "var(--cdl-tone-accent, #2d6a8f)",
6731
+ strokeWidth: 2.5
6732
+ }
6733
+ ),
6734
+ /* @__PURE__ */ jsxRuntime.jsx(
6735
+ "circle",
6736
+ {
6737
+ cx,
6738
+ cy,
6739
+ r: 2.5,
6740
+ fill: "var(--cdl-tone-accent, #2d6a8f)"
6741
+ }
6742
+ ),
6743
+ /* @__PURE__ */ jsxRuntime.jsx(
6744
+ "text",
6745
+ {
6746
+ "data-cdl-role": "chart-line-value",
6747
+ x: cx,
6748
+ y: labelY,
6749
+ fontSize: 11,
6750
+ fontWeight: 600,
6751
+ textAnchor: "middle",
6752
+ fill: "var(--cdl-text, #1a1f2a)",
6753
+ children: d.value.toLocaleString()
6754
+ }
6755
+ )
6756
+ ] }),
6720
6757
  /* @__PURE__ */ jsxRuntime.jsx(
6721
6758
  "text",
6722
6759
  {
@@ -6735,8 +6772,11 @@ function ChartLineNode({
6735
6772
  function ChartPieNode({
6736
6773
  node,
6737
6774
  active,
6738
- stateValues = {}
6775
+ stateValues = {},
6776
+ drawing = false,
6777
+ progress = 1
6739
6778
  }) {
6779
+ const instanceId = react.useId().replace(/[^A-Za-z0-9_-]/g, "");
6740
6780
  const x0 = node.cx - node.w / 2;
6741
6781
  const y0 = node.cy - node.h / 2;
6742
6782
  const data = resolveChartData(node.chartData ?? [], stateValues);
@@ -6749,20 +6789,26 @@ function ChartPieNode({
6749
6789
  const cx = pieAreaW / 2;
6750
6790
  const cy = PAD_TOP + chartAreaH / 2;
6751
6791
  let cumAngle = -Math.PI / 2;
6792
+ let cumFrac = 0;
6752
6793
  const slices = data.map((d) => {
6753
6794
  const frac = d.value / total;
6754
6795
  const angle = frac * Math.PI * 2;
6755
6796
  const a0 = cumAngle;
6756
6797
  const a1 = cumAngle + angle;
6757
6798
  cumAngle = a1;
6799
+ const startFrac = cumFrac;
6800
+ cumFrac += frac;
6758
6801
  const x1 = cx + radius * Math.cos(a0);
6759
6802
  const y1 = cy + radius * Math.sin(a0);
6760
6803
  const x2 = cx + radius * Math.cos(a1);
6761
6804
  const y2 = cy + radius * Math.sin(a1);
6762
6805
  const large = angle > Math.PI ? 1 : 0;
6763
6806
  const path = `M ${cx} ${cy} L ${x1} ${y1} A ${radius} ${radius} 0 ${large} 1 ${x2} ${y2} Z`;
6764
- return { d, frac, path };
6807
+ return { d, frac, path, startFrac };
6765
6808
  });
6809
+ const \u958B\u304D = drawing ? Math.min(1, Math.max(0, Number.isFinite(progress) ? progress : 1)) : 1;
6810
+ const \u5207\u308A\u629C\u304Did = `cdl-pie-draw-${instanceId}`;
6811
+ const \u958B\u304D\u59CB\u3081\u305F = (startFrac) => !drawing || \u958B\u304D > startFrac;
6766
6812
  const legendX = pieAreaW + 8;
6767
6813
  const legendGap = Math.min(28, chartAreaH / Math.max(data.length, 1));
6768
6814
  const legendStartY = PAD_TOP + (chartAreaH - legendGap * data.length) / 2 + legendGap / 2;
@@ -6781,7 +6827,8 @@ function ChartPieNode({
6781
6827
  strokeWidth: active ? 3 : 1.25
6782
6828
  }
6783
6829
  ),
6784
- slices.map((s, idx) => /* @__PURE__ */ jsxRuntime.jsx(
6830
+ drawing && /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx("clipPath", { id: \u5207\u308A\u629C\u304Did, children: \u6247\u5F62\u306E\u5207\u308A\u629C\u304D(cx, cy, radius + 2, \u958B\u304D) }) }),
6831
+ /* @__PURE__ */ jsxRuntime.jsx("g", { ...drawing ? { clipPath: `url(#${\u5207\u308A\u629C\u304Did})` } : {}, children: slices.map((s, idx) => /* @__PURE__ */ jsxRuntime.jsx(
6785
6832
  "path",
6786
6833
  {
6787
6834
  "data-cdl-role": "chart-pie-slice",
@@ -6793,8 +6840,8 @@ function ChartPieNode({
6793
6840
  strokeWidth: 1.5
6794
6841
  },
6795
6842
  `slice-${idx}`
6796
- )),
6797
- slices.map((s, idx) => /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${legendX} ${legendStartY + idx * legendGap})`, children: [
6843
+ )) }),
6844
+ slices.map((s, idx) => !\u958B\u304D\u59CB\u3081\u305F(s.startFrac) ? null : /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${legendX} ${legendStartY + idx * legendGap})`, children: [
6798
6845
  /* @__PURE__ */ jsxRuntime.jsx(
6799
6846
  "rect",
6800
6847
  {
@@ -6832,6 +6879,15 @@ function ChartPieNode({
6832
6879
  ] }, `legend-${idx}`))
6833
6880
  ] });
6834
6881
  }
6882
+ function \u6247\u5F62\u306E\u5207\u308A\u629C\u304D(cx, cy, r, \u958B\u304D) {
6883
+ if (\u958B\u304D <= 0) return null;
6884
+ if (\u958B\u304D >= 1) return /* @__PURE__ */ jsxRuntime.jsx("circle", { cx, cy, r });
6885
+ const a0 = -Math.PI / 2;
6886
+ const a1 = a0 + \u958B\u304D * Math.PI * 2;
6887
+ const large = \u958B\u304D > 0.5 ? 1 : 0;
6888
+ const d = `M ${cx} ${cy} L ${cx + r * Math.cos(a0)} ${cy + r * Math.sin(a0)} A ${r} ${r} 0 ${large} 1 ${cx + r * Math.cos(a1)} ${cy + r * Math.sin(a1)} Z`;
6889
+ return /* @__PURE__ */ jsxRuntime.jsx("path", { d });
6890
+ }
6835
6891
  var FALLBACK_ORDER = ["accent", "teal", "warning", "success", "info", "error"];
6836
6892
  function sliceColor(tone, idx) {
6837
6893
  if (tone) return TONE[tone];
@@ -6840,7 +6896,9 @@ function sliceColor(tone, idx) {
6840
6896
  function ChartBarNode({
6841
6897
  node,
6842
6898
  active,
6843
- stateValues = {}
6899
+ stateValues = {},
6900
+ drawing = false,
6901
+ progress = 1
6844
6902
  }) {
6845
6903
  const x0 = node.cx - node.w / 2;
6846
6904
  const y0 = node.cy - node.h / 2;
@@ -6863,6 +6921,8 @@ function ChartBarNode({
6863
6921
  const v = vMax * i / gridCount;
6864
6922
  return { y: yAt(v), value: v };
6865
6923
  });
6924
+ const \u4F38\u3073 = drawing ? Math.min(1, Math.max(0, Number.isFinite(progress) ? progress : 1)) : 1;
6925
+ const \u6A2A\u8EF8\u306Ey = PAD_TOP + canvasH;
6866
6926
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${x0} ${y0})`, children: [
6867
6927
  /* @__PURE__ */ jsxRuntime.jsx(
6868
6928
  "rect",
@@ -6919,26 +6979,28 @@ function ChartBarNode({
6919
6979
  const bx = xAt(idx);
6920
6980
  const by = yAt(d.value);
6921
6981
  const bh = PAD_TOP + canvasH - by;
6982
+ const \u898B\u3048\u3066\u3044\u308B\u982D = \u6A2A\u8EF8\u306Ey - (\u6A2A\u8EF8\u306Ey - by) * \u4F38\u3073;
6983
+ const \u68D2 = /* @__PURE__ */ jsxRuntime.jsx(
6984
+ "rect",
6985
+ {
6986
+ "data-cdl-role": "chart-bar",
6987
+ "data-cdl-unresolved": d.unresolved ? "true" : void 0,
6988
+ x: bx,
6989
+ y: by,
6990
+ width: barW,
6991
+ height: bh,
6992
+ rx: 2,
6993
+ fill: "var(--cdl-tone-accent, #2d6a8f)",
6994
+ fillOpacity: 0.9
6995
+ }
6996
+ );
6922
6997
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
6923
- /* @__PURE__ */ jsxRuntime.jsx(
6924
- "rect",
6925
- {
6926
- "data-cdl-role": "chart-bar",
6927
- "data-cdl-unresolved": d.unresolved ? "true" : void 0,
6928
- x: bx,
6929
- y: by,
6930
- width: barW,
6931
- height: bh,
6932
- rx: 2,
6933
- fill: "var(--cdl-tone-accent, #2d6a8f)",
6934
- fillOpacity: 0.9
6935
- }
6936
- ),
6998
+ drawing ? /* @__PURE__ */ jsxRuntime.jsx("g", { transform: `translate(0 ${\u6A2A\u8EF8\u306Ey}) scale(1 ${\u4F38\u3073}) translate(0 ${-\u6A2A\u8EF8\u306Ey})`, children: \u68D2 }) : \u68D2,
6937
6999
  /* @__PURE__ */ jsxRuntime.jsx(
6938
7000
  "text",
6939
7001
  {
6940
7002
  x: bx + barW / 2,
6941
- y: by - 6,
7003
+ y: \u898B\u3048\u3066\u3044\u308B\u982D - 6,
6942
7004
  fontSize: 11,
6943
7005
  textAnchor: "middle",
6944
7006
  fill: "var(--cdl-text, #1a1f2a)",
@@ -12192,6 +12254,7 @@ function ShapeCustomerServiceNode({ node, active }) {
12192
12254
  function CdlNodeView({
12193
12255
  node,
12194
12256
  active,
12257
+ drawing = false,
12195
12258
  progress,
12196
12259
  stateValues,
12197
12260
  currentPhaseId
@@ -12241,11 +12304,38 @@ function CdlNodeView({
12241
12304
  // 数と語を取る 7 種に対し、mind-map / tree-hierarchy は **名前だけ** を取る (#467)。
12242
12305
  // 親子の繋がりと、描かれない欄 (補足) は解決しない。
12243
12306
  case "chart-line":
12244
- return /* @__PURE__ */ jsxRuntime.jsx(ChartLineNode, { node: resolvedNode, active, stateValues });
12307
+ return /* @__PURE__ */ jsxRuntime.jsx(
12308
+ ChartLineNode,
12309
+ {
12310
+ node: resolvedNode,
12311
+ active,
12312
+ stateValues,
12313
+ drawing,
12314
+ progress
12315
+ }
12316
+ );
12245
12317
  case "chart-pie":
12246
- return /* @__PURE__ */ jsxRuntime.jsx(ChartPieNode, { node: resolvedNode, active, stateValues });
12318
+ return /* @__PURE__ */ jsxRuntime.jsx(
12319
+ ChartPieNode,
12320
+ {
12321
+ node: resolvedNode,
12322
+ active,
12323
+ stateValues,
12324
+ drawing,
12325
+ progress
12326
+ }
12327
+ );
12247
12328
  case "chart-bar":
12248
- return /* @__PURE__ */ jsxRuntime.jsx(ChartBarNode, { node: resolvedNode, active, stateValues });
12329
+ return /* @__PURE__ */ jsxRuntime.jsx(
12330
+ ChartBarNode,
12331
+ {
12332
+ node: resolvedNode,
12333
+ active,
12334
+ stateValues,
12335
+ drawing,
12336
+ progress
12337
+ }
12338
+ );
12249
12339
  case "gantt-timeline":
12250
12340
  return /* @__PURE__ */ jsxRuntime.jsx(GanttNode, { node: resolvedNode, active, stateValues });
12251
12341
  case "mind-map":
@@ -12435,6 +12525,7 @@ function CdlStage({
12435
12525
  svgRef
12436
12526
  }) {
12437
12527
  const activeSet = new Set(currentPhase?.activate ?? []);
12528
+ const drawSet = new Set(currentPhase?.draw ?? []);
12438
12529
  const { lifelineStarts, uniformFooterTop } = react.useMemo(() => {
12439
12530
  const starts = lifelineStartYs(laid.nodes);
12440
12531
  return {
@@ -12571,6 +12662,7 @@ function CdlStage({
12571
12662
  {
12572
12663
  node,
12573
12664
  active: activeSet.has(node.id),
12665
+ drawing: drawSet.has(node.id),
12574
12666
  progress,
12575
12667
  stateValues,
12576
12668
  currentPhaseId: currentPhase?.id