@almadar/ui 5.21.7 → 5.21.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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,298 @@ 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"
525
818
  };
526
819
  }
527
820
  });
@@ -5504,6 +5797,7 @@ var init_LawReferenceTooltip = __esm({
5504
5797
  init_Typography();
5505
5798
  init_Divider();
5506
5799
  init_cn();
5800
+ init_useTranslate();
5507
5801
  positionStyles2 = {
5508
5802
  top: "bottom-full left-1/2 -translate-x-1/2 mb-2",
5509
5803
  bottom: "top-full left-1/2 -translate-x-1/2 mt-2",
@@ -5522,6 +5816,7 @@ var init_LawReferenceTooltip = __esm({
5522
5816
  position = "top",
5523
5817
  className
5524
5818
  }) => {
5819
+ const { t } = useTranslate();
5525
5820
  const [isVisible, setIsVisible] = React84__namespace.default.useState(false);
5526
5821
  const timeoutRef = React84__namespace.default.useRef(null);
5527
5822
  const handleMouseEnter = () => {
@@ -5605,7 +5900,7 @@ var init_LawReferenceTooltip = __esm({
5605
5900
  target: "_blank",
5606
5901
  rel: "noopener noreferrer",
5607
5902
  onClick: (e) => e.stopPropagation(),
5608
- children: "View full law text"
5903
+ children: t("lawReference.viewFullText")
5609
5904
  }
5610
5905
  )
5611
5906
  ] }),
@@ -13507,6 +13802,7 @@ var log6, SWIM_GUTTER, CENTER_W, BehaviorView;
13507
13802
  var init_BehaviorView = __esm({
13508
13803
  "components/avl/molecules/BehaviorView.tsx"() {
13509
13804
  "use client";
13805
+ init_useTranslate();
13510
13806
  init_AvlState();
13511
13807
  init_AvlTransitionLane();
13512
13808
  init_AvlSwimLane();
@@ -13516,6 +13812,7 @@ var init_BehaviorView = __esm({
13516
13812
  SWIM_GUTTER = 120;
13517
13813
  CENTER_W = 360;
13518
13814
  BehaviorView = ({ data }) => {
13815
+ const { t } = useTranslate();
13519
13816
  const [layout, setLayout] = React84.useState(null);
13520
13817
  const traitName = data.traits[0]?.name;
13521
13818
  const traitData = traitName ? data.traitDetails[traitName] : void 0;
@@ -13525,10 +13822,10 @@ var init_BehaviorView = __esm({
13525
13822
  computeTraitLayout(traitData).then(setLayout).catch((err) => log6.error("compute-trait-layout-failed", { error: err instanceof Error ? err : String(err) }));
13526
13823
  }, [dataKey]);
13527
13824
  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" });
13825
+ 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
13826
  }
13530
13827
  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..." });
13828
+ 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
13829
  }
13533
13830
  const hasExternal = traitData.listenedEvents.length > 0 || traitData.emittedEvents.length > 0;
13534
13831
  const viewW = hasExternal ? SWIM_GUTTER + CENTER_W + SWIM_GUTTER : CENTER_W + 60;
@@ -13544,10 +13841,7 @@ var init_BehaviorView = __esm({
13544
13841
  const machineHeight = scaledH + 100;
13545
13842
  const renderMachine = /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
13546
13843
  /* @__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
- ] }),
13844
+ /* @__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
13845
  /* @__PURE__ */ jsxRuntime.jsxs("defs", { children: [
13552
13846
  /* @__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
13847
  /* @__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 +14149,7 @@ var init_CodeBlock = __esm({
13855
14149
  const isLolo = language === "lolo";
13856
14150
  const activeStyle = isOrb ? orbStyle : isLolo ? loloStyle : dark__default.default;
13857
14151
  const eventBus = useEventBus();
13858
- const { t: _t } = useTranslate();
14152
+ const { t } = useTranslate();
13859
14153
  const scrollRef = React84.useRef(null);
13860
14154
  const codeRef = React84.useRef(null);
13861
14155
  const savedScrollLeftRef = React84.useRef(0);
@@ -14110,7 +14404,7 @@ var init_CodeBlock = __esm({
14110
14404
  size: "sm",
14111
14405
  onClick: handleCopy,
14112
14406
  className: "opacity-0 group-hover:opacity-100 focus:opacity-100 transition-opacity text-muted-foreground hover:text-white",
14113
- "aria-label": "Copy code",
14407
+ "aria-label": t("common.copy"),
14114
14408
  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
14409
  }
14116
14410
  )
@@ -14331,9 +14625,18 @@ var init_MarkdownContent = __esm({
14331
14625
  );
14332
14626
  }
14333
14627
  return /* @__PURE__ */ jsxRuntime.jsx(
14334
- "span",
14628
+ "code",
14335
14629
  {
14630
+ ...props,
14631
+ className: codeClassName,
14336
14632
  style: {
14633
+ backgroundColor: "var(--color-muted)",
14634
+ color: "var(--color-foreground)",
14635
+ border: "1px solid var(--color-border)",
14636
+ padding: "0.125rem 0.375rem",
14637
+ borderRadius: "0.25rem",
14638
+ fontSize: "0.875em",
14639
+ fontFamily: "ui-monospace, monospace",
14337
14640
  whiteSpace: "pre-wrap",
14338
14641
  wordBreak: "break-word"
14339
14642
  },
@@ -14706,7 +15009,7 @@ var init_StateMachineView = __esm({
14706
15009
  const endX2 = fromState.x + Math.cos(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
14707
15010
  const endY2 = fromState.y + Math.sin(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
14708
15011
  const isSingle2 = bundle.labels.length === 1;
14709
- const labelText2 = isSingle2 ? bundle.labels[0].event : `${bundle.labels.length} events`;
15012
+ const labelText2 = isSingle2 ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
14710
15013
  const bundleColor2 = isSingle2 ? config.colors.arrow : "var(--color-accent)";
14711
15014
  const labelWidth2 = labelText2.length * 9 + (isSingle2 ? 24 : 40);
14712
15015
  const cx = fromState.x;
@@ -14832,7 +15135,7 @@ var init_StateMachineView = __esm({
14832
15135
  const controlX = midX + perpX;
14833
15136
  const controlY = midY + perpY;
14834
15137
  const isSingle = bundle.labels.length === 1;
14835
- const labelText = isSingle ? bundle.labels[0].event : `${bundle.labels.length} events`;
15138
+ const labelText = isSingle ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
14836
15139
  const labelWidth = labelText.length * 9 + (isSingle ? 24 : 40);
14837
15140
  const bundleColor = isSingle ? config.colors.arrow : "var(--color-accent)";
14838
15141
  const curveMidpoint = {
@@ -14987,7 +15290,7 @@ var init_StateMachineView = __esm({
14987
15290
  {
14988
15291
  className: "absolute -top-2 left-1/2 transform -translate-x-1/2 px-2 py-0.5 rounded-full",
14989
15292
  style: { backgroundColor: "var(--color-success)" },
14990
- children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: "Pinned" })
15293
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: t("stateMachine.pinned") })
14991
15294
  }
14992
15295
  ),
14993
15296
  !isSingle && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -15009,10 +15312,7 @@ var init_StateMachineView = __esm({
15009
15312
  {
15010
15313
  className: "ml-2 px-2 py-0.5 rounded-full",
15011
15314
  style: { backgroundColor: "var(--color-accent)" },
15012
- children: /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: [
15013
- bundle.labels.length,
15014
- " events"
15015
- ] })
15315
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: t("stateMachine.eventCount", { count: bundle.labels.length }) })
15016
15316
  }
15017
15317
  )
15018
15318
  ]
@@ -15157,7 +15457,7 @@ var init_StateMachineView = __esm({
15157
15457
  align: "center",
15158
15458
  className: "mb-2",
15159
15459
  style: { color: "var(--color-warning)", fontSize: "13px" },
15160
- children: "External Effects"
15460
+ children: t("stateMachine.externalEffects")
15161
15461
  }
15162
15462
  ),
15163
15463
  outputs.outputs.map((output, idx) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -15177,10 +15477,10 @@ var init_StateMachineView = __esm({
15177
15477
  Legend = ({ config, y }) => {
15178
15478
  const { t } = useTranslate();
15179
15479
  const items = [
15180
- { label: "Initial", color: config.colors.initialNode },
15181
- { label: "Final", color: config.colors.finalNode },
15182
- { label: "State", color: config.colors.nodeBorder },
15183
- { label: "Multi-event", color: "var(--color-accent)" }
15480
+ { key: "initial", label: t("stateMachine.legend.initial"), color: config.colors.initialNode, isMultiEvent: false },
15481
+ { key: "final", label: t("stateMachine.legend.final"), color: config.colors.finalNode, isMultiEvent: false },
15482
+ { key: "state", label: t("stateMachine.legend.state"), color: config.colors.nodeBorder, isMultiEvent: false },
15483
+ { key: "multiEvent", label: t("stateMachine.legend.multiEvent"), color: "var(--color-accent)", isMultiEvent: true }
15184
15484
  ];
15185
15485
  return /* @__PURE__ */ jsxRuntime.jsx(
15186
15486
  HStack,
@@ -15195,8 +15495,8 @@ var init_StateMachineView = __esm({
15195
15495
  {
15196
15496
  className: "w-3 h-3 rounded-full",
15197
15497
  style: {
15198
- backgroundColor: item.label === "Multi-event" ? item.color : config.colors.node,
15199
- border: item.label !== "Multi-event" ? `2px solid ${item.color}` : "none"
15498
+ backgroundColor: item.isMultiEvent ? item.color : config.colors.node,
15499
+ border: !item.isMultiEvent ? `2px solid ${item.color}` : "none"
15200
15500
  }
15201
15501
  }
15202
15502
  ),
@@ -15208,7 +15508,7 @@ var init_StateMachineView = __esm({
15208
15508
  children: item.label
15209
15509
  }
15210
15510
  )
15211
- ] }, item.label))
15511
+ ] }, item.key))
15212
15512
  }
15213
15513
  );
15214
15514
  };
@@ -16002,13 +16302,13 @@ var init_JazariStateMachine = __esm({
16002
16302
  );
16003
16303
  }, [resolvedTrait, entityFields]);
16004
16304
  if (isLoading) {
16005
- return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: "Loading state machine\u2026" });
16305
+ return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: t("stateMachine.loading") });
16006
16306
  }
16007
16307
  if (error) {
16008
16308
  return /* @__PURE__ */ jsxRuntime.jsx(ErrorState, { message: error instanceof Error ? error.message : String(error) });
16009
16309
  }
16010
16310
  if (!resolvedTrait || !layoutData || layoutData.states.length === 0) {
16011
- 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" }) });
16311
+ 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") }) });
16012
16312
  }
16013
16313
  return /* @__PURE__ */ jsxRuntime.jsx(
16014
16314
  StateMachineView,
@@ -17052,13 +17352,13 @@ var init_LayoutPatterns = __esm({
17052
17352
  function generateRuleId() {
17053
17353
  return `rule-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
17054
17354
  }
17055
- function questionsToOptions(questions, includeEndOfSurvey) {
17355
+ function questionsToOptions(questions, endOfSurveyLabel) {
17056
17356
  const opts = questions.map((q) => ({
17057
17357
  value: q.id,
17058
17358
  label: q.label
17059
17359
  }));
17060
- if (includeEndOfSurvey) {
17061
- opts.push({ value: END_OF_SURVEY, label: "End of survey" });
17360
+ if (endOfSurveyLabel !== null) {
17361
+ opts.push({ value: END_OF_SURVEY, label: endOfSurveyLabel });
17062
17362
  }
17063
17363
  return opts;
17064
17364
  }
@@ -17067,7 +17367,7 @@ function isRuleBroken(rule, questions) {
17067
17367
  const targetExists = rule.targetQuestionId === END_OF_SURVEY || questions.some((q) => q.id === rule.targetQuestionId);
17068
17368
  return !sourceExists || !targetExists;
17069
17369
  }
17070
- var END_OF_SURVEY, OPERATOR_OPTIONS, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph, BranchingLogicBuilder;
17370
+ var END_OF_SURVEY, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph, BranchingLogicBuilder;
17071
17371
  var init_BranchingLogicBuilder = __esm({
17072
17372
  "components/core/molecules/BranchingLogicBuilder.tsx"() {
17073
17373
  "use client";
@@ -17080,14 +17380,9 @@ var init_BranchingLogicBuilder = __esm({
17080
17380
  init_FilterPill();
17081
17381
  init_Box();
17082
17382
  init_useEventBus();
17383
+ init_useTranslate();
17083
17384
  init_cn();
17084
17385
  END_OF_SURVEY = "end-of-survey";
17085
- OPERATOR_OPTIONS = [
17086
- { value: "equals", label: "equals" },
17087
- { value: "not-equals", label: "does not equal" },
17088
- { value: "contains", label: "contains" },
17089
- { value: "in", label: "is one of" }
17090
- ];
17091
17386
  RuleRow = ({
17092
17387
  rule,
17093
17388
  questions,
@@ -17096,8 +17391,21 @@ var init_BranchingLogicBuilder = __esm({
17096
17391
  onChange,
17097
17392
  onDelete
17098
17393
  }) => {
17099
- const sourceOptions = React84.useMemo(() => questionsToOptions(questions, false), [questions]);
17100
- const targetOptions = React84.useMemo(() => questionsToOptions(questions, true), [questions]);
17394
+ const { t } = useTranslate();
17395
+ const operatorOptions = React84.useMemo(
17396
+ () => [
17397
+ { value: "equals", label: t("branchingLogic.operatorEquals") },
17398
+ { value: "not-equals", label: t("branchingLogic.operatorNotEquals") },
17399
+ { value: "contains", label: t("branchingLogic.operatorContains") },
17400
+ { value: "in", label: t("branchingLogic.operatorIn") }
17401
+ ],
17402
+ [t]
17403
+ );
17404
+ const sourceOptions = React84.useMemo(() => questionsToOptions(questions, null), [questions]);
17405
+ const targetOptions = React84.useMemo(
17406
+ () => questionsToOptions(questions, t("branchingLogic.endOfSurvey")),
17407
+ [questions, t]
17408
+ );
17101
17409
  const sourceQuestion = questions.find((q) => q.id === rule.sourceQuestionId);
17102
17410
  const valueOptions = React84.useMemo(() => {
17103
17411
  if (!sourceQuestion?.optionValues) return [];
@@ -17142,22 +17450,22 @@ var init_BranchingLogicBuilder = __esm({
17142
17450
  ),
17143
17451
  children: [
17144
17452
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-wrap items-center gap-2", children: [
17145
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "semibold", className: "shrink-0", children: "If" }),
17453
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "semibold", className: "shrink-0", children: t("branchingLogic.if") }),
17146
17454
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsxRuntime.jsx(
17147
17455
  Select,
17148
17456
  {
17149
17457
  options: sourceOptions,
17150
17458
  value: rule.sourceQuestionId,
17151
- placeholder: "Select question",
17459
+ placeholder: t("branchingLogic.selectQuestion"),
17152
17460
  onChange: handleSource,
17153
17461
  disabled: readOnly,
17154
- error: broken ? "Broken reference" : void 0
17462
+ error: broken ? t("branchingLogic.brokenReference") : void 0
17155
17463
  }
17156
17464
  ) }),
17157
17465
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[8rem] basis-32", children: /* @__PURE__ */ jsxRuntime.jsx(
17158
17466
  Select,
17159
17467
  {
17160
- options: OPERATOR_OPTIONS,
17468
+ options: operatorOptions,
17161
17469
  value: rule.operator,
17162
17470
  onChange: handleOperator,
17163
17471
  disabled: readOnly
@@ -17180,7 +17488,7 @@ var init_BranchingLogicBuilder = __esm({
17180
17488
  {
17181
17489
  options: valueOptions.filter((o) => !chips.includes(o.value)),
17182
17490
  value: "",
17183
- placeholder: "Add value",
17491
+ placeholder: t("branchingLogic.addValue"),
17184
17492
  onChange: handleAddChip,
17185
17493
  disabled: readOnly
17186
17494
  }
@@ -17188,7 +17496,7 @@ var init_BranchingLogicBuilder = __esm({
17188
17496
  Input,
17189
17497
  {
17190
17498
  inputType: "text",
17191
- placeholder: "Type value, press Enter",
17499
+ placeholder: t("branchingLogic.typeValuePressEnter"),
17192
17500
  value: "",
17193
17501
  onKeyDown: (e) => {
17194
17502
  if (e.key !== "Enter") return;
@@ -17206,7 +17514,7 @@ var init_BranchingLogicBuilder = __esm({
17206
17514
  {
17207
17515
  options: valueOptions,
17208
17516
  value: scalarValue,
17209
- placeholder: "Select value",
17517
+ placeholder: t("branchingLogic.selectValue"),
17210
17518
  onChange: (e) => onChange({ ...rule, value: e.target.value }),
17211
17519
  disabled: readOnly
17212
17520
  }
@@ -17214,7 +17522,7 @@ var init_BranchingLogicBuilder = __esm({
17214
17522
  Input,
17215
17523
  {
17216
17524
  inputType: "text",
17217
- placeholder: "Value",
17525
+ placeholder: t("branchingLogic.value"),
17218
17526
  value: scalarValue,
17219
17527
  onChange: handleScalarValue,
17220
17528
  disabled: readOnly
@@ -17222,17 +17530,17 @@ var init_BranchingLogicBuilder = __esm({
17222
17530
  ) }),
17223
17531
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "label", weight: "semibold", className: "shrink-0 inline-flex items-center gap-1", children: [
17224
17532
  /* @__PURE__ */ jsxRuntime.jsx(LucideIcons2.ArrowRight, { className: "h-4 w-4" }),
17225
- "go to"
17533
+ t("branchingLogic.goTo")
17226
17534
  ] }),
17227
17535
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsxRuntime.jsx(
17228
17536
  Select,
17229
17537
  {
17230
17538
  options: targetOptions,
17231
17539
  value: rule.targetQuestionId,
17232
- placeholder: "Select target",
17540
+ placeholder: t("branchingLogic.selectTarget"),
17233
17541
  onChange: handleTarget,
17234
17542
  disabled: readOnly,
17235
- error: broken && rule.targetQuestionId !== END_OF_SURVEY ? "Broken reference" : void 0
17543
+ error: broken && rule.targetQuestionId !== END_OF_SURVEY ? t("branchingLogic.brokenReference") : void 0
17236
17544
  }
17237
17545
  ) }),
17238
17546
  !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
@@ -17244,11 +17552,11 @@ var init_BranchingLogicBuilder = __esm({
17244
17552
  action: "DELETE_RULE",
17245
17553
  actionPayload: { ruleId: rule.id },
17246
17554
  onClick: onDelete,
17247
- "aria-label": "Delete rule"
17555
+ "aria-label": t("branchingLogic.deleteRule")
17248
17556
  }
17249
17557
  )
17250
17558
  ] }),
17251
- broken && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "error", size: "sm", label: "Broken reference" })
17559
+ broken && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "error", size: "sm", label: t("branchingLogic.brokenReference") })
17252
17560
  ]
17253
17561
  }
17254
17562
  );
@@ -17258,10 +17566,12 @@ var init_BranchingLogicBuilder = __esm({
17258
17566
  NODE_GAP_Y = 80;
17259
17567
  PADDING = 32;
17260
17568
  LogicGraph = ({ questions, rules }) => {
17569
+ const { t } = useTranslate();
17570
+ const endOfSurveyLabel = t("branchingLogic.endOfSurvey");
17261
17571
  const layout = React84.useMemo(() => {
17262
17572
  const items = [
17263
17573
  ...questions.map((q) => ({ id: q.id, label: q.label, isEnd: false })),
17264
- { id: END_OF_SURVEY, label: "End of survey", isEnd: true }
17574
+ { id: END_OF_SURVEY, label: endOfSurveyLabel, isEnd: true }
17265
17575
  ];
17266
17576
  const positions = {};
17267
17577
  items.forEach((item, i) => {
@@ -17273,14 +17583,14 @@ var init_BranchingLogicBuilder = __esm({
17273
17583
  const width = NODE_WIDTH + PADDING * 2 + 220;
17274
17584
  const height = PADDING * 2 + items.length * (NODE_HEIGHT + NODE_GAP_Y);
17275
17585
  return { items, positions, width, height };
17276
- }, [questions]);
17586
+ }, [questions, endOfSurveyLabel]);
17277
17587
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "overflow-auto rounded-container border border-border bg-card p-2", children: /* @__PURE__ */ jsxRuntime.jsxs(
17278
17588
  "svg",
17279
17589
  {
17280
17590
  width: layout.width,
17281
17591
  height: layout.height,
17282
17592
  role: "img",
17283
- "aria-label": "Branching logic graph",
17593
+ "aria-label": t("branchingLogic.graphAriaLabel"),
17284
17594
  style: { display: "block" },
17285
17595
  children: [
17286
17596
  /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -17388,6 +17698,7 @@ var init_BranchingLogicBuilder = __esm({
17388
17698
  readOnly = false,
17389
17699
  className
17390
17700
  }) => {
17701
+ const { t } = useTranslate();
17391
17702
  const eventBus = useEventBus();
17392
17703
  const questions = Array.isArray(questionsProp) ? questionsProp : [];
17393
17704
  const rulesInitial = Array.isArray(rulesProp) ? rulesProp : [];
@@ -17440,16 +17751,23 @@ var init_BranchingLogicBuilder = __esm({
17440
17751
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-wrap items-center justify-between gap-2", children: [
17441
17752
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-2", children: [
17442
17753
  /* @__PURE__ */ jsxRuntime.jsx(LucideIcons2.GitBranch, { className: "h-5 w-5 text-foreground" }),
17443
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "subheading", weight: "semibold", children: "Branching logic" }),
17754
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "subheading", weight: "semibold", children: t("branchingLogic.title") }),
17444
17755
  /* @__PURE__ */ jsxRuntime.jsx(
17445
17756
  Badge,
17446
17757
  {
17447
17758
  variant: "neutral",
17448
17759
  size: "sm",
17449
- label: `${rules.length} rule${rules.length === 1 ? "" : "s"}`
17760
+ label: rules.length === 1 ? t("branchingLogic.ruleCountOne", { count: rules.length }) : t("branchingLogic.ruleCountOther", { count: rules.length })
17450
17761
  }
17451
17762
  ),
17452
- brokenCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "error", size: "sm", label: `${brokenCount} broken` })
17763
+ brokenCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
17764
+ Badge,
17765
+ {
17766
+ variant: "error",
17767
+ size: "sm",
17768
+ label: t("branchingLogic.brokenCount", { count: brokenCount })
17769
+ }
17770
+ )
17453
17771
  ] }),
17454
17772
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-1 rounded-sm border border-border bg-card p-0.5", children: [
17455
17773
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -17460,7 +17778,7 @@ var init_BranchingLogicBuilder = __esm({
17460
17778
  leftIcon: LucideIcons2.Pencil,
17461
17779
  action: "VIEW_EDIT",
17462
17780
  onClick: () => setView("edit"),
17463
- children: "Rules"
17781
+ children: t("branchingLogic.rules")
17464
17782
  }
17465
17783
  ),
17466
17784
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -17471,13 +17789,13 @@ var init_BranchingLogicBuilder = __esm({
17471
17789
  leftIcon: LucideIcons2.Eye,
17472
17790
  action: "VIEW_GRAPH",
17473
17791
  onClick: () => setView("graph"),
17474
- children: "Logic graph"
17792
+ children: t("branchingLogic.logicGraph")
17475
17793
  }
17476
17794
  )
17477
17795
  ] })
17478
17796
  ] }),
17479
17797
  view === "edit" ? /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-col gap-2", children: [
17480
- 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(
17798
+ 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(
17481
17799
  RuleRow,
17482
17800
  {
17483
17801
  rule,
@@ -17498,7 +17816,7 @@ var init_BranchingLogicBuilder = __esm({
17498
17816
  action: "ADD_RULE",
17499
17817
  onClick: handleAddRule,
17500
17818
  disabled: noQuestions,
17501
- children: "Add rule"
17819
+ children: t("branchingLogic.addRule")
17502
17820
  }
17503
17821
  ) })
17504
17822
  ] }) : /* @__PURE__ */ jsxRuntime.jsx(LogicGraph, { questions, rules })
@@ -18058,7 +18376,7 @@ function CalendarGrid({
18058
18376
  onClick: stepPrev,
18059
18377
  "aria-disabled": !canPrev || void 0,
18060
18378
  "aria-label": t("aria.previousDays"),
18061
- children: "Prev"
18379
+ children: t("nav.previous")
18062
18380
  }
18063
18381
  ),
18064
18382
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground", children: formatDateRange(visibleDays[0], visibleDays[visibleDays.length - 1]) }),
@@ -18071,7 +18389,7 @@ function CalendarGrid({
18071
18389
  onClick: stepNext,
18072
18390
  "aria-disabled": !canNext || void 0,
18073
18391
  "aria-label": t("aria.nextDays"),
18074
- children: "Next"
18392
+ children: t("nav.next")
18075
18393
  }
18076
18394
  )
18077
18395
  ] }),
@@ -19621,7 +19939,7 @@ var init_Pagination = __esm({
19621
19939
  type: "number",
19622
19940
  value: jumpToPage,
19623
19941
  onChange: (e) => setJumpToPage(e.target.value),
19624
- placeholder: "Page",
19942
+ placeholder: t("pagination.jumpPlaceholder"),
19625
19943
  className: "w-20",
19626
19944
  onKeyDown: (e) => {
19627
19945
  if (e.key === "Enter") {
@@ -19759,13 +20077,10 @@ var init_CardGrid = __esm({
19759
20077
  return children;
19760
20078
  }
19761
20079
  if (isLoading) {
19762
- 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..." }) });
20080
+ 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") }) });
19763
20081
  }
19764
20082
  if (error) {
19765
- 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: [
19766
- "Error loading items: ",
19767
- error.message
19768
- ] }) });
20083
+ 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 }) }) });
19769
20084
  }
19770
20085
  if (normalizedData.length === 0) {
19771
20086
  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" }) });
@@ -23617,7 +23932,7 @@ function DataGrid({
23617
23932
  onChange: () => toggleSelection(id),
23618
23933
  onClick: (e) => e.stopPropagation(),
23619
23934
  className: "w-4 h-4 mt-1 flex-shrink-0 accent-primary",
23620
- "aria-label": `Select ${titleValue !== void 0 ? String(titleValue) : "item"}`
23935
+ "aria-label": t("card.selectItem", { item: titleValue !== void 0 ? String(titleValue) : t("card.itemFallback") })
23621
23936
  }
23622
23937
  ),
23623
23938
  /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "xs", className: "flex-1 min-w-0", children: [
@@ -23815,7 +24130,7 @@ function formatDate3(value) {
23815
24130
  if (isNaN(d.getTime())) return String(value);
23816
24131
  return d.toLocaleDateString(void 0, { year: "numeric", month: "short", day: "numeric" });
23817
24132
  }
23818
- function formatValue2(value, format) {
24133
+ function formatValue2(value, format, boolLabels) {
23819
24134
  if (value === void 0 || value === null) return "";
23820
24135
  switch (format) {
23821
24136
  case "date":
@@ -23827,7 +24142,7 @@ function formatValue2(value, format) {
23827
24142
  case "percent":
23828
24143
  return typeof value === "number" ? `${Math.round(value)}%` : String(value);
23829
24144
  case "boolean":
23830
- return value ? "Yes" : "No";
24145
+ return value ? boolLabels?.yes ?? "Yes" : boolLabels?.no ?? "No";
23831
24146
  default:
23832
24147
  return String(value);
23833
24148
  }
@@ -24123,7 +24438,7 @@ function DataList({
24123
24438
  field.label ?? fieldLabel3(field.name),
24124
24439
  ":"
24125
24440
  ] }),
24126
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: formatValue2(value, field.format) })
24441
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
24127
24442
  ] }, field.name);
24128
24443
  }) }),
24129
24444
  progressFields.map((field) => {
@@ -24253,6 +24568,7 @@ var init_FileTree = __esm({
24253
24568
  init_Box();
24254
24569
  init_Typography();
24255
24570
  init_Icon();
24571
+ init_useTranslate();
24256
24572
  TreeNodeItem = ({
24257
24573
  node,
24258
24574
  depth,
@@ -24338,8 +24654,9 @@ var init_FileTree = __esm({
24338
24654
  className,
24339
24655
  indent = 16
24340
24656
  }) => {
24657
+ const { t } = useTranslate();
24341
24658
  if (tree.length === 0) {
24342
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "muted", children: "No files" }) });
24659
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "muted", children: t("fileTree.noFiles") }) });
24343
24660
  }
24344
24661
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `py-1 overflow-y-auto ${className ?? ""}`, role: "tree", children: tree.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
24345
24662
  TreeNodeItem,
@@ -24394,6 +24711,7 @@ var init_FilterGroup = __esm({
24394
24711
  init_Icon();
24395
24712
  init_useEventBus();
24396
24713
  init_useQuerySingleton();
24714
+ init_useTranslate();
24397
24715
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
24398
24716
  lookStyles6 = {
24399
24717
  toolbar: "",
@@ -24414,6 +24732,7 @@ var init_FilterGroup = __esm({
24414
24732
  isLoading,
24415
24733
  look = "toolbar"
24416
24734
  }) => {
24735
+ const { t } = useTranslate();
24417
24736
  const eventBus = useEventBus();
24418
24737
  const queryState = useQuerySingleton(query);
24419
24738
  const [selectedValues, setSelectedValues] = React84.useState(
@@ -24495,7 +24814,7 @@ var init_FilterGroup = __esm({
24495
24814
  "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24496
24815
  !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24497
24816
  ),
24498
- children: "All"
24817
+ children: t("filterGroup.all")
24499
24818
  }
24500
24819
  ),
24501
24820
  filter.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -24523,7 +24842,7 @@ var init_FilterGroup = __esm({
24523
24842
  size: "sm",
24524
24843
  onClick: handleClearAll,
24525
24844
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24526
- children: "Clear"
24845
+ children: t("filterGroup.clear")
24527
24846
  }
24528
24847
  )
24529
24848
  ]
@@ -24534,7 +24853,7 @@ var init_FilterGroup = __esm({
24534
24853
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", lookStyles6[look], className), children: [
24535
24854
  showIcon && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
24536
24855
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4" }),
24537
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
24856
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
24538
24857
  ] }),
24539
24858
  filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
24540
24859
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-xs font-bold text-muted-foreground uppercase tracking-wide", children: filter.label }),
@@ -24557,7 +24876,7 @@ var init_FilterGroup = __esm({
24557
24876
  `${filter.field}_from`,
24558
24877
  e.target.value || null
24559
24878
  ),
24560
- placeholder: "From",
24879
+ placeholder: t("filterGroup.from"),
24561
24880
  clearable: true,
24562
24881
  onClear: () => handleFilterSelect(`${filter.field}_from`, null)
24563
24882
  }
@@ -24571,7 +24890,7 @@ var init_FilterGroup = __esm({
24571
24890
  `${filter.field}_to`,
24572
24891
  e.target.value || null
24573
24892
  ),
24574
- placeholder: "To",
24893
+ placeholder: t("filterGroup.to"),
24575
24894
  clearable: true,
24576
24895
  onClear: () => handleFilterSelect(`${filter.field}_to`, null)
24577
24896
  }
@@ -24591,7 +24910,7 @@ var init_FilterGroup = __esm({
24591
24910
  value: selectedValues[filter.field] || "all",
24592
24911
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24593
24912
  options: [
24594
- { value: "all", label: "All" },
24913
+ { value: "all", label: t("filterGroup.all") },
24595
24914
  ...filter.options?.map((opt) => ({
24596
24915
  value: opt,
24597
24916
  label: opt
@@ -24608,7 +24927,7 @@ var init_FilterGroup = __esm({
24608
24927
  onClick: handleClearAll,
24609
24928
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24610
24929
  className: "self-start",
24611
- children: "Clear all"
24930
+ children: t("filterGroup.clearAll")
24612
24931
  }
24613
24932
  )
24614
24933
  ] });
@@ -24674,7 +24993,7 @@ var init_FilterGroup = __esm({
24674
24993
  value: selectedValues[filter.field] || "all",
24675
24994
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24676
24995
  options: [
24677
- { value: "all", label: `All ${filter.label}` },
24996
+ { value: "all", label: t("filterGroup.allOf", { label: filter.label }) },
24678
24997
  ...filter.options?.map((opt) => ({
24679
24998
  value: opt,
24680
24999
  label: opt
@@ -24703,7 +25022,7 @@ var init_FilterGroup = __esm({
24703
25022
  field
24704
25023
  );
24705
25024
  }),
24706
- /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
25025
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: t("filterGroup.clearAll") })
24707
25026
  ] })
24708
25027
  ]
24709
25028
  }
@@ -24728,7 +25047,7 @@ var init_FilterGroup = __esm({
24728
25047
  className: "text-muted-foreground",
24729
25048
  children: [
24730
25049
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4" }),
24731
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
25050
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
24732
25051
  ]
24733
25052
  }
24734
25053
  ),
@@ -24754,7 +25073,7 @@ var init_FilterGroup = __esm({
24754
25073
  `${filter.field}_from`,
24755
25074
  e.target.value || null
24756
25075
  ),
24757
- placeholder: "From",
25076
+ placeholder: t("filterGroup.from"),
24758
25077
  clearable: true,
24759
25078
  onClear: () => handleFilterSelect(`${filter.field}_from`, null),
24760
25079
  className: "min-w-[130px]"
@@ -24770,7 +25089,7 @@ var init_FilterGroup = __esm({
24770
25089
  `${filter.field}_to`,
24771
25090
  e.target.value || null
24772
25091
  ),
24773
- placeholder: "To",
25092
+ placeholder: t("filterGroup.to"),
24774
25093
  clearable: true,
24775
25094
  onClear: () => handleFilterSelect(`${filter.field}_to`, null),
24776
25095
  className: "min-w-[130px]"
@@ -24792,7 +25111,7 @@ var init_FilterGroup = __esm({
24792
25111
  value: selectedValues[filter.field] || "all",
24793
25112
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24794
25113
  options: [
24795
- { value: "all", label: "All" },
25114
+ { value: "all", label: t("filterGroup.all") },
24796
25115
  ...filter.options?.map((opt) => ({
24797
25116
  value: opt,
24798
25117
  label: opt
@@ -24803,10 +25122,7 @@ var init_FilterGroup = __esm({
24803
25122
  )
24804
25123
  ] }, filter.field)),
24805
25124
  activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: "ml-auto", children: [
24806
- /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "primary", size: "md", children: [
24807
- activeFilterCount,
24808
- " active"
24809
- ] }),
25125
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "md", children: t("filterGroup.activeCount", { count: activeFilterCount }) }),
24810
25126
  /* @__PURE__ */ jsxRuntime.jsx(
24811
25127
  Button,
24812
25128
  {
@@ -24814,7 +25130,7 @@ var init_FilterGroup = __esm({
24814
25130
  size: "sm",
24815
25131
  onClick: handleClearAll,
24816
25132
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24817
- children: "Clear all"
25133
+ children: t("filterGroup.clearAll")
24818
25134
  }
24819
25135
  )
24820
25136
  ] })
@@ -25758,19 +26074,20 @@ var init_RepeatableFormSection = __esm({
25758
26074
  RepeatableFormSection.displayName = "RepeatableFormSection";
25759
26075
  }
25760
26076
  });
25761
- var actionTypeLabels, actionTypeIcons, ViolationAlert;
26077
+ var actionTypeLabelKeys, actionTypeIcons, ViolationAlert;
25762
26078
  var init_ViolationAlert = __esm({
25763
26079
  "components/core/molecules/ViolationAlert.tsx"() {
25764
26080
  init_cn();
26081
+ init_useTranslate();
25765
26082
  init_Box();
25766
26083
  init_Stack();
25767
26084
  init_Typography();
25768
26085
  init_Button();
25769
26086
  init_Icon();
25770
- actionTypeLabels = {
25771
- measure: "Corrective Measure",
25772
- admin: "Administrative Action",
25773
- penalty: "Penalty Proceedings"
26087
+ actionTypeLabelKeys = {
26088
+ measure: "violationAlert.actionType.measure",
26089
+ admin: "violationAlert.actionType.admin",
26090
+ penalty: "violationAlert.actionType.penalty"
25774
26091
  };
25775
26092
  actionTypeIcons = {
25776
26093
  measure: "alert-triangle",
@@ -25787,10 +26104,11 @@ var init_ViolationAlert = __esm({
25787
26104
  className,
25788
26105
  ...flatProps
25789
26106
  }) => {
26107
+ const { t } = useTranslate();
25790
26108
  const resolvedViolation = violation ?? {
25791
26109
  law: "",
25792
26110
  article: "",
25793
- message: flatProps.message ?? "Violation",
26111
+ message: flatProps.message ?? t("violationAlert.fallbackMessage"),
25794
26112
  actionType: "measure"
25795
26113
  };
25796
26114
  const effectiveSeverity = severity ?? (resolvedViolation.actionType === "measure" ? "warning" : "error");
@@ -25875,7 +26193,7 @@ var init_ViolationAlert = __esm({
25875
26193
  {
25876
26194
  variant: "caption",
25877
26195
  className: cn(textColor, "opacity-75"),
25878
- children: actionTypeLabels[resolvedViolation.actionType]
26196
+ children: t(actionTypeLabelKeys[resolvedViolation.actionType])
25879
26197
  }
25880
26198
  )
25881
26199
  ] })
@@ -25906,7 +26224,7 @@ var init_ViolationAlert = __esm({
25906
26224
  {
25907
26225
  variant: "caption",
25908
26226
  className: cn(textColor, "opacity-75"),
25909
- children: "Admin:"
26227
+ children: t("violationAlert.adminLabel")
25910
26228
  }
25911
26229
  ),
25912
26230
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -25925,7 +26243,7 @@ var init_ViolationAlert = __esm({
25925
26243
  {
25926
26244
  variant: "caption",
25927
26245
  className: cn(textColor, "opacity-75"),
25928
- children: "Penalty:"
26246
+ children: t("violationAlert.penaltyLabel")
25929
26247
  }
25930
26248
  ),
25931
26249
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -25950,7 +26268,7 @@ var init_ViolationAlert = __esm({
25950
26268
  className: cn(textColor, "self-start"),
25951
26269
  children: [
25952
26270
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "arrow-right", size: "sm", className: "mr-1" }),
25953
- "Go to field"
26271
+ t("violationAlert.goToField")
25954
26272
  ]
25955
26273
  }
25956
26274
  )
@@ -26266,6 +26584,7 @@ var init_LineChart = __esm({
26266
26584
  "use client";
26267
26585
  init_cn();
26268
26586
  init_atoms2();
26587
+ init_useTranslate();
26269
26588
  LineChart2 = ({
26270
26589
  data,
26271
26590
  width = 400,
@@ -26277,6 +26596,7 @@ var init_LineChart = __esm({
26277
26596
  areaColor = "var(--color-primary)",
26278
26597
  className
26279
26598
  }) => {
26599
+ const { t } = useTranslate();
26280
26600
  const gradientId = React84.useId();
26281
26601
  const safeData = data ?? [];
26282
26602
  const sortedData = React84.useMemo(() => {
@@ -26313,7 +26633,7 @@ var init_LineChart = __esm({
26313
26633
  return `${linePath} L ${last.x} ${bottom} L ${first.x} ${bottom} Z`;
26314
26634
  }, [linePath, points, height, showArea]);
26315
26635
  if (safeData.length === 0) {
26316
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex items-center justify-center text-muted-foreground", className), style: { width, height }, children: "No data" });
26636
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex items-center justify-center text-muted-foreground", className), style: { width, height }, children: t("empty.noData") });
26317
26637
  }
26318
26638
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn(className), children: /* @__PURE__ */ jsxRuntime.jsxs(
26319
26639
  "svg",
@@ -28220,6 +28540,7 @@ var init_GraphView = __esm({
28220
28540
  "use client";
28221
28541
  init_cn();
28222
28542
  init_atoms2();
28543
+ init_useTranslate();
28223
28544
  GROUP_COLORS = [
28224
28545
  "#3b82f6",
28225
28546
  // blue-500
@@ -28252,6 +28573,7 @@ var init_GraphView = __esm({
28252
28573
  showLabels = true,
28253
28574
  zoomToFit = true
28254
28575
  }) => {
28576
+ const { t } = useTranslate();
28255
28577
  const containerRef = React84.useRef(null);
28256
28578
  const animRef = React84.useRef(0);
28257
28579
  const [simNodes, setSimNodes] = React84.useState([]);
@@ -28429,7 +28751,7 @@ var init_GraphView = __esm({
28429
28751
  [onNodeClick]
28430
28752
  );
28431
28753
  if (nodes.length === 0) {
28432
- 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" }) });
28754
+ 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") }) });
28433
28755
  }
28434
28756
  return /* @__PURE__ */ jsxRuntime.jsx(
28435
28757
  Box,
@@ -28885,11 +29207,12 @@ var init_UploadDropZone = __esm({
28885
29207
  init_Icon();
28886
29208
  init_Typography();
28887
29209
  init_useEventBus();
29210
+ init_useTranslate();
28888
29211
  UploadDropZone = ({
28889
29212
  accept,
28890
29213
  maxSize,
28891
29214
  maxFiles = 1,
28892
- label = "Drop files here or click to browse",
29215
+ label,
28893
29216
  description,
28894
29217
  disabled = false,
28895
29218
  action,
@@ -28897,22 +29220,24 @@ var init_UploadDropZone = __esm({
28897
29220
  onFiles,
28898
29221
  className
28899
29222
  }) => {
29223
+ const { t } = useTranslate();
29224
+ const resolvedLabel = label ?? t("upload.dropOrBrowse");
28900
29225
  const [isDragOver, setIsDragOver] = React84.useState(false);
28901
29226
  const [error, setError] = React84.useState(null);
28902
29227
  const inputRef = React84.useRef(null);
28903
29228
  const eventBus = useSafeEventBus7();
28904
29229
  const defaultDescription = [
28905
- accept ? `Accepted: ${accept}` : null,
28906
- maxSize ? `Max size: ${formatFileSize(maxSize)}` : null,
28907
- maxFiles > 1 ? `Up to ${maxFiles} files` : null
29230
+ accept ? t("upload.accepted", { accept }) : null,
29231
+ maxSize ? t("upload.maxSize", { size: formatFileSize(maxSize) }) : null,
29232
+ maxFiles > 1 ? t("upload.maxFiles", { count: maxFiles }) : null
28908
29233
  ].filter(Boolean).join(". ");
28909
29234
  const validateFiles = React84.useCallback(
28910
29235
  (files) => {
28911
29236
  if (files.length > maxFiles) {
28912
- return { valid: [], error: `Maximum ${maxFiles} file${maxFiles > 1 ? "s" : ""} allowed` };
29237
+ return { valid: [], error: t("upload.error.maxFiles", { count: maxFiles }) };
28913
29238
  }
28914
29239
  if (accept) {
28915
- const acceptedTypes = accept.split(",").map((t) => t.trim());
29240
+ const acceptedTypes = accept.split(",").map((s) => s.trim());
28916
29241
  const invalid = files.filter((file) => {
28917
29242
  return !acceptedTypes.some((type) => {
28918
29243
  if (type.endsWith("/*")) {
@@ -28922,7 +29247,7 @@ var init_UploadDropZone = __esm({
28922
29247
  });
28923
29248
  });
28924
29249
  if (invalid.length > 0) {
28925
- return { valid: [], error: `Invalid file type: ${invalid[0].name}` };
29250
+ return { valid: [], error: t("upload.error.invalidType", { name: invalid[0].name }) };
28926
29251
  }
28927
29252
  }
28928
29253
  if (maxSize) {
@@ -28930,13 +29255,13 @@ var init_UploadDropZone = __esm({
28930
29255
  if (tooLarge.length > 0) {
28931
29256
  return {
28932
29257
  valid: [],
28933
- error: `File too large: ${tooLarge[0].name} (max ${formatFileSize(maxSize)})`
29258
+ error: t("upload.error.tooLarge", { name: tooLarge[0].name, size: formatFileSize(maxSize) })
28934
29259
  };
28935
29260
  }
28936
29261
  }
28937
29262
  return { valid: files, error: null };
28938
29263
  },
28939
- [accept, maxSize, maxFiles]
29264
+ [accept, maxSize, maxFiles, t]
28940
29265
  );
28941
29266
  const handleFiles = React84.useCallback(
28942
29267
  (files) => {
@@ -29007,7 +29332,7 @@ var init_UploadDropZone = __esm({
29007
29332
  handleClick();
29008
29333
  }
29009
29334
  },
29010
- "aria-label": label,
29335
+ "aria-label": resolvedLabel,
29011
29336
  children: [
29012
29337
  /* @__PURE__ */ jsxRuntime.jsx(
29013
29338
  "input",
@@ -29023,7 +29348,7 @@ var init_UploadDropZone = __esm({
29023
29348
  }
29024
29349
  ),
29025
29350
  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" }),
29026
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body1", className: "text-center font-medium mb-1", children: isDragOver ? "Drop files here" : label }),
29351
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body1", className: "text-center font-medium mb-1", children: isDragOver ? t("upload.dropFilesHere") : resolvedLabel }),
29027
29352
  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 })
29028
29353
  ]
29029
29354
  }
@@ -29445,7 +29770,7 @@ function TableView({
29445
29770
  {
29446
29771
  checked: selected.has(id),
29447
29772
  onChange: () => toggleRow(id),
29448
- "aria-label": `Select row ${id}`
29773
+ "aria-label": t("table.selectRow", { id })
29449
29774
  }
29450
29775
  ) }),
29451
29776
  hasRenderProp ? /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex-1 min-w-0", children: children(row, index) }) : colDefs.map((col) => {
@@ -32154,7 +32479,7 @@ var init_QrScanner = __esm({
32154
32479
  className: "inset-0 flex-col items-center justify-center gap-2 bg-black bg-opacity-80 text-center",
32155
32480
  children: [
32156
32481
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "camera", className: "h-8 w-8 text-white", "aria-hidden": "true" }),
32157
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body2", className: "text-white", children: "Camera unavailable" }),
32482
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body2", className: "text-white", children: t("qrScanner.cameraUnavailable") }),
32158
32483
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", className: "text-white opacity-70", children: cameraError.message })
32159
32484
  ]
32160
32485
  }
@@ -32165,7 +32490,7 @@ var init_QrScanner = __esm({
32165
32490
  position: "absolute",
32166
32491
  display: "flex",
32167
32492
  className: "inset-0 items-center justify-center bg-black bg-opacity-60",
32168
- children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body2", className: "text-white", children: "Paused" })
32493
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body2", className: "text-white", children: t("qrScanner.paused") })
32169
32494
  }
32170
32495
  ),
32171
32496
  showCameraControls && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -32184,7 +32509,7 @@ var init_QrScanner = __esm({
32184
32509
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
32185
32510
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
32186
32511
  ),
32187
- "aria-label": isPaused ? "Resume scanning" : "Pause scanning",
32512
+ "aria-label": isPaused ? t("qrScanner.resumeScanning") : t("qrScanner.pauseScanning"),
32188
32513
  children: isPaused ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "play", className: "h-4 w-4" }) : /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "pause", className: "h-4 w-4" })
32189
32514
  }
32190
32515
  ),
@@ -32197,7 +32522,7 @@ var init_QrScanner = __esm({
32197
32522
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
32198
32523
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
32199
32524
  ),
32200
- "aria-label": `Switch to ${currentFacing === "environment" ? "front" : "rear"} camera`,
32525
+ "aria-label": currentFacing === "environment" ? t("qrScanner.switchToFrontCamera") : t("qrScanner.switchToRearCamera"),
32201
32526
  children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "refresh-cw", className: "h-4 w-4" })
32202
32527
  }
32203
32528
  ),
@@ -32211,7 +32536,7 @@ var init_QrScanner = __esm({
32211
32536
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
32212
32537
  ),
32213
32538
  "aria-label": t("aria.mockScanDev"),
32214
- children: "Mock Scan"
32539
+ children: t("qrScanner.mockScan")
32215
32540
  }
32216
32541
  )
32217
32542
  ]
@@ -32229,6 +32554,7 @@ var init_OptionConstraintGroup = __esm({
32229
32554
  "components/core/molecules/OptionConstraintGroup.tsx"() {
32230
32555
  init_cn();
32231
32556
  init_useEventBus();
32557
+ init_useTranslate();
32232
32558
  init_Typography();
32233
32559
  init_Box();
32234
32560
  init_Label();
@@ -32238,36 +32564,36 @@ var init_OptionConstraintGroup = __esm({
32238
32564
  const sign = delta >= 0 ? "+" : "-";
32239
32565
  return `${sign}$${Math.abs(delta).toFixed(2)}`;
32240
32566
  };
32241
- constraintHint = (constraint) => {
32567
+ constraintHint = (constraint, t) => {
32242
32568
  if (constraint.type === "single") {
32243
- return constraint.required ? "Required, pick 1" : "Optional, pick up to 1";
32569
+ return constraint.required ? t("optionConstraint.requiredOne") : t("optionConstraint.optionalOne");
32244
32570
  }
32245
32571
  const { min, max } = constraint;
32246
32572
  if (min && max) {
32247
- return min === max ? `Pick exactly ${min}` : `Pick ${min}-${max}`;
32573
+ return min === max ? t("optionConstraint.pickExactly", { count: min }) : t("optionConstraint.pickRange", { min, max });
32248
32574
  }
32249
- if (min) return `Pick at least ${min}`;
32250
- if (max) return `Pick up to ${max}`;
32251
- return "Optional";
32575
+ if (min) return t("optionConstraint.pickAtLeast", { count: min });
32576
+ if (max) return t("optionConstraint.pickUpTo", { count: max });
32577
+ return t("optionConstraint.optional");
32252
32578
  };
32253
- validateSelection = (selected, constraint) => {
32579
+ validateSelection = (selected, constraint, t) => {
32254
32580
  if (constraint.type === "single") {
32255
32581
  if (constraint.required && selected.length === 0) {
32256
- return "Pick 1 option";
32582
+ return t("optionConstraint.error.pickOne");
32257
32583
  }
32258
32584
  if (selected.length > 1) {
32259
- return "Pick only 1 option";
32585
+ return t("optionConstraint.error.pickOnlyOne");
32260
32586
  }
32261
32587
  return void 0;
32262
32588
  }
32263
32589
  const { min, max } = constraint;
32264
32590
  if (min !== void 0 && selected.length < min) {
32265
32591
  const remaining = min - selected.length;
32266
- return `Pick at least ${remaining} more`;
32592
+ return t("optionConstraint.error.pickMore", { count: remaining });
32267
32593
  }
32268
32594
  if (max !== void 0 && selected.length > max) {
32269
32595
  const excess = selected.length - max;
32270
- return `Remove ${excess} option${excess === 1 ? "" : "s"}`;
32596
+ return t("optionConstraint.error.removeOptions", { count: excess });
32271
32597
  }
32272
32598
  return void 0;
32273
32599
  };
@@ -32284,8 +32610,9 @@ var init_OptionConstraintGroup = __esm({
32284
32610
  className
32285
32611
  }) => {
32286
32612
  const eventBus = useEventBus();
32287
- const hint = constraintHint(constraint);
32288
- const error = validateSelection(selected, constraint);
32613
+ const { t } = useTranslate();
32614
+ const hint = constraintHint(constraint, t);
32615
+ const error = validateSelection(selected, constraint, t);
32289
32616
  const inputName = `option-${groupId}`;
32290
32617
  const labelTextSize = size === "sm" ? "text-sm" : "text-base";
32291
32618
  const optionGap = size === "sm" ? "gap-2" : "gap-2.5";
@@ -32385,7 +32712,7 @@ var init_OptionConstraintGroup = __esm({
32385
32712
  variant: "caption",
32386
32713
  color: "warning",
32387
32714
  className: "rounded border border-warning/40 px-1.5 py-0.5",
32388
- children: "Out of stock"
32715
+ children: t("optionConstraint.outOfStock")
32389
32716
  }
32390
32717
  )
32391
32718
  ]
@@ -32707,6 +33034,7 @@ function changeBlockType(block, type) {
32707
33034
  return { id: block.id, type, content: seed };
32708
33035
  }
32709
33036
  function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33037
+ const { t } = useTranslate();
32710
33038
  const [open, setOpen] = React84.useState(false);
32711
33039
  const ref = React84.useRef(null);
32712
33040
  React84.useEffect(() => {
@@ -32726,7 +33054,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32726
33054
  {
32727
33055
  type: "button",
32728
33056
  variant: "ghost",
32729
- "aria-label": "Block actions",
33057
+ "aria-label": t("richBlockEditor.blockActions"),
32730
33058
  className: cn(
32731
33059
  "inline-flex items-center justify-center",
32732
33060
  "h-6 w-6 rounded-sm p-0 gap-0",
@@ -32748,7 +33076,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32748
33076
  "py-1 text-sm"
32749
33077
  ),
32750
33078
  children: [
32751
- /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: BLOCK_TYPE_LABEL[block.type] }),
33079
+ /* @__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]) }),
32752
33080
  /* @__PURE__ */ jsxRuntime.jsxs(
32753
33081
  Button,
32754
33082
  {
@@ -32762,7 +33090,8 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32762
33090
  },
32763
33091
  children: [
32764
33092
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", className: "w-3.5 h-3.5" }),
32765
- " Duplicate"
33093
+ " ",
33094
+ t("richBlockEditor.duplicate")
32766
33095
  ]
32767
33096
  }
32768
33097
  ),
@@ -32779,14 +33108,15 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32779
33108
  },
32780
33109
  children: [
32781
33110
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "trash", className: "w-3.5 h-3.5" }),
32782
- " Delete"
33111
+ " ",
33112
+ t("common.delete")
32783
33113
  ]
32784
33114
  }
32785
33115
  ),
32786
33116
  CHANGEABLE_TYPES.includes(block.type) && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
32787
33117
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "my-1 border-t border-border" }),
32788
- /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: "Turn into" }),
32789
- CHANGEABLE_TYPES.filter((t) => t !== block.type).map((t) => /* @__PURE__ */ jsxRuntime.jsx(
33118
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: t("richBlockEditor.turnInto") }),
33119
+ CHANGEABLE_TYPES.filter((bt) => bt !== block.type).map((bt) => /* @__PURE__ */ jsxRuntime.jsx(
32790
33120
  Button,
32791
33121
  {
32792
33122
  type: "button",
@@ -32794,12 +33124,12 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32794
33124
  role: "menuitem",
32795
33125
  className: "flex w-full items-center gap-2 px-2 py-1.5 text-left justify-start rounded-none",
32796
33126
  onClick: () => {
32797
- onChangeType(t);
33127
+ onChangeType(bt);
32798
33128
  setOpen(false);
32799
33129
  },
32800
- children: BLOCK_TYPE_LABEL[t]
33130
+ children: t(BLOCK_TYPE_LABEL_KEY[bt])
32801
33131
  },
32802
- t
33132
+ bt
32803
33133
  ))
32804
33134
  ] })
32805
33135
  ]
@@ -32861,6 +33191,7 @@ function BlockRow({
32861
33191
  onInsertAfter,
32862
33192
  onChangeType
32863
33193
  }) {
33194
+ const { t } = useTranslate();
32864
33195
  const setContent = React84.useCallback(
32865
33196
  (next) => onUpdate((b) => ({ ...b, content: next })),
32866
33197
  [onUpdate]
@@ -32910,8 +33241,8 @@ function BlockRow({
32910
33241
  tag: "h1",
32911
33242
  value: block.content ?? "",
32912
33243
  readOnly,
32913
- placeholder: placeholder ?? "Heading 1",
32914
- ariaLabel: "Heading 1 block",
33244
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading1"),
33245
+ ariaLabel: t("richBlockEditor.aria.heading1Block"),
32915
33246
  className: "text-3xl font-bold leading-tight",
32916
33247
  onValueChange: setContent
32917
33248
  }
@@ -32923,8 +33254,8 @@ function BlockRow({
32923
33254
  tag: "h2",
32924
33255
  value: block.content ?? "",
32925
33256
  readOnly,
32926
- placeholder: placeholder ?? "Heading 2",
32927
- ariaLabel: "Heading 2 block",
33257
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading2"),
33258
+ ariaLabel: t("richBlockEditor.aria.heading2Block"),
32928
33259
  className: "text-2xl font-semibold leading-tight",
32929
33260
  onValueChange: setContent
32930
33261
  }
@@ -32936,8 +33267,8 @@ function BlockRow({
32936
33267
  tag: "h3",
32937
33268
  value: block.content ?? "",
32938
33269
  readOnly,
32939
- placeholder: placeholder ?? "Heading 3",
32940
- ariaLabel: "Heading 3 block",
33270
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading3"),
33271
+ ariaLabel: t("richBlockEditor.aria.heading3Block"),
32941
33272
  className: "text-xl font-semibold leading-tight",
32942
33273
  onValueChange: setContent
32943
33274
  }
@@ -32949,8 +33280,8 @@ function BlockRow({
32949
33280
  tag: "blockquote",
32950
33281
  value: block.content ?? "",
32951
33282
  readOnly,
32952
- placeholder: placeholder ?? "Quote",
32953
- ariaLabel: "Quote block",
33283
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.quote"),
33284
+ ariaLabel: t("richBlockEditor.aria.quoteBlock"),
32954
33285
  className: "border-l-4 border-primary/60 pl-4 italic text-muted-foreground",
32955
33286
  onValueChange: setContent
32956
33287
  }
@@ -32958,13 +33289,13 @@ function BlockRow({
32958
33289
  case "code":
32959
33290
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "rounded-md border border-border bg-muted/40", children: [
32960
33291
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center justify-between border-b border-border px-3 py-1 text-xs text-muted-foreground", children: [
32961
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", variant: "caption", className: "uppercase tracking-wide", children: "Code" }),
33292
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", variant: "caption", className: "uppercase tracking-wide", children: t("richBlockEditor.blockType.code") }),
32962
33293
  !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
32963
33294
  Input,
32964
33295
  {
32965
33296
  inputType: "text",
32966
33297
  value: String(block.metadata?.language ?? "plaintext"),
32967
- "aria-label": "Code language",
33298
+ "aria-label": t("richBlockEditor.aria.codeLanguage"),
32968
33299
  className: cn(
32969
33300
  "h-6 w-32 rounded-sm border border-border bg-background",
32970
33301
  "px-2 text-xs outline-none focus:ring-1 focus:ring-ring"
@@ -32980,8 +33311,8 @@ function BlockRow({
32980
33311
  tag: "pre",
32981
33312
  value: block.content ?? "",
32982
33313
  readOnly,
32983
- placeholder: placeholder ?? "Enter code",
32984
- ariaLabel: "Code block",
33314
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.code"),
33315
+ ariaLabel: t("richBlockEditor.aria.codeBlock"),
32985
33316
  className: "block whitespace-pre-wrap p-3 font-mono text-sm leading-relaxed",
32986
33317
  onValueChange: setContent
32987
33318
  }
@@ -32994,7 +33325,7 @@ function BlockRow({
32994
33325
  const caption = String(block.metadata?.caption ?? "");
32995
33326
  const imgProps = {
32996
33327
  src: url,
32997
- alt: caption || "Embedded image",
33328
+ alt: caption || t("richBlockEditor.embeddedImage"),
32998
33329
  className: "max-h-96 w-full rounded-md border border-border object-contain"
32999
33330
  };
33000
33331
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "space-y-2", children: [
@@ -33008,7 +33339,8 @@ function BlockRow({
33008
33339
  ),
33009
33340
  children: [
33010
33341
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "image", className: "mr-2 w-4 h-4" }),
33011
- " No image URL set"
33342
+ " ",
33343
+ t("richBlockEditor.noImageUrl")
33012
33344
  ]
33013
33345
  }
33014
33346
  ),
@@ -33019,7 +33351,7 @@ function BlockRow({
33019
33351
  inputType: "url",
33020
33352
  value: url,
33021
33353
  placeholder: "https://example.com/image.png",
33022
- "aria-label": "Image URL",
33354
+ "aria-label": t("richBlockEditor.aria.imageUrl"),
33023
33355
  className: cn(
33024
33356
  "h-8 flex-1 rounded-sm border border-border bg-background",
33025
33357
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -33032,8 +33364,8 @@ function BlockRow({
33032
33364
  {
33033
33365
  inputType: "text",
33034
33366
  value: caption,
33035
- placeholder: "Caption (optional)",
33036
- "aria-label": "Image caption",
33367
+ placeholder: t("richBlockEditor.placeholder.caption"),
33368
+ "aria-label": t("richBlockEditor.aria.imageCaption"),
33037
33369
  className: cn(
33038
33370
  "h-8 flex-1 rounded-sm border border-border bg-background",
33039
33371
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -33064,8 +33396,8 @@ function BlockRow({
33064
33396
  tag: "span",
33065
33397
  value: child.content ?? "",
33066
33398
  readOnly,
33067
- placeholder: "List item",
33068
- ariaLabel: "List item",
33399
+ placeholder: t("richBlockEditor.placeholder.listItem"),
33400
+ ariaLabel: t("richBlockEditor.aria.listItem"),
33069
33401
  className: "inline-block min-w-[1ch] flex-1",
33070
33402
  onValueChange: (next) => setChildContent(child.id, next)
33071
33403
  }
@@ -33075,7 +33407,7 @@ function BlockRow({
33075
33407
  {
33076
33408
  type: "button",
33077
33409
  variant: "ghost",
33078
- "aria-label": "Remove list item",
33410
+ "aria-label": t("richBlockEditor.aria.removeListItem"),
33079
33411
  className: cn(
33080
33412
  "h-5 w-5 shrink-0 rounded-sm text-muted-foreground p-0 gap-0",
33081
33413
  "opacity-0 group-hover/item:opacity-100 hover:bg-muted hover:text-foreground"
@@ -33097,7 +33429,8 @@ function BlockRow({
33097
33429
  onClick: addListItem,
33098
33430
  children: [
33099
33431
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", className: "w-3 h-3" }),
33100
- " Add item"
33432
+ " ",
33433
+ t("richBlockEditor.addItem")
33101
33434
  ]
33102
33435
  }
33103
33436
  ) })
@@ -33113,8 +33446,8 @@ function BlockRow({
33113
33446
  tag: "p",
33114
33447
  value: block.content ?? "",
33115
33448
  readOnly,
33116
- placeholder: placeholder ?? "Start writing...",
33117
- ariaLabel: "Paragraph block",
33449
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.paragraph"),
33450
+ ariaLabel: t("richBlockEditor.aria.paragraphBlock"),
33118
33451
  className: "leading-7",
33119
33452
  onValueChange: setContent
33120
33453
  }
@@ -33137,7 +33470,7 @@ function BlockRow({
33137
33470
  {
33138
33471
  type: "button",
33139
33472
  variant: "ghost",
33140
- "aria-label": "Insert paragraph below",
33473
+ "aria-label": t("richBlockEditor.insertParagraphBelow"),
33141
33474
  className: cn(
33142
33475
  "inline-flex h-6 w-6 items-center justify-center rounded-sm p-0 gap-0",
33143
33476
  "text-muted-foreground hover:bg-muted hover:text-foreground",
@@ -33164,7 +33497,7 @@ function BlockRow({
33164
33497
  }
33165
33498
  );
33166
33499
  }
33167
- var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES, RichBlockEditor;
33500
+ var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL_KEY, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES, RichBlockEditor;
33168
33501
  var init_RichBlockEditor = __esm({
33169
33502
  "components/core/molecules/RichBlockEditor.tsx"() {
33170
33503
  "use client";
@@ -33177,29 +33510,30 @@ var init_RichBlockEditor = __esm({
33177
33510
  init_Input();
33178
33511
  init_Icon();
33179
33512
  init_useEventBus();
33513
+ init_useTranslate();
33180
33514
  TOOLBAR_ENTRIES = [
33181
- { type: "paragraph", label: "Text", icon: LucideIcons2.Type },
33182
- { type: "heading-1", label: "H1", icon: LucideIcons2.Heading1 },
33183
- { type: "heading-2", label: "H2", icon: LucideIcons2.Heading2 },
33184
- { type: "heading-3", label: "H3", icon: LucideIcons2.Heading3 },
33185
- { type: "bullet-list", label: "Bullet list", icon: LucideIcons2.List },
33186
- { type: "numbered-list", label: "Numbered", icon: LucideIcons2.ListOrdered },
33187
- { type: "quote", label: "Quote", icon: LucideIcons2.Quote },
33188
- { type: "code", label: "Code", icon: LucideIcons2.Code },
33189
- { type: "divider", label: "Divider", icon: LucideIcons2.Minus },
33190
- { type: "image", label: "Image", icon: LucideIcons2.Image }
33515
+ { type: "paragraph", labelKey: "richBlockEditor.toolbar.text", icon: LucideIcons2.Type },
33516
+ { type: "heading-1", labelKey: "richBlockEditor.toolbar.h1", icon: LucideIcons2.Heading1 },
33517
+ { type: "heading-2", labelKey: "richBlockEditor.toolbar.h2", icon: LucideIcons2.Heading2 },
33518
+ { type: "heading-3", labelKey: "richBlockEditor.toolbar.h3", icon: LucideIcons2.Heading3 },
33519
+ { type: "bullet-list", labelKey: "richBlockEditor.toolbar.bulletList", icon: LucideIcons2.List },
33520
+ { type: "numbered-list", labelKey: "richBlockEditor.toolbar.numbered", icon: LucideIcons2.ListOrdered },
33521
+ { type: "quote", labelKey: "richBlockEditor.toolbar.quote", icon: LucideIcons2.Quote },
33522
+ { type: "code", labelKey: "richBlockEditor.toolbar.code", icon: LucideIcons2.Code },
33523
+ { type: "divider", labelKey: "richBlockEditor.toolbar.divider", icon: LucideIcons2.Minus },
33524
+ { type: "image", labelKey: "richBlockEditor.toolbar.image", icon: LucideIcons2.Image }
33191
33525
  ];
33192
- BLOCK_TYPE_LABEL = {
33193
- paragraph: "Text",
33194
- "heading-1": "Heading 1",
33195
- "heading-2": "Heading 2",
33196
- "heading-3": "Heading 3",
33197
- "bullet-list": "Bullet list",
33198
- "numbered-list": "Numbered list",
33199
- quote: "Quote",
33200
- code: "Code",
33201
- divider: "Divider",
33202
- image: "Image"
33526
+ BLOCK_TYPE_LABEL_KEY = {
33527
+ paragraph: "richBlockEditor.blockType.paragraph",
33528
+ "heading-1": "richBlockEditor.blockType.heading1",
33529
+ "heading-2": "richBlockEditor.blockType.heading2",
33530
+ "heading-3": "richBlockEditor.blockType.heading3",
33531
+ "bullet-list": "richBlockEditor.blockType.bulletList",
33532
+ "numbered-list": "richBlockEditor.blockType.numberedList",
33533
+ quote: "richBlockEditor.blockType.quote",
33534
+ code: "richBlockEditor.blockType.code",
33535
+ divider: "richBlockEditor.blockType.divider",
33536
+ image: "richBlockEditor.blockType.image"
33203
33537
  };
33204
33538
  CHANGEABLE_TYPES = [
33205
33539
  "paragraph",
@@ -33233,6 +33567,7 @@ var init_RichBlockEditor = __esm({
33233
33567
  showToolbar = true,
33234
33568
  className
33235
33569
  }) => {
33570
+ const { t } = useTranslate();
33236
33571
  const [blocks, setBlocks] = React84.useState(
33237
33572
  () => normalizeBlocks(initialBlocks)
33238
33573
  );
@@ -33304,25 +33639,26 @@ var init_RichBlockEditor = __esm({
33304
33639
  Box,
33305
33640
  {
33306
33641
  role: "toolbar",
33307
- "aria-label": "Block editor toolbar",
33642
+ "aria-label": t("richBlockEditor.editorToolbar"),
33308
33643
  className: cn(
33309
33644
  "flex flex-wrap items-center gap-1",
33310
33645
  "border-b border-border bg-muted/30 px-2 py-2"
33311
33646
  ),
33312
33647
  children: TOOLBAR_ENTRIES.map((entry) => {
33313
33648
  const Icon3 = entry.icon;
33649
+ const entryLabel = t(entry.labelKey);
33314
33650
  return /* @__PURE__ */ jsxRuntime.jsxs(
33315
33651
  Button,
33316
33652
  {
33317
33653
  type: "button",
33318
33654
  variant: "ghost",
33319
33655
  size: "sm",
33320
- "aria-label": `Insert ${entry.label}`,
33321
- title: entry.label,
33656
+ "aria-label": t("richBlockEditor.insertEntry", { label: entryLabel }),
33657
+ title: entryLabel,
33322
33658
  onClick: () => handleAppend(entry.type),
33323
33659
  children: [
33324
33660
  /* @__PURE__ */ jsxRuntime.jsx(Icon3, { size: 14 }),
33325
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", variant: "caption", className: "ml-1 hidden text-xs sm:inline", children: entry.label })
33661
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", variant: "caption", className: "ml-1 hidden text-xs sm:inline", children: entryLabel })
33326
33662
  ]
33327
33663
  },
33328
33664
  entry.type
@@ -33365,6 +33701,7 @@ var init_ReplyTree = __esm({
33365
33701
  "use client";
33366
33702
  init_cn();
33367
33703
  init_useEventBus();
33704
+ init_useTranslate();
33368
33705
  init_atoms2();
33369
33706
  init_VoteStack();
33370
33707
  ReplyTreeNode = ({
@@ -33384,6 +33721,7 @@ var init_ReplyTree = __esm({
33384
33721
  showActions
33385
33722
  }) => {
33386
33723
  const eventBus = useEventBus();
33724
+ const { t } = useTranslate();
33387
33725
  const hasReplies = !!node.replies && node.replies.length > 0;
33388
33726
  const isCollapsed = collapsedSet.has(node.id);
33389
33727
  const atMaxDepth = depth >= maxDepth;
@@ -33430,7 +33768,7 @@ var init_ReplyTree = __esm({
33430
33768
  variant: "ghost",
33431
33769
  size: "sm",
33432
33770
  onClick: handleToggle,
33433
- "aria-label": isCollapsed ? "Expand replies" : "Collapse replies",
33771
+ "aria-label": isCollapsed ? t("replyTree.expandReplies") : t("replyTree.collapseReplies"),
33434
33772
  "aria-expanded": !isCollapsed,
33435
33773
  leftIcon: isCollapsed ? "chevron-right" : "chevron-down",
33436
33774
  className: cn(
@@ -33471,7 +33809,7 @@ var init_ReplyTree = __esm({
33471
33809
  onVote: handleVote,
33472
33810
  size: "sm",
33473
33811
  variant: "horizontal",
33474
- label: `Vote on reply by ${node.authorName}`
33812
+ label: t("replyTree.voteOnReplyBy", { author: node.authorName })
33475
33813
  }
33476
33814
  ),
33477
33815
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -33481,8 +33819,8 @@ var init_ReplyTree = __esm({
33481
33819
  size: "sm",
33482
33820
  leftIcon: "message-square",
33483
33821
  onClick: handleReply,
33484
- "aria-label": `Reply to ${node.authorName}`,
33485
- children: "Reply"
33822
+ "aria-label": t("replyTree.replyTo", { author: node.authorName }),
33823
+ children: t("replyTree.reply")
33486
33824
  }
33487
33825
  ),
33488
33826
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -33492,8 +33830,8 @@ var init_ReplyTree = __esm({
33492
33830
  size: "sm",
33493
33831
  leftIcon: "flag",
33494
33832
  onClick: handleFlag,
33495
- "aria-label": `Flag reply by ${node.authorName}`,
33496
- children: "Flag"
33833
+ "aria-label": t("replyTree.flagReplyBy", { author: node.authorName }),
33834
+ children: t("replyTree.flag")
33497
33835
  }
33498
33836
  )
33499
33837
  ] }),
@@ -33504,9 +33842,9 @@ var init_ReplyTree = __esm({
33504
33842
  inputType: "textarea",
33505
33843
  rows: 2,
33506
33844
  value: draft,
33507
- placeholder: `Reply to ${node.authorName}\u2026`,
33845
+ placeholder: t("replyTree.replyToPlaceholder", { author: node.authorName }),
33508
33846
  onChange: (e) => setDraft(e.target.value),
33509
- "aria-label": `Reply to ${node.authorName}`
33847
+ "aria-label": t("replyTree.replyTo", { author: node.authorName })
33510
33848
  }
33511
33849
  ),
33512
33850
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-row gap-2 items-center", children: [
@@ -33518,10 +33856,10 @@ var init_ReplyTree = __esm({
33518
33856
  leftIcon: "send",
33519
33857
  onClick: handleSubmitReply,
33520
33858
  disabled: !draft.trim(),
33521
- children: "Send"
33859
+ children: t("replyTree.send")
33522
33860
  }
33523
33861
  ),
33524
- /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: "Cancel" })
33862
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: t("common.cancel") })
33525
33863
  ] })
33526
33864
  ] }),
33527
33865
  hasReplies && !isCollapsed && (atMaxDepth ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -33535,7 +33873,7 @@ var init_ReplyTree = __esm({
33535
33873
  "self-start gap-1 px-0 h-auto",
33536
33874
  "text-sm text-primary hover:underline hover:bg-transparent"
33537
33875
  ),
33538
- children: "Continue thread"
33876
+ children: t("replyTree.continueThread")
33539
33877
  }
33540
33878
  ) : /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex flex-col gap-2 mt-1", children: node.replies.map((child) => /* @__PURE__ */ jsxRuntime.jsx(
33541
33879
  ReplyTreeNode,
@@ -33574,6 +33912,7 @@ var init_ReplyTree = __esm({
33574
33912
  showActions = true,
33575
33913
  className
33576
33914
  }) => {
33915
+ const { t } = useTranslate();
33577
33916
  const nodeList = Array.isArray(nodes) ? nodes : nodes ? [nodes] : [];
33578
33917
  const [collapsedSet, setCollapsedSet] = React84.useState(() => {
33579
33918
  const acc = /* @__PURE__ */ new Set();
@@ -33592,7 +33931,7 @@ var init_ReplyTree = __esm({
33592
33931
  });
33593
33932
  }, []);
33594
33933
  if (nodeList.length === 0) {
33595
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("text-sm text-muted-foreground", className), children: "No replies yet." });
33934
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("text-sm text-muted-foreground", className), children: t("replyTree.noRepliesYet") });
33596
33935
  }
33597
33936
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex flex-col gap-2 min-w-0", className), children: nodeList.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
33598
33937
  ReplyTreeNode,
@@ -33670,6 +34009,7 @@ var init_VersionDiff = __esm({
33670
34009
  "use client";
33671
34010
  init_cn();
33672
34011
  init_useEventBus();
34012
+ init_useTranslate();
33673
34013
  init_atoms2();
33674
34014
  init_Stack();
33675
34015
  INLINE_STYLES = {
@@ -33692,6 +34032,7 @@ var init_VersionDiff = __esm({
33692
34032
  language,
33693
34033
  className
33694
34034
  }) => {
34035
+ const { t } = useTranslate();
33695
34036
  const eventBus = useEventBus();
33696
34037
  const revisions = Array.isArray(revisionsProp) ? revisionsProp : [];
33697
34038
  const fallbackBefore = revisions[0]?.id ?? "";
@@ -33773,24 +34114,24 @@ var init_VersionDiff = __esm({
33773
34114
  children: [
33774
34115
  /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: "flex-wrap", children: [
33775
34116
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "git-commit", size: "sm", className: "text-muted-foreground" }),
33776
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "whitespace-nowrap", children: "Compare" }),
34117
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "whitespace-nowrap", children: t("versionDiff.compare") }),
33777
34118
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsxRuntime.jsx(
33778
34119
  Select,
33779
34120
  {
33780
34121
  options,
33781
34122
  value: activeBeforeId,
33782
34123
  onChange: handleBeforeChange,
33783
- "aria-label": "Before revision"
34124
+ "aria-label": t("versionDiff.beforeRevision")
33784
34125
  }
33785
34126
  ) }),
33786
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: "to" }),
34127
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: t("versionDiff.to") }),
33787
34128
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsxRuntime.jsx(
33788
34129
  Select,
33789
34130
  {
33790
34131
  options,
33791
34132
  value: activeAfterId,
33792
34133
  onChange: handleAfterChange,
33793
- "aria-label": "After revision"
34134
+ "aria-label": t("versionDiff.afterRevision")
33794
34135
  }
33795
34136
  ) }),
33796
34137
  language && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "default", children: language }),
@@ -33811,7 +34152,7 @@ var init_VersionDiff = __esm({
33811
34152
  size: "sm",
33812
34153
  icon: activeView === "side-by-side" ? "align-left" : "columns",
33813
34154
  onClick: handleViewToggle,
33814
- "aria-label": activeView === "side-by-side" ? "Switch to inline view" : "Switch to side-by-side view"
34155
+ "aria-label": activeView === "side-by-side" ? t("versionDiff.switchToInline") : t("versionDiff.switchToSideBySide")
33815
34156
  }
33816
34157
  ),
33817
34158
  (onRevert || revertEvent) && /* @__PURE__ */ jsxRuntime.jsx(
@@ -33821,7 +34162,7 @@ var init_VersionDiff = __esm({
33821
34162
  size: "sm",
33822
34163
  icon: "rotate-ccw",
33823
34164
  onClick: handleRevert,
33824
- children: "Revert"
34165
+ children: t("versionDiff.revert")
33825
34166
  }
33826
34167
  )
33827
34168
  ] })
@@ -33838,12 +34179,12 @@ var init_VersionDiff = __esm({
33838
34179
  children: [
33839
34180
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
33840
34181
  beforeRev?.label,
33841
- beforeRev?.author ? ` by ${beforeRev.author}` : "",
34182
+ beforeRev?.author ? t("versionDiff.byAuthor", { author: beforeRev.author }) : "",
33842
34183
  beforeRev?.timestamp ? ` (${beforeRev.timestamp})` : ""
33843
34184
  ] }),
33844
34185
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
33845
34186
  afterRev?.label,
33846
- afterRev?.author ? ` by ${afterRev.author}` : "",
34187
+ afterRev?.author ? t("versionDiff.byAuthor", { author: afterRev.author }) : "",
33847
34188
  afterRev?.timestamp ? ` (${afterRev.timestamp})` : ""
33848
34189
  ] })
33849
34190
  ]
@@ -34236,10 +34577,12 @@ var init_DocPagination = __esm({
34236
34577
  }
34237
34578
  });
34238
34579
  function DocSearch({
34239
- placeholder = "Search documentation...",
34580
+ placeholder,
34240
34581
  onSearch,
34241
34582
  className
34242
34583
  }) {
34584
+ const { t } = useTranslate();
34585
+ const resolvedPlaceholder = placeholder ?? t("docSearch.placeholder");
34243
34586
  const [query, setQuery] = React84.useState("");
34244
34587
  const [results, setResults] = React84.useState([]);
34245
34588
  const [isOpen, setIsOpen] = React84.useState(false);
@@ -34346,7 +34689,7 @@ function DocSearch({
34346
34689
  Input,
34347
34690
  {
34348
34691
  inputType: "search",
34349
- placeholder,
34692
+ placeholder: resolvedPlaceholder,
34350
34693
  value: query,
34351
34694
  onChange: handleChange,
34352
34695
  onFocus: handleFocus,
@@ -34411,6 +34754,7 @@ var init_DocSearch = __esm({
34411
34754
  init_Typography();
34412
34755
  init_Icon();
34413
34756
  init_Input();
34757
+ init_useTranslate();
34414
34758
  }
34415
34759
  });
34416
34760
  var DocSidebarCategory, DocSidebar;
@@ -36415,8 +36759,8 @@ var init_SignaturePad = __esm({
36415
36759
  init_useEventBus();
36416
36760
  init_useTranslate();
36417
36761
  SignaturePad = ({
36418
- label = "Signature",
36419
- helperText = "Draw your signature above",
36762
+ label,
36763
+ helperText,
36420
36764
  strokeColor,
36421
36765
  strokeWidth = 2,
36422
36766
  height = 200,
@@ -36432,6 +36776,8 @@ var init_SignaturePad = __esm({
36432
36776
  }) => {
36433
36777
  const eventBus = useEventBus();
36434
36778
  const { t } = useTranslate();
36779
+ const resolvedLabel = label ?? t("signaturePad.label");
36780
+ const resolvedHelperText = helperText ?? t("signaturePad.helperText");
36435
36781
  const canvasRef = React84.useRef(null);
36436
36782
  const [isDrawing, setIsDrawing] = React84.useState(false);
36437
36783
  const [hasSignature, setHasSignature] = React84.useState(!!value);
@@ -36534,7 +36880,7 @@ var init_SignaturePad = __esm({
36534
36880
  );
36535
36881
  }
36536
36882
  return /* @__PURE__ */ jsxRuntime.jsx(Card, { className: cn("p-4", className), children: /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "sm", children: [
36537
- label && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "medium", children: label }),
36883
+ resolvedLabel && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "medium", children: resolvedLabel }),
36538
36884
  /* @__PURE__ */ jsxRuntime.jsx(
36539
36885
  Box,
36540
36886
  {
@@ -36563,7 +36909,7 @@ var init_SignaturePad = __esm({
36563
36909
  )
36564
36910
  }
36565
36911
  ),
36566
- helperText && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: helperText }),
36912
+ resolvedHelperText && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: resolvedHelperText }),
36567
36913
  !readOnly && /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", justify: "end", children: [
36568
36914
  /* @__PURE__ */ jsxRuntime.jsx(
36569
36915
  Button,
@@ -36573,7 +36919,7 @@ var init_SignaturePad = __esm({
36573
36919
  icon: LucideIcons2.Eraser,
36574
36920
  onClick: clearSignature,
36575
36921
  disabled: !hasSignature,
36576
- children: "Clear"
36922
+ children: t("signaturePad.clear")
36577
36923
  }
36578
36924
  ),
36579
36925
  signEvent && /* @__PURE__ */ jsxRuntime.jsx(
@@ -36584,7 +36930,7 @@ var init_SignaturePad = __esm({
36584
36930
  icon: LucideIcons2.Check,
36585
36931
  onClick: confirmSignature,
36586
36932
  disabled: !hasSignature,
36587
- children: "Confirm"
36933
+ children: t("signaturePad.confirm")
36588
36934
  }
36589
36935
  )
36590
36936
  ] })
@@ -41029,6 +41375,7 @@ function MasterDetail({
41029
41375
  className,
41030
41376
  ...rest
41031
41377
  }) {
41378
+ const { t } = useTranslate();
41032
41379
  const loading = externalLoading ?? false;
41033
41380
  const isLoading = externalIsLoading ?? false;
41034
41381
  const error = externalError ?? null;
@@ -41041,8 +41388,8 @@ function MasterDetail({
41041
41388
  isLoading: loading || isLoading,
41042
41389
  error,
41043
41390
  className,
41044
- emptyTitle: "No items found",
41045
- emptyDescription: "Create your first item to get started.",
41391
+ emptyTitle: t("table.empty.title"),
41392
+ emptyDescription: t("empty.createFirst"),
41046
41393
  ...rest
41047
41394
  }
41048
41395
  );
@@ -41051,6 +41398,7 @@ var init_MasterDetail = __esm({
41051
41398
  "components/core/organisms/MasterDetail.tsx"() {
41052
41399
  "use client";
41053
41400
  init_DataTable();
41401
+ init_useTranslate();
41054
41402
  MasterDetail.displayName = "MasterDetail";
41055
41403
  }
41056
41404
  });
@@ -41059,14 +41407,18 @@ var init_MasterDetailLayout = __esm({
41059
41407
  "components/core/organisms/layout/MasterDetailLayout.tsx"() {
41060
41408
  init_cn();
41061
41409
  init_Typography();
41062
- DefaultEmptyDetail = () => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsxRuntime.jsx(
41063
- Typography,
41064
- {
41065
- variant: "body2",
41066
- className: "text-muted-foreground",
41067
- children: "Select an item to view details"
41068
- }
41069
- ) });
41410
+ init_useTranslate();
41411
+ DefaultEmptyDetail = () => {
41412
+ const { t } = useTranslate();
41413
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsxRuntime.jsx(
41414
+ Typography,
41415
+ {
41416
+ variant: "body2",
41417
+ className: "text-muted-foreground",
41418
+ children: t("masterDetail.selectItem")
41419
+ }
41420
+ ) });
41421
+ };
41070
41422
  MasterDetailLayout = ({
41071
41423
  master,
41072
41424
  detail,
@@ -41193,7 +41545,7 @@ var init_MediaGallery = __esm({
41193
41545
  {
41194
41546
  icon: LucideIcons2.Image,
41195
41547
  title: t("display.noMedia"),
41196
- description: "No media items to display.",
41548
+ description: t("mediaGallery.noMediaDescription"),
41197
41549
  className
41198
41550
  }
41199
41551
  );
@@ -41210,7 +41562,7 @@ var init_MediaGallery = __esm({
41210
41562
  size: "sm",
41211
41563
  icon: LucideIcons2.Upload,
41212
41564
  action: "MEDIA_UPLOAD",
41213
- children: "Upload"
41565
+ children: t("mediaGallery.upload")
41214
41566
  }
41215
41567
  ),
41216
41568
  actions?.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -41224,10 +41576,7 @@ var init_MediaGallery = __esm({
41224
41576
  ))
41225
41577
  ] })
41226
41578
  ] }),
41227
- selectable && selectedItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(HStack, { gap: "sm", align: "center", children: /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "info", children: [
41228
- selectedItems.length,
41229
- " selected"
41230
- ] }) }),
41579
+ 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 }) }) }),
41231
41580
  /* @__PURE__ */ jsxRuntime.jsx(
41232
41581
  Box,
41233
41582
  {
@@ -42101,7 +42450,7 @@ function TraitsTab({ traits: traits2 }) {
42101
42450
  EmptyState,
42102
42451
  {
42103
42452
  title: t("debug.noActiveTraits"),
42104
- description: "Traits will appear when components using them are mounted",
42453
+ description: t("debug.traitsMountHint"),
42105
42454
  className: "py-8"
42106
42455
  }
42107
42456
  );
@@ -42111,14 +42460,11 @@ function TraitsTab({ traits: traits2 }) {
42111
42460
  header: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 w-full", children: [
42112
42461
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", weight: "semibold", className: "text-purple-600 dark:text-purple-400", children: trait.name }),
42113
42462
  /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "success", size: "sm", children: trait.currentState }),
42114
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: [
42115
- trait.transitionCount,
42116
- " transitions"
42117
- ] })
42463
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: t("debug.transitionsCount", { count: trait.transitionCount }) })
42118
42464
  ] }),
42119
42465
  content: /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "sm", children: [
42120
42466
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42121
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "States" }),
42467
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.states") }),
42122
42468
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: trait.states.map((state) => /* @__PURE__ */ jsxRuntime.jsx(
42123
42469
  Badge,
42124
42470
  {
@@ -42130,7 +42476,7 @@ function TraitsTab({ traits: traits2 }) {
42130
42476
  )) })
42131
42477
  ] }),
42132
42478
  trait.transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42133
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Transitions" }),
42479
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.transitions") }),
42134
42480
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: trait.transitions.map((t2, i) => /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "font-mono", children: [
42135
42481
  t2.from,
42136
42482
  " \u2192 ",
@@ -42149,7 +42495,7 @@ function TraitsTab({ traits: traits2 }) {
42149
42495
  ] }, i)) })
42150
42496
  ] }),
42151
42497
  trait.guards.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42152
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Guards" }),
42498
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.guards") }),
42153
42499
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: trait.guards.map((g, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
42154
42500
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: g.name }),
42155
42501
  /* @__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" })
@@ -42255,7 +42601,7 @@ function EntitiesTab({ snapshot }) {
42255
42601
  EmptyState,
42256
42602
  {
42257
42603
  title: t("debug.noEntityData"),
42258
- description: "Debug mode may not be enabled",
42604
+ description: t("debug.debugModeHint"),
42259
42605
  className: "py-8"
42260
42606
  }
42261
42607
  );
@@ -42268,7 +42614,7 @@ function EntitiesTab({ snapshot }) {
42268
42614
  EmptyState,
42269
42615
  {
42270
42616
  title: t("debug.noEntities"),
42271
- description: "Entities will appear when spawned",
42617
+ description: t("debug.entitiesSpawnHint"),
42272
42618
  className: "py-8"
42273
42619
  }
42274
42620
  );
@@ -42276,7 +42622,7 @@ function EntitiesTab({ snapshot }) {
42276
42622
  const singletonItems = singletonEntries.map(([name, data]) => ({
42277
42623
  id: `singleton-${name}`,
42278
42624
  header: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
42279
- /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "sm", children: "Singleton" }),
42625
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "sm", children: t("debug.singleton") }),
42280
42626
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", weight: "semibold", className: "text-sky-600 dark:text-sky-400", children: name })
42281
42627
  ] }),
42282
42628
  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) })
@@ -42294,31 +42640,19 @@ function EntitiesTab({ snapshot }) {
42294
42640
  }));
42295
42641
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--entities", children: [
42296
42642
  singletonItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4", children: [
42297
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
42298
- "Singletons (",
42299
- singletonItems.length,
42300
- ")"
42301
- ] }),
42643
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.singletonsCount", { count: singletonItems.length }) }),
42302
42644
  /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: singletonItems, multiple: true })
42303
42645
  ] }),
42304
42646
  runtimeItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4", children: [
42305
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
42306
- "Runtime (",
42307
- runtimeEntities.length,
42308
- ")"
42309
- ] }),
42647
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.runtimeCount", { count: runtimeEntities.length }) }),
42310
42648
  /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: runtimeItems, multiple: true }),
42311
- runtimeEntities.length > 20 && /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-400 text-center mt-2", children: [
42312
- "+",
42313
- runtimeEntities.length - 20,
42314
- " more entities"
42315
- ] })
42649
+ 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 }) })
42316
42650
  ] }),
42317
42651
  persistentEntries.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42318
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Persistent" }),
42652
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.persistent") }),
42319
42653
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: persistentEntries.map(([type, info]) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between py-1", children: [
42320
42654
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: type }),
42321
- /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: info.loaded ? "success" : "default", size: "sm", children: info.loaded ? `${info.count} loaded` : "not loaded" })
42655
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: info.loaded ? "success" : "default", size: "sm", children: info.loaded ? t("debug.loadedCount", { count: info.count }) : t("debug.notLoaded") })
42322
42656
  ] }, type)) })
42323
42657
  ] })
42324
42658
  ] });
@@ -42362,7 +42696,7 @@ function EventFlowTab({ events: events2 }) {
42362
42696
  EmptyState,
42363
42697
  {
42364
42698
  title: t("debug.noEventsYet"),
42365
- description: "Events will appear as traits, ticks, and other systems execute",
42699
+ description: t("debug.eventsExecuteHint"),
42366
42700
  className: "py-8"
42367
42701
  }
42368
42702
  );
@@ -42373,17 +42707,13 @@ function EventFlowTab({ events: events2 }) {
42373
42707
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--events", children: [
42374
42708
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 mb-3 flex-wrap", children: [
42375
42709
  /* @__PURE__ */ jsxRuntime.jsxs(ButtonGroup, { children: [
42376
- /* @__PURE__ */ jsxRuntime.jsxs(
42710
+ /* @__PURE__ */ jsxRuntime.jsx(
42377
42711
  Button,
42378
42712
  {
42379
42713
  size: "sm",
42380
42714
  variant: filter === "all" ? "primary" : "secondary",
42381
42715
  onClick: () => setFilter("all"),
42382
- children: [
42383
- "All (",
42384
- events2.length,
42385
- ")"
42386
- ]
42716
+ children: t("debug.allCount", { count: events2.length })
42387
42717
  }
42388
42718
  ),
42389
42719
  eventTypes.map((type) => {
@@ -42413,7 +42743,7 @@ function EventFlowTab({ events: events2 }) {
42413
42743
  onChange: (e) => setAutoScroll(e.target.checked)
42414
42744
  }
42415
42745
  ),
42416
- "Auto-scroll"
42746
+ t("debug.autoScroll")
42417
42747
  ] })
42418
42748
  ] }),
42419
42749
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -42471,7 +42801,7 @@ function GuardsPanel({ guards }) {
42471
42801
  EmptyState,
42472
42802
  {
42473
42803
  title: t("debug.noGuardEvaluations"),
42474
- description: "Guard evaluations will appear when transitions or ticks with guards execute",
42804
+ description: t("debug.guardEvaluationsHint"),
42475
42805
  className: "py-8"
42476
42806
  }
42477
42807
  );
@@ -42502,15 +42832,15 @@ function GuardsPanel({ guards }) {
42502
42832
  ] }),
42503
42833
  content: /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "sm", children: [
42504
42834
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42505
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Expression" }),
42835
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.expression") }),
42506
42836
  /* @__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 })
42507
42837
  ] }),
42508
42838
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42509
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Inputs" }),
42839
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.inputs") }),
42510
42840
  /* @__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) })
42511
42841
  ] }),
42512
42842
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42513
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Trait" }),
42843
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.trait") }),
42514
42844
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: guard.context.traitName })
42515
42845
  ] })
42516
42846
  ] })
@@ -42528,9 +42858,9 @@ function GuardsPanel({ guards }) {
42528
42858
  ] })
42529
42859
  ] }),
42530
42860
  /* @__PURE__ */ jsxRuntime.jsxs(ButtonGroup, { children: [
42531
- /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: "All" }),
42532
- /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: "Passed" }),
42533
- /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "failed" ? "primary" : "secondary", onClick: () => setFilter("failed"), children: "Failed" })
42861
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: t("debug.filterAll") }),
42862
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: t("debug.filterPassed") }),
42863
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "failed" ? "primary" : "secondary", onClick: () => setFilter("failed"), children: t("debug.filterFailed") })
42534
42864
  ] })
42535
42865
  ] }),
42536
42866
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-80 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: accordionItems }) })
@@ -42656,7 +42986,7 @@ function TransitionTimeline({ transitions }) {
42656
42986
  EmptyState,
42657
42987
  {
42658
42988
  title: t("debug.noTransitionsRecorded"),
42659
- description: "Transitions will appear as the state machine processes events",
42989
+ description: t("debug.transitionsProcessHint"),
42660
42990
  className: "py-8"
42661
42991
  }
42662
42992
  );
@@ -42673,10 +43003,7 @@ function TransitionTimeline({ transitions }) {
42673
43003
  const sorted = [...transitions].reverse();
42674
43004
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--timeline", children: [
42675
43005
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-2", children: [
42676
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-500", children: [
42677
- transitions.length,
42678
- " transitions recorded"
42679
- ] }),
43006
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500", children: t("debug.transitionsRecorded", { count: transitions.length }) }),
42680
43007
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-1 text-xs text-gray-500 cursor-pointer", children: [
42681
43008
  /* @__PURE__ */ jsxRuntime.jsx(
42682
43009
  Checkbox,
@@ -42685,7 +43012,7 @@ function TransitionTimeline({ transitions }) {
42685
43012
  onChange: (e) => setAutoScroll(e.target.checked)
42686
43013
  }
42687
43014
  ),
42688
- "Auto-scroll"
43015
+ t("debug.autoScroll")
42689
43016
  ] })
42690
43017
  ] }),
42691
43018
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -42728,15 +43055,13 @@ function TransitionTimeline({ transitions }) {
42728
43055
  variant: trace.guardResult ? "success" : "danger",
42729
43056
  size: "sm",
42730
43057
  children: [
42731
- "guard: ",
43058
+ t("debug.guardLabel"),
43059
+ " ",
42732
43060
  trace.guardResult ? "\u2713" : "\u2717"
42733
43061
  ]
42734
43062
  }
42735
43063
  ),
42736
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: [
42737
- trace.effects.length,
42738
- " effects"
42739
- ] })
43064
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: t("debug.effectsCount", { count: trace.effects.length }) })
42740
43065
  ] }),
42741
43066
  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: [
42742
43067
  /* @__PURE__ */ jsxRuntime.jsx(EffectBadge, { effect }),
@@ -42785,13 +43110,13 @@ function ServerBridgeTab({ bridge }) {
42785
43110
  EmptyState,
42786
43111
  {
42787
43112
  title: t("debug.noBridgeData"),
42788
- description: "The ServerBridge has not been initialized. Bridge health will appear once the runtime connects to the server.",
43113
+ description: t("debug.bridgeInitHint"),
42789
43114
  className: "py-8"
42790
43115
  }
42791
43116
  );
42792
43117
  }
42793
43118
  const formatTime4 = (ts) => {
42794
- if (ts === 0) return "Never";
43119
+ if (ts === 0) return t("debug.never");
42795
43120
  const d = new Date(ts);
42796
43121
  return d.toLocaleTimeString("en-US", {
42797
43122
  hour12: false,
@@ -42804,14 +43129,14 @@ function ServerBridgeTab({ bridge }) {
42804
43129
  /* @__PURE__ */ jsxRuntime.jsxs(Card, { className: "p-3", children: [
42805
43130
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 mb-3", children: [
42806
43131
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: `w-3 h-3 rounded-full ${bridge.connected ? "bg-green-500 animate-pulse" : "bg-red-500"}` }),
42807
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: bridge.connected ? "Connected" : "Disconnected" })
43132
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: bridge.connected ? t("debug.connected") : t("debug.disconnected") })
42808
43133
  ] }),
42809
43134
  /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "xs", children: [
42810
43135
  /* @__PURE__ */ jsxRuntime.jsx(
42811
43136
  StatRow,
42812
43137
  {
42813
43138
  label: t("debug.status"),
42814
- value: bridge.connected ? "Connected" : "Disconnected",
43139
+ value: bridge.connected ? t("debug.connected") : t("debug.disconnected"),
42815
43140
  variant: bridge.connected ? "success" : "danger"
42816
43141
  }
42817
43142
  ),
@@ -42839,13 +43164,10 @@ function ServerBridgeTab({ bridge }) {
42839
43164
  ] })
42840
43165
  ] }),
42841
43166
  bridge.lastError && /* @__PURE__ */ jsxRuntime.jsxs(Card, { className: "p-3 border-red-200 dark:border-red-800 bg-red-50 dark:bg-red-950", children: [
42842
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "semibold", className: "text-red-600 dark:text-red-400 mb-1", children: "Last Error" }),
43167
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "semibold", className: "text-red-600 dark:text-red-400 mb-1", children: t("debug.lastError") }),
42843
43168
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-red-500 font-mono break-all", children: bridge.lastError })
42844
43169
  ] }),
42845
- bridge.connected && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-2", children: /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-400", children: [
42846
- bridge.eventsForwarded + bridge.eventsReceived,
42847
- " total events processed"
42848
- ] }) })
43170
+ 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 }) }) })
42849
43171
  ] }) });
42850
43172
  }
42851
43173
  var init_ServerBridgeTab = __esm({
@@ -42955,7 +43277,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
42955
43277
  EmptyState,
42956
43278
  {
42957
43279
  title: t("debug.noActiveTraits"),
42958
- description: "Traits will appear when the state machine initializes",
43280
+ description: t("debug.traitsInitHint"),
42959
43281
  className: "py-8"
42960
43282
  }
42961
43283
  );
@@ -42972,7 +43294,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
42972
43294
  };
42973
43295
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--dispatch", children: [
42974
43296
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3", children: [
42975
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Active States" }),
43297
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.activeStates") }),
42976
43298
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: traits2.map((trait) => /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "success", size: "sm", children: [
42977
43299
  trait.name,
42978
43300
  ": ",
@@ -42980,8 +43302,8 @@ function EventDispatcherTab({ traits: traits2, schema }) {
42980
43302
  ] }, trait.id)) })
42981
43303
  ] }),
42982
43304
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3", children: [
42983
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Available Events" }),
42984
- 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: [
43305
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.availableEvents") }),
43306
+ 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: [
42985
43307
  /* @__PURE__ */ jsxRuntime.jsx(
42986
43308
  Button,
42987
43309
  {
@@ -42993,15 +43315,15 @@ function EventDispatcherTab({ traits: traits2, schema }) {
42993
43315
  }
42994
43316
  ),
42995
43317
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500", children: transitions.map((t2) => `${t2.from} -> ${t2.to}`).join(", ") }),
42996
- transitions.some((t2) => t2.guard) && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "warning", size: "sm", children: "guarded" })
43318
+ transitions.some((tr) => tr.guard) && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "warning", size: "sm", children: t("debug.guarded") })
42997
43319
  ] }, event)) })
42998
43320
  ] }),
42999
43321
  unavailableEvents.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3", children: [
43000
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Other Events (not available from current state)" }),
43322
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.otherEvents") }),
43001
43323
  /* @__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)) })
43002
43324
  ] }),
43003
43325
  log12.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
43004
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Recent Transitions" }),
43326
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.recentTransitions") }),
43005
43327
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: log12.map((entry, i) => /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "font-mono text-xs", children: [
43006
43328
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-400", children: entry.traitName }),
43007
43329
  " ",
@@ -43032,21 +43354,20 @@ var init_RuntimeDebugger = __esm({
43032
43354
  }
43033
43355
  });
43034
43356
  function ServerResponseRow({ sr }) {
43357
+ const { t } = useTranslate();
43035
43358
  const entityEntries = Object.entries(sr.dataEntities);
43036
43359
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-4 pl-2 border-l border-purple-500/30 py-0.5 text-xs font-mono", children: [
43037
43360
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43038
43361
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: sr.success ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400", children: [
43039
43362
  sr.success ? "\u2713" : "\u2717",
43040
- " server"
43363
+ " ",
43364
+ t("debug.server")
43041
43365
  ] }),
43042
43366
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-300", children: sr.orbitalName }),
43043
- sr.clientEffects > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "px-1 rounded bg-purple-500/15 text-purple-600 dark:text-purple-300", children: [
43044
- sr.clientEffects,
43045
- " clientEffect",
43046
- sr.clientEffects !== 1 ? "s" : ""
43047
- ] }),
43367
+ 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 }) }),
43048
43368
  sr.emittedEvents.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "px-1 rounded bg-blue-500/15 text-blue-300", children: [
43049
- "emit: ",
43369
+ t("debug.emitLabel"),
43370
+ " ",
43050
43371
  sr.emittedEvents.join(", ")
43051
43372
  ] }),
43052
43373
  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 })
@@ -43054,13 +43375,12 @@ function ServerResponseRow({ sr }) {
43054
43375
  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: [
43055
43376
  name,
43056
43377
  ": ",
43057
- count,
43058
- " row",
43059
- count !== 1 ? "s" : ""
43378
+ t("debug.rowsCount", { count })
43060
43379
  ] }, name)) })
43061
43380
  ] });
43062
43381
  }
43063
43382
  function TransitionRow({ trace }) {
43383
+ const { t } = useTranslate();
43064
43384
  const isServerEntry = !!trace.serverResponse && trace.traitName.startsWith("server:");
43065
43385
  const hasFailedEffects = trace.effects.some((e) => e.status === "failed");
43066
43386
  if (isServerEntry && trace.serverResponse) {
@@ -43068,7 +43388,7 @@ function TransitionRow({ trace }) {
43068
43388
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-2 text-xs font-mono", children: [
43069
43389
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-1.5 w-1.5 h-1.5 rounded-full flex-shrink-0 bg-purple-500" }),
43070
43390
  /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "warning", size: "sm", className: "flex-shrink-0", children: trace.event }),
43071
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-400 flex-shrink-0", children: "server response" })
43391
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-400 flex-shrink-0", children: t("debug.serverResponse") })
43072
43392
  ] }),
43073
43393
  /* @__PURE__ */ jsxRuntime.jsx(ServerResponseRow, { sr: trace.serverResponse })
43074
43394
  ] });
@@ -43109,6 +43429,7 @@ function VerifyModePanel({
43109
43429
  serverCount,
43110
43430
  localCount
43111
43431
  }) {
43432
+ const { t } = useTranslate();
43112
43433
  const [expanded, setExpanded] = React84__namespace.useState(true);
43113
43434
  const scrollRef = React84__namespace.useRef(null);
43114
43435
  const prevCountRef = React84__namespace.useRef(0);
@@ -43139,30 +43460,20 @@ function VerifyModePanel({
43139
43460
  onClick: () => setExpanded((v) => !v),
43140
43461
  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",
43141
43462
  "aria-expanded": expanded,
43142
- "aria-label": expanded ? "Collapse verification timeline" : "Expand verification timeline",
43463
+ "aria-label": expanded ? t("debug.collapseVerificationTimeline") : t("debug.expandVerificationTimeline"),
43143
43464
  "data-testid": "debugger-verify-toggle",
43144
43465
  children: [
43145
43466
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground/50 w-3", "aria-hidden": true, children: expanded ? "\u25BE" : "\u25B8" }),
43146
- /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? `${failedChecks} fail` : "OK" }),
43147
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-foreground/70", children: [
43148
- localCount,
43149
- " local"
43150
- ] }),
43151
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-purple-600 dark:text-purple-400", children: [
43152
- serverCount,
43153
- " server"
43154
- ] }),
43467
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? t("debug.failCount", { count: failedChecks }) : t("debug.ok") }),
43468
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground/70", children: t("debug.localCount", { count: localCount }) }),
43469
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-400", children: t("debug.serverCount", { count: serverCount }) }),
43155
43470
  traitStates && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-cyan-600 dark:text-cyan-400 truncate max-w-[400px]", children: traitStates }),
43156
- !expanded && transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ml-auto text-foreground/50", children: [
43157
- transitions.length,
43158
- " transition",
43159
- transitions.length !== 1 ? "s" : ""
43160
- ] })
43471
+ !expanded && transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto text-foreground/50", children: t("debug.transitionsCount", { count: transitions.length }) })
43161
43472
  ]
43162
43473
  }
43163
43474
  ),
43164
43475
  expanded && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 flex overflow-hidden", children: [
43165
- /* @__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)) }) }) }),
43476
+ /* @__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)) }) }) }),
43166
43477
  /* @__PURE__ */ jsxRuntime.jsx(WalkMinimap, {})
43167
43478
  ] })
43168
43479
  ]
@@ -43178,6 +43489,7 @@ function RuntimeDebugger({
43178
43489
  defaultTab,
43179
43490
  schema
43180
43491
  }) {
43492
+ const { t } = useTranslate();
43181
43493
  const [isCollapsed, setIsCollapsed] = React84__namespace.useState(mode === "verify" ? true : defaultCollapsed);
43182
43494
  const [isVisible, setIsVisible] = React84__namespace.useState(mode === "inline" || mode === "verify" || isDebugEnabled2());
43183
43495
  const debugData = useDebugData();
@@ -43216,55 +43528,55 @@ function RuntimeDebugger({
43216
43528
  const tabItems = [
43217
43529
  {
43218
43530
  id: "dispatch",
43219
- label: "Dispatch",
43531
+ label: t("debug.tabDispatch"),
43220
43532
  badge: debugData.traits.length || void 0,
43221
43533
  content: /* @__PURE__ */ jsxRuntime.jsx(EventDispatcherTab, { traits: debugData.traits, schema })
43222
43534
  },
43223
43535
  {
43224
43536
  id: "verify",
43225
- label: failedChecks > 0 ? "Verify (!)" : "Verify",
43537
+ label: failedChecks > 0 ? t("debug.tabVerifyAlert") : t("debug.tabVerify"),
43226
43538
  badge: verification.summary.totalChecks || void 0,
43227
43539
  content: /* @__PURE__ */ jsxRuntime.jsx(VerificationTab, { checks: verification.checks, summary: verification.summary })
43228
43540
  },
43229
43541
  {
43230
43542
  id: "timeline",
43231
- label: "Timeline",
43543
+ label: t("debug.tabTimeline"),
43232
43544
  badge: verification.transitions.length || void 0,
43233
43545
  content: /* @__PURE__ */ jsxRuntime.jsx(TransitionTimeline, { transitions: verification.transitions })
43234
43546
  },
43235
43547
  {
43236
43548
  id: "bridge",
43237
- label: "Bridge",
43549
+ label: t("debug.tabBridge"),
43238
43550
  badge: verification.bridge?.connected ? void 0 : 1,
43239
43551
  content: /* @__PURE__ */ jsxRuntime.jsx(ServerBridgeTab, { bridge: verification.bridge })
43240
43552
  },
43241
43553
  {
43242
43554
  id: "traits",
43243
- label: "Traits",
43555
+ label: t("debug.tabTraits"),
43244
43556
  badge: debugData.traits.length || void 0,
43245
43557
  content: /* @__PURE__ */ jsxRuntime.jsx(TraitsTab, { traits: debugData.traits })
43246
43558
  },
43247
43559
  {
43248
43560
  id: "ticks",
43249
- label: "Ticks",
43250
- badge: debugData.ticks.filter((t) => t.active).length || void 0,
43561
+ label: t("debug.tabTicks"),
43562
+ badge: debugData.ticks.filter((tick) => tick.active).length || void 0,
43251
43563
  content: /* @__PURE__ */ jsxRuntime.jsx(TicksTab, { ticks: debugData.ticks })
43252
43564
  },
43253
43565
  {
43254
43566
  id: "entities",
43255
- label: "Entities",
43567
+ label: t("debug.tabEntities"),
43256
43568
  badge: debugData.entitySnapshot?.runtime.length || void 0,
43257
43569
  content: /* @__PURE__ */ jsxRuntime.jsx(EntitiesTab, { snapshot: debugData.entitySnapshot })
43258
43570
  },
43259
43571
  {
43260
43572
  id: "events",
43261
- label: "Events",
43573
+ label: t("debug.tabEvents"),
43262
43574
  badge: debugData.events.length > 0 ? debugData.events.length : void 0,
43263
43575
  content: /* @__PURE__ */ jsxRuntime.jsx(EventFlowTab, { events: debugData.events })
43264
43576
  },
43265
43577
  {
43266
43578
  id: "guards",
43267
- label: "Guards",
43579
+ label: t("debug.tabGuards"),
43268
43580
  badge: debugData.guards.filter((g) => !g.result).length || void 0,
43269
43581
  content: /* @__PURE__ */ jsxRuntime.jsx(GuardsPanel, { guards: debugData.guards })
43270
43582
  }
@@ -43292,15 +43604,10 @@ function RuntimeDebugger({
43292
43604
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43293
43605
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "h6", style: { fontSize: "0.75rem" }, children: [
43294
43606
  isCollapsed ? "\u25B6" : "\u25BC",
43295
- " Debugger"
43607
+ " ",
43608
+ t("debug.debugger")
43296
43609
  ] }),
43297
- failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "danger", size: "sm", children: [
43298
- failedChecks,
43299
- " failed"
43300
- ] }) : debugData.traits.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "success", size: "sm", children: [
43301
- debugData.traits.length,
43302
- " traits"
43303
- ] }) : /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "info", size: "sm", children: "Idle" })
43610
+ 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") })
43304
43611
  ] })
43305
43612
  }
43306
43613
  ),
@@ -43318,9 +43625,9 @@ function RuntimeDebugger({
43318
43625
  );
43319
43626
  }
43320
43627
  if (mode === "verify") {
43321
- const traitStates = debugData.traits.map((t) => `${t.name}:${t.currentState}`).join(" | ");
43322
- const serverEntries = verification.transitions.filter((t) => t.serverResponse);
43323
- const localEntries = verification.transitions.filter((t) => !t.serverResponse);
43628
+ const traitStates = debugData.traits.map((t2) => `${t2.name}:${t2.currentState}`).join(" | ");
43629
+ const serverEntries = verification.transitions.filter((t2) => t2.serverResponse);
43630
+ const localEntries = verification.transitions.filter((t2) => !t2.serverResponse);
43324
43631
  return /* @__PURE__ */ jsxRuntime.jsx(
43325
43632
  VerifyModePanel,
43326
43633
  {
@@ -43352,7 +43659,7 @@ function RuntimeDebugger({
43352
43659
  variant: "secondary",
43353
43660
  size: "sm",
43354
43661
  className: "runtime-debugger__toggle",
43355
- title: "Open Debugger (`)",
43662
+ title: t("debug.openDebugger"),
43356
43663
  children: failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "relative", children: [
43357
43664
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: "V" }),
43358
43665
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute -top-1 -right-2 w-2 h-2 bg-red-500 rounded-full" })
@@ -43362,11 +43669,8 @@ function RuntimeDebugger({
43362
43669
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "runtime-debugger__header", children: [
43363
43670
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43364
43671
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-lg", children: "V" }),
43365
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: "KFlow Verifier" }),
43366
- failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "danger", size: "sm", children: [
43367
- failedChecks,
43368
- " failed"
43369
- ] }) : 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" })
43672
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: t("debug.kflowVerifier") }),
43673
+ 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") })
43370
43674
  ] }),
43371
43675
  /* @__PURE__ */ jsxRuntime.jsx(
43372
43676
  Button,
@@ -43374,7 +43678,7 @@ function RuntimeDebugger({
43374
43678
  onClick: () => setIsCollapsed(true),
43375
43679
  variant: "ghost",
43376
43680
  size: "sm",
43377
- title: "Close (`)",
43681
+ title: t("debug.close"),
43378
43682
  children: "x"
43379
43683
  }
43380
43684
  )
@@ -43388,7 +43692,7 @@ function RuntimeDebugger({
43388
43692
  className: "runtime-debugger__tabs"
43389
43693
  }
43390
43694
  ) }),
43391
- /* @__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" }) })
43695
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "runtime-debugger__footer", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-foreground/50", children: t("debug.toggleHint") }) })
43392
43696
  ] })
43393
43697
  }
43394
43698
  );
@@ -43414,6 +43718,7 @@ var init_RuntimeDebugger2 = __esm({
43414
43718
  init_TransitionTimeline();
43415
43719
  init_ServerBridgeTab();
43416
43720
  init_EventDispatcherTab();
43721
+ init_useTranslate();
43417
43722
  init_RuntimeDebugger();
43418
43723
  RuntimeDebugger.displayName = "RuntimeDebugger";
43419
43724
  }
@@ -44702,7 +45007,7 @@ var init_StatCard = __esm({
44702
45007
  }
44703
45008
  );
44704
45009
  }
44705
- const label = schemaStats?.[0]?.label || labelToUse || "Stat";
45010
+ const label = schemaStats?.[0]?.label || labelToUse || t("statCard.defaultLabel");
44706
45011
  const normalizedPropValue = Array.isArray(propValue) ? propValue[0] ?? propValue.length : propValue;
44707
45012
  const value = schemaStats?.[0]?.value ?? normalizedPropValue ?? 0;
44708
45013
  const trendDirection = manualDirection || (calculatedTrend === void 0 || calculatedTrend === 0 ? "neutral" : calculatedTrend > 0 ? "up" : "down");
@@ -44745,7 +45050,7 @@ var init_StatCard = __esm({
44745
45050
  ]
44746
45051
  }
44747
45052
  ),
44748
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", as: "span", children: "vs last period" })
45053
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", as: "span", children: t("statCard.vsLastPeriod") })
44749
45054
  ] }),
44750
45055
  subtitle && !calculatedTrend && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", children: subtitle })
44751
45056
  ] }),