@almadar/ui 5.21.8 → 5.21.10

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.
@@ -2085,7 +2085,10 @@ var en_default;
2085
2085
  var init_en = __esm({
2086
2086
  "locales/en.json"() {
2087
2087
  en_default = {
2088
- $meta: { locale: "en", direction: "ltr" },
2088
+ $meta: {
2089
+ locale: "en",
2090
+ direction: "ltr"
2091
+ },
2089
2092
  "common.save": "Save",
2090
2093
  "common.cancel": "Cancel",
2091
2094
  "common.delete": "Delete",
@@ -2227,7 +2230,6 @@ var init_en = __esm({
2227
2230
  "error.somethingWentWrong": "Something went wrong",
2228
2231
  "error.loadingItems": "Loading items...",
2229
2232
  "error.noItemsFound": "No items found",
2230
- "error.notFound": "Not found",
2231
2233
  "debug.noEntityData": "No entity data",
2232
2234
  "debug.noEntities": "No entities",
2233
2235
  "debug.noTicks": "No ticks registered",
@@ -2259,7 +2261,299 @@ var init_en = __esm({
2259
2261
  "template.showcase": "Showcase",
2260
2262
  "template.faq": "Frequently Asked Questions",
2261
2263
  "template.ourTeam": "Our Team",
2262
- "template.caseStudies": "Case Studies"
2264
+ "template.caseStudies": "Case Studies",
2265
+ "richBlockEditor.toolbar.text": "Text",
2266
+ "richBlockEditor.toolbar.h1": "H1",
2267
+ "richBlockEditor.toolbar.h2": "H2",
2268
+ "richBlockEditor.toolbar.h3": "H3",
2269
+ "richBlockEditor.toolbar.bulletList": "Bullet list",
2270
+ "richBlockEditor.toolbar.numbered": "Numbered",
2271
+ "richBlockEditor.toolbar.quote": "Quote",
2272
+ "richBlockEditor.toolbar.code": "Code",
2273
+ "richBlockEditor.toolbar.divider": "Divider",
2274
+ "richBlockEditor.toolbar.image": "Image",
2275
+ "richBlockEditor.blockType.paragraph": "Text",
2276
+ "richBlockEditor.blockType.heading1": "Heading 1",
2277
+ "richBlockEditor.blockType.heading2": "Heading 2",
2278
+ "richBlockEditor.blockType.heading3": "Heading 3",
2279
+ "richBlockEditor.blockType.bulletList": "Bullet list",
2280
+ "richBlockEditor.blockType.numberedList": "Numbered list",
2281
+ "richBlockEditor.blockType.quote": "Quote",
2282
+ "richBlockEditor.blockType.code": "Code",
2283
+ "richBlockEditor.blockType.divider": "Divider",
2284
+ "richBlockEditor.blockType.image": "Image",
2285
+ "richBlockEditor.blockActions": "Block actions",
2286
+ "richBlockEditor.duplicate": "Duplicate",
2287
+ "richBlockEditor.turnInto": "Turn into",
2288
+ "richBlockEditor.placeholder.heading1": "Heading 1",
2289
+ "richBlockEditor.placeholder.heading2": "Heading 2",
2290
+ "richBlockEditor.placeholder.heading3": "Heading 3",
2291
+ "richBlockEditor.placeholder.quote": "Quote",
2292
+ "richBlockEditor.placeholder.code": "Enter code",
2293
+ "richBlockEditor.placeholder.paragraph": "Start writing...",
2294
+ "richBlockEditor.placeholder.listItem": "List item",
2295
+ "richBlockEditor.placeholder.caption": "Caption (optional)",
2296
+ "richBlockEditor.aria.heading1Block": "Heading 1 block",
2297
+ "richBlockEditor.aria.heading2Block": "Heading 2 block",
2298
+ "richBlockEditor.aria.heading3Block": "Heading 3 block",
2299
+ "richBlockEditor.aria.quoteBlock": "Quote block",
2300
+ "richBlockEditor.aria.codeBlock": "Code block",
2301
+ "richBlockEditor.aria.codeLanguage": "Code language",
2302
+ "richBlockEditor.aria.imageUrl": "Image URL",
2303
+ "richBlockEditor.aria.imageCaption": "Image caption",
2304
+ "richBlockEditor.aria.listItem": "List item",
2305
+ "richBlockEditor.aria.removeListItem": "Remove list item",
2306
+ "richBlockEditor.aria.paragraphBlock": "Paragraph block",
2307
+ "richBlockEditor.embeddedImage": "Embedded image",
2308
+ "richBlockEditor.noImageUrl": "No image URL set",
2309
+ "richBlockEditor.addItem": "Add item",
2310
+ "richBlockEditor.insertParagraphBelow": "Insert paragraph below",
2311
+ "richBlockEditor.editorToolbar": "Block editor toolbar",
2312
+ "richBlockEditor.insertEntry": "Insert {{label}}",
2313
+ "versionDiff.compare": "Compare",
2314
+ "versionDiff.to": "to",
2315
+ "versionDiff.beforeRevision": "Before revision",
2316
+ "versionDiff.afterRevision": "After revision",
2317
+ "versionDiff.switchToInline": "Switch to inline view",
2318
+ "versionDiff.switchToSideBySide": "Switch to side-by-side view",
2319
+ "versionDiff.revert": "Revert",
2320
+ "versionDiff.byAuthor": " by {{author}}",
2321
+ "violationAlert.actionType.measure": "Corrective Measure",
2322
+ "violationAlert.actionType.admin": "Administrative Action",
2323
+ "violationAlert.actionType.penalty": "Penalty Proceedings",
2324
+ "violationAlert.fallbackMessage": "Violation",
2325
+ "violationAlert.adminLabel": "Admin:",
2326
+ "violationAlert.penaltyLabel": "Penalty:",
2327
+ "violationAlert.goToField": "Go to field",
2328
+ "branchingLogic.title": "Branching logic",
2329
+ "branchingLogic.if": "If",
2330
+ "branchingLogic.goTo": "go to",
2331
+ "branchingLogic.rules": "Rules",
2332
+ "branchingLogic.logicGraph": "Logic graph",
2333
+ "branchingLogic.addRule": "Add rule",
2334
+ "branchingLogic.deleteRule": "Delete rule",
2335
+ "branchingLogic.endOfSurvey": "End of survey",
2336
+ "branchingLogic.brokenReference": "Broken reference",
2337
+ "branchingLogic.selectQuestion": "Select question",
2338
+ "branchingLogic.selectTarget": "Select target",
2339
+ "branchingLogic.selectValue": "Select value",
2340
+ "branchingLogic.addValue": "Add value",
2341
+ "branchingLogic.value": "Value",
2342
+ "branchingLogic.typeValuePressEnter": "Type value, press Enter",
2343
+ "branchingLogic.operatorEquals": "equals",
2344
+ "branchingLogic.operatorNotEquals": "does not equal",
2345
+ "branchingLogic.operatorContains": "contains",
2346
+ "branchingLogic.operatorIn": "is one of",
2347
+ "branchingLogic.graphAriaLabel": "Branching logic graph",
2348
+ "branchingLogic.ruleCountOne": "{{count}} rule",
2349
+ "branchingLogic.ruleCountOther": "{{count}} rules",
2350
+ "branchingLogic.brokenCount": "{{count}} broken",
2351
+ "branchingLogic.emptyNoQuestions": "Add questions before building branching rules.",
2352
+ "branchingLogic.emptyNoRules": "No rules yet. Add a rule to define branching logic.",
2353
+ "filterGroup.filters": "Filters",
2354
+ "filterGroup.all": "All",
2355
+ "filterGroup.clear": "Clear",
2356
+ "filterGroup.clearAll": "Clear all",
2357
+ "filterGroup.from": "From",
2358
+ "filterGroup.to": "To",
2359
+ "filterGroup.allOf": "All {{label}}",
2360
+ "filterGroup.activeCount": "{{count}} active",
2361
+ "debug.guardEvaluationsHint": "Guard evaluations will appear when transitions or ticks with guards execute",
2362
+ "debug.expression": "Expression",
2363
+ "debug.inputs": "Inputs",
2364
+ "debug.trait": "Trait",
2365
+ "debug.filterAll": "All",
2366
+ "debug.filterPassed": "Passed",
2367
+ "debug.filterFailed": "Failed",
2368
+ "debug.traitsInitHint": "Traits will appear when the state machine initializes",
2369
+ "debug.traitsMountHint": "Traits will appear when components using them are mounted",
2370
+ "debug.activeStates": "Active States",
2371
+ "debug.availableEvents": "Available Events",
2372
+ "debug.noTransitionsFromState": "No transitions from current state",
2373
+ "debug.guarded": "guarded",
2374
+ "debug.otherEvents": "Other Events (not available from current state)",
2375
+ "debug.recentTransitions": "Recent Transitions",
2376
+ "debug.transitionsCount": "{{count}} transitions",
2377
+ "debug.states": "States",
2378
+ "debug.transitions": "Transitions",
2379
+ "debug.guards": "Guards",
2380
+ "debug.debugModeHint": "Debug mode may not be enabled",
2381
+ "debug.entitiesSpawnHint": "Entities will appear when spawned",
2382
+ "debug.singleton": "Singleton",
2383
+ "debug.singletonsCount": "Singletons ({{count}})",
2384
+ "debug.runtimeCount": "Runtime ({{count}})",
2385
+ "debug.moreEntities": "+{{count}} more entities",
2386
+ "debug.persistent": "Persistent",
2387
+ "debug.loadedCount": "{{count}} loaded",
2388
+ "debug.notLoaded": "not loaded",
2389
+ "debug.eventsExecuteHint": "Events will appear as traits, ticks, and other systems execute",
2390
+ "debug.allCount": "All ({{count}})",
2391
+ "debug.autoScroll": "Auto-scroll",
2392
+ "debug.transitionsProcessHint": "Transitions will appear as the state machine processes events",
2393
+ "debug.transitionsRecorded": "{{count}} transitions recorded",
2394
+ "debug.guardLabel": "guard:",
2395
+ "debug.effectsCount": "{{count}} effects",
2396
+ "debug.bridgeInitHint": "The ServerBridge has not been initialized. Bridge health will appear once the runtime connects to the server.",
2397
+ "debug.never": "Never",
2398
+ "debug.connected": "Connected",
2399
+ "debug.disconnected": "Disconnected",
2400
+ "debug.lastError": "Last Error",
2401
+ "debug.totalEventsProcessed": "{{count}} total events processed",
2402
+ "debug.server": "server",
2403
+ "debug.clientEffectsCount": "{{count}} clientEffects",
2404
+ "debug.emitLabel": "emit:",
2405
+ "debug.rowsCount": "{{count}} rows",
2406
+ "debug.serverResponse": "server response",
2407
+ "debug.collapseVerificationTimeline": "Collapse verification timeline",
2408
+ "debug.expandVerificationTimeline": "Expand verification timeline",
2409
+ "debug.failCount": "{{count}} fail",
2410
+ "debug.ok": "OK",
2411
+ "debug.localCount": "{{count}} local",
2412
+ "debug.serverCount": "{{count}} server",
2413
+ "debug.waitingForTransitions": "Waiting for transitions...",
2414
+ "debug.tabDispatch": "Dispatch",
2415
+ "debug.tabVerify": "Verify",
2416
+ "debug.tabVerifyAlert": "Verify (!)",
2417
+ "debug.tabTimeline": "Timeline",
2418
+ "debug.tabBridge": "Bridge",
2419
+ "debug.tabTraits": "Traits",
2420
+ "debug.tabTicks": "Ticks",
2421
+ "debug.tabEntities": "Entities",
2422
+ "debug.tabEvents": "Events",
2423
+ "debug.tabGuards": "Guards",
2424
+ "debug.debugger": "Debugger",
2425
+ "debug.failedCount": "{{count}} failed",
2426
+ "debug.traitsCount": "{{count}} traits",
2427
+ "debug.idle": "Idle",
2428
+ "debug.openDebugger": "Open Debugger (`)",
2429
+ "debug.kflowVerifier": "KFlow Verifier",
2430
+ "debug.allPassing": "All passing",
2431
+ "debug.runtime": "Runtime",
2432
+ "debug.close": "Close (`)",
2433
+ "debug.toggleHint": "Press ` to toggle | window.__orbitalVerification for automation",
2434
+ "replyTree.expandReplies": "Expand replies",
2435
+ "replyTree.collapseReplies": "Collapse replies",
2436
+ "replyTree.voteOnReplyBy": "Vote on reply by {{author}}",
2437
+ "replyTree.replyTo": "Reply to {{author}}",
2438
+ "replyTree.replyToPlaceholder": "Reply to {{author}}\u2026",
2439
+ "replyTree.reply": "Reply",
2440
+ "replyTree.flagReplyBy": "Flag reply by {{author}}",
2441
+ "replyTree.flag": "Flag",
2442
+ "replyTree.send": "Send",
2443
+ "replyTree.continueThread": "Continue thread",
2444
+ "replyTree.noRepliesYet": "No replies yet.",
2445
+ "signaturePad.label": "Signature",
2446
+ "signaturePad.helperText": "Draw your signature above",
2447
+ "signaturePad.clear": "Clear",
2448
+ "signaturePad.confirm": "Confirm",
2449
+ "qrScanner.cameraUnavailable": "Camera unavailable",
2450
+ "qrScanner.paused": "Paused",
2451
+ "qrScanner.resumeScanning": "Resume scanning",
2452
+ "qrScanner.pauseScanning": "Pause scanning",
2453
+ "qrScanner.switchToFrontCamera": "Switch to front camera",
2454
+ "qrScanner.switchToRearCamera": "Switch to rear camera",
2455
+ "qrScanner.mockScan": "Mock Scan",
2456
+ "docSearch.placeholder": "Search documentation...",
2457
+ "stateMachine.loading": "Loading state machine\u2026",
2458
+ "stateMachine.noStateMachine": "No state machine to visualize",
2459
+ "avl.trigger": "Trigger",
2460
+ "avl.guard": "Guard",
2461
+ "avl.effects": "Effects",
2462
+ "avl.props": "Props",
2463
+ "avl.entity": "Entity",
2464
+ "avl.traits": "Traits",
2465
+ "avl.transition": "Transition",
2466
+ "avl.onEntity": "on {{entity}}",
2467
+ "avl.linkedTo": "linked to {{entity}}",
2468
+ "avl.pressEscToZoomOut": "Press Esc to zoom out",
2469
+ "avl.zoomIn": "Zoom in",
2470
+ "avl.zoomOut": "Zoom out",
2471
+ "avl.orbitalLabel": "Orbital: {{name}}",
2472
+ "avl.orbitalLabelHighlighted": "Orbital: {{name}} (highlighted)",
2473
+ "avl.noTraitData": "No trait data",
2474
+ "avl.computingLayout": "Computing layout...",
2475
+ "avl.noStateMachine": "No state machine",
2476
+ "avl.listensFor": "listens for {{event}}",
2477
+ "avl.emits": "emits {{event}}",
2478
+ "avl.pageLayout": "Page Layout",
2479
+ "avl.overlaySuffix": "(overlay)",
2480
+ "orbPreview.previewBadge": "Preview",
2481
+ "orbPreview.doubleClickToOpen": "Double-click to open",
2482
+ "orbPreview.dropToAddAndOpen": "Drop to add and open",
2483
+ "orbPreview.dispatching": "Coordinator is dispatching to this orbital",
2484
+ "orbPreview.noPreview": "No preview available",
2485
+ "orbPreview.screensCount": "{{count}} screens",
2486
+ "detailView.noTransitionData": "No transition data",
2487
+ "orbInspector.required": "req",
2488
+ "orbInspector.addField": "Add Field",
2489
+ "orbInspector.serviceMode": "Service Mode",
2490
+ "orbInspector.standalone": "Standalone",
2491
+ "orbInspector.embedded": "Embedded",
2492
+ "orbInspector.rendersOwnUi": "Renders its own UI",
2493
+ "orbInspector.headless": "Headless, wired to other behaviors",
2494
+ "orbInspector.addEffect": "Add Effect",
2495
+ "orbInspector.guardExpression": "Guard expression",
2496
+ "orbInspector.selectPatternForStyles": "Select a pattern to view its style tokens.",
2497
+ "orbInspector.tokens": "Tokens",
2498
+ "orbInspector.noTokenContract": "No token contract declared for this pattern.",
2499
+ "orbInspector.variant": "Variant",
2500
+ "orbInspector.size": "Size",
2501
+ "orbInspector.statesCount": "{{count}} states",
2502
+ "orbInspector.onEntity": " on {{entity}}",
2503
+ "orbInspector.projectThemeTokens": "Project theme tokens",
2504
+ "orbInspector.tokenGroup.colors": "Colors",
2505
+ "orbInspector.tokenGroup.radii": "Radii",
2506
+ "orbInspector.tokenGroup.spacing": "Spacing",
2507
+ "orbInspector.tokenGroup.shadows": "Shadows",
2508
+ "orbInspector.tab.inspector": "Inspector",
2509
+ "orbInspector.tab.styles": "Styles",
2510
+ "orbInspector.tab.code": "Code",
2511
+ "canvas.goBackToOverview": "Go back to overview",
2512
+ "canvas.overview": "Overview",
2513
+ "canvas.expanded": "Expanded",
2514
+ "canvas.modulesCount": "{{count}} modules",
2515
+ "canvas.screensCount": "{{count}} screens",
2516
+ "canvas.switchToView": "Switch to {{label}} view",
2517
+ "lawReference.viewFullText": "View full law text",
2518
+ "statCard.defaultLabel": "Stat",
2519
+ "statCard.vsLastPeriod": "vs last period",
2520
+ "mediaGallery.upload": "Upload",
2521
+ "mediaGallery.noMediaDescription": "No media items to display.",
2522
+ "pagination.jumpPlaceholder": "Page",
2523
+ "table.selectRow": "Select row {{id}}",
2524
+ "card.selectItem": "Select {{item}}",
2525
+ "card.itemFallback": "item",
2526
+ "fileTree.noFiles": "No files",
2527
+ "masterDetail.selectItem": "Select an item to view details",
2528
+ "empty.createFirst": "Create your first item to get started.",
2529
+ "upload.dropOrBrowse": "Drop files here or click to browse",
2530
+ "upload.dropFilesHere": "Drop files here",
2531
+ "upload.accepted": "Accepted: {{accept}}",
2532
+ "upload.maxSize": "Max size: {{size}}",
2533
+ "upload.maxFiles": "Up to {{count}} files",
2534
+ "upload.error.maxFiles": "Maximum {{count}} files allowed",
2535
+ "upload.error.invalidType": "Invalid file type: {{name}}",
2536
+ "upload.error.tooLarge": "File too large: {{name}} (max {{size}})",
2537
+ "optionConstraint.requiredOne": "Required, pick 1",
2538
+ "optionConstraint.optionalOne": "Optional, pick up to 1",
2539
+ "optionConstraint.pickExactly": "Pick exactly {{count}}",
2540
+ "optionConstraint.pickRange": "Pick {{min}}-{{max}}",
2541
+ "optionConstraint.pickAtLeast": "Pick at least {{count}}",
2542
+ "optionConstraint.pickUpTo": "Pick up to {{count}}",
2543
+ "optionConstraint.optional": "Optional",
2544
+ "optionConstraint.outOfStock": "Out of stock",
2545
+ "optionConstraint.error.pickOne": "Pick 1 option",
2546
+ "optionConstraint.error.pickOnlyOne": "Pick only 1 option",
2547
+ "optionConstraint.error.pickMore": "Pick at least {{count}} more",
2548
+ "optionConstraint.error.removeOptions": "Remove {{count}} options",
2549
+ "stateMachine.pinned": "Pinned",
2550
+ "stateMachine.eventCount": "{{count}} events",
2551
+ "stateMachine.externalEffects": "External Effects",
2552
+ "stateMachine.legend.initial": "Initial",
2553
+ "stateMachine.legend.final": "Final",
2554
+ "stateMachine.legend.state": "State",
2555
+ "stateMachine.legend.multiEvent": "Multi-event",
2556
+ "relationSelect.selectPlaceholder": "Select..."
2263
2557
  };
2264
2558
  }
2265
2559
  });
@@ -4721,6 +5015,7 @@ var init_LawReferenceTooltip = __esm({
4721
5015
  init_Typography();
4722
5016
  init_Divider();
4723
5017
  init_cn();
5018
+ init_useTranslate();
4724
5019
  positionStyles2 = {
4725
5020
  top: "bottom-full left-1/2 -translate-x-1/2 mb-2",
4726
5021
  bottom: "top-full left-1/2 -translate-x-1/2 mt-2",
@@ -4739,6 +5034,7 @@ var init_LawReferenceTooltip = __esm({
4739
5034
  position = "top",
4740
5035
  className
4741
5036
  }) => {
5037
+ const { t } = useTranslate();
4742
5038
  const [isVisible, setIsVisible] = React79__namespace.default.useState(false);
4743
5039
  const timeoutRef = React79__namespace.default.useRef(null);
4744
5040
  const handleMouseEnter = () => {
@@ -4822,7 +5118,7 @@ var init_LawReferenceTooltip = __esm({
4822
5118
  target: "_blank",
4823
5119
  rel: "noopener noreferrer",
4824
5120
  onClick: (e) => e.stopPropagation(),
4825
- children: "View full law text"
5121
+ children: t("lawReference.viewFullText")
4826
5122
  }
4827
5123
  )
4828
5124
  ] }),
@@ -12132,6 +12428,7 @@ var log4, SWIM_GUTTER, CENTER_W; exports.BehaviorView = void 0;
12132
12428
  var init_BehaviorView = __esm({
12133
12429
  "components/avl/molecules/BehaviorView.tsx"() {
12134
12430
  "use client";
12431
+ init_useTranslate();
12135
12432
  init_AvlState();
12136
12433
  init_AvlTransitionLane();
12137
12434
  init_AvlSwimLane();
@@ -12141,6 +12438,7 @@ var init_BehaviorView = __esm({
12141
12438
  SWIM_GUTTER = 120;
12142
12439
  CENTER_W = 360;
12143
12440
  exports.BehaviorView = ({ data }) => {
12441
+ const { t } = useTranslate();
12144
12442
  const [layout, setLayout] = React79.useState(null);
12145
12443
  const traitName = data.traits[0]?.name;
12146
12444
  const traitData = traitName ? data.traitDetails[traitName] : void 0;
@@ -12150,10 +12448,10 @@ var init_BehaviorView = __esm({
12150
12448
  computeTraitLayout(traitData).then(setLayout).catch((err) => log4.error("compute-trait-layout-failed", { error: err instanceof Error ? err : String(err) }));
12151
12449
  }, [dataKey]);
12152
12450
  if (!traitData) {
12153
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: "No trait data" });
12451
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: t("avl.noTraitData") });
12154
12452
  }
12155
12453
  if (!layout) {
12156
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: "Computing layout..." });
12454
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: t("avl.computingLayout") });
12157
12455
  }
12158
12456
  const hasExternal = traitData.listenedEvents.length > 0 || traitData.emittedEvents.length > 0;
12159
12457
  const viewW = hasExternal ? SWIM_GUTTER + CENTER_W + SWIM_GUTTER : CENTER_W + 60;
@@ -12169,10 +12467,7 @@ var init_BehaviorView = __esm({
12169
12467
  const machineHeight = scaledH + 100;
12170
12468
  const renderMachine = /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
12171
12469
  /* @__PURE__ */ jsxRuntime.jsx("text", { x: CENTER_W / 2, y: 20, textAnchor: "middle", fill: "var(--color-foreground)", fontSize: 18, fontWeight: "700", fontFamily: "inherit", children: traitData.name }),
12172
- /* @__PURE__ */ jsxRuntime.jsxs("text", { x: CENTER_W / 2, y: 36, textAnchor: "middle", fill: "var(--color-muted-foreground)", fontSize: 11, opacity: 0.5, fontFamily: "inherit", children: [
12173
- "on ",
12174
- traitData.linkedEntity
12175
- ] }),
12470
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: CENTER_W / 2, y: 36, textAnchor: "middle", fill: "var(--color-muted-foreground)", fontSize: 11, opacity: 0.5, fontFamily: "inherit", children: t("avl.onEntity", { entity: traitData.linkedEntity }) }),
12176
12471
  /* @__PURE__ */ jsxRuntime.jsxs("defs", { children: [
12177
12472
  /* @__PURE__ */ jsxRuntime.jsx("marker", { id: "bvArrow", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: CONNECTION_COLORS.forward.color, opacity: 0.7 }) }),
12178
12473
  /* @__PURE__ */ jsxRuntime.jsx("marker", { id: "bvArrowBack", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: CONNECTION_COLORS.backward.color, opacity: 0.5 }) })
@@ -12480,7 +12775,7 @@ var init_CodeBlock = __esm({
12480
12775
  const isLolo = language === "lolo";
12481
12776
  const activeStyle = isOrb ? orbStyle : isLolo ? loloStyle : dark__default.default;
12482
12777
  const eventBus = useEventBus();
12483
- const { t: _t } = useTranslate();
12778
+ const { t } = useTranslate();
12484
12779
  const scrollRef = React79.useRef(null);
12485
12780
  const codeRef = React79.useRef(null);
12486
12781
  const savedScrollLeftRef = React79.useRef(0);
@@ -12735,7 +13030,7 @@ var init_CodeBlock = __esm({
12735
13030
  size: "sm",
12736
13031
  onClick: handleCopy,
12737
13032
  className: "opacity-0 group-hover:opacity-100 focus:opacity-100 transition-opacity text-muted-foreground hover:text-white",
12738
- "aria-label": "Copy code",
13033
+ "aria-label": t("common.copy"),
12739
13034
  children: copied ? /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "check", className: "w-4 h-4 text-green-400" }) : /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "copy", className: "w-4 h-4" })
12740
13035
  }
12741
13036
  )
@@ -13390,7 +13685,7 @@ var init_StateMachineView = __esm({
13390
13685
  const endX2 = fromState.x + Math.cos(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
13391
13686
  const endY2 = fromState.y + Math.sin(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
13392
13687
  const isSingle2 = bundle.labels.length === 1;
13393
- const labelText2 = isSingle2 ? bundle.labels[0].event : `${bundle.labels.length} events`;
13688
+ const labelText2 = isSingle2 ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
13394
13689
  const bundleColor2 = isSingle2 ? config.colors.arrow : "var(--color-accent)";
13395
13690
  const labelWidth2 = labelText2.length * 9 + (isSingle2 ? 24 : 40);
13396
13691
  const cx = fromState.x;
@@ -13516,7 +13811,7 @@ var init_StateMachineView = __esm({
13516
13811
  const controlX = midX + perpX;
13517
13812
  const controlY = midY + perpY;
13518
13813
  const isSingle = bundle.labels.length === 1;
13519
- const labelText = isSingle ? bundle.labels[0].event : `${bundle.labels.length} events`;
13814
+ const labelText = isSingle ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
13520
13815
  const labelWidth = labelText.length * 9 + (isSingle ? 24 : 40);
13521
13816
  const bundleColor = isSingle ? config.colors.arrow : "var(--color-accent)";
13522
13817
  const curveMidpoint = {
@@ -13671,7 +13966,7 @@ var init_StateMachineView = __esm({
13671
13966
  {
13672
13967
  className: "absolute -top-2 left-1/2 transform -translate-x-1/2 px-2 py-0.5 rounded-full",
13673
13968
  style: { backgroundColor: "var(--color-success)" },
13674
- children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: "Pinned" })
13969
+ children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: t("stateMachine.pinned") })
13675
13970
  }
13676
13971
  ),
13677
13972
  !isSingle && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -13693,10 +13988,7 @@ var init_StateMachineView = __esm({
13693
13988
  {
13694
13989
  className: "ml-2 px-2 py-0.5 rounded-full",
13695
13990
  style: { backgroundColor: "var(--color-accent)" },
13696
- children: /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: [
13697
- bundle.labels.length,
13698
- " events"
13699
- ] })
13991
+ children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: t("stateMachine.eventCount", { count: bundle.labels.length }) })
13700
13992
  }
13701
13993
  )
13702
13994
  ]
@@ -13841,7 +14133,7 @@ var init_StateMachineView = __esm({
13841
14133
  align: "center",
13842
14134
  className: "mb-2",
13843
14135
  style: { color: "var(--color-warning)", fontSize: "13px" },
13844
- children: "External Effects"
14136
+ children: t("stateMachine.externalEffects")
13845
14137
  }
13846
14138
  ),
13847
14139
  outputs.outputs.map((output, idx) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -13861,10 +14153,10 @@ var init_StateMachineView = __esm({
13861
14153
  Legend = ({ config, y }) => {
13862
14154
  const { t } = useTranslate();
13863
14155
  const items = [
13864
- { label: "Initial", color: config.colors.initialNode },
13865
- { label: "Final", color: config.colors.finalNode },
13866
- { label: "State", color: config.colors.nodeBorder },
13867
- { label: "Multi-event", color: "var(--color-accent)" }
14156
+ { key: "initial", label: t("stateMachine.legend.initial"), color: config.colors.initialNode, isMultiEvent: false },
14157
+ { key: "final", label: t("stateMachine.legend.final"), color: config.colors.finalNode, isMultiEvent: false },
14158
+ { key: "state", label: t("stateMachine.legend.state"), color: config.colors.nodeBorder, isMultiEvent: false },
14159
+ { key: "multiEvent", label: t("stateMachine.legend.multiEvent"), color: "var(--color-accent)", isMultiEvent: true }
13868
14160
  ];
13869
14161
  return /* @__PURE__ */ jsxRuntime.jsx(
13870
14162
  exports.HStack,
@@ -13879,8 +14171,8 @@ var init_StateMachineView = __esm({
13879
14171
  {
13880
14172
  className: "w-3 h-3 rounded-full",
13881
14173
  style: {
13882
- backgroundColor: item.label === "Multi-event" ? item.color : config.colors.node,
13883
- border: item.label !== "Multi-event" ? `2px solid ${item.color}` : "none"
14174
+ backgroundColor: item.isMultiEvent ? item.color : config.colors.node,
14175
+ border: !item.isMultiEvent ? `2px solid ${item.color}` : "none"
13884
14176
  }
13885
14177
  }
13886
14178
  ),
@@ -13892,7 +14184,7 @@ var init_StateMachineView = __esm({
13892
14184
  children: item.label
13893
14185
  }
13894
14186
  )
13895
- ] }, item.label))
14187
+ ] }, item.key))
13896
14188
  }
13897
14189
  );
13898
14190
  };
@@ -14686,13 +14978,13 @@ var init_JazariStateMachine = __esm({
14686
14978
  );
14687
14979
  }, [resolvedTrait, entityFields]);
14688
14980
  if (isLoading) {
14689
- return /* @__PURE__ */ jsxRuntime.jsx(exports.LoadingState, { message: "Loading state machine\u2026" });
14981
+ return /* @__PURE__ */ jsxRuntime.jsx(exports.LoadingState, { message: t("stateMachine.loading") });
14690
14982
  }
14691
14983
  if (error) {
14692
14984
  return /* @__PURE__ */ jsxRuntime.jsx(exports.ErrorState, { message: error instanceof Error ? error.message : String(error) });
14693
14985
  }
14694
14986
  if (!resolvedTrait || !layoutData || layoutData.states.length === 0) {
14695
- return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { padding: "lg", className: cn("text-center", className), children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body", className: "opacity-60", children: "No state machine to visualize" }) });
14987
+ return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { padding: "lg", className: cn("text-center", className), children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body", className: "opacity-60", children: t("stateMachine.noStateMachine") }) });
14696
14988
  }
14697
14989
  return /* @__PURE__ */ jsxRuntime.jsx(
14698
14990
  exports.StateMachineView,
@@ -15736,13 +16028,13 @@ var init_LayoutPatterns = __esm({
15736
16028
  function generateRuleId() {
15737
16029
  return `rule-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
15738
16030
  }
15739
- function questionsToOptions(questions, includeEndOfSurvey) {
16031
+ function questionsToOptions(questions, endOfSurveyLabel) {
15740
16032
  const opts = questions.map((q) => ({
15741
16033
  value: q.id,
15742
16034
  label: q.label
15743
16035
  }));
15744
- if (includeEndOfSurvey) {
15745
- opts.push({ value: END_OF_SURVEY, label: "End of survey" });
16036
+ if (endOfSurveyLabel !== null) {
16037
+ opts.push({ value: END_OF_SURVEY, label: endOfSurveyLabel });
15746
16038
  }
15747
16039
  return opts;
15748
16040
  }
@@ -15751,7 +16043,7 @@ function isRuleBroken(rule, questions) {
15751
16043
  const targetExists = rule.targetQuestionId === END_OF_SURVEY || questions.some((q) => q.id === rule.targetQuestionId);
15752
16044
  return !sourceExists || !targetExists;
15753
16045
  }
15754
- var END_OF_SURVEY, OPERATOR_OPTIONS, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph; exports.BranchingLogicBuilder = void 0;
16046
+ var END_OF_SURVEY, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph; exports.BranchingLogicBuilder = void 0;
15755
16047
  var init_BranchingLogicBuilder = __esm({
15756
16048
  "components/core/molecules/BranchingLogicBuilder.tsx"() {
15757
16049
  "use client";
@@ -15764,14 +16056,9 @@ var init_BranchingLogicBuilder = __esm({
15764
16056
  init_FilterPill();
15765
16057
  init_Box();
15766
16058
  init_useEventBus();
16059
+ init_useTranslate();
15767
16060
  init_cn();
15768
16061
  END_OF_SURVEY = "end-of-survey";
15769
- OPERATOR_OPTIONS = [
15770
- { value: "equals", label: "equals" },
15771
- { value: "not-equals", label: "does not equal" },
15772
- { value: "contains", label: "contains" },
15773
- { value: "in", label: "is one of" }
15774
- ];
15775
16062
  RuleRow = ({
15776
16063
  rule,
15777
16064
  questions,
@@ -15780,8 +16067,21 @@ var init_BranchingLogicBuilder = __esm({
15780
16067
  onChange,
15781
16068
  onDelete
15782
16069
  }) => {
15783
- const sourceOptions = React79.useMemo(() => questionsToOptions(questions, false), [questions]);
15784
- const targetOptions = React79.useMemo(() => questionsToOptions(questions, true), [questions]);
16070
+ const { t } = useTranslate();
16071
+ const operatorOptions = React79.useMemo(
16072
+ () => [
16073
+ { value: "equals", label: t("branchingLogic.operatorEquals") },
16074
+ { value: "not-equals", label: t("branchingLogic.operatorNotEquals") },
16075
+ { value: "contains", label: t("branchingLogic.operatorContains") },
16076
+ { value: "in", label: t("branchingLogic.operatorIn") }
16077
+ ],
16078
+ [t]
16079
+ );
16080
+ const sourceOptions = React79.useMemo(() => questionsToOptions(questions, null), [questions]);
16081
+ const targetOptions = React79.useMemo(
16082
+ () => questionsToOptions(questions, t("branchingLogic.endOfSurvey")),
16083
+ [questions, t]
16084
+ );
15785
16085
  const sourceQuestion = questions.find((q) => q.id === rule.sourceQuestionId);
15786
16086
  const valueOptions = React79.useMemo(() => {
15787
16087
  if (!sourceQuestion?.optionValues) return [];
@@ -15826,22 +16126,22 @@ var init_BranchingLogicBuilder = __esm({
15826
16126
  ),
15827
16127
  children: [
15828
16128
  /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "flex flex-wrap items-center gap-2", children: [
15829
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "label", weight: "semibold", className: "shrink-0", children: "If" }),
16129
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "label", weight: "semibold", className: "shrink-0", children: t("branchingLogic.if") }),
15830
16130
  /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsxRuntime.jsx(
15831
16131
  exports.Select,
15832
16132
  {
15833
16133
  options: sourceOptions,
15834
16134
  value: rule.sourceQuestionId,
15835
- placeholder: "Select question",
16135
+ placeholder: t("branchingLogic.selectQuestion"),
15836
16136
  onChange: handleSource,
15837
16137
  disabled: readOnly,
15838
- error: broken ? "Broken reference" : void 0
16138
+ error: broken ? t("branchingLogic.brokenReference") : void 0
15839
16139
  }
15840
16140
  ) }),
15841
16141
  /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "min-w-[8rem] basis-32", children: /* @__PURE__ */ jsxRuntime.jsx(
15842
16142
  exports.Select,
15843
16143
  {
15844
- options: OPERATOR_OPTIONS,
16144
+ options: operatorOptions,
15845
16145
  value: rule.operator,
15846
16146
  onChange: handleOperator,
15847
16147
  disabled: readOnly
@@ -15864,7 +16164,7 @@ var init_BranchingLogicBuilder = __esm({
15864
16164
  {
15865
16165
  options: valueOptions.filter((o) => !chips.includes(o.value)),
15866
16166
  value: "",
15867
- placeholder: "Add value",
16167
+ placeholder: t("branchingLogic.addValue"),
15868
16168
  onChange: handleAddChip,
15869
16169
  disabled: readOnly
15870
16170
  }
@@ -15872,7 +16172,7 @@ var init_BranchingLogicBuilder = __esm({
15872
16172
  exports.Input,
15873
16173
  {
15874
16174
  inputType: "text",
15875
- placeholder: "Type value, press Enter",
16175
+ placeholder: t("branchingLogic.typeValuePressEnter"),
15876
16176
  value: "",
15877
16177
  onKeyDown: (e) => {
15878
16178
  if (e.key !== "Enter") return;
@@ -15890,7 +16190,7 @@ var init_BranchingLogicBuilder = __esm({
15890
16190
  {
15891
16191
  options: valueOptions,
15892
16192
  value: scalarValue,
15893
- placeholder: "Select value",
16193
+ placeholder: t("branchingLogic.selectValue"),
15894
16194
  onChange: (e) => onChange({ ...rule, value: e.target.value }),
15895
16195
  disabled: readOnly
15896
16196
  }
@@ -15898,7 +16198,7 @@ var init_BranchingLogicBuilder = __esm({
15898
16198
  exports.Input,
15899
16199
  {
15900
16200
  inputType: "text",
15901
- placeholder: "Value",
16201
+ placeholder: t("branchingLogic.value"),
15902
16202
  value: scalarValue,
15903
16203
  onChange: handleScalarValue,
15904
16204
  disabled: readOnly
@@ -15906,17 +16206,17 @@ var init_BranchingLogicBuilder = __esm({
15906
16206
  ) }),
15907
16207
  /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { variant: "label", weight: "semibold", className: "shrink-0 inline-flex items-center gap-1", children: [
15908
16208
  /* @__PURE__ */ jsxRuntime.jsx(LucideIcons2.ArrowRight, { className: "h-4 w-4" }),
15909
- "go to"
16209
+ t("branchingLogic.goTo")
15910
16210
  ] }),
15911
16211
  /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsxRuntime.jsx(
15912
16212
  exports.Select,
15913
16213
  {
15914
16214
  options: targetOptions,
15915
16215
  value: rule.targetQuestionId,
15916
- placeholder: "Select target",
16216
+ placeholder: t("branchingLogic.selectTarget"),
15917
16217
  onChange: handleTarget,
15918
16218
  disabled: readOnly,
15919
- error: broken && rule.targetQuestionId !== END_OF_SURVEY ? "Broken reference" : void 0
16219
+ error: broken && rule.targetQuestionId !== END_OF_SURVEY ? t("branchingLogic.brokenReference") : void 0
15920
16220
  }
15921
16221
  ) }),
15922
16222
  !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
@@ -15928,11 +16228,11 @@ var init_BranchingLogicBuilder = __esm({
15928
16228
  action: "DELETE_RULE",
15929
16229
  actionPayload: { ruleId: rule.id },
15930
16230
  onClick: onDelete,
15931
- "aria-label": "Delete rule"
16231
+ "aria-label": t("branchingLogic.deleteRule")
15932
16232
  }
15933
16233
  )
15934
16234
  ] }),
15935
- broken && /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "error", size: "sm", label: "Broken reference" })
16235
+ broken && /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "error", size: "sm", label: t("branchingLogic.brokenReference") })
15936
16236
  ]
15937
16237
  }
15938
16238
  );
@@ -15942,10 +16242,12 @@ var init_BranchingLogicBuilder = __esm({
15942
16242
  NODE_GAP_Y = 80;
15943
16243
  PADDING = 32;
15944
16244
  LogicGraph = ({ questions, rules }) => {
16245
+ const { t } = useTranslate();
16246
+ const endOfSurveyLabel = t("branchingLogic.endOfSurvey");
15945
16247
  const layout = React79.useMemo(() => {
15946
16248
  const items = [
15947
16249
  ...questions.map((q) => ({ id: q.id, label: q.label, isEnd: false })),
15948
- { id: END_OF_SURVEY, label: "End of survey", isEnd: true }
16250
+ { id: END_OF_SURVEY, label: endOfSurveyLabel, isEnd: true }
15949
16251
  ];
15950
16252
  const positions = {};
15951
16253
  items.forEach((item, i) => {
@@ -15957,14 +16259,14 @@ var init_BranchingLogicBuilder = __esm({
15957
16259
  const width = NODE_WIDTH + PADDING * 2 + 220;
15958
16260
  const height = PADDING * 2 + items.length * (NODE_HEIGHT + NODE_GAP_Y);
15959
16261
  return { items, positions, width, height };
15960
- }, [questions]);
16262
+ }, [questions, endOfSurveyLabel]);
15961
16263
  return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "overflow-auto rounded-container border border-border bg-card p-2", children: /* @__PURE__ */ jsxRuntime.jsxs(
15962
16264
  "svg",
15963
16265
  {
15964
16266
  width: layout.width,
15965
16267
  height: layout.height,
15966
16268
  role: "img",
15967
- "aria-label": "Branching logic graph",
16269
+ "aria-label": t("branchingLogic.graphAriaLabel"),
15968
16270
  style: { display: "block" },
15969
16271
  children: [
15970
16272
  /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -16072,6 +16374,7 @@ var init_BranchingLogicBuilder = __esm({
16072
16374
  readOnly = false,
16073
16375
  className
16074
16376
  }) => {
16377
+ const { t } = useTranslate();
16075
16378
  const eventBus = useEventBus();
16076
16379
  const questions = Array.isArray(questionsProp) ? questionsProp : [];
16077
16380
  const rulesInitial = Array.isArray(rulesProp) ? rulesProp : [];
@@ -16124,16 +16427,23 @@ var init_BranchingLogicBuilder = __esm({
16124
16427
  /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "flex flex-wrap items-center justify-between gap-2", children: [
16125
16428
  /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "flex items-center gap-2", children: [
16126
16429
  /* @__PURE__ */ jsxRuntime.jsx(LucideIcons2.GitBranch, { className: "h-5 w-5 text-foreground" }),
16127
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "subheading", weight: "semibold", children: "Branching logic" }),
16430
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "subheading", weight: "semibold", children: t("branchingLogic.title") }),
16128
16431
  /* @__PURE__ */ jsxRuntime.jsx(
16129
16432
  exports.Badge,
16130
16433
  {
16131
16434
  variant: "neutral",
16132
16435
  size: "sm",
16133
- label: `${rules.length} rule${rules.length === 1 ? "" : "s"}`
16436
+ label: rules.length === 1 ? t("branchingLogic.ruleCountOne", { count: rules.length }) : t("branchingLogic.ruleCountOther", { count: rules.length })
16134
16437
  }
16135
16438
  ),
16136
- brokenCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "error", size: "sm", label: `${brokenCount} broken` })
16439
+ brokenCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
16440
+ exports.Badge,
16441
+ {
16442
+ variant: "error",
16443
+ size: "sm",
16444
+ label: t("branchingLogic.brokenCount", { count: brokenCount })
16445
+ }
16446
+ )
16137
16447
  ] }),
16138
16448
  /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "flex items-center gap-1 rounded-sm border border-border bg-card p-0.5", children: [
16139
16449
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -16144,7 +16454,7 @@ var init_BranchingLogicBuilder = __esm({
16144
16454
  leftIcon: LucideIcons2.Pencil,
16145
16455
  action: "VIEW_EDIT",
16146
16456
  onClick: () => setView("edit"),
16147
- children: "Rules"
16457
+ children: t("branchingLogic.rules")
16148
16458
  }
16149
16459
  ),
16150
16460
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -16155,13 +16465,13 @@ var init_BranchingLogicBuilder = __esm({
16155
16465
  leftIcon: LucideIcons2.Eye,
16156
16466
  action: "VIEW_GRAPH",
16157
16467
  onClick: () => setView("graph"),
16158
- children: "Logic graph"
16468
+ children: t("branchingLogic.logicGraph")
16159
16469
  }
16160
16470
  )
16161
16471
  ] })
16162
16472
  ] }),
16163
16473
  view === "edit" ? /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "flex flex-col gap-2", children: [
16164
- rules.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(exports.Card, { variant: "bordered", padding: "lg", className: "text-center", children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body", color: "muted", children: noQuestions ? "Add questions before building branching rules." : "No rules yet. Add a rule to define branching logic." }) }) : rules.map((rule) => /* @__PURE__ */ jsxRuntime.jsx(
16474
+ rules.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(exports.Card, { variant: "bordered", padding: "lg", className: "text-center", children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body", color: "muted", children: noQuestions ? t("branchingLogic.emptyNoQuestions") : t("branchingLogic.emptyNoRules") }) }) : rules.map((rule) => /* @__PURE__ */ jsxRuntime.jsx(
16165
16475
  RuleRow,
16166
16476
  {
16167
16477
  rule,
@@ -16182,7 +16492,7 @@ var init_BranchingLogicBuilder = __esm({
16182
16492
  action: "ADD_RULE",
16183
16493
  onClick: handleAddRule,
16184
16494
  disabled: noQuestions,
16185
- children: "Add rule"
16495
+ children: t("branchingLogic.addRule")
16186
16496
  }
16187
16497
  ) })
16188
16498
  ] }) : /* @__PURE__ */ jsxRuntime.jsx(LogicGraph, { questions, rules })
@@ -16809,7 +17119,7 @@ function CalendarGrid({
16809
17119
  onClick: stepPrev,
16810
17120
  "aria-disabled": !canPrev || void 0,
16811
17121
  "aria-label": t("aria.previousDays"),
16812
- children: "Prev"
17122
+ children: t("nav.previous")
16813
17123
  }
16814
17124
  ),
16815
17125
  /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", className: "text-muted-foreground", children: formatDateRange(visibleDays[0], visibleDays[visibleDays.length - 1]) }),
@@ -16822,7 +17132,7 @@ function CalendarGrid({
16822
17132
  onClick: stepNext,
16823
17133
  "aria-disabled": !canNext || void 0,
16824
17134
  "aria-label": t("aria.nextDays"),
16825
- children: "Next"
17135
+ children: t("nav.next")
16826
17136
  }
16827
17137
  )
16828
17138
  ] }),
@@ -18372,7 +18682,7 @@ var init_Pagination = __esm({
18372
18682
  type: "number",
18373
18683
  value: jumpToPage,
18374
18684
  onChange: (e) => setJumpToPage(e.target.value),
18375
- placeholder: "Page",
18685
+ placeholder: t("pagination.jumpPlaceholder"),
18376
18686
  className: "w-20",
18377
18687
  onKeyDown: (e) => {
18378
18688
  if (e.key === "Enter") {
@@ -18510,13 +18820,10 @@ var init_CardGrid = __esm({
18510
18820
  return children;
18511
18821
  }
18512
18822
  if (isLoading) {
18513
- return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "col-span-full text-center py-8 text-muted-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body", color: "secondary", children: "Loading items..." }) });
18823
+ return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "col-span-full text-center py-8 text-muted-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body", color: "secondary", children: t("loading.items") }) });
18514
18824
  }
18515
18825
  if (error) {
18516
- return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "col-span-full text-center py-8 text-error", children: /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { variant: "body", color: "error", children: [
18517
- "Error loading items: ",
18518
- error.message
18519
- ] }) });
18826
+ return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "col-span-full text-center py-8 text-error", children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body", color: "error", children: t("error.loadFailed", { message: error.message }) }) });
18520
18827
  }
18521
18828
  if (normalizedData.length === 0) {
18522
18829
  return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "col-span-full text-center py-12 text-muted-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body", color: "secondary", children: t("empty.noItems") || "No items found" }) });
@@ -22613,7 +22920,7 @@ function DataGrid({
22613
22920
  onChange: () => toggleSelection(id),
22614
22921
  onClick: (e) => e.stopPropagation(),
22615
22922
  className: "w-4 h-4 mt-1 flex-shrink-0 accent-primary",
22616
- "aria-label": `Select ${titleValue !== void 0 ? String(titleValue) : "item"}`
22923
+ "aria-label": t("card.selectItem", { item: titleValue !== void 0 ? String(titleValue) : t("card.itemFallback") })
22617
22924
  }
22618
22925
  ),
22619
22926
  /* @__PURE__ */ jsxRuntime.jsxs(exports.VStack, { gap: "xs", className: "flex-1 min-w-0", children: [
@@ -22811,7 +23118,7 @@ function formatDate3(value) {
22811
23118
  if (isNaN(d.getTime())) return String(value);
22812
23119
  return d.toLocaleDateString(void 0, { year: "numeric", month: "short", day: "numeric" });
22813
23120
  }
22814
- function formatValue2(value, format) {
23121
+ function formatValue2(value, format, boolLabels) {
22815
23122
  if (value === void 0 || value === null) return "";
22816
23123
  switch (format) {
22817
23124
  case "date":
@@ -22823,7 +23130,7 @@ function formatValue2(value, format) {
22823
23130
  case "percent":
22824
23131
  return typeof value === "number" ? `${Math.round(value)}%` : String(value);
22825
23132
  case "boolean":
22826
- return value ? "Yes" : "No";
23133
+ return value ? boolLabels?.yes ?? "Yes" : boolLabels?.no ?? "No";
22827
23134
  default:
22828
23135
  return String(value);
22829
23136
  }
@@ -23119,7 +23426,7 @@ function DataList({
23119
23426
  field.label ?? fieldLabel3(field.name),
23120
23427
  ":"
23121
23428
  ] }),
23122
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", children: formatValue2(value, field.format) })
23429
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
23123
23430
  ] }, field.name);
23124
23431
  }) }),
23125
23432
  progressFields.map((field) => {
@@ -23249,6 +23556,7 @@ var init_FileTree = __esm({
23249
23556
  init_Box();
23250
23557
  init_Typography();
23251
23558
  init_Icon();
23559
+ init_useTranslate();
23252
23560
  TreeNodeItem = ({
23253
23561
  node,
23254
23562
  depth,
@@ -23334,8 +23642,9 @@ var init_FileTree = __esm({
23334
23642
  className,
23335
23643
  indent = 16
23336
23644
  }) => {
23645
+ const { t } = useTranslate();
23337
23646
  if (tree.length === 0) {
23338
- return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", color: "muted", children: "No files" }) });
23647
+ return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", color: "muted", children: t("fileTree.noFiles") }) });
23339
23648
  }
23340
23649
  return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: `py-1 overflow-y-auto ${className ?? ""}`, role: "tree", children: tree.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
23341
23650
  TreeNodeItem,
@@ -23462,6 +23771,7 @@ var init_FilterGroup = __esm({
23462
23771
  init_Icon();
23463
23772
  init_useEventBus();
23464
23773
  init_useQuerySingleton();
23774
+ init_useTranslate();
23465
23775
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
23466
23776
  lookStyles6 = {
23467
23777
  toolbar: "",
@@ -23482,6 +23792,7 @@ var init_FilterGroup = __esm({
23482
23792
  isLoading,
23483
23793
  look = "toolbar"
23484
23794
  }) => {
23795
+ const { t } = useTranslate();
23485
23796
  const eventBus = useEventBus();
23486
23797
  const queryState = useQuerySingleton(query);
23487
23798
  const [selectedValues, setSelectedValues] = React79.useState(
@@ -23563,7 +23874,7 @@ var init_FilterGroup = __esm({
23563
23874
  "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
23564
23875
  !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
23565
23876
  ),
23566
- children: "All"
23877
+ children: t("filterGroup.all")
23567
23878
  }
23568
23879
  ),
23569
23880
  filter.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -23591,7 +23902,7 @@ var init_FilterGroup = __esm({
23591
23902
  size: "sm",
23592
23903
  onClick: handleClearAll,
23593
23904
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "x", className: "h-3.5 w-3.5" }),
23594
- children: "Clear"
23905
+ children: t("filterGroup.clear")
23595
23906
  }
23596
23907
  )
23597
23908
  ]
@@ -23602,7 +23913,7 @@ var init_FilterGroup = __esm({
23602
23913
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", lookStyles6[look], className), children: [
23603
23914
  showIcon && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
23604
23915
  /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "filter", className: "h-4 w-4" }),
23605
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
23916
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
23606
23917
  ] }),
23607
23918
  filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
23608
23919
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-xs font-bold text-muted-foreground uppercase tracking-wide", children: filter.label }),
@@ -23625,7 +23936,7 @@ var init_FilterGroup = __esm({
23625
23936
  `${filter.field}_from`,
23626
23937
  e.target.value || null
23627
23938
  ),
23628
- placeholder: "From",
23939
+ placeholder: t("filterGroup.from"),
23629
23940
  clearable: true,
23630
23941
  onClear: () => handleFilterSelect(`${filter.field}_from`, null)
23631
23942
  }
@@ -23639,7 +23950,7 @@ var init_FilterGroup = __esm({
23639
23950
  `${filter.field}_to`,
23640
23951
  e.target.value || null
23641
23952
  ),
23642
- placeholder: "To",
23953
+ placeholder: t("filterGroup.to"),
23643
23954
  clearable: true,
23644
23955
  onClear: () => handleFilterSelect(`${filter.field}_to`, null)
23645
23956
  }
@@ -23659,7 +23970,7 @@ var init_FilterGroup = __esm({
23659
23970
  value: selectedValues[filter.field] || "all",
23660
23971
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
23661
23972
  options: [
23662
- { value: "all", label: "All" },
23973
+ { value: "all", label: t("filterGroup.all") },
23663
23974
  ...filter.options?.map((opt) => ({
23664
23975
  value: opt,
23665
23976
  label: opt
@@ -23676,7 +23987,7 @@ var init_FilterGroup = __esm({
23676
23987
  onClick: handleClearAll,
23677
23988
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "x", className: "h-3.5 w-3.5" }),
23678
23989
  className: "self-start",
23679
- children: "Clear all"
23990
+ children: t("filterGroup.clearAll")
23680
23991
  }
23681
23992
  )
23682
23993
  ] });
@@ -23742,7 +24053,7 @@ var init_FilterGroup = __esm({
23742
24053
  value: selectedValues[filter.field] || "all",
23743
24054
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
23744
24055
  options: [
23745
- { value: "all", label: `All ${filter.label}` },
24056
+ { value: "all", label: t("filterGroup.allOf", { label: filter.label }) },
23746
24057
  ...filter.options?.map((opt) => ({
23747
24058
  value: opt,
23748
24059
  label: opt
@@ -23771,7 +24082,7 @@ var init_FilterGroup = __esm({
23771
24082
  field
23772
24083
  );
23773
24084
  }),
23774
- /* @__PURE__ */ jsxRuntime.jsx(exports.Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
24085
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: t("filterGroup.clearAll") })
23775
24086
  ] })
23776
24087
  ]
23777
24088
  }
@@ -23796,7 +24107,7 @@ var init_FilterGroup = __esm({
23796
24107
  className: "text-muted-foreground",
23797
24108
  children: [
23798
24109
  /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "filter", className: "h-4 w-4" }),
23799
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
24110
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
23800
24111
  ]
23801
24112
  }
23802
24113
  ),
@@ -23822,7 +24133,7 @@ var init_FilterGroup = __esm({
23822
24133
  `${filter.field}_from`,
23823
24134
  e.target.value || null
23824
24135
  ),
23825
- placeholder: "From",
24136
+ placeholder: t("filterGroup.from"),
23826
24137
  clearable: true,
23827
24138
  onClear: () => handleFilterSelect(`${filter.field}_from`, null),
23828
24139
  className: "min-w-[130px]"
@@ -23838,7 +24149,7 @@ var init_FilterGroup = __esm({
23838
24149
  `${filter.field}_to`,
23839
24150
  e.target.value || null
23840
24151
  ),
23841
- placeholder: "To",
24152
+ placeholder: t("filterGroup.to"),
23842
24153
  clearable: true,
23843
24154
  onClear: () => handleFilterSelect(`${filter.field}_to`, null),
23844
24155
  className: "min-w-[130px]"
@@ -23860,7 +24171,7 @@ var init_FilterGroup = __esm({
23860
24171
  value: selectedValues[filter.field] || "all",
23861
24172
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
23862
24173
  options: [
23863
- { value: "all", label: "All" },
24174
+ { value: "all", label: t("filterGroup.all") },
23864
24175
  ...filter.options?.map((opt) => ({
23865
24176
  value: opt,
23866
24177
  label: opt
@@ -23871,10 +24182,7 @@ var init_FilterGroup = __esm({
23871
24182
  )
23872
24183
  ] }, filter.field)),
23873
24184
  activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "sm", align: "center", className: "ml-auto", children: [
23874
- /* @__PURE__ */ jsxRuntime.jsxs(exports.Badge, { variant: "primary", size: "md", children: [
23875
- activeFilterCount,
23876
- " active"
23877
- ] }),
24185
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "primary", size: "md", children: t("filterGroup.activeCount", { count: activeFilterCount }) }),
23878
24186
  /* @__PURE__ */ jsxRuntime.jsx(
23879
24187
  exports.Button,
23880
24188
  {
@@ -23882,7 +24190,7 @@ var init_FilterGroup = __esm({
23882
24190
  size: "sm",
23883
24191
  onClick: handleClearAll,
23884
24192
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "x", className: "h-3.5 w-3.5" }),
23885
- children: "Clear all"
24193
+ children: t("filterGroup.clearAll")
23886
24194
  }
23887
24195
  )
23888
24196
  ] })
@@ -24362,7 +24670,7 @@ var init_RelationSelect = __esm({
24362
24670
  value,
24363
24671
  onChange,
24364
24672
  options = [],
24365
- placeholder = "Select...",
24673
+ placeholder,
24366
24674
  required = false,
24367
24675
  disabled = false,
24368
24676
  isLoading = false,
@@ -24374,6 +24682,7 @@ var init_RelationSelect = __esm({
24374
24682
  emptyMessage
24375
24683
  }) => {
24376
24684
  const { t } = useTranslate();
24685
+ const resolvedPlaceholder = placeholder ?? t("relationSelect.selectPlaceholder");
24377
24686
  const resolvedSearchPlaceholder = searchPlaceholder ?? t("common.search");
24378
24687
  const resolvedEmptyMessage = emptyMessage ?? t("empty.noOptionsFound");
24379
24688
  const [isOpen, setIsOpen] = React79.useState(false);
@@ -24483,7 +24792,7 @@ var init_RelationSelect = __esm({
24483
24792
  children: isLoading ? /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "xs", align: "center", children: [
24484
24793
  /* @__PURE__ */ jsxRuntime.jsx(exports.Spinner, { size: "sm" }),
24485
24794
  /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { as: "span", children: t("common.loading") })
24486
- ] }) : selectedOption ? selectedOption.label : placeholder
24795
+ ] }) : selectedOption ? selectedOption.label : resolvedPlaceholder
24487
24796
  }
24488
24797
  ),
24489
24798
  /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "xs", align: "center", children: [
@@ -25077,19 +25386,20 @@ var init_RepeatableFormSection = __esm({
25077
25386
  exports.RepeatableFormSection.displayName = "RepeatableFormSection";
25078
25387
  }
25079
25388
  });
25080
- var actionTypeLabels, actionTypeIcons; exports.ViolationAlert = void 0;
25389
+ var actionTypeLabelKeys, actionTypeIcons; exports.ViolationAlert = void 0;
25081
25390
  var init_ViolationAlert = __esm({
25082
25391
  "components/core/molecules/ViolationAlert.tsx"() {
25083
25392
  init_cn();
25393
+ init_useTranslate();
25084
25394
  init_Box();
25085
25395
  init_Stack();
25086
25396
  init_Typography();
25087
25397
  init_Button();
25088
25398
  init_Icon();
25089
- actionTypeLabels = {
25090
- measure: "Corrective Measure",
25091
- admin: "Administrative Action",
25092
- penalty: "Penalty Proceedings"
25399
+ actionTypeLabelKeys = {
25400
+ measure: "violationAlert.actionType.measure",
25401
+ admin: "violationAlert.actionType.admin",
25402
+ penalty: "violationAlert.actionType.penalty"
25093
25403
  };
25094
25404
  actionTypeIcons = {
25095
25405
  measure: "alert-triangle",
@@ -25106,10 +25416,11 @@ var init_ViolationAlert = __esm({
25106
25416
  className,
25107
25417
  ...flatProps
25108
25418
  }) => {
25419
+ const { t } = useTranslate();
25109
25420
  const resolvedViolation = violation ?? {
25110
25421
  law: "",
25111
25422
  article: "",
25112
- message: flatProps.message ?? "Violation",
25423
+ message: flatProps.message ?? t("violationAlert.fallbackMessage"),
25113
25424
  actionType: "measure"
25114
25425
  };
25115
25426
  const effectiveSeverity = severity ?? (resolvedViolation.actionType === "measure" ? "warning" : "error");
@@ -25194,7 +25505,7 @@ var init_ViolationAlert = __esm({
25194
25505
  {
25195
25506
  variant: "caption",
25196
25507
  className: cn(textColor, "opacity-75"),
25197
- children: actionTypeLabels[resolvedViolation.actionType]
25508
+ children: t(actionTypeLabelKeys[resolvedViolation.actionType])
25198
25509
  }
25199
25510
  )
25200
25511
  ] })
@@ -25225,7 +25536,7 @@ var init_ViolationAlert = __esm({
25225
25536
  {
25226
25537
  variant: "caption",
25227
25538
  className: cn(textColor, "opacity-75"),
25228
- children: "Admin:"
25539
+ children: t("violationAlert.adminLabel")
25229
25540
  }
25230
25541
  ),
25231
25542
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -25244,7 +25555,7 @@ var init_ViolationAlert = __esm({
25244
25555
  {
25245
25556
  variant: "caption",
25246
25557
  className: cn(textColor, "opacity-75"),
25247
- children: "Penalty:"
25558
+ children: t("violationAlert.penaltyLabel")
25248
25559
  }
25249
25560
  ),
25250
25561
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -25269,7 +25580,7 @@ var init_ViolationAlert = __esm({
25269
25580
  className: cn(textColor, "self-start"),
25270
25581
  children: [
25271
25582
  /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "arrow-right", size: "sm", className: "mr-1" }),
25272
- "Go to field"
25583
+ t("violationAlert.goToField")
25273
25584
  ]
25274
25585
  }
25275
25586
  )
@@ -25585,6 +25896,7 @@ var init_LineChart = __esm({
25585
25896
  "use client";
25586
25897
  init_cn();
25587
25898
  init_atoms2();
25899
+ init_useTranslate();
25588
25900
  exports.LineChart = ({
25589
25901
  data,
25590
25902
  width = 400,
@@ -25596,6 +25908,7 @@ var init_LineChart = __esm({
25596
25908
  areaColor = "var(--color-primary)",
25597
25909
  className
25598
25910
  }) => {
25911
+ const { t } = useTranslate();
25599
25912
  const gradientId = React79.useId();
25600
25913
  const safeData = data ?? [];
25601
25914
  const sortedData = React79.useMemo(() => {
@@ -25632,7 +25945,7 @@ var init_LineChart = __esm({
25632
25945
  return `${linePath} L ${last.x} ${bottom} L ${first.x} ${bottom} Z`;
25633
25946
  }, [linePath, points, height, showArea]);
25634
25947
  if (safeData.length === 0) {
25635
- return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: cn("flex items-center justify-center text-muted-foreground", className), style: { width, height }, children: "No data" });
25948
+ return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: cn("flex items-center justify-center text-muted-foreground", className), style: { width, height }, children: t("empty.noData") });
25636
25949
  }
25637
25950
  return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: cn(className), children: /* @__PURE__ */ jsxRuntime.jsxs(
25638
25951
  "svg",
@@ -27823,6 +28136,7 @@ var init_GraphView = __esm({
27823
28136
  "use client";
27824
28137
  init_cn();
27825
28138
  init_atoms2();
28139
+ init_useTranslate();
27826
28140
  GROUP_COLORS = [
27827
28141
  "#3b82f6",
27828
28142
  // blue-500
@@ -27855,6 +28169,7 @@ var init_GraphView = __esm({
27855
28169
  showLabels = true,
27856
28170
  zoomToFit = true
27857
28171
  }) => {
28172
+ const { t } = useTranslate();
27858
28173
  const containerRef = React79.useRef(null);
27859
28174
  const animRef = React79.useRef(0);
27860
28175
  const [simNodes, setSimNodes] = React79.useState([]);
@@ -28032,7 +28347,7 @@ var init_GraphView = __esm({
28032
28347
  [onNodeClick]
28033
28348
  );
28034
28349
  if (nodes.length === 0) {
28035
- return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: cn("flex items-center justify-center", className), style: { width: w, height: h }, children: /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "text-muted-foreground text-sm", children: "No graph data" }) });
28350
+ return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: cn("flex items-center justify-center", className), style: { width: w, height: h }, children: /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "text-muted-foreground text-sm", children: t("display.noGraphData") }) });
28036
28351
  }
28037
28352
  return /* @__PURE__ */ jsxRuntime.jsx(
28038
28353
  exports.Box,
@@ -28488,11 +28803,12 @@ var init_UploadDropZone = __esm({
28488
28803
  init_Icon();
28489
28804
  init_Typography();
28490
28805
  init_useEventBus();
28806
+ init_useTranslate();
28491
28807
  exports.UploadDropZone = ({
28492
28808
  accept,
28493
28809
  maxSize,
28494
28810
  maxFiles = 1,
28495
- label = "Drop files here or click to browse",
28811
+ label,
28496
28812
  description,
28497
28813
  disabled = false,
28498
28814
  action,
@@ -28500,22 +28816,24 @@ var init_UploadDropZone = __esm({
28500
28816
  onFiles,
28501
28817
  className
28502
28818
  }) => {
28819
+ const { t } = useTranslate();
28820
+ const resolvedLabel = label ?? t("upload.dropOrBrowse");
28503
28821
  const [isDragOver, setIsDragOver] = React79.useState(false);
28504
28822
  const [error, setError] = React79.useState(null);
28505
28823
  const inputRef = React79.useRef(null);
28506
28824
  const eventBus = useSafeEventBus7();
28507
28825
  const defaultDescription = [
28508
- accept ? `Accepted: ${accept}` : null,
28509
- maxSize ? `Max size: ${formatFileSize(maxSize)}` : null,
28510
- maxFiles > 1 ? `Up to ${maxFiles} files` : null
28826
+ accept ? t("upload.accepted", { accept }) : null,
28827
+ maxSize ? t("upload.maxSize", { size: formatFileSize(maxSize) }) : null,
28828
+ maxFiles > 1 ? t("upload.maxFiles", { count: maxFiles }) : null
28511
28829
  ].filter(Boolean).join(". ");
28512
28830
  const validateFiles = React79.useCallback(
28513
28831
  (files) => {
28514
28832
  if (files.length > maxFiles) {
28515
- return { valid: [], error: `Maximum ${maxFiles} file${maxFiles > 1 ? "s" : ""} allowed` };
28833
+ return { valid: [], error: t("upload.error.maxFiles", { count: maxFiles }) };
28516
28834
  }
28517
28835
  if (accept) {
28518
- const acceptedTypes = accept.split(",").map((t) => t.trim());
28836
+ const acceptedTypes = accept.split(",").map((s) => s.trim());
28519
28837
  const invalid = files.filter((file) => {
28520
28838
  return !acceptedTypes.some((type) => {
28521
28839
  if (type.endsWith("/*")) {
@@ -28525,7 +28843,7 @@ var init_UploadDropZone = __esm({
28525
28843
  });
28526
28844
  });
28527
28845
  if (invalid.length > 0) {
28528
- return { valid: [], error: `Invalid file type: ${invalid[0].name}` };
28846
+ return { valid: [], error: t("upload.error.invalidType", { name: invalid[0].name }) };
28529
28847
  }
28530
28848
  }
28531
28849
  if (maxSize) {
@@ -28533,13 +28851,13 @@ var init_UploadDropZone = __esm({
28533
28851
  if (tooLarge.length > 0) {
28534
28852
  return {
28535
28853
  valid: [],
28536
- error: `File too large: ${tooLarge[0].name} (max ${formatFileSize(maxSize)})`
28854
+ error: t("upload.error.tooLarge", { name: tooLarge[0].name, size: formatFileSize(maxSize) })
28537
28855
  };
28538
28856
  }
28539
28857
  }
28540
28858
  return { valid: files, error: null };
28541
28859
  },
28542
- [accept, maxSize, maxFiles]
28860
+ [accept, maxSize, maxFiles, t]
28543
28861
  );
28544
28862
  const handleFiles = React79.useCallback(
28545
28863
  (files) => {
@@ -28610,7 +28928,7 @@ var init_UploadDropZone = __esm({
28610
28928
  handleClick();
28611
28929
  }
28612
28930
  },
28613
- "aria-label": label,
28931
+ "aria-label": resolvedLabel,
28614
28932
  children: [
28615
28933
  /* @__PURE__ */ jsxRuntime.jsx(
28616
28934
  "input",
@@ -28626,7 +28944,7 @@ var init_UploadDropZone = __esm({
28626
28944
  }
28627
28945
  ),
28628
28946
  error ? /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "file-warning", size: "lg", className: "text-error mb-2" }) : /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "upload", size: "lg", className: "text-muted-foreground mb-2" }),
28629
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body1", className: "text-center font-medium mb-1", children: isDragOver ? "Drop files here" : label }),
28947
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body1", className: "text-center font-medium mb-1", children: isDragOver ? t("upload.dropFilesHere") : resolvedLabel }),
28630
28948
  error ? /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", color: "error", className: "text-center", children: error }) : /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", color: "muted", className: "text-center", children: description ?? defaultDescription })
28631
28949
  ]
28632
28950
  }
@@ -29048,7 +29366,7 @@ function TableView({
29048
29366
  {
29049
29367
  checked: selected.has(id),
29050
29368
  onChange: () => toggleRow(id),
29051
- "aria-label": `Select row ${id}`
29369
+ "aria-label": t("table.selectRow", { id })
29052
29370
  }
29053
29371
  ) }),
29054
29372
  hasRenderProp ? /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "flex-1 min-w-0", children: children(row, index) }) : colDefs.map((col) => {
@@ -31895,7 +32213,7 @@ var init_QrScanner = __esm({
31895
32213
  className: "inset-0 flex-col items-center justify-center gap-2 bg-black bg-opacity-80 text-center",
31896
32214
  children: [
31897
32215
  /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "camera", className: "h-8 w-8 text-white", "aria-hidden": "true" }),
31898
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body2", className: "text-white", children: "Camera unavailable" }),
32216
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body2", className: "text-white", children: t("qrScanner.cameraUnavailable") }),
31899
32217
  /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", className: "text-white opacity-70", children: cameraError.message })
31900
32218
  ]
31901
32219
  }
@@ -31906,7 +32224,7 @@ var init_QrScanner = __esm({
31906
32224
  position: "absolute",
31907
32225
  display: "flex",
31908
32226
  className: "inset-0 items-center justify-center bg-black bg-opacity-60",
31909
- children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body2", className: "text-white", children: "Paused" })
32227
+ children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body2", className: "text-white", children: t("qrScanner.paused") })
31910
32228
  }
31911
32229
  ),
31912
32230
  showCameraControls && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -31925,7 +32243,7 @@ var init_QrScanner = __esm({
31925
32243
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
31926
32244
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
31927
32245
  ),
31928
- "aria-label": isPaused ? "Resume scanning" : "Pause scanning",
32246
+ "aria-label": isPaused ? t("qrScanner.resumeScanning") : t("qrScanner.pauseScanning"),
31929
32247
  children: isPaused ? /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "play", className: "h-4 w-4" }) : /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "pause", className: "h-4 w-4" })
31930
32248
  }
31931
32249
  ),
@@ -31938,7 +32256,7 @@ var init_QrScanner = __esm({
31938
32256
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
31939
32257
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
31940
32258
  ),
31941
- "aria-label": `Switch to ${currentFacing === "environment" ? "front" : "rear"} camera`,
32259
+ "aria-label": currentFacing === "environment" ? t("qrScanner.switchToFrontCamera") : t("qrScanner.switchToRearCamera"),
31942
32260
  children: /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "refresh-cw", className: "h-4 w-4" })
31943
32261
  }
31944
32262
  ),
@@ -31952,7 +32270,7 @@ var init_QrScanner = __esm({
31952
32270
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
31953
32271
  ),
31954
32272
  "aria-label": t("aria.mockScanDev"),
31955
- children: "Mock Scan"
32273
+ children: t("qrScanner.mockScan")
31956
32274
  }
31957
32275
  )
31958
32276
  ]
@@ -31970,6 +32288,7 @@ var init_OptionConstraintGroup = __esm({
31970
32288
  "components/core/molecules/OptionConstraintGroup.tsx"() {
31971
32289
  init_cn();
31972
32290
  init_useEventBus();
32291
+ init_useTranslate();
31973
32292
  init_Typography();
31974
32293
  init_Box();
31975
32294
  init_Label();
@@ -31979,36 +32298,36 @@ var init_OptionConstraintGroup = __esm({
31979
32298
  const sign = delta >= 0 ? "+" : "-";
31980
32299
  return `${sign}$${Math.abs(delta).toFixed(2)}`;
31981
32300
  };
31982
- constraintHint = (constraint) => {
32301
+ constraintHint = (constraint, t) => {
31983
32302
  if (constraint.type === "single") {
31984
- return constraint.required ? "Required, pick 1" : "Optional, pick up to 1";
32303
+ return constraint.required ? t("optionConstraint.requiredOne") : t("optionConstraint.optionalOne");
31985
32304
  }
31986
32305
  const { min, max } = constraint;
31987
32306
  if (min && max) {
31988
- return min === max ? `Pick exactly ${min}` : `Pick ${min}-${max}`;
32307
+ return min === max ? t("optionConstraint.pickExactly", { count: min }) : t("optionConstraint.pickRange", { min, max });
31989
32308
  }
31990
- if (min) return `Pick at least ${min}`;
31991
- if (max) return `Pick up to ${max}`;
31992
- return "Optional";
32309
+ if (min) return t("optionConstraint.pickAtLeast", { count: min });
32310
+ if (max) return t("optionConstraint.pickUpTo", { count: max });
32311
+ return t("optionConstraint.optional");
31993
32312
  };
31994
- validateSelection = (selected, constraint) => {
32313
+ validateSelection = (selected, constraint, t) => {
31995
32314
  if (constraint.type === "single") {
31996
32315
  if (constraint.required && selected.length === 0) {
31997
- return "Pick 1 option";
32316
+ return t("optionConstraint.error.pickOne");
31998
32317
  }
31999
32318
  if (selected.length > 1) {
32000
- return "Pick only 1 option";
32319
+ return t("optionConstraint.error.pickOnlyOne");
32001
32320
  }
32002
32321
  return void 0;
32003
32322
  }
32004
32323
  const { min, max } = constraint;
32005
32324
  if (min !== void 0 && selected.length < min) {
32006
32325
  const remaining = min - selected.length;
32007
- return `Pick at least ${remaining} more`;
32326
+ return t("optionConstraint.error.pickMore", { count: remaining });
32008
32327
  }
32009
32328
  if (max !== void 0 && selected.length > max) {
32010
32329
  const excess = selected.length - max;
32011
- return `Remove ${excess} option${excess === 1 ? "" : "s"}`;
32330
+ return t("optionConstraint.error.removeOptions", { count: excess });
32012
32331
  }
32013
32332
  return void 0;
32014
32333
  };
@@ -32025,8 +32344,9 @@ var init_OptionConstraintGroup = __esm({
32025
32344
  className
32026
32345
  }) => {
32027
32346
  const eventBus = useEventBus();
32028
- const hint = constraintHint(constraint);
32029
- const error = validateSelection(selected, constraint);
32347
+ const { t } = useTranslate();
32348
+ const hint = constraintHint(constraint, t);
32349
+ const error = validateSelection(selected, constraint, t);
32030
32350
  const inputName = `option-${groupId}`;
32031
32351
  const labelTextSize = size === "sm" ? "text-sm" : "text-base";
32032
32352
  const optionGap = size === "sm" ? "gap-2" : "gap-2.5";
@@ -32126,7 +32446,7 @@ var init_OptionConstraintGroup = __esm({
32126
32446
  variant: "caption",
32127
32447
  color: "warning",
32128
32448
  className: "rounded border border-warning/40 px-1.5 py-0.5",
32129
- children: "Out of stock"
32449
+ children: t("optionConstraint.outOfStock")
32130
32450
  }
32131
32451
  )
32132
32452
  ]
@@ -32448,6 +32768,7 @@ function changeBlockType(block, type) {
32448
32768
  return { id: block.id, type, content: seed };
32449
32769
  }
32450
32770
  function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32771
+ const { t } = useTranslate();
32451
32772
  const [open, setOpen] = React79.useState(false);
32452
32773
  const ref = React79.useRef(null);
32453
32774
  React79.useEffect(() => {
@@ -32467,7 +32788,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32467
32788
  {
32468
32789
  type: "button",
32469
32790
  variant: "ghost",
32470
- "aria-label": "Block actions",
32791
+ "aria-label": t("richBlockEditor.blockActions"),
32471
32792
  className: cn(
32472
32793
  "inline-flex items-center justify-center",
32473
32794
  "h-6 w-6 rounded-sm p-0 gap-0",
@@ -32489,7 +32810,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32489
32810
  "py-1 text-sm"
32490
32811
  ),
32491
32812
  children: [
32492
- /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: BLOCK_TYPE_LABEL[block.type] }),
32813
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: t(BLOCK_TYPE_LABEL_KEY[block.type]) }),
32493
32814
  /* @__PURE__ */ jsxRuntime.jsxs(
32494
32815
  exports.Button,
32495
32816
  {
@@ -32503,7 +32824,8 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32503
32824
  },
32504
32825
  children: [
32505
32826
  /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "plus", className: "w-3.5 h-3.5" }),
32506
- " Duplicate"
32827
+ " ",
32828
+ t("richBlockEditor.duplicate")
32507
32829
  ]
32508
32830
  }
32509
32831
  ),
@@ -32520,14 +32842,15 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32520
32842
  },
32521
32843
  children: [
32522
32844
  /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "trash", className: "w-3.5 h-3.5" }),
32523
- " Delete"
32845
+ " ",
32846
+ t("common.delete")
32524
32847
  ]
32525
32848
  }
32526
32849
  ),
32527
32850
  CHANGEABLE_TYPES.includes(block.type) && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
32528
32851
  /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "my-1 border-t border-border" }),
32529
- /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: "Turn into" }),
32530
- CHANGEABLE_TYPES.filter((t) => t !== block.type).map((t) => /* @__PURE__ */ jsxRuntime.jsx(
32852
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: t("richBlockEditor.turnInto") }),
32853
+ CHANGEABLE_TYPES.filter((bt) => bt !== block.type).map((bt) => /* @__PURE__ */ jsxRuntime.jsx(
32531
32854
  exports.Button,
32532
32855
  {
32533
32856
  type: "button",
@@ -32535,12 +32858,12 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32535
32858
  role: "menuitem",
32536
32859
  className: "flex w-full items-center gap-2 px-2 py-1.5 text-left justify-start rounded-none",
32537
32860
  onClick: () => {
32538
- onChangeType(t);
32861
+ onChangeType(bt);
32539
32862
  setOpen(false);
32540
32863
  },
32541
- children: BLOCK_TYPE_LABEL[t]
32864
+ children: t(BLOCK_TYPE_LABEL_KEY[bt])
32542
32865
  },
32543
- t
32866
+ bt
32544
32867
  ))
32545
32868
  ] })
32546
32869
  ]
@@ -32602,6 +32925,7 @@ function BlockRow({
32602
32925
  onInsertAfter,
32603
32926
  onChangeType
32604
32927
  }) {
32928
+ const { t } = useTranslate();
32605
32929
  const setContent = React79.useCallback(
32606
32930
  (next) => onUpdate((b) => ({ ...b, content: next })),
32607
32931
  [onUpdate]
@@ -32651,8 +32975,8 @@ function BlockRow({
32651
32975
  tag: "h1",
32652
32976
  value: block.content ?? "",
32653
32977
  readOnly,
32654
- placeholder: placeholder ?? "Heading 1",
32655
- ariaLabel: "Heading 1 block",
32978
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading1"),
32979
+ ariaLabel: t("richBlockEditor.aria.heading1Block"),
32656
32980
  className: "text-3xl font-bold leading-tight",
32657
32981
  onValueChange: setContent
32658
32982
  }
@@ -32664,8 +32988,8 @@ function BlockRow({
32664
32988
  tag: "h2",
32665
32989
  value: block.content ?? "",
32666
32990
  readOnly,
32667
- placeholder: placeholder ?? "Heading 2",
32668
- ariaLabel: "Heading 2 block",
32991
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading2"),
32992
+ ariaLabel: t("richBlockEditor.aria.heading2Block"),
32669
32993
  className: "text-2xl font-semibold leading-tight",
32670
32994
  onValueChange: setContent
32671
32995
  }
@@ -32677,8 +33001,8 @@ function BlockRow({
32677
33001
  tag: "h3",
32678
33002
  value: block.content ?? "",
32679
33003
  readOnly,
32680
- placeholder: placeholder ?? "Heading 3",
32681
- ariaLabel: "Heading 3 block",
33004
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading3"),
33005
+ ariaLabel: t("richBlockEditor.aria.heading3Block"),
32682
33006
  className: "text-xl font-semibold leading-tight",
32683
33007
  onValueChange: setContent
32684
33008
  }
@@ -32690,8 +33014,8 @@ function BlockRow({
32690
33014
  tag: "blockquote",
32691
33015
  value: block.content ?? "",
32692
33016
  readOnly,
32693
- placeholder: placeholder ?? "Quote",
32694
- ariaLabel: "Quote block",
33017
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.quote"),
33018
+ ariaLabel: t("richBlockEditor.aria.quoteBlock"),
32695
33019
  className: "border-l-4 border-primary/60 pl-4 italic text-muted-foreground",
32696
33020
  onValueChange: setContent
32697
33021
  }
@@ -32699,13 +33023,13 @@ function BlockRow({
32699
33023
  case "code":
32700
33024
  return /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "rounded-md border border-border bg-muted/40", children: [
32701
33025
  /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "flex items-center justify-between border-b border-border px-3 py-1 text-xs text-muted-foreground", children: [
32702
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { as: "span", variant: "caption", className: "uppercase tracking-wide", children: "Code" }),
33026
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { as: "span", variant: "caption", className: "uppercase tracking-wide", children: t("richBlockEditor.blockType.code") }),
32703
33027
  !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
32704
33028
  exports.Input,
32705
33029
  {
32706
33030
  inputType: "text",
32707
33031
  value: String(block.metadata?.language ?? "plaintext"),
32708
- "aria-label": "Code language",
33032
+ "aria-label": t("richBlockEditor.aria.codeLanguage"),
32709
33033
  className: cn(
32710
33034
  "h-6 w-32 rounded-sm border border-border bg-background",
32711
33035
  "px-2 text-xs outline-none focus:ring-1 focus:ring-ring"
@@ -32721,8 +33045,8 @@ function BlockRow({
32721
33045
  tag: "pre",
32722
33046
  value: block.content ?? "",
32723
33047
  readOnly,
32724
- placeholder: placeholder ?? "Enter code",
32725
- ariaLabel: "Code block",
33048
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.code"),
33049
+ ariaLabel: t("richBlockEditor.aria.codeBlock"),
32726
33050
  className: "block whitespace-pre-wrap p-3 font-mono text-sm leading-relaxed",
32727
33051
  onValueChange: setContent
32728
33052
  }
@@ -32735,7 +33059,7 @@ function BlockRow({
32735
33059
  const caption = String(block.metadata?.caption ?? "");
32736
33060
  const imgProps = {
32737
33061
  src: url,
32738
- alt: caption || "Embedded image",
33062
+ alt: caption || t("richBlockEditor.embeddedImage"),
32739
33063
  className: "max-h-96 w-full rounded-md border border-border object-contain"
32740
33064
  };
32741
33065
  return /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "space-y-2", children: [
@@ -32749,7 +33073,8 @@ function BlockRow({
32749
33073
  ),
32750
33074
  children: [
32751
33075
  /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "image", className: "mr-2 w-4 h-4" }),
32752
- " No image URL set"
33076
+ " ",
33077
+ t("richBlockEditor.noImageUrl")
32753
33078
  ]
32754
33079
  }
32755
33080
  ),
@@ -32760,7 +33085,7 @@ function BlockRow({
32760
33085
  inputType: "url",
32761
33086
  value: url,
32762
33087
  placeholder: "https://example.com/image.png",
32763
- "aria-label": "Image URL",
33088
+ "aria-label": t("richBlockEditor.aria.imageUrl"),
32764
33089
  className: cn(
32765
33090
  "h-8 flex-1 rounded-sm border border-border bg-background",
32766
33091
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -32773,8 +33098,8 @@ function BlockRow({
32773
33098
  {
32774
33099
  inputType: "text",
32775
33100
  value: caption,
32776
- placeholder: "Caption (optional)",
32777
- "aria-label": "Image caption",
33101
+ placeholder: t("richBlockEditor.placeholder.caption"),
33102
+ "aria-label": t("richBlockEditor.aria.imageCaption"),
32778
33103
  className: cn(
32779
33104
  "h-8 flex-1 rounded-sm border border-border bg-background",
32780
33105
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -32805,8 +33130,8 @@ function BlockRow({
32805
33130
  tag: "span",
32806
33131
  value: child.content ?? "",
32807
33132
  readOnly,
32808
- placeholder: "List item",
32809
- ariaLabel: "List item",
33133
+ placeholder: t("richBlockEditor.placeholder.listItem"),
33134
+ ariaLabel: t("richBlockEditor.aria.listItem"),
32810
33135
  className: "inline-block min-w-[1ch] flex-1",
32811
33136
  onValueChange: (next) => setChildContent(child.id, next)
32812
33137
  }
@@ -32816,7 +33141,7 @@ function BlockRow({
32816
33141
  {
32817
33142
  type: "button",
32818
33143
  variant: "ghost",
32819
- "aria-label": "Remove list item",
33144
+ "aria-label": t("richBlockEditor.aria.removeListItem"),
32820
33145
  className: cn(
32821
33146
  "h-5 w-5 shrink-0 rounded-sm text-muted-foreground p-0 gap-0",
32822
33147
  "opacity-0 group-hover/item:opacity-100 hover:bg-muted hover:text-foreground"
@@ -32838,7 +33163,8 @@ function BlockRow({
32838
33163
  onClick: addListItem,
32839
33164
  children: [
32840
33165
  /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "plus", className: "w-3 h-3" }),
32841
- " Add item"
33166
+ " ",
33167
+ t("richBlockEditor.addItem")
32842
33168
  ]
32843
33169
  }
32844
33170
  ) })
@@ -32854,8 +33180,8 @@ function BlockRow({
32854
33180
  tag: "p",
32855
33181
  value: block.content ?? "",
32856
33182
  readOnly,
32857
- placeholder: placeholder ?? "Start writing...",
32858
- ariaLabel: "Paragraph block",
33183
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.paragraph"),
33184
+ ariaLabel: t("richBlockEditor.aria.paragraphBlock"),
32859
33185
  className: "leading-7",
32860
33186
  onValueChange: setContent
32861
33187
  }
@@ -32878,7 +33204,7 @@ function BlockRow({
32878
33204
  {
32879
33205
  type: "button",
32880
33206
  variant: "ghost",
32881
- "aria-label": "Insert paragraph below",
33207
+ "aria-label": t("richBlockEditor.insertParagraphBelow"),
32882
33208
  className: cn(
32883
33209
  "inline-flex h-6 w-6 items-center justify-center rounded-sm p-0 gap-0",
32884
33210
  "text-muted-foreground hover:bg-muted hover:text-foreground",
@@ -32905,7 +33231,7 @@ function BlockRow({
32905
33231
  }
32906
33232
  );
32907
33233
  }
32908
- var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES; exports.RichBlockEditor = void 0;
33234
+ var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL_KEY, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES; exports.RichBlockEditor = void 0;
32909
33235
  var init_RichBlockEditor = __esm({
32910
33236
  "components/core/molecules/RichBlockEditor.tsx"() {
32911
33237
  "use client";
@@ -32918,29 +33244,30 @@ var init_RichBlockEditor = __esm({
32918
33244
  init_Input();
32919
33245
  init_Icon();
32920
33246
  init_useEventBus();
33247
+ init_useTranslate();
32921
33248
  TOOLBAR_ENTRIES = [
32922
- { type: "paragraph", label: "Text", icon: LucideIcons2.Type },
32923
- { type: "heading-1", label: "H1", icon: LucideIcons2.Heading1 },
32924
- { type: "heading-2", label: "H2", icon: LucideIcons2.Heading2 },
32925
- { type: "heading-3", label: "H3", icon: LucideIcons2.Heading3 },
32926
- { type: "bullet-list", label: "Bullet list", icon: LucideIcons2.List },
32927
- { type: "numbered-list", label: "Numbered", icon: LucideIcons2.ListOrdered },
32928
- { type: "quote", label: "Quote", icon: LucideIcons2.Quote },
32929
- { type: "code", label: "Code", icon: LucideIcons2.Code },
32930
- { type: "divider", label: "Divider", icon: LucideIcons2.Minus },
32931
- { type: "image", label: "Image", icon: LucideIcons2.Image }
33249
+ { type: "paragraph", labelKey: "richBlockEditor.toolbar.text", icon: LucideIcons2.Type },
33250
+ { type: "heading-1", labelKey: "richBlockEditor.toolbar.h1", icon: LucideIcons2.Heading1 },
33251
+ { type: "heading-2", labelKey: "richBlockEditor.toolbar.h2", icon: LucideIcons2.Heading2 },
33252
+ { type: "heading-3", labelKey: "richBlockEditor.toolbar.h3", icon: LucideIcons2.Heading3 },
33253
+ { type: "bullet-list", labelKey: "richBlockEditor.toolbar.bulletList", icon: LucideIcons2.List },
33254
+ { type: "numbered-list", labelKey: "richBlockEditor.toolbar.numbered", icon: LucideIcons2.ListOrdered },
33255
+ { type: "quote", labelKey: "richBlockEditor.toolbar.quote", icon: LucideIcons2.Quote },
33256
+ { type: "code", labelKey: "richBlockEditor.toolbar.code", icon: LucideIcons2.Code },
33257
+ { type: "divider", labelKey: "richBlockEditor.toolbar.divider", icon: LucideIcons2.Minus },
33258
+ { type: "image", labelKey: "richBlockEditor.toolbar.image", icon: LucideIcons2.Image }
32932
33259
  ];
32933
- BLOCK_TYPE_LABEL = {
32934
- paragraph: "Text",
32935
- "heading-1": "Heading 1",
32936
- "heading-2": "Heading 2",
32937
- "heading-3": "Heading 3",
32938
- "bullet-list": "Bullet list",
32939
- "numbered-list": "Numbered list",
32940
- quote: "Quote",
32941
- code: "Code",
32942
- divider: "Divider",
32943
- image: "Image"
33260
+ BLOCK_TYPE_LABEL_KEY = {
33261
+ paragraph: "richBlockEditor.blockType.paragraph",
33262
+ "heading-1": "richBlockEditor.blockType.heading1",
33263
+ "heading-2": "richBlockEditor.blockType.heading2",
33264
+ "heading-3": "richBlockEditor.blockType.heading3",
33265
+ "bullet-list": "richBlockEditor.blockType.bulletList",
33266
+ "numbered-list": "richBlockEditor.blockType.numberedList",
33267
+ quote: "richBlockEditor.blockType.quote",
33268
+ code: "richBlockEditor.blockType.code",
33269
+ divider: "richBlockEditor.blockType.divider",
33270
+ image: "richBlockEditor.blockType.image"
32944
33271
  };
32945
33272
  CHANGEABLE_TYPES = [
32946
33273
  "paragraph",
@@ -32974,6 +33301,7 @@ var init_RichBlockEditor = __esm({
32974
33301
  showToolbar = true,
32975
33302
  className
32976
33303
  }) => {
33304
+ const { t } = useTranslate();
32977
33305
  const [blocks, setBlocks] = React79.useState(
32978
33306
  () => normalizeBlocks(initialBlocks)
32979
33307
  );
@@ -33045,25 +33373,26 @@ var init_RichBlockEditor = __esm({
33045
33373
  exports.Box,
33046
33374
  {
33047
33375
  role: "toolbar",
33048
- "aria-label": "Block editor toolbar",
33376
+ "aria-label": t("richBlockEditor.editorToolbar"),
33049
33377
  className: cn(
33050
33378
  "flex flex-wrap items-center gap-1",
33051
33379
  "border-b border-border bg-muted/30 px-2 py-2"
33052
33380
  ),
33053
33381
  children: TOOLBAR_ENTRIES.map((entry) => {
33054
33382
  const Icon3 = entry.icon;
33383
+ const entryLabel = t(entry.labelKey);
33055
33384
  return /* @__PURE__ */ jsxRuntime.jsxs(
33056
33385
  exports.Button,
33057
33386
  {
33058
33387
  type: "button",
33059
33388
  variant: "ghost",
33060
33389
  size: "sm",
33061
- "aria-label": `Insert ${entry.label}`,
33062
- title: entry.label,
33390
+ "aria-label": t("richBlockEditor.insertEntry", { label: entryLabel }),
33391
+ title: entryLabel,
33063
33392
  onClick: () => handleAppend(entry.type),
33064
33393
  children: [
33065
33394
  /* @__PURE__ */ jsxRuntime.jsx(Icon3, { size: 14 }),
33066
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { as: "span", variant: "caption", className: "ml-1 hidden text-xs sm:inline", children: entry.label })
33395
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { as: "span", variant: "caption", className: "ml-1 hidden text-xs sm:inline", children: entryLabel })
33067
33396
  ]
33068
33397
  },
33069
33398
  entry.type
@@ -33106,6 +33435,7 @@ var init_ReplyTree = __esm({
33106
33435
  "use client";
33107
33436
  init_cn();
33108
33437
  init_useEventBus();
33438
+ init_useTranslate();
33109
33439
  init_atoms2();
33110
33440
  init_VoteStack();
33111
33441
  ReplyTreeNode = ({
@@ -33125,6 +33455,7 @@ var init_ReplyTree = __esm({
33125
33455
  showActions
33126
33456
  }) => {
33127
33457
  const eventBus = useEventBus();
33458
+ const { t } = useTranslate();
33128
33459
  const hasReplies = !!node.replies && node.replies.length > 0;
33129
33460
  const isCollapsed = collapsedSet.has(node.id);
33130
33461
  const atMaxDepth = depth >= maxDepth;
@@ -33171,7 +33502,7 @@ var init_ReplyTree = __esm({
33171
33502
  variant: "ghost",
33172
33503
  size: "sm",
33173
33504
  onClick: handleToggle,
33174
- "aria-label": isCollapsed ? "Expand replies" : "Collapse replies",
33505
+ "aria-label": isCollapsed ? t("replyTree.expandReplies") : t("replyTree.collapseReplies"),
33175
33506
  "aria-expanded": !isCollapsed,
33176
33507
  leftIcon: isCollapsed ? "chevron-right" : "chevron-down",
33177
33508
  className: cn(
@@ -33212,7 +33543,7 @@ var init_ReplyTree = __esm({
33212
33543
  onVote: handleVote,
33213
33544
  size: "sm",
33214
33545
  variant: "horizontal",
33215
- label: `Vote on reply by ${node.authorName}`
33546
+ label: t("replyTree.voteOnReplyBy", { author: node.authorName })
33216
33547
  }
33217
33548
  ),
33218
33549
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -33222,8 +33553,8 @@ var init_ReplyTree = __esm({
33222
33553
  size: "sm",
33223
33554
  leftIcon: "message-square",
33224
33555
  onClick: handleReply,
33225
- "aria-label": `Reply to ${node.authorName}`,
33226
- children: "Reply"
33556
+ "aria-label": t("replyTree.replyTo", { author: node.authorName }),
33557
+ children: t("replyTree.reply")
33227
33558
  }
33228
33559
  ),
33229
33560
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -33233,8 +33564,8 @@ var init_ReplyTree = __esm({
33233
33564
  size: "sm",
33234
33565
  leftIcon: "flag",
33235
33566
  onClick: handleFlag,
33236
- "aria-label": `Flag reply by ${node.authorName}`,
33237
- children: "Flag"
33567
+ "aria-label": t("replyTree.flagReplyBy", { author: node.authorName }),
33568
+ children: t("replyTree.flag")
33238
33569
  }
33239
33570
  )
33240
33571
  ] }),
@@ -33245,9 +33576,9 @@ var init_ReplyTree = __esm({
33245
33576
  inputType: "textarea",
33246
33577
  rows: 2,
33247
33578
  value: draft,
33248
- placeholder: `Reply to ${node.authorName}\u2026`,
33579
+ placeholder: t("replyTree.replyToPlaceholder", { author: node.authorName }),
33249
33580
  onChange: (e) => setDraft(e.target.value),
33250
- "aria-label": `Reply to ${node.authorName}`
33581
+ "aria-label": t("replyTree.replyTo", { author: node.authorName })
33251
33582
  }
33252
33583
  ),
33253
33584
  /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "flex flex-row gap-2 items-center", children: [
@@ -33259,10 +33590,10 @@ var init_ReplyTree = __esm({
33259
33590
  leftIcon: "send",
33260
33591
  onClick: handleSubmitReply,
33261
33592
  disabled: !draft.trim(),
33262
- children: "Send"
33593
+ children: t("replyTree.send")
33263
33594
  }
33264
33595
  ),
33265
- /* @__PURE__ */ jsxRuntime.jsx(exports.Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: "Cancel" })
33596
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: t("common.cancel") })
33266
33597
  ] })
33267
33598
  ] }),
33268
33599
  hasReplies && !isCollapsed && (atMaxDepth ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -33276,7 +33607,7 @@ var init_ReplyTree = __esm({
33276
33607
  "self-start gap-1 px-0 h-auto",
33277
33608
  "text-sm text-primary hover:underline hover:bg-transparent"
33278
33609
  ),
33279
- children: "Continue thread"
33610
+ children: t("replyTree.continueThread")
33280
33611
  }
33281
33612
  ) : /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "flex flex-col gap-2 mt-1", children: node.replies.map((child) => /* @__PURE__ */ jsxRuntime.jsx(
33282
33613
  ReplyTreeNode,
@@ -33315,6 +33646,7 @@ var init_ReplyTree = __esm({
33315
33646
  showActions = true,
33316
33647
  className
33317
33648
  }) => {
33649
+ const { t } = useTranslate();
33318
33650
  const nodeList = Array.isArray(nodes) ? nodes : nodes ? [nodes] : [];
33319
33651
  const [collapsedSet, setCollapsedSet] = React79.useState(() => {
33320
33652
  const acc = /* @__PURE__ */ new Set();
@@ -33333,7 +33665,7 @@ var init_ReplyTree = __esm({
33333
33665
  });
33334
33666
  }, []);
33335
33667
  if (nodeList.length === 0) {
33336
- return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: cn("text-sm text-muted-foreground", className), children: "No replies yet." });
33668
+ return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: cn("text-sm text-muted-foreground", className), children: t("replyTree.noRepliesYet") });
33337
33669
  }
33338
33670
  return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: cn("flex flex-col gap-2 min-w-0", className), children: nodeList.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
33339
33671
  ReplyTreeNode,
@@ -33411,6 +33743,7 @@ var init_VersionDiff = __esm({
33411
33743
  "use client";
33412
33744
  init_cn();
33413
33745
  init_useEventBus();
33746
+ init_useTranslate();
33414
33747
  init_atoms2();
33415
33748
  init_Stack();
33416
33749
  INLINE_STYLES = {
@@ -33433,6 +33766,7 @@ var init_VersionDiff = __esm({
33433
33766
  language,
33434
33767
  className
33435
33768
  }) => {
33769
+ const { t } = useTranslate();
33436
33770
  const eventBus = useEventBus();
33437
33771
  const revisions = Array.isArray(revisionsProp) ? revisionsProp : [];
33438
33772
  const fallbackBefore = revisions[0]?.id ?? "";
@@ -33514,24 +33848,24 @@ var init_VersionDiff = __esm({
33514
33848
  children: [
33515
33849
  /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "sm", align: "center", className: "flex-wrap", children: [
33516
33850
  /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "git-commit", size: "sm", className: "text-muted-foreground" }),
33517
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "whitespace-nowrap", children: "Compare" }),
33851
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "whitespace-nowrap", children: t("versionDiff.compare") }),
33518
33852
  /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsxRuntime.jsx(
33519
33853
  exports.Select,
33520
33854
  {
33521
33855
  options,
33522
33856
  value: activeBeforeId,
33523
33857
  onChange: handleBeforeChange,
33524
- "aria-label": "Before revision"
33858
+ "aria-label": t("versionDiff.beforeRevision")
33525
33859
  }
33526
33860
  ) }),
33527
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", color: "secondary", children: "to" }),
33861
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", color: "secondary", children: t("versionDiff.to") }),
33528
33862
  /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsxRuntime.jsx(
33529
33863
  exports.Select,
33530
33864
  {
33531
33865
  options,
33532
33866
  value: activeAfterId,
33533
33867
  onChange: handleAfterChange,
33534
- "aria-label": "After revision"
33868
+ "aria-label": t("versionDiff.afterRevision")
33535
33869
  }
33536
33870
  ) }),
33537
33871
  language && /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "default", children: language }),
@@ -33552,7 +33886,7 @@ var init_VersionDiff = __esm({
33552
33886
  size: "sm",
33553
33887
  icon: activeView === "side-by-side" ? "align-left" : "columns",
33554
33888
  onClick: handleViewToggle,
33555
- "aria-label": activeView === "side-by-side" ? "Switch to inline view" : "Switch to side-by-side view"
33889
+ "aria-label": activeView === "side-by-side" ? t("versionDiff.switchToInline") : t("versionDiff.switchToSideBySide")
33556
33890
  }
33557
33891
  ),
33558
33892
  (onRevert || revertEvent) && /* @__PURE__ */ jsxRuntime.jsx(
@@ -33562,7 +33896,7 @@ var init_VersionDiff = __esm({
33562
33896
  size: "sm",
33563
33897
  icon: "rotate-ccw",
33564
33898
  onClick: handleRevert,
33565
- children: "Revert"
33899
+ children: t("versionDiff.revert")
33566
33900
  }
33567
33901
  )
33568
33902
  ] })
@@ -33579,12 +33913,12 @@ var init_VersionDiff = __esm({
33579
33913
  children: [
33580
33914
  /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
33581
33915
  beforeRev?.label,
33582
- beforeRev?.author ? ` by ${beforeRev.author}` : "",
33916
+ beforeRev?.author ? t("versionDiff.byAuthor", { author: beforeRev.author }) : "",
33583
33917
  beforeRev?.timestamp ? ` (${beforeRev.timestamp})` : ""
33584
33918
  ] }),
33585
33919
  /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
33586
33920
  afterRev?.label,
33587
- afterRev?.author ? ` by ${afterRev.author}` : "",
33921
+ afterRev?.author ? t("versionDiff.byAuthor", { author: afterRev.author }) : "",
33588
33922
  afterRev?.timestamp ? ` (${afterRev.timestamp})` : ""
33589
33923
  ] })
33590
33924
  ]
@@ -33977,10 +34311,12 @@ var init_DocPagination = __esm({
33977
34311
  }
33978
34312
  });
33979
34313
  function DocSearch({
33980
- placeholder = "Search documentation...",
34314
+ placeholder,
33981
34315
  onSearch,
33982
34316
  className
33983
34317
  }) {
34318
+ const { t } = useTranslate();
34319
+ const resolvedPlaceholder = placeholder ?? t("docSearch.placeholder");
33984
34320
  const [query, setQuery] = React79.useState("");
33985
34321
  const [results, setResults] = React79.useState([]);
33986
34322
  const [isOpen, setIsOpen] = React79.useState(false);
@@ -34087,7 +34423,7 @@ function DocSearch({
34087
34423
  exports.Input,
34088
34424
  {
34089
34425
  inputType: "search",
34090
- placeholder,
34426
+ placeholder: resolvedPlaceholder,
34091
34427
  value: query,
34092
34428
  onChange: handleChange,
34093
34429
  onFocus: handleFocus,
@@ -34152,6 +34488,7 @@ var init_DocSearch = __esm({
34152
34488
  init_Typography();
34153
34489
  init_Icon();
34154
34490
  init_Input();
34491
+ init_useTranslate();
34155
34492
  }
34156
34493
  });
34157
34494
  var DocSidebarCategory; exports.DocSidebar = void 0;
@@ -36284,8 +36621,8 @@ var init_SignaturePad = __esm({
36284
36621
  init_useEventBus();
36285
36622
  init_useTranslate();
36286
36623
  exports.SignaturePad = ({
36287
- label = "Signature",
36288
- helperText = "Draw your signature above",
36624
+ label,
36625
+ helperText,
36289
36626
  strokeColor,
36290
36627
  strokeWidth = 2,
36291
36628
  height = 200,
@@ -36301,6 +36638,8 @@ var init_SignaturePad = __esm({
36301
36638
  }) => {
36302
36639
  const eventBus = useEventBus();
36303
36640
  const { t } = useTranslate();
36641
+ const resolvedLabel = label ?? t("signaturePad.label");
36642
+ const resolvedHelperText = helperText ?? t("signaturePad.helperText");
36304
36643
  const canvasRef = React79.useRef(null);
36305
36644
  const [isDrawing, setIsDrawing] = React79.useState(false);
36306
36645
  const [hasSignature, setHasSignature] = React79.useState(!!value);
@@ -36403,7 +36742,7 @@ var init_SignaturePad = __esm({
36403
36742
  );
36404
36743
  }
36405
36744
  return /* @__PURE__ */ jsxRuntime.jsx(exports.Card, { className: cn("p-4", className), children: /* @__PURE__ */ jsxRuntime.jsxs(exports.VStack, { gap: "sm", children: [
36406
- label && /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "label", weight: "medium", children: label }),
36745
+ resolvedLabel && /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "label", weight: "medium", children: resolvedLabel }),
36407
36746
  /* @__PURE__ */ jsxRuntime.jsx(
36408
36747
  exports.Box,
36409
36748
  {
@@ -36432,7 +36771,7 @@ var init_SignaturePad = __esm({
36432
36771
  )
36433
36772
  }
36434
36773
  ),
36435
- helperText && /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", color: "secondary", children: helperText }),
36774
+ resolvedHelperText && /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", color: "secondary", children: resolvedHelperText }),
36436
36775
  !readOnly && /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "sm", justify: "end", children: [
36437
36776
  /* @__PURE__ */ jsxRuntime.jsx(
36438
36777
  exports.Button,
@@ -36442,7 +36781,7 @@ var init_SignaturePad = __esm({
36442
36781
  icon: LucideIcons2.Eraser,
36443
36782
  onClick: clearSignature,
36444
36783
  disabled: !hasSignature,
36445
- children: "Clear"
36784
+ children: t("signaturePad.clear")
36446
36785
  }
36447
36786
  ),
36448
36787
  signEvent && /* @__PURE__ */ jsxRuntime.jsx(
@@ -36453,7 +36792,7 @@ var init_SignaturePad = __esm({
36453
36792
  icon: LucideIcons2.Check,
36454
36793
  onClick: confirmSignature,
36455
36794
  disabled: !hasSignature,
36456
- children: "Confirm"
36795
+ children: t("signaturePad.confirm")
36457
36796
  }
36458
36797
  )
36459
36798
  ] })
@@ -41120,6 +41459,7 @@ function MasterDetail({
41120
41459
  className,
41121
41460
  ...rest
41122
41461
  }) {
41462
+ const { t } = useTranslate();
41123
41463
  const loading = externalLoading ?? false;
41124
41464
  const isLoading = externalIsLoading ?? false;
41125
41465
  const error = externalError ?? null;
@@ -41132,8 +41472,8 @@ function MasterDetail({
41132
41472
  isLoading: loading || isLoading,
41133
41473
  error,
41134
41474
  className,
41135
- emptyTitle: "No items found",
41136
- emptyDescription: "Create your first item to get started.",
41475
+ emptyTitle: t("table.empty.title"),
41476
+ emptyDescription: t("empty.createFirst"),
41137
41477
  ...rest
41138
41478
  }
41139
41479
  );
@@ -41142,6 +41482,7 @@ var init_MasterDetail = __esm({
41142
41482
  "components/core/organisms/MasterDetail.tsx"() {
41143
41483
  "use client";
41144
41484
  init_DataTable();
41485
+ init_useTranslate();
41145
41486
  MasterDetail.displayName = "MasterDetail";
41146
41487
  }
41147
41488
  });
@@ -41150,14 +41491,18 @@ var init_MasterDetailLayout = __esm({
41150
41491
  "components/core/organisms/layout/MasterDetailLayout.tsx"() {
41151
41492
  init_cn();
41152
41493
  init_Typography();
41153
- DefaultEmptyDetail = () => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsxRuntime.jsx(
41154
- exports.Typography,
41155
- {
41156
- variant: "body2",
41157
- className: "text-muted-foreground",
41158
- children: "Select an item to view details"
41159
- }
41160
- ) });
41494
+ init_useTranslate();
41495
+ DefaultEmptyDetail = () => {
41496
+ const { t } = useTranslate();
41497
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsxRuntime.jsx(
41498
+ exports.Typography,
41499
+ {
41500
+ variant: "body2",
41501
+ className: "text-muted-foreground",
41502
+ children: t("masterDetail.selectItem")
41503
+ }
41504
+ ) });
41505
+ };
41161
41506
  exports.MasterDetailLayout = ({
41162
41507
  master,
41163
41508
  detail,
@@ -41284,7 +41629,7 @@ var init_MediaGallery = __esm({
41284
41629
  {
41285
41630
  icon: LucideIcons2.Image,
41286
41631
  title: t("display.noMedia"),
41287
- description: "No media items to display.",
41632
+ description: t("mediaGallery.noMediaDescription"),
41288
41633
  className
41289
41634
  }
41290
41635
  );
@@ -41301,7 +41646,7 @@ var init_MediaGallery = __esm({
41301
41646
  size: "sm",
41302
41647
  icon: LucideIcons2.Upload,
41303
41648
  action: "MEDIA_UPLOAD",
41304
- children: "Upload"
41649
+ children: t("mediaGallery.upload")
41305
41650
  }
41306
41651
  ),
41307
41652
  actions?.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -41315,10 +41660,7 @@ var init_MediaGallery = __esm({
41315
41660
  ))
41316
41661
  ] })
41317
41662
  ] }),
41318
- selectable && selectedItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(exports.HStack, { gap: "sm", align: "center", children: /* @__PURE__ */ jsxRuntime.jsxs(exports.Badge, { variant: "info", children: [
41319
- selectedItems.length,
41320
- " selected"
41321
- ] }) }),
41663
+ selectable && selectedItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(exports.HStack, { gap: "sm", align: "center", children: /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "info", children: t("table.bulk.selected", { count: selectedItems.length }) }) }),
41322
41664
  /* @__PURE__ */ jsxRuntime.jsx(
41323
41665
  exports.Box,
41324
41666
  {
@@ -42311,7 +42653,7 @@ function TraitsTab({ traits: traits2 }) {
42311
42653
  exports.EmptyState,
42312
42654
  {
42313
42655
  title: t("debug.noActiveTraits"),
42314
- description: "Traits will appear when components using them are mounted",
42656
+ description: t("debug.traitsMountHint"),
42315
42657
  className: "py-8"
42316
42658
  }
42317
42659
  );
@@ -42321,14 +42663,11 @@ function TraitsTab({ traits: traits2 }) {
42321
42663
  header: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 w-full", children: [
42322
42664
  /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body", weight: "semibold", className: "text-purple-600 dark:text-purple-400", children: trait.name }),
42323
42665
  /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "success", size: "sm", children: trait.currentState }),
42324
- /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { variant: "small", className: "text-gray-500 ml-auto", children: [
42325
- trait.transitionCount,
42326
- " transitions"
42327
- ] })
42666
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", className: "text-gray-500 ml-auto", children: t("debug.transitionsCount", { count: trait.transitionCount }) })
42328
42667
  ] }),
42329
42668
  content: /* @__PURE__ */ jsxRuntime.jsxs(exports.Stack, { gap: "sm", children: [
42330
42669
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42331
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "States" }),
42670
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.states") }),
42332
42671
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: trait.states.map((state) => /* @__PURE__ */ jsxRuntime.jsx(
42333
42672
  exports.Badge,
42334
42673
  {
@@ -42340,7 +42679,7 @@ function TraitsTab({ traits: traits2 }) {
42340
42679
  )) })
42341
42680
  ] }),
42342
42681
  trait.transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42343
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Transitions" }),
42682
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.transitions") }),
42344
42683
  /* @__PURE__ */ jsxRuntime.jsx(exports.Stack, { gap: "xs", children: trait.transitions.map((t2, i) => /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { variant: "small", className: "font-mono", children: [
42345
42684
  t2.from,
42346
42685
  " \u2192 ",
@@ -42359,7 +42698,7 @@ function TraitsTab({ traits: traits2 }) {
42359
42698
  ] }, i)) })
42360
42699
  ] }),
42361
42700
  trait.guards.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42362
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Guards" }),
42701
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.guards") }),
42363
42702
  /* @__PURE__ */ jsxRuntime.jsx(exports.Stack, { gap: "xs", children: trait.guards.map((g, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
42364
42703
  /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", children: g.name }),
42365
42704
  /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: g.lastResult === true ? "success" : g.lastResult === false ? "danger" : "default", size: "sm", children: g.lastResult === void 0 ? "?" : g.lastResult ? "\u2713" : "\u2717" })
@@ -42465,7 +42804,7 @@ function EntitiesTab({ snapshot }) {
42465
42804
  exports.EmptyState,
42466
42805
  {
42467
42806
  title: t("debug.noEntityData"),
42468
- description: "Debug mode may not be enabled",
42807
+ description: t("debug.debugModeHint"),
42469
42808
  className: "py-8"
42470
42809
  }
42471
42810
  );
@@ -42478,7 +42817,7 @@ function EntitiesTab({ snapshot }) {
42478
42817
  exports.EmptyState,
42479
42818
  {
42480
42819
  title: t("debug.noEntities"),
42481
- description: "Entities will appear when spawned",
42820
+ description: t("debug.entitiesSpawnHint"),
42482
42821
  className: "py-8"
42483
42822
  }
42484
42823
  );
@@ -42486,7 +42825,7 @@ function EntitiesTab({ snapshot }) {
42486
42825
  const singletonItems = singletonEntries.map(([name, data]) => ({
42487
42826
  id: `singleton-${name}`,
42488
42827
  header: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
42489
- /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "primary", size: "sm", children: "Singleton" }),
42828
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "primary", size: "sm", children: t("debug.singleton") }),
42490
42829
  /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body", weight: "semibold", className: "text-sky-600 dark:text-sky-400", children: name })
42491
42830
  ] }),
42492
42831
  content: /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "text-xs text-gray-600 dark:text-gray-400 bg-gray-50 dark:bg-gray-800 p-2 rounded overflow-auto max-h-40", children: JSON.stringify(data, null, 2) })
@@ -42504,31 +42843,19 @@ function EntitiesTab({ snapshot }) {
42504
42843
  }));
42505
42844
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--entities", children: [
42506
42845
  singletonItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4", children: [
42507
- /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
42508
- "Singletons (",
42509
- singletonItems.length,
42510
- ")"
42511
- ] }),
42846
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.singletonsCount", { count: singletonItems.length }) }),
42512
42847
  /* @__PURE__ */ jsxRuntime.jsx(exports.Accordion, { items: singletonItems, multiple: true })
42513
42848
  ] }),
42514
42849
  runtimeItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4", children: [
42515
- /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
42516
- "Runtime (",
42517
- runtimeEntities.length,
42518
- ")"
42519
- ] }),
42850
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.runtimeCount", { count: runtimeEntities.length }) }),
42520
42851
  /* @__PURE__ */ jsxRuntime.jsx(exports.Accordion, { items: runtimeItems, multiple: true }),
42521
- runtimeEntities.length > 20 && /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { variant: "small", className: "text-gray-400 text-center mt-2", children: [
42522
- "+",
42523
- runtimeEntities.length - 20,
42524
- " more entities"
42525
- ] })
42852
+ runtimeEntities.length > 20 && /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", className: "text-gray-400 text-center mt-2", children: t("debug.moreEntities", { count: runtimeEntities.length - 20 }) })
42526
42853
  ] }),
42527
42854
  persistentEntries.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42528
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Persistent" }),
42855
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.persistent") }),
42529
42856
  /* @__PURE__ */ jsxRuntime.jsx(exports.Stack, { gap: "xs", children: persistentEntries.map(([type, info]) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between py-1", children: [
42530
42857
  /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", children: type }),
42531
- /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: info.loaded ? "success" : "default", size: "sm", children: info.loaded ? `${info.count} loaded` : "not loaded" })
42858
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: info.loaded ? "success" : "default", size: "sm", children: info.loaded ? t("debug.loadedCount", { count: info.count }) : t("debug.notLoaded") })
42532
42859
  ] }, type)) })
42533
42860
  ] })
42534
42861
  ] });
@@ -42572,7 +42899,7 @@ function EventFlowTab({ events: events2 }) {
42572
42899
  exports.EmptyState,
42573
42900
  {
42574
42901
  title: t("debug.noEventsYet"),
42575
- description: "Events will appear as traits, ticks, and other systems execute",
42902
+ description: t("debug.eventsExecuteHint"),
42576
42903
  className: "py-8"
42577
42904
  }
42578
42905
  );
@@ -42583,17 +42910,13 @@ function EventFlowTab({ events: events2 }) {
42583
42910
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--events", children: [
42584
42911
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 mb-3 flex-wrap", children: [
42585
42912
  /* @__PURE__ */ jsxRuntime.jsxs(exports.ButtonGroup, { children: [
42586
- /* @__PURE__ */ jsxRuntime.jsxs(
42913
+ /* @__PURE__ */ jsxRuntime.jsx(
42587
42914
  exports.Button,
42588
42915
  {
42589
42916
  size: "sm",
42590
42917
  variant: filter === "all" ? "primary" : "secondary",
42591
42918
  onClick: () => setFilter("all"),
42592
- children: [
42593
- "All (",
42594
- events2.length,
42595
- ")"
42596
- ]
42919
+ children: t("debug.allCount", { count: events2.length })
42597
42920
  }
42598
42921
  ),
42599
42922
  eventTypes.map((type) => {
@@ -42623,7 +42946,7 @@ function EventFlowTab({ events: events2 }) {
42623
42946
  onChange: (e) => setAutoScroll(e.target.checked)
42624
42947
  }
42625
42948
  ),
42626
- "Auto-scroll"
42949
+ t("debug.autoScroll")
42627
42950
  ] })
42628
42951
  ] }),
42629
42952
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -42681,7 +43004,7 @@ function GuardsPanel({ guards }) {
42681
43004
  exports.EmptyState,
42682
43005
  {
42683
43006
  title: t("debug.noGuardEvaluations"),
42684
- description: "Guard evaluations will appear when transitions or ticks with guards execute",
43007
+ description: t("debug.guardEvaluationsHint"),
42685
43008
  className: "py-8"
42686
43009
  }
42687
43010
  );
@@ -42712,15 +43035,15 @@ function GuardsPanel({ guards }) {
42712
43035
  ] }),
42713
43036
  content: /* @__PURE__ */ jsxRuntime.jsxs(exports.Stack, { gap: "sm", children: [
42714
43037
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42715
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Expression" }),
43038
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.expression") }),
42716
43039
  /* @__PURE__ */ jsxRuntime.jsx("code", { className: "block mt-1 text-xs text-amber-600 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20 px-2 py-1 rounded", children: guard.expression })
42717
43040
  ] }),
42718
43041
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42719
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Inputs" }),
43042
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.inputs") }),
42720
43043
  /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "mt-1 text-xs text-gray-600 dark:text-gray-400 bg-gray-50 dark:bg-gray-800 p-2 rounded overflow-auto max-h-24", children: JSON.stringify(guard.inputs, null, 2) })
42721
43044
  ] }),
42722
43045
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42723
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Trait" }),
43046
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.trait") }),
42724
43047
  /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", children: guard.context.traitName })
42725
43048
  ] })
42726
43049
  ] })
@@ -42738,9 +43061,9 @@ function GuardsPanel({ guards }) {
42738
43061
  ] })
42739
43062
  ] }),
42740
43063
  /* @__PURE__ */ jsxRuntime.jsxs(exports.ButtonGroup, { children: [
42741
- /* @__PURE__ */ jsxRuntime.jsx(exports.Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: "All" }),
42742
- /* @__PURE__ */ jsxRuntime.jsx(exports.Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: "Passed" }),
42743
- /* @__PURE__ */ jsxRuntime.jsx(exports.Button, { size: "sm", variant: filter === "failed" ? "primary" : "secondary", onClick: () => setFilter("failed"), children: "Failed" })
43064
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: t("debug.filterAll") }),
43065
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: t("debug.filterPassed") }),
43066
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Button, { size: "sm", variant: filter === "failed" ? "primary" : "secondary", onClick: () => setFilter("failed"), children: t("debug.filterFailed") })
42744
43067
  ] })
42745
43068
  ] }),
42746
43069
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-80 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx(exports.Accordion, { items: accordionItems }) })
@@ -42866,7 +43189,7 @@ function TransitionTimeline({ transitions }) {
42866
43189
  exports.EmptyState,
42867
43190
  {
42868
43191
  title: t("debug.noTransitionsRecorded"),
42869
- description: "Transitions will appear as the state machine processes events",
43192
+ description: t("debug.transitionsProcessHint"),
42870
43193
  className: "py-8"
42871
43194
  }
42872
43195
  );
@@ -42883,10 +43206,7 @@ function TransitionTimeline({ transitions }) {
42883
43206
  const sorted = [...transitions].reverse();
42884
43207
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--timeline", children: [
42885
43208
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-2", children: [
42886
- /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { variant: "small", className: "text-gray-500", children: [
42887
- transitions.length,
42888
- " transitions recorded"
42889
- ] }),
43209
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", className: "text-gray-500", children: t("debug.transitionsRecorded", { count: transitions.length }) }),
42890
43210
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-1 text-xs text-gray-500 cursor-pointer", children: [
42891
43211
  /* @__PURE__ */ jsxRuntime.jsx(
42892
43212
  exports.Checkbox,
@@ -42895,7 +43215,7 @@ function TransitionTimeline({ transitions }) {
42895
43215
  onChange: (e) => setAutoScroll(e.target.checked)
42896
43216
  }
42897
43217
  ),
42898
- "Auto-scroll"
43218
+ t("debug.autoScroll")
42899
43219
  ] })
42900
43220
  ] }),
42901
43221
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -42938,15 +43258,13 @@ function TransitionTimeline({ transitions }) {
42938
43258
  variant: trace.guardResult ? "success" : "danger",
42939
43259
  size: "sm",
42940
43260
  children: [
42941
- "guard: ",
43261
+ t("debug.guardLabel"),
43262
+ " ",
42942
43263
  trace.guardResult ? "\u2713" : "\u2717"
42943
43264
  ]
42944
43265
  }
42945
43266
  ),
42946
- /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { variant: "small", className: "text-gray-400 ml-auto", children: [
42947
- trace.effects.length,
42948
- " effects"
42949
- ] })
43267
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", className: "text-gray-400 ml-auto", children: t("debug.effectsCount", { count: trace.effects.length }) })
42950
43268
  ] }),
42951
43269
  isExpanded && trace.effects.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-2 mt-1 mb-2 pl-2 border-l border-gray-200 dark:border-gray-700 space-y-1", children: trace.effects.map((effect, eIdx) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [
42952
43270
  /* @__PURE__ */ jsxRuntime.jsx(EffectBadge, { effect }),
@@ -42995,13 +43313,13 @@ function ServerBridgeTab({ bridge }) {
42995
43313
  exports.EmptyState,
42996
43314
  {
42997
43315
  title: t("debug.noBridgeData"),
42998
- description: "The ServerBridge has not been initialized. Bridge health will appear once the runtime connects to the server.",
43316
+ description: t("debug.bridgeInitHint"),
42999
43317
  className: "py-8"
43000
43318
  }
43001
43319
  );
43002
43320
  }
43003
43321
  const formatTime4 = (ts) => {
43004
- if (ts === 0) return "Never";
43322
+ if (ts === 0) return t("debug.never");
43005
43323
  const d = new Date(ts);
43006
43324
  return d.toLocaleTimeString("en-US", {
43007
43325
  hour12: false,
@@ -43014,14 +43332,14 @@ function ServerBridgeTab({ bridge }) {
43014
43332
  /* @__PURE__ */ jsxRuntime.jsxs(exports.Card, { className: "p-3", children: [
43015
43333
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 mb-3", children: [
43016
43334
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: `w-3 h-3 rounded-full ${bridge.connected ? "bg-green-500 animate-pulse" : "bg-red-500"}` }),
43017
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "h6", children: bridge.connected ? "Connected" : "Disconnected" })
43335
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "h6", children: bridge.connected ? t("debug.connected") : t("debug.disconnected") })
43018
43336
  ] }),
43019
43337
  /* @__PURE__ */ jsxRuntime.jsxs(exports.Stack, { gap: "xs", children: [
43020
43338
  /* @__PURE__ */ jsxRuntime.jsx(
43021
43339
  StatRow,
43022
43340
  {
43023
43341
  label: t("debug.status"),
43024
- value: bridge.connected ? "Connected" : "Disconnected",
43342
+ value: bridge.connected ? t("debug.connected") : t("debug.disconnected"),
43025
43343
  variant: bridge.connected ? "success" : "danger"
43026
43344
  }
43027
43345
  ),
@@ -43049,13 +43367,10 @@ function ServerBridgeTab({ bridge }) {
43049
43367
  ] })
43050
43368
  ] }),
43051
43369
  bridge.lastError && /* @__PURE__ */ jsxRuntime.jsxs(exports.Card, { className: "p-3 border-red-200 dark:border-red-800 bg-red-50 dark:bg-red-950", children: [
43052
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "semibold", className: "text-red-600 dark:text-red-400 mb-1", children: "Last Error" }),
43370
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "semibold", className: "text-red-600 dark:text-red-400 mb-1", children: t("debug.lastError") }),
43053
43371
  /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", className: "text-red-500 font-mono break-all", children: bridge.lastError })
43054
43372
  ] }),
43055
- bridge.connected && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-2", children: /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { variant: "small", className: "text-gray-400", children: [
43056
- bridge.eventsForwarded + bridge.eventsReceived,
43057
- " total events processed"
43058
- ] }) })
43373
+ bridge.connected && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-2", children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", className: "text-gray-400", children: t("debug.totalEventsProcessed", { count: bridge.eventsForwarded + bridge.eventsReceived }) }) })
43059
43374
  ] }) });
43060
43375
  }
43061
43376
  var init_ServerBridgeTab = __esm({
@@ -43165,7 +43480,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43165
43480
  exports.EmptyState,
43166
43481
  {
43167
43482
  title: t("debug.noActiveTraits"),
43168
- description: "Traits will appear when the state machine initializes",
43483
+ description: t("debug.traitsInitHint"),
43169
43484
  className: "py-8"
43170
43485
  }
43171
43486
  );
@@ -43182,7 +43497,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43182
43497
  };
43183
43498
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--dispatch", children: [
43184
43499
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3", children: [
43185
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Active States" }),
43500
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.activeStates") }),
43186
43501
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: traits2.map((trait) => /* @__PURE__ */ jsxRuntime.jsxs(exports.Badge, { variant: "success", size: "sm", children: [
43187
43502
  trait.name,
43188
43503
  ": ",
@@ -43190,8 +43505,8 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43190
43505
  ] }, trait.id)) })
43191
43506
  ] }),
43192
43507
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3", children: [
43193
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Available Events" }),
43194
- availableEvents.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", className: "text-gray-400 italic", children: "No transitions from current state" }) : /* @__PURE__ */ jsxRuntime.jsx(exports.Stack, { gap: "xs", children: availableEvents.map(({ event, transitions }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43508
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.availableEvents") }),
43509
+ availableEvents.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", className: "text-gray-400 italic", children: t("debug.noTransitionsFromState") }) : /* @__PURE__ */ jsxRuntime.jsx(exports.Stack, { gap: "xs", children: availableEvents.map(({ event, transitions }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43195
43510
  /* @__PURE__ */ jsxRuntime.jsx(
43196
43511
  exports.Button,
43197
43512
  {
@@ -43203,15 +43518,15 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43203
43518
  }
43204
43519
  ),
43205
43520
  /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", className: "text-gray-500", children: transitions.map((t2) => `${t2.from} -> ${t2.to}`).join(", ") }),
43206
- transitions.some((t2) => t2.guard) && /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "warning", size: "sm", children: "guarded" })
43521
+ transitions.some((tr) => tr.guard) && /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "warning", size: "sm", children: t("debug.guarded") })
43207
43522
  ] }, event)) })
43208
43523
  ] }),
43209
43524
  unavailableEvents.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3", children: [
43210
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Other Events (not available from current state)" }),
43525
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.otherEvents") }),
43211
43526
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: unavailableEvents.map((event) => /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "default", size: "sm", className: "opacity-50", children: event }, event)) })
43212
43527
  ] }),
43213
43528
  log18.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
43214
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Recent Transitions" }),
43529
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.recentTransitions") }),
43215
43530
  /* @__PURE__ */ jsxRuntime.jsx(exports.Stack, { gap: "xs", children: log18.map((entry, i) => /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { variant: "small", className: "font-mono text-xs", children: [
43216
43531
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-400", children: entry.traitName }),
43217
43532
  " ",
@@ -43242,21 +43557,20 @@ var init_RuntimeDebugger = __esm({
43242
43557
  }
43243
43558
  });
43244
43559
  function ServerResponseRow({ sr }) {
43560
+ const { t } = useTranslate();
43245
43561
  const entityEntries = Object.entries(sr.dataEntities);
43246
43562
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-4 pl-2 border-l border-purple-500/30 py-0.5 text-xs font-mono", children: [
43247
43563
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43248
43564
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: sr.success ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400", children: [
43249
43565
  sr.success ? "\u2713" : "\u2717",
43250
- " server"
43566
+ " ",
43567
+ t("debug.server")
43251
43568
  ] }),
43252
43569
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-300", children: sr.orbitalName }),
43253
- sr.clientEffects > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "px-1 rounded bg-purple-500/15 text-purple-600 dark:text-purple-300", children: [
43254
- sr.clientEffects,
43255
- " clientEffect",
43256
- sr.clientEffects !== 1 ? "s" : ""
43257
- ] }),
43570
+ sr.clientEffects > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "px-1 rounded bg-purple-500/15 text-purple-600 dark:text-purple-300", children: t("debug.clientEffectsCount", { count: sr.clientEffects }) }),
43258
43571
  sr.emittedEvents.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "px-1 rounded bg-blue-500/15 text-blue-300", children: [
43259
- "emit: ",
43572
+ t("debug.emitLabel"),
43573
+ " ",
43260
43574
  sr.emittedEvents.join(", ")
43261
43575
  ] }),
43262
43576
  sr.error && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "px-1 rounded bg-red-500/15 text-red-600 dark:text-red-400 truncate max-w-[300px]", children: sr.error })
@@ -43264,13 +43578,12 @@ function ServerResponseRow({ sr }) {
43264
43578
  entityEntries.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1 mt-0.5", children: entityEntries.map(([name, count]) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "px-1 rounded bg-[var(--color-card)] text-foreground", children: [
43265
43579
  name,
43266
43580
  ": ",
43267
- count,
43268
- " row",
43269
- count !== 1 ? "s" : ""
43581
+ t("debug.rowsCount", { count })
43270
43582
  ] }, name)) })
43271
43583
  ] });
43272
43584
  }
43273
43585
  function TransitionRow({ trace }) {
43586
+ const { t } = useTranslate();
43274
43587
  const isServerEntry = !!trace.serverResponse && trace.traitName.startsWith("server:");
43275
43588
  const hasFailedEffects = trace.effects.some((e) => e.status === "failed");
43276
43589
  if (isServerEntry && trace.serverResponse) {
@@ -43278,7 +43591,7 @@ function TransitionRow({ trace }) {
43278
43591
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-2 text-xs font-mono", children: [
43279
43592
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-1.5 w-1.5 h-1.5 rounded-full flex-shrink-0 bg-purple-500" }),
43280
43593
  /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "warning", size: "sm", className: "flex-shrink-0", children: trace.event }),
43281
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-400 flex-shrink-0", children: "server response" })
43594
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-400 flex-shrink-0", children: t("debug.serverResponse") })
43282
43595
  ] }),
43283
43596
  /* @__PURE__ */ jsxRuntime.jsx(ServerResponseRow, { sr: trace.serverResponse })
43284
43597
  ] });
@@ -43319,6 +43632,7 @@ function VerifyModePanel({
43319
43632
  serverCount,
43320
43633
  localCount
43321
43634
  }) {
43635
+ const { t } = useTranslate();
43322
43636
  const [expanded, setExpanded] = React79__namespace.useState(true);
43323
43637
  const scrollRef = React79__namespace.useRef(null);
43324
43638
  const prevCountRef = React79__namespace.useRef(0);
@@ -43349,30 +43663,20 @@ function VerifyModePanel({
43349
43663
  onClick: () => setExpanded((v) => !v),
43350
43664
  className: "px-3 py-1.5 flex items-center gap-3 text-xs font-mono border-b border-border flex-shrink-0 w-full text-left hover:bg-[var(--color-card-hover,transparent)] cursor-pointer",
43351
43665
  "aria-expanded": expanded,
43352
- "aria-label": expanded ? "Collapse verification timeline" : "Expand verification timeline",
43666
+ "aria-label": expanded ? t("debug.collapseVerificationTimeline") : t("debug.expandVerificationTimeline"),
43353
43667
  "data-testid": "debugger-verify-toggle",
43354
43668
  children: [
43355
43669
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground/50 w-3", "aria-hidden": true, children: expanded ? "\u25BE" : "\u25B8" }),
43356
- /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? `${failedChecks} fail` : "OK" }),
43357
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-foreground/70", children: [
43358
- localCount,
43359
- " local"
43360
- ] }),
43361
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-purple-600 dark:text-purple-400", children: [
43362
- serverCount,
43363
- " server"
43364
- ] }),
43670
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? t("debug.failCount", { count: failedChecks }) : t("debug.ok") }),
43671
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground/70", children: t("debug.localCount", { count: localCount }) }),
43672
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-400", children: t("debug.serverCount", { count: serverCount }) }),
43365
43673
  traitStates && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-cyan-600 dark:text-cyan-400 truncate max-w-[400px]", children: traitStates }),
43366
- !expanded && transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ml-auto text-foreground/50", children: [
43367
- transitions.length,
43368
- " transition",
43369
- transitions.length !== 1 ? "s" : ""
43370
- ] })
43674
+ !expanded && transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto text-foreground/50", children: t("debug.transitionsCount", { count: transitions.length }) })
43371
43675
  ]
43372
43676
  }
43373
43677
  ),
43374
43678
  expanded && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 flex overflow-hidden", children: [
43375
- /* @__PURE__ */ jsxRuntime.jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-1", children: transitions.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-foreground/50 text-xs font-mono py-2 text-center", children: "Waiting for transitions..." }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-0.5", children: transitions.map((trace) => /* @__PURE__ */ jsxRuntime.jsx(TransitionRow, { trace }, trace.id)) }) }) }),
43679
+ /* @__PURE__ */ jsxRuntime.jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-1", children: transitions.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-foreground/50 text-xs font-mono py-2 text-center", children: t("debug.waitingForTransitions") }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-0.5", children: transitions.map((trace) => /* @__PURE__ */ jsxRuntime.jsx(TransitionRow, { trace }, trace.id)) }) }) }),
43376
43680
  /* @__PURE__ */ jsxRuntime.jsx(WalkMinimap, {})
43377
43681
  ] })
43378
43682
  ]
@@ -43388,6 +43692,7 @@ function RuntimeDebugger({
43388
43692
  defaultTab,
43389
43693
  schema
43390
43694
  }) {
43695
+ const { t } = useTranslate();
43391
43696
  const [isCollapsed, setIsCollapsed] = React79__namespace.useState(mode === "verify" ? true : defaultCollapsed);
43392
43697
  const [isVisible, setIsVisible] = React79__namespace.useState(mode === "inline" || mode === "verify" || isDebugEnabled2());
43393
43698
  const debugData = useDebugData();
@@ -43426,55 +43731,55 @@ function RuntimeDebugger({
43426
43731
  const tabItems = [
43427
43732
  {
43428
43733
  id: "dispatch",
43429
- label: "Dispatch",
43734
+ label: t("debug.tabDispatch"),
43430
43735
  badge: debugData.traits.length || void 0,
43431
43736
  content: /* @__PURE__ */ jsxRuntime.jsx(EventDispatcherTab, { traits: debugData.traits, schema })
43432
43737
  },
43433
43738
  {
43434
43739
  id: "verify",
43435
- label: failedChecks > 0 ? "Verify (!)" : "Verify",
43740
+ label: failedChecks > 0 ? t("debug.tabVerifyAlert") : t("debug.tabVerify"),
43436
43741
  badge: verification.summary.totalChecks || void 0,
43437
43742
  content: /* @__PURE__ */ jsxRuntime.jsx(VerificationTab, { checks: verification.checks, summary: verification.summary })
43438
43743
  },
43439
43744
  {
43440
43745
  id: "timeline",
43441
- label: "Timeline",
43746
+ label: t("debug.tabTimeline"),
43442
43747
  badge: verification.transitions.length || void 0,
43443
43748
  content: /* @__PURE__ */ jsxRuntime.jsx(TransitionTimeline, { transitions: verification.transitions })
43444
43749
  },
43445
43750
  {
43446
43751
  id: "bridge",
43447
- label: "Bridge",
43752
+ label: t("debug.tabBridge"),
43448
43753
  badge: verification.bridge?.connected ? void 0 : 1,
43449
43754
  content: /* @__PURE__ */ jsxRuntime.jsx(ServerBridgeTab, { bridge: verification.bridge })
43450
43755
  },
43451
43756
  {
43452
43757
  id: "traits",
43453
- label: "Traits",
43758
+ label: t("debug.tabTraits"),
43454
43759
  badge: debugData.traits.length || void 0,
43455
43760
  content: /* @__PURE__ */ jsxRuntime.jsx(TraitsTab, { traits: debugData.traits })
43456
43761
  },
43457
43762
  {
43458
43763
  id: "ticks",
43459
- label: "Ticks",
43460
- badge: debugData.ticks.filter((t) => t.active).length || void 0,
43764
+ label: t("debug.tabTicks"),
43765
+ badge: debugData.ticks.filter((tick) => tick.active).length || void 0,
43461
43766
  content: /* @__PURE__ */ jsxRuntime.jsx(TicksTab, { ticks: debugData.ticks })
43462
43767
  },
43463
43768
  {
43464
43769
  id: "entities",
43465
- label: "Entities",
43770
+ label: t("debug.tabEntities"),
43466
43771
  badge: debugData.entitySnapshot?.runtime.length || void 0,
43467
43772
  content: /* @__PURE__ */ jsxRuntime.jsx(EntitiesTab, { snapshot: debugData.entitySnapshot })
43468
43773
  },
43469
43774
  {
43470
43775
  id: "events",
43471
- label: "Events",
43776
+ label: t("debug.tabEvents"),
43472
43777
  badge: debugData.events.length > 0 ? debugData.events.length : void 0,
43473
43778
  content: /* @__PURE__ */ jsxRuntime.jsx(EventFlowTab, { events: debugData.events })
43474
43779
  },
43475
43780
  {
43476
43781
  id: "guards",
43477
- label: "Guards",
43782
+ label: t("debug.tabGuards"),
43478
43783
  badge: debugData.guards.filter((g) => !g.result).length || void 0,
43479
43784
  content: /* @__PURE__ */ jsxRuntime.jsx(GuardsPanel, { guards: debugData.guards })
43480
43785
  }
@@ -43502,15 +43807,10 @@ function RuntimeDebugger({
43502
43807
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43503
43808
  /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { variant: "h6", style: { fontSize: "0.75rem" }, children: [
43504
43809
  isCollapsed ? "\u25B6" : "\u25BC",
43505
- " Debugger"
43810
+ " ",
43811
+ t("debug.debugger")
43506
43812
  ] }),
43507
- failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(exports.Badge, { variant: "danger", size: "sm", children: [
43508
- failedChecks,
43509
- " failed"
43510
- ] }) : debugData.traits.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(exports.Badge, { variant: "success", size: "sm", children: [
43511
- debugData.traits.length,
43512
- " traits"
43513
- ] }) : /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "info", size: "sm", children: "Idle" })
43813
+ failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "danger", size: "sm", children: t("debug.failedCount", { count: failedChecks }) }) : debugData.traits.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "success", size: "sm", children: t("debug.traitsCount", { count: debugData.traits.length }) }) : /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "info", size: "sm", children: t("debug.idle") })
43514
43814
  ] })
43515
43815
  }
43516
43816
  ),
@@ -43528,9 +43828,9 @@ function RuntimeDebugger({
43528
43828
  );
43529
43829
  }
43530
43830
  if (mode === "verify") {
43531
- const traitStates = debugData.traits.map((t) => `${t.name}:${t.currentState}`).join(" | ");
43532
- const serverEntries = verification.transitions.filter((t) => t.serverResponse);
43533
- const localEntries = verification.transitions.filter((t) => !t.serverResponse);
43831
+ const traitStates = debugData.traits.map((t2) => `${t2.name}:${t2.currentState}`).join(" | ");
43832
+ const serverEntries = verification.transitions.filter((t2) => t2.serverResponse);
43833
+ const localEntries = verification.transitions.filter((t2) => !t2.serverResponse);
43534
43834
  return /* @__PURE__ */ jsxRuntime.jsx(
43535
43835
  VerifyModePanel,
43536
43836
  {
@@ -43562,7 +43862,7 @@ function RuntimeDebugger({
43562
43862
  variant: "secondary",
43563
43863
  size: "sm",
43564
43864
  className: "runtime-debugger__toggle",
43565
- title: "Open Debugger (`)",
43865
+ title: t("debug.openDebugger"),
43566
43866
  children: failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "relative", children: [
43567
43867
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: "V" }),
43568
43868
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute -top-1 -right-2 w-2 h-2 bg-red-500 rounded-full" })
@@ -43572,11 +43872,8 @@ function RuntimeDebugger({
43572
43872
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "runtime-debugger__header", children: [
43573
43873
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43574
43874
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-lg", children: "V" }),
43575
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "h6", children: "KFlow Verifier" }),
43576
- failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(exports.Badge, { variant: "danger", size: "sm", children: [
43577
- failedChecks,
43578
- " failed"
43579
- ] }) : verification.summary.totalChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "success", size: "sm", children: "All passing" }) : /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "info", size: "sm", children: "Runtime" })
43875
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "h6", children: t("debug.kflowVerifier") }),
43876
+ failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "danger", size: "sm", children: t("debug.failedCount", { count: failedChecks }) }) : verification.summary.totalChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "success", size: "sm", children: t("debug.allPassing") }) : /* @__PURE__ */ jsxRuntime.jsx(exports.Badge, { variant: "info", size: "sm", children: t("debug.runtime") })
43580
43877
  ] }),
43581
43878
  /* @__PURE__ */ jsxRuntime.jsx(
43582
43879
  exports.Button,
@@ -43584,7 +43881,7 @@ function RuntimeDebugger({
43584
43881
  onClick: () => setIsCollapsed(true),
43585
43882
  variant: "ghost",
43586
43883
  size: "sm",
43587
- title: "Close (`)",
43884
+ title: t("debug.close"),
43588
43885
  children: "x"
43589
43886
  }
43590
43887
  )
@@ -43598,7 +43895,7 @@ function RuntimeDebugger({
43598
43895
  className: "runtime-debugger__tabs"
43599
43896
  }
43600
43897
  ) }),
43601
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "runtime-debugger__footer", children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", className: "text-foreground/50", children: "Press ` to toggle | window.__orbitalVerification for automation" }) })
43898
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "runtime-debugger__footer", children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", className: "text-foreground/50", children: t("debug.toggleHint") }) })
43602
43899
  ] })
43603
43900
  }
43604
43901
  );
@@ -43624,6 +43921,7 @@ var init_RuntimeDebugger2 = __esm({
43624
43921
  init_TransitionTimeline();
43625
43922
  init_ServerBridgeTab();
43626
43923
  init_EventDispatcherTab();
43924
+ init_useTranslate();
43627
43925
  init_RuntimeDebugger();
43628
43926
  RuntimeDebugger.displayName = "RuntimeDebugger";
43629
43927
  }
@@ -45023,7 +45321,7 @@ var init_StatCard = __esm({
45023
45321
  }
45024
45322
  );
45025
45323
  }
45026
- const label = schemaStats?.[0]?.label || labelToUse || "Stat";
45324
+ const label = schemaStats?.[0]?.label || labelToUse || t("statCard.defaultLabel");
45027
45325
  const normalizedPropValue = Array.isArray(propValue) ? propValue[0] ?? propValue.length : propValue;
45028
45326
  const value = schemaStats?.[0]?.value ?? normalizedPropValue ?? 0;
45029
45327
  const trendDirection = manualDirection || (calculatedTrend === void 0 || calculatedTrend === 0 ? "neutral" : calculatedTrend > 0 ? "up" : "down");
@@ -45066,7 +45364,7 @@ var init_StatCard = __esm({
45066
45364
  ]
45067
45365
  }
45068
45366
  ),
45069
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", color: "secondary", as: "span", children: "vs last period" })
45367
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", color: "secondary", as: "span", children: t("statCard.vsLastPeriod") })
45070
45368
  ] }),
45071
45369
  subtitle && !calculatedTrend && /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", color: "secondary", children: subtitle })
45072
45370
  ] }),