@cardenelabs/cdl 0.25.0 → 0.27.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/index.d.cts CHANGED
@@ -2308,12 +2308,16 @@ declare const DETOUR_GAP = 94;
2308
2308
  */
2309
2309
  declare function rendersRows(kind: string | undefined): boolean;
2310
2310
  /**
2311
- * `rows` を持つ node に必要な高さ (SSOT)。
2311
+ * 行頭の印を **持たない** node に必要な高さ (SSOT)。
2312
2312
  *
2313
2313
  * 最終行の baseline から 1 行送りぶんとレイアウト余白を確保する。 行を描かない種別は `null`。
2314
2314
  *
2315
- * `layout/nodes.ts` の `autoStorageHeight` と、 下流 (dragon の sequence header 等) が
2316
- * 同じ値を使う。 各所で式を写すと、 描画を変えた時に一部だけ古くなる。
2315
+ * **印を持つ箱はこの式で決まらない**。 そちらは縞の帯の下端を起点にする
2316
+ * (`requiredMarkedRowsHeight`) = 帯を敷く箱では「行が終わる位置」 が帯の下端になるため、
2317
+ * baseline から数えると帯の下に 1 行ぶんに近い余白が残る。
2318
+ *
2319
+ * 使うのは `layout/nodes.ts` の `autoStorageHeight` の印なし経路。 各所で式を写すと、
2320
+ * 描画を変えた時に一部だけ古くなるので、下流も同じ形が要る時はここを引く。
2317
2321
  *
2318
2322
  * これは「そう置くとよい高さ」 で、 「これを下回ると破綻する高さ」 ではない。 後者は
2319
2323
  * `rowBaselineY` + `rowGlyphDepth` で、 軸 16 はそちらを見る。
@@ -3359,6 +3363,17 @@ type ClassDiagramPreset = {
3359
3363
  * 帯ではなく **箱** の幅。 帯は `箱の幅 + 余白 × 2` で宣言する。
3360
3364
  */
3361
3365
  classWidth?: number;
3366
+ /**
3367
+ * 行に 1 行おきの縞を敷くか (既定 = 敷く、 #627)。
3368
+ *
3369
+ * クラス図の箱は ER 図と同じ作り (行頭の印 + 左に名前 + 右に型) をしており、名前と型が
3370
+ * 離れて並ぶので行を横に追う目印が要る。 `er()` と同じ既定にする。
3371
+ */
3372
+ rowStripe?: boolean;
3373
+ /**
3374
+ * 図の配色の名前 (#627)。 描き手は色を持たないので、名前をそのまま markup に出す。
3375
+ */
3376
+ palette?: string;
3362
3377
  };
3363
3378
  type ClassDiagramBuilder = {
3364
3379
  class: (c: UmlClass) => ClassDiagramBuilder;
package/dist/index.d.ts CHANGED
@@ -2308,12 +2308,16 @@ declare const DETOUR_GAP = 94;
2308
2308
  */
2309
2309
  declare function rendersRows(kind: string | undefined): boolean;
2310
2310
  /**
2311
- * `rows` を持つ node に必要な高さ (SSOT)。
2311
+ * 行頭の印を **持たない** node に必要な高さ (SSOT)。
2312
2312
  *
2313
2313
  * 最終行の baseline から 1 行送りぶんとレイアウト余白を確保する。 行を描かない種別は `null`。
2314
2314
  *
2315
- * `layout/nodes.ts` の `autoStorageHeight` と、 下流 (dragon の sequence header 等) が
2316
- * 同じ値を使う。 各所で式を写すと、 描画を変えた時に一部だけ古くなる。
2315
+ * **印を持つ箱はこの式で決まらない**。 そちらは縞の帯の下端を起点にする
2316
+ * (`requiredMarkedRowsHeight`) = 帯を敷く箱では「行が終わる位置」 が帯の下端になるため、
2317
+ * baseline から数えると帯の下に 1 行ぶんに近い余白が残る。
2318
+ *
2319
+ * 使うのは `layout/nodes.ts` の `autoStorageHeight` の印なし経路。 各所で式を写すと、
2320
+ * 描画を変えた時に一部だけ古くなるので、下流も同じ形が要る時はここを引く。
2317
2321
  *
2318
2322
  * これは「そう置くとよい高さ」 で、 「これを下回ると破綻する高さ」 ではない。 後者は
2319
2323
  * `rowBaselineY` + `rowGlyphDepth` で、 軸 16 はそちらを見る。
@@ -3359,6 +3363,17 @@ type ClassDiagramPreset = {
3359
3363
  * 帯ではなく **箱** の幅。 帯は `箱の幅 + 余白 × 2` で宣言する。
3360
3364
  */
3361
3365
  classWidth?: number;
3366
+ /**
3367
+ * 行に 1 行おきの縞を敷くか (既定 = 敷く、 #627)。
3368
+ *
3369
+ * クラス図の箱は ER 図と同じ作り (行頭の印 + 左に名前 + 右に型) をしており、名前と型が
3370
+ * 離れて並ぶので行を横に追う目印が要る。 `er()` と同じ既定にする。
3371
+ */
3372
+ rowStripe?: boolean;
3373
+ /**
3374
+ * 図の配色の名前 (#627)。 描き手は色を持たないので、名前をそのまま markup に出す。
3375
+ */
3376
+ palette?: string;
3362
3377
  };
3363
3378
  type ClassDiagramBuilder = {
3364
3379
  class: (c: UmlClass) => ClassDiagramBuilder;
package/dist/index.js CHANGED
@@ -11836,6 +11836,7 @@ function rowGlyphDepth(kind) {
11836
11836
  return Math.ceil(font * ROW_GLYPH_DEPTH_RATIO);
11837
11837
  }
11838
11838
  var ROW_LAYOUT_BOTTOM_PAD = 20;
11839
+ var ROW_STRIPE_BOTTOM_PAD = 24;
11839
11840
  function requiredRowsHeight(kind, rowCount) {
11840
11841
  if (rowCount <= 0) return null;
11841
11842
  const lastBaseline = rowBaselineY(kind, rowCount - 1);
@@ -11843,6 +11844,12 @@ function requiredRowsHeight(kind, rowCount) {
11843
11844
  const pitch = kind === "storage" ? ROW_PITCH_STORAGE : ROW_PITCH_GENERIC;
11844
11845
  return lastBaseline + pitch + ROW_LAYOUT_BOTTOM_PAD;
11845
11846
  }
11847
+ function requiredMarkedRowsHeight(kind, rowCount) {
11848
+ if (rowCount <= 0) return null;
11849
+ const lastBand = rowStripeBand(kind, rowCount - 1, 0);
11850
+ if (lastBand === null) return null;
11851
+ return lastBand.y + lastBand.h + ROW_STRIPE_BOTTOM_PAD;
11852
+ }
11846
11853
  function isRenderedNode(n) {
11847
11854
  if (n.visibleIf === void 0 || n.visibleIf === "") return true;
11848
11855
  if (n.visibleIf.includes("{")) return true;
@@ -19965,7 +19972,10 @@ function autoStorageHeight(n, defaultH) {
19965
19972
  const \u7E70\u308A\u4E0A\u3052 = n.eyebrow ? 0 : \u76EE\u5370\u306A\u3057\u306E\u7E70\u308A\u4E0A\u3052("storage");
19966
19973
  if (!n.rows || n.rows.length === 0) return 115 + \u547C\u3073\u540D\u306E\u5206 - \u7E70\u308A\u4E0A\u3052;
19967
19974
  const \u5FC5\u8981 = requiredRowsHeight("storage", n.rows.length) ?? defaultH;
19968
- if (\u5370\u3042\u308A) return \u5FC5\u8981 + \u547C\u3073\u540D\u306E\u5206;
19975
+ if (\u5370\u3042\u308A) {
19976
+ const \u5E2F\u304B\u3089\u5FC5\u8981 = requiredMarkedRowsHeight("storage", n.rows.length) ?? defaultH;
19977
+ return \u5E2F\u304B\u3089\u5FC5\u8981 + \u547C\u3073\u540D\u306E\u5206;
19978
+ }
19969
19979
  return Math.max(defaultH, \u5FC5\u8981);
19970
19980
  }
19971
19981
  function autoRowsWidth(n, defaultW) {
@@ -22764,6 +22774,7 @@ var ROW_GLYPH_CX = ROW_PAD_X_PX + ROW_GLYPH_HALF + 1;
22764
22774
  var ROW_GLYPH_LEAD = 40;
22765
22775
  var ROW_TYPE_FONT = 22;
22766
22776
  var SUBTITLE_BASELINE = 118;
22777
+ var STRIPE_MIN_ROWS = 2;
22767
22778
  var SUBTITLE_FONT = 20;
22768
22779
  var UNDERLINE_DROP = 7;
22769
22780
  function RowGlyph({ mark, x, y, color }) {
@@ -22821,7 +22832,7 @@ function StorageNode({
22821
22832
  strokeWidth: active ? 3 : 1.25
22822
22833
  }
22823
22834
  ),
22824
- node.rowStripe && rows.map((_, idx) => {
22835
+ node.rowStripe && rows.length >= STRIPE_MIN_ROWS && rows.map((_, idx) => {
22825
22836
  if (idx % 2 !== 0) return null;
22826
22837
  const \u5E2F = rowStripeBand("storage", idx, \u884C\u306E\u4E0B\u3052);
22827
22838
  if (!\u5E2F) return null;
@@ -30832,7 +30843,8 @@ function stripAccess(row) {
30832
30843
  function classDiagram(preset) {
30833
30844
  const classW = resolveStorageBoxW(preset.classWidth, "classDiagram", "classWidth");
30834
30845
  const tone = preset.defaultTone ?? "info";
30835
- const b = diagram(preset.id, { topic: preset.topic });
30846
+ const \u7E1E\u3092\u6577\u304F = preset.rowStripe ?? true;
30847
+ const b = diagram(preset.id, { topic: preset.topic, palette: preset.palette });
30836
30848
  const classes = [];
30837
30849
  const phaseActivate = [];
30838
30850
  const \u7BB1 = [];
@@ -30880,7 +30892,9 @@ function classDiagram(preset) {
30880
30892
  // 種類の札は **書いた時だけ** 出す (#578)。 「クラス」 と書いた札は箱がクラスで
30881
30893
  // あることしか言わず、図の中の全ての箱に同じ字が並ぶ
30882
30894
  ...m.c.stereotype ? { eyebrow: m.c.stereotype } : {},
30883
- ...m.rows.length > 0 ? { rows: m.rows, rowMarks: m.rowMarks } : {}
30895
+ ...m.rows.length > 0 ? { rows: m.rows, rowMarks: m.rowMarks } : {},
30896
+ // 縞は行を持つ箱にだけ敷く (#627)。 行が無い箱に書いても描き手が読まない
30897
+ ...m.rows.length > 0 && \u7E1E\u3092\u6577\u304F ? { rowStripe: true } : {}
30884
30898
  });
30885
30899
  classes.push(m.c.id);
30886
30900
  phaseActivate.push(m.c.id);