@cardenelabs/cdl 0.57.1 → 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/index.cjs CHANGED
@@ -353,6 +353,122 @@ function inputDefaultValue(input) {
353
353
  }
354
354
  }
355
355
 
356
+ // src/lang.ts
357
+ function resolveLang(value) {
358
+ return value === "ja" ? "ja" : "en";
359
+ }
360
+ var en = {
361
+ /** `shape-terminal` の 2 行目 (命令の出力) */
362
+ "terminal.output": "\u2192 12 chunks in 1.8s",
363
+ /** `shape-code-block` の札の file 名 */
364
+ "codeBlock.fileName": "utils.ts",
365
+ /** `shape-kanban-card` の課題の番号 */
366
+ "kanbanCard.id": "CAR-1111",
367
+ /** `shape-kanban-card` の状態の札 */
368
+ "kanbanCard.status": "IN PROG",
369
+ /** `shape-kanban-card` の題の下の説明 */
370
+ "kanbanCard.task": "shape-driven kind \u5B9F\u88C5",
371
+ /** `shape-kanban-card` の期日 */
372
+ "kanbanCard.due": "Jul 10",
373
+ /** `shape-smart-contract` の契約の本文の 1 行 */
374
+ "smartContract.call": "function execute()",
375
+ /** `shape-blockchain-block` の題を渡さない時の見出し */
376
+ "blockchainBlock.title": "Block #421,873",
377
+ /** `shape-blockchain-block` の 1 行目の名前 (塊を識別する値) */
378
+ "blockchainBlock.hash": "hash",
379
+ /** `shape-blockchain-block` の 2 行目の名前 (1 つ前の塊の識別値) */
380
+ "blockchainBlock.prev": "prev",
381
+ /** `shape-blockchain-block` の 3 行目の名前 (取引をまとめた木の根) */
382
+ "blockchainBlock.merkle": "merkle",
383
+ /** `shape-blockchain-block` の 4 行目の名前 (採掘で試した値) */
384
+ "blockchainBlock.nonce": "nonce",
385
+ /** `shape-blockchain-block` の 5 行目の名前 (取引の件数) */
386
+ "blockchainBlock.tx": "tx",
387
+ /** `shape-blockchain-block` の 5 行目の値 */
388
+ "blockchainBlock.txCount": "142 tx",
389
+ /** `shape-rpc-node` の稼働の札 */
390
+ "rpcNode.status": "RPC ONLINE",
391
+ /** `shape-trust-bank` の看板 */
392
+ "trustBank.sign": "TRUST",
393
+ /** `shape-payment-provider` の看板 */
394
+ "paymentProvider.sign": "PAY",
395
+ /** `shape-payment-provider` の状態の札 */
396
+ "paymentProvider.status": "PROCESSING",
397
+ /** `shape-brokerage` の株価の帯 */
398
+ "brokerage.ticker": "\u25B2NKY 38,240 \u25B2AAPL 194",
399
+ /** `shape-brokerage` の看板 */
400
+ "brokerage.sign": "$ SECURITIES",
401
+ /** `shape-exchange` の看板 */
402
+ "exchange.sign": "EXCHANGE",
403
+ /** `shape-exchange` の看板の下の札 */
404
+ "exchange.sub": "clearing",
405
+ /** `shape-atm` の天井の看板 */
406
+ "atm.sign": "ATM CORNER",
407
+ /** `shape-atm` の画面の案内 */
408
+ "atm.screen": "SELECT AMOUNT",
409
+ /** `shape-atm` の決める鍵 */
410
+ "atm.ok": "OK",
411
+ /** `shape-atm` のカードを入れる口の札 */
412
+ "atm.cardSlot": "CARD SLOT",
413
+ /** `shape-storefront` の看板 */
414
+ "storefront.sign": "SHOP",
415
+ /** `shape-storefront` の扉の札 */
416
+ "storefront.open": "OPEN",
417
+ /** `shape-warehouse` の看板 */
418
+ "warehouse.sign": "WAREHOUSE",
419
+ /** `shape-api-gateway` の看板 */
420
+ "apiGateway.sign": "API GATEWAY",
421
+ /** `shape-api-gateway` の 3 行目の要求の種類 */
422
+ "apiGateway.delete": "DEL",
423
+ /** `shape-api-gateway` の 1 行目の宛先 */
424
+ "apiGateway.users": "/users",
425
+ /** `shape-api-gateway` の 2 行目の宛先 */
426
+ "apiGateway.orders": "/orders",
427
+ /** `shape-api-gateway` の 3 行目の宛先 */
428
+ "apiGateway.session": "/session"
429
+ };
430
+ var ja = {
431
+ "terminal.output": "\u2192 1.8 \u79D2\u3067\u5B8C\u4E86",
432
+ "codeBlock.fileName": "\u5171\u901A.ts",
433
+ "kanbanCard.id": "#1111",
434
+ "kanbanCard.status": "\u9032\u884C\u4E2D",
435
+ "kanbanCard.task": "\u5F62\u3092\u5B9F\u88C5",
436
+ "kanbanCard.due": "7/10",
437
+ "smartContract.call": "\u81EA\u52D5\u3067\u5B9F\u884C\u3059\u308B",
438
+ "blockchainBlock.title": "\u30D6\u30ED\u30C3\u30AF #421,873",
439
+ "blockchainBlock.hash": "\u30CF\u30C3\u30B7\u30E5",
440
+ "blockchainBlock.prev": "\u76F4\u524D",
441
+ "blockchainBlock.merkle": "\u6728\u306E\u6839",
442
+ "blockchainBlock.nonce": "\u30CE\u30F3\u30B9",
443
+ "blockchainBlock.tx": "\u53D6\u5F15",
444
+ "blockchainBlock.txCount": "142 \u4EF6",
445
+ "rpcNode.status": "RPC \u7A3C\u50CD\u4E2D",
446
+ "trustBank.sign": "\u4FE1\u8A17",
447
+ "paymentProvider.sign": "\u6C7A\u6E08",
448
+ "paymentProvider.status": "\u51E6\u7406\u4E2D",
449
+ "brokerage.ticker": "\u25B2\u65E5\u7D4C 38,240 \u25B2\u6771\u8A3C 2,710",
450
+ "brokerage.sign": "\xA5 \u8A3C\u5238",
451
+ "exchange.sign": "\u53D6\u5F15\u6240",
452
+ "exchange.sub": "\u6E05\u7B97",
453
+ "atm.sign": "ATM \u30B3\u30FC\u30CA\u30FC",
454
+ "atm.screen": "\u91D1\u984D\u3092\u9078\u629E",
455
+ "atm.ok": "\u78BA\u5B9A",
456
+ "atm.cardSlot": "\u30AB\u30FC\u30C9\u633F\u5165\u53E3",
457
+ "storefront.sign": "\u5546\u5E97",
458
+ "storefront.open": "\u55B6\u696D",
459
+ "warehouse.sign": "\u5009\u5EAB",
460
+ "apiGateway.sign": "API \u5165\u53E3",
461
+ "apiGateway.delete": "DELETE",
462
+ "apiGateway.users": "/\u5229\u7528\u8005",
463
+ "apiGateway.orders": "/\u6CE8\u6587",
464
+ "apiGateway.session": "/\u63A5\u7D9A"
465
+ };
466
+ var CDL_TEXT = { en, ja };
467
+ function \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang) {
468
+ const \u8A00\u8A9E = lang ?? "en";
469
+ return (key) => CDL_TEXT[\u8A00\u8A9E][key];
470
+ }
471
+
356
472
  // src/formula/ast.ts
357
473
  var ALLOWED_MATH_FNS = /* @__PURE__ */ new Set([
358
474
  "min",
@@ -11515,6 +11631,8 @@ function diagram(id, options) {
11515
11631
  ...options.structuredData === "exclude" ? { structuredData: "exclude" } : {},
11516
11632
  // 配色の名前は素通しする。 空文字の遮断は `layout` が持つ (後段が必ず通るため)
11517
11633
  ...options.palette !== void 0 ? { palette: options.palette } : {},
11634
+ // 言語も素通しする。 型の外の値を既定に落とすのは `layout` の 1 箇所に置く
11635
+ ...options.lang !== void 0 ? { lang: options.lang } : {},
11518
11636
  // 種類の名前も同じ経路で渡し、空文字の扱いを `layout` の 1 箇所に揃える
11519
11637
  ...options.type !== void 0 ? { type: options.type } : {},
11520
11638
  // inputs / formulas / scrollTriggers / eventBindings は空なら省略 (static diagram の JSON 形状維持)
@@ -20948,6 +21066,9 @@ function layout(diag) {
20948
21066
  // **遮断はここだけに置く**。 描画は必ず組み立てを通り、組み立て API も `er` も
20949
21067
  // 素通しにしてある。 上流にも置くと、どの入力でも通らない分岐が残る
20950
21068
  ...diag.palette ? { palette: diag.palette } : {},
21069
+ // 描画側の固定の字の言語 (#847)。 既定 (`en`) と型の外の値は持たせない = 配置の結果の形を
21070
+ // 変更前と揃え、記法の書き損じで一部の字だけ日本語になる形を作らない
21071
+ ...resolveLang(diag.lang) === "ja" ? { lang: "ja" } : {},
20951
21072
  // 種類も配色と同じく空の目印を出さない。 遮断をここに揃えると手書きの図にも効く
20952
21073
  ...diag.type ? { type: diag.type } : {},
20953
21074
  bboxes,
@@ -27777,6 +27898,11 @@ var commonFrame2 = (active) => ({
27777
27898
  var ASCENT3 = 0.72;
27778
27899
  var DESCENT3 = 0.25;
27779
27900
  var MONO_ADVANCE = 0.62;
27901
+ function \u7B49\u5E45\u306E\u6841(s) {
27902
+ let \u6841 = 0;
27903
+ for (const c of s) \u6841 += (c.codePointAt(0) ?? 0) >= 11904 ? 2 : 1;
27904
+ return \u6841;
27905
+ }
27780
27906
  var LABEL_SUB_RATIO = 11 / 16;
27781
27907
  var LABEL_EYE_RATIO = 12 / 16;
27782
27908
  var LABEL_EYE_GAP = 8;
@@ -27874,7 +28000,8 @@ function ShapeWindowNode({ node, active }) {
27874
28000
  commonLabel2(node, node.cx, \u540D\u524D.y, \u540D\u524D.size)
27875
28001
  ] });
27876
28002
  }
27877
- function ShapeTerminalNode({ node, active }) {
28003
+ function ShapeTerminalNode({ node, active, lang }) {
28004
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
27878
28005
  const frame = commonFrame2(active);
27879
28006
  const \u7DDA = frame.strokeWidth / 2;
27880
28007
  const x = node.cx - node.w / 2 + \u7DDA;
@@ -27895,10 +28022,10 @@ function ShapeTerminalNode({ node, active }) {
27895
28022
  { \u5DE6: 16, \u5B57: 12.5, \u8272: "#7cd88f", \u6587: "$" },
27896
28023
  { \u5DE6: 30, \u5B57: 12.5, \u8272: "#e6edf3", \u6587: "pnpm build" }
27897
28024
  ],
27898
- [{ \u5DE6: 16, \u5B57: 12, \u8272: "#8b95a5", \u6587: "\u2192 12 chunks in 1.8s" }],
28025
+ [{ \u5DE6: 16, \u5B57: 12, \u8272: "#8b95a5", \u6587: \u5B57\u5F15("terminal.output") }],
27899
28026
  [{ \u5DE6: 16, \u5B57: 12.5, \u8272: "#7cd88f", \u6587: "$" }]
27900
28027
  ];
27901
- const \u81EA\u7136\u5E45 = Math.max(...\u884C.flat().map((t) => t.\u5DE6 + t.\u6587.length * MONO_ADVANCE * t.\u5B57)) + \u4F59\u767D;
28028
+ const \u81EA\u7136\u5E45 = Math.max(...\u884C.flat().map((c) => c.\u5DE6 + \u7B49\u5E45\u306E\u6841(c.\u6587) * MONO_ADVANCE * c.\u5B57)) + \u4F59\u767D;
27902
28029
  const \u81EA\u7136\u9AD8 = \u5E2F + \u5148\u982D + \u884C\u9593 * (\u884C.length - 1) + Math.max(\u30AB\u30FC\u30BD\u30EB.\u4E0B, 12.5 * DESCENT3);
27903
28030
  const \u500D = Math.min(1, w / \u81EA\u7136\u5E45, bodyH / \u81EA\u7136\u9AD8);
27904
28031
  const barH = \u5E2F * \u500D;
@@ -28008,7 +28135,8 @@ function ShapeTerminalNode({ node, active }) {
28008
28135
  )
28009
28136
  ] });
28010
28137
  }
28011
- function ShapeCodeBlockNode({ node, active }) {
28138
+ function ShapeCodeBlockNode({ node, active, lang }) {
28139
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
28012
28140
  const frame = commonFrame2(active);
28013
28141
  const \u7DDA = frame.strokeWidth / 2;
28014
28142
  const x = node.cx - node.w / 2 + \u7DDA;
@@ -28098,7 +28226,7 @@ function ShapeCodeBlockNode({ node, active }) {
28098
28226
  fontFamily: lineFont,
28099
28227
  textAnchor: "middle",
28100
28228
  fill: "#e6edf3",
28101
- children: "utils.ts"
28229
+ children: \u5B57\u5F15("codeBlock.fileName")
28102
28230
  }
28103
28231
  ),
28104
28232
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: x + tabW - \u4E38, cy: y + tabH / 2, r: 3 * \u500D, fill: "#7cd88f", stroke: "none" }),
@@ -28174,7 +28302,8 @@ function ShapeCodeBlockNode({ node, active }) {
28174
28302
  )
28175
28303
  ] });
28176
28304
  }
28177
- function ShapeKanbanCardNode({ node, active }) {
28305
+ function ShapeKanbanCardNode({ node, active, lang }) {
28306
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
28178
28307
  const frame = commonFrame2(active);
28179
28308
  const \u7DDA = frame.strokeWidth / 2;
28180
28309
  const \u5F71 = 3;
@@ -28186,7 +28315,7 @@ function ShapeKanbanCardNode({ node, active }) {
28186
28315
  const \u5DE6\u53F3\u4F59\u767D = 14;
28187
28316
  const \u4E0A\u6BB5\u9699\u9593 = 8;
28188
28317
  const \u512A\u5148\u5E2F\u9AD8 = 10;
28189
- const ID\u6587 = "CAR-1111";
28318
+ const ID\u6587 = \u5B57\u5F15("kanbanCard.id");
28190
28319
  const ID\u57FA\u6E96 = 30;
28191
28320
  const ID\u5B57 = 11;
28192
28321
  const ID\u5B57\u9593 = 1;
@@ -28205,7 +28334,7 @@ function ShapeKanbanCardNode({ node, active }) {
28205
28334
  const \u4E0B\u5E2F = FOOTER\u4E0B - AVATAR\u4E2D\u5FC3Y + AVATAR\u534A\u5F84 + AVATAR\u67A0 / 2 + \u5E2F\u9593\u4F59\u767D;
28206
28335
  const \u4E2D\u5E2F = \u540D\u524D\u5B57 * ASCENT3 + \u540D\u524D\u5B57 * \u8AAC\u660E\u57FA\u6E96\u6BD4 + \u540D\u524D\u5B57 * \u8AAC\u660E\u5B57\u6BD4 * DESCENT3;
28207
28336
  const \u81EA\u7136\u9AD8 = \u4E0A\u5E2F + \u4E2D\u5E2F + \u4E0B\u5E2F;
28208
- const ID\u5E45 = ID\u6587.length * MONO_ADVANCE * ID\u5B57 + ID\u5B57\u9593 * ID\u6587.length;
28337
+ const ID\u5E45 = \u7B49\u5E45\u306E\u6841(ID\u6587) * MONO_ADVANCE * ID\u5B57 + ID\u5B57\u9593 * [...ID\u6587].length;
28209
28338
  const \u81EA\u7136\u5E45 = \u5DE6\u53F3\u4F59\u767D + ID\u5E45 + \u4E0A\u6BB5\u9699\u9593 + PILL\u5E45 + \u5DE6\u53F3\u4F59\u767D;
28210
28339
  const \u500D = Math.min(1, w / \u81EA\u7136\u5E45, h / \u81EA\u7136\u9AD8);
28211
28340
  const priorityBarH = \u512A\u5148\u5E2F\u9AD8 * \u500D;
@@ -28284,7 +28413,7 @@ function ShapeKanbanCardNode({ node, active }) {
28284
28413
  textAnchor: "middle",
28285
28414
  fill: "#5a4a1a",
28286
28415
  fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
28287
- children: "IN PROG"
28416
+ children: \u5B57\u5F15("kanbanCard.status")
28288
28417
  }
28289
28418
  ),
28290
28419
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -28308,7 +28437,7 @@ function ShapeKanbanCardNode({ node, active }) {
28308
28437
  fontSize: \u540D\u524D.size * \u8AAC\u660E\u5B57\u6BD4,
28309
28438
  textAnchor: "middle",
28310
28439
  fill: "var(--cdl-text-dim, #5a6270)",
28311
- children: "shape-driven kind \u5B9F\u88C5"
28440
+ children: \u5B57\u5F15("kanbanCard.task")
28312
28441
  }
28313
28442
  ),
28314
28443
  /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${x + \u5DE6\u53F3\u4F59\u767D * \u500D}, ${footY})`, children: [
@@ -28371,7 +28500,7 @@ function ShapeKanbanCardNode({ node, active }) {
28371
28500
  fontWeight: 600,
28372
28501
  textAnchor: "end",
28373
28502
  fill: "var(--cdl-text-dim, #5a6270)",
28374
- children: "Jul 10"
28503
+ children: \u5B57\u5F15("kanbanCard.due")
28375
28504
  }
28376
28505
  )
28377
28506
  ] })
@@ -29415,7 +29544,8 @@ function EthereumDiamond({ cx, cy, h, colors }) {
29415
29544
  /* @__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" })
29416
29545
  ] });
29417
29546
  }
29418
- function ShapeSmartContractNode({ node, active }) {
29547
+ function ShapeSmartContractNode({ node, active, lang }) {
29548
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
29419
29549
  const frame = commonFrame4(active);
29420
29550
  const r = shapeRegion(node);
29421
29551
  const docW = SMART_CONTRACT_W;
@@ -29451,7 +29581,7 @@ function ShapeSmartContractNode({ node, active }) {
29451
29581
  /* @__PURE__ */ jsxRuntime.jsx("path", { "data-cdl-role": "node-body", d: path, ...frame, strokeLinejoin: "round" }),
29452
29582
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: foldPath, fill: "none", stroke: frame.stroke, strokeWidth: frame.strokeWidth, strokeLinejoin: "round" }),
29453
29583
  [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)),
29454
- /* @__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()" }),
29584
+ /* @__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") }),
29455
29585
  /* @__PURE__ */ jsxRuntime.jsx(
29456
29586
  "polygon",
29457
29587
  {
@@ -29472,14 +29602,14 @@ function ShapeSmartContractNode({ node, active }) {
29472
29602
  }
29473
29603
  var \u5B57\u306E\u5E45 = (text, size) => Math.max(displayWidth(text) * size * MONO_ADVANCE_RATIO, textWidth(text, size));
29474
29604
  var BLOCK_DEFAULT_FIELDS = [
29475
- { label: "hash", value: "0xaf31c9d2..." },
29476
- { label: "prev", value: "0x7b3f92c1..." },
29477
- { label: "merkle", value: "0xc1892f4a..." },
29478
- { label: "nonce", value: "82,914" },
29479
- { label: "tx", value: "142 tx" }
29605
+ { key: "hash", label: "blockchainBlock.hash", value: { text: "0xaf31c9d2..." } },
29606
+ { key: "prev", label: "blockchainBlock.prev", value: { text: "0x7b3f92c1..." } },
29607
+ { key: "merkle", label: "blockchainBlock.merkle", value: { text: "0xc1892f4a..." } },
29608
+ { key: "nonce", label: "blockchainBlock.nonce", value: { text: "82,914" } },
29609
+ { key: "tx", label: "blockchainBlock.tx", value: { \u8F9E\u66F8: "blockchainBlock.txCount" } }
29480
29610
  ];
29481
- var BLOCK_DEFAULT_TITLE = "Block #421,873";
29482
- function ShapeBlockchainBlockNode({ node, active }) {
29611
+ function ShapeBlockchainBlockNode({ node, active, lang }) {
29612
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
29483
29613
  const frame = commonFrame4(active);
29484
29614
  const r = shapeRegion(node);
29485
29615
  const bw = BLOCK_W;
@@ -29489,11 +29619,15 @@ function ShapeBlockchainBlockNode({ node, active }) {
29489
29619
  const x = cx - bw / 2;
29490
29620
  const y = cy - bh / 2;
29491
29621
  const \u6E21\u3055\u308C\u305F = (v) => (v ?? "").trim();
29492
- const \u898B\u51FA\u3057 = \u6E21\u3055\u308C\u305F(node.title) || BLOCK_DEFAULT_TITLE;
29493
- const fields = BLOCK_DEFAULT_FIELDS.map((f) => ({
29494
- label: f.label,
29495
- value: f.label === "hash" ? \u6E21\u3055\u308C\u305F(node.subtitle) || f.value : f.value
29496
- }));
29622
+ const \u898B\u51FA\u3057 = \u6E21\u3055\u308C\u305F(node.title) || \u5B57\u5F15("blockchainBlock.title");
29623
+ const fields = BLOCK_DEFAULT_FIELDS.map((f) => {
29624
+ const \u65E2\u5B9A\u5024 = "text" in f.value ? f.value.text : \u5B57\u5F15(f.value.\u8F9E\u66F8);
29625
+ return {
29626
+ key: f.key,
29627
+ label: \u5B57\u5F15(f.label),
29628
+ value: f.key === "hash" ? \u6E21\u3055\u308C\u305F(node.subtitle) || \u65E2\u5B9A\u5024 : \u65E2\u5B9A\u5024
29629
+ };
29630
+ });
29497
29631
  const \u898B\u51FA\u3057\u306E\u5E45 = bw - 14 - 30;
29498
29632
  const art = /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
29499
29633
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: x + 6, y: y + 6, width: bw, height: bh, rx: 8, fill: frame.stroke, opacity: 0.2, stroke: "none" }),
@@ -29503,7 +29637,7 @@ function ShapeBlockchainBlockNode({ node, active }) {
29503
29637
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: x + bw - 16, cy: y + 16, r: 5.5, fill: "#7cd88f", stroke: "#ffffff", strokeWidth: 1.5 }),
29504
29638
  fields.map((f, i) => /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
29505
29639
  /* @__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 }),
29506
- /* @__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) }),
29640
+ /* @__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) }),
29507
29641
  /* @__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 })
29508
29642
  ] }, i)),
29509
29643
  /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${cx - 32}, ${y + bh - 26})`, children: [
@@ -29708,7 +29842,8 @@ function ShapeBlockchainNodeNode({ node, active }) {
29708
29842
  bottomLabel2(node, r.cx, r.label)
29709
29843
  ] });
29710
29844
  }
29711
- function ShapeRpcNodeNode({ node, active }) {
29845
+ function ShapeRpcNodeNode({ node, active, lang }) {
29846
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
29712
29847
  const frame = commonFrame4(active);
29713
29848
  const r = shapeRegion(node);
29714
29849
  const cx = r.cx;
@@ -29721,7 +29856,7 @@ function ShapeRpcNodeNode({ node, active }) {
29721
29856
  /* @__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 }),
29722
29857
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x, y, width: bw, height: 30, rx: 10, fill: "#2d3a4f", stroke: "none" }),
29723
29858
  /* @__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" }) }),
29724
- /* @__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" }),
29859
+ /* @__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") }),
29725
29860
  /* @__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: "{...}" }),
29726
29861
  /* @__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" }),
29727
29862
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: x + 16, y: y + bh - 24, width: bw - 32, height: 8, rx: 4, fill: "#0f1419", stroke: "none" }),
@@ -30007,7 +30142,8 @@ var TRUST_BASE_H = 14;
30007
30142
  var TRUST_BODY_OUT = 8;
30008
30143
  var TRUST_BLD_W_MIN = 140;
30009
30144
  var TRUST_BLD_W_MAX = 280;
30010
- function ShapeTrustBankNode({ node, active }) {
30145
+ function ShapeTrustBankNode({ node, active, lang }) {
30146
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
30011
30147
  const frame = commonFrame5(active);
30012
30148
  const r = shapeRegion(node);
30013
30149
  const \u7DDA = frame.strokeWidth / 2;
@@ -30044,7 +30180,7 @@ function ShapeTrustBankNode({ node, active }) {
30044
30180
  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);
30045
30181
  }),
30046
30182
  /* @__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" }),
30047
- /* @__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" }),
30183
+ /* @__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") }),
30048
30184
  /* @__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 }),
30049
30185
  Array.from({ length: nCols }, (_, i) => i).map((i) => {
30050
30186
  const colCx = x + 15 + colGap + i * (colW + colGap) + colW / 2;
@@ -30063,7 +30199,8 @@ function ShapeTrustBankNode({ node, active }) {
30063
30199
  bottomLabel3(node, r.cx, r.label)
30064
30200
  ] });
30065
30201
  }
30066
- function ShapePaymentProviderNode({ node, active }) {
30202
+ function ShapePaymentProviderNode({ node, active, lang }) {
30203
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
30067
30204
  const frame = commonFrame5(active);
30068
30205
  const r = shapeRegion(node);
30069
30206
  const cx = r.cx;
@@ -30080,13 +30217,13 @@ function ShapePaymentProviderNode({ node, active }) {
30080
30217
  /* @__PURE__ */ jsxRuntime.jsx("rect", { "data-cdl-role": "node-body", x, y, width: boxW, height: boxH, rx: 10, fill: "#255a7a", stroke: accentDark, strokeWidth: frame.strokeWidth }),
30081
30218
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x, y, width: boxW, height: headerH, rx: 10, fill: accentDarker }),
30082
30219
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x, y: y + headerH - 8, width: boxW, height: 8, fill: accentDarker }),
30083
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: y + 22, fontSize: 16, fontWeight: 700, letterSpacing: 4, textAnchor: "middle", fill: "#e5c07b", children: "PAY" }),
30220
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: y + 22, fontSize: 16, fontWeight: 700, letterSpacing: 4, textAnchor: "middle", fill: "#e5c07b", children: \u5B57\u5F15("paymentProvider.sign") }),
30084
30221
  /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
30085
30222
  /* @__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" }) }),
30086
30223
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx, cy: cy + 4, r: 10, fill: "#e5c07b", stroke: accentDarker, strokeWidth: 1.5 }),
30087
30224
  /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: cy + 9, fontSize: 13, fontWeight: 700, textAnchor: "middle", fill: accentDarker, fontFamily: "Georgia, serif", children: "$" })
30088
30225
  ] }),
30089
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: y + boxH - 16, fontSize: 9, fontWeight: 700, letterSpacing: 2, textAnchor: "middle", fill: "#a4b5f2", children: "PROCESSING" }),
30226
+ /* @__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") }),
30090
30227
  bottomLabel3(node, r.cx, r.label)
30091
30228
  ] });
30092
30229
  }
@@ -30134,7 +30271,8 @@ var BROKERAGE_SHADE_OUT = 2;
30134
30271
  var BROKERAGE_W_MIN = BROKERAGE_COLS * BROKERAGE_CELL_W + (BROKERAGE_COLS - 1) * BROKERAGE_GAP_X + 6;
30135
30272
  var BROKERAGE_W_MAX = 140;
30136
30273
  var BROKERAGE_H_MIN = BROKERAGE_TICK_H + BROKERAGE_LOGO_H + BROKERAGE_BASE_H;
30137
- function ShapeBrokerageNode({ node, active }) {
30274
+ function ShapeBrokerageNode({ node, active, lang }) {
30275
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
30138
30276
  const frame = commonFrame5(active);
30139
30277
  const r = shapeRegion(node);
30140
30278
  const cx = r.cx;
@@ -30170,9 +30308,9 @@ function ShapeBrokerageNode({ node, active }) {
30170
30308
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: x - BROKERAGE_SHADE_OUT, y, width: BROKERAGE_SHADE_OUT * 2, height: h, fill: accentDarker }),
30171
30309
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x, y, width: w, height: BROKERAGE_TICK_H, fill: "#0f1830", stroke: "none" }),
30172
30310
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: x + 2, y: y + 2, width: w - 4, height: 8, fill: "#1a2340", stroke: "none" }),
30173
- /* @__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" }),
30311
+ /* @__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") }),
30174
30312
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x, y: y + BROKERAGE_TICK_H, width: w, height: BROKERAGE_LOGO_H, fill: "#e5c07b", stroke: "none" }),
30175
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: y + 30, fontSize: 12, fontWeight: 700, letterSpacing: 2.5, textAnchor: "middle", fill: "#0f1830", children: "$ SECURITIES" }),
30313
+ /* @__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") }),
30176
30314
  Array.from({ length: rows }).map(
30177
30315
  (_, ri) => Array.from({ length: cols }).map((_2, ci) => {
30178
30316
  const wx = gridStartX + ci * (cellW + gapX);
@@ -30193,7 +30331,8 @@ function ShapeBrokerageNode({ node, active }) {
30193
30331
  bottomLabel3(node, r.cx, r.label)
30194
30332
  ] });
30195
30333
  }
30196
- function ShapeExchangeNode({ node, active }) {
30334
+ function ShapeExchangeNode({ node, active, lang }) {
30335
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
30197
30336
  const frame = commonFrame5(active);
30198
30337
  const r = shapeRegion(node);
30199
30338
  const cx = r.cx;
@@ -30238,9 +30377,9 @@ function ShapeExchangeNode({ node, active }) {
30238
30377
  ] }, `d${i}`);
30239
30378
  }),
30240
30379
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: hexPath, fill: "#255a7a", stroke: accentDarker, strokeWidth: frame.strokeWidth, strokeLinejoin: "round" }),
30241
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: cy - 8, fontSize: 10, fontWeight: 700, letterSpacing: 2, textAnchor: "middle", fill: "#e5c07b", children: "EXCHANGE" }),
30380
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: cy - 8, fontSize: 10, fontWeight: 700, letterSpacing: 2, textAnchor: "middle", fill: "#e5c07b", children: \u5B57\u5F15("exchange.sign") }),
30242
30381
  /* @__PURE__ */ jsxRuntime.jsx("text", { "data-cdl-role": "node-body", x: cx, y: cy + 12, fontSize: 22, fontWeight: 700, textAnchor: "middle", fill: "#e5c07b", children: "\u21C4" }),
30243
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: cy + 26, fontSize: 8, fontWeight: 700, textAnchor: "middle", fill: "#a4b5f2", children: "clearing" }),
30382
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: cy + 26, fontSize: 8, fontWeight: 700, textAnchor: "middle", fill: "#a4b5f2", children: \u5B57\u5F15("exchange.sub") }),
30244
30383
  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}`))
30245
30384
  ] });
30246
30385
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
@@ -30262,7 +30401,8 @@ var ATM_PANEL_H = 146;
30262
30401
  var ATM_W_MIN = 100;
30263
30402
  var ATM_W_MAX = 140;
30264
30403
  var ATM_H_MIN = ATM_SIGN_H + ATM_SIGN_GAP + 30 + ATM_FLOOR_RESERVE;
30265
- function ShapeAtmNode({ node, active }) {
30404
+ function ShapeAtmNode({ node, active, lang }) {
30405
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
30266
30406
  const frame = commonFrame5(active);
30267
30407
  const r = shapeRegion(node);
30268
30408
  const cx = r.cx;
@@ -30296,12 +30436,12 @@ function ShapeAtmNode({ node, active }) {
30296
30436
  const \u7D75 = /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
30297
30437
  /* @__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" }),
30298
30438
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: centerX - totalW / 2, y: signY, width: totalW, height: signH, fill: accentDarker, stroke: "#000", strokeWidth: ATM_SIGN_SW }),
30299
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: centerX, y: signY + 17, fontSize: 11, fontWeight: 700, letterSpacing: 2, textAnchor: "middle", fill: "#e5c07b", children: "ATM CORNER" }),
30439
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: centerX, y: signY + 17, fontSize: 11, fontWeight: 700, letterSpacing: 2, textAnchor: "middle", fill: "#e5c07b", children: \u5B57\u5F15("atm.sign") }),
30300
30440
  /* @__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 }),
30301
30441
  /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${centerX} ${atmY}) scale(${\u9762})`, children: [
30302
30442
  /* @__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 }),
30303
30443
  /* @__PURE__ */ jsxRuntime.jsx("text", { x: 0, y: 30, fontSize: 10, fontWeight: 700, letterSpacing: 1, textAnchor: "middle", fill: "#e5c07b", children: "\u304A\u5F15\u51FA\u3057" }),
30304
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: 0, y: 44, fontSize: 8, fontWeight: 700, textAnchor: "middle", fill: "#a4b5f2", children: "SELECT AMOUNT" }),
30444
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: 0, y: 44, fontSize: 8, fontWeight: 700, textAnchor: "middle", fill: "#a4b5f2", children: \u5B57\u5F15("atm.screen") }),
30305
30445
  /* @__PURE__ */ jsxRuntime.jsx("text", { x: 0, y: 56, fontSize: 10, fontWeight: 700, textAnchor: "middle", fill: "#4ea36a", children: "\xA5 20,000" }),
30306
30446
  /* @__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 }),
30307
30447
  (() => {
@@ -30315,7 +30455,7 @@ function ShapeAtmNode({ node, active }) {
30315
30455
  ["5", "#5a6270"],
30316
30456
  ["6", "#5a6270"],
30317
30457
  ["0", "#5a6270"],
30318
- ["OK", "#4ea36a"]
30458
+ [\u5B57\u5F15("atm.ok"), "#4ea36a"]
30319
30459
  ];
30320
30460
  const keyW = 18;
30321
30461
  const keyH = 10;
@@ -30328,13 +30468,16 @@ function ShapeAtmNode({ node, active }) {
30328
30468
  const ky = 74 + row * (keyH + 2);
30329
30469
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
30330
30470
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: kx, y: ky, width: keyW, height: keyH, fill: k[1], stroke: "#0f1830", strokeWidth: 0.8 }),
30331
- /* @__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] })
30471
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: kx + keyW / 2, y: ky + 7, fontSize: (
30472
+ /* 決める鍵 (末尾) は 2 字あるので小さく描く。 字は言語で変わるため位置で見分ける */
30473
+ i === keys.length - 1 ? 6 : 7
30474
+ ), fontWeight: 700, textAnchor: "middle", fill: "#ffffff", children: k[0] })
30332
30475
  ] }, `k${i}`);
30333
30476
  });
30334
30477
  })(),
30335
30478
  /* @__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 }),
30336
30479
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: \u9762\u5DE6 + 15, y: 118, width: ATM_PANEL_W - 30, height: 4, rx: 0.5, fill: "#e5c07b" }),
30337
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: 0, y: 132, fontSize: 6, fontWeight: 700, letterSpacing: 1, textAnchor: "middle", fill: "#e5c07b", children: "CARD SLOT" }),
30480
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: 0, y: 132, fontSize: 6, fontWeight: 700, letterSpacing: 1, textAnchor: "middle", fill: "#e5c07b", children: \u5B57\u5F15("atm.cardSlot") }),
30338
30481
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: \u9762\u5DE6 + 12, y: 136, width: ATM_PANEL_W - 24, height: 4, rx: 1, fill: "#0f1830" })
30339
30482
  ] }),
30340
30483
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: centerX - totalW / 2, y: floorY, width: totalW, height: 6, fill: "#8b949e", stroke: "none" }),
@@ -30419,7 +30562,8 @@ function ShapeWebsiteNode({ node, active }) {
30419
30562
  bottomLabel4(node, r.cx, r.label)
30420
30563
  ] });
30421
30564
  }
30422
- function ShapeStorefrontNode({ node, active }) {
30565
+ function ShapeStorefrontNode({ node, active, lang }) {
30566
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
30423
30567
  const frame = commonFrame6(active);
30424
30568
  const r = shapeRegion(node);
30425
30569
  const cx = r.cx;
@@ -30445,7 +30589,7 @@ function ShapeStorefrontNode({ node, active }) {
30445
30589
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
30446
30590
  /* @__PURE__ */ jsxRuntime.jsx("ellipse", { cx, cy: y + bh + 8, rx: bw * 0.5, ry: 5, fill: frame.stroke, opacity: 0.2, stroke: "none" }),
30447
30591
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x, y, width: bw, height: signH, fill: accent, stroke: accentDark, strokeWidth: 2 }),
30448
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: y + 18, fontSize: 16, fontWeight: 900, letterSpacing: 8, textAnchor: "middle", fill: "#ffffff", children: "SHOP" }),
30592
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: y + 18, fontSize: 16, fontWeight: 900, letterSpacing: 8, textAnchor: "middle", fill: "#ffffff", children: \u5B57\u5F15("storefront.sign") }),
30449
30593
  /* @__PURE__ */ jsxRuntime.jsx("rect", { "data-cdl-role": "node-body", x, y: facadeY, width: bw, height: facadeH, fill: "#e0e4e8", stroke: "#5a6270", strokeWidth: frame.strokeWidth }),
30450
30594
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: winX, y: winY, width: winW, height: winH, fill: "#a4c5d9", stroke: accentDarker, strokeWidth: 2 }),
30451
30595
  /* @__PURE__ */ jsxRuntime.jsx("line", { x1: winX + winW / 2, y1: winY, x2: winX + winW / 2, y2: winY + winH, stroke: accentDarker, strokeWidth: 1 }),
@@ -30459,7 +30603,7 @@ function ShapeStorefrontNode({ node, active }) {
30459
30603
  /* @__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 }),
30460
30604
  /* @__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 }),
30461
30605
  /* @__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 }),
30462
- /* @__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" }),
30606
+ /* @__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") }),
30463
30607
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: doorX + 6, cy: doorY + doorH * 0.55, r: 1.5, fill: "#c15a4a" }),
30464
30608
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: x - 6, y: y + bh - 6, width: bw + 12, height: 8, fill: "#5a6270", stroke: "none" }),
30465
30609
  bottomLabel4(node, r.cx, r.label)
@@ -30476,7 +30620,8 @@ var WAREHOUSE_SHADOW_RX_RATIO = 0.5;
30476
30620
  var WAREHOUSE_H_MIN = WAREHOUSE_ROOF_H + WAREHOUSE_SIGN_H + 68;
30477
30621
  var WAREHOUSE_W_MIN = 160;
30478
30622
  var WAREHOUSE_W_MAX = 240;
30479
- function ShapeWarehouseNode({ node, active }) {
30623
+ function ShapeWarehouseNode({ node, active, lang }) {
30624
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
30480
30625
  const frame = commonFrame6(active);
30481
30626
  const r = shapeRegion(node);
30482
30627
  const cx = r.cx;
@@ -30505,7 +30650,7 @@ function ShapeWarehouseNode({ node, active }) {
30505
30650
  /* @__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" }),
30506
30651
  /* @__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 }),
30507
30652
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x, y: y + roofH, width: bw, height: signH, fill: "#c15a4a", stroke: "#8b3f2f", strokeWidth: 1.5 }),
30508
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: y + roofH + 17, fontSize: 12, fontWeight: 900, letterSpacing: 6, textAnchor: "middle", fill: "#ffffff", children: "WAREHOUSE" }),
30653
+ /* @__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") }),
30509
30654
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: shutterX, y: shutterY, width: shutterW, height: shutterH, fill: "#8b949e", stroke: accentDarker, strokeWidth: 2 }),
30510
30655
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: shutterX, y: shutterY, width: shutterW, height: 5, fill: "#5a6270", stroke: "none" }),
30511
30656
  Array.from({ length: 10 }, (_, i) => i).map((i) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -30662,7 +30807,8 @@ var API_ROWS = 3;
30662
30807
  var API_H_MIN = API_ROW_TOP + (API_ROWS - 1) * API_ROW_PITCH_MIN + API_ROW_H + API_ROW_BOTTOM_PAD;
30663
30808
  var API_W_MIN = 200;
30664
30809
  var API_W_MAX = 300;
30665
- function ShapeApiGatewayNode({ node, active }) {
30810
+ function ShapeApiGatewayNode({ node, active, lang }) {
30811
+ const \u5B57\u5F15 = \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang);
30666
30812
  const frame = commonFrame6(active);
30667
30813
  const r = shapeRegion(node);
30668
30814
  const cx = r.cx;
@@ -30673,6 +30819,7 @@ function ShapeApiGatewayNode({ node, active }) {
30673
30819
  const x = cx - bw / 2;
30674
30820
  const y = r.cy - \u7E26 / 2 + \u4F59\u767D;
30675
30821
  const \u5E83\u304C\u308A = { \u4E0A: \u7E26 / 2, \u4E0B: \u7E26 / 2, \u5DE6: bw / 2 + \u4F59\u767D, \u53F3: bw / 2 + \u4F59\u767D };
30822
+ const \u7A2E\u985E\u306E\u5B57 = (s) => Math.min(11, 11 * 48 / Math.max(displayWidth(s) * 11 * MONO_ADVANCE_RATIO, textWidth(s, 11)));
30676
30823
  const rowPitch = Math.max(
30677
30824
  API_ROW_PITCH_MIN,
30678
30825
  (bh - API_ROW_TOP - API_ROW_H - API_ROW_BOTTOM_PAD) / (API_ROWS - 1)
@@ -30681,15 +30828,15 @@ function ShapeApiGatewayNode({ node, active }) {
30681
30828
  /* @__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" }),
30682
30829
  /* @__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 }),
30683
30830
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x, y, width: bw, height: 36, rx: 10, fill: "var(--cdl-tone-accent, #2d6a8f)", stroke: "none" }),
30684
- /* @__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" }),
30831
+ /* @__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") }),
30685
30832
  [
30686
- { method: "GET", path: "/users", color: "#27c93f" },
30687
- { method: "POST", path: "/orders", color: "#e5c07b" },
30688
- { method: "DEL", path: "/session", color: "#c9302c" }
30833
+ { method: "GET", path: \u5B57\u5F15("apiGateway.users"), color: "#27c93f" },
30834
+ { method: "POST", path: \u5B57\u5F15("apiGateway.orders"), color: "#e5c07b" },
30835
+ { method: \u5B57\u5F15("apiGateway.delete"), path: \u5B57\u5F15("apiGateway.session"), color: "#c9302c" }
30689
30836
  ].map((e, i) => /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${x + 16}, ${y + API_ROW_TOP + i * rowPitch})`, children: [
30690
30837
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: 0, y: 0, width: bw - 32, height: API_ROW_H, rx: 4, fill: "#0f1419", stroke: "none" }),
30691
30838
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: 0, y: 0, width: 54, height: API_ROW_H, rx: 4, fill: e.color, stroke: "none" }),
30692
- /* @__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 }),
30839
+ /* @__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 }),
30693
30840
  /* @__PURE__ */ jsxRuntime.jsx("text", { x: 64, y: 16, fontSize: 12, fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", fill: "#e6edf3", children: e.path }),
30694
30841
  /* @__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" }) })
30695
30842
  ] }, i))
@@ -30994,7 +31141,8 @@ function CdlNodeView({
30994
31141
  stateValues,
30995
31142
  currentPhaseId,
30996
31143
  chartLineScale,
30997
- \u95A2\u4FC2\u306E\u53D7\u3051\u53E3
31144
+ \u95A2\u4FC2\u306E\u53D7\u3051\u53E3,
31145
+ lang
30998
31146
  }) {
30999
31147
  const value = node.value ? interpolate(node.value, stateValues) : void 0;
31000
31148
  const rows = (node.rows ?? []).map((r) => interpolate(r, stateValues));
@@ -31210,11 +31358,11 @@ function CdlNodeView({
31210
31358
  case "shape-window":
31211
31359
  return /* @__PURE__ */ jsxRuntime.jsx(ShapeWindowNode, { node: resolvedNode, active });
31212
31360
  case "shape-terminal":
31213
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeTerminalNode, { node: resolvedNode, active });
31361
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeTerminalNode, { node: resolvedNode, active, lang });
31214
31362
  case "shape-code-block":
31215
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeCodeBlockNode, { node: resolvedNode, active });
31363
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeCodeBlockNode, { node: resolvedNode, active, lang });
31216
31364
  case "shape-kanban-card":
31217
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeKanbanCardNode, { node: resolvedNode, active });
31365
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeKanbanCardNode, { node: resolvedNode, active, lang });
31218
31366
  case "shape-message-bubble":
31219
31367
  return /* @__PURE__ */ jsxRuntime.jsx(ShapeMessageBubbleNode, { node: resolvedNode, active });
31220
31368
  case "shape-gear":
@@ -31232,11 +31380,11 @@ function CdlNodeView({
31232
31380
  case "shape-satellite":
31233
31381
  return /* @__PURE__ */ jsxRuntime.jsx(ShapeSatelliteNode, { node: resolvedNode, active });
31234
31382
  case "shape-smart-contract":
31235
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeSmartContractNode, { node: resolvedNode, active });
31383
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeSmartContractNode, { node: resolvedNode, active, lang });
31236
31384
  case "shape-blockchain-block":
31237
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeBlockchainBlockNode, { node: resolvedNode, active });
31385
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeBlockchainBlockNode, { node: resolvedNode, active, lang });
31238
31386
  case "shape-rpc-node":
31239
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeRpcNodeNode, { node: resolvedNode, active });
31387
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeRpcNodeNode, { node: resolvedNode, active, lang });
31240
31388
  case "shape-wallet":
31241
31389
  return /* @__PURE__ */ jsxRuntime.jsx(ShapeWalletNode, { node: resolvedNode, active });
31242
31390
  case "shape-nft":
@@ -31254,29 +31402,29 @@ function CdlNodeView({
31254
31402
  case "shape-bank":
31255
31403
  return /* @__PURE__ */ jsxRuntime.jsx(ShapeBankNode, { node: resolvedNode, active });
31256
31404
  case "shape-trust-bank":
31257
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeTrustBankNode, { node: resolvedNode, active });
31405
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeTrustBankNode, { node: resolvedNode, active, lang });
31258
31406
  case "shape-payment-provider":
31259
- return /* @__PURE__ */ jsxRuntime.jsx(ShapePaymentProviderNode, { node: resolvedNode, active });
31407
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapePaymentProviderNode, { node: resolvedNode, active, lang });
31260
31408
  case "shape-credit-card":
31261
31409
  return /* @__PURE__ */ jsxRuntime.jsx(ShapeCreditCardNode, { node: resolvedNode, active });
31262
31410
  case "shape-brokerage":
31263
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeBrokerageNode, { node: resolvedNode, active });
31411
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeBrokerageNode, { node: resolvedNode, active, lang });
31264
31412
  case "shape-exchange":
31265
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeExchangeNode, { node: resolvedNode, active });
31413
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeExchangeNode, { node: resolvedNode, active, lang });
31266
31414
  case "shape-atm":
31267
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeAtmNode, { node: resolvedNode, active });
31415
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeAtmNode, { node: resolvedNode, active, lang });
31268
31416
  case "shape-website":
31269
31417
  return /* @__PURE__ */ jsxRuntime.jsx(ShapeWebsiteNode, { node: resolvedNode, active });
31270
31418
  case "shape-storefront":
31271
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeStorefrontNode, { node: resolvedNode, active });
31419
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeStorefrontNode, { node: resolvedNode, active, lang });
31272
31420
  case "shape-warehouse":
31273
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeWarehouseNode, { node: resolvedNode, active });
31421
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeWarehouseNode, { node: resolvedNode, active, lang });
31274
31422
  case "shape-online-shop":
31275
31423
  return /* @__PURE__ */ jsxRuntime.jsx(ShapeOnlineShopNode, { node: resolvedNode, active });
31276
31424
  case "shape-cdn-edge":
31277
31425
  return /* @__PURE__ */ jsxRuntime.jsx(ShapeCdnEdgeNode, { node: resolvedNode, active });
31278
31426
  case "shape-api-gateway":
31279
- return /* @__PURE__ */ jsxRuntime.jsx(ShapeApiGatewayNode, { node: resolvedNode, active });
31427
+ return /* @__PURE__ */ jsxRuntime.jsx(ShapeApiGatewayNode, { node: resolvedNode, active, lang });
31280
31428
  case "shape-auditor":
31281
31429
  return /* @__PURE__ */ jsxRuntime.jsx(ShapeAuditorNode, { node: resolvedNode, active });
31282
31430
  case "shape-regulator":
@@ -31651,6 +31799,7 @@ function CdlStage({
31651
31799
  {
31652
31800
  node,
31653
31801
  active: activeSet.has(node.id),
31802
+ lang: laid.lang,
31654
31803
  \u95A2\u4FC2\u306E\u53D7\u3051\u53E3: \u7BB1\u306E\u53D7\u3051\u53E3,
31655
31804
  drawing: \u63CF\u304F,
31656
31805
  progress: \u63CF\u304F ? \u63CF\u304F\u9032\u307F : progress,
@@ -33393,6 +33542,7 @@ exports.requiredSpecClearance = requiredSpecClearance;
33393
33542
  exports.resolveEdgeLabelOverlapsWithChain = resolveEdgeLabelOverlapsWithChain;
33394
33543
  exports.resolveEdgeLabelOverlapsWithChainAndPropagate = resolveEdgeLabelOverlapsWithChainAndPropagate;
33395
33544
  exports.resolveLabelClearanceAfterPathPasses = resolveLabelClearanceAfterPathPasses;
33545
+ exports.resolveLang = resolveLang;
33396
33546
  exports.resolveOverlapsWithChain = resolveOverlapsWithChain;
33397
33547
  exports.resolveTarget = resolveTarget;
33398
33548
  exports.resolveTargetAll = resolveTargetAll;