@almadar/ui 5.21.8 → 5.21.9

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.
@@ -298,7 +298,10 @@ var en_default;
298
298
  var init_en = __esm({
299
299
  "locales/en.json"() {
300
300
  en_default = {
301
- $meta: { locale: "en", direction: "ltr" },
301
+ $meta: {
302
+ locale: "en",
303
+ direction: "ltr"
304
+ },
302
305
  "common.save": "Save",
303
306
  "common.cancel": "Cancel",
304
307
  "common.delete": "Delete",
@@ -440,7 +443,6 @@ var init_en = __esm({
440
443
  "error.somethingWentWrong": "Something went wrong",
441
444
  "error.loadingItems": "Loading items...",
442
445
  "error.noItemsFound": "No items found",
443
- "error.notFound": "Not found",
444
446
  "debug.noEntityData": "No entity data",
445
447
  "debug.noEntities": "No entities",
446
448
  "debug.noTicks": "No ticks registered",
@@ -472,7 +474,298 @@ var init_en = __esm({
472
474
  "template.showcase": "Showcase",
473
475
  "template.faq": "Frequently Asked Questions",
474
476
  "template.ourTeam": "Our Team",
475
- "template.caseStudies": "Case Studies"
477
+ "template.caseStudies": "Case Studies",
478
+ "richBlockEditor.toolbar.text": "Text",
479
+ "richBlockEditor.toolbar.h1": "H1",
480
+ "richBlockEditor.toolbar.h2": "H2",
481
+ "richBlockEditor.toolbar.h3": "H3",
482
+ "richBlockEditor.toolbar.bulletList": "Bullet list",
483
+ "richBlockEditor.toolbar.numbered": "Numbered",
484
+ "richBlockEditor.toolbar.quote": "Quote",
485
+ "richBlockEditor.toolbar.code": "Code",
486
+ "richBlockEditor.toolbar.divider": "Divider",
487
+ "richBlockEditor.toolbar.image": "Image",
488
+ "richBlockEditor.blockType.paragraph": "Text",
489
+ "richBlockEditor.blockType.heading1": "Heading 1",
490
+ "richBlockEditor.blockType.heading2": "Heading 2",
491
+ "richBlockEditor.blockType.heading3": "Heading 3",
492
+ "richBlockEditor.blockType.bulletList": "Bullet list",
493
+ "richBlockEditor.blockType.numberedList": "Numbered list",
494
+ "richBlockEditor.blockType.quote": "Quote",
495
+ "richBlockEditor.blockType.code": "Code",
496
+ "richBlockEditor.blockType.divider": "Divider",
497
+ "richBlockEditor.blockType.image": "Image",
498
+ "richBlockEditor.blockActions": "Block actions",
499
+ "richBlockEditor.duplicate": "Duplicate",
500
+ "richBlockEditor.turnInto": "Turn into",
501
+ "richBlockEditor.placeholder.heading1": "Heading 1",
502
+ "richBlockEditor.placeholder.heading2": "Heading 2",
503
+ "richBlockEditor.placeholder.heading3": "Heading 3",
504
+ "richBlockEditor.placeholder.quote": "Quote",
505
+ "richBlockEditor.placeholder.code": "Enter code",
506
+ "richBlockEditor.placeholder.paragraph": "Start writing...",
507
+ "richBlockEditor.placeholder.listItem": "List item",
508
+ "richBlockEditor.placeholder.caption": "Caption (optional)",
509
+ "richBlockEditor.aria.heading1Block": "Heading 1 block",
510
+ "richBlockEditor.aria.heading2Block": "Heading 2 block",
511
+ "richBlockEditor.aria.heading3Block": "Heading 3 block",
512
+ "richBlockEditor.aria.quoteBlock": "Quote block",
513
+ "richBlockEditor.aria.codeBlock": "Code block",
514
+ "richBlockEditor.aria.codeLanguage": "Code language",
515
+ "richBlockEditor.aria.imageUrl": "Image URL",
516
+ "richBlockEditor.aria.imageCaption": "Image caption",
517
+ "richBlockEditor.aria.listItem": "List item",
518
+ "richBlockEditor.aria.removeListItem": "Remove list item",
519
+ "richBlockEditor.aria.paragraphBlock": "Paragraph block",
520
+ "richBlockEditor.embeddedImage": "Embedded image",
521
+ "richBlockEditor.noImageUrl": "No image URL set",
522
+ "richBlockEditor.addItem": "Add item",
523
+ "richBlockEditor.insertParagraphBelow": "Insert paragraph below",
524
+ "richBlockEditor.editorToolbar": "Block editor toolbar",
525
+ "richBlockEditor.insertEntry": "Insert {{label}}",
526
+ "versionDiff.compare": "Compare",
527
+ "versionDiff.to": "to",
528
+ "versionDiff.beforeRevision": "Before revision",
529
+ "versionDiff.afterRevision": "After revision",
530
+ "versionDiff.switchToInline": "Switch to inline view",
531
+ "versionDiff.switchToSideBySide": "Switch to side-by-side view",
532
+ "versionDiff.revert": "Revert",
533
+ "versionDiff.byAuthor": " by {{author}}",
534
+ "violationAlert.actionType.measure": "Corrective Measure",
535
+ "violationAlert.actionType.admin": "Administrative Action",
536
+ "violationAlert.actionType.penalty": "Penalty Proceedings",
537
+ "violationAlert.fallbackMessage": "Violation",
538
+ "violationAlert.adminLabel": "Admin:",
539
+ "violationAlert.penaltyLabel": "Penalty:",
540
+ "violationAlert.goToField": "Go to field",
541
+ "branchingLogic.title": "Branching logic",
542
+ "branchingLogic.if": "If",
543
+ "branchingLogic.goTo": "go to",
544
+ "branchingLogic.rules": "Rules",
545
+ "branchingLogic.logicGraph": "Logic graph",
546
+ "branchingLogic.addRule": "Add rule",
547
+ "branchingLogic.deleteRule": "Delete rule",
548
+ "branchingLogic.endOfSurvey": "End of survey",
549
+ "branchingLogic.brokenReference": "Broken reference",
550
+ "branchingLogic.selectQuestion": "Select question",
551
+ "branchingLogic.selectTarget": "Select target",
552
+ "branchingLogic.selectValue": "Select value",
553
+ "branchingLogic.addValue": "Add value",
554
+ "branchingLogic.value": "Value",
555
+ "branchingLogic.typeValuePressEnter": "Type value, press Enter",
556
+ "branchingLogic.operatorEquals": "equals",
557
+ "branchingLogic.operatorNotEquals": "does not equal",
558
+ "branchingLogic.operatorContains": "contains",
559
+ "branchingLogic.operatorIn": "is one of",
560
+ "branchingLogic.graphAriaLabel": "Branching logic graph",
561
+ "branchingLogic.ruleCountOne": "{{count}} rule",
562
+ "branchingLogic.ruleCountOther": "{{count}} rules",
563
+ "branchingLogic.brokenCount": "{{count}} broken",
564
+ "branchingLogic.emptyNoQuestions": "Add questions before building branching rules.",
565
+ "branchingLogic.emptyNoRules": "No rules yet. Add a rule to define branching logic.",
566
+ "filterGroup.filters": "Filters",
567
+ "filterGroup.all": "All",
568
+ "filterGroup.clear": "Clear",
569
+ "filterGroup.clearAll": "Clear all",
570
+ "filterGroup.from": "From",
571
+ "filterGroup.to": "To",
572
+ "filterGroup.allOf": "All {{label}}",
573
+ "filterGroup.activeCount": "{{count}} active",
574
+ "debug.guardEvaluationsHint": "Guard evaluations will appear when transitions or ticks with guards execute",
575
+ "debug.expression": "Expression",
576
+ "debug.inputs": "Inputs",
577
+ "debug.trait": "Trait",
578
+ "debug.filterAll": "All",
579
+ "debug.filterPassed": "Passed",
580
+ "debug.filterFailed": "Failed",
581
+ "debug.traitsInitHint": "Traits will appear when the state machine initializes",
582
+ "debug.traitsMountHint": "Traits will appear when components using them are mounted",
583
+ "debug.activeStates": "Active States",
584
+ "debug.availableEvents": "Available Events",
585
+ "debug.noTransitionsFromState": "No transitions from current state",
586
+ "debug.guarded": "guarded",
587
+ "debug.otherEvents": "Other Events (not available from current state)",
588
+ "debug.recentTransitions": "Recent Transitions",
589
+ "debug.transitionsCount": "{{count}} transitions",
590
+ "debug.states": "States",
591
+ "debug.transitions": "Transitions",
592
+ "debug.guards": "Guards",
593
+ "debug.debugModeHint": "Debug mode may not be enabled",
594
+ "debug.entitiesSpawnHint": "Entities will appear when spawned",
595
+ "debug.singleton": "Singleton",
596
+ "debug.singletonsCount": "Singletons ({{count}})",
597
+ "debug.runtimeCount": "Runtime ({{count}})",
598
+ "debug.moreEntities": "+{{count}} more entities",
599
+ "debug.persistent": "Persistent",
600
+ "debug.loadedCount": "{{count}} loaded",
601
+ "debug.notLoaded": "not loaded",
602
+ "debug.eventsExecuteHint": "Events will appear as traits, ticks, and other systems execute",
603
+ "debug.allCount": "All ({{count}})",
604
+ "debug.autoScroll": "Auto-scroll",
605
+ "debug.transitionsProcessHint": "Transitions will appear as the state machine processes events",
606
+ "debug.transitionsRecorded": "{{count}} transitions recorded",
607
+ "debug.guardLabel": "guard:",
608
+ "debug.effectsCount": "{{count}} effects",
609
+ "debug.bridgeInitHint": "The ServerBridge has not been initialized. Bridge health will appear once the runtime connects to the server.",
610
+ "debug.never": "Never",
611
+ "debug.connected": "Connected",
612
+ "debug.disconnected": "Disconnected",
613
+ "debug.lastError": "Last Error",
614
+ "debug.totalEventsProcessed": "{{count}} total events processed",
615
+ "debug.server": "server",
616
+ "debug.clientEffectsCount": "{{count}} clientEffects",
617
+ "debug.emitLabel": "emit:",
618
+ "debug.rowsCount": "{{count}} rows",
619
+ "debug.serverResponse": "server response",
620
+ "debug.collapseVerificationTimeline": "Collapse verification timeline",
621
+ "debug.expandVerificationTimeline": "Expand verification timeline",
622
+ "debug.failCount": "{{count}} fail",
623
+ "debug.ok": "OK",
624
+ "debug.localCount": "{{count}} local",
625
+ "debug.serverCount": "{{count}} server",
626
+ "debug.waitingForTransitions": "Waiting for transitions...",
627
+ "debug.tabDispatch": "Dispatch",
628
+ "debug.tabVerify": "Verify",
629
+ "debug.tabVerifyAlert": "Verify (!)",
630
+ "debug.tabTimeline": "Timeline",
631
+ "debug.tabBridge": "Bridge",
632
+ "debug.tabTraits": "Traits",
633
+ "debug.tabTicks": "Ticks",
634
+ "debug.tabEntities": "Entities",
635
+ "debug.tabEvents": "Events",
636
+ "debug.tabGuards": "Guards",
637
+ "debug.debugger": "Debugger",
638
+ "debug.failedCount": "{{count}} failed",
639
+ "debug.traitsCount": "{{count}} traits",
640
+ "debug.idle": "Idle",
641
+ "debug.openDebugger": "Open Debugger (`)",
642
+ "debug.kflowVerifier": "KFlow Verifier",
643
+ "debug.allPassing": "All passing",
644
+ "debug.runtime": "Runtime",
645
+ "debug.close": "Close (`)",
646
+ "debug.toggleHint": "Press ` to toggle | window.__orbitalVerification for automation",
647
+ "replyTree.expandReplies": "Expand replies",
648
+ "replyTree.collapseReplies": "Collapse replies",
649
+ "replyTree.voteOnReplyBy": "Vote on reply by {{author}}",
650
+ "replyTree.replyTo": "Reply to {{author}}",
651
+ "replyTree.replyToPlaceholder": "Reply to {{author}}\u2026",
652
+ "replyTree.reply": "Reply",
653
+ "replyTree.flagReplyBy": "Flag reply by {{author}}",
654
+ "replyTree.flag": "Flag",
655
+ "replyTree.send": "Send",
656
+ "replyTree.continueThread": "Continue thread",
657
+ "replyTree.noRepliesYet": "No replies yet.",
658
+ "signaturePad.label": "Signature",
659
+ "signaturePad.helperText": "Draw your signature above",
660
+ "signaturePad.clear": "Clear",
661
+ "signaturePad.confirm": "Confirm",
662
+ "qrScanner.cameraUnavailable": "Camera unavailable",
663
+ "qrScanner.paused": "Paused",
664
+ "qrScanner.resumeScanning": "Resume scanning",
665
+ "qrScanner.pauseScanning": "Pause scanning",
666
+ "qrScanner.switchToFrontCamera": "Switch to front camera",
667
+ "qrScanner.switchToRearCamera": "Switch to rear camera",
668
+ "qrScanner.mockScan": "Mock Scan",
669
+ "docSearch.placeholder": "Search documentation...",
670
+ "stateMachine.loading": "Loading state machine\u2026",
671
+ "stateMachine.noStateMachine": "No state machine to visualize",
672
+ "avl.trigger": "Trigger",
673
+ "avl.guard": "Guard",
674
+ "avl.effects": "Effects",
675
+ "avl.props": "Props",
676
+ "avl.entity": "Entity",
677
+ "avl.traits": "Traits",
678
+ "avl.transition": "Transition",
679
+ "avl.onEntity": "on {{entity}}",
680
+ "avl.linkedTo": "linked to {{entity}}",
681
+ "avl.pressEscToZoomOut": "Press Esc to zoom out",
682
+ "avl.zoomIn": "Zoom in",
683
+ "avl.zoomOut": "Zoom out",
684
+ "avl.orbitalLabel": "Orbital: {{name}}",
685
+ "avl.orbitalLabelHighlighted": "Orbital: {{name}} (highlighted)",
686
+ "avl.noTraitData": "No trait data",
687
+ "avl.computingLayout": "Computing layout...",
688
+ "avl.noStateMachine": "No state machine",
689
+ "avl.listensFor": "listens for {{event}}",
690
+ "avl.emits": "emits {{event}}",
691
+ "avl.pageLayout": "Page Layout",
692
+ "avl.overlaySuffix": "(overlay)",
693
+ "orbPreview.previewBadge": "Preview",
694
+ "orbPreview.doubleClickToOpen": "Double-click to open",
695
+ "orbPreview.dropToAddAndOpen": "Drop to add and open",
696
+ "orbPreview.dispatching": "Coordinator is dispatching to this orbital",
697
+ "orbPreview.noPreview": "No preview available",
698
+ "orbPreview.screensCount": "{{count}} screens",
699
+ "detailView.noTransitionData": "No transition data",
700
+ "orbInspector.required": "req",
701
+ "orbInspector.addField": "Add Field",
702
+ "orbInspector.serviceMode": "Service Mode",
703
+ "orbInspector.standalone": "Standalone",
704
+ "orbInspector.embedded": "Embedded",
705
+ "orbInspector.rendersOwnUi": "Renders its own UI",
706
+ "orbInspector.headless": "Headless, wired to other behaviors",
707
+ "orbInspector.addEffect": "Add Effect",
708
+ "orbInspector.guardExpression": "Guard expression",
709
+ "orbInspector.selectPatternForStyles": "Select a pattern to view its style tokens.",
710
+ "orbInspector.tokens": "Tokens",
711
+ "orbInspector.noTokenContract": "No token contract declared for this pattern.",
712
+ "orbInspector.variant": "Variant",
713
+ "orbInspector.size": "Size",
714
+ "orbInspector.statesCount": "{{count}} states",
715
+ "orbInspector.onEntity": " on {{entity}}",
716
+ "orbInspector.projectThemeTokens": "Project theme tokens",
717
+ "orbInspector.tokenGroup.colors": "Colors",
718
+ "orbInspector.tokenGroup.radii": "Radii",
719
+ "orbInspector.tokenGroup.spacing": "Spacing",
720
+ "orbInspector.tokenGroup.shadows": "Shadows",
721
+ "orbInspector.tab.inspector": "Inspector",
722
+ "orbInspector.tab.styles": "Styles",
723
+ "orbInspector.tab.code": "Code",
724
+ "canvas.goBackToOverview": "Go back to overview",
725
+ "canvas.overview": "Overview",
726
+ "canvas.expanded": "Expanded",
727
+ "canvas.modulesCount": "{{count}} modules",
728
+ "canvas.screensCount": "{{count}} screens",
729
+ "canvas.switchToView": "Switch to {{label}} view",
730
+ "lawReference.viewFullText": "View full law text",
731
+ "statCard.defaultLabel": "Stat",
732
+ "statCard.vsLastPeriod": "vs last period",
733
+ "mediaGallery.upload": "Upload",
734
+ "mediaGallery.noMediaDescription": "No media items to display.",
735
+ "pagination.jumpPlaceholder": "Page",
736
+ "table.selectRow": "Select row {{id}}",
737
+ "card.selectItem": "Select {{item}}",
738
+ "card.itemFallback": "item",
739
+ "fileTree.noFiles": "No files",
740
+ "masterDetail.selectItem": "Select an item to view details",
741
+ "empty.createFirst": "Create your first item to get started.",
742
+ "upload.dropOrBrowse": "Drop files here or click to browse",
743
+ "upload.dropFilesHere": "Drop files here",
744
+ "upload.accepted": "Accepted: {{accept}}",
745
+ "upload.maxSize": "Max size: {{size}}",
746
+ "upload.maxFiles": "Up to {{count}} files",
747
+ "upload.error.maxFiles": "Maximum {{count}} files allowed",
748
+ "upload.error.invalidType": "Invalid file type: {{name}}",
749
+ "upload.error.tooLarge": "File too large: {{name}} (max {{size}})",
750
+ "optionConstraint.requiredOne": "Required, pick 1",
751
+ "optionConstraint.optionalOne": "Optional, pick up to 1",
752
+ "optionConstraint.pickExactly": "Pick exactly {{count}}",
753
+ "optionConstraint.pickRange": "Pick {{min}}-{{max}}",
754
+ "optionConstraint.pickAtLeast": "Pick at least {{count}}",
755
+ "optionConstraint.pickUpTo": "Pick up to {{count}}",
756
+ "optionConstraint.optional": "Optional",
757
+ "optionConstraint.outOfStock": "Out of stock",
758
+ "optionConstraint.error.pickOne": "Pick 1 option",
759
+ "optionConstraint.error.pickOnlyOne": "Pick only 1 option",
760
+ "optionConstraint.error.pickMore": "Pick at least {{count}} more",
761
+ "optionConstraint.error.removeOptions": "Remove {{count}} options",
762
+ "stateMachine.pinned": "Pinned",
763
+ "stateMachine.eventCount": "{{count}} events",
764
+ "stateMachine.externalEffects": "External Effects",
765
+ "stateMachine.legend.initial": "Initial",
766
+ "stateMachine.legend.final": "Final",
767
+ "stateMachine.legend.state": "State",
768
+ "stateMachine.legend.multiEvent": "Multi-event"
476
769
  };
477
770
  }
478
771
  });
@@ -5455,6 +5748,7 @@ var init_LawReferenceTooltip = __esm({
5455
5748
  init_Typography();
5456
5749
  init_Divider();
5457
5750
  init_cn();
5751
+ init_useTranslate();
5458
5752
  positionStyles2 = {
5459
5753
  top: "bottom-full left-1/2 -translate-x-1/2 mb-2",
5460
5754
  bottom: "top-full left-1/2 -translate-x-1/2 mt-2",
@@ -5473,6 +5767,7 @@ var init_LawReferenceTooltip = __esm({
5473
5767
  position = "top",
5474
5768
  className
5475
5769
  }) => {
5770
+ const { t } = useTranslate();
5476
5771
  const [isVisible, setIsVisible] = React84__default.useState(false);
5477
5772
  const timeoutRef = React84__default.useRef(null);
5478
5773
  const handleMouseEnter = () => {
@@ -5556,7 +5851,7 @@ var init_LawReferenceTooltip = __esm({
5556
5851
  target: "_blank",
5557
5852
  rel: "noopener noreferrer",
5558
5853
  onClick: (e) => e.stopPropagation(),
5559
- children: "View full law text"
5854
+ children: t("lawReference.viewFullText")
5560
5855
  }
5561
5856
  )
5562
5857
  ] }),
@@ -13458,6 +13753,7 @@ var log6, SWIM_GUTTER, CENTER_W, BehaviorView;
13458
13753
  var init_BehaviorView = __esm({
13459
13754
  "components/avl/molecules/BehaviorView.tsx"() {
13460
13755
  "use client";
13756
+ init_useTranslate();
13461
13757
  init_AvlState();
13462
13758
  init_AvlTransitionLane();
13463
13759
  init_AvlSwimLane();
@@ -13467,6 +13763,7 @@ var init_BehaviorView = __esm({
13467
13763
  SWIM_GUTTER = 120;
13468
13764
  CENTER_W = 360;
13469
13765
  BehaviorView = ({ data }) => {
13766
+ const { t } = useTranslate();
13470
13767
  const [layout, setLayout] = useState(null);
13471
13768
  const traitName = data.traits[0]?.name;
13472
13769
  const traitData = traitName ? data.traitDetails[traitName] : void 0;
@@ -13476,10 +13773,10 @@ var init_BehaviorView = __esm({
13476
13773
  computeTraitLayout(traitData).then(setLayout).catch((err) => log6.error("compute-trait-layout-failed", { error: err instanceof Error ? err : String(err) }));
13477
13774
  }, [dataKey]);
13478
13775
  if (!traitData) {
13479
- return /* @__PURE__ */ 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" });
13776
+ return /* @__PURE__ */ 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") });
13480
13777
  }
13481
13778
  if (!layout) {
13482
- return /* @__PURE__ */ 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..." });
13779
+ return /* @__PURE__ */ 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") });
13483
13780
  }
13484
13781
  const hasExternal = traitData.listenedEvents.length > 0 || traitData.emittedEvents.length > 0;
13485
13782
  const viewW = hasExternal ? SWIM_GUTTER + CENTER_W + SWIM_GUTTER : CENTER_W + 60;
@@ -13495,10 +13792,7 @@ var init_BehaviorView = __esm({
13495
13792
  const machineHeight = scaledH + 100;
13496
13793
  const renderMachine = /* @__PURE__ */ jsxs("g", { children: [
13497
13794
  /* @__PURE__ */ jsx("text", { x: CENTER_W / 2, y: 20, textAnchor: "middle", fill: "var(--color-foreground)", fontSize: 18, fontWeight: "700", fontFamily: "inherit", children: traitData.name }),
13498
- /* @__PURE__ */ jsxs("text", { x: CENTER_W / 2, y: 36, textAnchor: "middle", fill: "var(--color-muted-foreground)", fontSize: 11, opacity: 0.5, fontFamily: "inherit", children: [
13499
- "on ",
13500
- traitData.linkedEntity
13501
- ] }),
13795
+ /* @__PURE__ */ 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 }) }),
13502
13796
  /* @__PURE__ */ jsxs("defs", { children: [
13503
13797
  /* @__PURE__ */ jsx("marker", { id: "bvArrow", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: CONNECTION_COLORS.forward.color, opacity: 0.7 }) }),
13504
13798
  /* @__PURE__ */ jsx("marker", { id: "bvArrowBack", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: CONNECTION_COLORS.backward.color, opacity: 0.5 }) })
@@ -13806,7 +14100,7 @@ var init_CodeBlock = __esm({
13806
14100
  const isLolo = language === "lolo";
13807
14101
  const activeStyle = isOrb ? orbStyle : isLolo ? loloStyle : dark;
13808
14102
  const eventBus = useEventBus();
13809
- const { t: _t } = useTranslate();
14103
+ const { t } = useTranslate();
13810
14104
  const scrollRef = useRef(null);
13811
14105
  const codeRef = useRef(null);
13812
14106
  const savedScrollLeftRef = useRef(0);
@@ -14061,7 +14355,7 @@ var init_CodeBlock = __esm({
14061
14355
  size: "sm",
14062
14356
  onClick: handleCopy,
14063
14357
  className: "opacity-0 group-hover:opacity-100 focus:opacity-100 transition-opacity text-muted-foreground hover:text-white",
14064
- "aria-label": "Copy code",
14358
+ "aria-label": t("common.copy"),
14065
14359
  children: copied ? /* @__PURE__ */ jsx(Icon, { name: "check", className: "w-4 h-4 text-green-400" }) : /* @__PURE__ */ jsx(Icon, { name: "copy", className: "w-4 h-4" })
14066
14360
  }
14067
14361
  )
@@ -14666,7 +14960,7 @@ var init_StateMachineView = __esm({
14666
14960
  const endX2 = fromState.x + Math.cos(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
14667
14961
  const endY2 = fromState.y + Math.sin(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
14668
14962
  const isSingle2 = bundle.labels.length === 1;
14669
- const labelText2 = isSingle2 ? bundle.labels[0].event : `${bundle.labels.length} events`;
14963
+ const labelText2 = isSingle2 ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
14670
14964
  const bundleColor2 = isSingle2 ? config.colors.arrow : "var(--color-accent)";
14671
14965
  const labelWidth2 = labelText2.length * 9 + (isSingle2 ? 24 : 40);
14672
14966
  const cx = fromState.x;
@@ -14792,7 +15086,7 @@ var init_StateMachineView = __esm({
14792
15086
  const controlX = midX + perpX;
14793
15087
  const controlY = midY + perpY;
14794
15088
  const isSingle = bundle.labels.length === 1;
14795
- const labelText = isSingle ? bundle.labels[0].event : `${bundle.labels.length} events`;
15089
+ const labelText = isSingle ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
14796
15090
  const labelWidth = labelText.length * 9 + (isSingle ? 24 : 40);
14797
15091
  const bundleColor = isSingle ? config.colors.arrow : "var(--color-accent)";
14798
15092
  const curveMidpoint = {
@@ -14947,7 +15241,7 @@ var init_StateMachineView = __esm({
14947
15241
  {
14948
15242
  className: "absolute -top-2 left-1/2 transform -translate-x-1/2 px-2 py-0.5 rounded-full",
14949
15243
  style: { backgroundColor: "var(--color-success)" },
14950
- children: /* @__PURE__ */ jsx(Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: "Pinned" })
15244
+ children: /* @__PURE__ */ jsx(Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: t("stateMachine.pinned") })
14951
15245
  }
14952
15246
  ),
14953
15247
  !isSingle && /* @__PURE__ */ jsxs(
@@ -14969,10 +15263,7 @@ var init_StateMachineView = __esm({
14969
15263
  {
14970
15264
  className: "ml-2 px-2 py-0.5 rounded-full",
14971
15265
  style: { backgroundColor: "var(--color-accent)" },
14972
- children: /* @__PURE__ */ jsxs(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: [
14973
- bundle.labels.length,
14974
- " events"
14975
- ] })
15266
+ children: /* @__PURE__ */ jsx(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: t("stateMachine.eventCount", { count: bundle.labels.length }) })
14976
15267
  }
14977
15268
  )
14978
15269
  ]
@@ -15117,7 +15408,7 @@ var init_StateMachineView = __esm({
15117
15408
  align: "center",
15118
15409
  className: "mb-2",
15119
15410
  style: { color: "var(--color-warning)", fontSize: "13px" },
15120
- children: "External Effects"
15411
+ children: t("stateMachine.externalEffects")
15121
15412
  }
15122
15413
  ),
15123
15414
  outputs.outputs.map((output, idx) => /* @__PURE__ */ jsx(
@@ -15137,10 +15428,10 @@ var init_StateMachineView = __esm({
15137
15428
  Legend = ({ config, y }) => {
15138
15429
  const { t } = useTranslate();
15139
15430
  const items = [
15140
- { label: "Initial", color: config.colors.initialNode },
15141
- { label: "Final", color: config.colors.finalNode },
15142
- { label: "State", color: config.colors.nodeBorder },
15143
- { label: "Multi-event", color: "var(--color-accent)" }
15431
+ { key: "initial", label: t("stateMachine.legend.initial"), color: config.colors.initialNode, isMultiEvent: false },
15432
+ { key: "final", label: t("stateMachine.legend.final"), color: config.colors.finalNode, isMultiEvent: false },
15433
+ { key: "state", label: t("stateMachine.legend.state"), color: config.colors.nodeBorder, isMultiEvent: false },
15434
+ { key: "multiEvent", label: t("stateMachine.legend.multiEvent"), color: "var(--color-accent)", isMultiEvent: true }
15144
15435
  ];
15145
15436
  return /* @__PURE__ */ jsx(
15146
15437
  HStack,
@@ -15155,8 +15446,8 @@ var init_StateMachineView = __esm({
15155
15446
  {
15156
15447
  className: "w-3 h-3 rounded-full",
15157
15448
  style: {
15158
- backgroundColor: item.label === "Multi-event" ? item.color : config.colors.node,
15159
- border: item.label !== "Multi-event" ? `2px solid ${item.color}` : "none"
15449
+ backgroundColor: item.isMultiEvent ? item.color : config.colors.node,
15450
+ border: !item.isMultiEvent ? `2px solid ${item.color}` : "none"
15160
15451
  }
15161
15452
  }
15162
15453
  ),
@@ -15168,7 +15459,7 @@ var init_StateMachineView = __esm({
15168
15459
  children: item.label
15169
15460
  }
15170
15461
  )
15171
- ] }, item.label))
15462
+ ] }, item.key))
15172
15463
  }
15173
15464
  );
15174
15465
  };
@@ -15962,13 +16253,13 @@ var init_JazariStateMachine = __esm({
15962
16253
  );
15963
16254
  }, [resolvedTrait, entityFields]);
15964
16255
  if (isLoading) {
15965
- return /* @__PURE__ */ jsx(LoadingState, { message: "Loading state machine\u2026" });
16256
+ return /* @__PURE__ */ jsx(LoadingState, { message: t("stateMachine.loading") });
15966
16257
  }
15967
16258
  if (error) {
15968
16259
  return /* @__PURE__ */ jsx(ErrorState, { message: error instanceof Error ? error.message : String(error) });
15969
16260
  }
15970
16261
  if (!resolvedTrait || !layoutData || layoutData.states.length === 0) {
15971
- return /* @__PURE__ */ jsx(Box, { padding: "lg", className: cn("text-center", className), children: /* @__PURE__ */ jsx(Typography, { variant: "body", className: "opacity-60", children: "No state machine to visualize" }) });
16262
+ return /* @__PURE__ */ jsx(Box, { padding: "lg", className: cn("text-center", className), children: /* @__PURE__ */ jsx(Typography, { variant: "body", className: "opacity-60", children: t("stateMachine.noStateMachine") }) });
15972
16263
  }
15973
16264
  return /* @__PURE__ */ jsx(
15974
16265
  StateMachineView,
@@ -17012,13 +17303,13 @@ var init_LayoutPatterns = __esm({
17012
17303
  function generateRuleId() {
17013
17304
  return `rule-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
17014
17305
  }
17015
- function questionsToOptions(questions, includeEndOfSurvey) {
17306
+ function questionsToOptions(questions, endOfSurveyLabel) {
17016
17307
  const opts = questions.map((q) => ({
17017
17308
  value: q.id,
17018
17309
  label: q.label
17019
17310
  }));
17020
- if (includeEndOfSurvey) {
17021
- opts.push({ value: END_OF_SURVEY, label: "End of survey" });
17311
+ if (endOfSurveyLabel !== null) {
17312
+ opts.push({ value: END_OF_SURVEY, label: endOfSurveyLabel });
17022
17313
  }
17023
17314
  return opts;
17024
17315
  }
@@ -17027,7 +17318,7 @@ function isRuleBroken(rule, questions) {
17027
17318
  const targetExists = rule.targetQuestionId === END_OF_SURVEY || questions.some((q) => q.id === rule.targetQuestionId);
17028
17319
  return !sourceExists || !targetExists;
17029
17320
  }
17030
- var END_OF_SURVEY, OPERATOR_OPTIONS, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph, BranchingLogicBuilder;
17321
+ var END_OF_SURVEY, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph, BranchingLogicBuilder;
17031
17322
  var init_BranchingLogicBuilder = __esm({
17032
17323
  "components/core/molecules/BranchingLogicBuilder.tsx"() {
17033
17324
  "use client";
@@ -17040,14 +17331,9 @@ var init_BranchingLogicBuilder = __esm({
17040
17331
  init_FilterPill();
17041
17332
  init_Box();
17042
17333
  init_useEventBus();
17334
+ init_useTranslate();
17043
17335
  init_cn();
17044
17336
  END_OF_SURVEY = "end-of-survey";
17045
- OPERATOR_OPTIONS = [
17046
- { value: "equals", label: "equals" },
17047
- { value: "not-equals", label: "does not equal" },
17048
- { value: "contains", label: "contains" },
17049
- { value: "in", label: "is one of" }
17050
- ];
17051
17337
  RuleRow = ({
17052
17338
  rule,
17053
17339
  questions,
@@ -17056,8 +17342,21 @@ var init_BranchingLogicBuilder = __esm({
17056
17342
  onChange,
17057
17343
  onDelete
17058
17344
  }) => {
17059
- const sourceOptions = useMemo(() => questionsToOptions(questions, false), [questions]);
17060
- const targetOptions = useMemo(() => questionsToOptions(questions, true), [questions]);
17345
+ const { t } = useTranslate();
17346
+ const operatorOptions = useMemo(
17347
+ () => [
17348
+ { value: "equals", label: t("branchingLogic.operatorEquals") },
17349
+ { value: "not-equals", label: t("branchingLogic.operatorNotEquals") },
17350
+ { value: "contains", label: t("branchingLogic.operatorContains") },
17351
+ { value: "in", label: t("branchingLogic.operatorIn") }
17352
+ ],
17353
+ [t]
17354
+ );
17355
+ const sourceOptions = useMemo(() => questionsToOptions(questions, null), [questions]);
17356
+ const targetOptions = useMemo(
17357
+ () => questionsToOptions(questions, t("branchingLogic.endOfSurvey")),
17358
+ [questions, t]
17359
+ );
17061
17360
  const sourceQuestion = questions.find((q) => q.id === rule.sourceQuestionId);
17062
17361
  const valueOptions = useMemo(() => {
17063
17362
  if (!sourceQuestion?.optionValues) return [];
@@ -17102,22 +17401,22 @@ var init_BranchingLogicBuilder = __esm({
17102
17401
  ),
17103
17402
  children: [
17104
17403
  /* @__PURE__ */ jsxs(Box, { className: "flex flex-wrap items-center gap-2", children: [
17105
- /* @__PURE__ */ jsx(Typography, { variant: "label", weight: "semibold", className: "shrink-0", children: "If" }),
17404
+ /* @__PURE__ */ jsx(Typography, { variant: "label", weight: "semibold", className: "shrink-0", children: t("branchingLogic.if") }),
17106
17405
  /* @__PURE__ */ jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsx(
17107
17406
  Select,
17108
17407
  {
17109
17408
  options: sourceOptions,
17110
17409
  value: rule.sourceQuestionId,
17111
- placeholder: "Select question",
17410
+ placeholder: t("branchingLogic.selectQuestion"),
17112
17411
  onChange: handleSource,
17113
17412
  disabled: readOnly,
17114
- error: broken ? "Broken reference" : void 0
17413
+ error: broken ? t("branchingLogic.brokenReference") : void 0
17115
17414
  }
17116
17415
  ) }),
17117
17416
  /* @__PURE__ */ jsx(Box, { className: "min-w-[8rem] basis-32", children: /* @__PURE__ */ jsx(
17118
17417
  Select,
17119
17418
  {
17120
- options: OPERATOR_OPTIONS,
17419
+ options: operatorOptions,
17121
17420
  value: rule.operator,
17122
17421
  onChange: handleOperator,
17123
17422
  disabled: readOnly
@@ -17140,7 +17439,7 @@ var init_BranchingLogicBuilder = __esm({
17140
17439
  {
17141
17440
  options: valueOptions.filter((o) => !chips.includes(o.value)),
17142
17441
  value: "",
17143
- placeholder: "Add value",
17442
+ placeholder: t("branchingLogic.addValue"),
17144
17443
  onChange: handleAddChip,
17145
17444
  disabled: readOnly
17146
17445
  }
@@ -17148,7 +17447,7 @@ var init_BranchingLogicBuilder = __esm({
17148
17447
  Input,
17149
17448
  {
17150
17449
  inputType: "text",
17151
- placeholder: "Type value, press Enter",
17450
+ placeholder: t("branchingLogic.typeValuePressEnter"),
17152
17451
  value: "",
17153
17452
  onKeyDown: (e) => {
17154
17453
  if (e.key !== "Enter") return;
@@ -17166,7 +17465,7 @@ var init_BranchingLogicBuilder = __esm({
17166
17465
  {
17167
17466
  options: valueOptions,
17168
17467
  value: scalarValue,
17169
- placeholder: "Select value",
17468
+ placeholder: t("branchingLogic.selectValue"),
17170
17469
  onChange: (e) => onChange({ ...rule, value: e.target.value }),
17171
17470
  disabled: readOnly
17172
17471
  }
@@ -17174,7 +17473,7 @@ var init_BranchingLogicBuilder = __esm({
17174
17473
  Input,
17175
17474
  {
17176
17475
  inputType: "text",
17177
- placeholder: "Value",
17476
+ placeholder: t("branchingLogic.value"),
17178
17477
  value: scalarValue,
17179
17478
  onChange: handleScalarValue,
17180
17479
  disabled: readOnly
@@ -17182,17 +17481,17 @@ var init_BranchingLogicBuilder = __esm({
17182
17481
  ) }),
17183
17482
  /* @__PURE__ */ jsxs(Typography, { variant: "label", weight: "semibold", className: "shrink-0 inline-flex items-center gap-1", children: [
17184
17483
  /* @__PURE__ */ jsx(ArrowRight, { className: "h-4 w-4" }),
17185
- "go to"
17484
+ t("branchingLogic.goTo")
17186
17485
  ] }),
17187
17486
  /* @__PURE__ */ jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsx(
17188
17487
  Select,
17189
17488
  {
17190
17489
  options: targetOptions,
17191
17490
  value: rule.targetQuestionId,
17192
- placeholder: "Select target",
17491
+ placeholder: t("branchingLogic.selectTarget"),
17193
17492
  onChange: handleTarget,
17194
17493
  disabled: readOnly,
17195
- error: broken && rule.targetQuestionId !== END_OF_SURVEY ? "Broken reference" : void 0
17494
+ error: broken && rule.targetQuestionId !== END_OF_SURVEY ? t("branchingLogic.brokenReference") : void 0
17196
17495
  }
17197
17496
  ) }),
17198
17497
  !readOnly && /* @__PURE__ */ jsx(
@@ -17204,11 +17503,11 @@ var init_BranchingLogicBuilder = __esm({
17204
17503
  action: "DELETE_RULE",
17205
17504
  actionPayload: { ruleId: rule.id },
17206
17505
  onClick: onDelete,
17207
- "aria-label": "Delete rule"
17506
+ "aria-label": t("branchingLogic.deleteRule")
17208
17507
  }
17209
17508
  )
17210
17509
  ] }),
17211
- broken && /* @__PURE__ */ jsx(Badge, { variant: "error", size: "sm", label: "Broken reference" })
17510
+ broken && /* @__PURE__ */ jsx(Badge, { variant: "error", size: "sm", label: t("branchingLogic.brokenReference") })
17212
17511
  ]
17213
17512
  }
17214
17513
  );
@@ -17218,10 +17517,12 @@ var init_BranchingLogicBuilder = __esm({
17218
17517
  NODE_GAP_Y = 80;
17219
17518
  PADDING = 32;
17220
17519
  LogicGraph = ({ questions, rules }) => {
17520
+ const { t } = useTranslate();
17521
+ const endOfSurveyLabel = t("branchingLogic.endOfSurvey");
17221
17522
  const layout = useMemo(() => {
17222
17523
  const items = [
17223
17524
  ...questions.map((q) => ({ id: q.id, label: q.label, isEnd: false })),
17224
- { id: END_OF_SURVEY, label: "End of survey", isEnd: true }
17525
+ { id: END_OF_SURVEY, label: endOfSurveyLabel, isEnd: true }
17225
17526
  ];
17226
17527
  const positions = {};
17227
17528
  items.forEach((item, i) => {
@@ -17233,14 +17534,14 @@ var init_BranchingLogicBuilder = __esm({
17233
17534
  const width = NODE_WIDTH + PADDING * 2 + 220;
17234
17535
  const height = PADDING * 2 + items.length * (NODE_HEIGHT + NODE_GAP_Y);
17235
17536
  return { items, positions, width, height };
17236
- }, [questions]);
17537
+ }, [questions, endOfSurveyLabel]);
17237
17538
  return /* @__PURE__ */ jsx(Box, { className: "overflow-auto rounded-container border border-border bg-card p-2", children: /* @__PURE__ */ jsxs(
17238
17539
  "svg",
17239
17540
  {
17240
17541
  width: layout.width,
17241
17542
  height: layout.height,
17242
17543
  role: "img",
17243
- "aria-label": "Branching logic graph",
17544
+ "aria-label": t("branchingLogic.graphAriaLabel"),
17244
17545
  style: { display: "block" },
17245
17546
  children: [
17246
17547
  /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx(
@@ -17348,6 +17649,7 @@ var init_BranchingLogicBuilder = __esm({
17348
17649
  readOnly = false,
17349
17650
  className
17350
17651
  }) => {
17652
+ const { t } = useTranslate();
17351
17653
  const eventBus = useEventBus();
17352
17654
  const questions = Array.isArray(questionsProp) ? questionsProp : [];
17353
17655
  const rulesInitial = Array.isArray(rulesProp) ? rulesProp : [];
@@ -17400,16 +17702,23 @@ var init_BranchingLogicBuilder = __esm({
17400
17702
  /* @__PURE__ */ jsxs(Box, { className: "flex flex-wrap items-center justify-between gap-2", children: [
17401
17703
  /* @__PURE__ */ jsxs(Box, { className: "flex items-center gap-2", children: [
17402
17704
  /* @__PURE__ */ jsx(GitBranch, { className: "h-5 w-5 text-foreground" }),
17403
- /* @__PURE__ */ jsx(Typography, { variant: "subheading", weight: "semibold", children: "Branching logic" }),
17705
+ /* @__PURE__ */ jsx(Typography, { variant: "subheading", weight: "semibold", children: t("branchingLogic.title") }),
17404
17706
  /* @__PURE__ */ jsx(
17405
17707
  Badge,
17406
17708
  {
17407
17709
  variant: "neutral",
17408
17710
  size: "sm",
17409
- label: `${rules.length} rule${rules.length === 1 ? "" : "s"}`
17711
+ label: rules.length === 1 ? t("branchingLogic.ruleCountOne", { count: rules.length }) : t("branchingLogic.ruleCountOther", { count: rules.length })
17410
17712
  }
17411
17713
  ),
17412
- brokenCount > 0 && /* @__PURE__ */ jsx(Badge, { variant: "error", size: "sm", label: `${brokenCount} broken` })
17714
+ brokenCount > 0 && /* @__PURE__ */ jsx(
17715
+ Badge,
17716
+ {
17717
+ variant: "error",
17718
+ size: "sm",
17719
+ label: t("branchingLogic.brokenCount", { count: brokenCount })
17720
+ }
17721
+ )
17413
17722
  ] }),
17414
17723
  /* @__PURE__ */ jsxs(Box, { className: "flex items-center gap-1 rounded-sm border border-border bg-card p-0.5", children: [
17415
17724
  /* @__PURE__ */ jsx(
@@ -17420,7 +17729,7 @@ var init_BranchingLogicBuilder = __esm({
17420
17729
  leftIcon: Pencil,
17421
17730
  action: "VIEW_EDIT",
17422
17731
  onClick: () => setView("edit"),
17423
- children: "Rules"
17732
+ children: t("branchingLogic.rules")
17424
17733
  }
17425
17734
  ),
17426
17735
  /* @__PURE__ */ jsx(
@@ -17431,13 +17740,13 @@ var init_BranchingLogicBuilder = __esm({
17431
17740
  leftIcon: Eye,
17432
17741
  action: "VIEW_GRAPH",
17433
17742
  onClick: () => setView("graph"),
17434
- children: "Logic graph"
17743
+ children: t("branchingLogic.logicGraph")
17435
17744
  }
17436
17745
  )
17437
17746
  ] })
17438
17747
  ] }),
17439
17748
  view === "edit" ? /* @__PURE__ */ jsxs(Box, { className: "flex flex-col gap-2", children: [
17440
- rules.length === 0 ? /* @__PURE__ */ jsx(Card, { variant: "bordered", padding: "lg", className: "text-center", children: /* @__PURE__ */ jsx(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__ */ jsx(
17749
+ rules.length === 0 ? /* @__PURE__ */ jsx(Card, { variant: "bordered", padding: "lg", className: "text-center", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "muted", children: noQuestions ? t("branchingLogic.emptyNoQuestions") : t("branchingLogic.emptyNoRules") }) }) : rules.map((rule) => /* @__PURE__ */ jsx(
17441
17750
  RuleRow,
17442
17751
  {
17443
17752
  rule,
@@ -17458,7 +17767,7 @@ var init_BranchingLogicBuilder = __esm({
17458
17767
  action: "ADD_RULE",
17459
17768
  onClick: handleAddRule,
17460
17769
  disabled: noQuestions,
17461
- children: "Add rule"
17770
+ children: t("branchingLogic.addRule")
17462
17771
  }
17463
17772
  ) })
17464
17773
  ] }) : /* @__PURE__ */ jsx(LogicGraph, { questions, rules })
@@ -18018,7 +18327,7 @@ function CalendarGrid({
18018
18327
  onClick: stepPrev,
18019
18328
  "aria-disabled": !canPrev || void 0,
18020
18329
  "aria-label": t("aria.previousDays"),
18021
- children: "Prev"
18330
+ children: t("nav.previous")
18022
18331
  }
18023
18332
  ),
18024
18333
  /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground", children: formatDateRange(visibleDays[0], visibleDays[visibleDays.length - 1]) }),
@@ -18031,7 +18340,7 @@ function CalendarGrid({
18031
18340
  onClick: stepNext,
18032
18341
  "aria-disabled": !canNext || void 0,
18033
18342
  "aria-label": t("aria.nextDays"),
18034
- children: "Next"
18343
+ children: t("nav.next")
18035
18344
  }
18036
18345
  )
18037
18346
  ] }),
@@ -19581,7 +19890,7 @@ var init_Pagination = __esm({
19581
19890
  type: "number",
19582
19891
  value: jumpToPage,
19583
19892
  onChange: (e) => setJumpToPage(e.target.value),
19584
- placeholder: "Page",
19893
+ placeholder: t("pagination.jumpPlaceholder"),
19585
19894
  className: "w-20",
19586
19895
  onKeyDown: (e) => {
19587
19896
  if (e.key === "Enter") {
@@ -19719,13 +20028,10 @@ var init_CardGrid = __esm({
19719
20028
  return children;
19720
20029
  }
19721
20030
  if (isLoading) {
19722
- return /* @__PURE__ */ jsx(Box, { className: "col-span-full text-center py-8 text-muted-foreground", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "secondary", children: "Loading items..." }) });
20031
+ return /* @__PURE__ */ jsx(Box, { className: "col-span-full text-center py-8 text-muted-foreground", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "secondary", children: t("loading.items") }) });
19723
20032
  }
19724
20033
  if (error) {
19725
- return /* @__PURE__ */ jsx(Box, { className: "col-span-full text-center py-8 text-error", children: /* @__PURE__ */ jsxs(Typography, { variant: "body", color: "error", children: [
19726
- "Error loading items: ",
19727
- error.message
19728
- ] }) });
20034
+ return /* @__PURE__ */ jsx(Box, { className: "col-span-full text-center py-8 text-error", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "error", children: t("error.loadFailed", { message: error.message }) }) });
19729
20035
  }
19730
20036
  if (normalizedData.length === 0) {
19731
20037
  return /* @__PURE__ */ jsx(Box, { className: "col-span-full text-center py-12 text-muted-foreground", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "secondary", children: t("empty.noItems") || "No items found" }) });
@@ -23577,7 +23883,7 @@ function DataGrid({
23577
23883
  onChange: () => toggleSelection(id),
23578
23884
  onClick: (e) => e.stopPropagation(),
23579
23885
  className: "w-4 h-4 mt-1 flex-shrink-0 accent-primary",
23580
- "aria-label": `Select ${titleValue !== void 0 ? String(titleValue) : "item"}`
23886
+ "aria-label": t("card.selectItem", { item: titleValue !== void 0 ? String(titleValue) : t("card.itemFallback") })
23581
23887
  }
23582
23888
  ),
23583
23889
  /* @__PURE__ */ jsxs(VStack, { gap: "xs", className: "flex-1 min-w-0", children: [
@@ -23775,7 +24081,7 @@ function formatDate3(value) {
23775
24081
  if (isNaN(d.getTime())) return String(value);
23776
24082
  return d.toLocaleDateString(void 0, { year: "numeric", month: "short", day: "numeric" });
23777
24083
  }
23778
- function formatValue2(value, format) {
24084
+ function formatValue2(value, format, boolLabels) {
23779
24085
  if (value === void 0 || value === null) return "";
23780
24086
  switch (format) {
23781
24087
  case "date":
@@ -23787,7 +24093,7 @@ function formatValue2(value, format) {
23787
24093
  case "percent":
23788
24094
  return typeof value === "number" ? `${Math.round(value)}%` : String(value);
23789
24095
  case "boolean":
23790
- return value ? "Yes" : "No";
24096
+ return value ? boolLabels?.yes ?? "Yes" : boolLabels?.no ?? "No";
23791
24097
  default:
23792
24098
  return String(value);
23793
24099
  }
@@ -24083,7 +24389,7 @@ function DataList({
24083
24389
  field.label ?? fieldLabel3(field.name),
24084
24390
  ":"
24085
24391
  ] }),
24086
- /* @__PURE__ */ jsx(Typography, { variant: "small", children: formatValue2(value, field.format) })
24392
+ /* @__PURE__ */ jsx(Typography, { variant: "small", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
24087
24393
  ] }, field.name);
24088
24394
  }) }),
24089
24395
  progressFields.map((field) => {
@@ -24213,6 +24519,7 @@ var init_FileTree = __esm({
24213
24519
  init_Box();
24214
24520
  init_Typography();
24215
24521
  init_Icon();
24522
+ init_useTranslate();
24216
24523
  TreeNodeItem = ({
24217
24524
  node,
24218
24525
  depth,
@@ -24298,8 +24605,9 @@ var init_FileTree = __esm({
24298
24605
  className,
24299
24606
  indent = 16
24300
24607
  }) => {
24608
+ const { t } = useTranslate();
24301
24609
  if (tree.length === 0) {
24302
- return /* @__PURE__ */ jsx(Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: "No files" }) });
24610
+ return /* @__PURE__ */ jsx(Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: t("fileTree.noFiles") }) });
24303
24611
  }
24304
24612
  return /* @__PURE__ */ jsx(Box, { className: `py-1 overflow-y-auto ${className ?? ""}`, role: "tree", children: tree.map((node) => /* @__PURE__ */ jsx(
24305
24613
  TreeNodeItem,
@@ -24354,6 +24662,7 @@ var init_FilterGroup = __esm({
24354
24662
  init_Icon();
24355
24663
  init_useEventBus();
24356
24664
  init_useQuerySingleton();
24665
+ init_useTranslate();
24357
24666
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
24358
24667
  lookStyles6 = {
24359
24668
  toolbar: "",
@@ -24374,6 +24683,7 @@ var init_FilterGroup = __esm({
24374
24683
  isLoading,
24375
24684
  look = "toolbar"
24376
24685
  }) => {
24686
+ const { t } = useTranslate();
24377
24687
  const eventBus = useEventBus();
24378
24688
  const queryState = useQuerySingleton(query);
24379
24689
  const [selectedValues, setSelectedValues] = useState(
@@ -24455,7 +24765,7 @@ var init_FilterGroup = __esm({
24455
24765
  "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24456
24766
  !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24457
24767
  ),
24458
- children: "All"
24768
+ children: t("filterGroup.all")
24459
24769
  }
24460
24770
  ),
24461
24771
  filter.options?.map((option) => /* @__PURE__ */ jsx(
@@ -24483,7 +24793,7 @@ var init_FilterGroup = __esm({
24483
24793
  size: "sm",
24484
24794
  onClick: handleClearAll,
24485
24795
  leftIcon: /* @__PURE__ */ jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24486
- children: "Clear"
24796
+ children: t("filterGroup.clear")
24487
24797
  }
24488
24798
  )
24489
24799
  ]
@@ -24494,7 +24804,7 @@ var init_FilterGroup = __esm({
24494
24804
  return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-4", lookStyles6[look], className), children: [
24495
24805
  showIcon && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
24496
24806
  /* @__PURE__ */ jsx(Icon, { name: "filter", className: "h-4 w-4" }),
24497
- /* @__PURE__ */ jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
24807
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
24498
24808
  ] }),
24499
24809
  filters.map((filter) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
24500
24810
  /* @__PURE__ */ jsx("label", { className: "text-xs font-bold text-muted-foreground uppercase tracking-wide", children: filter.label }),
@@ -24517,7 +24827,7 @@ var init_FilterGroup = __esm({
24517
24827
  `${filter.field}_from`,
24518
24828
  e.target.value || null
24519
24829
  ),
24520
- placeholder: "From",
24830
+ placeholder: t("filterGroup.from"),
24521
24831
  clearable: true,
24522
24832
  onClear: () => handleFilterSelect(`${filter.field}_from`, null)
24523
24833
  }
@@ -24531,7 +24841,7 @@ var init_FilterGroup = __esm({
24531
24841
  `${filter.field}_to`,
24532
24842
  e.target.value || null
24533
24843
  ),
24534
- placeholder: "To",
24844
+ placeholder: t("filterGroup.to"),
24535
24845
  clearable: true,
24536
24846
  onClear: () => handleFilterSelect(`${filter.field}_to`, null)
24537
24847
  }
@@ -24551,7 +24861,7 @@ var init_FilterGroup = __esm({
24551
24861
  value: selectedValues[filter.field] || "all",
24552
24862
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24553
24863
  options: [
24554
- { value: "all", label: "All" },
24864
+ { value: "all", label: t("filterGroup.all") },
24555
24865
  ...filter.options?.map((opt) => ({
24556
24866
  value: opt,
24557
24867
  label: opt
@@ -24568,7 +24878,7 @@ var init_FilterGroup = __esm({
24568
24878
  onClick: handleClearAll,
24569
24879
  leftIcon: /* @__PURE__ */ jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24570
24880
  className: "self-start",
24571
- children: "Clear all"
24881
+ children: t("filterGroup.clearAll")
24572
24882
  }
24573
24883
  )
24574
24884
  ] });
@@ -24634,7 +24944,7 @@ var init_FilterGroup = __esm({
24634
24944
  value: selectedValues[filter.field] || "all",
24635
24945
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24636
24946
  options: [
24637
- { value: "all", label: `All ${filter.label}` },
24947
+ { value: "all", label: t("filterGroup.allOf", { label: filter.label }) },
24638
24948
  ...filter.options?.map((opt) => ({
24639
24949
  value: opt,
24640
24950
  label: opt
@@ -24663,7 +24973,7 @@ var init_FilterGroup = __esm({
24663
24973
  field
24664
24974
  );
24665
24975
  }),
24666
- /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
24976
+ /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: t("filterGroup.clearAll") })
24667
24977
  ] })
24668
24978
  ]
24669
24979
  }
@@ -24688,7 +24998,7 @@ var init_FilterGroup = __esm({
24688
24998
  className: "text-muted-foreground",
24689
24999
  children: [
24690
25000
  /* @__PURE__ */ jsx(Icon, { name: "filter", className: "h-4 w-4" }),
24691
- /* @__PURE__ */ jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
25001
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
24692
25002
  ]
24693
25003
  }
24694
25004
  ),
@@ -24714,7 +25024,7 @@ var init_FilterGroup = __esm({
24714
25024
  `${filter.field}_from`,
24715
25025
  e.target.value || null
24716
25026
  ),
24717
- placeholder: "From",
25027
+ placeholder: t("filterGroup.from"),
24718
25028
  clearable: true,
24719
25029
  onClear: () => handleFilterSelect(`${filter.field}_from`, null),
24720
25030
  className: "min-w-[130px]"
@@ -24730,7 +25040,7 @@ var init_FilterGroup = __esm({
24730
25040
  `${filter.field}_to`,
24731
25041
  e.target.value || null
24732
25042
  ),
24733
- placeholder: "To",
25043
+ placeholder: t("filterGroup.to"),
24734
25044
  clearable: true,
24735
25045
  onClear: () => handleFilterSelect(`${filter.field}_to`, null),
24736
25046
  className: "min-w-[130px]"
@@ -24752,7 +25062,7 @@ var init_FilterGroup = __esm({
24752
25062
  value: selectedValues[filter.field] || "all",
24753
25063
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24754
25064
  options: [
24755
- { value: "all", label: "All" },
25065
+ { value: "all", label: t("filterGroup.all") },
24756
25066
  ...filter.options?.map((opt) => ({
24757
25067
  value: opt,
24758
25068
  label: opt
@@ -24763,10 +25073,7 @@ var init_FilterGroup = __esm({
24763
25073
  )
24764
25074
  ] }, filter.field)),
24765
25075
  activeFilterCount > 0 && /* @__PURE__ */ jsxs(HStack, { gap: "sm", align: "center", className: "ml-auto", children: [
24766
- /* @__PURE__ */ jsxs(Badge, { variant: "primary", size: "md", children: [
24767
- activeFilterCount,
24768
- " active"
24769
- ] }),
25076
+ /* @__PURE__ */ jsx(Badge, { variant: "primary", size: "md", children: t("filterGroup.activeCount", { count: activeFilterCount }) }),
24770
25077
  /* @__PURE__ */ jsx(
24771
25078
  Button,
24772
25079
  {
@@ -24774,7 +25081,7 @@ var init_FilterGroup = __esm({
24774
25081
  size: "sm",
24775
25082
  onClick: handleClearAll,
24776
25083
  leftIcon: /* @__PURE__ */ jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24777
- children: "Clear all"
25084
+ children: t("filterGroup.clearAll")
24778
25085
  }
24779
25086
  )
24780
25087
  ] })
@@ -25718,19 +26025,20 @@ var init_RepeatableFormSection = __esm({
25718
26025
  RepeatableFormSection.displayName = "RepeatableFormSection";
25719
26026
  }
25720
26027
  });
25721
- var actionTypeLabels, actionTypeIcons, ViolationAlert;
26028
+ var actionTypeLabelKeys, actionTypeIcons, ViolationAlert;
25722
26029
  var init_ViolationAlert = __esm({
25723
26030
  "components/core/molecules/ViolationAlert.tsx"() {
25724
26031
  init_cn();
26032
+ init_useTranslate();
25725
26033
  init_Box();
25726
26034
  init_Stack();
25727
26035
  init_Typography();
25728
26036
  init_Button();
25729
26037
  init_Icon();
25730
- actionTypeLabels = {
25731
- measure: "Corrective Measure",
25732
- admin: "Administrative Action",
25733
- penalty: "Penalty Proceedings"
26038
+ actionTypeLabelKeys = {
26039
+ measure: "violationAlert.actionType.measure",
26040
+ admin: "violationAlert.actionType.admin",
26041
+ penalty: "violationAlert.actionType.penalty"
25734
26042
  };
25735
26043
  actionTypeIcons = {
25736
26044
  measure: "alert-triangle",
@@ -25747,10 +26055,11 @@ var init_ViolationAlert = __esm({
25747
26055
  className,
25748
26056
  ...flatProps
25749
26057
  }) => {
26058
+ const { t } = useTranslate();
25750
26059
  const resolvedViolation = violation ?? {
25751
26060
  law: "",
25752
26061
  article: "",
25753
- message: flatProps.message ?? "Violation",
26062
+ message: flatProps.message ?? t("violationAlert.fallbackMessage"),
25754
26063
  actionType: "measure"
25755
26064
  };
25756
26065
  const effectiveSeverity = severity ?? (resolvedViolation.actionType === "measure" ? "warning" : "error");
@@ -25835,7 +26144,7 @@ var init_ViolationAlert = __esm({
25835
26144
  {
25836
26145
  variant: "caption",
25837
26146
  className: cn(textColor, "opacity-75"),
25838
- children: actionTypeLabels[resolvedViolation.actionType]
26147
+ children: t(actionTypeLabelKeys[resolvedViolation.actionType])
25839
26148
  }
25840
26149
  )
25841
26150
  ] })
@@ -25866,7 +26175,7 @@ var init_ViolationAlert = __esm({
25866
26175
  {
25867
26176
  variant: "caption",
25868
26177
  className: cn(textColor, "opacity-75"),
25869
- children: "Admin:"
26178
+ children: t("violationAlert.adminLabel")
25870
26179
  }
25871
26180
  ),
25872
26181
  /* @__PURE__ */ jsx(
@@ -25885,7 +26194,7 @@ var init_ViolationAlert = __esm({
25885
26194
  {
25886
26195
  variant: "caption",
25887
26196
  className: cn(textColor, "opacity-75"),
25888
- children: "Penalty:"
26197
+ children: t("violationAlert.penaltyLabel")
25889
26198
  }
25890
26199
  ),
25891
26200
  /* @__PURE__ */ jsx(
@@ -25910,7 +26219,7 @@ var init_ViolationAlert = __esm({
25910
26219
  className: cn(textColor, "self-start"),
25911
26220
  children: [
25912
26221
  /* @__PURE__ */ jsx(Icon, { name: "arrow-right", size: "sm", className: "mr-1" }),
25913
- "Go to field"
26222
+ t("violationAlert.goToField")
25914
26223
  ]
25915
26224
  }
25916
26225
  )
@@ -26226,6 +26535,7 @@ var init_LineChart = __esm({
26226
26535
  "use client";
26227
26536
  init_cn();
26228
26537
  init_atoms2();
26538
+ init_useTranslate();
26229
26539
  LineChart2 = ({
26230
26540
  data,
26231
26541
  width = 400,
@@ -26237,6 +26547,7 @@ var init_LineChart = __esm({
26237
26547
  areaColor = "var(--color-primary)",
26238
26548
  className
26239
26549
  }) => {
26550
+ const { t } = useTranslate();
26240
26551
  const gradientId = useId();
26241
26552
  const safeData = data ?? [];
26242
26553
  const sortedData = useMemo(() => {
@@ -26273,7 +26584,7 @@ var init_LineChart = __esm({
26273
26584
  return `${linePath} L ${last.x} ${bottom} L ${first.x} ${bottom} Z`;
26274
26585
  }, [linePath, points, height, showArea]);
26275
26586
  if (safeData.length === 0) {
26276
- return /* @__PURE__ */ jsx(Box, { className: cn("flex items-center justify-center text-muted-foreground", className), style: { width, height }, children: "No data" });
26587
+ return /* @__PURE__ */ jsx(Box, { className: cn("flex items-center justify-center text-muted-foreground", className), style: { width, height }, children: t("empty.noData") });
26277
26588
  }
26278
26589
  return /* @__PURE__ */ jsx(Box, { className: cn(className), children: /* @__PURE__ */ jsxs(
26279
26590
  "svg",
@@ -28180,6 +28491,7 @@ var init_GraphView = __esm({
28180
28491
  "use client";
28181
28492
  init_cn();
28182
28493
  init_atoms2();
28494
+ init_useTranslate();
28183
28495
  GROUP_COLORS = [
28184
28496
  "#3b82f6",
28185
28497
  // blue-500
@@ -28212,6 +28524,7 @@ var init_GraphView = __esm({
28212
28524
  showLabels = true,
28213
28525
  zoomToFit = true
28214
28526
  }) => {
28527
+ const { t } = useTranslate();
28215
28528
  const containerRef = useRef(null);
28216
28529
  const animRef = useRef(0);
28217
28530
  const [simNodes, setSimNodes] = useState([]);
@@ -28389,7 +28702,7 @@ var init_GraphView = __esm({
28389
28702
  [onNodeClick]
28390
28703
  );
28391
28704
  if (nodes.length === 0) {
28392
- return /* @__PURE__ */ jsx(Box, { className: cn("flex items-center justify-center", className), style: { width: w, height: h }, children: /* @__PURE__ */ jsx(Box, { className: "text-muted-foreground text-sm", children: "No graph data" }) });
28705
+ return /* @__PURE__ */ jsx(Box, { className: cn("flex items-center justify-center", className), style: { width: w, height: h }, children: /* @__PURE__ */ jsx(Box, { className: "text-muted-foreground text-sm", children: t("display.noGraphData") }) });
28393
28706
  }
28394
28707
  return /* @__PURE__ */ jsx(
28395
28708
  Box,
@@ -28845,11 +29158,12 @@ var init_UploadDropZone = __esm({
28845
29158
  init_Icon();
28846
29159
  init_Typography();
28847
29160
  init_useEventBus();
29161
+ init_useTranslate();
28848
29162
  UploadDropZone = ({
28849
29163
  accept,
28850
29164
  maxSize,
28851
29165
  maxFiles = 1,
28852
- label = "Drop files here or click to browse",
29166
+ label,
28853
29167
  description,
28854
29168
  disabled = false,
28855
29169
  action,
@@ -28857,22 +29171,24 @@ var init_UploadDropZone = __esm({
28857
29171
  onFiles,
28858
29172
  className
28859
29173
  }) => {
29174
+ const { t } = useTranslate();
29175
+ const resolvedLabel = label ?? t("upload.dropOrBrowse");
28860
29176
  const [isDragOver, setIsDragOver] = useState(false);
28861
29177
  const [error, setError] = useState(null);
28862
29178
  const inputRef = useRef(null);
28863
29179
  const eventBus = useSafeEventBus7();
28864
29180
  const defaultDescription = [
28865
- accept ? `Accepted: ${accept}` : null,
28866
- maxSize ? `Max size: ${formatFileSize(maxSize)}` : null,
28867
- maxFiles > 1 ? `Up to ${maxFiles} files` : null
29181
+ accept ? t("upload.accepted", { accept }) : null,
29182
+ maxSize ? t("upload.maxSize", { size: formatFileSize(maxSize) }) : null,
29183
+ maxFiles > 1 ? t("upload.maxFiles", { count: maxFiles }) : null
28868
29184
  ].filter(Boolean).join(". ");
28869
29185
  const validateFiles = useCallback(
28870
29186
  (files) => {
28871
29187
  if (files.length > maxFiles) {
28872
- return { valid: [], error: `Maximum ${maxFiles} file${maxFiles > 1 ? "s" : ""} allowed` };
29188
+ return { valid: [], error: t("upload.error.maxFiles", { count: maxFiles }) };
28873
29189
  }
28874
29190
  if (accept) {
28875
- const acceptedTypes = accept.split(",").map((t) => t.trim());
29191
+ const acceptedTypes = accept.split(",").map((s) => s.trim());
28876
29192
  const invalid = files.filter((file) => {
28877
29193
  return !acceptedTypes.some((type) => {
28878
29194
  if (type.endsWith("/*")) {
@@ -28882,7 +29198,7 @@ var init_UploadDropZone = __esm({
28882
29198
  });
28883
29199
  });
28884
29200
  if (invalid.length > 0) {
28885
- return { valid: [], error: `Invalid file type: ${invalid[0].name}` };
29201
+ return { valid: [], error: t("upload.error.invalidType", { name: invalid[0].name }) };
28886
29202
  }
28887
29203
  }
28888
29204
  if (maxSize) {
@@ -28890,13 +29206,13 @@ var init_UploadDropZone = __esm({
28890
29206
  if (tooLarge.length > 0) {
28891
29207
  return {
28892
29208
  valid: [],
28893
- error: `File too large: ${tooLarge[0].name} (max ${formatFileSize(maxSize)})`
29209
+ error: t("upload.error.tooLarge", { name: tooLarge[0].name, size: formatFileSize(maxSize) })
28894
29210
  };
28895
29211
  }
28896
29212
  }
28897
29213
  return { valid: files, error: null };
28898
29214
  },
28899
- [accept, maxSize, maxFiles]
29215
+ [accept, maxSize, maxFiles, t]
28900
29216
  );
28901
29217
  const handleFiles = useCallback(
28902
29218
  (files) => {
@@ -28967,7 +29283,7 @@ var init_UploadDropZone = __esm({
28967
29283
  handleClick();
28968
29284
  }
28969
29285
  },
28970
- "aria-label": label,
29286
+ "aria-label": resolvedLabel,
28971
29287
  children: [
28972
29288
  /* @__PURE__ */ jsx(
28973
29289
  "input",
@@ -28983,7 +29299,7 @@ var init_UploadDropZone = __esm({
28983
29299
  }
28984
29300
  ),
28985
29301
  error ? /* @__PURE__ */ jsx(Icon, { name: "file-warning", size: "lg", className: "text-error mb-2" }) : /* @__PURE__ */ jsx(Icon, { name: "upload", size: "lg", className: "text-muted-foreground mb-2" }),
28986
- /* @__PURE__ */ jsx(Typography, { variant: "body1", className: "text-center font-medium mb-1", children: isDragOver ? "Drop files here" : label }),
29302
+ /* @__PURE__ */ jsx(Typography, { variant: "body1", className: "text-center font-medium mb-1", children: isDragOver ? t("upload.dropFilesHere") : resolvedLabel }),
28987
29303
  error ? /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "error", className: "text-center", children: error }) : /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "text-center", children: description ?? defaultDescription })
28988
29304
  ]
28989
29305
  }
@@ -29405,7 +29721,7 @@ function TableView({
29405
29721
  {
29406
29722
  checked: selected.has(id),
29407
29723
  onChange: () => toggleRow(id),
29408
- "aria-label": `Select row ${id}`
29724
+ "aria-label": t("table.selectRow", { id })
29409
29725
  }
29410
29726
  ) }),
29411
29727
  hasRenderProp ? /* @__PURE__ */ jsx(Box, { className: "flex-1 min-w-0", children: children(row, index) }) : colDefs.map((col) => {
@@ -32114,7 +32430,7 @@ var init_QrScanner = __esm({
32114
32430
  className: "inset-0 flex-col items-center justify-center gap-2 bg-black bg-opacity-80 text-center",
32115
32431
  children: [
32116
32432
  /* @__PURE__ */ jsx(Icon, { name: "camera", className: "h-8 w-8 text-white", "aria-hidden": "true" }),
32117
- /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "text-white", children: "Camera unavailable" }),
32433
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "text-white", children: t("qrScanner.cameraUnavailable") }),
32118
32434
  /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-white opacity-70", children: cameraError.message })
32119
32435
  ]
32120
32436
  }
@@ -32125,7 +32441,7 @@ var init_QrScanner = __esm({
32125
32441
  position: "absolute",
32126
32442
  display: "flex",
32127
32443
  className: "inset-0 items-center justify-center bg-black bg-opacity-60",
32128
- children: /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "text-white", children: "Paused" })
32444
+ children: /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "text-white", children: t("qrScanner.paused") })
32129
32445
  }
32130
32446
  ),
32131
32447
  showCameraControls && /* @__PURE__ */ jsxs(
@@ -32144,7 +32460,7 @@ var init_QrScanner = __esm({
32144
32460
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
32145
32461
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
32146
32462
  ),
32147
- "aria-label": isPaused ? "Resume scanning" : "Pause scanning",
32463
+ "aria-label": isPaused ? t("qrScanner.resumeScanning") : t("qrScanner.pauseScanning"),
32148
32464
  children: isPaused ? /* @__PURE__ */ jsx(Icon, { name: "play", className: "h-4 w-4" }) : /* @__PURE__ */ jsx(Icon, { name: "pause", className: "h-4 w-4" })
32149
32465
  }
32150
32466
  ),
@@ -32157,7 +32473,7 @@ var init_QrScanner = __esm({
32157
32473
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
32158
32474
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
32159
32475
  ),
32160
- "aria-label": `Switch to ${currentFacing === "environment" ? "front" : "rear"} camera`,
32476
+ "aria-label": currentFacing === "environment" ? t("qrScanner.switchToFrontCamera") : t("qrScanner.switchToRearCamera"),
32161
32477
  children: /* @__PURE__ */ jsx(Icon, { name: "refresh-cw", className: "h-4 w-4" })
32162
32478
  }
32163
32479
  ),
@@ -32171,7 +32487,7 @@ var init_QrScanner = __esm({
32171
32487
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
32172
32488
  ),
32173
32489
  "aria-label": t("aria.mockScanDev"),
32174
- children: "Mock Scan"
32490
+ children: t("qrScanner.mockScan")
32175
32491
  }
32176
32492
  )
32177
32493
  ]
@@ -32189,6 +32505,7 @@ var init_OptionConstraintGroup = __esm({
32189
32505
  "components/core/molecules/OptionConstraintGroup.tsx"() {
32190
32506
  init_cn();
32191
32507
  init_useEventBus();
32508
+ init_useTranslate();
32192
32509
  init_Typography();
32193
32510
  init_Box();
32194
32511
  init_Label();
@@ -32198,36 +32515,36 @@ var init_OptionConstraintGroup = __esm({
32198
32515
  const sign = delta >= 0 ? "+" : "-";
32199
32516
  return `${sign}$${Math.abs(delta).toFixed(2)}`;
32200
32517
  };
32201
- constraintHint = (constraint) => {
32518
+ constraintHint = (constraint, t) => {
32202
32519
  if (constraint.type === "single") {
32203
- return constraint.required ? "Required, pick 1" : "Optional, pick up to 1";
32520
+ return constraint.required ? t("optionConstraint.requiredOne") : t("optionConstraint.optionalOne");
32204
32521
  }
32205
32522
  const { min, max } = constraint;
32206
32523
  if (min && max) {
32207
- return min === max ? `Pick exactly ${min}` : `Pick ${min}-${max}`;
32524
+ return min === max ? t("optionConstraint.pickExactly", { count: min }) : t("optionConstraint.pickRange", { min, max });
32208
32525
  }
32209
- if (min) return `Pick at least ${min}`;
32210
- if (max) return `Pick up to ${max}`;
32211
- return "Optional";
32526
+ if (min) return t("optionConstraint.pickAtLeast", { count: min });
32527
+ if (max) return t("optionConstraint.pickUpTo", { count: max });
32528
+ return t("optionConstraint.optional");
32212
32529
  };
32213
- validateSelection = (selected, constraint) => {
32530
+ validateSelection = (selected, constraint, t) => {
32214
32531
  if (constraint.type === "single") {
32215
32532
  if (constraint.required && selected.length === 0) {
32216
- return "Pick 1 option";
32533
+ return t("optionConstraint.error.pickOne");
32217
32534
  }
32218
32535
  if (selected.length > 1) {
32219
- return "Pick only 1 option";
32536
+ return t("optionConstraint.error.pickOnlyOne");
32220
32537
  }
32221
32538
  return void 0;
32222
32539
  }
32223
32540
  const { min, max } = constraint;
32224
32541
  if (min !== void 0 && selected.length < min) {
32225
32542
  const remaining = min - selected.length;
32226
- return `Pick at least ${remaining} more`;
32543
+ return t("optionConstraint.error.pickMore", { count: remaining });
32227
32544
  }
32228
32545
  if (max !== void 0 && selected.length > max) {
32229
32546
  const excess = selected.length - max;
32230
- return `Remove ${excess} option${excess === 1 ? "" : "s"}`;
32547
+ return t("optionConstraint.error.removeOptions", { count: excess });
32231
32548
  }
32232
32549
  return void 0;
32233
32550
  };
@@ -32244,8 +32561,9 @@ var init_OptionConstraintGroup = __esm({
32244
32561
  className
32245
32562
  }) => {
32246
32563
  const eventBus = useEventBus();
32247
- const hint = constraintHint(constraint);
32248
- const error = validateSelection(selected, constraint);
32564
+ const { t } = useTranslate();
32565
+ const hint = constraintHint(constraint, t);
32566
+ const error = validateSelection(selected, constraint, t);
32249
32567
  const inputName = `option-${groupId}`;
32250
32568
  const labelTextSize = size === "sm" ? "text-sm" : "text-base";
32251
32569
  const optionGap = size === "sm" ? "gap-2" : "gap-2.5";
@@ -32345,7 +32663,7 @@ var init_OptionConstraintGroup = __esm({
32345
32663
  variant: "caption",
32346
32664
  color: "warning",
32347
32665
  className: "rounded border border-warning/40 px-1.5 py-0.5",
32348
- children: "Out of stock"
32666
+ children: t("optionConstraint.outOfStock")
32349
32667
  }
32350
32668
  )
32351
32669
  ]
@@ -32667,6 +32985,7 @@ function changeBlockType(block, type) {
32667
32985
  return { id: block.id, type, content: seed };
32668
32986
  }
32669
32987
  function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32988
+ const { t } = useTranslate();
32670
32989
  const [open, setOpen] = useState(false);
32671
32990
  const ref = useRef(null);
32672
32991
  useEffect(() => {
@@ -32686,7 +33005,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32686
33005
  {
32687
33006
  type: "button",
32688
33007
  variant: "ghost",
32689
- "aria-label": "Block actions",
33008
+ "aria-label": t("richBlockEditor.blockActions"),
32690
33009
  className: cn(
32691
33010
  "inline-flex items-center justify-center",
32692
33011
  "h-6 w-6 rounded-sm p-0 gap-0",
@@ -32708,7 +33027,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32708
33027
  "py-1 text-sm"
32709
33028
  ),
32710
33029
  children: [
32711
- /* @__PURE__ */ jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: BLOCK_TYPE_LABEL[block.type] }),
33030
+ /* @__PURE__ */ jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: t(BLOCK_TYPE_LABEL_KEY[block.type]) }),
32712
33031
  /* @__PURE__ */ jsxs(
32713
33032
  Button,
32714
33033
  {
@@ -32722,7 +33041,8 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32722
33041
  },
32723
33042
  children: [
32724
33043
  /* @__PURE__ */ jsx(Icon, { name: "plus", className: "w-3.5 h-3.5" }),
32725
- " Duplicate"
33044
+ " ",
33045
+ t("richBlockEditor.duplicate")
32726
33046
  ]
32727
33047
  }
32728
33048
  ),
@@ -32739,14 +33059,15 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32739
33059
  },
32740
33060
  children: [
32741
33061
  /* @__PURE__ */ jsx(Icon, { name: "trash", className: "w-3.5 h-3.5" }),
32742
- " Delete"
33062
+ " ",
33063
+ t("common.delete")
32743
33064
  ]
32744
33065
  }
32745
33066
  ),
32746
33067
  CHANGEABLE_TYPES.includes(block.type) && /* @__PURE__ */ jsxs(Fragment, { children: [
32747
33068
  /* @__PURE__ */ jsx(Box, { className: "my-1 border-t border-border" }),
32748
- /* @__PURE__ */ jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: "Turn into" }),
32749
- CHANGEABLE_TYPES.filter((t) => t !== block.type).map((t) => /* @__PURE__ */ jsx(
33069
+ /* @__PURE__ */ jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: t("richBlockEditor.turnInto") }),
33070
+ CHANGEABLE_TYPES.filter((bt) => bt !== block.type).map((bt) => /* @__PURE__ */ jsx(
32750
33071
  Button,
32751
33072
  {
32752
33073
  type: "button",
@@ -32754,12 +33075,12 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32754
33075
  role: "menuitem",
32755
33076
  className: "flex w-full items-center gap-2 px-2 py-1.5 text-left justify-start rounded-none",
32756
33077
  onClick: () => {
32757
- onChangeType(t);
33078
+ onChangeType(bt);
32758
33079
  setOpen(false);
32759
33080
  },
32760
- children: BLOCK_TYPE_LABEL[t]
33081
+ children: t(BLOCK_TYPE_LABEL_KEY[bt])
32761
33082
  },
32762
- t
33083
+ bt
32763
33084
  ))
32764
33085
  ] })
32765
33086
  ]
@@ -32821,6 +33142,7 @@ function BlockRow({
32821
33142
  onInsertAfter,
32822
33143
  onChangeType
32823
33144
  }) {
33145
+ const { t } = useTranslate();
32824
33146
  const setContent = useCallback(
32825
33147
  (next) => onUpdate((b) => ({ ...b, content: next })),
32826
33148
  [onUpdate]
@@ -32870,8 +33192,8 @@ function BlockRow({
32870
33192
  tag: "h1",
32871
33193
  value: block.content ?? "",
32872
33194
  readOnly,
32873
- placeholder: placeholder ?? "Heading 1",
32874
- ariaLabel: "Heading 1 block",
33195
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading1"),
33196
+ ariaLabel: t("richBlockEditor.aria.heading1Block"),
32875
33197
  className: "text-3xl font-bold leading-tight",
32876
33198
  onValueChange: setContent
32877
33199
  }
@@ -32883,8 +33205,8 @@ function BlockRow({
32883
33205
  tag: "h2",
32884
33206
  value: block.content ?? "",
32885
33207
  readOnly,
32886
- placeholder: placeholder ?? "Heading 2",
32887
- ariaLabel: "Heading 2 block",
33208
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading2"),
33209
+ ariaLabel: t("richBlockEditor.aria.heading2Block"),
32888
33210
  className: "text-2xl font-semibold leading-tight",
32889
33211
  onValueChange: setContent
32890
33212
  }
@@ -32896,8 +33218,8 @@ function BlockRow({
32896
33218
  tag: "h3",
32897
33219
  value: block.content ?? "",
32898
33220
  readOnly,
32899
- placeholder: placeholder ?? "Heading 3",
32900
- ariaLabel: "Heading 3 block",
33221
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading3"),
33222
+ ariaLabel: t("richBlockEditor.aria.heading3Block"),
32901
33223
  className: "text-xl font-semibold leading-tight",
32902
33224
  onValueChange: setContent
32903
33225
  }
@@ -32909,8 +33231,8 @@ function BlockRow({
32909
33231
  tag: "blockquote",
32910
33232
  value: block.content ?? "",
32911
33233
  readOnly,
32912
- placeholder: placeholder ?? "Quote",
32913
- ariaLabel: "Quote block",
33234
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.quote"),
33235
+ ariaLabel: t("richBlockEditor.aria.quoteBlock"),
32914
33236
  className: "border-l-4 border-primary/60 pl-4 italic text-muted-foreground",
32915
33237
  onValueChange: setContent
32916
33238
  }
@@ -32918,13 +33240,13 @@ function BlockRow({
32918
33240
  case "code":
32919
33241
  return /* @__PURE__ */ jsxs(Box, { className: "rounded-md border border-border bg-muted/40", children: [
32920
33242
  /* @__PURE__ */ jsxs(Box, { className: "flex items-center justify-between border-b border-border px-3 py-1 text-xs text-muted-foreground", children: [
32921
- /* @__PURE__ */ jsx(Typography, { as: "span", variant: "caption", className: "uppercase tracking-wide", children: "Code" }),
33243
+ /* @__PURE__ */ jsx(Typography, { as: "span", variant: "caption", className: "uppercase tracking-wide", children: t("richBlockEditor.blockType.code") }),
32922
33244
  !readOnly && /* @__PURE__ */ jsx(
32923
33245
  Input,
32924
33246
  {
32925
33247
  inputType: "text",
32926
33248
  value: String(block.metadata?.language ?? "plaintext"),
32927
- "aria-label": "Code language",
33249
+ "aria-label": t("richBlockEditor.aria.codeLanguage"),
32928
33250
  className: cn(
32929
33251
  "h-6 w-32 rounded-sm border border-border bg-background",
32930
33252
  "px-2 text-xs outline-none focus:ring-1 focus:ring-ring"
@@ -32940,8 +33262,8 @@ function BlockRow({
32940
33262
  tag: "pre",
32941
33263
  value: block.content ?? "",
32942
33264
  readOnly,
32943
- placeholder: placeholder ?? "Enter code",
32944
- ariaLabel: "Code block",
33265
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.code"),
33266
+ ariaLabel: t("richBlockEditor.aria.codeBlock"),
32945
33267
  className: "block whitespace-pre-wrap p-3 font-mono text-sm leading-relaxed",
32946
33268
  onValueChange: setContent
32947
33269
  }
@@ -32954,7 +33276,7 @@ function BlockRow({
32954
33276
  const caption = String(block.metadata?.caption ?? "");
32955
33277
  const imgProps = {
32956
33278
  src: url,
32957
- alt: caption || "Embedded image",
33279
+ alt: caption || t("richBlockEditor.embeddedImage"),
32958
33280
  className: "max-h-96 w-full rounded-md border border-border object-contain"
32959
33281
  };
32960
33282
  return /* @__PURE__ */ jsxs(Box, { className: "space-y-2", children: [
@@ -32968,7 +33290,8 @@ function BlockRow({
32968
33290
  ),
32969
33291
  children: [
32970
33292
  /* @__PURE__ */ jsx(Icon, { name: "image", className: "mr-2 w-4 h-4" }),
32971
- " No image URL set"
33293
+ " ",
33294
+ t("richBlockEditor.noImageUrl")
32972
33295
  ]
32973
33296
  }
32974
33297
  ),
@@ -32979,7 +33302,7 @@ function BlockRow({
32979
33302
  inputType: "url",
32980
33303
  value: url,
32981
33304
  placeholder: "https://example.com/image.png",
32982
- "aria-label": "Image URL",
33305
+ "aria-label": t("richBlockEditor.aria.imageUrl"),
32983
33306
  className: cn(
32984
33307
  "h-8 flex-1 rounded-sm border border-border bg-background",
32985
33308
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -32992,8 +33315,8 @@ function BlockRow({
32992
33315
  {
32993
33316
  inputType: "text",
32994
33317
  value: caption,
32995
- placeholder: "Caption (optional)",
32996
- "aria-label": "Image caption",
33318
+ placeholder: t("richBlockEditor.placeholder.caption"),
33319
+ "aria-label": t("richBlockEditor.aria.imageCaption"),
32997
33320
  className: cn(
32998
33321
  "h-8 flex-1 rounded-sm border border-border bg-background",
32999
33322
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -33024,8 +33347,8 @@ function BlockRow({
33024
33347
  tag: "span",
33025
33348
  value: child.content ?? "",
33026
33349
  readOnly,
33027
- placeholder: "List item",
33028
- ariaLabel: "List item",
33350
+ placeholder: t("richBlockEditor.placeholder.listItem"),
33351
+ ariaLabel: t("richBlockEditor.aria.listItem"),
33029
33352
  className: "inline-block min-w-[1ch] flex-1",
33030
33353
  onValueChange: (next) => setChildContent(child.id, next)
33031
33354
  }
@@ -33035,7 +33358,7 @@ function BlockRow({
33035
33358
  {
33036
33359
  type: "button",
33037
33360
  variant: "ghost",
33038
- "aria-label": "Remove list item",
33361
+ "aria-label": t("richBlockEditor.aria.removeListItem"),
33039
33362
  className: cn(
33040
33363
  "h-5 w-5 shrink-0 rounded-sm text-muted-foreground p-0 gap-0",
33041
33364
  "opacity-0 group-hover/item:opacity-100 hover:bg-muted hover:text-foreground"
@@ -33057,7 +33380,8 @@ function BlockRow({
33057
33380
  onClick: addListItem,
33058
33381
  children: [
33059
33382
  /* @__PURE__ */ jsx(Icon, { name: "plus", className: "w-3 h-3" }),
33060
- " Add item"
33383
+ " ",
33384
+ t("richBlockEditor.addItem")
33061
33385
  ]
33062
33386
  }
33063
33387
  ) })
@@ -33073,8 +33397,8 @@ function BlockRow({
33073
33397
  tag: "p",
33074
33398
  value: block.content ?? "",
33075
33399
  readOnly,
33076
- placeholder: placeholder ?? "Start writing...",
33077
- ariaLabel: "Paragraph block",
33400
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.paragraph"),
33401
+ ariaLabel: t("richBlockEditor.aria.paragraphBlock"),
33078
33402
  className: "leading-7",
33079
33403
  onValueChange: setContent
33080
33404
  }
@@ -33097,7 +33421,7 @@ function BlockRow({
33097
33421
  {
33098
33422
  type: "button",
33099
33423
  variant: "ghost",
33100
- "aria-label": "Insert paragraph below",
33424
+ "aria-label": t("richBlockEditor.insertParagraphBelow"),
33101
33425
  className: cn(
33102
33426
  "inline-flex h-6 w-6 items-center justify-center rounded-sm p-0 gap-0",
33103
33427
  "text-muted-foreground hover:bg-muted hover:text-foreground",
@@ -33124,7 +33448,7 @@ function BlockRow({
33124
33448
  }
33125
33449
  );
33126
33450
  }
33127
- var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES, RichBlockEditor;
33451
+ var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL_KEY, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES, RichBlockEditor;
33128
33452
  var init_RichBlockEditor = __esm({
33129
33453
  "components/core/molecules/RichBlockEditor.tsx"() {
33130
33454
  "use client";
@@ -33137,29 +33461,30 @@ var init_RichBlockEditor = __esm({
33137
33461
  init_Input();
33138
33462
  init_Icon();
33139
33463
  init_useEventBus();
33464
+ init_useTranslate();
33140
33465
  TOOLBAR_ENTRIES = [
33141
- { type: "paragraph", label: "Text", icon: Type },
33142
- { type: "heading-1", label: "H1", icon: Heading1 },
33143
- { type: "heading-2", label: "H2", icon: Heading2 },
33144
- { type: "heading-3", label: "H3", icon: Heading3 },
33145
- { type: "bullet-list", label: "Bullet list", icon: List },
33146
- { type: "numbered-list", label: "Numbered", icon: ListOrdered },
33147
- { type: "quote", label: "Quote", icon: Quote },
33148
- { type: "code", label: "Code", icon: Code },
33149
- { type: "divider", label: "Divider", icon: Minus },
33150
- { type: "image", label: "Image", icon: Image$1 }
33466
+ { type: "paragraph", labelKey: "richBlockEditor.toolbar.text", icon: Type },
33467
+ { type: "heading-1", labelKey: "richBlockEditor.toolbar.h1", icon: Heading1 },
33468
+ { type: "heading-2", labelKey: "richBlockEditor.toolbar.h2", icon: Heading2 },
33469
+ { type: "heading-3", labelKey: "richBlockEditor.toolbar.h3", icon: Heading3 },
33470
+ { type: "bullet-list", labelKey: "richBlockEditor.toolbar.bulletList", icon: List },
33471
+ { type: "numbered-list", labelKey: "richBlockEditor.toolbar.numbered", icon: ListOrdered },
33472
+ { type: "quote", labelKey: "richBlockEditor.toolbar.quote", icon: Quote },
33473
+ { type: "code", labelKey: "richBlockEditor.toolbar.code", icon: Code },
33474
+ { type: "divider", labelKey: "richBlockEditor.toolbar.divider", icon: Minus },
33475
+ { type: "image", labelKey: "richBlockEditor.toolbar.image", icon: Image$1 }
33151
33476
  ];
33152
- BLOCK_TYPE_LABEL = {
33153
- paragraph: "Text",
33154
- "heading-1": "Heading 1",
33155
- "heading-2": "Heading 2",
33156
- "heading-3": "Heading 3",
33157
- "bullet-list": "Bullet list",
33158
- "numbered-list": "Numbered list",
33159
- quote: "Quote",
33160
- code: "Code",
33161
- divider: "Divider",
33162
- image: "Image"
33477
+ BLOCK_TYPE_LABEL_KEY = {
33478
+ paragraph: "richBlockEditor.blockType.paragraph",
33479
+ "heading-1": "richBlockEditor.blockType.heading1",
33480
+ "heading-2": "richBlockEditor.blockType.heading2",
33481
+ "heading-3": "richBlockEditor.blockType.heading3",
33482
+ "bullet-list": "richBlockEditor.blockType.bulletList",
33483
+ "numbered-list": "richBlockEditor.blockType.numberedList",
33484
+ quote: "richBlockEditor.blockType.quote",
33485
+ code: "richBlockEditor.blockType.code",
33486
+ divider: "richBlockEditor.blockType.divider",
33487
+ image: "richBlockEditor.blockType.image"
33163
33488
  };
33164
33489
  CHANGEABLE_TYPES = [
33165
33490
  "paragraph",
@@ -33193,6 +33518,7 @@ var init_RichBlockEditor = __esm({
33193
33518
  showToolbar = true,
33194
33519
  className
33195
33520
  }) => {
33521
+ const { t } = useTranslate();
33196
33522
  const [blocks, setBlocks] = useState(
33197
33523
  () => normalizeBlocks(initialBlocks)
33198
33524
  );
@@ -33264,25 +33590,26 @@ var init_RichBlockEditor = __esm({
33264
33590
  Box,
33265
33591
  {
33266
33592
  role: "toolbar",
33267
- "aria-label": "Block editor toolbar",
33593
+ "aria-label": t("richBlockEditor.editorToolbar"),
33268
33594
  className: cn(
33269
33595
  "flex flex-wrap items-center gap-1",
33270
33596
  "border-b border-border bg-muted/30 px-2 py-2"
33271
33597
  ),
33272
33598
  children: TOOLBAR_ENTRIES.map((entry) => {
33273
33599
  const Icon3 = entry.icon;
33600
+ const entryLabel = t(entry.labelKey);
33274
33601
  return /* @__PURE__ */ jsxs(
33275
33602
  Button,
33276
33603
  {
33277
33604
  type: "button",
33278
33605
  variant: "ghost",
33279
33606
  size: "sm",
33280
- "aria-label": `Insert ${entry.label}`,
33281
- title: entry.label,
33607
+ "aria-label": t("richBlockEditor.insertEntry", { label: entryLabel }),
33608
+ title: entryLabel,
33282
33609
  onClick: () => handleAppend(entry.type),
33283
33610
  children: [
33284
33611
  /* @__PURE__ */ jsx(Icon3, { size: 14 }),
33285
- /* @__PURE__ */ jsx(Typography, { as: "span", variant: "caption", className: "ml-1 hidden text-xs sm:inline", children: entry.label })
33612
+ /* @__PURE__ */ jsx(Typography, { as: "span", variant: "caption", className: "ml-1 hidden text-xs sm:inline", children: entryLabel })
33286
33613
  ]
33287
33614
  },
33288
33615
  entry.type
@@ -33325,6 +33652,7 @@ var init_ReplyTree = __esm({
33325
33652
  "use client";
33326
33653
  init_cn();
33327
33654
  init_useEventBus();
33655
+ init_useTranslate();
33328
33656
  init_atoms2();
33329
33657
  init_VoteStack();
33330
33658
  ReplyTreeNode = ({
@@ -33344,6 +33672,7 @@ var init_ReplyTree = __esm({
33344
33672
  showActions
33345
33673
  }) => {
33346
33674
  const eventBus = useEventBus();
33675
+ const { t } = useTranslate();
33347
33676
  const hasReplies = !!node.replies && node.replies.length > 0;
33348
33677
  const isCollapsed = collapsedSet.has(node.id);
33349
33678
  const atMaxDepth = depth >= maxDepth;
@@ -33390,7 +33719,7 @@ var init_ReplyTree = __esm({
33390
33719
  variant: "ghost",
33391
33720
  size: "sm",
33392
33721
  onClick: handleToggle,
33393
- "aria-label": isCollapsed ? "Expand replies" : "Collapse replies",
33722
+ "aria-label": isCollapsed ? t("replyTree.expandReplies") : t("replyTree.collapseReplies"),
33394
33723
  "aria-expanded": !isCollapsed,
33395
33724
  leftIcon: isCollapsed ? "chevron-right" : "chevron-down",
33396
33725
  className: cn(
@@ -33431,7 +33760,7 @@ var init_ReplyTree = __esm({
33431
33760
  onVote: handleVote,
33432
33761
  size: "sm",
33433
33762
  variant: "horizontal",
33434
- label: `Vote on reply by ${node.authorName}`
33763
+ label: t("replyTree.voteOnReplyBy", { author: node.authorName })
33435
33764
  }
33436
33765
  ),
33437
33766
  /* @__PURE__ */ jsx(
@@ -33441,8 +33770,8 @@ var init_ReplyTree = __esm({
33441
33770
  size: "sm",
33442
33771
  leftIcon: "message-square",
33443
33772
  onClick: handleReply,
33444
- "aria-label": `Reply to ${node.authorName}`,
33445
- children: "Reply"
33773
+ "aria-label": t("replyTree.replyTo", { author: node.authorName }),
33774
+ children: t("replyTree.reply")
33446
33775
  }
33447
33776
  ),
33448
33777
  /* @__PURE__ */ jsx(
@@ -33452,8 +33781,8 @@ var init_ReplyTree = __esm({
33452
33781
  size: "sm",
33453
33782
  leftIcon: "flag",
33454
33783
  onClick: handleFlag,
33455
- "aria-label": `Flag reply by ${node.authorName}`,
33456
- children: "Flag"
33784
+ "aria-label": t("replyTree.flagReplyBy", { author: node.authorName }),
33785
+ children: t("replyTree.flag")
33457
33786
  }
33458
33787
  )
33459
33788
  ] }),
@@ -33464,9 +33793,9 @@ var init_ReplyTree = __esm({
33464
33793
  inputType: "textarea",
33465
33794
  rows: 2,
33466
33795
  value: draft,
33467
- placeholder: `Reply to ${node.authorName}\u2026`,
33796
+ placeholder: t("replyTree.replyToPlaceholder", { author: node.authorName }),
33468
33797
  onChange: (e) => setDraft(e.target.value),
33469
- "aria-label": `Reply to ${node.authorName}`
33798
+ "aria-label": t("replyTree.replyTo", { author: node.authorName })
33470
33799
  }
33471
33800
  ),
33472
33801
  /* @__PURE__ */ jsxs(Box, { className: "flex flex-row gap-2 items-center", children: [
@@ -33478,10 +33807,10 @@ var init_ReplyTree = __esm({
33478
33807
  leftIcon: "send",
33479
33808
  onClick: handleSubmitReply,
33480
33809
  disabled: !draft.trim(),
33481
- children: "Send"
33810
+ children: t("replyTree.send")
33482
33811
  }
33483
33812
  ),
33484
- /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: "Cancel" })
33813
+ /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: t("common.cancel") })
33485
33814
  ] })
33486
33815
  ] }),
33487
33816
  hasReplies && !isCollapsed && (atMaxDepth ? /* @__PURE__ */ jsx(
@@ -33495,7 +33824,7 @@ var init_ReplyTree = __esm({
33495
33824
  "self-start gap-1 px-0 h-auto",
33496
33825
  "text-sm text-primary hover:underline hover:bg-transparent"
33497
33826
  ),
33498
- children: "Continue thread"
33827
+ children: t("replyTree.continueThread")
33499
33828
  }
33500
33829
  ) : /* @__PURE__ */ jsx(Box, { className: "flex flex-col gap-2 mt-1", children: node.replies.map((child) => /* @__PURE__ */ jsx(
33501
33830
  ReplyTreeNode,
@@ -33534,6 +33863,7 @@ var init_ReplyTree = __esm({
33534
33863
  showActions = true,
33535
33864
  className
33536
33865
  }) => {
33866
+ const { t } = useTranslate();
33537
33867
  const nodeList = Array.isArray(nodes) ? nodes : nodes ? [nodes] : [];
33538
33868
  const [collapsedSet, setCollapsedSet] = useState(() => {
33539
33869
  const acc = /* @__PURE__ */ new Set();
@@ -33552,7 +33882,7 @@ var init_ReplyTree = __esm({
33552
33882
  });
33553
33883
  }, []);
33554
33884
  if (nodeList.length === 0) {
33555
- return /* @__PURE__ */ jsx(Box, { className: cn("text-sm text-muted-foreground", className), children: "No replies yet." });
33885
+ return /* @__PURE__ */ jsx(Box, { className: cn("text-sm text-muted-foreground", className), children: t("replyTree.noRepliesYet") });
33556
33886
  }
33557
33887
  return /* @__PURE__ */ jsx(Box, { className: cn("flex flex-col gap-2 min-w-0", className), children: nodeList.map((node) => /* @__PURE__ */ jsx(
33558
33888
  ReplyTreeNode,
@@ -33630,6 +33960,7 @@ var init_VersionDiff = __esm({
33630
33960
  "use client";
33631
33961
  init_cn();
33632
33962
  init_useEventBus();
33963
+ init_useTranslate();
33633
33964
  init_atoms2();
33634
33965
  init_Stack();
33635
33966
  INLINE_STYLES = {
@@ -33652,6 +33983,7 @@ var init_VersionDiff = __esm({
33652
33983
  language,
33653
33984
  className
33654
33985
  }) => {
33986
+ const { t } = useTranslate();
33655
33987
  const eventBus = useEventBus();
33656
33988
  const revisions = Array.isArray(revisionsProp) ? revisionsProp : [];
33657
33989
  const fallbackBefore = revisions[0]?.id ?? "";
@@ -33733,24 +34065,24 @@ var init_VersionDiff = __esm({
33733
34065
  children: [
33734
34066
  /* @__PURE__ */ jsxs(HStack, { gap: "sm", align: "center", className: "flex-wrap", children: [
33735
34067
  /* @__PURE__ */ jsx(Icon, { name: "git-commit", size: "sm", className: "text-muted-foreground" }),
33736
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "whitespace-nowrap", children: "Compare" }),
34068
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "whitespace-nowrap", children: t("versionDiff.compare") }),
33737
34069
  /* @__PURE__ */ jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsx(
33738
34070
  Select,
33739
34071
  {
33740
34072
  options,
33741
34073
  value: activeBeforeId,
33742
34074
  onChange: handleBeforeChange,
33743
- "aria-label": "Before revision"
34075
+ "aria-label": t("versionDiff.beforeRevision")
33744
34076
  }
33745
34077
  ) }),
33746
- /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: "to" }),
34078
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: t("versionDiff.to") }),
33747
34079
  /* @__PURE__ */ jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsx(
33748
34080
  Select,
33749
34081
  {
33750
34082
  options,
33751
34083
  value: activeAfterId,
33752
34084
  onChange: handleAfterChange,
33753
- "aria-label": "After revision"
34085
+ "aria-label": t("versionDiff.afterRevision")
33754
34086
  }
33755
34087
  ) }),
33756
34088
  language && /* @__PURE__ */ jsx(Badge, { variant: "default", children: language }),
@@ -33771,7 +34103,7 @@ var init_VersionDiff = __esm({
33771
34103
  size: "sm",
33772
34104
  icon: activeView === "side-by-side" ? "align-left" : "columns",
33773
34105
  onClick: handleViewToggle,
33774
- "aria-label": activeView === "side-by-side" ? "Switch to inline view" : "Switch to side-by-side view"
34106
+ "aria-label": activeView === "side-by-side" ? t("versionDiff.switchToInline") : t("versionDiff.switchToSideBySide")
33775
34107
  }
33776
34108
  ),
33777
34109
  (onRevert || revertEvent) && /* @__PURE__ */ jsx(
@@ -33781,7 +34113,7 @@ var init_VersionDiff = __esm({
33781
34113
  size: "sm",
33782
34114
  icon: "rotate-ccw",
33783
34115
  onClick: handleRevert,
33784
- children: "Revert"
34116
+ children: t("versionDiff.revert")
33785
34117
  }
33786
34118
  )
33787
34119
  ] })
@@ -33798,12 +34130,12 @@ var init_VersionDiff = __esm({
33798
34130
  children: [
33799
34131
  /* @__PURE__ */ jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
33800
34132
  beforeRev?.label,
33801
- beforeRev?.author ? ` by ${beforeRev.author}` : "",
34133
+ beforeRev?.author ? t("versionDiff.byAuthor", { author: beforeRev.author }) : "",
33802
34134
  beforeRev?.timestamp ? ` (${beforeRev.timestamp})` : ""
33803
34135
  ] }),
33804
34136
  /* @__PURE__ */ jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
33805
34137
  afterRev?.label,
33806
- afterRev?.author ? ` by ${afterRev.author}` : "",
34138
+ afterRev?.author ? t("versionDiff.byAuthor", { author: afterRev.author }) : "",
33807
34139
  afterRev?.timestamp ? ` (${afterRev.timestamp})` : ""
33808
34140
  ] })
33809
34141
  ]
@@ -34196,10 +34528,12 @@ var init_DocPagination = __esm({
34196
34528
  }
34197
34529
  });
34198
34530
  function DocSearch({
34199
- placeholder = "Search documentation...",
34531
+ placeholder,
34200
34532
  onSearch,
34201
34533
  className
34202
34534
  }) {
34535
+ const { t } = useTranslate();
34536
+ const resolvedPlaceholder = placeholder ?? t("docSearch.placeholder");
34203
34537
  const [query, setQuery] = useState("");
34204
34538
  const [results, setResults] = useState([]);
34205
34539
  const [isOpen, setIsOpen] = useState(false);
@@ -34306,7 +34640,7 @@ function DocSearch({
34306
34640
  Input,
34307
34641
  {
34308
34642
  inputType: "search",
34309
- placeholder,
34643
+ placeholder: resolvedPlaceholder,
34310
34644
  value: query,
34311
34645
  onChange: handleChange,
34312
34646
  onFocus: handleFocus,
@@ -34371,6 +34705,7 @@ var init_DocSearch = __esm({
34371
34705
  init_Typography();
34372
34706
  init_Icon();
34373
34707
  init_Input();
34708
+ init_useTranslate();
34374
34709
  }
34375
34710
  });
34376
34711
  var DocSidebarCategory, DocSidebar;
@@ -36375,8 +36710,8 @@ var init_SignaturePad = __esm({
36375
36710
  init_useEventBus();
36376
36711
  init_useTranslate();
36377
36712
  SignaturePad = ({
36378
- label = "Signature",
36379
- helperText = "Draw your signature above",
36713
+ label,
36714
+ helperText,
36380
36715
  strokeColor,
36381
36716
  strokeWidth = 2,
36382
36717
  height = 200,
@@ -36392,6 +36727,8 @@ var init_SignaturePad = __esm({
36392
36727
  }) => {
36393
36728
  const eventBus = useEventBus();
36394
36729
  const { t } = useTranslate();
36730
+ const resolvedLabel = label ?? t("signaturePad.label");
36731
+ const resolvedHelperText = helperText ?? t("signaturePad.helperText");
36395
36732
  const canvasRef = useRef(null);
36396
36733
  const [isDrawing, setIsDrawing] = useState(false);
36397
36734
  const [hasSignature, setHasSignature] = useState(!!value);
@@ -36494,7 +36831,7 @@ var init_SignaturePad = __esm({
36494
36831
  );
36495
36832
  }
36496
36833
  return /* @__PURE__ */ jsx(Card, { className: cn("p-4", className), children: /* @__PURE__ */ jsxs(VStack, { gap: "sm", children: [
36497
- label && /* @__PURE__ */ jsx(Typography, { variant: "label", weight: "medium", children: label }),
36834
+ resolvedLabel && /* @__PURE__ */ jsx(Typography, { variant: "label", weight: "medium", children: resolvedLabel }),
36498
36835
  /* @__PURE__ */ jsx(
36499
36836
  Box,
36500
36837
  {
@@ -36523,7 +36860,7 @@ var init_SignaturePad = __esm({
36523
36860
  )
36524
36861
  }
36525
36862
  ),
36526
- helperText && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: helperText }),
36863
+ resolvedHelperText && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: resolvedHelperText }),
36527
36864
  !readOnly && /* @__PURE__ */ jsxs(HStack, { gap: "sm", justify: "end", children: [
36528
36865
  /* @__PURE__ */ jsx(
36529
36866
  Button,
@@ -36533,7 +36870,7 @@ var init_SignaturePad = __esm({
36533
36870
  icon: Eraser,
36534
36871
  onClick: clearSignature,
36535
36872
  disabled: !hasSignature,
36536
- children: "Clear"
36873
+ children: t("signaturePad.clear")
36537
36874
  }
36538
36875
  ),
36539
36876
  signEvent && /* @__PURE__ */ jsx(
@@ -36544,7 +36881,7 @@ var init_SignaturePad = __esm({
36544
36881
  icon: Check,
36545
36882
  onClick: confirmSignature,
36546
36883
  disabled: !hasSignature,
36547
- children: "Confirm"
36884
+ children: t("signaturePad.confirm")
36548
36885
  }
36549
36886
  )
36550
36887
  ] })
@@ -40989,6 +41326,7 @@ function MasterDetail({
40989
41326
  className,
40990
41327
  ...rest
40991
41328
  }) {
41329
+ const { t } = useTranslate();
40992
41330
  const loading = externalLoading ?? false;
40993
41331
  const isLoading = externalIsLoading ?? false;
40994
41332
  const error = externalError ?? null;
@@ -41001,8 +41339,8 @@ function MasterDetail({
41001
41339
  isLoading: loading || isLoading,
41002
41340
  error,
41003
41341
  className,
41004
- emptyTitle: "No items found",
41005
- emptyDescription: "Create your first item to get started.",
41342
+ emptyTitle: t("table.empty.title"),
41343
+ emptyDescription: t("empty.createFirst"),
41006
41344
  ...rest
41007
41345
  }
41008
41346
  );
@@ -41011,6 +41349,7 @@ var init_MasterDetail = __esm({
41011
41349
  "components/core/organisms/MasterDetail.tsx"() {
41012
41350
  "use client";
41013
41351
  init_DataTable();
41352
+ init_useTranslate();
41014
41353
  MasterDetail.displayName = "MasterDetail";
41015
41354
  }
41016
41355
  });
@@ -41019,14 +41358,18 @@ var init_MasterDetailLayout = __esm({
41019
41358
  "components/core/organisms/layout/MasterDetailLayout.tsx"() {
41020
41359
  init_cn();
41021
41360
  init_Typography();
41022
- DefaultEmptyDetail = () => /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsx(
41023
- Typography,
41024
- {
41025
- variant: "body2",
41026
- className: "text-muted-foreground",
41027
- children: "Select an item to view details"
41028
- }
41029
- ) });
41361
+ init_useTranslate();
41362
+ DefaultEmptyDetail = () => {
41363
+ const { t } = useTranslate();
41364
+ return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsx(
41365
+ Typography,
41366
+ {
41367
+ variant: "body2",
41368
+ className: "text-muted-foreground",
41369
+ children: t("masterDetail.selectItem")
41370
+ }
41371
+ ) });
41372
+ };
41030
41373
  MasterDetailLayout = ({
41031
41374
  master,
41032
41375
  detail,
@@ -41153,7 +41496,7 @@ var init_MediaGallery = __esm({
41153
41496
  {
41154
41497
  icon: Image$1,
41155
41498
  title: t("display.noMedia"),
41156
- description: "No media items to display.",
41499
+ description: t("mediaGallery.noMediaDescription"),
41157
41500
  className
41158
41501
  }
41159
41502
  );
@@ -41170,7 +41513,7 @@ var init_MediaGallery = __esm({
41170
41513
  size: "sm",
41171
41514
  icon: Upload,
41172
41515
  action: "MEDIA_UPLOAD",
41173
- children: "Upload"
41516
+ children: t("mediaGallery.upload")
41174
41517
  }
41175
41518
  ),
41176
41519
  actions?.map((action, idx) => /* @__PURE__ */ jsx(
@@ -41184,10 +41527,7 @@ var init_MediaGallery = __esm({
41184
41527
  ))
41185
41528
  ] })
41186
41529
  ] }),
41187
- selectable && selectedItems.length > 0 && /* @__PURE__ */ jsx(HStack, { gap: "sm", align: "center", children: /* @__PURE__ */ jsxs(Badge, { variant: "info", children: [
41188
- selectedItems.length,
41189
- " selected"
41190
- ] }) }),
41530
+ selectable && selectedItems.length > 0 && /* @__PURE__ */ jsx(HStack, { gap: "sm", align: "center", children: /* @__PURE__ */ jsx(Badge, { variant: "info", children: t("table.bulk.selected", { count: selectedItems.length }) }) }),
41191
41531
  /* @__PURE__ */ jsx(
41192
41532
  Box,
41193
41533
  {
@@ -42061,7 +42401,7 @@ function TraitsTab({ traits: traits2 }) {
42061
42401
  EmptyState,
42062
42402
  {
42063
42403
  title: t("debug.noActiveTraits"),
42064
- description: "Traits will appear when components using them are mounted",
42404
+ description: t("debug.traitsMountHint"),
42065
42405
  className: "py-8"
42066
42406
  }
42067
42407
  );
@@ -42071,14 +42411,11 @@ function TraitsTab({ traits: traits2 }) {
42071
42411
  header: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 w-full", children: [
42072
42412
  /* @__PURE__ */ jsx(Typography, { variant: "body", weight: "semibold", className: "text-purple-600 dark:text-purple-400", children: trait.name }),
42073
42413
  /* @__PURE__ */ jsx(Badge, { variant: "success", size: "sm", children: trait.currentState }),
42074
- /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: [
42075
- trait.transitionCount,
42076
- " transitions"
42077
- ] })
42414
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: t("debug.transitionsCount", { count: trait.transitionCount }) })
42078
42415
  ] }),
42079
42416
  content: /* @__PURE__ */ jsxs(Stack, { gap: "sm", children: [
42080
42417
  /* @__PURE__ */ jsxs("div", { children: [
42081
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "States" }),
42418
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.states") }),
42082
42419
  /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: trait.states.map((state) => /* @__PURE__ */ jsx(
42083
42420
  Badge,
42084
42421
  {
@@ -42090,7 +42427,7 @@ function TraitsTab({ traits: traits2 }) {
42090
42427
  )) })
42091
42428
  ] }),
42092
42429
  trait.transitions.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
42093
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Transitions" }),
42430
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.transitions") }),
42094
42431
  /* @__PURE__ */ jsx(Stack, { gap: "xs", children: trait.transitions.map((t2, i) => /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "font-mono", children: [
42095
42432
  t2.from,
42096
42433
  " \u2192 ",
@@ -42109,7 +42446,7 @@ function TraitsTab({ traits: traits2 }) {
42109
42446
  ] }, i)) })
42110
42447
  ] }),
42111
42448
  trait.guards.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
42112
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Guards" }),
42449
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.guards") }),
42113
42450
  /* @__PURE__ */ jsx(Stack, { gap: "xs", children: trait.guards.map((g, i) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
42114
42451
  /* @__PURE__ */ jsx(Typography, { variant: "small", children: g.name }),
42115
42452
  /* @__PURE__ */ jsx(Badge, { variant: g.lastResult === true ? "success" : g.lastResult === false ? "danger" : "default", size: "sm", children: g.lastResult === void 0 ? "?" : g.lastResult ? "\u2713" : "\u2717" })
@@ -42215,7 +42552,7 @@ function EntitiesTab({ snapshot }) {
42215
42552
  EmptyState,
42216
42553
  {
42217
42554
  title: t("debug.noEntityData"),
42218
- description: "Debug mode may not be enabled",
42555
+ description: t("debug.debugModeHint"),
42219
42556
  className: "py-8"
42220
42557
  }
42221
42558
  );
@@ -42228,7 +42565,7 @@ function EntitiesTab({ snapshot }) {
42228
42565
  EmptyState,
42229
42566
  {
42230
42567
  title: t("debug.noEntities"),
42231
- description: "Entities will appear when spawned",
42568
+ description: t("debug.entitiesSpawnHint"),
42232
42569
  className: "py-8"
42233
42570
  }
42234
42571
  );
@@ -42236,7 +42573,7 @@ function EntitiesTab({ snapshot }) {
42236
42573
  const singletonItems = singletonEntries.map(([name, data]) => ({
42237
42574
  id: `singleton-${name}`,
42238
42575
  header: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
42239
- /* @__PURE__ */ jsx(Badge, { variant: "primary", size: "sm", children: "Singleton" }),
42576
+ /* @__PURE__ */ jsx(Badge, { variant: "primary", size: "sm", children: t("debug.singleton") }),
42240
42577
  /* @__PURE__ */ jsx(Typography, { variant: "body", weight: "semibold", className: "text-sky-600 dark:text-sky-400", children: name })
42241
42578
  ] }),
42242
42579
  content: /* @__PURE__ */ 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) })
@@ -42254,31 +42591,19 @@ function EntitiesTab({ snapshot }) {
42254
42591
  }));
42255
42592
  return /* @__PURE__ */ jsxs("div", { className: "debug-tab debug-tab--entities", children: [
42256
42593
  singletonItems.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
42257
- /* @__PURE__ */ jsxs(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
42258
- "Singletons (",
42259
- singletonItems.length,
42260
- ")"
42261
- ] }),
42594
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.singletonsCount", { count: singletonItems.length }) }),
42262
42595
  /* @__PURE__ */ jsx(Accordion, { items: singletonItems, multiple: true })
42263
42596
  ] }),
42264
42597
  runtimeItems.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
42265
- /* @__PURE__ */ jsxs(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
42266
- "Runtime (",
42267
- runtimeEntities.length,
42268
- ")"
42269
- ] }),
42598
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.runtimeCount", { count: runtimeEntities.length }) }),
42270
42599
  /* @__PURE__ */ jsx(Accordion, { items: runtimeItems, multiple: true }),
42271
- runtimeEntities.length > 20 && /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-gray-400 text-center mt-2", children: [
42272
- "+",
42273
- runtimeEntities.length - 20,
42274
- " more entities"
42275
- ] })
42600
+ runtimeEntities.length > 20 && /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-400 text-center mt-2", children: t("debug.moreEntities", { count: runtimeEntities.length - 20 }) })
42276
42601
  ] }),
42277
42602
  persistentEntries.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
42278
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Persistent" }),
42603
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.persistent") }),
42279
42604
  /* @__PURE__ */ jsx(Stack, { gap: "xs", children: persistentEntries.map(([type, info]) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between py-1", children: [
42280
42605
  /* @__PURE__ */ jsx(Typography, { variant: "small", children: type }),
42281
- /* @__PURE__ */ jsx(Badge, { variant: info.loaded ? "success" : "default", size: "sm", children: info.loaded ? `${info.count} loaded` : "not loaded" })
42606
+ /* @__PURE__ */ jsx(Badge, { variant: info.loaded ? "success" : "default", size: "sm", children: info.loaded ? t("debug.loadedCount", { count: info.count }) : t("debug.notLoaded") })
42282
42607
  ] }, type)) })
42283
42608
  ] })
42284
42609
  ] });
@@ -42322,7 +42647,7 @@ function EventFlowTab({ events: events2 }) {
42322
42647
  EmptyState,
42323
42648
  {
42324
42649
  title: t("debug.noEventsYet"),
42325
- description: "Events will appear as traits, ticks, and other systems execute",
42650
+ description: t("debug.eventsExecuteHint"),
42326
42651
  className: "py-8"
42327
42652
  }
42328
42653
  );
@@ -42333,17 +42658,13 @@ function EventFlowTab({ events: events2 }) {
42333
42658
  return /* @__PURE__ */ jsxs("div", { className: "debug-tab debug-tab--events", children: [
42334
42659
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mb-3 flex-wrap", children: [
42335
42660
  /* @__PURE__ */ jsxs(ButtonGroup, { children: [
42336
- /* @__PURE__ */ jsxs(
42661
+ /* @__PURE__ */ jsx(
42337
42662
  Button,
42338
42663
  {
42339
42664
  size: "sm",
42340
42665
  variant: filter === "all" ? "primary" : "secondary",
42341
42666
  onClick: () => setFilter("all"),
42342
- children: [
42343
- "All (",
42344
- events2.length,
42345
- ")"
42346
- ]
42667
+ children: t("debug.allCount", { count: events2.length })
42347
42668
  }
42348
42669
  ),
42349
42670
  eventTypes.map((type) => {
@@ -42373,7 +42694,7 @@ function EventFlowTab({ events: events2 }) {
42373
42694
  onChange: (e) => setAutoScroll(e.target.checked)
42374
42695
  }
42375
42696
  ),
42376
- "Auto-scroll"
42697
+ t("debug.autoScroll")
42377
42698
  ] })
42378
42699
  ] }),
42379
42700
  /* @__PURE__ */ jsx(
@@ -42431,7 +42752,7 @@ function GuardsPanel({ guards }) {
42431
42752
  EmptyState,
42432
42753
  {
42433
42754
  title: t("debug.noGuardEvaluations"),
42434
- description: "Guard evaluations will appear when transitions or ticks with guards execute",
42755
+ description: t("debug.guardEvaluationsHint"),
42435
42756
  className: "py-8"
42436
42757
  }
42437
42758
  );
@@ -42462,15 +42783,15 @@ function GuardsPanel({ guards }) {
42462
42783
  ] }),
42463
42784
  content: /* @__PURE__ */ jsxs(Stack, { gap: "sm", children: [
42464
42785
  /* @__PURE__ */ jsxs("div", { children: [
42465
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Expression" }),
42786
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.expression") }),
42466
42787
  /* @__PURE__ */ 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 })
42467
42788
  ] }),
42468
42789
  /* @__PURE__ */ jsxs("div", { children: [
42469
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Inputs" }),
42790
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.inputs") }),
42470
42791
  /* @__PURE__ */ 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) })
42471
42792
  ] }),
42472
42793
  /* @__PURE__ */ jsxs("div", { children: [
42473
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Trait" }),
42794
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.trait") }),
42474
42795
  /* @__PURE__ */ jsx(Typography, { variant: "small", children: guard.context.traitName })
42475
42796
  ] })
42476
42797
  ] })
@@ -42488,9 +42809,9 @@ function GuardsPanel({ guards }) {
42488
42809
  ] })
42489
42810
  ] }),
42490
42811
  /* @__PURE__ */ jsxs(ButtonGroup, { children: [
42491
- /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: "All" }),
42492
- /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: "Passed" }),
42493
- /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "failed" ? "primary" : "secondary", onClick: () => setFilter("failed"), children: "Failed" })
42812
+ /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: t("debug.filterAll") }),
42813
+ /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: t("debug.filterPassed") }),
42814
+ /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "failed" ? "primary" : "secondary", onClick: () => setFilter("failed"), children: t("debug.filterFailed") })
42494
42815
  ] })
42495
42816
  ] }),
42496
42817
  /* @__PURE__ */ jsx("div", { className: "max-h-80 overflow-y-auto", children: /* @__PURE__ */ jsx(Accordion, { items: accordionItems }) })
@@ -42616,7 +42937,7 @@ function TransitionTimeline({ transitions }) {
42616
42937
  EmptyState,
42617
42938
  {
42618
42939
  title: t("debug.noTransitionsRecorded"),
42619
- description: "Transitions will appear as the state machine processes events",
42940
+ description: t("debug.transitionsProcessHint"),
42620
42941
  className: "py-8"
42621
42942
  }
42622
42943
  );
@@ -42633,10 +42954,7 @@ function TransitionTimeline({ transitions }) {
42633
42954
  const sorted = [...transitions].reverse();
42634
42955
  return /* @__PURE__ */ jsxs("div", { className: "debug-tab debug-tab--timeline", children: [
42635
42956
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-2", children: [
42636
- /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-gray-500", children: [
42637
- transitions.length,
42638
- " transitions recorded"
42639
- ] }),
42957
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-500", children: t("debug.transitionsRecorded", { count: transitions.length }) }),
42640
42958
  /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-1 text-xs text-gray-500 cursor-pointer", children: [
42641
42959
  /* @__PURE__ */ jsx(
42642
42960
  Checkbox,
@@ -42645,7 +42963,7 @@ function TransitionTimeline({ transitions }) {
42645
42963
  onChange: (e) => setAutoScroll(e.target.checked)
42646
42964
  }
42647
42965
  ),
42648
- "Auto-scroll"
42966
+ t("debug.autoScroll")
42649
42967
  ] })
42650
42968
  ] }),
42651
42969
  /* @__PURE__ */ jsx(
@@ -42688,15 +43006,13 @@ function TransitionTimeline({ transitions }) {
42688
43006
  variant: trace.guardResult ? "success" : "danger",
42689
43007
  size: "sm",
42690
43008
  children: [
42691
- "guard: ",
43009
+ t("debug.guardLabel"),
43010
+ " ",
42692
43011
  trace.guardResult ? "\u2713" : "\u2717"
42693
43012
  ]
42694
43013
  }
42695
43014
  ),
42696
- /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: [
42697
- trace.effects.length,
42698
- " effects"
42699
- ] })
43015
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: t("debug.effectsCount", { count: trace.effects.length }) })
42700
43016
  ] }),
42701
43017
  isExpanded && trace.effects.length > 0 && /* @__PURE__ */ 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__ */ jsxs("div", { className: "flex items-center gap-1", children: [
42702
43018
  /* @__PURE__ */ jsx(EffectBadge, { effect }),
@@ -42745,13 +43061,13 @@ function ServerBridgeTab({ bridge }) {
42745
43061
  EmptyState,
42746
43062
  {
42747
43063
  title: t("debug.noBridgeData"),
42748
- description: "The ServerBridge has not been initialized. Bridge health will appear once the runtime connects to the server.",
43064
+ description: t("debug.bridgeInitHint"),
42749
43065
  className: "py-8"
42750
43066
  }
42751
43067
  );
42752
43068
  }
42753
43069
  const formatTime4 = (ts) => {
42754
- if (ts === 0) return "Never";
43070
+ if (ts === 0) return t("debug.never");
42755
43071
  const d = new Date(ts);
42756
43072
  return d.toLocaleTimeString("en-US", {
42757
43073
  hour12: false,
@@ -42764,14 +43080,14 @@ function ServerBridgeTab({ bridge }) {
42764
43080
  /* @__PURE__ */ jsxs(Card, { className: "p-3", children: [
42765
43081
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 mb-3", children: [
42766
43082
  /* @__PURE__ */ jsx("div", { className: `w-3 h-3 rounded-full ${bridge.connected ? "bg-green-500 animate-pulse" : "bg-red-500"}` }),
42767
- /* @__PURE__ */ jsx(Typography, { variant: "h6", children: bridge.connected ? "Connected" : "Disconnected" })
43083
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", children: bridge.connected ? t("debug.connected") : t("debug.disconnected") })
42768
43084
  ] }),
42769
43085
  /* @__PURE__ */ jsxs(Stack, { gap: "xs", children: [
42770
43086
  /* @__PURE__ */ jsx(
42771
43087
  StatRow,
42772
43088
  {
42773
43089
  label: t("debug.status"),
42774
- value: bridge.connected ? "Connected" : "Disconnected",
43090
+ value: bridge.connected ? t("debug.connected") : t("debug.disconnected"),
42775
43091
  variant: bridge.connected ? "success" : "danger"
42776
43092
  }
42777
43093
  ),
@@ -42799,13 +43115,10 @@ function ServerBridgeTab({ bridge }) {
42799
43115
  ] })
42800
43116
  ] }),
42801
43117
  bridge.lastError && /* @__PURE__ */ jsxs(Card, { className: "p-3 border-red-200 dark:border-red-800 bg-red-50 dark:bg-red-950", children: [
42802
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "semibold", className: "text-red-600 dark:text-red-400 mb-1", children: "Last Error" }),
43118
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "semibold", className: "text-red-600 dark:text-red-400 mb-1", children: t("debug.lastError") }),
42803
43119
  /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-red-500 font-mono break-all", children: bridge.lastError })
42804
43120
  ] }),
42805
- bridge.connected && /* @__PURE__ */ jsx("div", { className: "text-center py-2", children: /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-gray-400", children: [
42806
- bridge.eventsForwarded + bridge.eventsReceived,
42807
- " total events processed"
42808
- ] }) })
43121
+ bridge.connected && /* @__PURE__ */ jsx("div", { className: "text-center py-2", children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-400", children: t("debug.totalEventsProcessed", { count: bridge.eventsForwarded + bridge.eventsReceived }) }) })
42809
43122
  ] }) });
42810
43123
  }
42811
43124
  var init_ServerBridgeTab = __esm({
@@ -42915,7 +43228,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
42915
43228
  EmptyState,
42916
43229
  {
42917
43230
  title: t("debug.noActiveTraits"),
42918
- description: "Traits will appear when the state machine initializes",
43231
+ description: t("debug.traitsInitHint"),
42919
43232
  className: "py-8"
42920
43233
  }
42921
43234
  );
@@ -42932,7 +43245,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
42932
43245
  };
42933
43246
  return /* @__PURE__ */ jsxs("div", { className: "debug-tab debug-tab--dispatch", children: [
42934
43247
  /* @__PURE__ */ jsxs("div", { className: "mb-3", children: [
42935
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Active States" }),
43248
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.activeStates") }),
42936
43249
  /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: traits2.map((trait) => /* @__PURE__ */ jsxs(Badge, { variant: "success", size: "sm", children: [
42937
43250
  trait.name,
42938
43251
  ": ",
@@ -42940,8 +43253,8 @@ function EventDispatcherTab({ traits: traits2, schema }) {
42940
43253
  ] }, trait.id)) })
42941
43254
  ] }),
42942
43255
  /* @__PURE__ */ jsxs("div", { className: "mb-3", children: [
42943
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Available Events" }),
42944
- availableEvents.length === 0 ? /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-400 italic", children: "No transitions from current state" }) : /* @__PURE__ */ jsx(Stack, { gap: "xs", children: availableEvents.map(({ event, transitions }) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
43256
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.availableEvents") }),
43257
+ availableEvents.length === 0 ? /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-400 italic", children: t("debug.noTransitionsFromState") }) : /* @__PURE__ */ jsx(Stack, { gap: "xs", children: availableEvents.map(({ event, transitions }) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
42945
43258
  /* @__PURE__ */ jsx(
42946
43259
  Button,
42947
43260
  {
@@ -42953,15 +43266,15 @@ function EventDispatcherTab({ traits: traits2, schema }) {
42953
43266
  }
42954
43267
  ),
42955
43268
  /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-500", children: transitions.map((t2) => `${t2.from} -> ${t2.to}`).join(", ") }),
42956
- transitions.some((t2) => t2.guard) && /* @__PURE__ */ jsx(Badge, { variant: "warning", size: "sm", children: "guarded" })
43269
+ transitions.some((tr) => tr.guard) && /* @__PURE__ */ jsx(Badge, { variant: "warning", size: "sm", children: t("debug.guarded") })
42957
43270
  ] }, event)) })
42958
43271
  ] }),
42959
43272
  unavailableEvents.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mb-3", children: [
42960
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Other Events (not available from current state)" }),
43273
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.otherEvents") }),
42961
43274
  /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: unavailableEvents.map((event) => /* @__PURE__ */ jsx(Badge, { variant: "default", size: "sm", className: "opacity-50", children: event }, event)) })
42962
43275
  ] }),
42963
43276
  log12.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
42964
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Recent Transitions" }),
43277
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.recentTransitions") }),
42965
43278
  /* @__PURE__ */ jsx(Stack, { gap: "xs", children: log12.map((entry, i) => /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "font-mono text-xs", children: [
42966
43279
  /* @__PURE__ */ jsx("span", { className: "text-purple-400", children: entry.traitName }),
42967
43280
  " ",
@@ -42992,21 +43305,20 @@ var init_RuntimeDebugger = __esm({
42992
43305
  }
42993
43306
  });
42994
43307
  function ServerResponseRow({ sr }) {
43308
+ const { t } = useTranslate();
42995
43309
  const entityEntries = Object.entries(sr.dataEntities);
42996
43310
  return /* @__PURE__ */ jsxs("div", { className: "ml-4 pl-2 border-l border-purple-500/30 py-0.5 text-xs font-mono", children: [
42997
43311
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
42998
43312
  /* @__PURE__ */ jsxs("span", { className: sr.success ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400", children: [
42999
43313
  sr.success ? "\u2713" : "\u2717",
43000
- " server"
43314
+ " ",
43315
+ t("debug.server")
43001
43316
  ] }),
43002
43317
  /* @__PURE__ */ jsx("span", { className: "text-purple-600 dark:text-purple-300", children: sr.orbitalName }),
43003
- sr.clientEffects > 0 && /* @__PURE__ */ jsxs("span", { className: "px-1 rounded bg-purple-500/15 text-purple-600 dark:text-purple-300", children: [
43004
- sr.clientEffects,
43005
- " clientEffect",
43006
- sr.clientEffects !== 1 ? "s" : ""
43007
- ] }),
43318
+ sr.clientEffects > 0 && /* @__PURE__ */ jsx("span", { className: "px-1 rounded bg-purple-500/15 text-purple-600 dark:text-purple-300", children: t("debug.clientEffectsCount", { count: sr.clientEffects }) }),
43008
43319
  sr.emittedEvents.length > 0 && /* @__PURE__ */ jsxs("span", { className: "px-1 rounded bg-blue-500/15 text-blue-300", children: [
43009
- "emit: ",
43320
+ t("debug.emitLabel"),
43321
+ " ",
43010
43322
  sr.emittedEvents.join(", ")
43011
43323
  ] }),
43012
43324
  sr.error && /* @__PURE__ */ jsx("span", { className: "px-1 rounded bg-red-500/15 text-red-600 dark:text-red-400 truncate max-w-[300px]", children: sr.error })
@@ -43014,13 +43326,12 @@ function ServerResponseRow({ sr }) {
43014
43326
  entityEntries.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1 mt-0.5", children: entityEntries.map(([name, count]) => /* @__PURE__ */ jsxs("span", { className: "px-1 rounded bg-[var(--color-card)] text-foreground", children: [
43015
43327
  name,
43016
43328
  ": ",
43017
- count,
43018
- " row",
43019
- count !== 1 ? "s" : ""
43329
+ t("debug.rowsCount", { count })
43020
43330
  ] }, name)) })
43021
43331
  ] });
43022
43332
  }
43023
43333
  function TransitionRow({ trace }) {
43334
+ const { t } = useTranslate();
43024
43335
  const isServerEntry = !!trace.serverResponse && trace.traitName.startsWith("server:");
43025
43336
  const hasFailedEffects = trace.effects.some((e) => e.status === "failed");
43026
43337
  if (isServerEntry && trace.serverResponse) {
@@ -43028,7 +43339,7 @@ function TransitionRow({ trace }) {
43028
43339
  /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2 text-xs font-mono", children: [
43029
43340
  /* @__PURE__ */ jsx("span", { className: "mt-1.5 w-1.5 h-1.5 rounded-full flex-shrink-0 bg-purple-500" }),
43030
43341
  /* @__PURE__ */ jsx(Badge, { variant: "warning", size: "sm", className: "flex-shrink-0", children: trace.event }),
43031
- /* @__PURE__ */ jsx("span", { className: "text-purple-600 dark:text-purple-400 flex-shrink-0", children: "server response" })
43342
+ /* @__PURE__ */ jsx("span", { className: "text-purple-600 dark:text-purple-400 flex-shrink-0", children: t("debug.serverResponse") })
43032
43343
  ] }),
43033
43344
  /* @__PURE__ */ jsx(ServerResponseRow, { sr: trace.serverResponse })
43034
43345
  ] });
@@ -43069,6 +43380,7 @@ function VerifyModePanel({
43069
43380
  serverCount,
43070
43381
  localCount
43071
43382
  }) {
43383
+ const { t } = useTranslate();
43072
43384
  const [expanded, setExpanded] = React84.useState(true);
43073
43385
  const scrollRef = React84.useRef(null);
43074
43386
  const prevCountRef = React84.useRef(0);
@@ -43099,30 +43411,20 @@ function VerifyModePanel({
43099
43411
  onClick: () => setExpanded((v) => !v),
43100
43412
  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",
43101
43413
  "aria-expanded": expanded,
43102
- "aria-label": expanded ? "Collapse verification timeline" : "Expand verification timeline",
43414
+ "aria-label": expanded ? t("debug.collapseVerificationTimeline") : t("debug.expandVerificationTimeline"),
43103
43415
  "data-testid": "debugger-verify-toggle",
43104
43416
  children: [
43105
43417
  /* @__PURE__ */ jsx("span", { className: "text-foreground/50 w-3", "aria-hidden": true, children: expanded ? "\u25BE" : "\u25B8" }),
43106
- /* @__PURE__ */ jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? `${failedChecks} fail` : "OK" }),
43107
- /* @__PURE__ */ jsxs("span", { className: "text-foreground/70", children: [
43108
- localCount,
43109
- " local"
43110
- ] }),
43111
- /* @__PURE__ */ jsxs("span", { className: "text-purple-600 dark:text-purple-400", children: [
43112
- serverCount,
43113
- " server"
43114
- ] }),
43418
+ /* @__PURE__ */ jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? t("debug.failCount", { count: failedChecks }) : t("debug.ok") }),
43419
+ /* @__PURE__ */ jsx("span", { className: "text-foreground/70", children: t("debug.localCount", { count: localCount }) }),
43420
+ /* @__PURE__ */ jsx("span", { className: "text-purple-600 dark:text-purple-400", children: t("debug.serverCount", { count: serverCount }) }),
43115
43421
  traitStates && /* @__PURE__ */ jsx("span", { className: "text-cyan-600 dark:text-cyan-400 truncate max-w-[400px]", children: traitStates }),
43116
- !expanded && transitions.length > 0 && /* @__PURE__ */ jsxs("span", { className: "ml-auto text-foreground/50", children: [
43117
- transitions.length,
43118
- " transition",
43119
- transitions.length !== 1 ? "s" : ""
43120
- ] })
43422
+ !expanded && transitions.length > 0 && /* @__PURE__ */ jsx("span", { className: "ml-auto text-foreground/50", children: t("debug.transitionsCount", { count: transitions.length }) })
43121
43423
  ]
43122
43424
  }
43123
43425
  ),
43124
43426
  expanded && /* @__PURE__ */ jsxs("div", { className: "flex-1 flex overflow-hidden", children: [
43125
- /* @__PURE__ */ jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsx("div", { className: "px-2 py-1", children: transitions.length === 0 ? /* @__PURE__ */ jsx("div", { className: "text-foreground/50 text-xs font-mono py-2 text-center", children: "Waiting for transitions..." }) : /* @__PURE__ */ jsx("div", { className: "space-y-0.5", children: transitions.map((trace) => /* @__PURE__ */ jsx(TransitionRow, { trace }, trace.id)) }) }) }),
43427
+ /* @__PURE__ */ jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsx("div", { className: "px-2 py-1", children: transitions.length === 0 ? /* @__PURE__ */ jsx("div", { className: "text-foreground/50 text-xs font-mono py-2 text-center", children: t("debug.waitingForTransitions") }) : /* @__PURE__ */ jsx("div", { className: "space-y-0.5", children: transitions.map((trace) => /* @__PURE__ */ jsx(TransitionRow, { trace }, trace.id)) }) }) }),
43126
43428
  /* @__PURE__ */ jsx(WalkMinimap, {})
43127
43429
  ] })
43128
43430
  ]
@@ -43138,6 +43440,7 @@ function RuntimeDebugger({
43138
43440
  defaultTab,
43139
43441
  schema
43140
43442
  }) {
43443
+ const { t } = useTranslate();
43141
43444
  const [isCollapsed, setIsCollapsed] = React84.useState(mode === "verify" ? true : defaultCollapsed);
43142
43445
  const [isVisible, setIsVisible] = React84.useState(mode === "inline" || mode === "verify" || isDebugEnabled2());
43143
43446
  const debugData = useDebugData();
@@ -43176,55 +43479,55 @@ function RuntimeDebugger({
43176
43479
  const tabItems = [
43177
43480
  {
43178
43481
  id: "dispatch",
43179
- label: "Dispatch",
43482
+ label: t("debug.tabDispatch"),
43180
43483
  badge: debugData.traits.length || void 0,
43181
43484
  content: /* @__PURE__ */ jsx(EventDispatcherTab, { traits: debugData.traits, schema })
43182
43485
  },
43183
43486
  {
43184
43487
  id: "verify",
43185
- label: failedChecks > 0 ? "Verify (!)" : "Verify",
43488
+ label: failedChecks > 0 ? t("debug.tabVerifyAlert") : t("debug.tabVerify"),
43186
43489
  badge: verification.summary.totalChecks || void 0,
43187
43490
  content: /* @__PURE__ */ jsx(VerificationTab, { checks: verification.checks, summary: verification.summary })
43188
43491
  },
43189
43492
  {
43190
43493
  id: "timeline",
43191
- label: "Timeline",
43494
+ label: t("debug.tabTimeline"),
43192
43495
  badge: verification.transitions.length || void 0,
43193
43496
  content: /* @__PURE__ */ jsx(TransitionTimeline, { transitions: verification.transitions })
43194
43497
  },
43195
43498
  {
43196
43499
  id: "bridge",
43197
- label: "Bridge",
43500
+ label: t("debug.tabBridge"),
43198
43501
  badge: verification.bridge?.connected ? void 0 : 1,
43199
43502
  content: /* @__PURE__ */ jsx(ServerBridgeTab, { bridge: verification.bridge })
43200
43503
  },
43201
43504
  {
43202
43505
  id: "traits",
43203
- label: "Traits",
43506
+ label: t("debug.tabTraits"),
43204
43507
  badge: debugData.traits.length || void 0,
43205
43508
  content: /* @__PURE__ */ jsx(TraitsTab, { traits: debugData.traits })
43206
43509
  },
43207
43510
  {
43208
43511
  id: "ticks",
43209
- label: "Ticks",
43210
- badge: debugData.ticks.filter((t) => t.active).length || void 0,
43512
+ label: t("debug.tabTicks"),
43513
+ badge: debugData.ticks.filter((tick) => tick.active).length || void 0,
43211
43514
  content: /* @__PURE__ */ jsx(TicksTab, { ticks: debugData.ticks })
43212
43515
  },
43213
43516
  {
43214
43517
  id: "entities",
43215
- label: "Entities",
43518
+ label: t("debug.tabEntities"),
43216
43519
  badge: debugData.entitySnapshot?.runtime.length || void 0,
43217
43520
  content: /* @__PURE__ */ jsx(EntitiesTab, { snapshot: debugData.entitySnapshot })
43218
43521
  },
43219
43522
  {
43220
43523
  id: "events",
43221
- label: "Events",
43524
+ label: t("debug.tabEvents"),
43222
43525
  badge: debugData.events.length > 0 ? debugData.events.length : void 0,
43223
43526
  content: /* @__PURE__ */ jsx(EventFlowTab, { events: debugData.events })
43224
43527
  },
43225
43528
  {
43226
43529
  id: "guards",
43227
- label: "Guards",
43530
+ label: t("debug.tabGuards"),
43228
43531
  badge: debugData.guards.filter((g) => !g.result).length || void 0,
43229
43532
  content: /* @__PURE__ */ jsx(GuardsPanel, { guards: debugData.guards })
43230
43533
  }
@@ -43252,15 +43555,10 @@ function RuntimeDebugger({
43252
43555
  children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
43253
43556
  /* @__PURE__ */ jsxs(Typography, { variant: "h6", style: { fontSize: "0.75rem" }, children: [
43254
43557
  isCollapsed ? "\u25B6" : "\u25BC",
43255
- " Debugger"
43558
+ " ",
43559
+ t("debug.debugger")
43256
43560
  ] }),
43257
- failedChecks > 0 ? /* @__PURE__ */ jsxs(Badge, { variant: "danger", size: "sm", children: [
43258
- failedChecks,
43259
- " failed"
43260
- ] }) : debugData.traits.length > 0 ? /* @__PURE__ */ jsxs(Badge, { variant: "success", size: "sm", children: [
43261
- debugData.traits.length,
43262
- " traits"
43263
- ] }) : /* @__PURE__ */ jsx(Badge, { variant: "info", size: "sm", children: "Idle" })
43561
+ failedChecks > 0 ? /* @__PURE__ */ jsx(Badge, { variant: "danger", size: "sm", children: t("debug.failedCount", { count: failedChecks }) }) : debugData.traits.length > 0 ? /* @__PURE__ */ jsx(Badge, { variant: "success", size: "sm", children: t("debug.traitsCount", { count: debugData.traits.length }) }) : /* @__PURE__ */ jsx(Badge, { variant: "info", size: "sm", children: t("debug.idle") })
43264
43562
  ] })
43265
43563
  }
43266
43564
  ),
@@ -43278,9 +43576,9 @@ function RuntimeDebugger({
43278
43576
  );
43279
43577
  }
43280
43578
  if (mode === "verify") {
43281
- const traitStates = debugData.traits.map((t) => `${t.name}:${t.currentState}`).join(" | ");
43282
- const serverEntries = verification.transitions.filter((t) => t.serverResponse);
43283
- const localEntries = verification.transitions.filter((t) => !t.serverResponse);
43579
+ const traitStates = debugData.traits.map((t2) => `${t2.name}:${t2.currentState}`).join(" | ");
43580
+ const serverEntries = verification.transitions.filter((t2) => t2.serverResponse);
43581
+ const localEntries = verification.transitions.filter((t2) => !t2.serverResponse);
43284
43582
  return /* @__PURE__ */ jsx(
43285
43583
  VerifyModePanel,
43286
43584
  {
@@ -43312,7 +43610,7 @@ function RuntimeDebugger({
43312
43610
  variant: "secondary",
43313
43611
  size: "sm",
43314
43612
  className: "runtime-debugger__toggle",
43315
- title: "Open Debugger (`)",
43613
+ title: t("debug.openDebugger"),
43316
43614
  children: failedChecks > 0 ? /* @__PURE__ */ jsxs("span", { className: "relative", children: [
43317
43615
  /* @__PURE__ */ jsx("span", { children: "V" }),
43318
43616
  /* @__PURE__ */ jsx("span", { className: "absolute -top-1 -right-2 w-2 h-2 bg-red-500 rounded-full" })
@@ -43322,11 +43620,8 @@ function RuntimeDebugger({
43322
43620
  /* @__PURE__ */ jsxs("div", { className: "runtime-debugger__header", children: [
43323
43621
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
43324
43622
  /* @__PURE__ */ jsx("span", { className: "text-lg", children: "V" }),
43325
- /* @__PURE__ */ jsx(Typography, { variant: "h6", children: "KFlow Verifier" }),
43326
- failedChecks > 0 ? /* @__PURE__ */ jsxs(Badge, { variant: "danger", size: "sm", children: [
43327
- failedChecks,
43328
- " failed"
43329
- ] }) : verification.summary.totalChecks > 0 ? /* @__PURE__ */ jsx(Badge, { variant: "success", size: "sm", children: "All passing" }) : /* @__PURE__ */ jsx(Badge, { variant: "info", size: "sm", children: "Runtime" })
43623
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", children: t("debug.kflowVerifier") }),
43624
+ failedChecks > 0 ? /* @__PURE__ */ jsx(Badge, { variant: "danger", size: "sm", children: t("debug.failedCount", { count: failedChecks }) }) : verification.summary.totalChecks > 0 ? /* @__PURE__ */ jsx(Badge, { variant: "success", size: "sm", children: t("debug.allPassing") }) : /* @__PURE__ */ jsx(Badge, { variant: "info", size: "sm", children: t("debug.runtime") })
43330
43625
  ] }),
43331
43626
  /* @__PURE__ */ jsx(
43332
43627
  Button,
@@ -43334,7 +43629,7 @@ function RuntimeDebugger({
43334
43629
  onClick: () => setIsCollapsed(true),
43335
43630
  variant: "ghost",
43336
43631
  size: "sm",
43337
- title: "Close (`)",
43632
+ title: t("debug.close"),
43338
43633
  children: "x"
43339
43634
  }
43340
43635
  )
@@ -43348,7 +43643,7 @@ function RuntimeDebugger({
43348
43643
  className: "runtime-debugger__tabs"
43349
43644
  }
43350
43645
  ) }),
43351
- /* @__PURE__ */ jsx("div", { className: "runtime-debugger__footer", children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-foreground/50", children: "Press ` to toggle | window.__orbitalVerification for automation" }) })
43646
+ /* @__PURE__ */ jsx("div", { className: "runtime-debugger__footer", children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-foreground/50", children: t("debug.toggleHint") }) })
43352
43647
  ] })
43353
43648
  }
43354
43649
  );
@@ -43374,6 +43669,7 @@ var init_RuntimeDebugger2 = __esm({
43374
43669
  init_TransitionTimeline();
43375
43670
  init_ServerBridgeTab();
43376
43671
  init_EventDispatcherTab();
43672
+ init_useTranslate();
43377
43673
  init_RuntimeDebugger();
43378
43674
  RuntimeDebugger.displayName = "RuntimeDebugger";
43379
43675
  }
@@ -44662,7 +44958,7 @@ var init_StatCard = __esm({
44662
44958
  }
44663
44959
  );
44664
44960
  }
44665
- const label = schemaStats?.[0]?.label || labelToUse || "Stat";
44961
+ const label = schemaStats?.[0]?.label || labelToUse || t("statCard.defaultLabel");
44666
44962
  const normalizedPropValue = Array.isArray(propValue) ? propValue[0] ?? propValue.length : propValue;
44667
44963
  const value = schemaStats?.[0]?.value ?? normalizedPropValue ?? 0;
44668
44964
  const trendDirection = manualDirection || (calculatedTrend === void 0 || calculatedTrend === 0 ? "neutral" : calculatedTrend > 0 ? "up" : "down");
@@ -44705,7 +45001,7 @@ var init_StatCard = __esm({
44705
45001
  ]
44706
45002
  }
44707
45003
  ),
44708
- /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", as: "span", children: "vs last period" })
45004
+ /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", as: "span", children: t("statCard.vsLastPeriod") })
44709
45005
  ] }),
44710
45006
  subtitle && !calculatedTrend && /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", children: subtitle })
44711
45007
  ] }),