@cardenelabs/cdl 0.19.0 → 0.20.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.js CHANGED
@@ -11976,6 +11976,54 @@ function buildDiagramAltText(topic, phase) {
11976
11976
  else if (body) parts.push(body);
11977
11977
  return parts.join(" ");
11978
11978
  }
11979
+ var \u6BB5\u306E\u4F4D\u7F6E = {
11980
+ actor: { \u76EE\u5370: { y: 38, size: 18 }, \u540D\u524D: { y: 86, size: 32 }, \u8AAC\u660E: { y: 140, size: 20 } },
11981
+ function: { \u76EE\u5370: { y: 38, size: 18 }, \u540D\u524D: { y: 86, size: 24 }, \u8AAC\u660E: { y: 126, size: 20 } },
11982
+ event: { \u76EE\u5370: { y: 38, size: 18 }, \u540D\u524D: { y: 88, size: 26 }, \u8AAC\u660E: { y: 128, size: 21 } },
11983
+ card: { \u76EE\u5370: { y: 38, size: 18 }, \u540D\u524D: { y: 86, size: 24 }, \u8AAC\u660E: { y: 124, size: 21 } },
11984
+ storage: {
11985
+ \u76EE\u5370: { y: 38, size: 18 },
11986
+ \u540D\u524D: { y: STORAGE_TITLE_BASELINE, size: STORAGE_TITLE_FONT },
11987
+ \u8AAC\u660E: { y: 118, size: 20 }
11988
+ }
11989
+ };
11990
+ var \u6C4E\u7528\u306E\u6BB5 = {
11991
+ \u76EE\u5370: { y: 32, size: 17 },
11992
+ \u540D\u524D: { y: GENERIC_TITLE_TOP, size: GENERIC_TITLE_FONT },
11993
+ \u8AAC\u660E: { y: 96, size: 17 }
11994
+ };
11995
+ function \u6BB5\u3092\u7A4D\u3080\u7BB1\u304B(kind, hasRows) {
11996
+ if (hasRows) return false;
11997
+ if (kind === void 0) return false;
11998
+ if (genericTextCentered(kind, false)) return false;
11999
+ return kind in \u6BB5\u306E\u4F4D\u7F6E || rendersRows(kind);
12000
+ }
12001
+ function \u6BB5\u3092\u5F15\u304F(kind) {
12002
+ const \u56FA\u6709 = \u6BB5\u306E\u4F4D\u7F6E[kind];
12003
+ if (\u56FA\u6709) return \u56FA\u6709;
12004
+ if (rendersRows(kind)) return \u6C4E\u7528\u306E\u6BB5;
12005
+ return null;
12006
+ }
12007
+ function \u76EE\u5370\u306A\u3057\u306E\u7E70\u308A\u4E0A\u3052(kind, hasRows = false) {
12008
+ if (!\u6BB5\u3092\u7A4D\u3080\u7BB1\u304B(kind, hasRows)) return 0;
12009
+ const \u6BB5 = \u6BB5\u3092\u5F15\u304F(kind);
12010
+ if (!\u6BB5) return 0;
12011
+ const \u4E0A\u3052\u308B = \u6BB5.\u540D\u524D.y - \u6BB5.\u76EE\u5370.y + (\u6BB5.\u76EE\u5370.size - \u6BB5.\u540D\u524D.size) * GLYPH_CAP_RATIO;
12012
+ return Math.max(0, Math.round(\u4E0A\u3052\u308B));
12013
+ }
12014
+ function \u8AAC\u660E\u306A\u3057\u3067\u7E2E\u3080\u91CF(kind, hasRows = false) {
12015
+ if (!\u6BB5\u3092\u7A4D\u3080\u7BB1\u304B(kind, hasRows)) return 0;
12016
+ const \u6BB5 = \u6BB5\u3092\u5F15\u304F(kind);
12017
+ if (!\u6BB5) return 0;
12018
+ return Math.max(0, \u6BB5.\u8AAC\u660E.y - \u6BB5.\u540D\u524D.y);
12019
+ }
12020
+ function \u4E2D\u8EAB\u304B\u3089\u51FA\u3059\u9AD8\u3055(kind, \u6E80\u8F09h, \u4E2D\u8EAB) {
12021
+ if (!\u6BB5\u3092\u7A4D\u3080\u7BB1\u304B(kind, \u4E2D\u8EAB.hasRows)) return \u6E80\u8F09h;
12022
+ if (\u4E2D\u8EAB.hasValue) return \u6E80\u8F09h;
12023
+ const \u5F15\u304F = (\u4E2D\u8EAB.hasEyebrow ? 0 : \u76EE\u5370\u306A\u3057\u306E\u7E70\u308A\u4E0A\u3052(kind)) + (\u4E2D\u8EAB.hasSubtitle ? 0 : \u8AAC\u660E\u306A\u3057\u3067\u7E2E\u3080\u91CF(kind));
12024
+ return Math.max(MIN_BOX_H, \u6E80\u8F09h - \u5F15\u304F);
12025
+ }
12026
+ var MIN_BOX_H = 44;
11979
12027
 
11980
12028
  // src/layout/footer-shape.ts
11981
12029
  var SHAPE_DRAW_UP_EXTENT = {
@@ -13603,7 +13651,7 @@ function layoutEdges(diag, nodes, lanes = []) {
13603
13651
  for (const p of list) parallelGroupedIds.add(p.e.id);
13604
13652
  }
13605
13653
  const distributedInParallel = /* @__PURE__ */ new Set();
13606
- const FAN_LABEL_GAP = 20;
13654
+ const FAN_LABEL_GAP = CLEARANCE_LABEL_LABEL;
13607
13655
  const computeEffectiveSides = (p) => {
13608
13656
  if (p.e.routing === "back-detour") {
13609
13657
  return { effFromSide: "top", effToSide: "top" };
@@ -13993,7 +14041,17 @@ function layoutEdges(diag, nodes, lanes = []) {
13993
14041
  const applyFanDispersion = (list, tracked) => {
13994
14042
  if (list.length < 2) return;
13995
14043
  const obstaclePatterns = new Set(list.map((r) => detectsBlockingObstacle(r.p)));
13996
- if (obstaclePatterns.size > 1) return;
14044
+ if (obstaclePatterns.size > 1) {
14045
+ const \u5F62\u3054\u3068 = /* @__PURE__ */ new Map();
14046
+ for (const r of list) {
14047
+ const \u5F62 = detectsBlockingObstacle(r.p);
14048
+ \u5F62\u3054\u3068.set(\u5F62, [...\u5F62\u3054\u3068.get(\u5F62) ?? [], r]);
14049
+ }
14050
+ for (const \u540C\u3058\u5F62 of \u5F62\u3054\u3068.values()) {
14051
+ if (\u540C\u3058\u5F62.length < list.length) applyFanDispersion(\u540C\u3058\u5F62, tracked);
14052
+ }
14053
+ return;
14054
+ }
13997
14055
  if (list.some((r) => r.e.overlay)) return;
13998
14056
  const items = list.map((r) => ({
13999
14057
  r,
@@ -15086,7 +15144,8 @@ function autoStorageHeight(n, defaultH) {
15086
15144
  if (n.h != null) return n.h;
15087
15145
  const \u5370\u3042\u308A = n.rowMarks !== void 0;
15088
15146
  const \u547C\u3073\u540D\u306E\u5206 = \u5370\u3042\u308A && n.subtitle ? SUBTITLE_ROW_SHIFT : 0;
15089
- if (!n.rows || n.rows.length === 0) return 115 + \u547C\u3073\u540D\u306E\u5206;
15147
+ const \u7E70\u308A\u4E0A\u3052 = n.eyebrow ? 0 : \u76EE\u5370\u306A\u3057\u306E\u7E70\u308A\u4E0A\u3052("storage");
15148
+ if (!n.rows || n.rows.length === 0) return 115 + \u547C\u3073\u540D\u306E\u5206 - \u7E70\u308A\u4E0A\u3052;
15090
15149
  const \u5FC5\u8981 = requiredRowsHeight("storage", n.rows.length) ?? defaultH;
15091
15150
  if (\u5370\u3042\u308A) return \u5FC5\u8981 + \u547C\u3073\u540D\u306E\u5206;
15092
15151
  return Math.max(defaultH, \u5FC5\u8981);
@@ -15097,6 +15156,16 @@ function autoRowsWidth(n, defaultW) {
15097
15156
  const required = requiredRowsWidth(n.rows, n.kind);
15098
15157
  return Math.max(defaultW, required);
15099
15158
  }
15159
+ function \u7BB1\u306E\u9AD8\u3055(n, \u65E2\u5B9Ah) {
15160
+ if (n.h != null) return n.h;
15161
+ if (n.kind === "storage") return autoStorageHeight(n, \u65E2\u5B9Ah);
15162
+ return \u4E2D\u8EAB\u304B\u3089\u51FA\u3059\u9AD8\u3055(n.kind, \u65E2\u5B9Ah, {
15163
+ hasEyebrow: Boolean(n.eyebrow),
15164
+ hasSubtitle: Boolean(n.subtitle),
15165
+ hasValue: Boolean(n.value),
15166
+ hasRows: (n.rows?.length ?? 0) > 0
15167
+ });
15168
+ }
15100
15169
  function requiredStackGapForEdgeLabels(diag, allStacks) {
15101
15170
  const byId = new Map(diag.nodes.map((n) => [n.id, n]));
15102
15171
  const rankOf = new Map(allStacks.map((stack, i) => [stack, i]));
@@ -15126,7 +15195,7 @@ function layoutNodes(diag, lanes) {
15126
15195
  const rowH = /* @__PURE__ */ new Map();
15127
15196
  for (const stack of allStacks) {
15128
15197
  const nodesAtStack = diag.nodes.filter((n) => n.stack === stack);
15129
- const h = Math.max(...nodesAtStack.map((n) => autoStorageHeight(n, NODE_SIZE[n.kind].h)));
15198
+ const h = Math.max(...nodesAtStack.map((n) => \u7BB1\u306E\u9AD8\u3055(n, NODE_SIZE[n.kind].h)));
15130
15199
  rowH.set(stack, h);
15131
15200
  }
15132
15201
  const rowCy = /* @__PURE__ */ new Map();
@@ -15179,8 +15248,8 @@ function layoutNodes(diag, lanes) {
15179
15248
  const cx = lane.x + lane.width / 2;
15180
15249
  const \u6BB5\u306E\u82AF = rowCy.get(n.stack);
15181
15250
  const \u6BB5\u306E\u9AD8\u3055 = rowH.get(n.stack);
15182
- const \u81EA\u524D\u306E\u9AD8\u3055 = n.rowMarks !== void 0;
15183
- const h = n.h ?? (\u81EA\u524D\u306E\u9AD8\u3055 ? autoStorageHeight(n, size.h) : \u6BB5\u306E\u9AD8\u3055);
15251
+ const \u81EA\u524D\u306E\u9AD8\u3055 = n.rowMarks !== void 0 || \u6BB5\u3092\u7A4D\u3080\u7BB1\u304B(n.kind, (n.rows?.length ?? 0) > 0);
15252
+ const h = n.h ?? (\u81EA\u524D\u306E\u9AD8\u3055 ? \u7BB1\u306E\u9AD8\u3055(n, size.h) : \u6BB5\u306E\u9AD8\u3055);
15184
15253
  const cy = \u6BB5\u306E\u82AF;
15185
15254
  const w = autoRowsWidth(n, size.w);
15186
15255
  out.push({
@@ -16621,10 +16690,10 @@ function \u66F8\u8A18\u7D20\u306B\u5206\u3051\u308B(text) {
16621
16690
  if (typeof \u533A\u5207\u308A !== "function") return [...text];
16622
16691
  return [...new \u533A\u5207\u308A(void 0, { granularity: "grapheme" }).segment(text)].map((g) => g.segment);
16623
16692
  }
16624
- function \u7BB1\u306B\u7A4D\u3080(\u884C, \u7BB1\u306E\u5E45, \u7BB1\u306E\u9AD8\u3055) {
16693
+ function \u7BB1\u306B\u7A4D\u3080(\u884C, \u7BB1\u306E\u5E45, \u7BB1\u306E\u9AD8\u30552) {
16625
16694
  const \u5019\u88DC = \u884C.filter((r, i) => i === 0 || r.text.trim() !== "");
16626
16695
  if (\u5019\u88DC.length === 0) return [];
16627
- const \u4F7F\u3048\u308B\u9AD8\u3055 = \u7BB1\u306E\u9AD8\u3055 - \u4E0A\u4E0B\u306E\u4F59\u767D * 2;
16696
+ const \u4F7F\u3048\u308B\u9AD8\u3055 = \u7BB1\u306E\u9AD8\u30552 - \u4E0A\u4E0B\u306E\u4F59\u767D * 2;
16628
16697
  const \u9AD8\u3055 = (rs) => rs.reduce((a, r) => a + r.fontSize * \u884C\u9001\u308A\u306E\u6BD4, 0);
16629
16698
  const \u6B8B\u3059 = [...\u5019\u88DC];
16630
16699
  while (\u6B8B\u3059.length > 1 && \u9AD8\u3055(\u6B8B\u3059) > \u4F7F\u3048\u308B\u9AD8\u3055) \u6B8B\u3059.pop();
@@ -16843,7 +16912,7 @@ function \u30D9\u30B8\u30A8\u306E\u7D2F\u7A4D\u5272\u5408(\u70B9, \u5236\u5FA1\u
16843
16912
  function \u7BB1\u306E\u6587\u5B57({
16844
16913
  \u884C,
16845
16914
  x,
16846
- \u7BB1\u306E\u9AD8\u3055,
16915
+ \u7BB1\u306E\u9AD8\u3055: \u7BB1\u306E\u9AD8\u30552,
16847
16916
  fill,
16848
16917
  \u540D\u524D\u306E\u592A\u3055
16849
16918
  }) {
@@ -16852,7 +16921,7 @@ function \u7BB1\u306E\u6587\u5B57({
16852
16921
  {
16853
16922
  "data-cdl-role": r.\u5F79\u5272 === "subtitle" ? "tree-node-subtitle" : void 0,
16854
16923
  x,
16855
- y: \u7BB1\u306E\u9AD8\u3055 / 2 + r.dy,
16924
+ y: \u7BB1\u306E\u9AD8\u30552 / 2 + r.dy,
16856
16925
  fontSize: r.fontSize,
16857
16926
  fontWeight: r.\u5F79\u5272 === "title" ? \u540D\u524D\u306E\u592A\u3055 : 500,
16858
16927
  textAnchor: "middle",
@@ -21531,7 +21600,8 @@ function ActorNode({ node, active, value }) {
21531
21600
  const accent = nodeAccent(node, "var(--cdl-tone-accent, #2d6a8f)");
21532
21601
  const x = node.cx - node.w / 2;
21533
21602
  const y = node.cy - node.h / 2;
21534
- const \u540D\u524D = titlePlacement(node, { x: 26, y: 86, size: 32 }, { hasEyebrow: Boolean(node.eyebrow) });
21603
+ const \u7E70\u308A\u4E0A\u3052 = node.eyebrow ? 0 : \u76EE\u5370\u306A\u3057\u306E\u7E70\u308A\u4E0A\u3052("actor");
21604
+ const \u540D\u524D = titlePlacement(node, { x: 26, y: 86 - \u7E70\u308A\u4E0A\u3052, size: 32 }, { hasEyebrow: Boolean(node.eyebrow) });
21535
21605
  return /* @__PURE__ */ jsxs("g", { transform: `translate(${x} ${y})`, children: [
21536
21606
  /* @__PURE__ */ jsx(
21537
21607
  "rect",
@@ -21566,13 +21636,13 @@ function ActorNode({ node, active, value }) {
21566
21636
  {
21567
21637
  "data-cdl-role": "node-row-divider",
21568
21638
  x1: 26,
21569
- y1: 110,
21639
+ y1: 110 - \u7E70\u308A\u4E0A\u3052,
21570
21640
  x2: node.w - 26,
21571
- y2: 110,
21641
+ y2: 110 - \u7E70\u308A\u4E0A\u3052,
21572
21642
  stroke: "var(--cdl-row-divider, #7e848e)"
21573
21643
  }
21574
21644
  ),
21575
- node.subtitle && /* @__PURE__ */ jsx("text", { x: 26, y: 140, fontSize: 20, fill: "var(--cdl-text-dim, #5a6270)", children: node.subtitle }),
21645
+ node.subtitle && /* @__PURE__ */ jsx("text", { x: 26, y: 140 - \u7E70\u308A\u4E0A\u3052, fontSize: 20, fill: "var(--cdl-text-dim, #5a6270)", children: node.subtitle }),
21576
21646
  value && /* @__PURE__ */ jsx(
21577
21647
  "text",
21578
21648
  {
@@ -21597,7 +21667,8 @@ function CardNode({ node, active }) {
21597
21667
  }
21598
21668
  const compact = isCompactBox(node.h);
21599
21669
  const \u5C0F\u578B\u306B\u547C\u3073\u540D = compact && Boolean(node.subtitle);
21600
- const titleY = compact ? \u5C0F\u578B\u306B\u547C\u3073\u540D ? node.h / 2 - 2 : node.h / 2 + 8 : 86;
21670
+ const \u7E70\u308A\u4E0A\u3052 = node.eyebrow ? 0 : \u76EE\u5370\u306A\u3057\u306E\u7E70\u308A\u4E0A\u3052("card");
21671
+ const titleY = compact ? \u5C0F\u578B\u306B\u547C\u3073\u540D ? node.h / 2 - 2 : node.h / 2 + 8 : 86 - \u7E70\u308A\u4E0A\u3052;
21601
21672
  const titleX = compact ? node.w / 2 : 26;
21602
21673
  const paddingX = compact ? 16 : 52;
21603
21674
  const availableW = node.w - paddingX;
@@ -21634,7 +21705,7 @@ function CardNode({ node, active }) {
21634
21705
  children: node.title
21635
21706
  }
21636
21707
  ),
21637
- !compact && node.subtitle && /* @__PURE__ */ jsx("text", { x: 26, y: 124, fontSize: subtitleSize, fill: "var(--cdl-text-dim, #5a6270)", children: node.subtitle }),
21708
+ !compact && node.subtitle && /* @__PURE__ */ jsx("text", { x: 26, y: 124 - \u7E70\u308A\u4E0A\u3052, fontSize: subtitleSize, fill: "var(--cdl-text-dim, #5a6270)", children: node.subtitle }),
21638
21709
  \u5C0F\u578B\u306B\u547C\u3073\u540D && /* @__PURE__ */ jsx(
21639
21710
  "text",
21640
21711
  {
@@ -21898,7 +21969,8 @@ function EventNode({
21898
21969
  const accent = nodeAccent(node, "var(--cdl-tone-success, #4ea36a)");
21899
21970
  const x = node.cx - node.w / 2;
21900
21971
  const y = node.cy - node.h / 2;
21901
- const \u540D\u524D = titlePlacement(node, { x: 26, y: 88, size: 26 }, { hasEyebrow: Boolean(node.eyebrow) });
21972
+ const \u7E70\u308A\u4E0A\u3052 = node.eyebrow ? 0 : \u76EE\u5370\u306A\u3057\u306E\u7E70\u308A\u4E0A\u3052("event");
21973
+ const \u540D\u524D = titlePlacement(node, { x: 26, y: 88 - \u7E70\u308A\u4E0A\u3052, size: 26 }, { hasEyebrow: Boolean(node.eyebrow) });
21902
21974
  const scale = active ? 0.78 + 0.22 * progress : 0.92;
21903
21975
  const opacity = active ? 0.5 + 0.5 * progress : 0.65;
21904
21976
  return /* @__PURE__ */ jsx(
@@ -21940,7 +22012,7 @@ function EventNode({
21940
22012
  "text",
21941
22013
  {
21942
22014
  x: 26,
21943
- y: 128,
22015
+ y: 128 - \u7E70\u308A\u4E0A\u3052,
21944
22016
  fontSize: 21,
21945
22017
  fill: "var(--cdl-text-dim, #5a6270)",
21946
22018
  style: { fontFamily: "'JetBrains Mono', monospace" },
@@ -21956,7 +22028,8 @@ function FunctionNode({ node, active }) {
21956
22028
  const stroke = nodeAccent(node, active ? "var(--cdl-tone-accent, #2d6a8f)" : "var(--cdl-tone-teal, #2f8770)");
21957
22029
  const x = node.cx - node.w / 2;
21958
22030
  const y = node.cy - node.h / 2;
21959
- const \u540D\u524D = titlePlacement(node, { x: 26, y: 86, size: 24 }, { hasEyebrow: Boolean(node.eyebrow) });
22031
+ const \u7E70\u308A\u4E0A\u3052 = node.eyebrow ? 0 : \u76EE\u5370\u306A\u3057\u306E\u7E70\u308A\u4E0A\u3052("function");
22032
+ const \u540D\u524D = titlePlacement(node, { x: 26, y: 86 - \u7E70\u308A\u4E0A\u3052, size: 24 }, { hasEyebrow: Boolean(node.eyebrow) });
21960
22033
  return /* @__PURE__ */ jsxs("g", { transform: `translate(${x} ${y})`, children: [
21961
22034
  /* @__PURE__ */ jsx(
21962
22035
  "rect",
@@ -21988,7 +22061,7 @@ function FunctionNode({ node, active }) {
21988
22061
  children: node.title
21989
22062
  }
21990
22063
  ),
21991
- node.subtitle && /* @__PURE__ */ jsx("text", { x: 26, y: 126, fontSize: 20, fill: "var(--cdl-text-dim, #5a6270)", children: node.subtitle })
22064
+ node.subtitle && /* @__PURE__ */ jsx("text", { x: 26, y: 126 - \u7E70\u308A\u4E0A\u3052, fontSize: 20, fill: "var(--cdl-text-dim, #5a6270)", children: node.subtitle })
21992
22065
  ] });
21993
22066
  }
21994
22067
  var ROW_GLYPH_HALF = 7;
@@ -22023,7 +22096,8 @@ function StorageNode({
22023
22096
  const accent = nodeAccent(node, "var(--cdl-tone-accent, #2d6a8f)");
22024
22097
  const x = node.cx - node.w / 2;
22025
22098
  const y = node.cy - node.h / 2;
22026
- const \u540D\u524D = titlePlacement(node, { x: 26, y: STORAGE_TITLE_BASELINE, size: STORAGE_TITLE_FONT }, { hasEyebrow: Boolean(node.eyebrow) });
22099
+ const \u7E70\u308A\u4E0A\u3052 = node.eyebrow || rows.length > 0 ? 0 : \u76EE\u5370\u306A\u3057\u306E\u7E70\u308A\u4E0A\u3052("storage");
22100
+ const \u540D\u524D = titlePlacement(node, { x: 26, y: STORAGE_TITLE_BASELINE - \u7E70\u308A\u4E0A\u3052, size: STORAGE_TITLE_FONT }, { hasEyebrow: Boolean(node.eyebrow) });
22027
22101
  const splits = rows.map((r) => splitRow(r));
22028
22102
  const leftMaxWidth = splits.reduce((m, s) => Math.max(m, displayWidth(s.left)), 0);
22029
22103
  const rightColX = ROW_PAD_X_PX + leftMaxWidth * STORAGE_CHAR_ADVANCE_PX + STORAGE_COL_GAP_PX;
@@ -22060,7 +22134,7 @@ function StorageNode({
22060
22134
  {
22061
22135
  "data-cdl-role": "node-subtitle",
22062
22136
  x: ROW_PAD_X_PX,
22063
- y: SUBTITLE_BASELINE,
22137
+ y: SUBTITLE_BASELINE - \u7E70\u308A\u4E0A\u3052,
22064
22138
  fontSize: SUBTITLE_FONT,
22065
22139
  fill: "var(--cdl-text-dim, #5a6270)",
22066
22140
  children: node.subtitle
@@ -22378,9 +22452,10 @@ function GenericNode({
22378
22452
  const textAnchor = centered ? "middle" : "start";
22379
22453
  const textX = centered ? w / 2 : 20;
22380
22454
  const cylinderShift = genericTextShift(node.kind);
22455
+ const \u7E70\u308A\u4E0A\u3052 = node.eyebrow || centered ? 0 : \u76EE\u5370\u306A\u3057\u306E\u7E70\u308A\u4E0A\u3052(node.kind, hasRows);
22381
22456
  const eyebrowY = centered ? h / 2 - 26 : 32 + cylinderShift;
22382
- const titleY = genericTitleBaselineY(node.kind, h, hasRows);
22383
- const subtitleY = centered ? h / 2 + 28 : 96 + cylinderShift;
22457
+ const titleY = genericTitleBaselineY(node.kind, h, hasRows) - \u7E70\u308A\u4E0A\u3052;
22458
+ const subtitleY = centered ? h / 2 + 28 : 96 + cylinderShift - \u7E70\u308A\u4E0A\u3052;
22384
22459
  const iconX = centered ? w / 2 + 40 : w - 48;
22385
22460
  const iconY = centered ? h / 2 - 44 : 18 + cylinderShift;
22386
22461
  const dominantBaseline = centered ? "middle" : void 0;