@cardenelabs/cdl 0.57.0 → 0.58.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
@@ -358,6 +358,122 @@ function useReducedMotion() {
358
358
  return react.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
359
359
  }
360
360
 
361
+ // src/lang.ts
362
+ function resolveLang(value) {
363
+ return value === "ja" ? "ja" : "en";
364
+ }
365
+ var en = {
366
+ /** `shape-terminal` の 2 行目 (命令の出力) */
367
+ "terminal.output": "\u2192 12 chunks in 1.8s",
368
+ /** `shape-code-block` の札の file 名 */
369
+ "codeBlock.fileName": "utils.ts",
370
+ /** `shape-kanban-card` の課題の番号 */
371
+ "kanbanCard.id": "CAR-1111",
372
+ /** `shape-kanban-card` の状態の札 */
373
+ "kanbanCard.status": "IN PROG",
374
+ /** `shape-kanban-card` の題の下の説明 */
375
+ "kanbanCard.task": "shape-driven kind \u5B9F\u88C5",
376
+ /** `shape-kanban-card` の期日 */
377
+ "kanbanCard.due": "Jul 10",
378
+ /** `shape-smart-contract` の契約の本文の 1 行 */
379
+ "smartContract.call": "function execute()",
380
+ /** `shape-blockchain-block` の題を渡さない時の見出し */
381
+ "blockchainBlock.title": "Block #421,873",
382
+ /** `shape-blockchain-block` の 1 行目の名前 (塊を識別する値) */
383
+ "blockchainBlock.hash": "hash",
384
+ /** `shape-blockchain-block` の 2 行目の名前 (1 つ前の塊の識別値) */
385
+ "blockchainBlock.prev": "prev",
386
+ /** `shape-blockchain-block` の 3 行目の名前 (取引をまとめた木の根) */
387
+ "blockchainBlock.merkle": "merkle",
388
+ /** `shape-blockchain-block` の 4 行目の名前 (採掘で試した値) */
389
+ "blockchainBlock.nonce": "nonce",
390
+ /** `shape-blockchain-block` の 5 行目の名前 (取引の件数) */
391
+ "blockchainBlock.tx": "tx",
392
+ /** `shape-blockchain-block` の 5 行目の値 */
393
+ "blockchainBlock.txCount": "142 tx",
394
+ /** `shape-rpc-node` の稼働の札 */
395
+ "rpcNode.status": "RPC ONLINE",
396
+ /** `shape-trust-bank` の看板 */
397
+ "trustBank.sign": "TRUST",
398
+ /** `shape-payment-provider` の看板 */
399
+ "paymentProvider.sign": "PAY",
400
+ /** `shape-payment-provider` の状態の札 */
401
+ "paymentProvider.status": "PROCESSING",
402
+ /** `shape-brokerage` の株価の帯 */
403
+ "brokerage.ticker": "\u25B2NKY 38,240 \u25B2AAPL 194",
404
+ /** `shape-brokerage` の看板 */
405
+ "brokerage.sign": "$ SECURITIES",
406
+ /** `shape-exchange` の看板 */
407
+ "exchange.sign": "EXCHANGE",
408
+ /** `shape-exchange` の看板の下の札 */
409
+ "exchange.sub": "clearing",
410
+ /** `shape-atm` の天井の看板 */
411
+ "atm.sign": "ATM CORNER",
412
+ /** `shape-atm` の画面の案内 */
413
+ "atm.screen": "SELECT AMOUNT",
414
+ /** `shape-atm` の決める鍵 */
415
+ "atm.ok": "OK",
416
+ /** `shape-atm` のカードを入れる口の札 */
417
+ "atm.cardSlot": "CARD SLOT",
418
+ /** `shape-storefront` の看板 */
419
+ "storefront.sign": "SHOP",
420
+ /** `shape-storefront` の扉の札 */
421
+ "storefront.open": "OPEN",
422
+ /** `shape-warehouse` の看板 */
423
+ "warehouse.sign": "WAREHOUSE",
424
+ /** `shape-api-gateway` の看板 */
425
+ "apiGateway.sign": "API GATEWAY",
426
+ /** `shape-api-gateway` の 3 行目の要求の種類 */
427
+ "apiGateway.delete": "DEL",
428
+ /** `shape-api-gateway` の 1 行目の宛先 */
429
+ "apiGateway.users": "/users",
430
+ /** `shape-api-gateway` の 2 行目の宛先 */
431
+ "apiGateway.orders": "/orders",
432
+ /** `shape-api-gateway` の 3 行目の宛先 */
433
+ "apiGateway.session": "/session"
434
+ };
435
+ var ja = {
436
+ "terminal.output": "\u2192 1.8 \u79D2\u3067\u5B8C\u4E86",
437
+ "codeBlock.fileName": "\u5171\u901A.ts",
438
+ "kanbanCard.id": "#1111",
439
+ "kanbanCard.status": "\u9032\u884C\u4E2D",
440
+ "kanbanCard.task": "\u5F62\u3092\u5B9F\u88C5",
441
+ "kanbanCard.due": "7/10",
442
+ "smartContract.call": "\u81EA\u52D5\u3067\u5B9F\u884C\u3059\u308B",
443
+ "blockchainBlock.title": "\u30D6\u30ED\u30C3\u30AF #421,873",
444
+ "blockchainBlock.hash": "\u30CF\u30C3\u30B7\u30E5",
445
+ "blockchainBlock.prev": "\u76F4\u524D",
446
+ "blockchainBlock.merkle": "\u6728\u306E\u6839",
447
+ "blockchainBlock.nonce": "\u30CE\u30F3\u30B9",
448
+ "blockchainBlock.tx": "\u53D6\u5F15",
449
+ "blockchainBlock.txCount": "142 \u4EF6",
450
+ "rpcNode.status": "RPC \u7A3C\u50CD\u4E2D",
451
+ "trustBank.sign": "\u4FE1\u8A17",
452
+ "paymentProvider.sign": "\u6C7A\u6E08",
453
+ "paymentProvider.status": "\u51E6\u7406\u4E2D",
454
+ "brokerage.ticker": "\u25B2\u65E5\u7D4C 38,240 \u25B2\u6771\u8A3C 2,710",
455
+ "brokerage.sign": "\xA5 \u8A3C\u5238",
456
+ "exchange.sign": "\u53D6\u5F15\u6240",
457
+ "exchange.sub": "\u6E05\u7B97",
458
+ "atm.sign": "ATM \u30B3\u30FC\u30CA\u30FC",
459
+ "atm.screen": "\u91D1\u984D\u3092\u9078\u629E",
460
+ "atm.ok": "\u78BA\u5B9A",
461
+ "atm.cardSlot": "\u30AB\u30FC\u30C9\u633F\u5165\u53E3",
462
+ "storefront.sign": "\u5546\u5E97",
463
+ "storefront.open": "\u55B6\u696D",
464
+ "warehouse.sign": "\u5009\u5EAB",
465
+ "apiGateway.sign": "API \u5165\u53E3",
466
+ "apiGateway.delete": "DELETE",
467
+ "apiGateway.users": "/\u5229\u7528\u8005",
468
+ "apiGateway.orders": "/\u6CE8\u6587",
469
+ "apiGateway.session": "/\u63A5\u7D9A"
470
+ };
471
+ var CDL_TEXT = { en, ja };
472
+ function \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang) {
473
+ const \u8A00\u8A9E = lang ?? "en";
474
+ return (key) => CDL_TEXT[\u8A00\u8A9E][key];
475
+ }
476
+
361
477
  // src/layout/clearance-constants.ts
362
478
  var CLEARANCE_NODE_LABEL = 32;
363
479
  var CLEARANCE_LANE_LABEL = 24;
@@ -9636,6 +9752,9 @@ function layout(diag) {
9636
9752
  // **遮断はここだけに置く**。 描画は必ず組み立てを通り、組み立て API も `er` も
9637
9753
  // 素通しにしてある。 上流にも置くと、どの入力でも通らない分岐が残る
9638
9754
  ...diag.palette ? { palette: diag.palette } : {},
9755
+ // 描画側の固定の字の言語 (#847)。 既定 (`en`) と型の外の値は持たせない = 配置の結果の形を
9756
+ // 変更前と揃え、記法の書き損じで一部の字だけ日本語になる形を作らない
9757
+ ...resolveLang(diag.lang) === "ja" ? { lang: "ja" } : {},
9639
9758
  // 種類も配色と同じく空の目印を出さない。 遮断をここに揃えると手書きの図にも効く
9640
9759
  ...diag.type ? { type: diag.type } : {},
9641
9760
  bboxes,
@@ -15247,6 +15366,11 @@ var commonFrame2 = (active) => ({
15247
15366
  var ASCENT3 = 0.72;
15248
15367
  var DESCENT3 = 0.25;
15249
15368
  var MONO_ADVANCE = 0.62;
15369
+ function \u7B49\u5E45\u306E\u6841(s) {
15370
+ let \u6841 = 0;
15371
+ for (const c of s) \u6841 += (c.codePointAt(0) ?? 0) >= 11904 ? 2 : 1;
15372
+ return \u6841;
15373
+ }
15250
15374
  var LABEL_SUB_RATIO = 11 / 16;
15251
15375
  var LABEL_EYE_RATIO = 12 / 16;
15252
15376
  var LABEL_EYE_GAP = 8;
@@ -15344,7 +15468,8 @@ function ShapeWindowNode({ node, active }) {
15344
15468
  commonLabel2(node, node.cx, \u540D\u524D.y, \u540D\u524D.size)
15345
15469
  ] });
15346
15470
  }
15347
- function ShapeTerminalNode({ node, active }) {
15471
+ function ShapeTerminalNode({ node, active, lang }) {
15472
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
15348
15473
  const frame = commonFrame2(active);
15349
15474
  const \u7DDA = frame.strokeWidth / 2;
15350
15475
  const x = node.cx - node.w / 2 + \u7DDA;
@@ -15365,10 +15490,10 @@ function ShapeTerminalNode({ node, active }) {
15365
15490
  { \u5DE6: 16, \u5B57: 12.5, \u8272: "#7cd88f", \u6587: "$" },
15366
15491
  { \u5DE6: 30, \u5B57: 12.5, \u8272: "#e6edf3", \u6587: "pnpm build" }
15367
15492
  ],
15368
- [{ \u5DE6: 16, \u5B57: 12, \u8272: "#8b95a5", \u6587: "\u2192 12 chunks in 1.8s" }],
15493
+ [{ \u5DE6: 16, \u5B57: 12, \u8272: "#8b95a5", \u6587: \u5B57\u5F15("terminal.output") }],
15369
15494
  [{ \u5DE6: 16, \u5B57: 12.5, \u8272: "#7cd88f", \u6587: "$" }]
15370
15495
  ];
15371
- const \u81EA\u7136\u5E45 = Math.max(...\u884C.flat().map((t) => t.\u5DE6 + t.\u6587.length * MONO_ADVANCE * t.\u5B57)) + \u4F59\u767D;
15496
+ const \u81EA\u7136\u5E45 = Math.max(...\u884C.flat().map((c) => c.\u5DE6 + \u7B49\u5E45\u306E\u6841(c.\u6587) * MONO_ADVANCE * c.\u5B57)) + \u4F59\u767D;
15372
15497
  const \u81EA\u7136\u9AD8 = \u5E2F + \u5148\u982D + \u884C\u9593 * (\u884C.length - 1) + Math.max(\u30AB\u30FC\u30BD\u30EB.\u4E0B, 12.5 * DESCENT3);
15373
15498
  const \u500D = Math.min(1, w / \u81EA\u7136\u5E45, bodyH / \u81EA\u7136\u9AD8);
15374
15499
  const barH = \u5E2F * \u500D;
@@ -15478,7 +15603,8 @@ function ShapeTerminalNode({ node, active }) {
15478
15603
  )
15479
15604
  ] });
15480
15605
  }
15481
- function ShapeCodeBlockNode({ node, active }) {
15606
+ function ShapeCodeBlockNode({ node, active, lang }) {
15607
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
15482
15608
  const frame = commonFrame2(active);
15483
15609
  const \u7DDA = frame.strokeWidth / 2;
15484
15610
  const x = node.cx - node.w / 2 + \u7DDA;
@@ -15568,7 +15694,7 @@ function ShapeCodeBlockNode({ node, active }) {
15568
15694
  fontFamily: lineFont,
15569
15695
  textAnchor: "middle",
15570
15696
  fill: "#e6edf3",
15571
- children: "utils.ts"
15697
+ children: \u5B57\u5F15("codeBlock.fileName")
15572
15698
  }
15573
15699
  ),
15574
15700
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: x + tabW - \u4E38, cy: y + tabH / 2, r: 3 * \u500D, fill: "#7cd88f", stroke: "none" }),
@@ -15644,7 +15770,8 @@ function ShapeCodeBlockNode({ node, active }) {
15644
15770
  )
15645
15771
  ] });
15646
15772
  }
15647
- function ShapeKanbanCardNode({ node, active }) {
15773
+ function ShapeKanbanCardNode({ node, active, lang }) {
15774
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
15648
15775
  const frame = commonFrame2(active);
15649
15776
  const \u7DDA = frame.strokeWidth / 2;
15650
15777
  const \u5F71 = 3;
@@ -15656,7 +15783,7 @@ function ShapeKanbanCardNode({ node, active }) {
15656
15783
  const \u5DE6\u53F3\u4F59\u767D = 14;
15657
15784
  const \u4E0A\u6BB5\u9699\u9593 = 8;
15658
15785
  const \u512A\u5148\u5E2F\u9AD8 = 10;
15659
- const ID\u6587 = "CAR-1111";
15786
+ const ID\u6587 = \u5B57\u5F15("kanbanCard.id");
15660
15787
  const ID\u57FA\u6E96 = 30;
15661
15788
  const ID\u5B57 = 11;
15662
15789
  const ID\u5B57\u9593 = 1;
@@ -15675,7 +15802,7 @@ function ShapeKanbanCardNode({ node, active }) {
15675
15802
  const \u4E0B\u5E2F = FOOTER\u4E0B - AVATAR\u4E2D\u5FC3Y + AVATAR\u534A\u5F84 + AVATAR\u67A0 / 2 + \u5E2F\u9593\u4F59\u767D;
15676
15803
  const \u4E2D\u5E2F = \u540D\u524D\u5B57 * ASCENT3 + \u540D\u524D\u5B57 * \u8AAC\u660E\u57FA\u6E96\u6BD4 + \u540D\u524D\u5B57 * \u8AAC\u660E\u5B57\u6BD4 * DESCENT3;
15677
15804
  const \u81EA\u7136\u9AD8 = \u4E0A\u5E2F + \u4E2D\u5E2F + \u4E0B\u5E2F;
15678
- const ID\u5E45 = ID\u6587.length * MONO_ADVANCE * ID\u5B57 + ID\u5B57\u9593 * ID\u6587.length;
15805
+ const ID\u5E45 = \u7B49\u5E45\u306E\u6841(ID\u6587) * MONO_ADVANCE * ID\u5B57 + ID\u5B57\u9593 * [...ID\u6587].length;
15679
15806
  const \u81EA\u7136\u5E45 = \u5DE6\u53F3\u4F59\u767D + ID\u5E45 + \u4E0A\u6BB5\u9699\u9593 + PILL\u5E45 + \u5DE6\u53F3\u4F59\u767D;
15680
15807
  const \u500D = Math.min(1, w / \u81EA\u7136\u5E45, h / \u81EA\u7136\u9AD8);
15681
15808
  const priorityBarH = \u512A\u5148\u5E2F\u9AD8 * \u500D;
@@ -15754,7 +15881,7 @@ function ShapeKanbanCardNode({ node, active }) {
15754
15881
  textAnchor: "middle",
15755
15882
  fill: "#5a4a1a",
15756
15883
  fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
15757
- children: "IN PROG"
15884
+ children: \u5B57\u5F15("kanbanCard.status")
15758
15885
  }
15759
15886
  ),
15760
15887
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -15778,7 +15905,7 @@ function ShapeKanbanCardNode({ node, active }) {
15778
15905
  fontSize: \u540D\u524D.size * \u8AAC\u660E\u5B57\u6BD4,
15779
15906
  textAnchor: "middle",
15780
15907
  fill: "var(--cdl-text-dim, #5a6270)",
15781
- children: "shape-driven kind \u5B9F\u88C5"
15908
+ children: \u5B57\u5F15("kanbanCard.task")
15782
15909
  }
15783
15910
  ),
15784
15911
  /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${x + \u5DE6\u53F3\u4F59\u767D * \u500D}, ${footY})`, children: [
@@ -15841,7 +15968,7 @@ function ShapeKanbanCardNode({ node, active }) {
15841
15968
  fontWeight: 600,
15842
15969
  textAnchor: "end",
15843
15970
  fill: "var(--cdl-text-dim, #5a6270)",
15844
- children: "Jul 10"
15971
+ children: \u5B57\u5F15("kanbanCard.due")
15845
15972
  }
15846
15973
  )
15847
15974
  ] })
@@ -16885,7 +17012,8 @@ function EthereumDiamond({ cx, cy, h, colors }) {
16885
17012
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: `M ${cx} ${midY} L ${cx + w} ${cy + h * 0.05} L ${cx} ${lowerBotY} Z`, fill: c.dark, stroke: c.stroke, strokeWidth: 0.6, strokeLinejoin: "round" })
16886
17013
  ] });
16887
17014
  }
16888
- function ShapeSmartContractNode({ node, active }) {
17015
+ function ShapeSmartContractNode({ node, active, lang }) {
17016
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
16889
17017
  const frame = commonFrame4(active);
16890
17018
  const r = shapeRegion(node);
16891
17019
  const docW = SMART_CONTRACT_W;
@@ -16921,7 +17049,7 @@ function ShapeSmartContractNode({ node, active }) {
16921
17049
  /* @__PURE__ */ jsxRuntime.jsx("path", { "data-cdl-role": "node-body", d: path, ...frame, strokeLinejoin: "round" }),
16922
17050
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: foldPath, fill: "none", stroke: frame.stroke, strokeWidth: frame.strokeWidth, strokeLinejoin: "round" }),
16923
17051
  [y + 40, y + 58, y + 76, y + 94].map((ly, i) => /* @__PURE__ */ jsxRuntime.jsx("rect", { x: x + 16, y: ly - 3, width: docW - 32 - i * 22, height: 5, rx: 1, fill: "var(--cdl-divider, #d4d4d8)", fillOpacity: 0.7, stroke: "none" }, i)),
16924
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: x + 16, y: y + docH - 46, fontSize: 11, fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", fill: "var(--cdl-tone-accent, #2d6a8f)", children: "function execute()" }),
17052
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: x + 16, y: y + docH - 46, fontSize: 11, fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", fill: "var(--cdl-tone-accent, #2d6a8f)", children: \u5B57\u5F15("smartContract.call") }),
16925
17053
  /* @__PURE__ */ jsxRuntime.jsx(
16926
17054
  "polygon",
16927
17055
  {
@@ -16942,14 +17070,14 @@ function ShapeSmartContractNode({ node, active }) {
16942
17070
  }
16943
17071
  var \u5B57\u306E\u5E45 = (text, size) => Math.max(displayWidth(text) * size * MONO_ADVANCE_RATIO, textWidth(text, size));
16944
17072
  var BLOCK_DEFAULT_FIELDS = [
16945
- { label: "hash", value: "0xaf31c9d2..." },
16946
- { label: "prev", value: "0x7b3f92c1..." },
16947
- { label: "merkle", value: "0xc1892f4a..." },
16948
- { label: "nonce", value: "82,914" },
16949
- { label: "tx", value: "142 tx" }
17073
+ { key: "hash", label: "blockchainBlock.hash", value: { text: "0xaf31c9d2..." } },
17074
+ { key: "prev", label: "blockchainBlock.prev", value: { text: "0x7b3f92c1..." } },
17075
+ { key: "merkle", label: "blockchainBlock.merkle", value: { text: "0xc1892f4a..." } },
17076
+ { key: "nonce", label: "blockchainBlock.nonce", value: { text: "82,914" } },
17077
+ { key: "tx", label: "blockchainBlock.tx", value: { \u8F9E\u66F8: "blockchainBlock.txCount" } }
16950
17078
  ];
16951
- var BLOCK_DEFAULT_TITLE = "Block #421,873";
16952
- function ShapeBlockchainBlockNode({ node, active }) {
17079
+ function ShapeBlockchainBlockNode({ node, active, lang }) {
17080
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
16953
17081
  const frame = commonFrame4(active);
16954
17082
  const r = shapeRegion(node);
16955
17083
  const bw = BLOCK_W;
@@ -16959,11 +17087,15 @@ function ShapeBlockchainBlockNode({ node, active }) {
16959
17087
  const x = cx - bw / 2;
16960
17088
  const y = cy - bh / 2;
16961
17089
  const \u6E21\u3055\u308C\u305F = (v) => (v ?? "").trim();
16962
- const \u898B\u51FA\u3057 = \u6E21\u3055\u308C\u305F(node.title) || BLOCK_DEFAULT_TITLE;
16963
- const fields = BLOCK_DEFAULT_FIELDS.map((f) => ({
16964
- label: f.label,
16965
- value: f.label === "hash" ? \u6E21\u3055\u308C\u305F(node.subtitle) || f.value : f.value
16966
- }));
17090
+ const \u898B\u51FA\u3057 = \u6E21\u3055\u308C\u305F(node.title) || \u5B57\u5F15("blockchainBlock.title");
17091
+ const fields = BLOCK_DEFAULT_FIELDS.map((f) => {
17092
+ const \u65E2\u5B9A\u5024 = "text" in f.value ? f.value.text : \u5B57\u5F15(f.value.\u8F9E\u66F8);
17093
+ return {
17094
+ key: f.key,
17095
+ label: \u5B57\u5F15(f.label),
17096
+ value: f.key === "hash" ? \u6E21\u3055\u308C\u305F(node.subtitle) || \u65E2\u5B9A\u5024 : \u65E2\u5B9A\u5024
17097
+ };
17098
+ });
16967
17099
  const \u898B\u51FA\u3057\u306E\u5E45 = bw - 14 - 30;
16968
17100
  const art = /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
16969
17101
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: x + 6, y: y + 6, width: bw, height: bh, rx: 8, fill: frame.stroke, opacity: 0.2, stroke: "none" }),
@@ -16973,7 +17105,7 @@ function ShapeBlockchainBlockNode({ node, active }) {
16973
17105
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: x + bw - 16, cy: y + 16, r: 5.5, fill: "#7cd88f", stroke: "#ffffff", strokeWidth: 1.5 }),
16974
17106
  fields.map((f, i) => /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
16975
17107
  /* @__PURE__ */ jsxRuntime.jsx("text", { x: x + 14, y: y + 54 + i * 22, fontSize: 10.5, fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", fill: "var(--cdl-text-dim, #5a6270)", children: f.label }),
16976
- /* @__PURE__ */ jsxRuntime.jsx("text", { "data-cdl-role": `blockchain-block-${f.label}`, x: x + bw - 14, y: y + 54 + i * 22, fontSize: 11, fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", fontWeight: 600, textAnchor: "end", fill: "var(--cdl-text, #1a1f2a)", children: \u5E45\u3067\u5207\u308B(f.value, 11, bw - 28 - \u5B57\u306E\u5E45(f.label, 10.5) - 8, \u5B57\u306E\u5E45) }),
17108
+ /* @__PURE__ */ jsxRuntime.jsx("text", { "data-cdl-role": `blockchain-block-${f.key}`, x: x + bw - 14, y: y + 54 + i * 22, fontSize: 11, fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", fontWeight: 600, textAnchor: "end", fill: "var(--cdl-text, #1a1f2a)", children: \u5E45\u3067\u5207\u308B(f.value, 11, bw - 28 - \u5B57\u306E\u5E45(f.label, 10.5) - 8, \u5B57\u306E\u5E45) }),
16977
17109
  /* @__PURE__ */ jsxRuntime.jsx("line", { x1: x + 14, y1: y + 60 + i * 22, x2: x + bw - 14, y2: y + 60 + i * 22, stroke: "var(--cdl-divider, #d4d4d8)", strokeWidth: 0.5, opacity: 0.5 })
16978
17110
  ] }, i)),
16979
17111
  /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${cx - 32}, ${y + bh - 26})`, children: [
@@ -17178,7 +17310,8 @@ function ShapeBlockchainNodeNode({ node, active }) {
17178
17310
  bottomLabel2(node, r.cx, r.label)
17179
17311
  ] });
17180
17312
  }
17181
- function ShapeRpcNodeNode({ node, active }) {
17313
+ function ShapeRpcNodeNode({ node, active, lang }) {
17314
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
17182
17315
  const frame = commonFrame4(active);
17183
17316
  const r = shapeRegion(node);
17184
17317
  const cx = r.cx;
@@ -17191,7 +17324,7 @@ function ShapeRpcNodeNode({ node, active }) {
17191
17324
  /* @__PURE__ */ jsxRuntime.jsx("rect", { "data-cdl-role": "node-body", x, y, width: bw, height: bh, rx: 10, fill: "#1a2332", stroke: frame.stroke, strokeWidth: frame.strokeWidth }),
17192
17325
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x, y, width: bw, height: 30, rx: 10, fill: "#2d3a4f", stroke: "none" }),
17193
17326
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: x + 14, cy: y + 15, r: 5, fill: "#27c93f", stroke: "none", children: /* @__PURE__ */ jsxRuntime.jsx("animate", { attributeName: "opacity", values: "0.4;1;0.4", dur: "1.5s", repeatCount: "indefinite" }) }),
17194
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: x + 26, y: y + 20, fontSize: 12, fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", fontWeight: 700, fill: "#7cd88f", children: "RPC ONLINE" }),
17327
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: x + 26, y: y + 20, fontSize: 12, fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", fontWeight: 700, fill: "#7cd88f", children: \u5B57\u5F15("rpcNode.status") }),
17195
17328
  /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: cy + 6, fontSize: 30, fontWeight: 700, textAnchor: "middle", fill: "#e6edf3", fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", children: "{...}" }),
17196
17329
  /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: cy + 26, fontSize: 11, textAnchor: "middle", fill: "#7a8290", fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", children: "JSON-RPC 2.0" }),
17197
17330
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: x + 16, y: y + bh - 24, width: bw - 32, height: 8, rx: 4, fill: "#0f1419", stroke: "none" }),
@@ -17477,7 +17610,8 @@ var TRUST_BASE_H = 14;
17477
17610
  var TRUST_BODY_OUT = 8;
17478
17611
  var TRUST_BLD_W_MIN = 140;
17479
17612
  var TRUST_BLD_W_MAX = 280;
17480
- function ShapeTrustBankNode({ node, active }) {
17613
+ function ShapeTrustBankNode({ node, active, lang }) {
17614
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
17481
17615
  const frame = commonFrame5(active);
17482
17616
  const r = shapeRegion(node);
17483
17617
  const \u7DDA = frame.strokeWidth / 2;
@@ -17514,7 +17648,7 @@ function ShapeTrustBankNode({ node, active }) {
17514
17648
  return /* @__PURE__ */ jsxRuntime.jsx("rect", { x: r.cx - w / 2, y: y + bldH + i * BANK_STEP_DY, width: w, height: BANK_STEP_H, fill: "var(--cdl-divider, #d4d4d8)", fillOpacity: 0.5 + i * 0.15, stroke: frame.stroke, strokeWidth: BANK_STEP_SW }, i);
17515
17649
  }),
17516
17650
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: `M ${x - 6} ${y + pedimentH} L ${r.cx} ${y + 2} L ${x + bldW + 6} ${y + pedimentH} Z`, fill: "var(--cdl-node-fill, #ffffff)", stroke: frame.stroke, strokeWidth: frame.strokeWidth, strokeLinejoin: "round" }),
17517
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: r.cx, y: y + pedimentH - 8, fontSize: 15, fontWeight: 700, letterSpacing: 2, textAnchor: "middle", fill: "var(--cdl-tone-accent, #2d6a8f)", fontFamily: "Georgia, serif", children: "TRUST" }),
17651
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: r.cx, y: y + pedimentH - 8, fontSize: 15, fontWeight: 700, letterSpacing: 2, textAnchor: "middle", fill: "var(--cdl-tone-accent, #2d6a8f)", fontFamily: "Georgia, serif", children: \u5B57\u5F15("trustBank.sign") }),
17518
17652
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: x - 4, y: y + pedimentH, width: bldW + 8, height: architraveH, fill: "var(--cdl-divider, #d4d4d8)", fillOpacity: 0.4, stroke: frame.stroke, strokeWidth: frame.strokeWidth }),
17519
17653
  Array.from({ length: nCols }, (_, i) => i).map((i) => {
17520
17654
  const colCx = x + 15 + colGap + i * (colW + colGap) + colW / 2;
@@ -17533,7 +17667,8 @@ function ShapeTrustBankNode({ node, active }) {
17533
17667
  bottomLabel3(node, r.cx, r.label)
17534
17668
  ] });
17535
17669
  }
17536
- function ShapePaymentProviderNode({ node, active }) {
17670
+ function ShapePaymentProviderNode({ node, active, lang }) {
17671
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
17537
17672
  const frame = commonFrame5(active);
17538
17673
  const r = shapeRegion(node);
17539
17674
  const cx = r.cx;
@@ -17550,13 +17685,13 @@ function ShapePaymentProviderNode({ node, active }) {
17550
17685
  /* @__PURE__ */ jsxRuntime.jsx("rect", { "data-cdl-role": "node-body", x, y, width: boxW, height: boxH, rx: 10, fill: "#255a7a", stroke: accentDark, strokeWidth: frame.strokeWidth }),
17551
17686
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x, y, width: boxW, height: headerH, rx: 10, fill: accentDarker }),
17552
17687
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x, y: y + headerH - 8, width: boxW, height: 8, fill: accentDarker }),
17553
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: y + 22, fontSize: 16, fontWeight: 700, letterSpacing: 4, textAnchor: "middle", fill: "#e5c07b", children: "PAY" }),
17688
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: y + 22, fontSize: 16, fontWeight: 700, letterSpacing: 4, textAnchor: "middle", fill: "#e5c07b", children: \u5B57\u5F15("paymentProvider.sign") }),
17554
17689
  /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
17555
17690
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx, cy: cy + 4, r: 22, fill: "none", stroke: "#e5c07b", strokeWidth: 3.5, strokeDasharray: "38 24", strokeLinecap: "round", children: /* @__PURE__ */ jsxRuntime.jsx("animateTransform", { attributeName: "transform", type: "rotate", from: `0 ${cx} ${cy + 4}`, to: `360 ${cx} ${cy + 4}`, dur: "2s", repeatCount: "indefinite" }) }),
17556
17691
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx, cy: cy + 4, r: 10, fill: "#e5c07b", stroke: accentDarker, strokeWidth: 1.5 }),
17557
17692
  /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: cy + 9, fontSize: 13, fontWeight: 700, textAnchor: "middle", fill: accentDarker, fontFamily: "Georgia, serif", children: "$" })
17558
17693
  ] }),
17559
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: y + boxH - 16, fontSize: 9, fontWeight: 700, letterSpacing: 2, textAnchor: "middle", fill: "#a4b5f2", children: "PROCESSING" }),
17694
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: y + boxH - 16, fontSize: 9, fontWeight: 700, letterSpacing: 2, textAnchor: "middle", fill: "#a4b5f2", children: \u5B57\u5F15("paymentProvider.status") }),
17560
17695
  bottomLabel3(node, r.cx, r.label)
17561
17696
  ] });
17562
17697
  }
@@ -17604,7 +17739,8 @@ var BROKERAGE_SHADE_OUT = 2;
17604
17739
  var BROKERAGE_W_MIN = BROKERAGE_COLS * BROKERAGE_CELL_W + (BROKERAGE_COLS - 1) * BROKERAGE_GAP_X + 6;
17605
17740
  var BROKERAGE_W_MAX = 140;
17606
17741
  var BROKERAGE_H_MIN = BROKERAGE_TICK_H + BROKERAGE_LOGO_H + BROKERAGE_BASE_H;
17607
- function ShapeBrokerageNode({ node, active }) {
17742
+ function ShapeBrokerageNode({ node, active, lang }) {
17743
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
17608
17744
  const frame = commonFrame5(active);
17609
17745
  const r = shapeRegion(node);
17610
17746
  const cx = r.cx;
@@ -17640,9 +17776,9 @@ function ShapeBrokerageNode({ node, active }) {
17640
17776
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: x - BROKERAGE_SHADE_OUT, y, width: BROKERAGE_SHADE_OUT * 2, height: h, fill: accentDarker }),
17641
17777
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x, y, width: w, height: BROKERAGE_TICK_H, fill: "#0f1830", stroke: "none" }),
17642
17778
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: x + 2, y: y + 2, width: w - 4, height: 8, fill: "#1a2340", stroke: "none" }),
17643
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: y + 9, fontSize: 5.5, fontWeight: 700, textAnchor: "middle", fill: "#4ea36a", fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", children: "\u25B2NKY 38,240 \u25B2AAPL 194" }),
17779
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: y + 9, fontSize: 5.5, fontWeight: 700, textAnchor: "middle", fill: "#4ea36a", fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", children: \u5B57\u5F15("brokerage.ticker") }),
17644
17780
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x, y: y + BROKERAGE_TICK_H, width: w, height: BROKERAGE_LOGO_H, fill: "#e5c07b", stroke: "none" }),
17645
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: y + 30, fontSize: 12, fontWeight: 700, letterSpacing: 2.5, textAnchor: "middle", fill: "#0f1830", children: "$ SECURITIES" }),
17781
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: y + 30, fontSize: 12, fontWeight: 700, letterSpacing: 2.5, textAnchor: "middle", fill: "#0f1830", children: \u5B57\u5F15("brokerage.sign") }),
17646
17782
  Array.from({ length: rows }).map(
17647
17783
  (_, ri) => Array.from({ length: cols }).map((_2, ci) => {
17648
17784
  const wx = gridStartX + ci * (cellW + gapX);
@@ -17663,7 +17799,8 @@ function ShapeBrokerageNode({ node, active }) {
17663
17799
  bottomLabel3(node, r.cx, r.label)
17664
17800
  ] });
17665
17801
  }
17666
- function ShapeExchangeNode({ node, active }) {
17802
+ function ShapeExchangeNode({ node, active, lang }) {
17803
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
17667
17804
  const frame = commonFrame5(active);
17668
17805
  const r = shapeRegion(node);
17669
17806
  const cx = r.cx;
@@ -17708,9 +17845,9 @@ function ShapeExchangeNode({ node, active }) {
17708
17845
  ] }, `d${i}`);
17709
17846
  }),
17710
17847
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: hexPath, fill: "#255a7a", stroke: accentDarker, strokeWidth: frame.strokeWidth, strokeLinejoin: "round" }),
17711
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: cy - 8, fontSize: 10, fontWeight: 700, letterSpacing: 2, textAnchor: "middle", fill: "#e5c07b", children: "EXCHANGE" }),
17848
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: cy - 8, fontSize: 10, fontWeight: 700, letterSpacing: 2, textAnchor: "middle", fill: "#e5c07b", children: \u5B57\u5F15("exchange.sign") }),
17712
17849
  /* @__PURE__ */ jsxRuntime.jsx("text", { "data-cdl-role": "node-body", x: cx, y: cy + 12, fontSize: 22, fontWeight: 700, textAnchor: "middle", fill: "#e5c07b", children: "\u21C4" }),
17713
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: cy + 26, fontSize: 8, fontWeight: 700, textAnchor: "middle", fill: "#a4b5f2", children: "clearing" }),
17850
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: cy + 26, fontSize: 8, fontWeight: 700, textAnchor: "middle", fill: "#a4b5f2", children: \u5B57\u5F15("exchange.sub") }),
17714
17851
  nodes.map((n, i) => /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: n.cx, cy: n.cy, r: 8, fill: n.fill, stroke: accentDarker, strokeWidth: 1.5 }, `n${i}`))
17715
17852
  ] });
17716
17853
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
@@ -17732,7 +17869,8 @@ var ATM_PANEL_H = 146;
17732
17869
  var ATM_W_MIN = 100;
17733
17870
  var ATM_W_MAX = 140;
17734
17871
  var ATM_H_MIN = ATM_SIGN_H + ATM_SIGN_GAP + 30 + ATM_FLOOR_RESERVE;
17735
- function ShapeAtmNode({ node, active }) {
17872
+ function ShapeAtmNode({ node, active, lang }) {
17873
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
17736
17874
  const frame = commonFrame5(active);
17737
17875
  const r = shapeRegion(node);
17738
17876
  const cx = r.cx;
@@ -17766,12 +17904,12 @@ function ShapeAtmNode({ node, active }) {
17766
17904
  const \u7D75 = /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
17767
17905
  /* @__PURE__ */ jsxRuntime.jsx("ellipse", { cx, cy: y + totalH + ATM_SHADOW_DY, rx: totalW * ATM_SHADOW_RX_RATIO, ry: ATM_SHADOW_RY, fill: frame.stroke, opacity: 0.15, stroke: "none" }),
17768
17906
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: centerX - totalW / 2, y: signY, width: totalW, height: signH, fill: accentDarker, stroke: "#000", strokeWidth: ATM_SIGN_SW }),
17769
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: centerX, y: signY + 17, fontSize: 11, fontWeight: 700, letterSpacing: 2, textAnchor: "middle", fill: "#e5c07b", children: "ATM CORNER" }),
17907
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: centerX, y: signY + 17, fontSize: 11, fontWeight: 700, letterSpacing: 2, textAnchor: "middle", fill: "#e5c07b", children: \u5B57\u5F15("atm.sign") }),
17770
17908
  /* @__PURE__ */ jsxRuntime.jsx("rect", { "data-cdl-role": "node-body", x: atmX, y: atmY, width: atmW, height: atmH, rx: 6, fill: "#255a7a", stroke: accentDarker, strokeWidth: frame.strokeWidth }),
17771
17909
  /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${centerX} ${atmY}) scale(${\u9762})`, children: [
17772
17910
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: \u9762\u5DE6 + 8, y: 10, width: ATM_PANEL_W - 16, height: 52, rx: 3, fill: "#0f1830", stroke: "#000", strokeWidth: 1.5 }),
17773
17911
  /* @__PURE__ */ jsxRuntime.jsx("text", { x: 0, y: 30, fontSize: 10, fontWeight: 700, letterSpacing: 1, textAnchor: "middle", fill: "#e5c07b", children: "\u304A\u5F15\u51FA\u3057" }),
17774
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: 0, y: 44, fontSize: 8, fontWeight: 700, textAnchor: "middle", fill: "#a4b5f2", children: "SELECT AMOUNT" }),
17912
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: 0, y: 44, fontSize: 8, fontWeight: 700, textAnchor: "middle", fill: "#a4b5f2", children: \u5B57\u5F15("atm.screen") }),
17775
17913
  /* @__PURE__ */ jsxRuntime.jsx("text", { x: 0, y: 56, fontSize: 10, fontWeight: 700, textAnchor: "middle", fill: "#4ea36a", children: "\xA5 20,000" }),
17776
17914
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: \u9762\u5DE6 + 8, y: 68, width: ATM_PANEL_W - 16, height: 42, rx: 2, fill: "#8b949e", stroke: "#5a6270", strokeWidth: 1 }),
17777
17915
  (() => {
@@ -17785,7 +17923,7 @@ function ShapeAtmNode({ node, active }) {
17785
17923
  ["5", "#5a6270"],
17786
17924
  ["6", "#5a6270"],
17787
17925
  ["0", "#5a6270"],
17788
- ["OK", "#4ea36a"]
17926
+ [\u5B57\u5F15("atm.ok"), "#4ea36a"]
17789
17927
  ];
17790
17928
  const keyW = 18;
17791
17929
  const keyH = 10;
@@ -17798,13 +17936,16 @@ function ShapeAtmNode({ node, active }) {
17798
17936
  const ky = 74 + row * (keyH + 2);
17799
17937
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
17800
17938
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: kx, y: ky, width: keyW, height: keyH, fill: k[1], stroke: "#0f1830", strokeWidth: 0.8 }),
17801
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: kx + keyW / 2, y: ky + 7, fontSize: k[0] === "OK" ? 6 : 7, fontWeight: 700, textAnchor: "middle", fill: "#ffffff", children: k[0] })
17939
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: kx + keyW / 2, y: ky + 7, fontSize: (
17940
+ /* 決める鍵 (末尾) は 2 字あるので小さく描く。 字は言語で変わるため位置で見分ける */
17941
+ i === keys.length - 1 ? 6 : 7
17942
+ ), fontWeight: 700, textAnchor: "middle", fill: "#ffffff", children: k[0] })
17802
17943
  ] }, `k${i}`);
17803
17944
  });
17804
17945
  })(),
17805
17946
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: \u9762\u5DE6 + 12, y: 116, width: ATM_PANEL_W - 24, height: 8, rx: 1.5, fill: "#0f1830", stroke: accentDarker, strokeWidth: 1 }),
17806
17947
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: \u9762\u5DE6 + 15, y: 118, width: ATM_PANEL_W - 30, height: 4, rx: 0.5, fill: "#e5c07b" }),
17807
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: 0, y: 132, fontSize: 6, fontWeight: 700, letterSpacing: 1, textAnchor: "middle", fill: "#e5c07b", children: "CARD SLOT" }),
17948
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: 0, y: 132, fontSize: 6, fontWeight: 700, letterSpacing: 1, textAnchor: "middle", fill: "#e5c07b", children: \u5B57\u5F15("atm.cardSlot") }),
17808
17949
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: \u9762\u5DE6 + 12, y: 136, width: ATM_PANEL_W - 24, height: 4, rx: 1, fill: "#0f1830" })
17809
17950
  ] }),
17810
17951
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: centerX - totalW / 2, y: floorY, width: totalW, height: 6, fill: "#8b949e", stroke: "none" }),
@@ -17889,7 +18030,8 @@ function ShapeWebsiteNode({ node, active }) {
17889
18030
  bottomLabel4(node, r.cx, r.label)
17890
18031
  ] });
17891
18032
  }
17892
- function ShapeStorefrontNode({ node, active }) {
18033
+ function ShapeStorefrontNode({ node, active, lang }) {
18034
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
17893
18035
  const frame = commonFrame6(active);
17894
18036
  const r = shapeRegion(node);
17895
18037
  const cx = r.cx;
@@ -17915,7 +18057,7 @@ function ShapeStorefrontNode({ node, active }) {
17915
18057
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
17916
18058
  /* @__PURE__ */ jsxRuntime.jsx("ellipse", { cx, cy: y + bh + 8, rx: bw * 0.5, ry: 5, fill: frame.stroke, opacity: 0.2, stroke: "none" }),
17917
18059
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x, y, width: bw, height: signH, fill: accent, stroke: accentDark, strokeWidth: 2 }),
17918
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: y + 18, fontSize: 16, fontWeight: 900, letterSpacing: 8, textAnchor: "middle", fill: "#ffffff", children: "SHOP" }),
18060
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: y + 18, fontSize: 16, fontWeight: 900, letterSpacing: 8, textAnchor: "middle", fill: "#ffffff", children: \u5B57\u5F15("storefront.sign") }),
17919
18061
  /* @__PURE__ */ jsxRuntime.jsx("rect", { "data-cdl-role": "node-body", x, y: facadeY, width: bw, height: facadeH, fill: "#e0e4e8", stroke: "#5a6270", strokeWidth: frame.strokeWidth }),
17920
18062
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: winX, y: winY, width: winW, height: winH, fill: "#a4c5d9", stroke: accentDarker, strokeWidth: 2 }),
17921
18063
  /* @__PURE__ */ jsxRuntime.jsx("line", { x1: winX + winW / 2, y1: winY, x2: winX + winW / 2, y2: winY + winH, stroke: accentDarker, strokeWidth: 1 }),
@@ -17929,7 +18071,7 @@ function ShapeStorefrontNode({ node, active }) {
17929
18071
  /* @__PURE__ */ jsxRuntime.jsx("line", { x1: doorX + 4, y1: doorY + doorH * 0.38, x2: doorX + doorW - 4, y2: doorY + doorH * 0.38, stroke: accentDarker, strokeWidth: 1 }),
17930
18072
  /* @__PURE__ */ jsxRuntime.jsx("line", { x1: doorX + 4, y1: doorY + doorH * 0.72, x2: doorX + doorW - 4, y2: doorY + doorH * 0.72, stroke: accentDarker, strokeWidth: 1 }),
17931
18073
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: doorX + doorW / 2 - 20, y: doorY + doorH * 0.85, width: 40, height: 12, fill: "#e5c07b", stroke: "#a67c00", strokeWidth: 1.5 }),
17932
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: doorX + doorW / 2, y: doorY + doorH * 0.85 + 9, fontSize: 8, fontWeight: 700, letterSpacing: 1, textAnchor: "middle", fill: "#5a3a10", children: "OPEN" }),
18074
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: doorX + doorW / 2, y: doorY + doorH * 0.85 + 9, fontSize: 8, fontWeight: 700, letterSpacing: 1, textAnchor: "middle", fill: "#5a3a10", children: \u5B57\u5F15("storefront.open") }),
17933
18075
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: doorX + 6, cy: doorY + doorH * 0.55, r: 1.5, fill: "#c15a4a" }),
17934
18076
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: x - 6, y: y + bh - 6, width: bw + 12, height: 8, fill: "#5a6270", stroke: "none" }),
17935
18077
  bottomLabel4(node, r.cx, r.label)
@@ -17946,7 +18088,8 @@ var WAREHOUSE_SHADOW_RX_RATIO = 0.5;
17946
18088
  var WAREHOUSE_H_MIN = WAREHOUSE_ROOF_H + WAREHOUSE_SIGN_H + 68;
17947
18089
  var WAREHOUSE_W_MIN = 160;
17948
18090
  var WAREHOUSE_W_MAX = 240;
17949
- function ShapeWarehouseNode({ node, active }) {
18091
+ function ShapeWarehouseNode({ node, active, lang }) {
18092
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
17950
18093
  const frame = commonFrame6(active);
17951
18094
  const r = shapeRegion(node);
17952
18095
  const cx = r.cx;
@@ -17975,7 +18118,7 @@ function ShapeWarehouseNode({ node, active }) {
17975
18118
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: `M ${x - WAREHOUSE_ROOF_OUT} ${y + roofH} L ${x + 12} ${y + 2} L ${x + bw - 12} ${y + 2} L ${x + bw + WAREHOUSE_ROOF_OUT} ${y + roofH} Z`, fill: "#5a6270", stroke: accentDarker, strokeWidth: WAREHOUSE_ROOF_SW, strokeLinejoin: "round" }),
17976
18119
  /* @__PURE__ */ jsxRuntime.jsx("rect", { "data-cdl-role": "node-body", x, y: y + roofH, width: bw, height: bh - roofH - 12, fill: "#a89d8f", stroke: "#5a6270", strokeWidth: frame.strokeWidth }),
17977
18120
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x, y: y + roofH, width: bw, height: signH, fill: "#c15a4a", stroke: "#8b3f2f", strokeWidth: 1.5 }),
17978
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: y + roofH + 17, fontSize: 12, fontWeight: 900, letterSpacing: 6, textAnchor: "middle", fill: "#ffffff", children: "WAREHOUSE" }),
18121
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: y + roofH + 17, fontSize: 12, fontWeight: 900, letterSpacing: 6, textAnchor: "middle", fill: "#ffffff", children: \u5B57\u5F15("warehouse.sign") }),
17979
18122
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: shutterX, y: shutterY, width: shutterW, height: shutterH, fill: "#8b949e", stroke: accentDarker, strokeWidth: 2 }),
17980
18123
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: shutterX, y: shutterY, width: shutterW, height: 5, fill: "#5a6270", stroke: "none" }),
17981
18124
  Array.from({ length: 10 }, (_, i) => i).map((i) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -18132,7 +18275,8 @@ var API_ROWS = 3;
18132
18275
  var API_H_MIN = API_ROW_TOP + (API_ROWS - 1) * API_ROW_PITCH_MIN + API_ROW_H + API_ROW_BOTTOM_PAD;
18133
18276
  var API_W_MIN = 200;
18134
18277
  var API_W_MAX = 300;
18135
- function ShapeApiGatewayNode({ node, active }) {
18278
+ function ShapeApiGatewayNode({ node, active, lang }) {
18279
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
18136
18280
  const frame = commonFrame6(active);
18137
18281
  const r = shapeRegion(node);
18138
18282
  const cx = r.cx;
@@ -18143,6 +18287,7 @@ function ShapeApiGatewayNode({ node, active }) {
18143
18287
  const x = cx - bw / 2;
18144
18288
  const y = r.cy - \u7E26 / 2 + \u4F59\u767D;
18145
18289
  const \u5E83\u304C\u308A = { \u4E0A: \u7E26 / 2, \u4E0B: \u7E26 / 2, \u5DE6: bw / 2 + \u4F59\u767D, \u53F3: bw / 2 + \u4F59\u767D };
18290
+ const \u7A2E\u985E\u306E\u5B57 = (s) => Math.min(11, 11 * 48 / Math.max(displayWidth(s) * 11 * MONO_ADVANCE_RATIO, textWidth(s, 11)));
18146
18291
  const rowPitch = Math.max(
18147
18292
  API_ROW_PITCH_MIN,
18148
18293
  (bh - API_ROW_TOP - API_ROW_H - API_ROW_BOTTOM_PAD) / (API_ROWS - 1)
@@ -18151,15 +18296,15 @@ function ShapeApiGatewayNode({ node, active }) {
18151
18296
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: x + DROP_SHADOW_D, y: y + DROP_SHADOW_D, width: bw, height: bh, rx: 10, fill: frame.stroke, opacity: 0.2, stroke: "none" }),
18152
18297
  /* @__PURE__ */ jsxRuntime.jsx("rect", { "data-cdl-role": "node-body", x, y, width: bw, height: bh, rx: 10, fill: "#1a2332", stroke: frame.stroke, strokeWidth: frame.strokeWidth }),
18153
18298
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x, y, width: bw, height: 36, rx: 10, fill: "var(--cdl-tone-accent, #2d6a8f)", stroke: "none" }),
18154
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: y + 24, fontSize: 14, fontWeight: 700, letterSpacing: 3, textAnchor: "middle", fill: "#ffffff", fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", children: "API GATEWAY" }),
18299
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: y + 24, fontSize: 14, fontWeight: 700, letterSpacing: 3, textAnchor: "middle", fill: "#ffffff", fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", children: \u5B57\u5F15("apiGateway.sign") }),
18155
18300
  [
18156
- { method: "GET", path: "/users", color: "#27c93f" },
18157
- { method: "POST", path: "/orders", color: "#e5c07b" },
18158
- { method: "DEL", path: "/session", color: "#c9302c" }
18301
+ { method: "GET", path: \u5B57\u5F15("apiGateway.users"), color: "#27c93f" },
18302
+ { method: "POST", path: \u5B57\u5F15("apiGateway.orders"), color: "#e5c07b" },
18303
+ { method: \u5B57\u5F15("apiGateway.delete"), path: \u5B57\u5F15("apiGateway.session"), color: "#c9302c" }
18159
18304
  ].map((e, i) => /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${x + 16}, ${y + API_ROW_TOP + i * rowPitch})`, children: [
18160
18305
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: 0, y: 0, width: bw - 32, height: API_ROW_H, rx: 4, fill: "#0f1419", stroke: "none" }),
18161
18306
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: 0, y: 0, width: 54, height: API_ROW_H, rx: 4, fill: e.color, stroke: "none" }),
18162
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: 27, y: 16, fontSize: 11, fontWeight: 700, textAnchor: "middle", fill: "#ffffff", fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", children: e.method }),
18307
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: 27, y: 16, fontSize: \u7A2E\u985E\u306E\u5B57(e.method), fontWeight: 700, textAnchor: "middle", fill: "#ffffff", fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", children: e.method }),
18163
18308
  /* @__PURE__ */ jsxRuntime.jsx("text", { x: 64, y: 16, fontSize: 12, fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", fill: "#e6edf3", children: e.path }),
18164
18309
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: bw - 44, cy: 12, r: 4, fill: "#27c93f", stroke: "none", children: /* @__PURE__ */ jsxRuntime.jsx("animate", { attributeName: "opacity", values: "0.4;1;0.4", dur: `${1.2 + i * 0.3}s`, repeatCount: "indefinite" }) })
18165
18310
  ] }, i))
@@ -18464,7 +18609,8 @@ function CdlNodeView({
18464
18609
  stateValues,
18465
18610
  currentPhaseId,
18466
18611
  chartLineScale,
18467
- \u95A2\u4FC2\u306E\u53D7\u3051\u53E3
18612
+ \u95A2\u4FC2\u306E\u53D7\u3051\u53E3,
18613
+ lang
18468
18614
  }) {
18469
18615
  const value = node.value ? interpolate(node.value, stateValues) : void 0;
18470
18616
  const rows = (node.rows ?? []).map((r) => interpolate(r, stateValues));
@@ -18680,11 +18826,11 @@ function CdlNodeView({
18680
18826
  case "shape-window":
18681
18827
  return /* @__PURE__ */ jsxRuntime.jsx(ShapeWindowNode, { node: resolvedNode, active });
18682
18828
  case "shape-terminal":
18683
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeTerminalNode, { node: resolvedNode, active });
18829
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeTerminalNode, { node: resolvedNode, active, lang });
18684
18830
  case "shape-code-block":
18685
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeCodeBlockNode, { node: resolvedNode, active });
18831
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeCodeBlockNode, { node: resolvedNode, active, lang });
18686
18832
  case "shape-kanban-card":
18687
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeKanbanCardNode, { node: resolvedNode, active });
18833
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeKanbanCardNode, { node: resolvedNode, active, lang });
18688
18834
  case "shape-message-bubble":
18689
18835
  return /* @__PURE__ */ jsxRuntime.jsx(ShapeMessageBubbleNode, { node: resolvedNode, active });
18690
18836
  case "shape-gear":
@@ -18702,11 +18848,11 @@ function CdlNodeView({
18702
18848
  case "shape-satellite":
18703
18849
  return /* @__PURE__ */ jsxRuntime.jsx(ShapeSatelliteNode, { node: resolvedNode, active });
18704
18850
  case "shape-smart-contract":
18705
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeSmartContractNode, { node: resolvedNode, active });
18851
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeSmartContractNode, { node: resolvedNode, active, lang });
18706
18852
  case "shape-blockchain-block":
18707
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeBlockchainBlockNode, { node: resolvedNode, active });
18853
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeBlockchainBlockNode, { node: resolvedNode, active, lang });
18708
18854
  case "shape-rpc-node":
18709
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeRpcNodeNode, { node: resolvedNode, active });
18855
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeRpcNodeNode, { node: resolvedNode, active, lang });
18710
18856
  case "shape-wallet":
18711
18857
  return /* @__PURE__ */ jsxRuntime.jsx(ShapeWalletNode, { node: resolvedNode, active });
18712
18858
  case "shape-nft":
@@ -18724,29 +18870,29 @@ function CdlNodeView({
18724
18870
  case "shape-bank":
18725
18871
  return /* @__PURE__ */ jsxRuntime.jsx(ShapeBankNode, { node: resolvedNode, active });
18726
18872
  case "shape-trust-bank":
18727
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeTrustBankNode, { node: resolvedNode, active });
18873
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeTrustBankNode, { node: resolvedNode, active, lang });
18728
18874
  case "shape-payment-provider":
18729
- return /* @__PURE__ */ jsxRuntime.jsx(ShapePaymentProviderNode, { node: resolvedNode, active });
18875
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapePaymentProviderNode, { node: resolvedNode, active, lang });
18730
18876
  case "shape-credit-card":
18731
18877
  return /* @__PURE__ */ jsxRuntime.jsx(ShapeCreditCardNode, { node: resolvedNode, active });
18732
18878
  case "shape-brokerage":
18733
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeBrokerageNode, { node: resolvedNode, active });
18879
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeBrokerageNode, { node: resolvedNode, active, lang });
18734
18880
  case "shape-exchange":
18735
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeExchangeNode, { node: resolvedNode, active });
18881
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeExchangeNode, { node: resolvedNode, active, lang });
18736
18882
  case "shape-atm":
18737
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeAtmNode, { node: resolvedNode, active });
18883
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeAtmNode, { node: resolvedNode, active, lang });
18738
18884
  case "shape-website":
18739
18885
  return /* @__PURE__ */ jsxRuntime.jsx(ShapeWebsiteNode, { node: resolvedNode, active });
18740
18886
  case "shape-storefront":
18741
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeStorefrontNode, { node: resolvedNode, active });
18887
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeStorefrontNode, { node: resolvedNode, active, lang });
18742
18888
  case "shape-warehouse":
18743
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeWarehouseNode, { node: resolvedNode, active });
18889
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeWarehouseNode, { node: resolvedNode, active, lang });
18744
18890
  case "shape-online-shop":
18745
18891
  return /* @__PURE__ */ jsxRuntime.jsx(ShapeOnlineShopNode, { node: resolvedNode, active });
18746
18892
  case "shape-cdn-edge":
18747
18893
  return /* @__PURE__ */ jsxRuntime.jsx(ShapeCdnEdgeNode, { node: resolvedNode, active });
18748
18894
  case "shape-api-gateway":
18749
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeApiGatewayNode, { node: resolvedNode, active });
18895
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeApiGatewayNode, { node: resolvedNode, active, lang });
18750
18896
  case "shape-auditor":
18751
18897
  return /* @__PURE__ */ jsxRuntime.jsx(ShapeAuditorNode, { node: resolvedNode, active });
18752
18898
  case "shape-regulator":
@@ -19121,6 +19267,7 @@ function CdlStage({
19121
19267
  {
19122
19268
  node,
19123
19269
  active: activeSet.has(node.id),
19270
+ lang: laid.lang,
19124
19271
  \u95A2\u4FC2\u306E\u53D7\u3051\u53E3: \u7BB1\u306E\u53D7\u3051\u53E3,
19125
19272
  drawing: \u63CF\u304F,
19126
19273
  progress: \u63CF\u304F ? \u63CF\u304F\u9032\u307F : progress,
@@ -22822,6 +22969,12 @@ function ProgressGroupReadout({
22822
22969
  }) })
22823
22970
  ] });
22824
22971
  }
22972
+ function sequenceLabelAnchor(x, name, fontSize, viewW) {
22973
+ const half = textWidth(name, fontSize) / 2;
22974
+ if (x - half < 0) return "start";
22975
+ if (x + half > viewW) return "end";
22976
+ return "middle";
22977
+ }
22825
22978
  function SequenceTimelineReadout({
22826
22979
  id,
22827
22980
  label,
@@ -22873,7 +23026,7 @@ function SequenceTimelineReadout({
22873
23026
  const x = xFor(e.t);
22874
23027
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { "data-cdl-event-marker": e.name, children: [
22875
23028
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: x, cy: trackY, r: 5, fill: color, stroke: "#fff", strokeWidth: 1.5, children: /* @__PURE__ */ jsxRuntime.jsx("title", { children: `${e.name}: t=${e.t}` }) }),
22876
- /* @__PURE__ */ jsxRuntime.jsx("text", { x, y: trackY - 12, textAnchor: "middle", fontSize: 10, fill: "var(--v4-ink, #1a1f2a)", children: e.name }),
23029
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x, y: trackY - 12, textAnchor: sequenceLabelAnchor(x, e.name, 10, viewW), fontSize: 10, fill: "var(--v4-ink, #1a1f2a)", children: e.name }),
22877
23030
  /* @__PURE__ */ jsxRuntime.jsx("text", { x, y: trackY + 18, textAnchor: "middle", fontSize: 9, fill: "var(--v4-mute, #64748b)", children: e.t })
22878
23031
  ] }, i);
22879
23032
  })