@almadar/ui 5.21.8 → 5.21.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -347,7 +347,10 @@ var en_default;
347
347
  var init_en = __esm({
348
348
  "locales/en.json"() {
349
349
  en_default = {
350
- $meta: { locale: "en", direction: "ltr" },
350
+ $meta: {
351
+ locale: "en",
352
+ direction: "ltr"
353
+ },
351
354
  "common.save": "Save",
352
355
  "common.cancel": "Cancel",
353
356
  "common.delete": "Delete",
@@ -489,7 +492,6 @@ var init_en = __esm({
489
492
  "error.somethingWentWrong": "Something went wrong",
490
493
  "error.loadingItems": "Loading items...",
491
494
  "error.noItemsFound": "No items found",
492
- "error.notFound": "Not found",
493
495
  "debug.noEntityData": "No entity data",
494
496
  "debug.noEntities": "No entities",
495
497
  "debug.noTicks": "No ticks registered",
@@ -521,7 +523,299 @@ var init_en = __esm({
521
523
  "template.showcase": "Showcase",
522
524
  "template.faq": "Frequently Asked Questions",
523
525
  "template.ourTeam": "Our Team",
524
- "template.caseStudies": "Case Studies"
526
+ "template.caseStudies": "Case Studies",
527
+ "richBlockEditor.toolbar.text": "Text",
528
+ "richBlockEditor.toolbar.h1": "H1",
529
+ "richBlockEditor.toolbar.h2": "H2",
530
+ "richBlockEditor.toolbar.h3": "H3",
531
+ "richBlockEditor.toolbar.bulletList": "Bullet list",
532
+ "richBlockEditor.toolbar.numbered": "Numbered",
533
+ "richBlockEditor.toolbar.quote": "Quote",
534
+ "richBlockEditor.toolbar.code": "Code",
535
+ "richBlockEditor.toolbar.divider": "Divider",
536
+ "richBlockEditor.toolbar.image": "Image",
537
+ "richBlockEditor.blockType.paragraph": "Text",
538
+ "richBlockEditor.blockType.heading1": "Heading 1",
539
+ "richBlockEditor.blockType.heading2": "Heading 2",
540
+ "richBlockEditor.blockType.heading3": "Heading 3",
541
+ "richBlockEditor.blockType.bulletList": "Bullet list",
542
+ "richBlockEditor.blockType.numberedList": "Numbered list",
543
+ "richBlockEditor.blockType.quote": "Quote",
544
+ "richBlockEditor.blockType.code": "Code",
545
+ "richBlockEditor.blockType.divider": "Divider",
546
+ "richBlockEditor.blockType.image": "Image",
547
+ "richBlockEditor.blockActions": "Block actions",
548
+ "richBlockEditor.duplicate": "Duplicate",
549
+ "richBlockEditor.turnInto": "Turn into",
550
+ "richBlockEditor.placeholder.heading1": "Heading 1",
551
+ "richBlockEditor.placeholder.heading2": "Heading 2",
552
+ "richBlockEditor.placeholder.heading3": "Heading 3",
553
+ "richBlockEditor.placeholder.quote": "Quote",
554
+ "richBlockEditor.placeholder.code": "Enter code",
555
+ "richBlockEditor.placeholder.paragraph": "Start writing...",
556
+ "richBlockEditor.placeholder.listItem": "List item",
557
+ "richBlockEditor.placeholder.caption": "Caption (optional)",
558
+ "richBlockEditor.aria.heading1Block": "Heading 1 block",
559
+ "richBlockEditor.aria.heading2Block": "Heading 2 block",
560
+ "richBlockEditor.aria.heading3Block": "Heading 3 block",
561
+ "richBlockEditor.aria.quoteBlock": "Quote block",
562
+ "richBlockEditor.aria.codeBlock": "Code block",
563
+ "richBlockEditor.aria.codeLanguage": "Code language",
564
+ "richBlockEditor.aria.imageUrl": "Image URL",
565
+ "richBlockEditor.aria.imageCaption": "Image caption",
566
+ "richBlockEditor.aria.listItem": "List item",
567
+ "richBlockEditor.aria.removeListItem": "Remove list item",
568
+ "richBlockEditor.aria.paragraphBlock": "Paragraph block",
569
+ "richBlockEditor.embeddedImage": "Embedded image",
570
+ "richBlockEditor.noImageUrl": "No image URL set",
571
+ "richBlockEditor.addItem": "Add item",
572
+ "richBlockEditor.insertParagraphBelow": "Insert paragraph below",
573
+ "richBlockEditor.editorToolbar": "Block editor toolbar",
574
+ "richBlockEditor.insertEntry": "Insert {{label}}",
575
+ "versionDiff.compare": "Compare",
576
+ "versionDiff.to": "to",
577
+ "versionDiff.beforeRevision": "Before revision",
578
+ "versionDiff.afterRevision": "After revision",
579
+ "versionDiff.switchToInline": "Switch to inline view",
580
+ "versionDiff.switchToSideBySide": "Switch to side-by-side view",
581
+ "versionDiff.revert": "Revert",
582
+ "versionDiff.byAuthor": " by {{author}}",
583
+ "violationAlert.actionType.measure": "Corrective Measure",
584
+ "violationAlert.actionType.admin": "Administrative Action",
585
+ "violationAlert.actionType.penalty": "Penalty Proceedings",
586
+ "violationAlert.fallbackMessage": "Violation",
587
+ "violationAlert.adminLabel": "Admin:",
588
+ "violationAlert.penaltyLabel": "Penalty:",
589
+ "violationAlert.goToField": "Go to field",
590
+ "branchingLogic.title": "Branching logic",
591
+ "branchingLogic.if": "If",
592
+ "branchingLogic.goTo": "go to",
593
+ "branchingLogic.rules": "Rules",
594
+ "branchingLogic.logicGraph": "Logic graph",
595
+ "branchingLogic.addRule": "Add rule",
596
+ "branchingLogic.deleteRule": "Delete rule",
597
+ "branchingLogic.endOfSurvey": "End of survey",
598
+ "branchingLogic.brokenReference": "Broken reference",
599
+ "branchingLogic.selectQuestion": "Select question",
600
+ "branchingLogic.selectTarget": "Select target",
601
+ "branchingLogic.selectValue": "Select value",
602
+ "branchingLogic.addValue": "Add value",
603
+ "branchingLogic.value": "Value",
604
+ "branchingLogic.typeValuePressEnter": "Type value, press Enter",
605
+ "branchingLogic.operatorEquals": "equals",
606
+ "branchingLogic.operatorNotEquals": "does not equal",
607
+ "branchingLogic.operatorContains": "contains",
608
+ "branchingLogic.operatorIn": "is one of",
609
+ "branchingLogic.graphAriaLabel": "Branching logic graph",
610
+ "branchingLogic.ruleCountOne": "{{count}} rule",
611
+ "branchingLogic.ruleCountOther": "{{count}} rules",
612
+ "branchingLogic.brokenCount": "{{count}} broken",
613
+ "branchingLogic.emptyNoQuestions": "Add questions before building branching rules.",
614
+ "branchingLogic.emptyNoRules": "No rules yet. Add a rule to define branching logic.",
615
+ "filterGroup.filters": "Filters",
616
+ "filterGroup.all": "All",
617
+ "filterGroup.clear": "Clear",
618
+ "filterGroup.clearAll": "Clear all",
619
+ "filterGroup.from": "From",
620
+ "filterGroup.to": "To",
621
+ "filterGroup.allOf": "All {{label}}",
622
+ "filterGroup.activeCount": "{{count}} active",
623
+ "debug.guardEvaluationsHint": "Guard evaluations will appear when transitions or ticks with guards execute",
624
+ "debug.expression": "Expression",
625
+ "debug.inputs": "Inputs",
626
+ "debug.trait": "Trait",
627
+ "debug.filterAll": "All",
628
+ "debug.filterPassed": "Passed",
629
+ "debug.filterFailed": "Failed",
630
+ "debug.traitsInitHint": "Traits will appear when the state machine initializes",
631
+ "debug.traitsMountHint": "Traits will appear when components using them are mounted",
632
+ "debug.activeStates": "Active States",
633
+ "debug.availableEvents": "Available Events",
634
+ "debug.noTransitionsFromState": "No transitions from current state",
635
+ "debug.guarded": "guarded",
636
+ "debug.otherEvents": "Other Events (not available from current state)",
637
+ "debug.recentTransitions": "Recent Transitions",
638
+ "debug.transitionsCount": "{{count}} transitions",
639
+ "debug.states": "States",
640
+ "debug.transitions": "Transitions",
641
+ "debug.guards": "Guards",
642
+ "debug.debugModeHint": "Debug mode may not be enabled",
643
+ "debug.entitiesSpawnHint": "Entities will appear when spawned",
644
+ "debug.singleton": "Singleton",
645
+ "debug.singletonsCount": "Singletons ({{count}})",
646
+ "debug.runtimeCount": "Runtime ({{count}})",
647
+ "debug.moreEntities": "+{{count}} more entities",
648
+ "debug.persistent": "Persistent",
649
+ "debug.loadedCount": "{{count}} loaded",
650
+ "debug.notLoaded": "not loaded",
651
+ "debug.eventsExecuteHint": "Events will appear as traits, ticks, and other systems execute",
652
+ "debug.allCount": "All ({{count}})",
653
+ "debug.autoScroll": "Auto-scroll",
654
+ "debug.transitionsProcessHint": "Transitions will appear as the state machine processes events",
655
+ "debug.transitionsRecorded": "{{count}} transitions recorded",
656
+ "debug.guardLabel": "guard:",
657
+ "debug.effectsCount": "{{count}} effects",
658
+ "debug.bridgeInitHint": "The ServerBridge has not been initialized. Bridge health will appear once the runtime connects to the server.",
659
+ "debug.never": "Never",
660
+ "debug.connected": "Connected",
661
+ "debug.disconnected": "Disconnected",
662
+ "debug.lastError": "Last Error",
663
+ "debug.totalEventsProcessed": "{{count}} total events processed",
664
+ "debug.server": "server",
665
+ "debug.clientEffectsCount": "{{count}} clientEffects",
666
+ "debug.emitLabel": "emit:",
667
+ "debug.rowsCount": "{{count}} rows",
668
+ "debug.serverResponse": "server response",
669
+ "debug.collapseVerificationTimeline": "Collapse verification timeline",
670
+ "debug.expandVerificationTimeline": "Expand verification timeline",
671
+ "debug.failCount": "{{count}} fail",
672
+ "debug.ok": "OK",
673
+ "debug.localCount": "{{count}} local",
674
+ "debug.serverCount": "{{count}} server",
675
+ "debug.waitingForTransitions": "Waiting for transitions...",
676
+ "debug.tabDispatch": "Dispatch",
677
+ "debug.tabVerify": "Verify",
678
+ "debug.tabVerifyAlert": "Verify (!)",
679
+ "debug.tabTimeline": "Timeline",
680
+ "debug.tabBridge": "Bridge",
681
+ "debug.tabTraits": "Traits",
682
+ "debug.tabTicks": "Ticks",
683
+ "debug.tabEntities": "Entities",
684
+ "debug.tabEvents": "Events",
685
+ "debug.tabGuards": "Guards",
686
+ "debug.debugger": "Debugger",
687
+ "debug.failedCount": "{{count}} failed",
688
+ "debug.traitsCount": "{{count}} traits",
689
+ "debug.idle": "Idle",
690
+ "debug.openDebugger": "Open Debugger (`)",
691
+ "debug.kflowVerifier": "KFlow Verifier",
692
+ "debug.allPassing": "All passing",
693
+ "debug.runtime": "Runtime",
694
+ "debug.close": "Close (`)",
695
+ "debug.toggleHint": "Press ` to toggle | window.__orbitalVerification for automation",
696
+ "replyTree.expandReplies": "Expand replies",
697
+ "replyTree.collapseReplies": "Collapse replies",
698
+ "replyTree.voteOnReplyBy": "Vote on reply by {{author}}",
699
+ "replyTree.replyTo": "Reply to {{author}}",
700
+ "replyTree.replyToPlaceholder": "Reply to {{author}}\u2026",
701
+ "replyTree.reply": "Reply",
702
+ "replyTree.flagReplyBy": "Flag reply by {{author}}",
703
+ "replyTree.flag": "Flag",
704
+ "replyTree.send": "Send",
705
+ "replyTree.continueThread": "Continue thread",
706
+ "replyTree.noRepliesYet": "No replies yet.",
707
+ "signaturePad.label": "Signature",
708
+ "signaturePad.helperText": "Draw your signature above",
709
+ "signaturePad.clear": "Clear",
710
+ "signaturePad.confirm": "Confirm",
711
+ "qrScanner.cameraUnavailable": "Camera unavailable",
712
+ "qrScanner.paused": "Paused",
713
+ "qrScanner.resumeScanning": "Resume scanning",
714
+ "qrScanner.pauseScanning": "Pause scanning",
715
+ "qrScanner.switchToFrontCamera": "Switch to front camera",
716
+ "qrScanner.switchToRearCamera": "Switch to rear camera",
717
+ "qrScanner.mockScan": "Mock Scan",
718
+ "docSearch.placeholder": "Search documentation...",
719
+ "stateMachine.loading": "Loading state machine\u2026",
720
+ "stateMachine.noStateMachine": "No state machine to visualize",
721
+ "avl.trigger": "Trigger",
722
+ "avl.guard": "Guard",
723
+ "avl.effects": "Effects",
724
+ "avl.props": "Props",
725
+ "avl.entity": "Entity",
726
+ "avl.traits": "Traits",
727
+ "avl.transition": "Transition",
728
+ "avl.onEntity": "on {{entity}}",
729
+ "avl.linkedTo": "linked to {{entity}}",
730
+ "avl.pressEscToZoomOut": "Press Esc to zoom out",
731
+ "avl.zoomIn": "Zoom in",
732
+ "avl.zoomOut": "Zoom out",
733
+ "avl.orbitalLabel": "Orbital: {{name}}",
734
+ "avl.orbitalLabelHighlighted": "Orbital: {{name}} (highlighted)",
735
+ "avl.noTraitData": "No trait data",
736
+ "avl.computingLayout": "Computing layout...",
737
+ "avl.noStateMachine": "No state machine",
738
+ "avl.listensFor": "listens for {{event}}",
739
+ "avl.emits": "emits {{event}}",
740
+ "avl.pageLayout": "Page Layout",
741
+ "avl.overlaySuffix": "(overlay)",
742
+ "orbPreview.previewBadge": "Preview",
743
+ "orbPreview.doubleClickToOpen": "Double-click to open",
744
+ "orbPreview.dropToAddAndOpen": "Drop to add and open",
745
+ "orbPreview.dispatching": "Coordinator is dispatching to this orbital",
746
+ "orbPreview.noPreview": "No preview available",
747
+ "orbPreview.screensCount": "{{count}} screens",
748
+ "detailView.noTransitionData": "No transition data",
749
+ "orbInspector.required": "req",
750
+ "orbInspector.addField": "Add Field",
751
+ "orbInspector.serviceMode": "Service Mode",
752
+ "orbInspector.standalone": "Standalone",
753
+ "orbInspector.embedded": "Embedded",
754
+ "orbInspector.rendersOwnUi": "Renders its own UI",
755
+ "orbInspector.headless": "Headless, wired to other behaviors",
756
+ "orbInspector.addEffect": "Add Effect",
757
+ "orbInspector.guardExpression": "Guard expression",
758
+ "orbInspector.selectPatternForStyles": "Select a pattern to view its style tokens.",
759
+ "orbInspector.tokens": "Tokens",
760
+ "orbInspector.noTokenContract": "No token contract declared for this pattern.",
761
+ "orbInspector.variant": "Variant",
762
+ "orbInspector.size": "Size",
763
+ "orbInspector.statesCount": "{{count}} states",
764
+ "orbInspector.onEntity": " on {{entity}}",
765
+ "orbInspector.projectThemeTokens": "Project theme tokens",
766
+ "orbInspector.tokenGroup.colors": "Colors",
767
+ "orbInspector.tokenGroup.radii": "Radii",
768
+ "orbInspector.tokenGroup.spacing": "Spacing",
769
+ "orbInspector.tokenGroup.shadows": "Shadows",
770
+ "orbInspector.tab.inspector": "Inspector",
771
+ "orbInspector.tab.styles": "Styles",
772
+ "orbInspector.tab.code": "Code",
773
+ "canvas.goBackToOverview": "Go back to overview",
774
+ "canvas.overview": "Overview",
775
+ "canvas.expanded": "Expanded",
776
+ "canvas.modulesCount": "{{count}} modules",
777
+ "canvas.screensCount": "{{count}} screens",
778
+ "canvas.switchToView": "Switch to {{label}} view",
779
+ "lawReference.viewFullText": "View full law text",
780
+ "statCard.defaultLabel": "Stat",
781
+ "statCard.vsLastPeriod": "vs last period",
782
+ "mediaGallery.upload": "Upload",
783
+ "mediaGallery.noMediaDescription": "No media items to display.",
784
+ "pagination.jumpPlaceholder": "Page",
785
+ "table.selectRow": "Select row {{id}}",
786
+ "card.selectItem": "Select {{item}}",
787
+ "card.itemFallback": "item",
788
+ "fileTree.noFiles": "No files",
789
+ "masterDetail.selectItem": "Select an item to view details",
790
+ "empty.createFirst": "Create your first item to get started.",
791
+ "upload.dropOrBrowse": "Drop files here or click to browse",
792
+ "upload.dropFilesHere": "Drop files here",
793
+ "upload.accepted": "Accepted: {{accept}}",
794
+ "upload.maxSize": "Max size: {{size}}",
795
+ "upload.maxFiles": "Up to {{count}} files",
796
+ "upload.error.maxFiles": "Maximum {{count}} files allowed",
797
+ "upload.error.invalidType": "Invalid file type: {{name}}",
798
+ "upload.error.tooLarge": "File too large: {{name}} (max {{size}})",
799
+ "optionConstraint.requiredOne": "Required, pick 1",
800
+ "optionConstraint.optionalOne": "Optional, pick up to 1",
801
+ "optionConstraint.pickExactly": "Pick exactly {{count}}",
802
+ "optionConstraint.pickRange": "Pick {{min}}-{{max}}",
803
+ "optionConstraint.pickAtLeast": "Pick at least {{count}}",
804
+ "optionConstraint.pickUpTo": "Pick up to {{count}}",
805
+ "optionConstraint.optional": "Optional",
806
+ "optionConstraint.outOfStock": "Out of stock",
807
+ "optionConstraint.error.pickOne": "Pick 1 option",
808
+ "optionConstraint.error.pickOnlyOne": "Pick only 1 option",
809
+ "optionConstraint.error.pickMore": "Pick at least {{count}} more",
810
+ "optionConstraint.error.removeOptions": "Remove {{count}} options",
811
+ "stateMachine.pinned": "Pinned",
812
+ "stateMachine.eventCount": "{{count}} events",
813
+ "stateMachine.externalEffects": "External Effects",
814
+ "stateMachine.legend.initial": "Initial",
815
+ "stateMachine.legend.final": "Final",
816
+ "stateMachine.legend.state": "State",
817
+ "stateMachine.legend.multiEvent": "Multi-event",
818
+ "relationSelect.selectPlaceholder": "Select..."
525
819
  };
526
820
  }
527
821
  });
@@ -5504,6 +5798,7 @@ var init_LawReferenceTooltip = __esm({
5504
5798
  init_Typography();
5505
5799
  init_Divider();
5506
5800
  init_cn();
5801
+ init_useTranslate();
5507
5802
  positionStyles2 = {
5508
5803
  top: "bottom-full left-1/2 -translate-x-1/2 mb-2",
5509
5804
  bottom: "top-full left-1/2 -translate-x-1/2 mt-2",
@@ -5522,6 +5817,7 @@ var init_LawReferenceTooltip = __esm({
5522
5817
  position = "top",
5523
5818
  className
5524
5819
  }) => {
5820
+ const { t } = useTranslate();
5525
5821
  const [isVisible, setIsVisible] = React84__namespace.default.useState(false);
5526
5822
  const timeoutRef = React84__namespace.default.useRef(null);
5527
5823
  const handleMouseEnter = () => {
@@ -5605,7 +5901,7 @@ var init_LawReferenceTooltip = __esm({
5605
5901
  target: "_blank",
5606
5902
  rel: "noopener noreferrer",
5607
5903
  onClick: (e) => e.stopPropagation(),
5608
- children: "View full law text"
5904
+ children: t("lawReference.viewFullText")
5609
5905
  }
5610
5906
  )
5611
5907
  ] }),
@@ -13507,6 +13803,7 @@ var log6, SWIM_GUTTER, CENTER_W, BehaviorView;
13507
13803
  var init_BehaviorView = __esm({
13508
13804
  "components/avl/molecules/BehaviorView.tsx"() {
13509
13805
  "use client";
13806
+ init_useTranslate();
13510
13807
  init_AvlState();
13511
13808
  init_AvlTransitionLane();
13512
13809
  init_AvlSwimLane();
@@ -13516,6 +13813,7 @@ var init_BehaviorView = __esm({
13516
13813
  SWIM_GUTTER = 120;
13517
13814
  CENTER_W = 360;
13518
13815
  BehaviorView = ({ data }) => {
13816
+ const { t } = useTranslate();
13519
13817
  const [layout, setLayout] = React84.useState(null);
13520
13818
  const traitName = data.traits[0]?.name;
13521
13819
  const traitData = traitName ? data.traitDetails[traitName] : void 0;
@@ -13525,10 +13823,10 @@ var init_BehaviorView = __esm({
13525
13823
  computeTraitLayout(traitData).then(setLayout).catch((err) => log6.error("compute-trait-layout-failed", { error: err instanceof Error ? err : String(err) }));
13526
13824
  }, [dataKey]);
13527
13825
  if (!traitData) {
13528
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: "No trait data" });
13826
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: t("avl.noTraitData") });
13529
13827
  }
13530
13828
  if (!layout) {
13531
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: "Computing layout..." });
13829
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: t("avl.computingLayout") });
13532
13830
  }
13533
13831
  const hasExternal = traitData.listenedEvents.length > 0 || traitData.emittedEvents.length > 0;
13534
13832
  const viewW = hasExternal ? SWIM_GUTTER + CENTER_W + SWIM_GUTTER : CENTER_W + 60;
@@ -13544,10 +13842,7 @@ var init_BehaviorView = __esm({
13544
13842
  const machineHeight = scaledH + 100;
13545
13843
  const renderMachine = /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
13546
13844
  /* @__PURE__ */ jsxRuntime.jsx("text", { x: CENTER_W / 2, y: 20, textAnchor: "middle", fill: "var(--color-foreground)", fontSize: 18, fontWeight: "700", fontFamily: "inherit", children: traitData.name }),
13547
- /* @__PURE__ */ jsxRuntime.jsxs("text", { x: CENTER_W / 2, y: 36, textAnchor: "middle", fill: "var(--color-muted-foreground)", fontSize: 11, opacity: 0.5, fontFamily: "inherit", children: [
13548
- "on ",
13549
- traitData.linkedEntity
13550
- ] }),
13845
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: CENTER_W / 2, y: 36, textAnchor: "middle", fill: "var(--color-muted-foreground)", fontSize: 11, opacity: 0.5, fontFamily: "inherit", children: t("avl.onEntity", { entity: traitData.linkedEntity }) }),
13551
13846
  /* @__PURE__ */ jsxRuntime.jsxs("defs", { children: [
13552
13847
  /* @__PURE__ */ jsxRuntime.jsx("marker", { id: "bvArrow", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: CONNECTION_COLORS.forward.color, opacity: 0.7 }) }),
13553
13848
  /* @__PURE__ */ jsxRuntime.jsx("marker", { id: "bvArrowBack", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: CONNECTION_COLORS.backward.color, opacity: 0.5 }) })
@@ -13855,7 +14150,7 @@ var init_CodeBlock = __esm({
13855
14150
  const isLolo = language === "lolo";
13856
14151
  const activeStyle = isOrb ? orbStyle : isLolo ? loloStyle : dark__default.default;
13857
14152
  const eventBus = useEventBus();
13858
- const { t: _t } = useTranslate();
14153
+ const { t } = useTranslate();
13859
14154
  const scrollRef = React84.useRef(null);
13860
14155
  const codeRef = React84.useRef(null);
13861
14156
  const savedScrollLeftRef = React84.useRef(0);
@@ -14110,7 +14405,7 @@ var init_CodeBlock = __esm({
14110
14405
  size: "sm",
14111
14406
  onClick: handleCopy,
14112
14407
  className: "opacity-0 group-hover:opacity-100 focus:opacity-100 transition-opacity text-muted-foreground hover:text-white",
14113
- "aria-label": "Copy code",
14408
+ "aria-label": t("common.copy"),
14114
14409
  children: copied ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "check", className: "w-4 h-4 text-green-400" }) : /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "copy", className: "w-4 h-4" })
14115
14410
  }
14116
14411
  )
@@ -14715,7 +15010,7 @@ var init_StateMachineView = __esm({
14715
15010
  const endX2 = fromState.x + Math.cos(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
14716
15011
  const endY2 = fromState.y + Math.sin(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
14717
15012
  const isSingle2 = bundle.labels.length === 1;
14718
- const labelText2 = isSingle2 ? bundle.labels[0].event : `${bundle.labels.length} events`;
15013
+ const labelText2 = isSingle2 ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
14719
15014
  const bundleColor2 = isSingle2 ? config.colors.arrow : "var(--color-accent)";
14720
15015
  const labelWidth2 = labelText2.length * 9 + (isSingle2 ? 24 : 40);
14721
15016
  const cx = fromState.x;
@@ -14841,7 +15136,7 @@ var init_StateMachineView = __esm({
14841
15136
  const controlX = midX + perpX;
14842
15137
  const controlY = midY + perpY;
14843
15138
  const isSingle = bundle.labels.length === 1;
14844
- const labelText = isSingle ? bundle.labels[0].event : `${bundle.labels.length} events`;
15139
+ const labelText = isSingle ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
14845
15140
  const labelWidth = labelText.length * 9 + (isSingle ? 24 : 40);
14846
15141
  const bundleColor = isSingle ? config.colors.arrow : "var(--color-accent)";
14847
15142
  const curveMidpoint = {
@@ -14996,7 +15291,7 @@ var init_StateMachineView = __esm({
14996
15291
  {
14997
15292
  className: "absolute -top-2 left-1/2 transform -translate-x-1/2 px-2 py-0.5 rounded-full",
14998
15293
  style: { backgroundColor: "var(--color-success)" },
14999
- children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: "Pinned" })
15294
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: t("stateMachine.pinned") })
15000
15295
  }
15001
15296
  ),
15002
15297
  !isSingle && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -15018,10 +15313,7 @@ var init_StateMachineView = __esm({
15018
15313
  {
15019
15314
  className: "ml-2 px-2 py-0.5 rounded-full",
15020
15315
  style: { backgroundColor: "var(--color-accent)" },
15021
- children: /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: [
15022
- bundle.labels.length,
15023
- " events"
15024
- ] })
15316
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: t("stateMachine.eventCount", { count: bundle.labels.length }) })
15025
15317
  }
15026
15318
  )
15027
15319
  ]
@@ -15166,7 +15458,7 @@ var init_StateMachineView = __esm({
15166
15458
  align: "center",
15167
15459
  className: "mb-2",
15168
15460
  style: { color: "var(--color-warning)", fontSize: "13px" },
15169
- children: "External Effects"
15461
+ children: t("stateMachine.externalEffects")
15170
15462
  }
15171
15463
  ),
15172
15464
  outputs.outputs.map((output, idx) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -15186,10 +15478,10 @@ var init_StateMachineView = __esm({
15186
15478
  Legend = ({ config, y }) => {
15187
15479
  const { t } = useTranslate();
15188
15480
  const items = [
15189
- { label: "Initial", color: config.colors.initialNode },
15190
- { label: "Final", color: config.colors.finalNode },
15191
- { label: "State", color: config.colors.nodeBorder },
15192
- { label: "Multi-event", color: "var(--color-accent)" }
15481
+ { key: "initial", label: t("stateMachine.legend.initial"), color: config.colors.initialNode, isMultiEvent: false },
15482
+ { key: "final", label: t("stateMachine.legend.final"), color: config.colors.finalNode, isMultiEvent: false },
15483
+ { key: "state", label: t("stateMachine.legend.state"), color: config.colors.nodeBorder, isMultiEvent: false },
15484
+ { key: "multiEvent", label: t("stateMachine.legend.multiEvent"), color: "var(--color-accent)", isMultiEvent: true }
15193
15485
  ];
15194
15486
  return /* @__PURE__ */ jsxRuntime.jsx(
15195
15487
  HStack,
@@ -15204,8 +15496,8 @@ var init_StateMachineView = __esm({
15204
15496
  {
15205
15497
  className: "w-3 h-3 rounded-full",
15206
15498
  style: {
15207
- backgroundColor: item.label === "Multi-event" ? item.color : config.colors.node,
15208
- border: item.label !== "Multi-event" ? `2px solid ${item.color}` : "none"
15499
+ backgroundColor: item.isMultiEvent ? item.color : config.colors.node,
15500
+ border: !item.isMultiEvent ? `2px solid ${item.color}` : "none"
15209
15501
  }
15210
15502
  }
15211
15503
  ),
@@ -15217,7 +15509,7 @@ var init_StateMachineView = __esm({
15217
15509
  children: item.label
15218
15510
  }
15219
15511
  )
15220
- ] }, item.label))
15512
+ ] }, item.key))
15221
15513
  }
15222
15514
  );
15223
15515
  };
@@ -16011,13 +16303,13 @@ var init_JazariStateMachine = __esm({
16011
16303
  );
16012
16304
  }, [resolvedTrait, entityFields]);
16013
16305
  if (isLoading) {
16014
- return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: "Loading state machine\u2026" });
16306
+ return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: t("stateMachine.loading") });
16015
16307
  }
16016
16308
  if (error) {
16017
16309
  return /* @__PURE__ */ jsxRuntime.jsx(ErrorState, { message: error instanceof Error ? error.message : String(error) });
16018
16310
  }
16019
16311
  if (!resolvedTrait || !layoutData || layoutData.states.length === 0) {
16020
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { padding: "lg", className: cn("text-center", className), children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", className: "opacity-60", children: "No state machine to visualize" }) });
16312
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { padding: "lg", className: cn("text-center", className), children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", className: "opacity-60", children: t("stateMachine.noStateMachine") }) });
16021
16313
  }
16022
16314
  return /* @__PURE__ */ jsxRuntime.jsx(
16023
16315
  StateMachineView,
@@ -17061,13 +17353,13 @@ var init_LayoutPatterns = __esm({
17061
17353
  function generateRuleId() {
17062
17354
  return `rule-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
17063
17355
  }
17064
- function questionsToOptions(questions, includeEndOfSurvey) {
17356
+ function questionsToOptions(questions, endOfSurveyLabel) {
17065
17357
  const opts = questions.map((q) => ({
17066
17358
  value: q.id,
17067
17359
  label: q.label
17068
17360
  }));
17069
- if (includeEndOfSurvey) {
17070
- opts.push({ value: END_OF_SURVEY, label: "End of survey" });
17361
+ if (endOfSurveyLabel !== null) {
17362
+ opts.push({ value: END_OF_SURVEY, label: endOfSurveyLabel });
17071
17363
  }
17072
17364
  return opts;
17073
17365
  }
@@ -17076,7 +17368,7 @@ function isRuleBroken(rule, questions) {
17076
17368
  const targetExists = rule.targetQuestionId === END_OF_SURVEY || questions.some((q) => q.id === rule.targetQuestionId);
17077
17369
  return !sourceExists || !targetExists;
17078
17370
  }
17079
- var END_OF_SURVEY, OPERATOR_OPTIONS, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph, BranchingLogicBuilder;
17371
+ var END_OF_SURVEY, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph, BranchingLogicBuilder;
17080
17372
  var init_BranchingLogicBuilder = __esm({
17081
17373
  "components/core/molecules/BranchingLogicBuilder.tsx"() {
17082
17374
  "use client";
@@ -17089,14 +17381,9 @@ var init_BranchingLogicBuilder = __esm({
17089
17381
  init_FilterPill();
17090
17382
  init_Box();
17091
17383
  init_useEventBus();
17384
+ init_useTranslate();
17092
17385
  init_cn();
17093
17386
  END_OF_SURVEY = "end-of-survey";
17094
- OPERATOR_OPTIONS = [
17095
- { value: "equals", label: "equals" },
17096
- { value: "not-equals", label: "does not equal" },
17097
- { value: "contains", label: "contains" },
17098
- { value: "in", label: "is one of" }
17099
- ];
17100
17387
  RuleRow = ({
17101
17388
  rule,
17102
17389
  questions,
@@ -17105,8 +17392,21 @@ var init_BranchingLogicBuilder = __esm({
17105
17392
  onChange,
17106
17393
  onDelete
17107
17394
  }) => {
17108
- const sourceOptions = React84.useMemo(() => questionsToOptions(questions, false), [questions]);
17109
- const targetOptions = React84.useMemo(() => questionsToOptions(questions, true), [questions]);
17395
+ const { t } = useTranslate();
17396
+ const operatorOptions = React84.useMemo(
17397
+ () => [
17398
+ { value: "equals", label: t("branchingLogic.operatorEquals") },
17399
+ { value: "not-equals", label: t("branchingLogic.operatorNotEquals") },
17400
+ { value: "contains", label: t("branchingLogic.operatorContains") },
17401
+ { value: "in", label: t("branchingLogic.operatorIn") }
17402
+ ],
17403
+ [t]
17404
+ );
17405
+ const sourceOptions = React84.useMemo(() => questionsToOptions(questions, null), [questions]);
17406
+ const targetOptions = React84.useMemo(
17407
+ () => questionsToOptions(questions, t("branchingLogic.endOfSurvey")),
17408
+ [questions, t]
17409
+ );
17110
17410
  const sourceQuestion = questions.find((q) => q.id === rule.sourceQuestionId);
17111
17411
  const valueOptions = React84.useMemo(() => {
17112
17412
  if (!sourceQuestion?.optionValues) return [];
@@ -17151,22 +17451,22 @@ var init_BranchingLogicBuilder = __esm({
17151
17451
  ),
17152
17452
  children: [
17153
17453
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-wrap items-center gap-2", children: [
17154
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "semibold", className: "shrink-0", children: "If" }),
17454
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "semibold", className: "shrink-0", children: t("branchingLogic.if") }),
17155
17455
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsxRuntime.jsx(
17156
17456
  Select,
17157
17457
  {
17158
17458
  options: sourceOptions,
17159
17459
  value: rule.sourceQuestionId,
17160
- placeholder: "Select question",
17460
+ placeholder: t("branchingLogic.selectQuestion"),
17161
17461
  onChange: handleSource,
17162
17462
  disabled: readOnly,
17163
- error: broken ? "Broken reference" : void 0
17463
+ error: broken ? t("branchingLogic.brokenReference") : void 0
17164
17464
  }
17165
17465
  ) }),
17166
17466
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[8rem] basis-32", children: /* @__PURE__ */ jsxRuntime.jsx(
17167
17467
  Select,
17168
17468
  {
17169
- options: OPERATOR_OPTIONS,
17469
+ options: operatorOptions,
17170
17470
  value: rule.operator,
17171
17471
  onChange: handleOperator,
17172
17472
  disabled: readOnly
@@ -17189,7 +17489,7 @@ var init_BranchingLogicBuilder = __esm({
17189
17489
  {
17190
17490
  options: valueOptions.filter((o) => !chips.includes(o.value)),
17191
17491
  value: "",
17192
- placeholder: "Add value",
17492
+ placeholder: t("branchingLogic.addValue"),
17193
17493
  onChange: handleAddChip,
17194
17494
  disabled: readOnly
17195
17495
  }
@@ -17197,7 +17497,7 @@ var init_BranchingLogicBuilder = __esm({
17197
17497
  Input,
17198
17498
  {
17199
17499
  inputType: "text",
17200
- placeholder: "Type value, press Enter",
17500
+ placeholder: t("branchingLogic.typeValuePressEnter"),
17201
17501
  value: "",
17202
17502
  onKeyDown: (e) => {
17203
17503
  if (e.key !== "Enter") return;
@@ -17215,7 +17515,7 @@ var init_BranchingLogicBuilder = __esm({
17215
17515
  {
17216
17516
  options: valueOptions,
17217
17517
  value: scalarValue,
17218
- placeholder: "Select value",
17518
+ placeholder: t("branchingLogic.selectValue"),
17219
17519
  onChange: (e) => onChange({ ...rule, value: e.target.value }),
17220
17520
  disabled: readOnly
17221
17521
  }
@@ -17223,7 +17523,7 @@ var init_BranchingLogicBuilder = __esm({
17223
17523
  Input,
17224
17524
  {
17225
17525
  inputType: "text",
17226
- placeholder: "Value",
17526
+ placeholder: t("branchingLogic.value"),
17227
17527
  value: scalarValue,
17228
17528
  onChange: handleScalarValue,
17229
17529
  disabled: readOnly
@@ -17231,17 +17531,17 @@ var init_BranchingLogicBuilder = __esm({
17231
17531
  ) }),
17232
17532
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "label", weight: "semibold", className: "shrink-0 inline-flex items-center gap-1", children: [
17233
17533
  /* @__PURE__ */ jsxRuntime.jsx(LucideIcons2.ArrowRight, { className: "h-4 w-4" }),
17234
- "go to"
17534
+ t("branchingLogic.goTo")
17235
17535
  ] }),
17236
17536
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsxRuntime.jsx(
17237
17537
  Select,
17238
17538
  {
17239
17539
  options: targetOptions,
17240
17540
  value: rule.targetQuestionId,
17241
- placeholder: "Select target",
17541
+ placeholder: t("branchingLogic.selectTarget"),
17242
17542
  onChange: handleTarget,
17243
17543
  disabled: readOnly,
17244
- error: broken && rule.targetQuestionId !== END_OF_SURVEY ? "Broken reference" : void 0
17544
+ error: broken && rule.targetQuestionId !== END_OF_SURVEY ? t("branchingLogic.brokenReference") : void 0
17245
17545
  }
17246
17546
  ) }),
17247
17547
  !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
@@ -17253,11 +17553,11 @@ var init_BranchingLogicBuilder = __esm({
17253
17553
  action: "DELETE_RULE",
17254
17554
  actionPayload: { ruleId: rule.id },
17255
17555
  onClick: onDelete,
17256
- "aria-label": "Delete rule"
17556
+ "aria-label": t("branchingLogic.deleteRule")
17257
17557
  }
17258
17558
  )
17259
17559
  ] }),
17260
- broken && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "error", size: "sm", label: "Broken reference" })
17560
+ broken && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "error", size: "sm", label: t("branchingLogic.brokenReference") })
17261
17561
  ]
17262
17562
  }
17263
17563
  );
@@ -17267,10 +17567,12 @@ var init_BranchingLogicBuilder = __esm({
17267
17567
  NODE_GAP_Y = 80;
17268
17568
  PADDING = 32;
17269
17569
  LogicGraph = ({ questions, rules }) => {
17570
+ const { t } = useTranslate();
17571
+ const endOfSurveyLabel = t("branchingLogic.endOfSurvey");
17270
17572
  const layout = React84.useMemo(() => {
17271
17573
  const items = [
17272
17574
  ...questions.map((q) => ({ id: q.id, label: q.label, isEnd: false })),
17273
- { id: END_OF_SURVEY, label: "End of survey", isEnd: true }
17575
+ { id: END_OF_SURVEY, label: endOfSurveyLabel, isEnd: true }
17274
17576
  ];
17275
17577
  const positions = {};
17276
17578
  items.forEach((item, i) => {
@@ -17282,14 +17584,14 @@ var init_BranchingLogicBuilder = __esm({
17282
17584
  const width = NODE_WIDTH + PADDING * 2 + 220;
17283
17585
  const height = PADDING * 2 + items.length * (NODE_HEIGHT + NODE_GAP_Y);
17284
17586
  return { items, positions, width, height };
17285
- }, [questions]);
17587
+ }, [questions, endOfSurveyLabel]);
17286
17588
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "overflow-auto rounded-container border border-border bg-card p-2", children: /* @__PURE__ */ jsxRuntime.jsxs(
17287
17589
  "svg",
17288
17590
  {
17289
17591
  width: layout.width,
17290
17592
  height: layout.height,
17291
17593
  role: "img",
17292
- "aria-label": "Branching logic graph",
17594
+ "aria-label": t("branchingLogic.graphAriaLabel"),
17293
17595
  style: { display: "block" },
17294
17596
  children: [
17295
17597
  /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -17397,6 +17699,7 @@ var init_BranchingLogicBuilder = __esm({
17397
17699
  readOnly = false,
17398
17700
  className
17399
17701
  }) => {
17702
+ const { t } = useTranslate();
17400
17703
  const eventBus = useEventBus();
17401
17704
  const questions = Array.isArray(questionsProp) ? questionsProp : [];
17402
17705
  const rulesInitial = Array.isArray(rulesProp) ? rulesProp : [];
@@ -17449,16 +17752,23 @@ var init_BranchingLogicBuilder = __esm({
17449
17752
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-wrap items-center justify-between gap-2", children: [
17450
17753
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-2", children: [
17451
17754
  /* @__PURE__ */ jsxRuntime.jsx(LucideIcons2.GitBranch, { className: "h-5 w-5 text-foreground" }),
17452
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "subheading", weight: "semibold", children: "Branching logic" }),
17755
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "subheading", weight: "semibold", children: t("branchingLogic.title") }),
17453
17756
  /* @__PURE__ */ jsxRuntime.jsx(
17454
17757
  Badge,
17455
17758
  {
17456
17759
  variant: "neutral",
17457
17760
  size: "sm",
17458
- label: `${rules.length} rule${rules.length === 1 ? "" : "s"}`
17761
+ label: rules.length === 1 ? t("branchingLogic.ruleCountOne", { count: rules.length }) : t("branchingLogic.ruleCountOther", { count: rules.length })
17459
17762
  }
17460
17763
  ),
17461
- brokenCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "error", size: "sm", label: `${brokenCount} broken` })
17764
+ brokenCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
17765
+ Badge,
17766
+ {
17767
+ variant: "error",
17768
+ size: "sm",
17769
+ label: t("branchingLogic.brokenCount", { count: brokenCount })
17770
+ }
17771
+ )
17462
17772
  ] }),
17463
17773
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-1 rounded-sm border border-border bg-card p-0.5", children: [
17464
17774
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -17469,7 +17779,7 @@ var init_BranchingLogicBuilder = __esm({
17469
17779
  leftIcon: LucideIcons2.Pencil,
17470
17780
  action: "VIEW_EDIT",
17471
17781
  onClick: () => setView("edit"),
17472
- children: "Rules"
17782
+ children: t("branchingLogic.rules")
17473
17783
  }
17474
17784
  ),
17475
17785
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -17480,13 +17790,13 @@ var init_BranchingLogicBuilder = __esm({
17480
17790
  leftIcon: LucideIcons2.Eye,
17481
17791
  action: "VIEW_GRAPH",
17482
17792
  onClick: () => setView("graph"),
17483
- children: "Logic graph"
17793
+ children: t("branchingLogic.logicGraph")
17484
17794
  }
17485
17795
  )
17486
17796
  ] })
17487
17797
  ] }),
17488
17798
  view === "edit" ? /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-col gap-2", children: [
17489
- rules.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(Card, { variant: "bordered", padding: "lg", className: "text-center", children: /* @__PURE__ */ jsxRuntime.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__ */ jsxRuntime.jsx(
17799
+ rules.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(Card, { variant: "bordered", padding: "lg", className: "text-center", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", color: "muted", children: noQuestions ? t("branchingLogic.emptyNoQuestions") : t("branchingLogic.emptyNoRules") }) }) : rules.map((rule) => /* @__PURE__ */ jsxRuntime.jsx(
17490
17800
  RuleRow,
17491
17801
  {
17492
17802
  rule,
@@ -17507,7 +17817,7 @@ var init_BranchingLogicBuilder = __esm({
17507
17817
  action: "ADD_RULE",
17508
17818
  onClick: handleAddRule,
17509
17819
  disabled: noQuestions,
17510
- children: "Add rule"
17820
+ children: t("branchingLogic.addRule")
17511
17821
  }
17512
17822
  ) })
17513
17823
  ] }) : /* @__PURE__ */ jsxRuntime.jsx(LogicGraph, { questions, rules })
@@ -18067,7 +18377,7 @@ function CalendarGrid({
18067
18377
  onClick: stepPrev,
18068
18378
  "aria-disabled": !canPrev || void 0,
18069
18379
  "aria-label": t("aria.previousDays"),
18070
- children: "Prev"
18380
+ children: t("nav.previous")
18071
18381
  }
18072
18382
  ),
18073
18383
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground", children: formatDateRange(visibleDays[0], visibleDays[visibleDays.length - 1]) }),
@@ -18080,7 +18390,7 @@ function CalendarGrid({
18080
18390
  onClick: stepNext,
18081
18391
  "aria-disabled": !canNext || void 0,
18082
18392
  "aria-label": t("aria.nextDays"),
18083
- children: "Next"
18393
+ children: t("nav.next")
18084
18394
  }
18085
18395
  )
18086
18396
  ] }),
@@ -19630,7 +19940,7 @@ var init_Pagination = __esm({
19630
19940
  type: "number",
19631
19941
  value: jumpToPage,
19632
19942
  onChange: (e) => setJumpToPage(e.target.value),
19633
- placeholder: "Page",
19943
+ placeholder: t("pagination.jumpPlaceholder"),
19634
19944
  className: "w-20",
19635
19945
  onKeyDown: (e) => {
19636
19946
  if (e.key === "Enter") {
@@ -19768,13 +20078,10 @@ var init_CardGrid = __esm({
19768
20078
  return children;
19769
20079
  }
19770
20080
  if (isLoading) {
19771
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "col-span-full text-center py-8 text-muted-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", color: "secondary", children: "Loading items..." }) });
20081
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "col-span-full text-center py-8 text-muted-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", color: "secondary", children: t("loading.items") }) });
19772
20082
  }
19773
20083
  if (error) {
19774
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "col-span-full text-center py-8 text-error", children: /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "body", color: "error", children: [
19775
- "Error loading items: ",
19776
- error.message
19777
- ] }) });
20084
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "col-span-full text-center py-8 text-error", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", color: "error", children: t("error.loadFailed", { message: error.message }) }) });
19778
20085
  }
19779
20086
  if (normalizedData.length === 0) {
19780
20087
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "col-span-full text-center py-12 text-muted-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", color: "secondary", children: t("empty.noItems") || "No items found" }) });
@@ -23626,7 +23933,7 @@ function DataGrid({
23626
23933
  onChange: () => toggleSelection(id),
23627
23934
  onClick: (e) => e.stopPropagation(),
23628
23935
  className: "w-4 h-4 mt-1 flex-shrink-0 accent-primary",
23629
- "aria-label": `Select ${titleValue !== void 0 ? String(titleValue) : "item"}`
23936
+ "aria-label": t("card.selectItem", { item: titleValue !== void 0 ? String(titleValue) : t("card.itemFallback") })
23630
23937
  }
23631
23938
  ),
23632
23939
  /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "xs", className: "flex-1 min-w-0", children: [
@@ -23824,7 +24131,7 @@ function formatDate3(value) {
23824
24131
  if (isNaN(d.getTime())) return String(value);
23825
24132
  return d.toLocaleDateString(void 0, { year: "numeric", month: "short", day: "numeric" });
23826
24133
  }
23827
- function formatValue2(value, format) {
24134
+ function formatValue2(value, format, boolLabels) {
23828
24135
  if (value === void 0 || value === null) return "";
23829
24136
  switch (format) {
23830
24137
  case "date":
@@ -23836,7 +24143,7 @@ function formatValue2(value, format) {
23836
24143
  case "percent":
23837
24144
  return typeof value === "number" ? `${Math.round(value)}%` : String(value);
23838
24145
  case "boolean":
23839
- return value ? "Yes" : "No";
24146
+ return value ? boolLabels?.yes ?? "Yes" : boolLabels?.no ?? "No";
23840
24147
  default:
23841
24148
  return String(value);
23842
24149
  }
@@ -24132,7 +24439,7 @@ function DataList({
24132
24439
  field.label ?? fieldLabel3(field.name),
24133
24440
  ":"
24134
24441
  ] }),
24135
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: formatValue2(value, field.format) })
24442
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
24136
24443
  ] }, field.name);
24137
24444
  }) }),
24138
24445
  progressFields.map((field) => {
@@ -24262,6 +24569,7 @@ var init_FileTree = __esm({
24262
24569
  init_Box();
24263
24570
  init_Typography();
24264
24571
  init_Icon();
24572
+ init_useTranslate();
24265
24573
  TreeNodeItem = ({
24266
24574
  node,
24267
24575
  depth,
@@ -24347,8 +24655,9 @@ var init_FileTree = __esm({
24347
24655
  className,
24348
24656
  indent = 16
24349
24657
  }) => {
24658
+ const { t } = useTranslate();
24350
24659
  if (tree.length === 0) {
24351
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "muted", children: "No files" }) });
24660
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "muted", children: t("fileTree.noFiles") }) });
24352
24661
  }
24353
24662
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `py-1 overflow-y-auto ${className ?? ""}`, role: "tree", children: tree.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
24354
24663
  TreeNodeItem,
@@ -24403,6 +24712,7 @@ var init_FilterGroup = __esm({
24403
24712
  init_Icon();
24404
24713
  init_useEventBus();
24405
24714
  init_useQuerySingleton();
24715
+ init_useTranslate();
24406
24716
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
24407
24717
  lookStyles6 = {
24408
24718
  toolbar: "",
@@ -24423,6 +24733,7 @@ var init_FilterGroup = __esm({
24423
24733
  isLoading,
24424
24734
  look = "toolbar"
24425
24735
  }) => {
24736
+ const { t } = useTranslate();
24426
24737
  const eventBus = useEventBus();
24427
24738
  const queryState = useQuerySingleton(query);
24428
24739
  const [selectedValues, setSelectedValues] = React84.useState(
@@ -24504,7 +24815,7 @@ var init_FilterGroup = __esm({
24504
24815
  "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24505
24816
  !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24506
24817
  ),
24507
- children: "All"
24818
+ children: t("filterGroup.all")
24508
24819
  }
24509
24820
  ),
24510
24821
  filter.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -24532,7 +24843,7 @@ var init_FilterGroup = __esm({
24532
24843
  size: "sm",
24533
24844
  onClick: handleClearAll,
24534
24845
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24535
- children: "Clear"
24846
+ children: t("filterGroup.clear")
24536
24847
  }
24537
24848
  )
24538
24849
  ]
@@ -24543,7 +24854,7 @@ var init_FilterGroup = __esm({
24543
24854
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", lookStyles6[look], className), children: [
24544
24855
  showIcon && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
24545
24856
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4" }),
24546
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
24857
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
24547
24858
  ] }),
24548
24859
  filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
24549
24860
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-xs font-bold text-muted-foreground uppercase tracking-wide", children: filter.label }),
@@ -24566,7 +24877,7 @@ var init_FilterGroup = __esm({
24566
24877
  `${filter.field}_from`,
24567
24878
  e.target.value || null
24568
24879
  ),
24569
- placeholder: "From",
24880
+ placeholder: t("filterGroup.from"),
24570
24881
  clearable: true,
24571
24882
  onClear: () => handleFilterSelect(`${filter.field}_from`, null)
24572
24883
  }
@@ -24580,7 +24891,7 @@ var init_FilterGroup = __esm({
24580
24891
  `${filter.field}_to`,
24581
24892
  e.target.value || null
24582
24893
  ),
24583
- placeholder: "To",
24894
+ placeholder: t("filterGroup.to"),
24584
24895
  clearable: true,
24585
24896
  onClear: () => handleFilterSelect(`${filter.field}_to`, null)
24586
24897
  }
@@ -24600,7 +24911,7 @@ var init_FilterGroup = __esm({
24600
24911
  value: selectedValues[filter.field] || "all",
24601
24912
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24602
24913
  options: [
24603
- { value: "all", label: "All" },
24914
+ { value: "all", label: t("filterGroup.all") },
24604
24915
  ...filter.options?.map((opt) => ({
24605
24916
  value: opt,
24606
24917
  label: opt
@@ -24617,7 +24928,7 @@ var init_FilterGroup = __esm({
24617
24928
  onClick: handleClearAll,
24618
24929
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24619
24930
  className: "self-start",
24620
- children: "Clear all"
24931
+ children: t("filterGroup.clearAll")
24621
24932
  }
24622
24933
  )
24623
24934
  ] });
@@ -24683,7 +24994,7 @@ var init_FilterGroup = __esm({
24683
24994
  value: selectedValues[filter.field] || "all",
24684
24995
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24685
24996
  options: [
24686
- { value: "all", label: `All ${filter.label}` },
24997
+ { value: "all", label: t("filterGroup.allOf", { label: filter.label }) },
24687
24998
  ...filter.options?.map((opt) => ({
24688
24999
  value: opt,
24689
25000
  label: opt
@@ -24712,7 +25023,7 @@ var init_FilterGroup = __esm({
24712
25023
  field
24713
25024
  );
24714
25025
  }),
24715
- /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
25026
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: t("filterGroup.clearAll") })
24716
25027
  ] })
24717
25028
  ]
24718
25029
  }
@@ -24737,7 +25048,7 @@ var init_FilterGroup = __esm({
24737
25048
  className: "text-muted-foreground",
24738
25049
  children: [
24739
25050
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4" }),
24740
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
25051
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
24741
25052
  ]
24742
25053
  }
24743
25054
  ),
@@ -24763,7 +25074,7 @@ var init_FilterGroup = __esm({
24763
25074
  `${filter.field}_from`,
24764
25075
  e.target.value || null
24765
25076
  ),
24766
- placeholder: "From",
25077
+ placeholder: t("filterGroup.from"),
24767
25078
  clearable: true,
24768
25079
  onClear: () => handleFilterSelect(`${filter.field}_from`, null),
24769
25080
  className: "min-w-[130px]"
@@ -24779,7 +25090,7 @@ var init_FilterGroup = __esm({
24779
25090
  `${filter.field}_to`,
24780
25091
  e.target.value || null
24781
25092
  ),
24782
- placeholder: "To",
25093
+ placeholder: t("filterGroup.to"),
24783
25094
  clearable: true,
24784
25095
  onClear: () => handleFilterSelect(`${filter.field}_to`, null),
24785
25096
  className: "min-w-[130px]"
@@ -24801,7 +25112,7 @@ var init_FilterGroup = __esm({
24801
25112
  value: selectedValues[filter.field] || "all",
24802
25113
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24803
25114
  options: [
24804
- { value: "all", label: "All" },
25115
+ { value: "all", label: t("filterGroup.all") },
24805
25116
  ...filter.options?.map((opt) => ({
24806
25117
  value: opt,
24807
25118
  label: opt
@@ -24812,10 +25123,7 @@ var init_FilterGroup = __esm({
24812
25123
  )
24813
25124
  ] }, filter.field)),
24814
25125
  activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: "ml-auto", children: [
24815
- /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "primary", size: "md", children: [
24816
- activeFilterCount,
24817
- " active"
24818
- ] }),
25126
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "md", children: t("filterGroup.activeCount", { count: activeFilterCount }) }),
24819
25127
  /* @__PURE__ */ jsxRuntime.jsx(
24820
25128
  Button,
24821
25129
  {
@@ -24823,7 +25131,7 @@ var init_FilterGroup = __esm({
24823
25131
  size: "sm",
24824
25132
  onClick: handleClearAll,
24825
25133
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24826
- children: "Clear all"
25134
+ children: t("filterGroup.clearAll")
24827
25135
  }
24828
25136
  )
24829
25137
  ] })
@@ -25052,7 +25360,7 @@ var init_RelationSelect = __esm({
25052
25360
  value,
25053
25361
  onChange,
25054
25362
  options = [],
25055
- placeholder = "Select...",
25363
+ placeholder,
25056
25364
  required = false,
25057
25365
  disabled = false,
25058
25366
  isLoading = false,
@@ -25064,6 +25372,7 @@ var init_RelationSelect = __esm({
25064
25372
  emptyMessage
25065
25373
  }) => {
25066
25374
  const { t } = useTranslate();
25375
+ const resolvedPlaceholder = placeholder ?? t("relationSelect.selectPlaceholder");
25067
25376
  const resolvedSearchPlaceholder = searchPlaceholder ?? t("common.search");
25068
25377
  const resolvedEmptyMessage = emptyMessage ?? t("empty.noOptionsFound");
25069
25378
  const [isOpen, setIsOpen] = React84.useState(false);
@@ -25173,7 +25482,7 @@ var init_RelationSelect = __esm({
25173
25482
  children: isLoading ? /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
25174
25483
  /* @__PURE__ */ jsxRuntime.jsx(Spinner, { size: "sm" }),
25175
25484
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", children: t("common.loading") })
25176
- ] }) : selectedOption ? selectedOption.label : placeholder
25485
+ ] }) : selectedOption ? selectedOption.label : resolvedPlaceholder
25177
25486
  }
25178
25487
  ),
25179
25488
  /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
@@ -25767,19 +26076,20 @@ var init_RepeatableFormSection = __esm({
25767
26076
  RepeatableFormSection.displayName = "RepeatableFormSection";
25768
26077
  }
25769
26078
  });
25770
- var actionTypeLabels, actionTypeIcons, ViolationAlert;
26079
+ var actionTypeLabelKeys, actionTypeIcons, ViolationAlert;
25771
26080
  var init_ViolationAlert = __esm({
25772
26081
  "components/core/molecules/ViolationAlert.tsx"() {
25773
26082
  init_cn();
26083
+ init_useTranslate();
25774
26084
  init_Box();
25775
26085
  init_Stack();
25776
26086
  init_Typography();
25777
26087
  init_Button();
25778
26088
  init_Icon();
25779
- actionTypeLabels = {
25780
- measure: "Corrective Measure",
25781
- admin: "Administrative Action",
25782
- penalty: "Penalty Proceedings"
26089
+ actionTypeLabelKeys = {
26090
+ measure: "violationAlert.actionType.measure",
26091
+ admin: "violationAlert.actionType.admin",
26092
+ penalty: "violationAlert.actionType.penalty"
25783
26093
  };
25784
26094
  actionTypeIcons = {
25785
26095
  measure: "alert-triangle",
@@ -25796,10 +26106,11 @@ var init_ViolationAlert = __esm({
25796
26106
  className,
25797
26107
  ...flatProps
25798
26108
  }) => {
26109
+ const { t } = useTranslate();
25799
26110
  const resolvedViolation = violation ?? {
25800
26111
  law: "",
25801
26112
  article: "",
25802
- message: flatProps.message ?? "Violation",
26113
+ message: flatProps.message ?? t("violationAlert.fallbackMessage"),
25803
26114
  actionType: "measure"
25804
26115
  };
25805
26116
  const effectiveSeverity = severity ?? (resolvedViolation.actionType === "measure" ? "warning" : "error");
@@ -25884,7 +26195,7 @@ var init_ViolationAlert = __esm({
25884
26195
  {
25885
26196
  variant: "caption",
25886
26197
  className: cn(textColor, "opacity-75"),
25887
- children: actionTypeLabels[resolvedViolation.actionType]
26198
+ children: t(actionTypeLabelKeys[resolvedViolation.actionType])
25888
26199
  }
25889
26200
  )
25890
26201
  ] })
@@ -25915,7 +26226,7 @@ var init_ViolationAlert = __esm({
25915
26226
  {
25916
26227
  variant: "caption",
25917
26228
  className: cn(textColor, "opacity-75"),
25918
- children: "Admin:"
26229
+ children: t("violationAlert.adminLabel")
25919
26230
  }
25920
26231
  ),
25921
26232
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -25934,7 +26245,7 @@ var init_ViolationAlert = __esm({
25934
26245
  {
25935
26246
  variant: "caption",
25936
26247
  className: cn(textColor, "opacity-75"),
25937
- children: "Penalty:"
26248
+ children: t("violationAlert.penaltyLabel")
25938
26249
  }
25939
26250
  ),
25940
26251
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -25959,7 +26270,7 @@ var init_ViolationAlert = __esm({
25959
26270
  className: cn(textColor, "self-start"),
25960
26271
  children: [
25961
26272
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "arrow-right", size: "sm", className: "mr-1" }),
25962
- "Go to field"
26273
+ t("violationAlert.goToField")
25963
26274
  ]
25964
26275
  }
25965
26276
  )
@@ -26275,6 +26586,7 @@ var init_LineChart = __esm({
26275
26586
  "use client";
26276
26587
  init_cn();
26277
26588
  init_atoms2();
26589
+ init_useTranslate();
26278
26590
  LineChart2 = ({
26279
26591
  data,
26280
26592
  width = 400,
@@ -26286,6 +26598,7 @@ var init_LineChart = __esm({
26286
26598
  areaColor = "var(--color-primary)",
26287
26599
  className
26288
26600
  }) => {
26601
+ const { t } = useTranslate();
26289
26602
  const gradientId = React84.useId();
26290
26603
  const safeData = data ?? [];
26291
26604
  const sortedData = React84.useMemo(() => {
@@ -26322,7 +26635,7 @@ var init_LineChart = __esm({
26322
26635
  return `${linePath} L ${last.x} ${bottom} L ${first.x} ${bottom} Z`;
26323
26636
  }, [linePath, points, height, showArea]);
26324
26637
  if (safeData.length === 0) {
26325
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex items-center justify-center text-muted-foreground", className), style: { width, height }, children: "No data" });
26638
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex items-center justify-center text-muted-foreground", className), style: { width, height }, children: t("empty.noData") });
26326
26639
  }
26327
26640
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn(className), children: /* @__PURE__ */ jsxRuntime.jsxs(
26328
26641
  "svg",
@@ -28229,6 +28542,7 @@ var init_GraphView = __esm({
28229
28542
  "use client";
28230
28543
  init_cn();
28231
28544
  init_atoms2();
28545
+ init_useTranslate();
28232
28546
  GROUP_COLORS = [
28233
28547
  "#3b82f6",
28234
28548
  // blue-500
@@ -28261,6 +28575,7 @@ var init_GraphView = __esm({
28261
28575
  showLabels = true,
28262
28576
  zoomToFit = true
28263
28577
  }) => {
28578
+ const { t } = useTranslate();
28264
28579
  const containerRef = React84.useRef(null);
28265
28580
  const animRef = React84.useRef(0);
28266
28581
  const [simNodes, setSimNodes] = React84.useState([]);
@@ -28438,7 +28753,7 @@ var init_GraphView = __esm({
28438
28753
  [onNodeClick]
28439
28754
  );
28440
28755
  if (nodes.length === 0) {
28441
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex items-center justify-center", className), style: { width: w, height: h }, children: /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "text-muted-foreground text-sm", children: "No graph data" }) });
28756
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex items-center justify-center", className), style: { width: w, height: h }, children: /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "text-muted-foreground text-sm", children: t("display.noGraphData") }) });
28442
28757
  }
28443
28758
  return /* @__PURE__ */ jsxRuntime.jsx(
28444
28759
  Box,
@@ -28894,11 +29209,12 @@ var init_UploadDropZone = __esm({
28894
29209
  init_Icon();
28895
29210
  init_Typography();
28896
29211
  init_useEventBus();
29212
+ init_useTranslate();
28897
29213
  UploadDropZone = ({
28898
29214
  accept,
28899
29215
  maxSize,
28900
29216
  maxFiles = 1,
28901
- label = "Drop files here or click to browse",
29217
+ label,
28902
29218
  description,
28903
29219
  disabled = false,
28904
29220
  action,
@@ -28906,22 +29222,24 @@ var init_UploadDropZone = __esm({
28906
29222
  onFiles,
28907
29223
  className
28908
29224
  }) => {
29225
+ const { t } = useTranslate();
29226
+ const resolvedLabel = label ?? t("upload.dropOrBrowse");
28909
29227
  const [isDragOver, setIsDragOver] = React84.useState(false);
28910
29228
  const [error, setError] = React84.useState(null);
28911
29229
  const inputRef = React84.useRef(null);
28912
29230
  const eventBus = useSafeEventBus7();
28913
29231
  const defaultDescription = [
28914
- accept ? `Accepted: ${accept}` : null,
28915
- maxSize ? `Max size: ${formatFileSize(maxSize)}` : null,
28916
- maxFiles > 1 ? `Up to ${maxFiles} files` : null
29232
+ accept ? t("upload.accepted", { accept }) : null,
29233
+ maxSize ? t("upload.maxSize", { size: formatFileSize(maxSize) }) : null,
29234
+ maxFiles > 1 ? t("upload.maxFiles", { count: maxFiles }) : null
28917
29235
  ].filter(Boolean).join(". ");
28918
29236
  const validateFiles = React84.useCallback(
28919
29237
  (files) => {
28920
29238
  if (files.length > maxFiles) {
28921
- return { valid: [], error: `Maximum ${maxFiles} file${maxFiles > 1 ? "s" : ""} allowed` };
29239
+ return { valid: [], error: t("upload.error.maxFiles", { count: maxFiles }) };
28922
29240
  }
28923
29241
  if (accept) {
28924
- const acceptedTypes = accept.split(",").map((t) => t.trim());
29242
+ const acceptedTypes = accept.split(",").map((s) => s.trim());
28925
29243
  const invalid = files.filter((file) => {
28926
29244
  return !acceptedTypes.some((type) => {
28927
29245
  if (type.endsWith("/*")) {
@@ -28931,7 +29249,7 @@ var init_UploadDropZone = __esm({
28931
29249
  });
28932
29250
  });
28933
29251
  if (invalid.length > 0) {
28934
- return { valid: [], error: `Invalid file type: ${invalid[0].name}` };
29252
+ return { valid: [], error: t("upload.error.invalidType", { name: invalid[0].name }) };
28935
29253
  }
28936
29254
  }
28937
29255
  if (maxSize) {
@@ -28939,13 +29257,13 @@ var init_UploadDropZone = __esm({
28939
29257
  if (tooLarge.length > 0) {
28940
29258
  return {
28941
29259
  valid: [],
28942
- error: `File too large: ${tooLarge[0].name} (max ${formatFileSize(maxSize)})`
29260
+ error: t("upload.error.tooLarge", { name: tooLarge[0].name, size: formatFileSize(maxSize) })
28943
29261
  };
28944
29262
  }
28945
29263
  }
28946
29264
  return { valid: files, error: null };
28947
29265
  },
28948
- [accept, maxSize, maxFiles]
29266
+ [accept, maxSize, maxFiles, t]
28949
29267
  );
28950
29268
  const handleFiles = React84.useCallback(
28951
29269
  (files) => {
@@ -29016,7 +29334,7 @@ var init_UploadDropZone = __esm({
29016
29334
  handleClick();
29017
29335
  }
29018
29336
  },
29019
- "aria-label": label,
29337
+ "aria-label": resolvedLabel,
29020
29338
  children: [
29021
29339
  /* @__PURE__ */ jsxRuntime.jsx(
29022
29340
  "input",
@@ -29032,7 +29350,7 @@ var init_UploadDropZone = __esm({
29032
29350
  }
29033
29351
  ),
29034
29352
  error ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "file-warning", size: "lg", className: "text-error mb-2" }) : /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "upload", size: "lg", className: "text-muted-foreground mb-2" }),
29035
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body1", className: "text-center font-medium mb-1", children: isDragOver ? "Drop files here" : label }),
29353
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body1", className: "text-center font-medium mb-1", children: isDragOver ? t("upload.dropFilesHere") : resolvedLabel }),
29036
29354
  error ? /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "error", className: "text-center", children: error }) : /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "muted", className: "text-center", children: description ?? defaultDescription })
29037
29355
  ]
29038
29356
  }
@@ -29454,7 +29772,7 @@ function TableView({
29454
29772
  {
29455
29773
  checked: selected.has(id),
29456
29774
  onChange: () => toggleRow(id),
29457
- "aria-label": `Select row ${id}`
29775
+ "aria-label": t("table.selectRow", { id })
29458
29776
  }
29459
29777
  ) }),
29460
29778
  hasRenderProp ? /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex-1 min-w-0", children: children(row, index) }) : colDefs.map((col) => {
@@ -32163,7 +32481,7 @@ var init_QrScanner = __esm({
32163
32481
  className: "inset-0 flex-col items-center justify-center gap-2 bg-black bg-opacity-80 text-center",
32164
32482
  children: [
32165
32483
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "camera", className: "h-8 w-8 text-white", "aria-hidden": "true" }),
32166
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body2", className: "text-white", children: "Camera unavailable" }),
32484
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body2", className: "text-white", children: t("qrScanner.cameraUnavailable") }),
32167
32485
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", className: "text-white opacity-70", children: cameraError.message })
32168
32486
  ]
32169
32487
  }
@@ -32174,7 +32492,7 @@ var init_QrScanner = __esm({
32174
32492
  position: "absolute",
32175
32493
  display: "flex",
32176
32494
  className: "inset-0 items-center justify-center bg-black bg-opacity-60",
32177
- children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body2", className: "text-white", children: "Paused" })
32495
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body2", className: "text-white", children: t("qrScanner.paused") })
32178
32496
  }
32179
32497
  ),
32180
32498
  showCameraControls && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -32193,7 +32511,7 @@ var init_QrScanner = __esm({
32193
32511
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
32194
32512
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
32195
32513
  ),
32196
- "aria-label": isPaused ? "Resume scanning" : "Pause scanning",
32514
+ "aria-label": isPaused ? t("qrScanner.resumeScanning") : t("qrScanner.pauseScanning"),
32197
32515
  children: isPaused ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "play", className: "h-4 w-4" }) : /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "pause", className: "h-4 w-4" })
32198
32516
  }
32199
32517
  ),
@@ -32206,7 +32524,7 @@ var init_QrScanner = __esm({
32206
32524
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
32207
32525
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
32208
32526
  ),
32209
- "aria-label": `Switch to ${currentFacing === "environment" ? "front" : "rear"} camera`,
32527
+ "aria-label": currentFacing === "environment" ? t("qrScanner.switchToFrontCamera") : t("qrScanner.switchToRearCamera"),
32210
32528
  children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "refresh-cw", className: "h-4 w-4" })
32211
32529
  }
32212
32530
  ),
@@ -32220,7 +32538,7 @@ var init_QrScanner = __esm({
32220
32538
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
32221
32539
  ),
32222
32540
  "aria-label": t("aria.mockScanDev"),
32223
- children: "Mock Scan"
32541
+ children: t("qrScanner.mockScan")
32224
32542
  }
32225
32543
  )
32226
32544
  ]
@@ -32238,6 +32556,7 @@ var init_OptionConstraintGroup = __esm({
32238
32556
  "components/core/molecules/OptionConstraintGroup.tsx"() {
32239
32557
  init_cn();
32240
32558
  init_useEventBus();
32559
+ init_useTranslate();
32241
32560
  init_Typography();
32242
32561
  init_Box();
32243
32562
  init_Label();
@@ -32247,36 +32566,36 @@ var init_OptionConstraintGroup = __esm({
32247
32566
  const sign = delta >= 0 ? "+" : "-";
32248
32567
  return `${sign}$${Math.abs(delta).toFixed(2)}`;
32249
32568
  };
32250
- constraintHint = (constraint) => {
32569
+ constraintHint = (constraint, t) => {
32251
32570
  if (constraint.type === "single") {
32252
- return constraint.required ? "Required, pick 1" : "Optional, pick up to 1";
32571
+ return constraint.required ? t("optionConstraint.requiredOne") : t("optionConstraint.optionalOne");
32253
32572
  }
32254
32573
  const { min, max } = constraint;
32255
32574
  if (min && max) {
32256
- return min === max ? `Pick exactly ${min}` : `Pick ${min}-${max}`;
32575
+ return min === max ? t("optionConstraint.pickExactly", { count: min }) : t("optionConstraint.pickRange", { min, max });
32257
32576
  }
32258
- if (min) return `Pick at least ${min}`;
32259
- if (max) return `Pick up to ${max}`;
32260
- return "Optional";
32577
+ if (min) return t("optionConstraint.pickAtLeast", { count: min });
32578
+ if (max) return t("optionConstraint.pickUpTo", { count: max });
32579
+ return t("optionConstraint.optional");
32261
32580
  };
32262
- validateSelection = (selected, constraint) => {
32581
+ validateSelection = (selected, constraint, t) => {
32263
32582
  if (constraint.type === "single") {
32264
32583
  if (constraint.required && selected.length === 0) {
32265
- return "Pick 1 option";
32584
+ return t("optionConstraint.error.pickOne");
32266
32585
  }
32267
32586
  if (selected.length > 1) {
32268
- return "Pick only 1 option";
32587
+ return t("optionConstraint.error.pickOnlyOne");
32269
32588
  }
32270
32589
  return void 0;
32271
32590
  }
32272
32591
  const { min, max } = constraint;
32273
32592
  if (min !== void 0 && selected.length < min) {
32274
32593
  const remaining = min - selected.length;
32275
- return `Pick at least ${remaining} more`;
32594
+ return t("optionConstraint.error.pickMore", { count: remaining });
32276
32595
  }
32277
32596
  if (max !== void 0 && selected.length > max) {
32278
32597
  const excess = selected.length - max;
32279
- return `Remove ${excess} option${excess === 1 ? "" : "s"}`;
32598
+ return t("optionConstraint.error.removeOptions", { count: excess });
32280
32599
  }
32281
32600
  return void 0;
32282
32601
  };
@@ -32293,8 +32612,9 @@ var init_OptionConstraintGroup = __esm({
32293
32612
  className
32294
32613
  }) => {
32295
32614
  const eventBus = useEventBus();
32296
- const hint = constraintHint(constraint);
32297
- const error = validateSelection(selected, constraint);
32615
+ const { t } = useTranslate();
32616
+ const hint = constraintHint(constraint, t);
32617
+ const error = validateSelection(selected, constraint, t);
32298
32618
  const inputName = `option-${groupId}`;
32299
32619
  const labelTextSize = size === "sm" ? "text-sm" : "text-base";
32300
32620
  const optionGap = size === "sm" ? "gap-2" : "gap-2.5";
@@ -32394,7 +32714,7 @@ var init_OptionConstraintGroup = __esm({
32394
32714
  variant: "caption",
32395
32715
  color: "warning",
32396
32716
  className: "rounded border border-warning/40 px-1.5 py-0.5",
32397
- children: "Out of stock"
32717
+ children: t("optionConstraint.outOfStock")
32398
32718
  }
32399
32719
  )
32400
32720
  ]
@@ -32716,6 +33036,7 @@ function changeBlockType(block, type) {
32716
33036
  return { id: block.id, type, content: seed };
32717
33037
  }
32718
33038
  function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33039
+ const { t } = useTranslate();
32719
33040
  const [open, setOpen] = React84.useState(false);
32720
33041
  const ref = React84.useRef(null);
32721
33042
  React84.useEffect(() => {
@@ -32735,7 +33056,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32735
33056
  {
32736
33057
  type: "button",
32737
33058
  variant: "ghost",
32738
- "aria-label": "Block actions",
33059
+ "aria-label": t("richBlockEditor.blockActions"),
32739
33060
  className: cn(
32740
33061
  "inline-flex items-center justify-center",
32741
33062
  "h-6 w-6 rounded-sm p-0 gap-0",
@@ -32757,7 +33078,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32757
33078
  "py-1 text-sm"
32758
33079
  ),
32759
33080
  children: [
32760
- /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: BLOCK_TYPE_LABEL[block.type] }),
33081
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: t(BLOCK_TYPE_LABEL_KEY[block.type]) }),
32761
33082
  /* @__PURE__ */ jsxRuntime.jsxs(
32762
33083
  Button,
32763
33084
  {
@@ -32771,7 +33092,8 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32771
33092
  },
32772
33093
  children: [
32773
33094
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", className: "w-3.5 h-3.5" }),
32774
- " Duplicate"
33095
+ " ",
33096
+ t("richBlockEditor.duplicate")
32775
33097
  ]
32776
33098
  }
32777
33099
  ),
@@ -32788,14 +33110,15 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32788
33110
  },
32789
33111
  children: [
32790
33112
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "trash", className: "w-3.5 h-3.5" }),
32791
- " Delete"
33113
+ " ",
33114
+ t("common.delete")
32792
33115
  ]
32793
33116
  }
32794
33117
  ),
32795
33118
  CHANGEABLE_TYPES.includes(block.type) && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
32796
33119
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "my-1 border-t border-border" }),
32797
- /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: "Turn into" }),
32798
- CHANGEABLE_TYPES.filter((t) => t !== block.type).map((t) => /* @__PURE__ */ jsxRuntime.jsx(
33120
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: t("richBlockEditor.turnInto") }),
33121
+ CHANGEABLE_TYPES.filter((bt) => bt !== block.type).map((bt) => /* @__PURE__ */ jsxRuntime.jsx(
32799
33122
  Button,
32800
33123
  {
32801
33124
  type: "button",
@@ -32803,12 +33126,12 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32803
33126
  role: "menuitem",
32804
33127
  className: "flex w-full items-center gap-2 px-2 py-1.5 text-left justify-start rounded-none",
32805
33128
  onClick: () => {
32806
- onChangeType(t);
33129
+ onChangeType(bt);
32807
33130
  setOpen(false);
32808
33131
  },
32809
- children: BLOCK_TYPE_LABEL[t]
33132
+ children: t(BLOCK_TYPE_LABEL_KEY[bt])
32810
33133
  },
32811
- t
33134
+ bt
32812
33135
  ))
32813
33136
  ] })
32814
33137
  ]
@@ -32870,6 +33193,7 @@ function BlockRow({
32870
33193
  onInsertAfter,
32871
33194
  onChangeType
32872
33195
  }) {
33196
+ const { t } = useTranslate();
32873
33197
  const setContent = React84.useCallback(
32874
33198
  (next) => onUpdate((b) => ({ ...b, content: next })),
32875
33199
  [onUpdate]
@@ -32919,8 +33243,8 @@ function BlockRow({
32919
33243
  tag: "h1",
32920
33244
  value: block.content ?? "",
32921
33245
  readOnly,
32922
- placeholder: placeholder ?? "Heading 1",
32923
- ariaLabel: "Heading 1 block",
33246
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading1"),
33247
+ ariaLabel: t("richBlockEditor.aria.heading1Block"),
32924
33248
  className: "text-3xl font-bold leading-tight",
32925
33249
  onValueChange: setContent
32926
33250
  }
@@ -32932,8 +33256,8 @@ function BlockRow({
32932
33256
  tag: "h2",
32933
33257
  value: block.content ?? "",
32934
33258
  readOnly,
32935
- placeholder: placeholder ?? "Heading 2",
32936
- ariaLabel: "Heading 2 block",
33259
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading2"),
33260
+ ariaLabel: t("richBlockEditor.aria.heading2Block"),
32937
33261
  className: "text-2xl font-semibold leading-tight",
32938
33262
  onValueChange: setContent
32939
33263
  }
@@ -32945,8 +33269,8 @@ function BlockRow({
32945
33269
  tag: "h3",
32946
33270
  value: block.content ?? "",
32947
33271
  readOnly,
32948
- placeholder: placeholder ?? "Heading 3",
32949
- ariaLabel: "Heading 3 block",
33272
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading3"),
33273
+ ariaLabel: t("richBlockEditor.aria.heading3Block"),
32950
33274
  className: "text-xl font-semibold leading-tight",
32951
33275
  onValueChange: setContent
32952
33276
  }
@@ -32958,8 +33282,8 @@ function BlockRow({
32958
33282
  tag: "blockquote",
32959
33283
  value: block.content ?? "",
32960
33284
  readOnly,
32961
- placeholder: placeholder ?? "Quote",
32962
- ariaLabel: "Quote block",
33285
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.quote"),
33286
+ ariaLabel: t("richBlockEditor.aria.quoteBlock"),
32963
33287
  className: "border-l-4 border-primary/60 pl-4 italic text-muted-foreground",
32964
33288
  onValueChange: setContent
32965
33289
  }
@@ -32967,13 +33291,13 @@ function BlockRow({
32967
33291
  case "code":
32968
33292
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "rounded-md border border-border bg-muted/40", children: [
32969
33293
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center justify-between border-b border-border px-3 py-1 text-xs text-muted-foreground", children: [
32970
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", variant: "caption", className: "uppercase tracking-wide", children: "Code" }),
33294
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", variant: "caption", className: "uppercase tracking-wide", children: t("richBlockEditor.blockType.code") }),
32971
33295
  !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
32972
33296
  Input,
32973
33297
  {
32974
33298
  inputType: "text",
32975
33299
  value: String(block.metadata?.language ?? "plaintext"),
32976
- "aria-label": "Code language",
33300
+ "aria-label": t("richBlockEditor.aria.codeLanguage"),
32977
33301
  className: cn(
32978
33302
  "h-6 w-32 rounded-sm border border-border bg-background",
32979
33303
  "px-2 text-xs outline-none focus:ring-1 focus:ring-ring"
@@ -32989,8 +33313,8 @@ function BlockRow({
32989
33313
  tag: "pre",
32990
33314
  value: block.content ?? "",
32991
33315
  readOnly,
32992
- placeholder: placeholder ?? "Enter code",
32993
- ariaLabel: "Code block",
33316
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.code"),
33317
+ ariaLabel: t("richBlockEditor.aria.codeBlock"),
32994
33318
  className: "block whitespace-pre-wrap p-3 font-mono text-sm leading-relaxed",
32995
33319
  onValueChange: setContent
32996
33320
  }
@@ -33003,7 +33327,7 @@ function BlockRow({
33003
33327
  const caption = String(block.metadata?.caption ?? "");
33004
33328
  const imgProps = {
33005
33329
  src: url,
33006
- alt: caption || "Embedded image",
33330
+ alt: caption || t("richBlockEditor.embeddedImage"),
33007
33331
  className: "max-h-96 w-full rounded-md border border-border object-contain"
33008
33332
  };
33009
33333
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "space-y-2", children: [
@@ -33017,7 +33341,8 @@ function BlockRow({
33017
33341
  ),
33018
33342
  children: [
33019
33343
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "image", className: "mr-2 w-4 h-4" }),
33020
- " No image URL set"
33344
+ " ",
33345
+ t("richBlockEditor.noImageUrl")
33021
33346
  ]
33022
33347
  }
33023
33348
  ),
@@ -33028,7 +33353,7 @@ function BlockRow({
33028
33353
  inputType: "url",
33029
33354
  value: url,
33030
33355
  placeholder: "https://example.com/image.png",
33031
- "aria-label": "Image URL",
33356
+ "aria-label": t("richBlockEditor.aria.imageUrl"),
33032
33357
  className: cn(
33033
33358
  "h-8 flex-1 rounded-sm border border-border bg-background",
33034
33359
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -33041,8 +33366,8 @@ function BlockRow({
33041
33366
  {
33042
33367
  inputType: "text",
33043
33368
  value: caption,
33044
- placeholder: "Caption (optional)",
33045
- "aria-label": "Image caption",
33369
+ placeholder: t("richBlockEditor.placeholder.caption"),
33370
+ "aria-label": t("richBlockEditor.aria.imageCaption"),
33046
33371
  className: cn(
33047
33372
  "h-8 flex-1 rounded-sm border border-border bg-background",
33048
33373
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -33073,8 +33398,8 @@ function BlockRow({
33073
33398
  tag: "span",
33074
33399
  value: child.content ?? "",
33075
33400
  readOnly,
33076
- placeholder: "List item",
33077
- ariaLabel: "List item",
33401
+ placeholder: t("richBlockEditor.placeholder.listItem"),
33402
+ ariaLabel: t("richBlockEditor.aria.listItem"),
33078
33403
  className: "inline-block min-w-[1ch] flex-1",
33079
33404
  onValueChange: (next) => setChildContent(child.id, next)
33080
33405
  }
@@ -33084,7 +33409,7 @@ function BlockRow({
33084
33409
  {
33085
33410
  type: "button",
33086
33411
  variant: "ghost",
33087
- "aria-label": "Remove list item",
33412
+ "aria-label": t("richBlockEditor.aria.removeListItem"),
33088
33413
  className: cn(
33089
33414
  "h-5 w-5 shrink-0 rounded-sm text-muted-foreground p-0 gap-0",
33090
33415
  "opacity-0 group-hover/item:opacity-100 hover:bg-muted hover:text-foreground"
@@ -33106,7 +33431,8 @@ function BlockRow({
33106
33431
  onClick: addListItem,
33107
33432
  children: [
33108
33433
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", className: "w-3 h-3" }),
33109
- " Add item"
33434
+ " ",
33435
+ t("richBlockEditor.addItem")
33110
33436
  ]
33111
33437
  }
33112
33438
  ) })
@@ -33122,8 +33448,8 @@ function BlockRow({
33122
33448
  tag: "p",
33123
33449
  value: block.content ?? "",
33124
33450
  readOnly,
33125
- placeholder: placeholder ?? "Start writing...",
33126
- ariaLabel: "Paragraph block",
33451
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.paragraph"),
33452
+ ariaLabel: t("richBlockEditor.aria.paragraphBlock"),
33127
33453
  className: "leading-7",
33128
33454
  onValueChange: setContent
33129
33455
  }
@@ -33146,7 +33472,7 @@ function BlockRow({
33146
33472
  {
33147
33473
  type: "button",
33148
33474
  variant: "ghost",
33149
- "aria-label": "Insert paragraph below",
33475
+ "aria-label": t("richBlockEditor.insertParagraphBelow"),
33150
33476
  className: cn(
33151
33477
  "inline-flex h-6 w-6 items-center justify-center rounded-sm p-0 gap-0",
33152
33478
  "text-muted-foreground hover:bg-muted hover:text-foreground",
@@ -33173,7 +33499,7 @@ function BlockRow({
33173
33499
  }
33174
33500
  );
33175
33501
  }
33176
- var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES, RichBlockEditor;
33502
+ var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL_KEY, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES, RichBlockEditor;
33177
33503
  var init_RichBlockEditor = __esm({
33178
33504
  "components/core/molecules/RichBlockEditor.tsx"() {
33179
33505
  "use client";
@@ -33186,29 +33512,30 @@ var init_RichBlockEditor = __esm({
33186
33512
  init_Input();
33187
33513
  init_Icon();
33188
33514
  init_useEventBus();
33515
+ init_useTranslate();
33189
33516
  TOOLBAR_ENTRIES = [
33190
- { type: "paragraph", label: "Text", icon: LucideIcons2.Type },
33191
- { type: "heading-1", label: "H1", icon: LucideIcons2.Heading1 },
33192
- { type: "heading-2", label: "H2", icon: LucideIcons2.Heading2 },
33193
- { type: "heading-3", label: "H3", icon: LucideIcons2.Heading3 },
33194
- { type: "bullet-list", label: "Bullet list", icon: LucideIcons2.List },
33195
- { type: "numbered-list", label: "Numbered", icon: LucideIcons2.ListOrdered },
33196
- { type: "quote", label: "Quote", icon: LucideIcons2.Quote },
33197
- { type: "code", label: "Code", icon: LucideIcons2.Code },
33198
- { type: "divider", label: "Divider", icon: LucideIcons2.Minus },
33199
- { type: "image", label: "Image", icon: LucideIcons2.Image }
33517
+ { type: "paragraph", labelKey: "richBlockEditor.toolbar.text", icon: LucideIcons2.Type },
33518
+ { type: "heading-1", labelKey: "richBlockEditor.toolbar.h1", icon: LucideIcons2.Heading1 },
33519
+ { type: "heading-2", labelKey: "richBlockEditor.toolbar.h2", icon: LucideIcons2.Heading2 },
33520
+ { type: "heading-3", labelKey: "richBlockEditor.toolbar.h3", icon: LucideIcons2.Heading3 },
33521
+ { type: "bullet-list", labelKey: "richBlockEditor.toolbar.bulletList", icon: LucideIcons2.List },
33522
+ { type: "numbered-list", labelKey: "richBlockEditor.toolbar.numbered", icon: LucideIcons2.ListOrdered },
33523
+ { type: "quote", labelKey: "richBlockEditor.toolbar.quote", icon: LucideIcons2.Quote },
33524
+ { type: "code", labelKey: "richBlockEditor.toolbar.code", icon: LucideIcons2.Code },
33525
+ { type: "divider", labelKey: "richBlockEditor.toolbar.divider", icon: LucideIcons2.Minus },
33526
+ { type: "image", labelKey: "richBlockEditor.toolbar.image", icon: LucideIcons2.Image }
33200
33527
  ];
33201
- BLOCK_TYPE_LABEL = {
33202
- paragraph: "Text",
33203
- "heading-1": "Heading 1",
33204
- "heading-2": "Heading 2",
33205
- "heading-3": "Heading 3",
33206
- "bullet-list": "Bullet list",
33207
- "numbered-list": "Numbered list",
33208
- quote: "Quote",
33209
- code: "Code",
33210
- divider: "Divider",
33211
- image: "Image"
33528
+ BLOCK_TYPE_LABEL_KEY = {
33529
+ paragraph: "richBlockEditor.blockType.paragraph",
33530
+ "heading-1": "richBlockEditor.blockType.heading1",
33531
+ "heading-2": "richBlockEditor.blockType.heading2",
33532
+ "heading-3": "richBlockEditor.blockType.heading3",
33533
+ "bullet-list": "richBlockEditor.blockType.bulletList",
33534
+ "numbered-list": "richBlockEditor.blockType.numberedList",
33535
+ quote: "richBlockEditor.blockType.quote",
33536
+ code: "richBlockEditor.blockType.code",
33537
+ divider: "richBlockEditor.blockType.divider",
33538
+ image: "richBlockEditor.blockType.image"
33212
33539
  };
33213
33540
  CHANGEABLE_TYPES = [
33214
33541
  "paragraph",
@@ -33242,6 +33569,7 @@ var init_RichBlockEditor = __esm({
33242
33569
  showToolbar = true,
33243
33570
  className
33244
33571
  }) => {
33572
+ const { t } = useTranslate();
33245
33573
  const [blocks, setBlocks] = React84.useState(
33246
33574
  () => normalizeBlocks(initialBlocks)
33247
33575
  );
@@ -33313,25 +33641,26 @@ var init_RichBlockEditor = __esm({
33313
33641
  Box,
33314
33642
  {
33315
33643
  role: "toolbar",
33316
- "aria-label": "Block editor toolbar",
33644
+ "aria-label": t("richBlockEditor.editorToolbar"),
33317
33645
  className: cn(
33318
33646
  "flex flex-wrap items-center gap-1",
33319
33647
  "border-b border-border bg-muted/30 px-2 py-2"
33320
33648
  ),
33321
33649
  children: TOOLBAR_ENTRIES.map((entry) => {
33322
33650
  const Icon3 = entry.icon;
33651
+ const entryLabel = t(entry.labelKey);
33323
33652
  return /* @__PURE__ */ jsxRuntime.jsxs(
33324
33653
  Button,
33325
33654
  {
33326
33655
  type: "button",
33327
33656
  variant: "ghost",
33328
33657
  size: "sm",
33329
- "aria-label": `Insert ${entry.label}`,
33330
- title: entry.label,
33658
+ "aria-label": t("richBlockEditor.insertEntry", { label: entryLabel }),
33659
+ title: entryLabel,
33331
33660
  onClick: () => handleAppend(entry.type),
33332
33661
  children: [
33333
33662
  /* @__PURE__ */ jsxRuntime.jsx(Icon3, { size: 14 }),
33334
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", variant: "caption", className: "ml-1 hidden text-xs sm:inline", children: entry.label })
33663
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", variant: "caption", className: "ml-1 hidden text-xs sm:inline", children: entryLabel })
33335
33664
  ]
33336
33665
  },
33337
33666
  entry.type
@@ -33374,6 +33703,7 @@ var init_ReplyTree = __esm({
33374
33703
  "use client";
33375
33704
  init_cn();
33376
33705
  init_useEventBus();
33706
+ init_useTranslate();
33377
33707
  init_atoms2();
33378
33708
  init_VoteStack();
33379
33709
  ReplyTreeNode = ({
@@ -33393,6 +33723,7 @@ var init_ReplyTree = __esm({
33393
33723
  showActions
33394
33724
  }) => {
33395
33725
  const eventBus = useEventBus();
33726
+ const { t } = useTranslate();
33396
33727
  const hasReplies = !!node.replies && node.replies.length > 0;
33397
33728
  const isCollapsed = collapsedSet.has(node.id);
33398
33729
  const atMaxDepth = depth >= maxDepth;
@@ -33439,7 +33770,7 @@ var init_ReplyTree = __esm({
33439
33770
  variant: "ghost",
33440
33771
  size: "sm",
33441
33772
  onClick: handleToggle,
33442
- "aria-label": isCollapsed ? "Expand replies" : "Collapse replies",
33773
+ "aria-label": isCollapsed ? t("replyTree.expandReplies") : t("replyTree.collapseReplies"),
33443
33774
  "aria-expanded": !isCollapsed,
33444
33775
  leftIcon: isCollapsed ? "chevron-right" : "chevron-down",
33445
33776
  className: cn(
@@ -33480,7 +33811,7 @@ var init_ReplyTree = __esm({
33480
33811
  onVote: handleVote,
33481
33812
  size: "sm",
33482
33813
  variant: "horizontal",
33483
- label: `Vote on reply by ${node.authorName}`
33814
+ label: t("replyTree.voteOnReplyBy", { author: node.authorName })
33484
33815
  }
33485
33816
  ),
33486
33817
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -33490,8 +33821,8 @@ var init_ReplyTree = __esm({
33490
33821
  size: "sm",
33491
33822
  leftIcon: "message-square",
33492
33823
  onClick: handleReply,
33493
- "aria-label": `Reply to ${node.authorName}`,
33494
- children: "Reply"
33824
+ "aria-label": t("replyTree.replyTo", { author: node.authorName }),
33825
+ children: t("replyTree.reply")
33495
33826
  }
33496
33827
  ),
33497
33828
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -33501,8 +33832,8 @@ var init_ReplyTree = __esm({
33501
33832
  size: "sm",
33502
33833
  leftIcon: "flag",
33503
33834
  onClick: handleFlag,
33504
- "aria-label": `Flag reply by ${node.authorName}`,
33505
- children: "Flag"
33835
+ "aria-label": t("replyTree.flagReplyBy", { author: node.authorName }),
33836
+ children: t("replyTree.flag")
33506
33837
  }
33507
33838
  )
33508
33839
  ] }),
@@ -33513,9 +33844,9 @@ var init_ReplyTree = __esm({
33513
33844
  inputType: "textarea",
33514
33845
  rows: 2,
33515
33846
  value: draft,
33516
- placeholder: `Reply to ${node.authorName}\u2026`,
33847
+ placeholder: t("replyTree.replyToPlaceholder", { author: node.authorName }),
33517
33848
  onChange: (e) => setDraft(e.target.value),
33518
- "aria-label": `Reply to ${node.authorName}`
33849
+ "aria-label": t("replyTree.replyTo", { author: node.authorName })
33519
33850
  }
33520
33851
  ),
33521
33852
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-row gap-2 items-center", children: [
@@ -33527,10 +33858,10 @@ var init_ReplyTree = __esm({
33527
33858
  leftIcon: "send",
33528
33859
  onClick: handleSubmitReply,
33529
33860
  disabled: !draft.trim(),
33530
- children: "Send"
33861
+ children: t("replyTree.send")
33531
33862
  }
33532
33863
  ),
33533
- /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: "Cancel" })
33864
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: t("common.cancel") })
33534
33865
  ] })
33535
33866
  ] }),
33536
33867
  hasReplies && !isCollapsed && (atMaxDepth ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -33544,7 +33875,7 @@ var init_ReplyTree = __esm({
33544
33875
  "self-start gap-1 px-0 h-auto",
33545
33876
  "text-sm text-primary hover:underline hover:bg-transparent"
33546
33877
  ),
33547
- children: "Continue thread"
33878
+ children: t("replyTree.continueThread")
33548
33879
  }
33549
33880
  ) : /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex flex-col gap-2 mt-1", children: node.replies.map((child) => /* @__PURE__ */ jsxRuntime.jsx(
33550
33881
  ReplyTreeNode,
@@ -33583,6 +33914,7 @@ var init_ReplyTree = __esm({
33583
33914
  showActions = true,
33584
33915
  className
33585
33916
  }) => {
33917
+ const { t } = useTranslate();
33586
33918
  const nodeList = Array.isArray(nodes) ? nodes : nodes ? [nodes] : [];
33587
33919
  const [collapsedSet, setCollapsedSet] = React84.useState(() => {
33588
33920
  const acc = /* @__PURE__ */ new Set();
@@ -33601,7 +33933,7 @@ var init_ReplyTree = __esm({
33601
33933
  });
33602
33934
  }, []);
33603
33935
  if (nodeList.length === 0) {
33604
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("text-sm text-muted-foreground", className), children: "No replies yet." });
33936
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("text-sm text-muted-foreground", className), children: t("replyTree.noRepliesYet") });
33605
33937
  }
33606
33938
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex flex-col gap-2 min-w-0", className), children: nodeList.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
33607
33939
  ReplyTreeNode,
@@ -33679,6 +34011,7 @@ var init_VersionDiff = __esm({
33679
34011
  "use client";
33680
34012
  init_cn();
33681
34013
  init_useEventBus();
34014
+ init_useTranslate();
33682
34015
  init_atoms2();
33683
34016
  init_Stack();
33684
34017
  INLINE_STYLES = {
@@ -33701,6 +34034,7 @@ var init_VersionDiff = __esm({
33701
34034
  language,
33702
34035
  className
33703
34036
  }) => {
34037
+ const { t } = useTranslate();
33704
34038
  const eventBus = useEventBus();
33705
34039
  const revisions = Array.isArray(revisionsProp) ? revisionsProp : [];
33706
34040
  const fallbackBefore = revisions[0]?.id ?? "";
@@ -33782,24 +34116,24 @@ var init_VersionDiff = __esm({
33782
34116
  children: [
33783
34117
  /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: "flex-wrap", children: [
33784
34118
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "git-commit", size: "sm", className: "text-muted-foreground" }),
33785
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "whitespace-nowrap", children: "Compare" }),
34119
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "whitespace-nowrap", children: t("versionDiff.compare") }),
33786
34120
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsxRuntime.jsx(
33787
34121
  Select,
33788
34122
  {
33789
34123
  options,
33790
34124
  value: activeBeforeId,
33791
34125
  onChange: handleBeforeChange,
33792
- "aria-label": "Before revision"
34126
+ "aria-label": t("versionDiff.beforeRevision")
33793
34127
  }
33794
34128
  ) }),
33795
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: "to" }),
34129
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: t("versionDiff.to") }),
33796
34130
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsxRuntime.jsx(
33797
34131
  Select,
33798
34132
  {
33799
34133
  options,
33800
34134
  value: activeAfterId,
33801
34135
  onChange: handleAfterChange,
33802
- "aria-label": "After revision"
34136
+ "aria-label": t("versionDiff.afterRevision")
33803
34137
  }
33804
34138
  ) }),
33805
34139
  language && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "default", children: language }),
@@ -33820,7 +34154,7 @@ var init_VersionDiff = __esm({
33820
34154
  size: "sm",
33821
34155
  icon: activeView === "side-by-side" ? "align-left" : "columns",
33822
34156
  onClick: handleViewToggle,
33823
- "aria-label": activeView === "side-by-side" ? "Switch to inline view" : "Switch to side-by-side view"
34157
+ "aria-label": activeView === "side-by-side" ? t("versionDiff.switchToInline") : t("versionDiff.switchToSideBySide")
33824
34158
  }
33825
34159
  ),
33826
34160
  (onRevert || revertEvent) && /* @__PURE__ */ jsxRuntime.jsx(
@@ -33830,7 +34164,7 @@ var init_VersionDiff = __esm({
33830
34164
  size: "sm",
33831
34165
  icon: "rotate-ccw",
33832
34166
  onClick: handleRevert,
33833
- children: "Revert"
34167
+ children: t("versionDiff.revert")
33834
34168
  }
33835
34169
  )
33836
34170
  ] })
@@ -33847,12 +34181,12 @@ var init_VersionDiff = __esm({
33847
34181
  children: [
33848
34182
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
33849
34183
  beforeRev?.label,
33850
- beforeRev?.author ? ` by ${beforeRev.author}` : "",
34184
+ beforeRev?.author ? t("versionDiff.byAuthor", { author: beforeRev.author }) : "",
33851
34185
  beforeRev?.timestamp ? ` (${beforeRev.timestamp})` : ""
33852
34186
  ] }),
33853
34187
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
33854
34188
  afterRev?.label,
33855
- afterRev?.author ? ` by ${afterRev.author}` : "",
34189
+ afterRev?.author ? t("versionDiff.byAuthor", { author: afterRev.author }) : "",
33856
34190
  afterRev?.timestamp ? ` (${afterRev.timestamp})` : ""
33857
34191
  ] })
33858
34192
  ]
@@ -34245,10 +34579,12 @@ var init_DocPagination = __esm({
34245
34579
  }
34246
34580
  });
34247
34581
  function DocSearch({
34248
- placeholder = "Search documentation...",
34582
+ placeholder,
34249
34583
  onSearch,
34250
34584
  className
34251
34585
  }) {
34586
+ const { t } = useTranslate();
34587
+ const resolvedPlaceholder = placeholder ?? t("docSearch.placeholder");
34252
34588
  const [query, setQuery] = React84.useState("");
34253
34589
  const [results, setResults] = React84.useState([]);
34254
34590
  const [isOpen, setIsOpen] = React84.useState(false);
@@ -34355,7 +34691,7 @@ function DocSearch({
34355
34691
  Input,
34356
34692
  {
34357
34693
  inputType: "search",
34358
- placeholder,
34694
+ placeholder: resolvedPlaceholder,
34359
34695
  value: query,
34360
34696
  onChange: handleChange,
34361
34697
  onFocus: handleFocus,
@@ -34420,6 +34756,7 @@ var init_DocSearch = __esm({
34420
34756
  init_Typography();
34421
34757
  init_Icon();
34422
34758
  init_Input();
34759
+ init_useTranslate();
34423
34760
  }
34424
34761
  });
34425
34762
  var DocSidebarCategory, DocSidebar;
@@ -36424,8 +36761,8 @@ var init_SignaturePad = __esm({
36424
36761
  init_useEventBus();
36425
36762
  init_useTranslate();
36426
36763
  SignaturePad = ({
36427
- label = "Signature",
36428
- helperText = "Draw your signature above",
36764
+ label,
36765
+ helperText,
36429
36766
  strokeColor,
36430
36767
  strokeWidth = 2,
36431
36768
  height = 200,
@@ -36441,6 +36778,8 @@ var init_SignaturePad = __esm({
36441
36778
  }) => {
36442
36779
  const eventBus = useEventBus();
36443
36780
  const { t } = useTranslate();
36781
+ const resolvedLabel = label ?? t("signaturePad.label");
36782
+ const resolvedHelperText = helperText ?? t("signaturePad.helperText");
36444
36783
  const canvasRef = React84.useRef(null);
36445
36784
  const [isDrawing, setIsDrawing] = React84.useState(false);
36446
36785
  const [hasSignature, setHasSignature] = React84.useState(!!value);
@@ -36543,7 +36882,7 @@ var init_SignaturePad = __esm({
36543
36882
  );
36544
36883
  }
36545
36884
  return /* @__PURE__ */ jsxRuntime.jsx(Card, { className: cn("p-4", className), children: /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "sm", children: [
36546
- label && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "medium", children: label }),
36885
+ resolvedLabel && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "medium", children: resolvedLabel }),
36547
36886
  /* @__PURE__ */ jsxRuntime.jsx(
36548
36887
  Box,
36549
36888
  {
@@ -36572,7 +36911,7 @@ var init_SignaturePad = __esm({
36572
36911
  )
36573
36912
  }
36574
36913
  ),
36575
- helperText && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: helperText }),
36914
+ resolvedHelperText && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: resolvedHelperText }),
36576
36915
  !readOnly && /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", justify: "end", children: [
36577
36916
  /* @__PURE__ */ jsxRuntime.jsx(
36578
36917
  Button,
@@ -36582,7 +36921,7 @@ var init_SignaturePad = __esm({
36582
36921
  icon: LucideIcons2.Eraser,
36583
36922
  onClick: clearSignature,
36584
36923
  disabled: !hasSignature,
36585
- children: "Clear"
36924
+ children: t("signaturePad.clear")
36586
36925
  }
36587
36926
  ),
36588
36927
  signEvent && /* @__PURE__ */ jsxRuntime.jsx(
@@ -36593,7 +36932,7 @@ var init_SignaturePad = __esm({
36593
36932
  icon: LucideIcons2.Check,
36594
36933
  onClick: confirmSignature,
36595
36934
  disabled: !hasSignature,
36596
- children: "Confirm"
36935
+ children: t("signaturePad.confirm")
36597
36936
  }
36598
36937
  )
36599
36938
  ] })
@@ -41038,6 +41377,7 @@ function MasterDetail({
41038
41377
  className,
41039
41378
  ...rest
41040
41379
  }) {
41380
+ const { t } = useTranslate();
41041
41381
  const loading = externalLoading ?? false;
41042
41382
  const isLoading = externalIsLoading ?? false;
41043
41383
  const error = externalError ?? null;
@@ -41050,8 +41390,8 @@ function MasterDetail({
41050
41390
  isLoading: loading || isLoading,
41051
41391
  error,
41052
41392
  className,
41053
- emptyTitle: "No items found",
41054
- emptyDescription: "Create your first item to get started.",
41393
+ emptyTitle: t("table.empty.title"),
41394
+ emptyDescription: t("empty.createFirst"),
41055
41395
  ...rest
41056
41396
  }
41057
41397
  );
@@ -41060,6 +41400,7 @@ var init_MasterDetail = __esm({
41060
41400
  "components/core/organisms/MasterDetail.tsx"() {
41061
41401
  "use client";
41062
41402
  init_DataTable();
41403
+ init_useTranslate();
41063
41404
  MasterDetail.displayName = "MasterDetail";
41064
41405
  }
41065
41406
  });
@@ -41068,14 +41409,18 @@ var init_MasterDetailLayout = __esm({
41068
41409
  "components/core/organisms/layout/MasterDetailLayout.tsx"() {
41069
41410
  init_cn();
41070
41411
  init_Typography();
41071
- DefaultEmptyDetail = () => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsxRuntime.jsx(
41072
- Typography,
41073
- {
41074
- variant: "body2",
41075
- className: "text-muted-foreground",
41076
- children: "Select an item to view details"
41077
- }
41078
- ) });
41412
+ init_useTranslate();
41413
+ DefaultEmptyDetail = () => {
41414
+ const { t } = useTranslate();
41415
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsxRuntime.jsx(
41416
+ Typography,
41417
+ {
41418
+ variant: "body2",
41419
+ className: "text-muted-foreground",
41420
+ children: t("masterDetail.selectItem")
41421
+ }
41422
+ ) });
41423
+ };
41079
41424
  MasterDetailLayout = ({
41080
41425
  master,
41081
41426
  detail,
@@ -41202,7 +41547,7 @@ var init_MediaGallery = __esm({
41202
41547
  {
41203
41548
  icon: LucideIcons2.Image,
41204
41549
  title: t("display.noMedia"),
41205
- description: "No media items to display.",
41550
+ description: t("mediaGallery.noMediaDescription"),
41206
41551
  className
41207
41552
  }
41208
41553
  );
@@ -41219,7 +41564,7 @@ var init_MediaGallery = __esm({
41219
41564
  size: "sm",
41220
41565
  icon: LucideIcons2.Upload,
41221
41566
  action: "MEDIA_UPLOAD",
41222
- children: "Upload"
41567
+ children: t("mediaGallery.upload")
41223
41568
  }
41224
41569
  ),
41225
41570
  actions?.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -41233,10 +41578,7 @@ var init_MediaGallery = __esm({
41233
41578
  ))
41234
41579
  ] })
41235
41580
  ] }),
41236
- selectable && selectedItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(HStack, { gap: "sm", align: "center", children: /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "info", children: [
41237
- selectedItems.length,
41238
- " selected"
41239
- ] }) }),
41581
+ selectable && selectedItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(HStack, { gap: "sm", align: "center", children: /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "info", children: t("table.bulk.selected", { count: selectedItems.length }) }) }),
41240
41582
  /* @__PURE__ */ jsxRuntime.jsx(
41241
41583
  Box,
41242
41584
  {
@@ -42110,7 +42452,7 @@ function TraitsTab({ traits: traits2 }) {
42110
42452
  EmptyState,
42111
42453
  {
42112
42454
  title: t("debug.noActiveTraits"),
42113
- description: "Traits will appear when components using them are mounted",
42455
+ description: t("debug.traitsMountHint"),
42114
42456
  className: "py-8"
42115
42457
  }
42116
42458
  );
@@ -42120,14 +42462,11 @@ function TraitsTab({ traits: traits2 }) {
42120
42462
  header: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 w-full", children: [
42121
42463
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", weight: "semibold", className: "text-purple-600 dark:text-purple-400", children: trait.name }),
42122
42464
  /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "success", size: "sm", children: trait.currentState }),
42123
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: [
42124
- trait.transitionCount,
42125
- " transitions"
42126
- ] })
42465
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: t("debug.transitionsCount", { count: trait.transitionCount }) })
42127
42466
  ] }),
42128
42467
  content: /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "sm", children: [
42129
42468
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42130
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "States" }),
42469
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.states") }),
42131
42470
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: trait.states.map((state) => /* @__PURE__ */ jsxRuntime.jsx(
42132
42471
  Badge,
42133
42472
  {
@@ -42139,7 +42478,7 @@ function TraitsTab({ traits: traits2 }) {
42139
42478
  )) })
42140
42479
  ] }),
42141
42480
  trait.transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42142
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Transitions" }),
42481
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.transitions") }),
42143
42482
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: trait.transitions.map((t2, i) => /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "font-mono", children: [
42144
42483
  t2.from,
42145
42484
  " \u2192 ",
@@ -42158,7 +42497,7 @@ function TraitsTab({ traits: traits2 }) {
42158
42497
  ] }, i)) })
42159
42498
  ] }),
42160
42499
  trait.guards.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42161
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Guards" }),
42500
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.guards") }),
42162
42501
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: trait.guards.map((g, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
42163
42502
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: g.name }),
42164
42503
  /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: g.lastResult === true ? "success" : g.lastResult === false ? "danger" : "default", size: "sm", children: g.lastResult === void 0 ? "?" : g.lastResult ? "\u2713" : "\u2717" })
@@ -42264,7 +42603,7 @@ function EntitiesTab({ snapshot }) {
42264
42603
  EmptyState,
42265
42604
  {
42266
42605
  title: t("debug.noEntityData"),
42267
- description: "Debug mode may not be enabled",
42606
+ description: t("debug.debugModeHint"),
42268
42607
  className: "py-8"
42269
42608
  }
42270
42609
  );
@@ -42277,7 +42616,7 @@ function EntitiesTab({ snapshot }) {
42277
42616
  EmptyState,
42278
42617
  {
42279
42618
  title: t("debug.noEntities"),
42280
- description: "Entities will appear when spawned",
42619
+ description: t("debug.entitiesSpawnHint"),
42281
42620
  className: "py-8"
42282
42621
  }
42283
42622
  );
@@ -42285,7 +42624,7 @@ function EntitiesTab({ snapshot }) {
42285
42624
  const singletonItems = singletonEntries.map(([name, data]) => ({
42286
42625
  id: `singleton-${name}`,
42287
42626
  header: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
42288
- /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "sm", children: "Singleton" }),
42627
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "sm", children: t("debug.singleton") }),
42289
42628
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", weight: "semibold", className: "text-sky-600 dark:text-sky-400", children: name })
42290
42629
  ] }),
42291
42630
  content: /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "text-xs text-gray-600 dark:text-gray-400 bg-gray-50 dark:bg-gray-800 p-2 rounded overflow-auto max-h-40", children: JSON.stringify(data, null, 2) })
@@ -42303,31 +42642,19 @@ function EntitiesTab({ snapshot }) {
42303
42642
  }));
42304
42643
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--entities", children: [
42305
42644
  singletonItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4", children: [
42306
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
42307
- "Singletons (",
42308
- singletonItems.length,
42309
- ")"
42310
- ] }),
42645
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.singletonsCount", { count: singletonItems.length }) }),
42311
42646
  /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: singletonItems, multiple: true })
42312
42647
  ] }),
42313
42648
  runtimeItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4", children: [
42314
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
42315
- "Runtime (",
42316
- runtimeEntities.length,
42317
- ")"
42318
- ] }),
42649
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.runtimeCount", { count: runtimeEntities.length }) }),
42319
42650
  /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: runtimeItems, multiple: true }),
42320
- runtimeEntities.length > 20 && /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-400 text-center mt-2", children: [
42321
- "+",
42322
- runtimeEntities.length - 20,
42323
- " more entities"
42324
- ] })
42651
+ runtimeEntities.length > 20 && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-400 text-center mt-2", children: t("debug.moreEntities", { count: runtimeEntities.length - 20 }) })
42325
42652
  ] }),
42326
42653
  persistentEntries.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42327
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Persistent" }),
42654
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.persistent") }),
42328
42655
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: persistentEntries.map(([type, info]) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between py-1", children: [
42329
42656
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: type }),
42330
- /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: info.loaded ? "success" : "default", size: "sm", children: info.loaded ? `${info.count} loaded` : "not loaded" })
42657
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: info.loaded ? "success" : "default", size: "sm", children: info.loaded ? t("debug.loadedCount", { count: info.count }) : t("debug.notLoaded") })
42331
42658
  ] }, type)) })
42332
42659
  ] })
42333
42660
  ] });
@@ -42371,7 +42698,7 @@ function EventFlowTab({ events: events2 }) {
42371
42698
  EmptyState,
42372
42699
  {
42373
42700
  title: t("debug.noEventsYet"),
42374
- description: "Events will appear as traits, ticks, and other systems execute",
42701
+ description: t("debug.eventsExecuteHint"),
42375
42702
  className: "py-8"
42376
42703
  }
42377
42704
  );
@@ -42382,17 +42709,13 @@ function EventFlowTab({ events: events2 }) {
42382
42709
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--events", children: [
42383
42710
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 mb-3 flex-wrap", children: [
42384
42711
  /* @__PURE__ */ jsxRuntime.jsxs(ButtonGroup, { children: [
42385
- /* @__PURE__ */ jsxRuntime.jsxs(
42712
+ /* @__PURE__ */ jsxRuntime.jsx(
42386
42713
  Button,
42387
42714
  {
42388
42715
  size: "sm",
42389
42716
  variant: filter === "all" ? "primary" : "secondary",
42390
42717
  onClick: () => setFilter("all"),
42391
- children: [
42392
- "All (",
42393
- events2.length,
42394
- ")"
42395
- ]
42718
+ children: t("debug.allCount", { count: events2.length })
42396
42719
  }
42397
42720
  ),
42398
42721
  eventTypes.map((type) => {
@@ -42422,7 +42745,7 @@ function EventFlowTab({ events: events2 }) {
42422
42745
  onChange: (e) => setAutoScroll(e.target.checked)
42423
42746
  }
42424
42747
  ),
42425
- "Auto-scroll"
42748
+ t("debug.autoScroll")
42426
42749
  ] })
42427
42750
  ] }),
42428
42751
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -42480,7 +42803,7 @@ function GuardsPanel({ guards }) {
42480
42803
  EmptyState,
42481
42804
  {
42482
42805
  title: t("debug.noGuardEvaluations"),
42483
- description: "Guard evaluations will appear when transitions or ticks with guards execute",
42806
+ description: t("debug.guardEvaluationsHint"),
42484
42807
  className: "py-8"
42485
42808
  }
42486
42809
  );
@@ -42511,15 +42834,15 @@ function GuardsPanel({ guards }) {
42511
42834
  ] }),
42512
42835
  content: /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "sm", children: [
42513
42836
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42514
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Expression" }),
42837
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.expression") }),
42515
42838
  /* @__PURE__ */ jsxRuntime.jsx("code", { className: "block mt-1 text-xs text-amber-600 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20 px-2 py-1 rounded", children: guard.expression })
42516
42839
  ] }),
42517
42840
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42518
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Inputs" }),
42841
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.inputs") }),
42519
42842
  /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "mt-1 text-xs text-gray-600 dark:text-gray-400 bg-gray-50 dark:bg-gray-800 p-2 rounded overflow-auto max-h-24", children: JSON.stringify(guard.inputs, null, 2) })
42520
42843
  ] }),
42521
42844
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42522
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Trait" }),
42845
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.trait") }),
42523
42846
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: guard.context.traitName })
42524
42847
  ] })
42525
42848
  ] })
@@ -42537,9 +42860,9 @@ function GuardsPanel({ guards }) {
42537
42860
  ] })
42538
42861
  ] }),
42539
42862
  /* @__PURE__ */ jsxRuntime.jsxs(ButtonGroup, { children: [
42540
- /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: "All" }),
42541
- /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: "Passed" }),
42542
- /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "failed" ? "primary" : "secondary", onClick: () => setFilter("failed"), children: "Failed" })
42863
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: t("debug.filterAll") }),
42864
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: t("debug.filterPassed") }),
42865
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "failed" ? "primary" : "secondary", onClick: () => setFilter("failed"), children: t("debug.filterFailed") })
42543
42866
  ] })
42544
42867
  ] }),
42545
42868
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-80 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: accordionItems }) })
@@ -42665,7 +42988,7 @@ function TransitionTimeline({ transitions }) {
42665
42988
  EmptyState,
42666
42989
  {
42667
42990
  title: t("debug.noTransitionsRecorded"),
42668
- description: "Transitions will appear as the state machine processes events",
42991
+ description: t("debug.transitionsProcessHint"),
42669
42992
  className: "py-8"
42670
42993
  }
42671
42994
  );
@@ -42682,10 +43005,7 @@ function TransitionTimeline({ transitions }) {
42682
43005
  const sorted = [...transitions].reverse();
42683
43006
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--timeline", children: [
42684
43007
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-2", children: [
42685
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-500", children: [
42686
- transitions.length,
42687
- " transitions recorded"
42688
- ] }),
43008
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500", children: t("debug.transitionsRecorded", { count: transitions.length }) }),
42689
43009
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-1 text-xs text-gray-500 cursor-pointer", children: [
42690
43010
  /* @__PURE__ */ jsxRuntime.jsx(
42691
43011
  Checkbox,
@@ -42694,7 +43014,7 @@ function TransitionTimeline({ transitions }) {
42694
43014
  onChange: (e) => setAutoScroll(e.target.checked)
42695
43015
  }
42696
43016
  ),
42697
- "Auto-scroll"
43017
+ t("debug.autoScroll")
42698
43018
  ] })
42699
43019
  ] }),
42700
43020
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -42737,15 +43057,13 @@ function TransitionTimeline({ transitions }) {
42737
43057
  variant: trace.guardResult ? "success" : "danger",
42738
43058
  size: "sm",
42739
43059
  children: [
42740
- "guard: ",
43060
+ t("debug.guardLabel"),
43061
+ " ",
42741
43062
  trace.guardResult ? "\u2713" : "\u2717"
42742
43063
  ]
42743
43064
  }
42744
43065
  ),
42745
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: [
42746
- trace.effects.length,
42747
- " effects"
42748
- ] })
43066
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: t("debug.effectsCount", { count: trace.effects.length }) })
42749
43067
  ] }),
42750
43068
  isExpanded && trace.effects.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-2 mt-1 mb-2 pl-2 border-l border-gray-200 dark:border-gray-700 space-y-1", children: trace.effects.map((effect, eIdx) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [
42751
43069
  /* @__PURE__ */ jsxRuntime.jsx(EffectBadge, { effect }),
@@ -42794,13 +43112,13 @@ function ServerBridgeTab({ bridge }) {
42794
43112
  EmptyState,
42795
43113
  {
42796
43114
  title: t("debug.noBridgeData"),
42797
- description: "The ServerBridge has not been initialized. Bridge health will appear once the runtime connects to the server.",
43115
+ description: t("debug.bridgeInitHint"),
42798
43116
  className: "py-8"
42799
43117
  }
42800
43118
  );
42801
43119
  }
42802
43120
  const formatTime4 = (ts) => {
42803
- if (ts === 0) return "Never";
43121
+ if (ts === 0) return t("debug.never");
42804
43122
  const d = new Date(ts);
42805
43123
  return d.toLocaleTimeString("en-US", {
42806
43124
  hour12: false,
@@ -42813,14 +43131,14 @@ function ServerBridgeTab({ bridge }) {
42813
43131
  /* @__PURE__ */ jsxRuntime.jsxs(Card, { className: "p-3", children: [
42814
43132
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 mb-3", children: [
42815
43133
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: `w-3 h-3 rounded-full ${bridge.connected ? "bg-green-500 animate-pulse" : "bg-red-500"}` }),
42816
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: bridge.connected ? "Connected" : "Disconnected" })
43134
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: bridge.connected ? t("debug.connected") : t("debug.disconnected") })
42817
43135
  ] }),
42818
43136
  /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "xs", children: [
42819
43137
  /* @__PURE__ */ jsxRuntime.jsx(
42820
43138
  StatRow,
42821
43139
  {
42822
43140
  label: t("debug.status"),
42823
- value: bridge.connected ? "Connected" : "Disconnected",
43141
+ value: bridge.connected ? t("debug.connected") : t("debug.disconnected"),
42824
43142
  variant: bridge.connected ? "success" : "danger"
42825
43143
  }
42826
43144
  ),
@@ -42848,13 +43166,10 @@ function ServerBridgeTab({ bridge }) {
42848
43166
  ] })
42849
43167
  ] }),
42850
43168
  bridge.lastError && /* @__PURE__ */ jsxRuntime.jsxs(Card, { className: "p-3 border-red-200 dark:border-red-800 bg-red-50 dark:bg-red-950", children: [
42851
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "semibold", className: "text-red-600 dark:text-red-400 mb-1", children: "Last Error" }),
43169
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "semibold", className: "text-red-600 dark:text-red-400 mb-1", children: t("debug.lastError") }),
42852
43170
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-red-500 font-mono break-all", children: bridge.lastError })
42853
43171
  ] }),
42854
- bridge.connected && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-2", children: /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-400", children: [
42855
- bridge.eventsForwarded + bridge.eventsReceived,
42856
- " total events processed"
42857
- ] }) })
43172
+ bridge.connected && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-2", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-400", children: t("debug.totalEventsProcessed", { count: bridge.eventsForwarded + bridge.eventsReceived }) }) })
42858
43173
  ] }) });
42859
43174
  }
42860
43175
  var init_ServerBridgeTab = __esm({
@@ -42964,7 +43279,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
42964
43279
  EmptyState,
42965
43280
  {
42966
43281
  title: t("debug.noActiveTraits"),
42967
- description: "Traits will appear when the state machine initializes",
43282
+ description: t("debug.traitsInitHint"),
42968
43283
  className: "py-8"
42969
43284
  }
42970
43285
  );
@@ -42981,7 +43296,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
42981
43296
  };
42982
43297
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--dispatch", children: [
42983
43298
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3", children: [
42984
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Active States" }),
43299
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.activeStates") }),
42985
43300
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: traits2.map((trait) => /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "success", size: "sm", children: [
42986
43301
  trait.name,
42987
43302
  ": ",
@@ -42989,8 +43304,8 @@ function EventDispatcherTab({ traits: traits2, schema }) {
42989
43304
  ] }, trait.id)) })
42990
43305
  ] }),
42991
43306
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3", children: [
42992
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Available Events" }),
42993
- availableEvents.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-400 italic", children: "No transitions from current state" }) : /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: availableEvents.map(({ event, transitions }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43307
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.availableEvents") }),
43308
+ availableEvents.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-400 italic", children: t("debug.noTransitionsFromState") }) : /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: availableEvents.map(({ event, transitions }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
42994
43309
  /* @__PURE__ */ jsxRuntime.jsx(
42995
43310
  Button,
42996
43311
  {
@@ -43002,15 +43317,15 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43002
43317
  }
43003
43318
  ),
43004
43319
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500", children: transitions.map((t2) => `${t2.from} -> ${t2.to}`).join(", ") }),
43005
- transitions.some((t2) => t2.guard) && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "warning", size: "sm", children: "guarded" })
43320
+ transitions.some((tr) => tr.guard) && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "warning", size: "sm", children: t("debug.guarded") })
43006
43321
  ] }, event)) })
43007
43322
  ] }),
43008
43323
  unavailableEvents.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3", children: [
43009
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Other Events (not available from current state)" }),
43324
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.otherEvents") }),
43010
43325
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: unavailableEvents.map((event) => /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "default", size: "sm", className: "opacity-50", children: event }, event)) })
43011
43326
  ] }),
43012
43327
  log12.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
43013
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Recent Transitions" }),
43328
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.recentTransitions") }),
43014
43329
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: log12.map((entry, i) => /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "font-mono text-xs", children: [
43015
43330
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-400", children: entry.traitName }),
43016
43331
  " ",
@@ -43041,21 +43356,20 @@ var init_RuntimeDebugger = __esm({
43041
43356
  }
43042
43357
  });
43043
43358
  function ServerResponseRow({ sr }) {
43359
+ const { t } = useTranslate();
43044
43360
  const entityEntries = Object.entries(sr.dataEntities);
43045
43361
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-4 pl-2 border-l border-purple-500/30 py-0.5 text-xs font-mono", children: [
43046
43362
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43047
43363
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: sr.success ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400", children: [
43048
43364
  sr.success ? "\u2713" : "\u2717",
43049
- " server"
43365
+ " ",
43366
+ t("debug.server")
43050
43367
  ] }),
43051
43368
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-300", children: sr.orbitalName }),
43052
- sr.clientEffects > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "px-1 rounded bg-purple-500/15 text-purple-600 dark:text-purple-300", children: [
43053
- sr.clientEffects,
43054
- " clientEffect",
43055
- sr.clientEffects !== 1 ? "s" : ""
43056
- ] }),
43369
+ sr.clientEffects > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "px-1 rounded bg-purple-500/15 text-purple-600 dark:text-purple-300", children: t("debug.clientEffectsCount", { count: sr.clientEffects }) }),
43057
43370
  sr.emittedEvents.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "px-1 rounded bg-blue-500/15 text-blue-300", children: [
43058
- "emit: ",
43371
+ t("debug.emitLabel"),
43372
+ " ",
43059
43373
  sr.emittedEvents.join(", ")
43060
43374
  ] }),
43061
43375
  sr.error && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "px-1 rounded bg-red-500/15 text-red-600 dark:text-red-400 truncate max-w-[300px]", children: sr.error })
@@ -43063,13 +43377,12 @@ function ServerResponseRow({ sr }) {
43063
43377
  entityEntries.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1 mt-0.5", children: entityEntries.map(([name, count]) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "px-1 rounded bg-[var(--color-card)] text-foreground", children: [
43064
43378
  name,
43065
43379
  ": ",
43066
- count,
43067
- " row",
43068
- count !== 1 ? "s" : ""
43380
+ t("debug.rowsCount", { count })
43069
43381
  ] }, name)) })
43070
43382
  ] });
43071
43383
  }
43072
43384
  function TransitionRow({ trace }) {
43385
+ const { t } = useTranslate();
43073
43386
  const isServerEntry = !!trace.serverResponse && trace.traitName.startsWith("server:");
43074
43387
  const hasFailedEffects = trace.effects.some((e) => e.status === "failed");
43075
43388
  if (isServerEntry && trace.serverResponse) {
@@ -43077,7 +43390,7 @@ function TransitionRow({ trace }) {
43077
43390
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-2 text-xs font-mono", children: [
43078
43391
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-1.5 w-1.5 h-1.5 rounded-full flex-shrink-0 bg-purple-500" }),
43079
43392
  /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "warning", size: "sm", className: "flex-shrink-0", children: trace.event }),
43080
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-400 flex-shrink-0", children: "server response" })
43393
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-400 flex-shrink-0", children: t("debug.serverResponse") })
43081
43394
  ] }),
43082
43395
  /* @__PURE__ */ jsxRuntime.jsx(ServerResponseRow, { sr: trace.serverResponse })
43083
43396
  ] });
@@ -43118,6 +43431,7 @@ function VerifyModePanel({
43118
43431
  serverCount,
43119
43432
  localCount
43120
43433
  }) {
43434
+ const { t } = useTranslate();
43121
43435
  const [expanded, setExpanded] = React84__namespace.useState(true);
43122
43436
  const scrollRef = React84__namespace.useRef(null);
43123
43437
  const prevCountRef = React84__namespace.useRef(0);
@@ -43148,30 +43462,20 @@ function VerifyModePanel({
43148
43462
  onClick: () => setExpanded((v) => !v),
43149
43463
  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",
43150
43464
  "aria-expanded": expanded,
43151
- "aria-label": expanded ? "Collapse verification timeline" : "Expand verification timeline",
43465
+ "aria-label": expanded ? t("debug.collapseVerificationTimeline") : t("debug.expandVerificationTimeline"),
43152
43466
  "data-testid": "debugger-verify-toggle",
43153
43467
  children: [
43154
43468
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground/50 w-3", "aria-hidden": true, children: expanded ? "\u25BE" : "\u25B8" }),
43155
- /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? `${failedChecks} fail` : "OK" }),
43156
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-foreground/70", children: [
43157
- localCount,
43158
- " local"
43159
- ] }),
43160
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-purple-600 dark:text-purple-400", children: [
43161
- serverCount,
43162
- " server"
43163
- ] }),
43469
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? t("debug.failCount", { count: failedChecks }) : t("debug.ok") }),
43470
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground/70", children: t("debug.localCount", { count: localCount }) }),
43471
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-400", children: t("debug.serverCount", { count: serverCount }) }),
43164
43472
  traitStates && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-cyan-600 dark:text-cyan-400 truncate max-w-[400px]", children: traitStates }),
43165
- !expanded && transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ml-auto text-foreground/50", children: [
43166
- transitions.length,
43167
- " transition",
43168
- transitions.length !== 1 ? "s" : ""
43169
- ] })
43473
+ !expanded && transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto text-foreground/50", children: t("debug.transitionsCount", { count: transitions.length }) })
43170
43474
  ]
43171
43475
  }
43172
43476
  ),
43173
43477
  expanded && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 flex overflow-hidden", children: [
43174
- /* @__PURE__ */ jsxRuntime.jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-1", children: transitions.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-foreground/50 text-xs font-mono py-2 text-center", children: "Waiting for transitions..." }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-0.5", children: transitions.map((trace) => /* @__PURE__ */ jsxRuntime.jsx(TransitionRow, { trace }, trace.id)) }) }) }),
43478
+ /* @__PURE__ */ jsxRuntime.jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-1", children: transitions.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-foreground/50 text-xs font-mono py-2 text-center", children: t("debug.waitingForTransitions") }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-0.5", children: transitions.map((trace) => /* @__PURE__ */ jsxRuntime.jsx(TransitionRow, { trace }, trace.id)) }) }) }),
43175
43479
  /* @__PURE__ */ jsxRuntime.jsx(WalkMinimap, {})
43176
43480
  ] })
43177
43481
  ]
@@ -43187,6 +43491,7 @@ function RuntimeDebugger({
43187
43491
  defaultTab,
43188
43492
  schema
43189
43493
  }) {
43494
+ const { t } = useTranslate();
43190
43495
  const [isCollapsed, setIsCollapsed] = React84__namespace.useState(mode === "verify" ? true : defaultCollapsed);
43191
43496
  const [isVisible, setIsVisible] = React84__namespace.useState(mode === "inline" || mode === "verify" || isDebugEnabled2());
43192
43497
  const debugData = useDebugData();
@@ -43225,55 +43530,55 @@ function RuntimeDebugger({
43225
43530
  const tabItems = [
43226
43531
  {
43227
43532
  id: "dispatch",
43228
- label: "Dispatch",
43533
+ label: t("debug.tabDispatch"),
43229
43534
  badge: debugData.traits.length || void 0,
43230
43535
  content: /* @__PURE__ */ jsxRuntime.jsx(EventDispatcherTab, { traits: debugData.traits, schema })
43231
43536
  },
43232
43537
  {
43233
43538
  id: "verify",
43234
- label: failedChecks > 0 ? "Verify (!)" : "Verify",
43539
+ label: failedChecks > 0 ? t("debug.tabVerifyAlert") : t("debug.tabVerify"),
43235
43540
  badge: verification.summary.totalChecks || void 0,
43236
43541
  content: /* @__PURE__ */ jsxRuntime.jsx(VerificationTab, { checks: verification.checks, summary: verification.summary })
43237
43542
  },
43238
43543
  {
43239
43544
  id: "timeline",
43240
- label: "Timeline",
43545
+ label: t("debug.tabTimeline"),
43241
43546
  badge: verification.transitions.length || void 0,
43242
43547
  content: /* @__PURE__ */ jsxRuntime.jsx(TransitionTimeline, { transitions: verification.transitions })
43243
43548
  },
43244
43549
  {
43245
43550
  id: "bridge",
43246
- label: "Bridge",
43551
+ label: t("debug.tabBridge"),
43247
43552
  badge: verification.bridge?.connected ? void 0 : 1,
43248
43553
  content: /* @__PURE__ */ jsxRuntime.jsx(ServerBridgeTab, { bridge: verification.bridge })
43249
43554
  },
43250
43555
  {
43251
43556
  id: "traits",
43252
- label: "Traits",
43557
+ label: t("debug.tabTraits"),
43253
43558
  badge: debugData.traits.length || void 0,
43254
43559
  content: /* @__PURE__ */ jsxRuntime.jsx(TraitsTab, { traits: debugData.traits })
43255
43560
  },
43256
43561
  {
43257
43562
  id: "ticks",
43258
- label: "Ticks",
43259
- badge: debugData.ticks.filter((t) => t.active).length || void 0,
43563
+ label: t("debug.tabTicks"),
43564
+ badge: debugData.ticks.filter((tick) => tick.active).length || void 0,
43260
43565
  content: /* @__PURE__ */ jsxRuntime.jsx(TicksTab, { ticks: debugData.ticks })
43261
43566
  },
43262
43567
  {
43263
43568
  id: "entities",
43264
- label: "Entities",
43569
+ label: t("debug.tabEntities"),
43265
43570
  badge: debugData.entitySnapshot?.runtime.length || void 0,
43266
43571
  content: /* @__PURE__ */ jsxRuntime.jsx(EntitiesTab, { snapshot: debugData.entitySnapshot })
43267
43572
  },
43268
43573
  {
43269
43574
  id: "events",
43270
- label: "Events",
43575
+ label: t("debug.tabEvents"),
43271
43576
  badge: debugData.events.length > 0 ? debugData.events.length : void 0,
43272
43577
  content: /* @__PURE__ */ jsxRuntime.jsx(EventFlowTab, { events: debugData.events })
43273
43578
  },
43274
43579
  {
43275
43580
  id: "guards",
43276
- label: "Guards",
43581
+ label: t("debug.tabGuards"),
43277
43582
  badge: debugData.guards.filter((g) => !g.result).length || void 0,
43278
43583
  content: /* @__PURE__ */ jsxRuntime.jsx(GuardsPanel, { guards: debugData.guards })
43279
43584
  }
@@ -43301,15 +43606,10 @@ function RuntimeDebugger({
43301
43606
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43302
43607
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "h6", style: { fontSize: "0.75rem" }, children: [
43303
43608
  isCollapsed ? "\u25B6" : "\u25BC",
43304
- " Debugger"
43609
+ " ",
43610
+ t("debug.debugger")
43305
43611
  ] }),
43306
- failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "danger", size: "sm", children: [
43307
- failedChecks,
43308
- " failed"
43309
- ] }) : debugData.traits.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "success", size: "sm", children: [
43310
- debugData.traits.length,
43311
- " traits"
43312
- ] }) : /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "info", size: "sm", children: "Idle" })
43612
+ failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "danger", size: "sm", children: t("debug.failedCount", { count: failedChecks }) }) : debugData.traits.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "success", size: "sm", children: t("debug.traitsCount", { count: debugData.traits.length }) }) : /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "info", size: "sm", children: t("debug.idle") })
43313
43613
  ] })
43314
43614
  }
43315
43615
  ),
@@ -43327,9 +43627,9 @@ function RuntimeDebugger({
43327
43627
  );
43328
43628
  }
43329
43629
  if (mode === "verify") {
43330
- const traitStates = debugData.traits.map((t) => `${t.name}:${t.currentState}`).join(" | ");
43331
- const serverEntries = verification.transitions.filter((t) => t.serverResponse);
43332
- const localEntries = verification.transitions.filter((t) => !t.serverResponse);
43630
+ const traitStates = debugData.traits.map((t2) => `${t2.name}:${t2.currentState}`).join(" | ");
43631
+ const serverEntries = verification.transitions.filter((t2) => t2.serverResponse);
43632
+ const localEntries = verification.transitions.filter((t2) => !t2.serverResponse);
43333
43633
  return /* @__PURE__ */ jsxRuntime.jsx(
43334
43634
  VerifyModePanel,
43335
43635
  {
@@ -43361,7 +43661,7 @@ function RuntimeDebugger({
43361
43661
  variant: "secondary",
43362
43662
  size: "sm",
43363
43663
  className: "runtime-debugger__toggle",
43364
- title: "Open Debugger (`)",
43664
+ title: t("debug.openDebugger"),
43365
43665
  children: failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "relative", children: [
43366
43666
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: "V" }),
43367
43667
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute -top-1 -right-2 w-2 h-2 bg-red-500 rounded-full" })
@@ -43371,11 +43671,8 @@ function RuntimeDebugger({
43371
43671
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "runtime-debugger__header", children: [
43372
43672
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43373
43673
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-lg", children: "V" }),
43374
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: "KFlow Verifier" }),
43375
- failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "danger", size: "sm", children: [
43376
- failedChecks,
43377
- " failed"
43378
- ] }) : verification.summary.totalChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "success", size: "sm", children: "All passing" }) : /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "info", size: "sm", children: "Runtime" })
43674
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: t("debug.kflowVerifier") }),
43675
+ failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "danger", size: "sm", children: t("debug.failedCount", { count: failedChecks }) }) : verification.summary.totalChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "success", size: "sm", children: t("debug.allPassing") }) : /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "info", size: "sm", children: t("debug.runtime") })
43379
43676
  ] }),
43380
43677
  /* @__PURE__ */ jsxRuntime.jsx(
43381
43678
  Button,
@@ -43383,7 +43680,7 @@ function RuntimeDebugger({
43383
43680
  onClick: () => setIsCollapsed(true),
43384
43681
  variant: "ghost",
43385
43682
  size: "sm",
43386
- title: "Close (`)",
43683
+ title: t("debug.close"),
43387
43684
  children: "x"
43388
43685
  }
43389
43686
  )
@@ -43397,7 +43694,7 @@ function RuntimeDebugger({
43397
43694
  className: "runtime-debugger__tabs"
43398
43695
  }
43399
43696
  ) }),
43400
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "runtime-debugger__footer", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-foreground/50", children: "Press ` to toggle | window.__orbitalVerification for automation" }) })
43697
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "runtime-debugger__footer", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-foreground/50", children: t("debug.toggleHint") }) })
43401
43698
  ] })
43402
43699
  }
43403
43700
  );
@@ -43423,6 +43720,7 @@ var init_RuntimeDebugger2 = __esm({
43423
43720
  init_TransitionTimeline();
43424
43721
  init_ServerBridgeTab();
43425
43722
  init_EventDispatcherTab();
43723
+ init_useTranslate();
43426
43724
  init_RuntimeDebugger();
43427
43725
  RuntimeDebugger.displayName = "RuntimeDebugger";
43428
43726
  }
@@ -44711,7 +45009,7 @@ var init_StatCard = __esm({
44711
45009
  }
44712
45010
  );
44713
45011
  }
44714
- const label = schemaStats?.[0]?.label || labelToUse || "Stat";
45012
+ const label = schemaStats?.[0]?.label || labelToUse || t("statCard.defaultLabel");
44715
45013
  const normalizedPropValue = Array.isArray(propValue) ? propValue[0] ?? propValue.length : propValue;
44716
45014
  const value = schemaStats?.[0]?.value ?? normalizedPropValue ?? 0;
44717
45015
  const trendDirection = manualDirection || (calculatedTrend === void 0 || calculatedTrend === 0 ? "neutral" : calculatedTrend > 0 ? "up" : "down");
@@ -44754,7 +45052,7 @@ var init_StatCard = __esm({
44754
45052
  ]
44755
45053
  }
44756
45054
  ),
44757
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", as: "span", children: "vs last period" })
45055
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", as: "span", children: t("statCard.vsLastPeriod") })
44758
45056
  ] }),
44759
45057
  subtitle && !calculatedTrend && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", children: subtitle })
44760
45058
  ] }),