@cardenelabs/cdl 0.67.0 → 0.68.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 CHANGED
@@ -5,6 +5,55 @@ CDL (Chainome Diagram Language) の主要変更履歴。
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.68.0] - 2026-09-26
9
+
10
+ ### Fixed
11
+
12
+ - **工程表の帯が伸びる途中で角ばるのと、依存の線が帯から離れるのを直した** (#875)
13
+
14
+ 動いている途中を撮って測ったところ、3 つの問題が出た。
15
+
16
+ | 何が起きていたか | 実測 |
17
+ |---|---|
18
+ | 帯の丸い両端が伸びている間だけ潰れる | 進み 0.31 で丸みの横幅が 15 から 4.65 |
19
+ | 依存の矢じりが帯に届かず宙に浮く | 前の工程の直後に次が始まる並びで隙間 6 に対し、矢じりと曲がりに 18 要る |
20
+ | 線の出る所が帯の外に出る | 位置 85 の幅 3 の帯で、出発点 172.5 に対し右端 160.5 |
21
+
22
+ 1 つ目は伸ばし方。 帯を包む `g` に横倍率 (`scale(N 1)`) をかけていたため、丸い両端も一緒に潰れていた。
23
+ **`rect` の `width` そのものを変える形に替えた**。 丸みは円のまま残り、短い帯は縦長の楕円へ素直に縮む。
24
+ 包みが要らなくなったので、図の中に `scale(` を持つ `transform` は 1 つも無くなった
25
+ (担当者の字だけを包みの外へ出していた #873 の形も、これで不要になる)。
26
+
27
+ 2 つ目は線の形。 折れ線で右へ出てから下りて左へ戻る Z 字だったため、隙間の狭い並びで矢じりが帯に
28
+ 届かなかった。 **前の帯の下端から出て次の帯の上端へ入る曲線 1 本** に替えた。 行と行の間は必ず
29
+ `rowGap` ぶん空いているので、どんな並びでも同じ形で引ける。
30
+
31
+ 3 つ目は出入りの点。 丸みぶん内側へ寄せていたが、目盛りが細かい図では帯が丸み 2 つぶんより狭くなる。
32
+ **寄せ幅を帯の半分で頭打ちにした**。 狭い帯では帯の真ん中から線が出る。
33
+
34
+ 矢じりは幅 11 / 高さ 7 の平たい三角、線は太さ 2.4 にした。 細く尖った矢じりだと、高さ 30 の丸帯の
35
+ そばで線だけが浮いて見える。
36
+
37
+ ### Changed
38
+
39
+ - **工程表の見た目を作り直した** (#875)
40
+
41
+ | 部位 | 変更前 | 変更後 |
42
+ |---|---|---|
43
+ | 期間の見出し | 図の下 | 図の上 (罫を 1 本引く) |
44
+ | 行の地 | 無し | 1 行おきに薄く敷く (`data-cdl-role="gantt-row"`) |
45
+ | 名前の列と図の境 | 無し | 縦罫を 1 本引く |
46
+ | 目盛りの縦線 | 破線 0.75 / 不透明度 0.5 | 実線 1 / 不透明度 0.45 |
47
+ | 帯の高さ | 行いっぱい | 30 で頭打ちにして行の中で中央に置く |
48
+ | 帯の角 | 6 | 高さの半分 (丸帯) |
49
+
50
+ 期間の見出しを上へ動かしたのは、工程表が上から下へ読む図だから。 下にあると、最後の行まで読んでから
51
+ 目盛りを確かめに戻ることになる。
52
+
53
+ 行の地を 1 行おきに敷くのは、名前の列と帯が横に離れているため。 名前がどの帯のものかを目で追える。
54
+
55
+ 帯を行いっぱいに塗ると塊に見えるので、高さを 30 で頭打ちにして行の中で中央に置く。
56
+
8
57
  ## [0.67.0] - 2026-09-25
9
58
 
10
59
  ### Fixed
@@ -2851,7 +2900,8 @@ Initial OSS release.
2851
2900
  使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
2852
2901
  行き止まりになる。
2853
2902
 
2854
- [Unreleased]: https://github.com/cardene777/cdl/compare/v0.67.0...HEAD
2903
+ [Unreleased]: https://github.com/cardene777/cdl/compare/v0.68.0...HEAD
2904
+ [0.68.0]: https://github.com/cardene777/cdl/compare/v0.67.0...v0.68.0
2855
2905
  [0.67.0]: https://github.com/cardene777/cdl/compare/v0.66.0...v0.67.0
2856
2906
  [0.66.0]: https://github.com/cardene777/cdl/compare/v0.65.0...v0.66.0
2857
2907
  [0.65.0]: https://github.com/cardene777/cdl/compare/v0.64.1...v0.65.0
package/dist/index.cjs CHANGED
@@ -26974,15 +26974,16 @@ function GanttNode({
26974
26974
  const x0 = node.cx - node.w / 2;
26975
26975
  const y0 = node.cy - node.h / 2;
26976
26976
  const tasks = resolveGanttData(node.ganttData ?? [], stateValues);
26977
- const PAD_TOP2 = 32;
26977
+ const PAD_TOP2 = 46;
26978
26978
  const PAD_RIGHT2 = 48;
26979
- const PAD_BOTTOM2 = 44;
26979
+ const PAD_BOTTOM2 = 26;
26980
26980
  const PAD_LEFT2 = 156;
26981
26981
  const canvasW = node.w - PAD_LEFT2 - PAD_RIGHT2;
26982
26982
  const canvasH = node.h - PAD_TOP2 - PAD_BOTTOM2;
26983
26983
  const rowGap = 20;
26984
26984
  const rowCount = tasks.length || 1;
26985
26985
  const rowH = Math.max(28, (canvasH - rowGap * (rowCount + 1)) / rowCount);
26986
+ const \u5E2F\u306E\u9AD8\u3055 = Math.min(rowH, 30);
26986
26987
  const \u4F4D\u7F6E\u306E\u4E0A\u9650 = 1e6;
26987
26988
  const \u53CE\u3081\u305F = tasks.map((t) => {
26988
26989
  const \u59CB = Math.min(\u4F4D\u7F6E\u306E\u4E0A\u9650, Math.max(0, Number.isFinite(t.startIdx) ? t.startIdx : 0));
@@ -27008,6 +27009,7 @@ function GanttNode({
27008
27009
  const \u76EE\u76DB\u308A\u306E\u672C\u6570 = Math.ceil(maxIdx / \u76EE\u76DB\u308A\u306E\u9593\u9694);
27009
27010
  const xAt = (idx) => PAD_LEFT2 + idx * cellW;
27010
27011
  const yAt = (row) => PAD_TOP2 + rowGap + row * (rowH + rowGap);
27012
+ const \u5E2F\u306E\u4E0A = (row) => yAt(row) + (rowH - \u5E2F\u306E\u9AD8\u3055) / 2;
27011
27013
  const \u540D\u524D = { \u6574\u6570\u306E\u958B\u59CB: /* @__PURE__ */ new Map(), \u6574\u6570\u306E\u7D42\u4E86: /* @__PURE__ */ new Map(), \u7AEF\u6570\u306E\u958B\u59CB: /* @__PURE__ */ new Map(), \u7AEF\u6570\u306E\u7D42\u4E86: /* @__PURE__ */ new Map() };
27012
27014
  const \u7F6E\u304F = (\u8868, \u4F4D\u7F6E, label) => {
27013
27015
  if (label !== "" && Number.isFinite(\u4F4D\u7F6E) && !\u8868.has(\u4F4D\u7F6E)) \u8868.set(\u4F4D\u7F6E, label);
@@ -27047,6 +27049,43 @@ function GanttNode({
27047
27049
  strokeWidth: active ? 3 : 1.25
27048
27050
  }
27049
27051
  ),
27052
+ \u6574\u3048\u305F.map(
27053
+ (t, row) => row % 2 === 0 ? null : /* @__PURE__ */ jsxRuntime.jsx(
27054
+ "rect",
27055
+ {
27056
+ "data-cdl-role": "gantt-row",
27057
+ x: PAD_LEFT2,
27058
+ y: yAt(row) - rowGap / 2,
27059
+ width: canvasW,
27060
+ height: rowH + rowGap,
27061
+ fill: "var(--cdl-surface-sunken, #f4f2ed)",
27062
+ opacity: 0.55
27063
+ },
27064
+ `band-${t.id}`
27065
+ )
27066
+ ),
27067
+ /* @__PURE__ */ jsxRuntime.jsx(
27068
+ "line",
27069
+ {
27070
+ x1: PAD_LEFT2,
27071
+ y1: PAD_TOP2,
27072
+ x2: PAD_LEFT2 + canvasW,
27073
+ y2: PAD_TOP2,
27074
+ stroke: "var(--cdl-divider, #d4d4d8)",
27075
+ strokeWidth: 1
27076
+ }
27077
+ ),
27078
+ /* @__PURE__ */ jsxRuntime.jsx(
27079
+ "line",
27080
+ {
27081
+ x1: PAD_LEFT2,
27082
+ y1: PAD_TOP2,
27083
+ x2: PAD_LEFT2,
27084
+ y2: PAD_TOP2 + canvasH,
27085
+ stroke: "var(--cdl-divider, #d4d4d8)",
27086
+ strokeWidth: 1
27087
+ }
27088
+ ),
27050
27089
  gridLabels.map(({ \u4F4D\u7F6E: i, label }) => /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
27051
27090
  /* @__PURE__ */ jsxRuntime.jsx(
27052
27091
  "line",
@@ -27057,9 +27096,8 @@ function GanttNode({
27057
27096
  x2: xAt(i),
27058
27097
  y2: PAD_TOP2 + canvasH,
27059
27098
  stroke: "var(--cdl-divider, #d4d4d8)",
27060
- strokeWidth: 0.75,
27061
- strokeDasharray: "3 3",
27062
- opacity: 0.5
27099
+ strokeWidth: 1,
27100
+ opacity: 0.45
27063
27101
  }
27064
27102
  ),
27065
27103
  label === "" ? null : /* @__PURE__ */ jsxRuntime.jsx(
@@ -27067,7 +27105,7 @@ function GanttNode({
27067
27105
  {
27068
27106
  "data-cdl-role": "gantt-tick",
27069
27107
  x: xAt(i) + cellW / 2,
27070
- y: PAD_TOP2 + canvasH + 18,
27108
+ y: PAD_TOP2 - 16,
27071
27109
  fontSize: 11,
27072
27110
  textAnchor: "middle",
27073
27111
  fill: "var(--cdl-text-dim, #5a6270)",
@@ -27083,14 +27121,14 @@ function GanttNode({
27083
27121
  x2: xAt(maxIdx),
27084
27122
  y2: PAD_TOP2 + canvasH,
27085
27123
  stroke: "var(--cdl-divider, #d4d4d8)",
27086
- strokeWidth: 0.75,
27087
- opacity: 0.5
27124
+ strokeWidth: 1,
27125
+ opacity: 0.45
27088
27126
  }
27089
27127
  ),
27090
27128
  \u6574\u3048\u305F.map((t, row) => /* @__PURE__ */ jsxRuntime.jsx(
27091
27129
  "text",
27092
27130
  {
27093
- x: PAD_LEFT2 - 12,
27131
+ x: PAD_LEFT2 - 16,
27094
27132
  y: yAt(row) + rowH / 2 + 4,
27095
27133
  fontSize: 12,
27096
27134
  textAnchor: "end",
@@ -27102,37 +27140,33 @@ function GanttNode({
27102
27140
  )),
27103
27141
  \u6574\u3048\u305F.map((t, row) => {
27104
27142
  const bx = \u5E2F\u306E\u5DE6(t.startIdx);
27105
- const by = yAt(row);
27143
+ const by = \u5E2F\u306E\u4E0A(row);
27106
27144
  const bw = Math.max(0, \u5E2F\u306E\u53F3(t.endIdx) - bx);
27107
27145
  const \u3053\u306E\u884C = \u884C\u306E\u4F38\u3073(row);
27146
+ const \u4ECA\u306E\u5E45 = drawing ? bw * \u3053\u306E\u884C : bw;
27108
27147
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
27109
27148
  /* @__PURE__ */ jsxRuntime.jsx(
27110
- "g",
27149
+ "rect",
27111
27150
  {
27112
- ...drawing ? { transform: `translate(${bx} 0) scale(${\u3053\u306E\u884C} 1) translate(${-bx} 0)` } : {},
27113
- children: /* @__PURE__ */ jsxRuntime.jsx(
27114
- "rect",
27115
- {
27116
- "data-cdl-role": "gantt-bar",
27117
- "data-cdl-unresolved": t.unresolved ? "true" : void 0,
27118
- "data-cdl-clipped": "clipped" in t && t.clipped ? "true" : void 0,
27119
- x: bx,
27120
- y: by,
27121
- width: bw,
27122
- height: rowH,
27123
- rx: 4,
27124
- fill: toneColor4(t.tone),
27125
- fillOpacity: 0.9
27126
- }
27127
- )
27151
+ "data-cdl-role": "gantt-bar",
27152
+ "data-cdl-unresolved": t.unresolved ? "true" : void 0,
27153
+ "data-cdl-clipped": "clipped" in t && t.clipped ? "true" : void 0,
27154
+ x: bx,
27155
+ y: by,
27156
+ width: \u4ECA\u306E\u5E45,
27157
+ height: \u5E2F\u306E\u9AD8\u3055,
27158
+ rx: \u5E2F\u306E\u9AD8\u3055 / 2,
27159
+ ry: \u5E2F\u306E\u9AD8\u3055 / 2,
27160
+ fill: toneColor4(t.tone),
27161
+ fillOpacity: 0.9
27128
27162
  }
27129
27163
  ),
27130
- t.owner && rowH >= 22 && \u3053\u306E\u884C >= 1 && /* @__PURE__ */ jsxRuntime.jsx(
27164
+ t.owner && \u5E2F\u306E\u9AD8\u3055 >= 22 && \u3053\u306E\u884C >= 1 && /* @__PURE__ */ jsxRuntime.jsx(
27131
27165
  "text",
27132
27166
  {
27133
27167
  "data-cdl-role": "gantt-owner",
27134
27168
  x: bx + bw / 2,
27135
- y: by + rowH / 2 + 4,
27169
+ y: by + \u5E2F\u306E\u9AD8\u3055 / 2 + 4,
27136
27170
  fontSize: 11,
27137
27171
  textAnchor: "middle",
27138
27172
  fill: "var(--cdl-node-fill, #ffffff)",
@@ -27147,28 +27181,29 @@ function GanttNode({
27147
27181
  const parentRow = rowOf.get(parent.id);
27148
27182
  const childRow = rowOf.get(t.id);
27149
27183
  const parentBarRight = \u5E2F\u306E\u53F3(parent.endIdx);
27150
- const parentMidY = yAt(parentRow) + rowH / 2;
27151
27184
  const childBarLeft = \u5E2F\u306E\u5DE6(t.startIdx);
27152
- const childMidY = yAt(childRow) + rowH / 2;
27153
- const arrowHeadSize = 8;
27154
- const arrowHeadTipGap = 10;
27155
- const tipX = childBarLeft - arrowHeadTipGap - arrowHeadSize;
27156
- const tipY = childMidY;
27157
- const startX = parentBarRight + 4;
27158
- const elbowGap = 6;
27159
- const enterX = tipX - elbowGap;
27160
- const hasRoom = enterX - startX >= elbowGap;
27161
- const path = hasRoom ? `M ${startX} ${parentMidY} L ${enterX} ${parentMidY} L ${enterX} ${tipY} L ${tipX} ${tipY}` : `M ${startX} ${parentMidY} L ${startX + elbowGap} ${parentMidY} L ${startX + elbowGap} ${(parentMidY + tipY) / 2} L ${enterX} ${(parentMidY + tipY) / 2} L ${enterX} ${tipY} L ${tipX} ${tipY}`;
27162
- const arrowHeadPath = `M ${tipX + arrowHeadSize} ${tipY} L ${tipX} ${tipY - arrowHeadSize / 2} L ${tipX} ${tipY + arrowHeadSize / 2} Z`;
27163
- const \u4E21\u7AEF\u304C\u51FA\u305F = \u884C\u306E\u4F38\u3073(parentRow) >= 1 && \u884C\u306E\u4F38\u3073(childRow) >= 1;
27164
- return drawing && !\u4E21\u7AEF\u304C\u51FA\u305F ? null : /* @__PURE__ */ jsxRuntime.jsxs("g", { "data-cdl-role": "gantt-arrow", children: [
27185
+ const \u77E2\u3058\u308A\u306E\u5E45 = 11;
27186
+ const \u77E2\u3058\u308A\u306E\u9AD8\u3055 = 7;
27187
+ const \u4E38\u307F = \u5E2F\u306E\u9AD8\u3055 / 2;
27188
+ const \u89AA\u306E\u5DE6 = \u5E2F\u306E\u5DE6(parent.startIdx);
27189
+ const \u5B50\u306E\u53F3 = \u5E2F\u306E\u53F3(t.endIdx);
27190
+ const \u5BC4\u305B = (\u5DE6, \u53F3) => Math.min(\u4E38\u307F, (\u53F3 - \u5DE6) / 2);
27191
+ const \u51FA\u767AX = parentBarRight - \u5BC4\u305B(\u89AA\u306E\u5DE6, parentBarRight);
27192
+ const \u51FA\u767AY = \u5E2F\u306E\u4E0A(parentRow) + \u5E2F\u306E\u9AD8\u3055;
27193
+ const \u7740\u5730X = childBarLeft + \u5BC4\u305B(childBarLeft, \u5B50\u306E\u53F3);
27194
+ const \u7740\u5730Y = \u5E2F\u306E\u4E0A(childRow);
27195
+ const \u7E26\u306E\u7D42\u308F\u308AY = \u7740\u5730Y - \u77E2\u3058\u308A\u306E\u9AD8\u3055;
27196
+ const \u624B = Math.max(6, (\u7E26\u306E\u7D42\u308F\u308AY - \u51FA\u767AY) * 0.55);
27197
+ const path = `M ${\u51FA\u767AX} ${\u51FA\u767AY} C ${\u51FA\u767AX} ${\u51FA\u767AY + \u624B}, ${\u7740\u5730X} ${\u7E26\u306E\u7D42\u308F\u308AY - \u624B}, ${\u7740\u5730X} ${\u7E26\u306E\u7D42\u308F\u308AY}`;
27198
+ const arrowHeadPath = `M ${\u7740\u5730X} ${\u7740\u5730Y} L ${\u7740\u5730X - \u77E2\u3058\u308A\u306E\u5E45 / 2} ${\u7E26\u306E\u7D42\u308F\u308AY} L ${\u7740\u5730X + \u77E2\u3058\u308A\u306E\u5E45 / 2} ${\u7E26\u306E\u7D42\u308F\u308AY} Z`;
27199
+ return drawing && !(\u884C\u306E\u4F38\u3073(parentRow) >= 1 && \u884C\u306E\u4F38\u3073(childRow) >= 1) ? null : /* @__PURE__ */ jsxRuntime.jsxs("g", { "data-cdl-role": "gantt-arrow", children: [
27165
27200
  /* @__PURE__ */ jsxRuntime.jsx(
27166
27201
  "path",
27167
27202
  {
27168
27203
  d: path,
27169
27204
  fill: "none",
27170
27205
  stroke: "var(--cdl-text-mute, #8a8678)",
27171
- strokeWidth: 1.75,
27206
+ strokeWidth: 2.4,
27172
27207
  strokeLinejoin: "round",
27173
27208
  strokeLinecap: "round"
27174
27209
  }