@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/react.js CHANGED
@@ -798,6 +798,54 @@ function buildDiagramAltText(topic, phase) {
798
798
  else if (body) parts.push(body);
799
799
  return parts.join(" ");
800
800
  }
801
+ var \u6BB5\u306E\u4F4D\u7F6E = {
802
+ actor: { \u76EE\u5370: { y: 38, size: 18 }, \u540D\u524D: { y: 86, size: 32 }, \u8AAC\u660E: { y: 140, size: 20 } },
803
+ function: { \u76EE\u5370: { y: 38, size: 18 }, \u540D\u524D: { y: 86, size: 24 }, \u8AAC\u660E: { y: 126, size: 20 } },
804
+ event: { \u76EE\u5370: { y: 38, size: 18 }, \u540D\u524D: { y: 88, size: 26 }, \u8AAC\u660E: { y: 128, size: 21 } },
805
+ card: { \u76EE\u5370: { y: 38, size: 18 }, \u540D\u524D: { y: 86, size: 24 }, \u8AAC\u660E: { y: 124, size: 21 } },
806
+ storage: {
807
+ \u76EE\u5370: { y: 38, size: 18 },
808
+ \u540D\u524D: { y: STORAGE_TITLE_BASELINE, size: STORAGE_TITLE_FONT },
809
+ \u8AAC\u660E: { y: 118, size: 20 }
810
+ }
811
+ };
812
+ var \u6C4E\u7528\u306E\u6BB5 = {
813
+ \u76EE\u5370: { y: 32, size: 17 },
814
+ \u540D\u524D: { y: GENERIC_TITLE_TOP, size: GENERIC_TITLE_FONT },
815
+ \u8AAC\u660E: { y: 96, size: 17 }
816
+ };
817
+ function \u6BB5\u3092\u7A4D\u3080\u7BB1\u304B(kind, hasRows) {
818
+ if (hasRows) return false;
819
+ if (kind === void 0) return false;
820
+ if (genericTextCentered(kind, false)) return false;
821
+ return kind in \u6BB5\u306E\u4F4D\u7F6E || rendersRows(kind);
822
+ }
823
+ function \u6BB5\u3092\u5F15\u304F(kind) {
824
+ const \u56FA\u6709 = \u6BB5\u306E\u4F4D\u7F6E[kind];
825
+ if (\u56FA\u6709) return \u56FA\u6709;
826
+ if (rendersRows(kind)) return \u6C4E\u7528\u306E\u6BB5;
827
+ return null;
828
+ }
829
+ function \u76EE\u5370\u306A\u3057\u306E\u7E70\u308A\u4E0A\u3052(kind, hasRows = false) {
830
+ if (!\u6BB5\u3092\u7A4D\u3080\u7BB1\u304B(kind, hasRows)) return 0;
831
+ const \u6BB5 = \u6BB5\u3092\u5F15\u304F(kind);
832
+ if (!\u6BB5) return 0;
833
+ const \u4E0A\u3052\u308B = \u6BB5.\u540D\u524D.y - \u6BB5.\u76EE\u5370.y + (\u6BB5.\u76EE\u5370.size - \u6BB5.\u540D\u524D.size) * GLYPH_CAP_RATIO;
834
+ return Math.max(0, Math.round(\u4E0A\u3052\u308B));
835
+ }
836
+ function \u8AAC\u660E\u306A\u3057\u3067\u7E2E\u3080\u91CF(kind, hasRows = false) {
837
+ if (!\u6BB5\u3092\u7A4D\u3080\u7BB1\u304B(kind, hasRows)) return 0;
838
+ const \u6BB5 = \u6BB5\u3092\u5F15\u304F(kind);
839
+ if (!\u6BB5) return 0;
840
+ return Math.max(0, \u6BB5.\u8AAC\u660E.y - \u6BB5.\u540D\u524D.y);
841
+ }
842
+ function \u4E2D\u8EAB\u304B\u3089\u51FA\u3059\u9AD8\u3055(kind, \u6E80\u8F09h, \u4E2D\u8EAB) {
843
+ if (!\u6BB5\u3092\u7A4D\u3080\u7BB1\u304B(kind, \u4E2D\u8EAB.hasRows)) return \u6E80\u8F09h;
844
+ if (\u4E2D\u8EAB.hasValue) return \u6E80\u8F09h;
845
+ 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));
846
+ return Math.max(MIN_BOX_H, \u6E80\u8F09h - \u5F15\u304F);
847
+ }
848
+ var MIN_BOX_H = 44;
801
849
 
802
850
  // src/layout/footer-shape.ts
803
851
  var SHAPE_DRAW_UP_EXTENT = {
@@ -2267,7 +2315,7 @@ function layoutEdges(diag, nodes, lanes = []) {
2267
2315
  for (const p of list) parallelGroupedIds.add(p.e.id);
2268
2316
  }
2269
2317
  const distributedInParallel = /* @__PURE__ */ new Set();
2270
- const FAN_LABEL_GAP = 20;
2318
+ const FAN_LABEL_GAP = CLEARANCE_LABEL_LABEL;
2271
2319
  const computeEffectiveSides = (p) => {
2272
2320
  if (p.e.routing === "back-detour") {
2273
2321
  return { effFromSide: "top", effToSide: "top" };
@@ -2657,7 +2705,17 @@ function layoutEdges(diag, nodes, lanes = []) {
2657
2705
  const applyFanDispersion = (list, tracked) => {
2658
2706
  if (list.length < 2) return;
2659
2707
  const obstaclePatterns = new Set(list.map((r) => detectsBlockingObstacle(r.p)));
2660
- if (obstaclePatterns.size > 1) return;
2708
+ if (obstaclePatterns.size > 1) {
2709
+ const \u5F62\u3054\u3068 = /* @__PURE__ */ new Map();
2710
+ for (const r of list) {
2711
+ const \u5F62 = detectsBlockingObstacle(r.p);
2712
+ \u5F62\u3054\u3068.set(\u5F62, [...\u5F62\u3054\u3068.get(\u5F62) ?? [], r]);
2713
+ }
2714
+ for (const \u540C\u3058\u5F62 of \u5F62\u3054\u3068.values()) {
2715
+ if (\u540C\u3058\u5F62.length < list.length) applyFanDispersion(\u540C\u3058\u5F62, tracked);
2716
+ }
2717
+ return;
2718
+ }
2661
2719
  if (list.some((r) => r.e.overlay)) return;
2662
2720
  const items = list.map((r) => ({
2663
2721
  r,
@@ -3750,7 +3808,8 @@ function autoStorageHeight(n, defaultH) {
3750
3808
  if (n.h != null) return n.h;
3751
3809
  const \u5370\u3042\u308A = n.rowMarks !== void 0;
3752
3810
  const \u547C\u3073\u540D\u306E\u5206 = \u5370\u3042\u308A && n.subtitle ? SUBTITLE_ROW_SHIFT : 0;
3753
- if (!n.rows || n.rows.length === 0) return 115 + \u547C\u3073\u540D\u306E\u5206;
3811
+ const \u7E70\u308A\u4E0A\u3052 = n.eyebrow ? 0 : \u76EE\u5370\u306A\u3057\u306E\u7E70\u308A\u4E0A\u3052("storage");
3812
+ if (!n.rows || n.rows.length === 0) return 115 + \u547C\u3073\u540D\u306E\u5206 - \u7E70\u308A\u4E0A\u3052;
3754
3813
  const \u5FC5\u8981 = requiredRowsHeight("storage", n.rows.length) ?? defaultH;
3755
3814
  if (\u5370\u3042\u308A) return \u5FC5\u8981 + \u547C\u3073\u540D\u306E\u5206;
3756
3815
  return Math.max(defaultH, \u5FC5\u8981);
@@ -3761,6 +3820,16 @@ function autoRowsWidth(n, defaultW) {
3761
3820
  const required = requiredRowsWidth(n.rows, n.kind);
3762
3821
  return Math.max(defaultW, required);
3763
3822
  }
3823
+ function \u7BB1\u306E\u9AD8\u3055(n, \u65E2\u5B9Ah) {
3824
+ if (n.h != null) return n.h;
3825
+ if (n.kind === "storage") return autoStorageHeight(n, \u65E2\u5B9Ah);
3826
+ return \u4E2D\u8EAB\u304B\u3089\u51FA\u3059\u9AD8\u3055(n.kind, \u65E2\u5B9Ah, {
3827
+ hasEyebrow: Boolean(n.eyebrow),
3828
+ hasSubtitle: Boolean(n.subtitle),
3829
+ hasValue: Boolean(n.value),
3830
+ hasRows: (n.rows?.length ?? 0) > 0
3831
+ });
3832
+ }
3764
3833
  function requiredStackGapForEdgeLabels(diag, allStacks) {
3765
3834
  const byId = new Map(diag.nodes.map((n) => [n.id, n]));
3766
3835
  const rankOf = new Map(allStacks.map((stack, i) => [stack, i]));
@@ -3790,7 +3859,7 @@ function layoutNodes(diag, lanes) {
3790
3859
  const rowH = /* @__PURE__ */ new Map();
3791
3860
  for (const stack of allStacks) {
3792
3861
  const nodesAtStack = diag.nodes.filter((n) => n.stack === stack);
3793
- const h = Math.max(...nodesAtStack.map((n) => autoStorageHeight(n, NODE_SIZE[n.kind].h)));
3862
+ const h = Math.max(...nodesAtStack.map((n) => \u7BB1\u306E\u9AD8\u3055(n, NODE_SIZE[n.kind].h)));
3794
3863
  rowH.set(stack, h);
3795
3864
  }
3796
3865
  const rowCy = /* @__PURE__ */ new Map();
@@ -3843,8 +3912,8 @@ function layoutNodes(diag, lanes) {
3843
3912
  const cx = lane.x + lane.width / 2;
3844
3913
  const \u6BB5\u306E\u82AF = rowCy.get(n.stack);
3845
3914
  const \u6BB5\u306E\u9AD8\u3055 = rowH.get(n.stack);
3846
- const \u81EA\u524D\u306E\u9AD8\u3055 = n.rowMarks !== void 0;
3847
- const h = n.h ?? (\u81EA\u524D\u306E\u9AD8\u3055 ? autoStorageHeight(n, size.h) : \u6BB5\u306E\u9AD8\u3055);
3915
+ const \u81EA\u524D\u306E\u9AD8\u3055 = n.rowMarks !== void 0 || \u6BB5\u3092\u7A4D\u3080\u7BB1\u304B(n.kind, (n.rows?.length ?? 0) > 0);
3916
+ const h = n.h ?? (\u81EA\u524D\u306E\u9AD8\u3055 ? \u7BB1\u306E\u9AD8\u3055(n, size.h) : \u6BB5\u306E\u9AD8\u3055);
3848
3917
  const cy = \u6BB5\u306E\u82AF;
3849
3918
  const w = autoRowsWidth(n, size.w);
3850
3919
  out.push({
@@ -5885,7 +5954,8 @@ function ActorNode({ node, active, value }) {
5885
5954
  const accent = nodeAccent(node, "var(--cdl-tone-accent, #2d6a8f)");
5886
5955
  const x = node.cx - node.w / 2;
5887
5956
  const y = node.cy - node.h / 2;
5888
- const \u540D\u524D = titlePlacement(node, { x: 26, y: 86, size: 32 }, { hasEyebrow: Boolean(node.eyebrow) });
5957
+ const \u7E70\u308A\u4E0A\u3052 = node.eyebrow ? 0 : \u76EE\u5370\u306A\u3057\u306E\u7E70\u308A\u4E0A\u3052("actor");
5958
+ const \u540D\u524D = titlePlacement(node, { x: 26, y: 86 - \u7E70\u308A\u4E0A\u3052, size: 32 }, { hasEyebrow: Boolean(node.eyebrow) });
5889
5959
  return /* @__PURE__ */ jsxs("g", { transform: `translate(${x} ${y})`, children: [
5890
5960
  /* @__PURE__ */ jsx(
5891
5961
  "rect",
@@ -5920,13 +5990,13 @@ function ActorNode({ node, active, value }) {
5920
5990
  {
5921
5991
  "data-cdl-role": "node-row-divider",
5922
5992
  x1: 26,
5923
- y1: 110,
5993
+ y1: 110 - \u7E70\u308A\u4E0A\u3052,
5924
5994
  x2: node.w - 26,
5925
- y2: 110,
5995
+ y2: 110 - \u7E70\u308A\u4E0A\u3052,
5926
5996
  stroke: "var(--cdl-row-divider, #7e848e)"
5927
5997
  }
5928
5998
  ),
5929
- node.subtitle && /* @__PURE__ */ jsx("text", { x: 26, y: 140, fontSize: 20, fill: "var(--cdl-text-dim, #5a6270)", children: node.subtitle }),
5999
+ node.subtitle && /* @__PURE__ */ jsx("text", { x: 26, y: 140 - \u7E70\u308A\u4E0A\u3052, fontSize: 20, fill: "var(--cdl-text-dim, #5a6270)", children: node.subtitle }),
5930
6000
  value && /* @__PURE__ */ jsx(
5931
6001
  "text",
5932
6002
  {
@@ -5951,7 +6021,8 @@ function CardNode({ node, active }) {
5951
6021
  }
5952
6022
  const compact = isCompactBox(node.h);
5953
6023
  const \u5C0F\u578B\u306B\u547C\u3073\u540D = compact && Boolean(node.subtitle);
5954
- const titleY = compact ? \u5C0F\u578B\u306B\u547C\u3073\u540D ? node.h / 2 - 2 : node.h / 2 + 8 : 86;
6024
+ const \u7E70\u308A\u4E0A\u3052 = node.eyebrow ? 0 : \u76EE\u5370\u306A\u3057\u306E\u7E70\u308A\u4E0A\u3052("card");
6025
+ const titleY = compact ? \u5C0F\u578B\u306B\u547C\u3073\u540D ? node.h / 2 - 2 : node.h / 2 + 8 : 86 - \u7E70\u308A\u4E0A\u3052;
5955
6026
  const titleX = compact ? node.w / 2 : 26;
5956
6027
  const paddingX = compact ? 16 : 52;
5957
6028
  const availableW = node.w - paddingX;
@@ -5988,7 +6059,7 @@ function CardNode({ node, active }) {
5988
6059
  children: node.title
5989
6060
  }
5990
6061
  ),
5991
- !compact && node.subtitle && /* @__PURE__ */ jsx("text", { x: 26, y: 124, fontSize: subtitleSize, fill: "var(--cdl-text-dim, #5a6270)", children: node.subtitle }),
6062
+ !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 }),
5992
6063
  \u5C0F\u578B\u306B\u547C\u3073\u540D && /* @__PURE__ */ jsx(
5993
6064
  "text",
5994
6065
  {
@@ -6249,7 +6320,8 @@ function EventNode({
6249
6320
  const accent = nodeAccent(node, "var(--cdl-tone-success, #4ea36a)");
6250
6321
  const x = node.cx - node.w / 2;
6251
6322
  const y = node.cy - node.h / 2;
6252
- const \u540D\u524D = titlePlacement(node, { x: 26, y: 88, size: 26 }, { hasEyebrow: Boolean(node.eyebrow) });
6323
+ const \u7E70\u308A\u4E0A\u3052 = node.eyebrow ? 0 : \u76EE\u5370\u306A\u3057\u306E\u7E70\u308A\u4E0A\u3052("event");
6324
+ const \u540D\u524D = titlePlacement(node, { x: 26, y: 88 - \u7E70\u308A\u4E0A\u3052, size: 26 }, { hasEyebrow: Boolean(node.eyebrow) });
6253
6325
  const scale = active ? 0.78 + 0.22 * progress : 0.92;
6254
6326
  const opacity = active ? 0.5 + 0.5 * progress : 0.65;
6255
6327
  return /* @__PURE__ */ jsx(
@@ -6291,7 +6363,7 @@ function EventNode({
6291
6363
  "text",
6292
6364
  {
6293
6365
  x: 26,
6294
- y: 128,
6366
+ y: 128 - \u7E70\u308A\u4E0A\u3052,
6295
6367
  fontSize: 21,
6296
6368
  fill: "var(--cdl-text-dim, #5a6270)",
6297
6369
  style: { fontFamily: "'JetBrains Mono', monospace" },
@@ -6307,7 +6379,8 @@ function FunctionNode({ node, active }) {
6307
6379
  const stroke = nodeAccent(node, active ? "var(--cdl-tone-accent, #2d6a8f)" : "var(--cdl-tone-teal, #2f8770)");
6308
6380
  const x = node.cx - node.w / 2;
6309
6381
  const y = node.cy - node.h / 2;
6310
- const \u540D\u524D = titlePlacement(node, { x: 26, y: 86, size: 24 }, { hasEyebrow: Boolean(node.eyebrow) });
6382
+ const \u7E70\u308A\u4E0A\u3052 = node.eyebrow ? 0 : \u76EE\u5370\u306A\u3057\u306E\u7E70\u308A\u4E0A\u3052("function");
6383
+ const \u540D\u524D = titlePlacement(node, { x: 26, y: 86 - \u7E70\u308A\u4E0A\u3052, size: 24 }, { hasEyebrow: Boolean(node.eyebrow) });
6311
6384
  return /* @__PURE__ */ jsxs("g", { transform: `translate(${x} ${y})`, children: [
6312
6385
  /* @__PURE__ */ jsx(
6313
6386
  "rect",
@@ -6339,7 +6412,7 @@ function FunctionNode({ node, active }) {
6339
6412
  children: node.title
6340
6413
  }
6341
6414
  ),
6342
- node.subtitle && /* @__PURE__ */ jsx("text", { x: 26, y: 126, fontSize: 20, fill: "var(--cdl-text-dim, #5a6270)", children: node.subtitle })
6415
+ node.subtitle && /* @__PURE__ */ jsx("text", { x: 26, y: 126 - \u7E70\u308A\u4E0A\u3052, fontSize: 20, fill: "var(--cdl-text-dim, #5a6270)", children: node.subtitle })
6343
6416
  ] });
6344
6417
  }
6345
6418
  var ROW_GLYPH_HALF = 7;
@@ -6374,7 +6447,8 @@ function StorageNode({
6374
6447
  const accent = nodeAccent(node, "var(--cdl-tone-accent, #2d6a8f)");
6375
6448
  const x = node.cx - node.w / 2;
6376
6449
  const y = node.cy - node.h / 2;
6377
- const \u540D\u524D = titlePlacement(node, { x: 26, y: STORAGE_TITLE_BASELINE, size: STORAGE_TITLE_FONT }, { hasEyebrow: Boolean(node.eyebrow) });
6450
+ const \u7E70\u308A\u4E0A\u3052 = node.eyebrow || rows.length > 0 ? 0 : \u76EE\u5370\u306A\u3057\u306E\u7E70\u308A\u4E0A\u3052("storage");
6451
+ const \u540D\u524D = titlePlacement(node, { x: 26, y: STORAGE_TITLE_BASELINE - \u7E70\u308A\u4E0A\u3052, size: STORAGE_TITLE_FONT }, { hasEyebrow: Boolean(node.eyebrow) });
6378
6452
  const splits = rows.map((r) => splitRow(r));
6379
6453
  const leftMaxWidth = splits.reduce((m, s) => Math.max(m, displayWidth(s.left)), 0);
6380
6454
  const rightColX = ROW_PAD_X_PX + leftMaxWidth * STORAGE_CHAR_ADVANCE_PX + STORAGE_COL_GAP_PX;
@@ -6411,7 +6485,7 @@ function StorageNode({
6411
6485
  {
6412
6486
  "data-cdl-role": "node-subtitle",
6413
6487
  x: ROW_PAD_X_PX,
6414
- y: SUBTITLE_BASELINE,
6488
+ y: SUBTITLE_BASELINE - \u7E70\u308A\u4E0A\u3052,
6415
6489
  fontSize: SUBTITLE_FONT,
6416
6490
  fill: "var(--cdl-text-dim, #5a6270)",
6417
6491
  children: node.subtitle
@@ -6729,9 +6803,10 @@ function GenericNode({
6729
6803
  const textAnchor = centered ? "middle" : "start";
6730
6804
  const textX = centered ? w / 2 : 20;
6731
6805
  const cylinderShift = genericTextShift(node.kind);
6806
+ const \u7E70\u308A\u4E0A\u3052 = node.eyebrow || centered ? 0 : \u76EE\u5370\u306A\u3057\u306E\u7E70\u308A\u4E0A\u3052(node.kind, hasRows);
6732
6807
  const eyebrowY = centered ? h / 2 - 26 : 32 + cylinderShift;
6733
- const titleY = genericTitleBaselineY(node.kind, h, hasRows);
6734
- const subtitleY = centered ? h / 2 + 28 : 96 + cylinderShift;
6808
+ const titleY = genericTitleBaselineY(node.kind, h, hasRows) - \u7E70\u308A\u4E0A\u3052;
6809
+ const subtitleY = centered ? h / 2 + 28 : 96 + cylinderShift - \u7E70\u308A\u4E0A\u3052;
6735
6810
  const iconX = centered ? w / 2 + 40 : w - 48;
6736
6811
  const iconY = centered ? h / 2 - 44 : 18 + cylinderShift;
6737
6812
  const dominantBaseline = centered ? "middle" : void 0;
@@ -8768,10 +8843,10 @@ function \u66F8\u8A18\u7D20\u306B\u5206\u3051\u308B(text) {
8768
8843
  if (typeof \u533A\u5207\u308A !== "function") return [...text];
8769
8844
  return [...new \u533A\u5207\u308A(void 0, { granularity: "grapheme" }).segment(text)].map((g) => g.segment);
8770
8845
  }
8771
- function \u7BB1\u306B\u7A4D\u3080(\u884C, \u7BB1\u306E\u5E45, \u7BB1\u306E\u9AD8\u3055) {
8846
+ function \u7BB1\u306B\u7A4D\u3080(\u884C, \u7BB1\u306E\u5E45, \u7BB1\u306E\u9AD8\u30552) {
8772
8847
  const \u5019\u88DC = \u884C.filter((r, i) => i === 0 || r.text.trim() !== "");
8773
8848
  if (\u5019\u88DC.length === 0) return [];
8774
- const \u4F7F\u3048\u308B\u9AD8\u3055 = \u7BB1\u306E\u9AD8\u3055 - \u4E0A\u4E0B\u306E\u4F59\u767D * 2;
8849
+ const \u4F7F\u3048\u308B\u9AD8\u3055 = \u7BB1\u306E\u9AD8\u30552 - \u4E0A\u4E0B\u306E\u4F59\u767D * 2;
8775
8850
  const \u9AD8\u3055 = (rs) => rs.reduce((a, r) => a + r.fontSize * \u884C\u9001\u308A\u306E\u6BD4, 0);
8776
8851
  const \u6B8B\u3059 = [...\u5019\u88DC];
8777
8852
  while (\u6B8B\u3059.length > 1 && \u9AD8\u3055(\u6B8B\u3059) > \u4F7F\u3048\u308B\u9AD8\u3055) \u6B8B\u3059.pop();
@@ -9398,7 +9473,7 @@ function QuadrantNode({
9398
9473
  function \u7BB1\u306E\u6587\u5B57({
9399
9474
  \u884C,
9400
9475
  x,
9401
- \u7BB1\u306E\u9AD8\u3055,
9476
+ \u7BB1\u306E\u9AD8\u3055: \u7BB1\u306E\u9AD8\u30552,
9402
9477
  fill,
9403
9478
  \u540D\u524D\u306E\u592A\u3055
9404
9479
  }) {
@@ -9407,7 +9482,7 @@ function \u7BB1\u306E\u6587\u5B57({
9407
9482
  {
9408
9483
  "data-cdl-role": r.\u5F79\u5272 === "subtitle" ? "tree-node-subtitle" : void 0,
9409
9484
  x,
9410
- y: \u7BB1\u306E\u9AD8\u3055 / 2 + r.dy,
9485
+ y: \u7BB1\u306E\u9AD8\u30552 / 2 + r.dy,
9411
9486
  fontSize: r.fontSize,
9412
9487
  fontWeight: r.\u5F79\u5272 === "title" ? \u540D\u524D\u306E\u592A\u3055 : 500,
9413
9488
  textAnchor: "middle",