@almadar/ui 5.21.8 → 5.21.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2036,7 +2036,10 @@ var en_default;
2036
2036
  var init_en = __esm({
2037
2037
  "locales/en.json"() {
2038
2038
  en_default = {
2039
- $meta: { locale: "en", direction: "ltr" },
2039
+ $meta: {
2040
+ locale: "en",
2041
+ direction: "ltr"
2042
+ },
2040
2043
  "common.save": "Save",
2041
2044
  "common.cancel": "Cancel",
2042
2045
  "common.delete": "Delete",
@@ -2178,7 +2181,6 @@ var init_en = __esm({
2178
2181
  "error.somethingWentWrong": "Something went wrong",
2179
2182
  "error.loadingItems": "Loading items...",
2180
2183
  "error.noItemsFound": "No items found",
2181
- "error.notFound": "Not found",
2182
2184
  "debug.noEntityData": "No entity data",
2183
2185
  "debug.noEntities": "No entities",
2184
2186
  "debug.noTicks": "No ticks registered",
@@ -2210,7 +2212,299 @@ var init_en = __esm({
2210
2212
  "template.showcase": "Showcase",
2211
2213
  "template.faq": "Frequently Asked Questions",
2212
2214
  "template.ourTeam": "Our Team",
2213
- "template.caseStudies": "Case Studies"
2215
+ "template.caseStudies": "Case Studies",
2216
+ "richBlockEditor.toolbar.text": "Text",
2217
+ "richBlockEditor.toolbar.h1": "H1",
2218
+ "richBlockEditor.toolbar.h2": "H2",
2219
+ "richBlockEditor.toolbar.h3": "H3",
2220
+ "richBlockEditor.toolbar.bulletList": "Bullet list",
2221
+ "richBlockEditor.toolbar.numbered": "Numbered",
2222
+ "richBlockEditor.toolbar.quote": "Quote",
2223
+ "richBlockEditor.toolbar.code": "Code",
2224
+ "richBlockEditor.toolbar.divider": "Divider",
2225
+ "richBlockEditor.toolbar.image": "Image",
2226
+ "richBlockEditor.blockType.paragraph": "Text",
2227
+ "richBlockEditor.blockType.heading1": "Heading 1",
2228
+ "richBlockEditor.blockType.heading2": "Heading 2",
2229
+ "richBlockEditor.blockType.heading3": "Heading 3",
2230
+ "richBlockEditor.blockType.bulletList": "Bullet list",
2231
+ "richBlockEditor.blockType.numberedList": "Numbered list",
2232
+ "richBlockEditor.blockType.quote": "Quote",
2233
+ "richBlockEditor.blockType.code": "Code",
2234
+ "richBlockEditor.blockType.divider": "Divider",
2235
+ "richBlockEditor.blockType.image": "Image",
2236
+ "richBlockEditor.blockActions": "Block actions",
2237
+ "richBlockEditor.duplicate": "Duplicate",
2238
+ "richBlockEditor.turnInto": "Turn into",
2239
+ "richBlockEditor.placeholder.heading1": "Heading 1",
2240
+ "richBlockEditor.placeholder.heading2": "Heading 2",
2241
+ "richBlockEditor.placeholder.heading3": "Heading 3",
2242
+ "richBlockEditor.placeholder.quote": "Quote",
2243
+ "richBlockEditor.placeholder.code": "Enter code",
2244
+ "richBlockEditor.placeholder.paragraph": "Start writing...",
2245
+ "richBlockEditor.placeholder.listItem": "List item",
2246
+ "richBlockEditor.placeholder.caption": "Caption (optional)",
2247
+ "richBlockEditor.aria.heading1Block": "Heading 1 block",
2248
+ "richBlockEditor.aria.heading2Block": "Heading 2 block",
2249
+ "richBlockEditor.aria.heading3Block": "Heading 3 block",
2250
+ "richBlockEditor.aria.quoteBlock": "Quote block",
2251
+ "richBlockEditor.aria.codeBlock": "Code block",
2252
+ "richBlockEditor.aria.codeLanguage": "Code language",
2253
+ "richBlockEditor.aria.imageUrl": "Image URL",
2254
+ "richBlockEditor.aria.imageCaption": "Image caption",
2255
+ "richBlockEditor.aria.listItem": "List item",
2256
+ "richBlockEditor.aria.removeListItem": "Remove list item",
2257
+ "richBlockEditor.aria.paragraphBlock": "Paragraph block",
2258
+ "richBlockEditor.embeddedImage": "Embedded image",
2259
+ "richBlockEditor.noImageUrl": "No image URL set",
2260
+ "richBlockEditor.addItem": "Add item",
2261
+ "richBlockEditor.insertParagraphBelow": "Insert paragraph below",
2262
+ "richBlockEditor.editorToolbar": "Block editor toolbar",
2263
+ "richBlockEditor.insertEntry": "Insert {{label}}",
2264
+ "versionDiff.compare": "Compare",
2265
+ "versionDiff.to": "to",
2266
+ "versionDiff.beforeRevision": "Before revision",
2267
+ "versionDiff.afterRevision": "After revision",
2268
+ "versionDiff.switchToInline": "Switch to inline view",
2269
+ "versionDiff.switchToSideBySide": "Switch to side-by-side view",
2270
+ "versionDiff.revert": "Revert",
2271
+ "versionDiff.byAuthor": " by {{author}}",
2272
+ "violationAlert.actionType.measure": "Corrective Measure",
2273
+ "violationAlert.actionType.admin": "Administrative Action",
2274
+ "violationAlert.actionType.penalty": "Penalty Proceedings",
2275
+ "violationAlert.fallbackMessage": "Violation",
2276
+ "violationAlert.adminLabel": "Admin:",
2277
+ "violationAlert.penaltyLabel": "Penalty:",
2278
+ "violationAlert.goToField": "Go to field",
2279
+ "branchingLogic.title": "Branching logic",
2280
+ "branchingLogic.if": "If",
2281
+ "branchingLogic.goTo": "go to",
2282
+ "branchingLogic.rules": "Rules",
2283
+ "branchingLogic.logicGraph": "Logic graph",
2284
+ "branchingLogic.addRule": "Add rule",
2285
+ "branchingLogic.deleteRule": "Delete rule",
2286
+ "branchingLogic.endOfSurvey": "End of survey",
2287
+ "branchingLogic.brokenReference": "Broken reference",
2288
+ "branchingLogic.selectQuestion": "Select question",
2289
+ "branchingLogic.selectTarget": "Select target",
2290
+ "branchingLogic.selectValue": "Select value",
2291
+ "branchingLogic.addValue": "Add value",
2292
+ "branchingLogic.value": "Value",
2293
+ "branchingLogic.typeValuePressEnter": "Type value, press Enter",
2294
+ "branchingLogic.operatorEquals": "equals",
2295
+ "branchingLogic.operatorNotEquals": "does not equal",
2296
+ "branchingLogic.operatorContains": "contains",
2297
+ "branchingLogic.operatorIn": "is one of",
2298
+ "branchingLogic.graphAriaLabel": "Branching logic graph",
2299
+ "branchingLogic.ruleCountOne": "{{count}} rule",
2300
+ "branchingLogic.ruleCountOther": "{{count}} rules",
2301
+ "branchingLogic.brokenCount": "{{count}} broken",
2302
+ "branchingLogic.emptyNoQuestions": "Add questions before building branching rules.",
2303
+ "branchingLogic.emptyNoRules": "No rules yet. Add a rule to define branching logic.",
2304
+ "filterGroup.filters": "Filters",
2305
+ "filterGroup.all": "All",
2306
+ "filterGroup.clear": "Clear",
2307
+ "filterGroup.clearAll": "Clear all",
2308
+ "filterGroup.from": "From",
2309
+ "filterGroup.to": "To",
2310
+ "filterGroup.allOf": "All {{label}}",
2311
+ "filterGroup.activeCount": "{{count}} active",
2312
+ "debug.guardEvaluationsHint": "Guard evaluations will appear when transitions or ticks with guards execute",
2313
+ "debug.expression": "Expression",
2314
+ "debug.inputs": "Inputs",
2315
+ "debug.trait": "Trait",
2316
+ "debug.filterAll": "All",
2317
+ "debug.filterPassed": "Passed",
2318
+ "debug.filterFailed": "Failed",
2319
+ "debug.traitsInitHint": "Traits will appear when the state machine initializes",
2320
+ "debug.traitsMountHint": "Traits will appear when components using them are mounted",
2321
+ "debug.activeStates": "Active States",
2322
+ "debug.availableEvents": "Available Events",
2323
+ "debug.noTransitionsFromState": "No transitions from current state",
2324
+ "debug.guarded": "guarded",
2325
+ "debug.otherEvents": "Other Events (not available from current state)",
2326
+ "debug.recentTransitions": "Recent Transitions",
2327
+ "debug.transitionsCount": "{{count}} transitions",
2328
+ "debug.states": "States",
2329
+ "debug.transitions": "Transitions",
2330
+ "debug.guards": "Guards",
2331
+ "debug.debugModeHint": "Debug mode may not be enabled",
2332
+ "debug.entitiesSpawnHint": "Entities will appear when spawned",
2333
+ "debug.singleton": "Singleton",
2334
+ "debug.singletonsCount": "Singletons ({{count}})",
2335
+ "debug.runtimeCount": "Runtime ({{count}})",
2336
+ "debug.moreEntities": "+{{count}} more entities",
2337
+ "debug.persistent": "Persistent",
2338
+ "debug.loadedCount": "{{count}} loaded",
2339
+ "debug.notLoaded": "not loaded",
2340
+ "debug.eventsExecuteHint": "Events will appear as traits, ticks, and other systems execute",
2341
+ "debug.allCount": "All ({{count}})",
2342
+ "debug.autoScroll": "Auto-scroll",
2343
+ "debug.transitionsProcessHint": "Transitions will appear as the state machine processes events",
2344
+ "debug.transitionsRecorded": "{{count}} transitions recorded",
2345
+ "debug.guardLabel": "guard:",
2346
+ "debug.effectsCount": "{{count}} effects",
2347
+ "debug.bridgeInitHint": "The ServerBridge has not been initialized. Bridge health will appear once the runtime connects to the server.",
2348
+ "debug.never": "Never",
2349
+ "debug.connected": "Connected",
2350
+ "debug.disconnected": "Disconnected",
2351
+ "debug.lastError": "Last Error",
2352
+ "debug.totalEventsProcessed": "{{count}} total events processed",
2353
+ "debug.server": "server",
2354
+ "debug.clientEffectsCount": "{{count}} clientEffects",
2355
+ "debug.emitLabel": "emit:",
2356
+ "debug.rowsCount": "{{count}} rows",
2357
+ "debug.serverResponse": "server response",
2358
+ "debug.collapseVerificationTimeline": "Collapse verification timeline",
2359
+ "debug.expandVerificationTimeline": "Expand verification timeline",
2360
+ "debug.failCount": "{{count}} fail",
2361
+ "debug.ok": "OK",
2362
+ "debug.localCount": "{{count}} local",
2363
+ "debug.serverCount": "{{count}} server",
2364
+ "debug.waitingForTransitions": "Waiting for transitions...",
2365
+ "debug.tabDispatch": "Dispatch",
2366
+ "debug.tabVerify": "Verify",
2367
+ "debug.tabVerifyAlert": "Verify (!)",
2368
+ "debug.tabTimeline": "Timeline",
2369
+ "debug.tabBridge": "Bridge",
2370
+ "debug.tabTraits": "Traits",
2371
+ "debug.tabTicks": "Ticks",
2372
+ "debug.tabEntities": "Entities",
2373
+ "debug.tabEvents": "Events",
2374
+ "debug.tabGuards": "Guards",
2375
+ "debug.debugger": "Debugger",
2376
+ "debug.failedCount": "{{count}} failed",
2377
+ "debug.traitsCount": "{{count}} traits",
2378
+ "debug.idle": "Idle",
2379
+ "debug.openDebugger": "Open Debugger (`)",
2380
+ "debug.kflowVerifier": "KFlow Verifier",
2381
+ "debug.allPassing": "All passing",
2382
+ "debug.runtime": "Runtime",
2383
+ "debug.close": "Close (`)",
2384
+ "debug.toggleHint": "Press ` to toggle | window.__orbitalVerification for automation",
2385
+ "replyTree.expandReplies": "Expand replies",
2386
+ "replyTree.collapseReplies": "Collapse replies",
2387
+ "replyTree.voteOnReplyBy": "Vote on reply by {{author}}",
2388
+ "replyTree.replyTo": "Reply to {{author}}",
2389
+ "replyTree.replyToPlaceholder": "Reply to {{author}}\u2026",
2390
+ "replyTree.reply": "Reply",
2391
+ "replyTree.flagReplyBy": "Flag reply by {{author}}",
2392
+ "replyTree.flag": "Flag",
2393
+ "replyTree.send": "Send",
2394
+ "replyTree.continueThread": "Continue thread",
2395
+ "replyTree.noRepliesYet": "No replies yet.",
2396
+ "signaturePad.label": "Signature",
2397
+ "signaturePad.helperText": "Draw your signature above",
2398
+ "signaturePad.clear": "Clear",
2399
+ "signaturePad.confirm": "Confirm",
2400
+ "qrScanner.cameraUnavailable": "Camera unavailable",
2401
+ "qrScanner.paused": "Paused",
2402
+ "qrScanner.resumeScanning": "Resume scanning",
2403
+ "qrScanner.pauseScanning": "Pause scanning",
2404
+ "qrScanner.switchToFrontCamera": "Switch to front camera",
2405
+ "qrScanner.switchToRearCamera": "Switch to rear camera",
2406
+ "qrScanner.mockScan": "Mock Scan",
2407
+ "docSearch.placeholder": "Search documentation...",
2408
+ "stateMachine.loading": "Loading state machine\u2026",
2409
+ "stateMachine.noStateMachine": "No state machine to visualize",
2410
+ "avl.trigger": "Trigger",
2411
+ "avl.guard": "Guard",
2412
+ "avl.effects": "Effects",
2413
+ "avl.props": "Props",
2414
+ "avl.entity": "Entity",
2415
+ "avl.traits": "Traits",
2416
+ "avl.transition": "Transition",
2417
+ "avl.onEntity": "on {{entity}}",
2418
+ "avl.linkedTo": "linked to {{entity}}",
2419
+ "avl.pressEscToZoomOut": "Press Esc to zoom out",
2420
+ "avl.zoomIn": "Zoom in",
2421
+ "avl.zoomOut": "Zoom out",
2422
+ "avl.orbitalLabel": "Orbital: {{name}}",
2423
+ "avl.orbitalLabelHighlighted": "Orbital: {{name}} (highlighted)",
2424
+ "avl.noTraitData": "No trait data",
2425
+ "avl.computingLayout": "Computing layout...",
2426
+ "avl.noStateMachine": "No state machine",
2427
+ "avl.listensFor": "listens for {{event}}",
2428
+ "avl.emits": "emits {{event}}",
2429
+ "avl.pageLayout": "Page Layout",
2430
+ "avl.overlaySuffix": "(overlay)",
2431
+ "orbPreview.previewBadge": "Preview",
2432
+ "orbPreview.doubleClickToOpen": "Double-click to open",
2433
+ "orbPreview.dropToAddAndOpen": "Drop to add and open",
2434
+ "orbPreview.dispatching": "Coordinator is dispatching to this orbital",
2435
+ "orbPreview.noPreview": "No preview available",
2436
+ "orbPreview.screensCount": "{{count}} screens",
2437
+ "detailView.noTransitionData": "No transition data",
2438
+ "orbInspector.required": "req",
2439
+ "orbInspector.addField": "Add Field",
2440
+ "orbInspector.serviceMode": "Service Mode",
2441
+ "orbInspector.standalone": "Standalone",
2442
+ "orbInspector.embedded": "Embedded",
2443
+ "orbInspector.rendersOwnUi": "Renders its own UI",
2444
+ "orbInspector.headless": "Headless, wired to other behaviors",
2445
+ "orbInspector.addEffect": "Add Effect",
2446
+ "orbInspector.guardExpression": "Guard expression",
2447
+ "orbInspector.selectPatternForStyles": "Select a pattern to view its style tokens.",
2448
+ "orbInspector.tokens": "Tokens",
2449
+ "orbInspector.noTokenContract": "No token contract declared for this pattern.",
2450
+ "orbInspector.variant": "Variant",
2451
+ "orbInspector.size": "Size",
2452
+ "orbInspector.statesCount": "{{count}} states",
2453
+ "orbInspector.onEntity": " on {{entity}}",
2454
+ "orbInspector.projectThemeTokens": "Project theme tokens",
2455
+ "orbInspector.tokenGroup.colors": "Colors",
2456
+ "orbInspector.tokenGroup.radii": "Radii",
2457
+ "orbInspector.tokenGroup.spacing": "Spacing",
2458
+ "orbInspector.tokenGroup.shadows": "Shadows",
2459
+ "orbInspector.tab.inspector": "Inspector",
2460
+ "orbInspector.tab.styles": "Styles",
2461
+ "orbInspector.tab.code": "Code",
2462
+ "canvas.goBackToOverview": "Go back to overview",
2463
+ "canvas.overview": "Overview",
2464
+ "canvas.expanded": "Expanded",
2465
+ "canvas.modulesCount": "{{count}} modules",
2466
+ "canvas.screensCount": "{{count}} screens",
2467
+ "canvas.switchToView": "Switch to {{label}} view",
2468
+ "lawReference.viewFullText": "View full law text",
2469
+ "statCard.defaultLabel": "Stat",
2470
+ "statCard.vsLastPeriod": "vs last period",
2471
+ "mediaGallery.upload": "Upload",
2472
+ "mediaGallery.noMediaDescription": "No media items to display.",
2473
+ "pagination.jumpPlaceholder": "Page",
2474
+ "table.selectRow": "Select row {{id}}",
2475
+ "card.selectItem": "Select {{item}}",
2476
+ "card.itemFallback": "item",
2477
+ "fileTree.noFiles": "No files",
2478
+ "masterDetail.selectItem": "Select an item to view details",
2479
+ "empty.createFirst": "Create your first item to get started.",
2480
+ "upload.dropOrBrowse": "Drop files here or click to browse",
2481
+ "upload.dropFilesHere": "Drop files here",
2482
+ "upload.accepted": "Accepted: {{accept}}",
2483
+ "upload.maxSize": "Max size: {{size}}",
2484
+ "upload.maxFiles": "Up to {{count}} files",
2485
+ "upload.error.maxFiles": "Maximum {{count}} files allowed",
2486
+ "upload.error.invalidType": "Invalid file type: {{name}}",
2487
+ "upload.error.tooLarge": "File too large: {{name}} (max {{size}})",
2488
+ "optionConstraint.requiredOne": "Required, pick 1",
2489
+ "optionConstraint.optionalOne": "Optional, pick up to 1",
2490
+ "optionConstraint.pickExactly": "Pick exactly {{count}}",
2491
+ "optionConstraint.pickRange": "Pick {{min}}-{{max}}",
2492
+ "optionConstraint.pickAtLeast": "Pick at least {{count}}",
2493
+ "optionConstraint.pickUpTo": "Pick up to {{count}}",
2494
+ "optionConstraint.optional": "Optional",
2495
+ "optionConstraint.outOfStock": "Out of stock",
2496
+ "optionConstraint.error.pickOne": "Pick 1 option",
2497
+ "optionConstraint.error.pickOnlyOne": "Pick only 1 option",
2498
+ "optionConstraint.error.pickMore": "Pick at least {{count}} more",
2499
+ "optionConstraint.error.removeOptions": "Remove {{count}} options",
2500
+ "stateMachine.pinned": "Pinned",
2501
+ "stateMachine.eventCount": "{{count}} events",
2502
+ "stateMachine.externalEffects": "External Effects",
2503
+ "stateMachine.legend.initial": "Initial",
2504
+ "stateMachine.legend.final": "Final",
2505
+ "stateMachine.legend.state": "State",
2506
+ "stateMachine.legend.multiEvent": "Multi-event",
2507
+ "relationSelect.selectPlaceholder": "Select..."
2214
2508
  };
2215
2509
  }
2216
2510
  });
@@ -4672,6 +4966,7 @@ var init_LawReferenceTooltip = __esm({
4672
4966
  init_Typography();
4673
4967
  init_Divider();
4674
4968
  init_cn();
4969
+ init_useTranslate();
4675
4970
  positionStyles2 = {
4676
4971
  top: "bottom-full left-1/2 -translate-x-1/2 mb-2",
4677
4972
  bottom: "top-full left-1/2 -translate-x-1/2 mt-2",
@@ -4690,6 +4985,7 @@ var init_LawReferenceTooltip = __esm({
4690
4985
  position = "top",
4691
4986
  className
4692
4987
  }) => {
4988
+ const { t } = useTranslate();
4693
4989
  const [isVisible, setIsVisible] = React79__default.useState(false);
4694
4990
  const timeoutRef = React79__default.useRef(null);
4695
4991
  const handleMouseEnter = () => {
@@ -4773,7 +5069,7 @@ var init_LawReferenceTooltip = __esm({
4773
5069
  target: "_blank",
4774
5070
  rel: "noopener noreferrer",
4775
5071
  onClick: (e) => e.stopPropagation(),
4776
- children: "View full law text"
5072
+ children: t("lawReference.viewFullText")
4777
5073
  }
4778
5074
  )
4779
5075
  ] }),
@@ -12083,6 +12379,7 @@ var log4, SWIM_GUTTER, CENTER_W, BehaviorView;
12083
12379
  var init_BehaviorView = __esm({
12084
12380
  "components/avl/molecules/BehaviorView.tsx"() {
12085
12381
  "use client";
12382
+ init_useTranslate();
12086
12383
  init_AvlState();
12087
12384
  init_AvlTransitionLane();
12088
12385
  init_AvlSwimLane();
@@ -12092,6 +12389,7 @@ var init_BehaviorView = __esm({
12092
12389
  SWIM_GUTTER = 120;
12093
12390
  CENTER_W = 360;
12094
12391
  BehaviorView = ({ data }) => {
12392
+ const { t } = useTranslate();
12095
12393
  const [layout, setLayout] = useState(null);
12096
12394
  const traitName = data.traits[0]?.name;
12097
12395
  const traitData = traitName ? data.traitDetails[traitName] : void 0;
@@ -12101,10 +12399,10 @@ var init_BehaviorView = __esm({
12101
12399
  computeTraitLayout(traitData).then(setLayout).catch((err) => log4.error("compute-trait-layout-failed", { error: err instanceof Error ? err : String(err) }));
12102
12400
  }, [dataKey]);
12103
12401
  if (!traitData) {
12104
- return /* @__PURE__ */ jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: "No trait data" });
12402
+ return /* @__PURE__ */ jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: t("avl.noTraitData") });
12105
12403
  }
12106
12404
  if (!layout) {
12107
- return /* @__PURE__ */ jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: "Computing layout..." });
12405
+ return /* @__PURE__ */ jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: t("avl.computingLayout") });
12108
12406
  }
12109
12407
  const hasExternal = traitData.listenedEvents.length > 0 || traitData.emittedEvents.length > 0;
12110
12408
  const viewW = hasExternal ? SWIM_GUTTER + CENTER_W + SWIM_GUTTER : CENTER_W + 60;
@@ -12120,10 +12418,7 @@ var init_BehaviorView = __esm({
12120
12418
  const machineHeight = scaledH + 100;
12121
12419
  const renderMachine = /* @__PURE__ */ jsxs("g", { children: [
12122
12420
  /* @__PURE__ */ jsx("text", { x: CENTER_W / 2, y: 20, textAnchor: "middle", fill: "var(--color-foreground)", fontSize: 18, fontWeight: "700", fontFamily: "inherit", children: traitData.name }),
12123
- /* @__PURE__ */ jsxs("text", { x: CENTER_W / 2, y: 36, textAnchor: "middle", fill: "var(--color-muted-foreground)", fontSize: 11, opacity: 0.5, fontFamily: "inherit", children: [
12124
- "on ",
12125
- traitData.linkedEntity
12126
- ] }),
12421
+ /* @__PURE__ */ jsx("text", { x: CENTER_W / 2, y: 36, textAnchor: "middle", fill: "var(--color-muted-foreground)", fontSize: 11, opacity: 0.5, fontFamily: "inherit", children: t("avl.onEntity", { entity: traitData.linkedEntity }) }),
12127
12422
  /* @__PURE__ */ jsxs("defs", { children: [
12128
12423
  /* @__PURE__ */ jsx("marker", { id: "bvArrow", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: CONNECTION_COLORS.forward.color, opacity: 0.7 }) }),
12129
12424
  /* @__PURE__ */ jsx("marker", { id: "bvArrowBack", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: CONNECTION_COLORS.backward.color, opacity: 0.5 }) })
@@ -12431,7 +12726,7 @@ var init_CodeBlock = __esm({
12431
12726
  const isLolo = language === "lolo";
12432
12727
  const activeStyle = isOrb ? orbStyle : isLolo ? loloStyle : dark;
12433
12728
  const eventBus = useEventBus();
12434
- const { t: _t } = useTranslate();
12729
+ const { t } = useTranslate();
12435
12730
  const scrollRef = useRef(null);
12436
12731
  const codeRef = useRef(null);
12437
12732
  const savedScrollLeftRef = useRef(0);
@@ -12686,7 +12981,7 @@ var init_CodeBlock = __esm({
12686
12981
  size: "sm",
12687
12982
  onClick: handleCopy,
12688
12983
  className: "opacity-0 group-hover:opacity-100 focus:opacity-100 transition-opacity text-muted-foreground hover:text-white",
12689
- "aria-label": "Copy code",
12984
+ "aria-label": t("common.copy"),
12690
12985
  children: copied ? /* @__PURE__ */ jsx(Icon, { name: "check", className: "w-4 h-4 text-green-400" }) : /* @__PURE__ */ jsx(Icon, { name: "copy", className: "w-4 h-4" })
12691
12986
  }
12692
12987
  )
@@ -13341,7 +13636,7 @@ var init_StateMachineView = __esm({
13341
13636
  const endX2 = fromState.x + Math.cos(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
13342
13637
  const endY2 = fromState.y + Math.sin(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
13343
13638
  const isSingle2 = bundle.labels.length === 1;
13344
- const labelText2 = isSingle2 ? bundle.labels[0].event : `${bundle.labels.length} events`;
13639
+ const labelText2 = isSingle2 ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
13345
13640
  const bundleColor2 = isSingle2 ? config.colors.arrow : "var(--color-accent)";
13346
13641
  const labelWidth2 = labelText2.length * 9 + (isSingle2 ? 24 : 40);
13347
13642
  const cx = fromState.x;
@@ -13467,7 +13762,7 @@ var init_StateMachineView = __esm({
13467
13762
  const controlX = midX + perpX;
13468
13763
  const controlY = midY + perpY;
13469
13764
  const isSingle = bundle.labels.length === 1;
13470
- const labelText = isSingle ? bundle.labels[0].event : `${bundle.labels.length} events`;
13765
+ const labelText = isSingle ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
13471
13766
  const labelWidth = labelText.length * 9 + (isSingle ? 24 : 40);
13472
13767
  const bundleColor = isSingle ? config.colors.arrow : "var(--color-accent)";
13473
13768
  const curveMidpoint = {
@@ -13622,7 +13917,7 @@ var init_StateMachineView = __esm({
13622
13917
  {
13623
13918
  className: "absolute -top-2 left-1/2 transform -translate-x-1/2 px-2 py-0.5 rounded-full",
13624
13919
  style: { backgroundColor: "var(--color-success)" },
13625
- children: /* @__PURE__ */ jsx(Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: "Pinned" })
13920
+ children: /* @__PURE__ */ jsx(Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: t("stateMachine.pinned") })
13626
13921
  }
13627
13922
  ),
13628
13923
  !isSingle && /* @__PURE__ */ jsxs(
@@ -13644,10 +13939,7 @@ var init_StateMachineView = __esm({
13644
13939
  {
13645
13940
  className: "ml-2 px-2 py-0.5 rounded-full",
13646
13941
  style: { backgroundColor: "var(--color-accent)" },
13647
- children: /* @__PURE__ */ jsxs(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: [
13648
- bundle.labels.length,
13649
- " events"
13650
- ] })
13942
+ children: /* @__PURE__ */ jsx(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: t("stateMachine.eventCount", { count: bundle.labels.length }) })
13651
13943
  }
13652
13944
  )
13653
13945
  ]
@@ -13792,7 +14084,7 @@ var init_StateMachineView = __esm({
13792
14084
  align: "center",
13793
14085
  className: "mb-2",
13794
14086
  style: { color: "var(--color-warning)", fontSize: "13px" },
13795
- children: "External Effects"
14087
+ children: t("stateMachine.externalEffects")
13796
14088
  }
13797
14089
  ),
13798
14090
  outputs.outputs.map((output, idx) => /* @__PURE__ */ jsx(
@@ -13812,10 +14104,10 @@ var init_StateMachineView = __esm({
13812
14104
  Legend = ({ config, y }) => {
13813
14105
  const { t } = useTranslate();
13814
14106
  const items = [
13815
- { label: "Initial", color: config.colors.initialNode },
13816
- { label: "Final", color: config.colors.finalNode },
13817
- { label: "State", color: config.colors.nodeBorder },
13818
- { label: "Multi-event", color: "var(--color-accent)" }
14107
+ { key: "initial", label: t("stateMachine.legend.initial"), color: config.colors.initialNode, isMultiEvent: false },
14108
+ { key: "final", label: t("stateMachine.legend.final"), color: config.colors.finalNode, isMultiEvent: false },
14109
+ { key: "state", label: t("stateMachine.legend.state"), color: config.colors.nodeBorder, isMultiEvent: false },
14110
+ { key: "multiEvent", label: t("stateMachine.legend.multiEvent"), color: "var(--color-accent)", isMultiEvent: true }
13819
14111
  ];
13820
14112
  return /* @__PURE__ */ jsx(
13821
14113
  HStack,
@@ -13830,8 +14122,8 @@ var init_StateMachineView = __esm({
13830
14122
  {
13831
14123
  className: "w-3 h-3 rounded-full",
13832
14124
  style: {
13833
- backgroundColor: item.label === "Multi-event" ? item.color : config.colors.node,
13834
- border: item.label !== "Multi-event" ? `2px solid ${item.color}` : "none"
14125
+ backgroundColor: item.isMultiEvent ? item.color : config.colors.node,
14126
+ border: !item.isMultiEvent ? `2px solid ${item.color}` : "none"
13835
14127
  }
13836
14128
  }
13837
14129
  ),
@@ -13843,7 +14135,7 @@ var init_StateMachineView = __esm({
13843
14135
  children: item.label
13844
14136
  }
13845
14137
  )
13846
- ] }, item.label))
14138
+ ] }, item.key))
13847
14139
  }
13848
14140
  );
13849
14141
  };
@@ -14637,13 +14929,13 @@ var init_JazariStateMachine = __esm({
14637
14929
  );
14638
14930
  }, [resolvedTrait, entityFields]);
14639
14931
  if (isLoading) {
14640
- return /* @__PURE__ */ jsx(LoadingState, { message: "Loading state machine\u2026" });
14932
+ return /* @__PURE__ */ jsx(LoadingState, { message: t("stateMachine.loading") });
14641
14933
  }
14642
14934
  if (error) {
14643
14935
  return /* @__PURE__ */ jsx(ErrorState, { message: error instanceof Error ? error.message : String(error) });
14644
14936
  }
14645
14937
  if (!resolvedTrait || !layoutData || layoutData.states.length === 0) {
14646
- return /* @__PURE__ */ jsx(Box, { padding: "lg", className: cn("text-center", className), children: /* @__PURE__ */ jsx(Typography, { variant: "body", className: "opacity-60", children: "No state machine to visualize" }) });
14938
+ return /* @__PURE__ */ jsx(Box, { padding: "lg", className: cn("text-center", className), children: /* @__PURE__ */ jsx(Typography, { variant: "body", className: "opacity-60", children: t("stateMachine.noStateMachine") }) });
14647
14939
  }
14648
14940
  return /* @__PURE__ */ jsx(
14649
14941
  StateMachineView,
@@ -15687,13 +15979,13 @@ var init_LayoutPatterns = __esm({
15687
15979
  function generateRuleId() {
15688
15980
  return `rule-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
15689
15981
  }
15690
- function questionsToOptions(questions, includeEndOfSurvey) {
15982
+ function questionsToOptions(questions, endOfSurveyLabel) {
15691
15983
  const opts = questions.map((q) => ({
15692
15984
  value: q.id,
15693
15985
  label: q.label
15694
15986
  }));
15695
- if (includeEndOfSurvey) {
15696
- opts.push({ value: END_OF_SURVEY, label: "End of survey" });
15987
+ if (endOfSurveyLabel !== null) {
15988
+ opts.push({ value: END_OF_SURVEY, label: endOfSurveyLabel });
15697
15989
  }
15698
15990
  return opts;
15699
15991
  }
@@ -15702,7 +15994,7 @@ function isRuleBroken(rule, questions) {
15702
15994
  const targetExists = rule.targetQuestionId === END_OF_SURVEY || questions.some((q) => q.id === rule.targetQuestionId);
15703
15995
  return !sourceExists || !targetExists;
15704
15996
  }
15705
- var END_OF_SURVEY, OPERATOR_OPTIONS, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph, BranchingLogicBuilder;
15997
+ var END_OF_SURVEY, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph, BranchingLogicBuilder;
15706
15998
  var init_BranchingLogicBuilder = __esm({
15707
15999
  "components/core/molecules/BranchingLogicBuilder.tsx"() {
15708
16000
  "use client";
@@ -15715,14 +16007,9 @@ var init_BranchingLogicBuilder = __esm({
15715
16007
  init_FilterPill();
15716
16008
  init_Box();
15717
16009
  init_useEventBus();
16010
+ init_useTranslate();
15718
16011
  init_cn();
15719
16012
  END_OF_SURVEY = "end-of-survey";
15720
- OPERATOR_OPTIONS = [
15721
- { value: "equals", label: "equals" },
15722
- { value: "not-equals", label: "does not equal" },
15723
- { value: "contains", label: "contains" },
15724
- { value: "in", label: "is one of" }
15725
- ];
15726
16013
  RuleRow = ({
15727
16014
  rule,
15728
16015
  questions,
@@ -15731,8 +16018,21 @@ var init_BranchingLogicBuilder = __esm({
15731
16018
  onChange,
15732
16019
  onDelete
15733
16020
  }) => {
15734
- const sourceOptions = useMemo(() => questionsToOptions(questions, false), [questions]);
15735
- const targetOptions = useMemo(() => questionsToOptions(questions, true), [questions]);
16021
+ const { t } = useTranslate();
16022
+ const operatorOptions = useMemo(
16023
+ () => [
16024
+ { value: "equals", label: t("branchingLogic.operatorEquals") },
16025
+ { value: "not-equals", label: t("branchingLogic.operatorNotEquals") },
16026
+ { value: "contains", label: t("branchingLogic.operatorContains") },
16027
+ { value: "in", label: t("branchingLogic.operatorIn") }
16028
+ ],
16029
+ [t]
16030
+ );
16031
+ const sourceOptions = useMemo(() => questionsToOptions(questions, null), [questions]);
16032
+ const targetOptions = useMemo(
16033
+ () => questionsToOptions(questions, t("branchingLogic.endOfSurvey")),
16034
+ [questions, t]
16035
+ );
15736
16036
  const sourceQuestion = questions.find((q) => q.id === rule.sourceQuestionId);
15737
16037
  const valueOptions = useMemo(() => {
15738
16038
  if (!sourceQuestion?.optionValues) return [];
@@ -15777,22 +16077,22 @@ var init_BranchingLogicBuilder = __esm({
15777
16077
  ),
15778
16078
  children: [
15779
16079
  /* @__PURE__ */ jsxs(Box, { className: "flex flex-wrap items-center gap-2", children: [
15780
- /* @__PURE__ */ jsx(Typography, { variant: "label", weight: "semibold", className: "shrink-0", children: "If" }),
16080
+ /* @__PURE__ */ jsx(Typography, { variant: "label", weight: "semibold", className: "shrink-0", children: t("branchingLogic.if") }),
15781
16081
  /* @__PURE__ */ jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsx(
15782
16082
  Select,
15783
16083
  {
15784
16084
  options: sourceOptions,
15785
16085
  value: rule.sourceQuestionId,
15786
- placeholder: "Select question",
16086
+ placeholder: t("branchingLogic.selectQuestion"),
15787
16087
  onChange: handleSource,
15788
16088
  disabled: readOnly,
15789
- error: broken ? "Broken reference" : void 0
16089
+ error: broken ? t("branchingLogic.brokenReference") : void 0
15790
16090
  }
15791
16091
  ) }),
15792
16092
  /* @__PURE__ */ jsx(Box, { className: "min-w-[8rem] basis-32", children: /* @__PURE__ */ jsx(
15793
16093
  Select,
15794
16094
  {
15795
- options: OPERATOR_OPTIONS,
16095
+ options: operatorOptions,
15796
16096
  value: rule.operator,
15797
16097
  onChange: handleOperator,
15798
16098
  disabled: readOnly
@@ -15815,7 +16115,7 @@ var init_BranchingLogicBuilder = __esm({
15815
16115
  {
15816
16116
  options: valueOptions.filter((o) => !chips.includes(o.value)),
15817
16117
  value: "",
15818
- placeholder: "Add value",
16118
+ placeholder: t("branchingLogic.addValue"),
15819
16119
  onChange: handleAddChip,
15820
16120
  disabled: readOnly
15821
16121
  }
@@ -15823,7 +16123,7 @@ var init_BranchingLogicBuilder = __esm({
15823
16123
  Input,
15824
16124
  {
15825
16125
  inputType: "text",
15826
- placeholder: "Type value, press Enter",
16126
+ placeholder: t("branchingLogic.typeValuePressEnter"),
15827
16127
  value: "",
15828
16128
  onKeyDown: (e) => {
15829
16129
  if (e.key !== "Enter") return;
@@ -15841,7 +16141,7 @@ var init_BranchingLogicBuilder = __esm({
15841
16141
  {
15842
16142
  options: valueOptions,
15843
16143
  value: scalarValue,
15844
- placeholder: "Select value",
16144
+ placeholder: t("branchingLogic.selectValue"),
15845
16145
  onChange: (e) => onChange({ ...rule, value: e.target.value }),
15846
16146
  disabled: readOnly
15847
16147
  }
@@ -15849,7 +16149,7 @@ var init_BranchingLogicBuilder = __esm({
15849
16149
  Input,
15850
16150
  {
15851
16151
  inputType: "text",
15852
- placeholder: "Value",
16152
+ placeholder: t("branchingLogic.value"),
15853
16153
  value: scalarValue,
15854
16154
  onChange: handleScalarValue,
15855
16155
  disabled: readOnly
@@ -15857,17 +16157,17 @@ var init_BranchingLogicBuilder = __esm({
15857
16157
  ) }),
15858
16158
  /* @__PURE__ */ jsxs(Typography, { variant: "label", weight: "semibold", className: "shrink-0 inline-flex items-center gap-1", children: [
15859
16159
  /* @__PURE__ */ jsx(ArrowRight, { className: "h-4 w-4" }),
15860
- "go to"
16160
+ t("branchingLogic.goTo")
15861
16161
  ] }),
15862
16162
  /* @__PURE__ */ jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsx(
15863
16163
  Select,
15864
16164
  {
15865
16165
  options: targetOptions,
15866
16166
  value: rule.targetQuestionId,
15867
- placeholder: "Select target",
16167
+ placeholder: t("branchingLogic.selectTarget"),
15868
16168
  onChange: handleTarget,
15869
16169
  disabled: readOnly,
15870
- error: broken && rule.targetQuestionId !== END_OF_SURVEY ? "Broken reference" : void 0
16170
+ error: broken && rule.targetQuestionId !== END_OF_SURVEY ? t("branchingLogic.brokenReference") : void 0
15871
16171
  }
15872
16172
  ) }),
15873
16173
  !readOnly && /* @__PURE__ */ jsx(
@@ -15879,11 +16179,11 @@ var init_BranchingLogicBuilder = __esm({
15879
16179
  action: "DELETE_RULE",
15880
16180
  actionPayload: { ruleId: rule.id },
15881
16181
  onClick: onDelete,
15882
- "aria-label": "Delete rule"
16182
+ "aria-label": t("branchingLogic.deleteRule")
15883
16183
  }
15884
16184
  )
15885
16185
  ] }),
15886
- broken && /* @__PURE__ */ jsx(Badge, { variant: "error", size: "sm", label: "Broken reference" })
16186
+ broken && /* @__PURE__ */ jsx(Badge, { variant: "error", size: "sm", label: t("branchingLogic.brokenReference") })
15887
16187
  ]
15888
16188
  }
15889
16189
  );
@@ -15893,10 +16193,12 @@ var init_BranchingLogicBuilder = __esm({
15893
16193
  NODE_GAP_Y = 80;
15894
16194
  PADDING = 32;
15895
16195
  LogicGraph = ({ questions, rules }) => {
16196
+ const { t } = useTranslate();
16197
+ const endOfSurveyLabel = t("branchingLogic.endOfSurvey");
15896
16198
  const layout = useMemo(() => {
15897
16199
  const items = [
15898
16200
  ...questions.map((q) => ({ id: q.id, label: q.label, isEnd: false })),
15899
- { id: END_OF_SURVEY, label: "End of survey", isEnd: true }
16201
+ { id: END_OF_SURVEY, label: endOfSurveyLabel, isEnd: true }
15900
16202
  ];
15901
16203
  const positions = {};
15902
16204
  items.forEach((item, i) => {
@@ -15908,14 +16210,14 @@ var init_BranchingLogicBuilder = __esm({
15908
16210
  const width = NODE_WIDTH + PADDING * 2 + 220;
15909
16211
  const height = PADDING * 2 + items.length * (NODE_HEIGHT + NODE_GAP_Y);
15910
16212
  return { items, positions, width, height };
15911
- }, [questions]);
16213
+ }, [questions, endOfSurveyLabel]);
15912
16214
  return /* @__PURE__ */ jsx(Box, { className: "overflow-auto rounded-container border border-border bg-card p-2", children: /* @__PURE__ */ jsxs(
15913
16215
  "svg",
15914
16216
  {
15915
16217
  width: layout.width,
15916
16218
  height: layout.height,
15917
16219
  role: "img",
15918
- "aria-label": "Branching logic graph",
16220
+ "aria-label": t("branchingLogic.graphAriaLabel"),
15919
16221
  style: { display: "block" },
15920
16222
  children: [
15921
16223
  /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx(
@@ -16023,6 +16325,7 @@ var init_BranchingLogicBuilder = __esm({
16023
16325
  readOnly = false,
16024
16326
  className
16025
16327
  }) => {
16328
+ const { t } = useTranslate();
16026
16329
  const eventBus = useEventBus();
16027
16330
  const questions = Array.isArray(questionsProp) ? questionsProp : [];
16028
16331
  const rulesInitial = Array.isArray(rulesProp) ? rulesProp : [];
@@ -16075,16 +16378,23 @@ var init_BranchingLogicBuilder = __esm({
16075
16378
  /* @__PURE__ */ jsxs(Box, { className: "flex flex-wrap items-center justify-between gap-2", children: [
16076
16379
  /* @__PURE__ */ jsxs(Box, { className: "flex items-center gap-2", children: [
16077
16380
  /* @__PURE__ */ jsx(GitBranch, { className: "h-5 w-5 text-foreground" }),
16078
- /* @__PURE__ */ jsx(Typography, { variant: "subheading", weight: "semibold", children: "Branching logic" }),
16381
+ /* @__PURE__ */ jsx(Typography, { variant: "subheading", weight: "semibold", children: t("branchingLogic.title") }),
16079
16382
  /* @__PURE__ */ jsx(
16080
16383
  Badge,
16081
16384
  {
16082
16385
  variant: "neutral",
16083
16386
  size: "sm",
16084
- label: `${rules.length} rule${rules.length === 1 ? "" : "s"}`
16387
+ label: rules.length === 1 ? t("branchingLogic.ruleCountOne", { count: rules.length }) : t("branchingLogic.ruleCountOther", { count: rules.length })
16085
16388
  }
16086
16389
  ),
16087
- brokenCount > 0 && /* @__PURE__ */ jsx(Badge, { variant: "error", size: "sm", label: `${brokenCount} broken` })
16390
+ brokenCount > 0 && /* @__PURE__ */ jsx(
16391
+ Badge,
16392
+ {
16393
+ variant: "error",
16394
+ size: "sm",
16395
+ label: t("branchingLogic.brokenCount", { count: brokenCount })
16396
+ }
16397
+ )
16088
16398
  ] }),
16089
16399
  /* @__PURE__ */ jsxs(Box, { className: "flex items-center gap-1 rounded-sm border border-border bg-card p-0.5", children: [
16090
16400
  /* @__PURE__ */ jsx(
@@ -16095,7 +16405,7 @@ var init_BranchingLogicBuilder = __esm({
16095
16405
  leftIcon: Pencil,
16096
16406
  action: "VIEW_EDIT",
16097
16407
  onClick: () => setView("edit"),
16098
- children: "Rules"
16408
+ children: t("branchingLogic.rules")
16099
16409
  }
16100
16410
  ),
16101
16411
  /* @__PURE__ */ jsx(
@@ -16106,13 +16416,13 @@ var init_BranchingLogicBuilder = __esm({
16106
16416
  leftIcon: Eye,
16107
16417
  action: "VIEW_GRAPH",
16108
16418
  onClick: () => setView("graph"),
16109
- children: "Logic graph"
16419
+ children: t("branchingLogic.logicGraph")
16110
16420
  }
16111
16421
  )
16112
16422
  ] })
16113
16423
  ] }),
16114
16424
  view === "edit" ? /* @__PURE__ */ jsxs(Box, { className: "flex flex-col gap-2", children: [
16115
- rules.length === 0 ? /* @__PURE__ */ jsx(Card, { variant: "bordered", padding: "lg", className: "text-center", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "muted", children: noQuestions ? "Add questions before building branching rules." : "No rules yet. Add a rule to define branching logic." }) }) : rules.map((rule) => /* @__PURE__ */ jsx(
16425
+ rules.length === 0 ? /* @__PURE__ */ jsx(Card, { variant: "bordered", padding: "lg", className: "text-center", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "muted", children: noQuestions ? t("branchingLogic.emptyNoQuestions") : t("branchingLogic.emptyNoRules") }) }) : rules.map((rule) => /* @__PURE__ */ jsx(
16116
16426
  RuleRow,
16117
16427
  {
16118
16428
  rule,
@@ -16133,7 +16443,7 @@ var init_BranchingLogicBuilder = __esm({
16133
16443
  action: "ADD_RULE",
16134
16444
  onClick: handleAddRule,
16135
16445
  disabled: noQuestions,
16136
- children: "Add rule"
16446
+ children: t("branchingLogic.addRule")
16137
16447
  }
16138
16448
  ) })
16139
16449
  ] }) : /* @__PURE__ */ jsx(LogicGraph, { questions, rules })
@@ -16760,7 +17070,7 @@ function CalendarGrid({
16760
17070
  onClick: stepPrev,
16761
17071
  "aria-disabled": !canPrev || void 0,
16762
17072
  "aria-label": t("aria.previousDays"),
16763
- children: "Prev"
17073
+ children: t("nav.previous")
16764
17074
  }
16765
17075
  ),
16766
17076
  /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground", children: formatDateRange(visibleDays[0], visibleDays[visibleDays.length - 1]) }),
@@ -16773,7 +17083,7 @@ function CalendarGrid({
16773
17083
  onClick: stepNext,
16774
17084
  "aria-disabled": !canNext || void 0,
16775
17085
  "aria-label": t("aria.nextDays"),
16776
- children: "Next"
17086
+ children: t("nav.next")
16777
17087
  }
16778
17088
  )
16779
17089
  ] }),
@@ -18323,7 +18633,7 @@ var init_Pagination = __esm({
18323
18633
  type: "number",
18324
18634
  value: jumpToPage,
18325
18635
  onChange: (e) => setJumpToPage(e.target.value),
18326
- placeholder: "Page",
18636
+ placeholder: t("pagination.jumpPlaceholder"),
18327
18637
  className: "w-20",
18328
18638
  onKeyDown: (e) => {
18329
18639
  if (e.key === "Enter") {
@@ -18461,13 +18771,10 @@ var init_CardGrid = __esm({
18461
18771
  return children;
18462
18772
  }
18463
18773
  if (isLoading) {
18464
- return /* @__PURE__ */ jsx(Box, { className: "col-span-full text-center py-8 text-muted-foreground", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "secondary", children: "Loading items..." }) });
18774
+ return /* @__PURE__ */ jsx(Box, { className: "col-span-full text-center py-8 text-muted-foreground", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "secondary", children: t("loading.items") }) });
18465
18775
  }
18466
18776
  if (error) {
18467
- return /* @__PURE__ */ jsx(Box, { className: "col-span-full text-center py-8 text-error", children: /* @__PURE__ */ jsxs(Typography, { variant: "body", color: "error", children: [
18468
- "Error loading items: ",
18469
- error.message
18470
- ] }) });
18777
+ return /* @__PURE__ */ jsx(Box, { className: "col-span-full text-center py-8 text-error", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "error", children: t("error.loadFailed", { message: error.message }) }) });
18471
18778
  }
18472
18779
  if (normalizedData.length === 0) {
18473
18780
  return /* @__PURE__ */ jsx(Box, { className: "col-span-full text-center py-12 text-muted-foreground", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "secondary", children: t("empty.noItems") || "No items found" }) });
@@ -22564,7 +22871,7 @@ function DataGrid({
22564
22871
  onChange: () => toggleSelection(id),
22565
22872
  onClick: (e) => e.stopPropagation(),
22566
22873
  className: "w-4 h-4 mt-1 flex-shrink-0 accent-primary",
22567
- "aria-label": `Select ${titleValue !== void 0 ? String(titleValue) : "item"}`
22874
+ "aria-label": t("card.selectItem", { item: titleValue !== void 0 ? String(titleValue) : t("card.itemFallback") })
22568
22875
  }
22569
22876
  ),
22570
22877
  /* @__PURE__ */ jsxs(VStack, { gap: "xs", className: "flex-1 min-w-0", children: [
@@ -22762,7 +23069,7 @@ function formatDate3(value) {
22762
23069
  if (isNaN(d.getTime())) return String(value);
22763
23070
  return d.toLocaleDateString(void 0, { year: "numeric", month: "short", day: "numeric" });
22764
23071
  }
22765
- function formatValue2(value, format) {
23072
+ function formatValue2(value, format, boolLabels) {
22766
23073
  if (value === void 0 || value === null) return "";
22767
23074
  switch (format) {
22768
23075
  case "date":
@@ -22774,7 +23081,7 @@ function formatValue2(value, format) {
22774
23081
  case "percent":
22775
23082
  return typeof value === "number" ? `${Math.round(value)}%` : String(value);
22776
23083
  case "boolean":
22777
- return value ? "Yes" : "No";
23084
+ return value ? boolLabels?.yes ?? "Yes" : boolLabels?.no ?? "No";
22778
23085
  default:
22779
23086
  return String(value);
22780
23087
  }
@@ -23070,7 +23377,7 @@ function DataList({
23070
23377
  field.label ?? fieldLabel3(field.name),
23071
23378
  ":"
23072
23379
  ] }),
23073
- /* @__PURE__ */ jsx(Typography, { variant: "small", children: formatValue2(value, field.format) })
23380
+ /* @__PURE__ */ jsx(Typography, { variant: "small", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
23074
23381
  ] }, field.name);
23075
23382
  }) }),
23076
23383
  progressFields.map((field) => {
@@ -23200,6 +23507,7 @@ var init_FileTree = __esm({
23200
23507
  init_Box();
23201
23508
  init_Typography();
23202
23509
  init_Icon();
23510
+ init_useTranslate();
23203
23511
  TreeNodeItem = ({
23204
23512
  node,
23205
23513
  depth,
@@ -23285,8 +23593,9 @@ var init_FileTree = __esm({
23285
23593
  className,
23286
23594
  indent = 16
23287
23595
  }) => {
23596
+ const { t } = useTranslate();
23288
23597
  if (tree.length === 0) {
23289
- return /* @__PURE__ */ jsx(Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: "No files" }) });
23598
+ return /* @__PURE__ */ jsx(Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: t("fileTree.noFiles") }) });
23290
23599
  }
23291
23600
  return /* @__PURE__ */ jsx(Box, { className: `py-1 overflow-y-auto ${className ?? ""}`, role: "tree", children: tree.map((node) => /* @__PURE__ */ jsx(
23292
23601
  TreeNodeItem,
@@ -23413,6 +23722,7 @@ var init_FilterGroup = __esm({
23413
23722
  init_Icon();
23414
23723
  init_useEventBus();
23415
23724
  init_useQuerySingleton();
23725
+ init_useTranslate();
23416
23726
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
23417
23727
  lookStyles6 = {
23418
23728
  toolbar: "",
@@ -23433,6 +23743,7 @@ var init_FilterGroup = __esm({
23433
23743
  isLoading,
23434
23744
  look = "toolbar"
23435
23745
  }) => {
23746
+ const { t } = useTranslate();
23436
23747
  const eventBus = useEventBus();
23437
23748
  const queryState = useQuerySingleton(query);
23438
23749
  const [selectedValues, setSelectedValues] = useState(
@@ -23514,7 +23825,7 @@ var init_FilterGroup = __esm({
23514
23825
  "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
23515
23826
  !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
23516
23827
  ),
23517
- children: "All"
23828
+ children: t("filterGroup.all")
23518
23829
  }
23519
23830
  ),
23520
23831
  filter.options?.map((option) => /* @__PURE__ */ jsx(
@@ -23542,7 +23853,7 @@ var init_FilterGroup = __esm({
23542
23853
  size: "sm",
23543
23854
  onClick: handleClearAll,
23544
23855
  leftIcon: /* @__PURE__ */ jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
23545
- children: "Clear"
23856
+ children: t("filterGroup.clear")
23546
23857
  }
23547
23858
  )
23548
23859
  ]
@@ -23553,7 +23864,7 @@ var init_FilterGroup = __esm({
23553
23864
  return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-4", lookStyles6[look], className), children: [
23554
23865
  showIcon && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
23555
23866
  /* @__PURE__ */ jsx(Icon, { name: "filter", className: "h-4 w-4" }),
23556
- /* @__PURE__ */ jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
23867
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
23557
23868
  ] }),
23558
23869
  filters.map((filter) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
23559
23870
  /* @__PURE__ */ jsx("label", { className: "text-xs font-bold text-muted-foreground uppercase tracking-wide", children: filter.label }),
@@ -23576,7 +23887,7 @@ var init_FilterGroup = __esm({
23576
23887
  `${filter.field}_from`,
23577
23888
  e.target.value || null
23578
23889
  ),
23579
- placeholder: "From",
23890
+ placeholder: t("filterGroup.from"),
23580
23891
  clearable: true,
23581
23892
  onClear: () => handleFilterSelect(`${filter.field}_from`, null)
23582
23893
  }
@@ -23590,7 +23901,7 @@ var init_FilterGroup = __esm({
23590
23901
  `${filter.field}_to`,
23591
23902
  e.target.value || null
23592
23903
  ),
23593
- placeholder: "To",
23904
+ placeholder: t("filterGroup.to"),
23594
23905
  clearable: true,
23595
23906
  onClear: () => handleFilterSelect(`${filter.field}_to`, null)
23596
23907
  }
@@ -23610,7 +23921,7 @@ var init_FilterGroup = __esm({
23610
23921
  value: selectedValues[filter.field] || "all",
23611
23922
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
23612
23923
  options: [
23613
- { value: "all", label: "All" },
23924
+ { value: "all", label: t("filterGroup.all") },
23614
23925
  ...filter.options?.map((opt) => ({
23615
23926
  value: opt,
23616
23927
  label: opt
@@ -23627,7 +23938,7 @@ var init_FilterGroup = __esm({
23627
23938
  onClick: handleClearAll,
23628
23939
  leftIcon: /* @__PURE__ */ jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
23629
23940
  className: "self-start",
23630
- children: "Clear all"
23941
+ children: t("filterGroup.clearAll")
23631
23942
  }
23632
23943
  )
23633
23944
  ] });
@@ -23693,7 +24004,7 @@ var init_FilterGroup = __esm({
23693
24004
  value: selectedValues[filter.field] || "all",
23694
24005
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
23695
24006
  options: [
23696
- { value: "all", label: `All ${filter.label}` },
24007
+ { value: "all", label: t("filterGroup.allOf", { label: filter.label }) },
23697
24008
  ...filter.options?.map((opt) => ({
23698
24009
  value: opt,
23699
24010
  label: opt
@@ -23722,7 +24033,7 @@ var init_FilterGroup = __esm({
23722
24033
  field
23723
24034
  );
23724
24035
  }),
23725
- /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
24036
+ /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: t("filterGroup.clearAll") })
23726
24037
  ] })
23727
24038
  ]
23728
24039
  }
@@ -23747,7 +24058,7 @@ var init_FilterGroup = __esm({
23747
24058
  className: "text-muted-foreground",
23748
24059
  children: [
23749
24060
  /* @__PURE__ */ jsx(Icon, { name: "filter", className: "h-4 w-4" }),
23750
- /* @__PURE__ */ jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
24061
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
23751
24062
  ]
23752
24063
  }
23753
24064
  ),
@@ -23773,7 +24084,7 @@ var init_FilterGroup = __esm({
23773
24084
  `${filter.field}_from`,
23774
24085
  e.target.value || null
23775
24086
  ),
23776
- placeholder: "From",
24087
+ placeholder: t("filterGroup.from"),
23777
24088
  clearable: true,
23778
24089
  onClear: () => handleFilterSelect(`${filter.field}_from`, null),
23779
24090
  className: "min-w-[130px]"
@@ -23789,7 +24100,7 @@ var init_FilterGroup = __esm({
23789
24100
  `${filter.field}_to`,
23790
24101
  e.target.value || null
23791
24102
  ),
23792
- placeholder: "To",
24103
+ placeholder: t("filterGroup.to"),
23793
24104
  clearable: true,
23794
24105
  onClear: () => handleFilterSelect(`${filter.field}_to`, null),
23795
24106
  className: "min-w-[130px]"
@@ -23811,7 +24122,7 @@ var init_FilterGroup = __esm({
23811
24122
  value: selectedValues[filter.field] || "all",
23812
24123
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
23813
24124
  options: [
23814
- { value: "all", label: "All" },
24125
+ { value: "all", label: t("filterGroup.all") },
23815
24126
  ...filter.options?.map((opt) => ({
23816
24127
  value: opt,
23817
24128
  label: opt
@@ -23822,10 +24133,7 @@ var init_FilterGroup = __esm({
23822
24133
  )
23823
24134
  ] }, filter.field)),
23824
24135
  activeFilterCount > 0 && /* @__PURE__ */ jsxs(HStack, { gap: "sm", align: "center", className: "ml-auto", children: [
23825
- /* @__PURE__ */ jsxs(Badge, { variant: "primary", size: "md", children: [
23826
- activeFilterCount,
23827
- " active"
23828
- ] }),
24136
+ /* @__PURE__ */ jsx(Badge, { variant: "primary", size: "md", children: t("filterGroup.activeCount", { count: activeFilterCount }) }),
23829
24137
  /* @__PURE__ */ jsx(
23830
24138
  Button,
23831
24139
  {
@@ -23833,7 +24141,7 @@ var init_FilterGroup = __esm({
23833
24141
  size: "sm",
23834
24142
  onClick: handleClearAll,
23835
24143
  leftIcon: /* @__PURE__ */ jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
23836
- children: "Clear all"
24144
+ children: t("filterGroup.clearAll")
23837
24145
  }
23838
24146
  )
23839
24147
  ] })
@@ -24313,7 +24621,7 @@ var init_RelationSelect = __esm({
24313
24621
  value,
24314
24622
  onChange,
24315
24623
  options = [],
24316
- placeholder = "Select...",
24624
+ placeholder,
24317
24625
  required = false,
24318
24626
  disabled = false,
24319
24627
  isLoading = false,
@@ -24325,6 +24633,7 @@ var init_RelationSelect = __esm({
24325
24633
  emptyMessage
24326
24634
  }) => {
24327
24635
  const { t } = useTranslate();
24636
+ const resolvedPlaceholder = placeholder ?? t("relationSelect.selectPlaceholder");
24328
24637
  const resolvedSearchPlaceholder = searchPlaceholder ?? t("common.search");
24329
24638
  const resolvedEmptyMessage = emptyMessage ?? t("empty.noOptionsFound");
24330
24639
  const [isOpen, setIsOpen] = useState(false);
@@ -24434,7 +24743,7 @@ var init_RelationSelect = __esm({
24434
24743
  children: isLoading ? /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
24435
24744
  /* @__PURE__ */ jsx(Spinner, { size: "sm" }),
24436
24745
  /* @__PURE__ */ jsx(Typography, { as: "span", children: t("common.loading") })
24437
- ] }) : selectedOption ? selectedOption.label : placeholder
24746
+ ] }) : selectedOption ? selectedOption.label : resolvedPlaceholder
24438
24747
  }
24439
24748
  ),
24440
24749
  /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
@@ -25028,19 +25337,20 @@ var init_RepeatableFormSection = __esm({
25028
25337
  RepeatableFormSection.displayName = "RepeatableFormSection";
25029
25338
  }
25030
25339
  });
25031
- var actionTypeLabels, actionTypeIcons, ViolationAlert;
25340
+ var actionTypeLabelKeys, actionTypeIcons, ViolationAlert;
25032
25341
  var init_ViolationAlert = __esm({
25033
25342
  "components/core/molecules/ViolationAlert.tsx"() {
25034
25343
  init_cn();
25344
+ init_useTranslate();
25035
25345
  init_Box();
25036
25346
  init_Stack();
25037
25347
  init_Typography();
25038
25348
  init_Button();
25039
25349
  init_Icon();
25040
- actionTypeLabels = {
25041
- measure: "Corrective Measure",
25042
- admin: "Administrative Action",
25043
- penalty: "Penalty Proceedings"
25350
+ actionTypeLabelKeys = {
25351
+ measure: "violationAlert.actionType.measure",
25352
+ admin: "violationAlert.actionType.admin",
25353
+ penalty: "violationAlert.actionType.penalty"
25044
25354
  };
25045
25355
  actionTypeIcons = {
25046
25356
  measure: "alert-triangle",
@@ -25057,10 +25367,11 @@ var init_ViolationAlert = __esm({
25057
25367
  className,
25058
25368
  ...flatProps
25059
25369
  }) => {
25370
+ const { t } = useTranslate();
25060
25371
  const resolvedViolation = violation ?? {
25061
25372
  law: "",
25062
25373
  article: "",
25063
- message: flatProps.message ?? "Violation",
25374
+ message: flatProps.message ?? t("violationAlert.fallbackMessage"),
25064
25375
  actionType: "measure"
25065
25376
  };
25066
25377
  const effectiveSeverity = severity ?? (resolvedViolation.actionType === "measure" ? "warning" : "error");
@@ -25145,7 +25456,7 @@ var init_ViolationAlert = __esm({
25145
25456
  {
25146
25457
  variant: "caption",
25147
25458
  className: cn(textColor, "opacity-75"),
25148
- children: actionTypeLabels[resolvedViolation.actionType]
25459
+ children: t(actionTypeLabelKeys[resolvedViolation.actionType])
25149
25460
  }
25150
25461
  )
25151
25462
  ] })
@@ -25176,7 +25487,7 @@ var init_ViolationAlert = __esm({
25176
25487
  {
25177
25488
  variant: "caption",
25178
25489
  className: cn(textColor, "opacity-75"),
25179
- children: "Admin:"
25490
+ children: t("violationAlert.adminLabel")
25180
25491
  }
25181
25492
  ),
25182
25493
  /* @__PURE__ */ jsx(
@@ -25195,7 +25506,7 @@ var init_ViolationAlert = __esm({
25195
25506
  {
25196
25507
  variant: "caption",
25197
25508
  className: cn(textColor, "opacity-75"),
25198
- children: "Penalty:"
25509
+ children: t("violationAlert.penaltyLabel")
25199
25510
  }
25200
25511
  ),
25201
25512
  /* @__PURE__ */ jsx(
@@ -25220,7 +25531,7 @@ var init_ViolationAlert = __esm({
25220
25531
  className: cn(textColor, "self-start"),
25221
25532
  children: [
25222
25533
  /* @__PURE__ */ jsx(Icon, { name: "arrow-right", size: "sm", className: "mr-1" }),
25223
- "Go to field"
25534
+ t("violationAlert.goToField")
25224
25535
  ]
25225
25536
  }
25226
25537
  )
@@ -25536,6 +25847,7 @@ var init_LineChart = __esm({
25536
25847
  "use client";
25537
25848
  init_cn();
25538
25849
  init_atoms2();
25850
+ init_useTranslate();
25539
25851
  LineChart2 = ({
25540
25852
  data,
25541
25853
  width = 400,
@@ -25547,6 +25859,7 @@ var init_LineChart = __esm({
25547
25859
  areaColor = "var(--color-primary)",
25548
25860
  className
25549
25861
  }) => {
25862
+ const { t } = useTranslate();
25550
25863
  const gradientId = useId();
25551
25864
  const safeData = data ?? [];
25552
25865
  const sortedData = useMemo(() => {
@@ -25583,7 +25896,7 @@ var init_LineChart = __esm({
25583
25896
  return `${linePath} L ${last.x} ${bottom} L ${first.x} ${bottom} Z`;
25584
25897
  }, [linePath, points, height, showArea]);
25585
25898
  if (safeData.length === 0) {
25586
- return /* @__PURE__ */ jsx(Box, { className: cn("flex items-center justify-center text-muted-foreground", className), style: { width, height }, children: "No data" });
25899
+ return /* @__PURE__ */ jsx(Box, { className: cn("flex items-center justify-center text-muted-foreground", className), style: { width, height }, children: t("empty.noData") });
25587
25900
  }
25588
25901
  return /* @__PURE__ */ jsx(Box, { className: cn(className), children: /* @__PURE__ */ jsxs(
25589
25902
  "svg",
@@ -27774,6 +28087,7 @@ var init_GraphView = __esm({
27774
28087
  "use client";
27775
28088
  init_cn();
27776
28089
  init_atoms2();
28090
+ init_useTranslate();
27777
28091
  GROUP_COLORS = [
27778
28092
  "#3b82f6",
27779
28093
  // blue-500
@@ -27806,6 +28120,7 @@ var init_GraphView = __esm({
27806
28120
  showLabels = true,
27807
28121
  zoomToFit = true
27808
28122
  }) => {
28123
+ const { t } = useTranslate();
27809
28124
  const containerRef = useRef(null);
27810
28125
  const animRef = useRef(0);
27811
28126
  const [simNodes, setSimNodes] = useState([]);
@@ -27983,7 +28298,7 @@ var init_GraphView = __esm({
27983
28298
  [onNodeClick]
27984
28299
  );
27985
28300
  if (nodes.length === 0) {
27986
- return /* @__PURE__ */ jsx(Box, { className: cn("flex items-center justify-center", className), style: { width: w, height: h }, children: /* @__PURE__ */ jsx(Box, { className: "text-muted-foreground text-sm", children: "No graph data" }) });
28301
+ return /* @__PURE__ */ jsx(Box, { className: cn("flex items-center justify-center", className), style: { width: w, height: h }, children: /* @__PURE__ */ jsx(Box, { className: "text-muted-foreground text-sm", children: t("display.noGraphData") }) });
27987
28302
  }
27988
28303
  return /* @__PURE__ */ jsx(
27989
28304
  Box,
@@ -28439,11 +28754,12 @@ var init_UploadDropZone = __esm({
28439
28754
  init_Icon();
28440
28755
  init_Typography();
28441
28756
  init_useEventBus();
28757
+ init_useTranslate();
28442
28758
  UploadDropZone = ({
28443
28759
  accept,
28444
28760
  maxSize,
28445
28761
  maxFiles = 1,
28446
- label = "Drop files here or click to browse",
28762
+ label,
28447
28763
  description,
28448
28764
  disabled = false,
28449
28765
  action,
@@ -28451,22 +28767,24 @@ var init_UploadDropZone = __esm({
28451
28767
  onFiles,
28452
28768
  className
28453
28769
  }) => {
28770
+ const { t } = useTranslate();
28771
+ const resolvedLabel = label ?? t("upload.dropOrBrowse");
28454
28772
  const [isDragOver, setIsDragOver] = useState(false);
28455
28773
  const [error, setError] = useState(null);
28456
28774
  const inputRef = useRef(null);
28457
28775
  const eventBus = useSafeEventBus7();
28458
28776
  const defaultDescription = [
28459
- accept ? `Accepted: ${accept}` : null,
28460
- maxSize ? `Max size: ${formatFileSize(maxSize)}` : null,
28461
- maxFiles > 1 ? `Up to ${maxFiles} files` : null
28777
+ accept ? t("upload.accepted", { accept }) : null,
28778
+ maxSize ? t("upload.maxSize", { size: formatFileSize(maxSize) }) : null,
28779
+ maxFiles > 1 ? t("upload.maxFiles", { count: maxFiles }) : null
28462
28780
  ].filter(Boolean).join(". ");
28463
28781
  const validateFiles = useCallback(
28464
28782
  (files) => {
28465
28783
  if (files.length > maxFiles) {
28466
- return { valid: [], error: `Maximum ${maxFiles} file${maxFiles > 1 ? "s" : ""} allowed` };
28784
+ return { valid: [], error: t("upload.error.maxFiles", { count: maxFiles }) };
28467
28785
  }
28468
28786
  if (accept) {
28469
- const acceptedTypes = accept.split(",").map((t) => t.trim());
28787
+ const acceptedTypes = accept.split(",").map((s) => s.trim());
28470
28788
  const invalid = files.filter((file) => {
28471
28789
  return !acceptedTypes.some((type) => {
28472
28790
  if (type.endsWith("/*")) {
@@ -28476,7 +28794,7 @@ var init_UploadDropZone = __esm({
28476
28794
  });
28477
28795
  });
28478
28796
  if (invalid.length > 0) {
28479
- return { valid: [], error: `Invalid file type: ${invalid[0].name}` };
28797
+ return { valid: [], error: t("upload.error.invalidType", { name: invalid[0].name }) };
28480
28798
  }
28481
28799
  }
28482
28800
  if (maxSize) {
@@ -28484,13 +28802,13 @@ var init_UploadDropZone = __esm({
28484
28802
  if (tooLarge.length > 0) {
28485
28803
  return {
28486
28804
  valid: [],
28487
- error: `File too large: ${tooLarge[0].name} (max ${formatFileSize(maxSize)})`
28805
+ error: t("upload.error.tooLarge", { name: tooLarge[0].name, size: formatFileSize(maxSize) })
28488
28806
  };
28489
28807
  }
28490
28808
  }
28491
28809
  return { valid: files, error: null };
28492
28810
  },
28493
- [accept, maxSize, maxFiles]
28811
+ [accept, maxSize, maxFiles, t]
28494
28812
  );
28495
28813
  const handleFiles = useCallback(
28496
28814
  (files) => {
@@ -28561,7 +28879,7 @@ var init_UploadDropZone = __esm({
28561
28879
  handleClick();
28562
28880
  }
28563
28881
  },
28564
- "aria-label": label,
28882
+ "aria-label": resolvedLabel,
28565
28883
  children: [
28566
28884
  /* @__PURE__ */ jsx(
28567
28885
  "input",
@@ -28577,7 +28895,7 @@ var init_UploadDropZone = __esm({
28577
28895
  }
28578
28896
  ),
28579
28897
  error ? /* @__PURE__ */ jsx(Icon, { name: "file-warning", size: "lg", className: "text-error mb-2" }) : /* @__PURE__ */ jsx(Icon, { name: "upload", size: "lg", className: "text-muted-foreground mb-2" }),
28580
- /* @__PURE__ */ jsx(Typography, { variant: "body1", className: "text-center font-medium mb-1", children: isDragOver ? "Drop files here" : label }),
28898
+ /* @__PURE__ */ jsx(Typography, { variant: "body1", className: "text-center font-medium mb-1", children: isDragOver ? t("upload.dropFilesHere") : resolvedLabel }),
28581
28899
  error ? /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "error", className: "text-center", children: error }) : /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "text-center", children: description ?? defaultDescription })
28582
28900
  ]
28583
28901
  }
@@ -28999,7 +29317,7 @@ function TableView({
28999
29317
  {
29000
29318
  checked: selected.has(id),
29001
29319
  onChange: () => toggleRow(id),
29002
- "aria-label": `Select row ${id}`
29320
+ "aria-label": t("table.selectRow", { id })
29003
29321
  }
29004
29322
  ) }),
29005
29323
  hasRenderProp ? /* @__PURE__ */ jsx(Box, { className: "flex-1 min-w-0", children: children(row, index) }) : colDefs.map((col) => {
@@ -31846,7 +32164,7 @@ var init_QrScanner = __esm({
31846
32164
  className: "inset-0 flex-col items-center justify-center gap-2 bg-black bg-opacity-80 text-center",
31847
32165
  children: [
31848
32166
  /* @__PURE__ */ jsx(Icon, { name: "camera", className: "h-8 w-8 text-white", "aria-hidden": "true" }),
31849
- /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "text-white", children: "Camera unavailable" }),
32167
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "text-white", children: t("qrScanner.cameraUnavailable") }),
31850
32168
  /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-white opacity-70", children: cameraError.message })
31851
32169
  ]
31852
32170
  }
@@ -31857,7 +32175,7 @@ var init_QrScanner = __esm({
31857
32175
  position: "absolute",
31858
32176
  display: "flex",
31859
32177
  className: "inset-0 items-center justify-center bg-black bg-opacity-60",
31860
- children: /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "text-white", children: "Paused" })
32178
+ children: /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "text-white", children: t("qrScanner.paused") })
31861
32179
  }
31862
32180
  ),
31863
32181
  showCameraControls && /* @__PURE__ */ jsxs(
@@ -31876,7 +32194,7 @@ var init_QrScanner = __esm({
31876
32194
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
31877
32195
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
31878
32196
  ),
31879
- "aria-label": isPaused ? "Resume scanning" : "Pause scanning",
32197
+ "aria-label": isPaused ? t("qrScanner.resumeScanning") : t("qrScanner.pauseScanning"),
31880
32198
  children: isPaused ? /* @__PURE__ */ jsx(Icon, { name: "play", className: "h-4 w-4" }) : /* @__PURE__ */ jsx(Icon, { name: "pause", className: "h-4 w-4" })
31881
32199
  }
31882
32200
  ),
@@ -31889,7 +32207,7 @@ var init_QrScanner = __esm({
31889
32207
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
31890
32208
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
31891
32209
  ),
31892
- "aria-label": `Switch to ${currentFacing === "environment" ? "front" : "rear"} camera`,
32210
+ "aria-label": currentFacing === "environment" ? t("qrScanner.switchToFrontCamera") : t("qrScanner.switchToRearCamera"),
31893
32211
  children: /* @__PURE__ */ jsx(Icon, { name: "refresh-cw", className: "h-4 w-4" })
31894
32212
  }
31895
32213
  ),
@@ -31903,7 +32221,7 @@ var init_QrScanner = __esm({
31903
32221
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
31904
32222
  ),
31905
32223
  "aria-label": t("aria.mockScanDev"),
31906
- children: "Mock Scan"
32224
+ children: t("qrScanner.mockScan")
31907
32225
  }
31908
32226
  )
31909
32227
  ]
@@ -31921,6 +32239,7 @@ var init_OptionConstraintGroup = __esm({
31921
32239
  "components/core/molecules/OptionConstraintGroup.tsx"() {
31922
32240
  init_cn();
31923
32241
  init_useEventBus();
32242
+ init_useTranslate();
31924
32243
  init_Typography();
31925
32244
  init_Box();
31926
32245
  init_Label();
@@ -31930,36 +32249,36 @@ var init_OptionConstraintGroup = __esm({
31930
32249
  const sign = delta >= 0 ? "+" : "-";
31931
32250
  return `${sign}$${Math.abs(delta).toFixed(2)}`;
31932
32251
  };
31933
- constraintHint = (constraint) => {
32252
+ constraintHint = (constraint, t) => {
31934
32253
  if (constraint.type === "single") {
31935
- return constraint.required ? "Required, pick 1" : "Optional, pick up to 1";
32254
+ return constraint.required ? t("optionConstraint.requiredOne") : t("optionConstraint.optionalOne");
31936
32255
  }
31937
32256
  const { min, max } = constraint;
31938
32257
  if (min && max) {
31939
- return min === max ? `Pick exactly ${min}` : `Pick ${min}-${max}`;
32258
+ return min === max ? t("optionConstraint.pickExactly", { count: min }) : t("optionConstraint.pickRange", { min, max });
31940
32259
  }
31941
- if (min) return `Pick at least ${min}`;
31942
- if (max) return `Pick up to ${max}`;
31943
- return "Optional";
32260
+ if (min) return t("optionConstraint.pickAtLeast", { count: min });
32261
+ if (max) return t("optionConstraint.pickUpTo", { count: max });
32262
+ return t("optionConstraint.optional");
31944
32263
  };
31945
- validateSelection = (selected, constraint) => {
32264
+ validateSelection = (selected, constraint, t) => {
31946
32265
  if (constraint.type === "single") {
31947
32266
  if (constraint.required && selected.length === 0) {
31948
- return "Pick 1 option";
32267
+ return t("optionConstraint.error.pickOne");
31949
32268
  }
31950
32269
  if (selected.length > 1) {
31951
- return "Pick only 1 option";
32270
+ return t("optionConstraint.error.pickOnlyOne");
31952
32271
  }
31953
32272
  return void 0;
31954
32273
  }
31955
32274
  const { min, max } = constraint;
31956
32275
  if (min !== void 0 && selected.length < min) {
31957
32276
  const remaining = min - selected.length;
31958
- return `Pick at least ${remaining} more`;
32277
+ return t("optionConstraint.error.pickMore", { count: remaining });
31959
32278
  }
31960
32279
  if (max !== void 0 && selected.length > max) {
31961
32280
  const excess = selected.length - max;
31962
- return `Remove ${excess} option${excess === 1 ? "" : "s"}`;
32281
+ return t("optionConstraint.error.removeOptions", { count: excess });
31963
32282
  }
31964
32283
  return void 0;
31965
32284
  };
@@ -31976,8 +32295,9 @@ var init_OptionConstraintGroup = __esm({
31976
32295
  className
31977
32296
  }) => {
31978
32297
  const eventBus = useEventBus();
31979
- const hint = constraintHint(constraint);
31980
- const error = validateSelection(selected, constraint);
32298
+ const { t } = useTranslate();
32299
+ const hint = constraintHint(constraint, t);
32300
+ const error = validateSelection(selected, constraint, t);
31981
32301
  const inputName = `option-${groupId}`;
31982
32302
  const labelTextSize = size === "sm" ? "text-sm" : "text-base";
31983
32303
  const optionGap = size === "sm" ? "gap-2" : "gap-2.5";
@@ -32077,7 +32397,7 @@ var init_OptionConstraintGroup = __esm({
32077
32397
  variant: "caption",
32078
32398
  color: "warning",
32079
32399
  className: "rounded border border-warning/40 px-1.5 py-0.5",
32080
- children: "Out of stock"
32400
+ children: t("optionConstraint.outOfStock")
32081
32401
  }
32082
32402
  )
32083
32403
  ]
@@ -32399,6 +32719,7 @@ function changeBlockType(block, type) {
32399
32719
  return { id: block.id, type, content: seed };
32400
32720
  }
32401
32721
  function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32722
+ const { t } = useTranslate();
32402
32723
  const [open, setOpen] = useState(false);
32403
32724
  const ref = useRef(null);
32404
32725
  useEffect(() => {
@@ -32418,7 +32739,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32418
32739
  {
32419
32740
  type: "button",
32420
32741
  variant: "ghost",
32421
- "aria-label": "Block actions",
32742
+ "aria-label": t("richBlockEditor.blockActions"),
32422
32743
  className: cn(
32423
32744
  "inline-flex items-center justify-center",
32424
32745
  "h-6 w-6 rounded-sm p-0 gap-0",
@@ -32440,7 +32761,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32440
32761
  "py-1 text-sm"
32441
32762
  ),
32442
32763
  children: [
32443
- /* @__PURE__ */ jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: BLOCK_TYPE_LABEL[block.type] }),
32764
+ /* @__PURE__ */ jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: t(BLOCK_TYPE_LABEL_KEY[block.type]) }),
32444
32765
  /* @__PURE__ */ jsxs(
32445
32766
  Button,
32446
32767
  {
@@ -32454,7 +32775,8 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32454
32775
  },
32455
32776
  children: [
32456
32777
  /* @__PURE__ */ jsx(Icon, { name: "plus", className: "w-3.5 h-3.5" }),
32457
- " Duplicate"
32778
+ " ",
32779
+ t("richBlockEditor.duplicate")
32458
32780
  ]
32459
32781
  }
32460
32782
  ),
@@ -32471,14 +32793,15 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32471
32793
  },
32472
32794
  children: [
32473
32795
  /* @__PURE__ */ jsx(Icon, { name: "trash", className: "w-3.5 h-3.5" }),
32474
- " Delete"
32796
+ " ",
32797
+ t("common.delete")
32475
32798
  ]
32476
32799
  }
32477
32800
  ),
32478
32801
  CHANGEABLE_TYPES.includes(block.type) && /* @__PURE__ */ jsxs(Fragment, { children: [
32479
32802
  /* @__PURE__ */ jsx(Box, { className: "my-1 border-t border-border" }),
32480
- /* @__PURE__ */ jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: "Turn into" }),
32481
- CHANGEABLE_TYPES.filter((t) => t !== block.type).map((t) => /* @__PURE__ */ jsx(
32803
+ /* @__PURE__ */ jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: t("richBlockEditor.turnInto") }),
32804
+ CHANGEABLE_TYPES.filter((bt) => bt !== block.type).map((bt) => /* @__PURE__ */ jsx(
32482
32805
  Button,
32483
32806
  {
32484
32807
  type: "button",
@@ -32486,12 +32809,12 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
32486
32809
  role: "menuitem",
32487
32810
  className: "flex w-full items-center gap-2 px-2 py-1.5 text-left justify-start rounded-none",
32488
32811
  onClick: () => {
32489
- onChangeType(t);
32812
+ onChangeType(bt);
32490
32813
  setOpen(false);
32491
32814
  },
32492
- children: BLOCK_TYPE_LABEL[t]
32815
+ children: t(BLOCK_TYPE_LABEL_KEY[bt])
32493
32816
  },
32494
- t
32817
+ bt
32495
32818
  ))
32496
32819
  ] })
32497
32820
  ]
@@ -32553,6 +32876,7 @@ function BlockRow({
32553
32876
  onInsertAfter,
32554
32877
  onChangeType
32555
32878
  }) {
32879
+ const { t } = useTranslate();
32556
32880
  const setContent = useCallback(
32557
32881
  (next) => onUpdate((b) => ({ ...b, content: next })),
32558
32882
  [onUpdate]
@@ -32602,8 +32926,8 @@ function BlockRow({
32602
32926
  tag: "h1",
32603
32927
  value: block.content ?? "",
32604
32928
  readOnly,
32605
- placeholder: placeholder ?? "Heading 1",
32606
- ariaLabel: "Heading 1 block",
32929
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading1"),
32930
+ ariaLabel: t("richBlockEditor.aria.heading1Block"),
32607
32931
  className: "text-3xl font-bold leading-tight",
32608
32932
  onValueChange: setContent
32609
32933
  }
@@ -32615,8 +32939,8 @@ function BlockRow({
32615
32939
  tag: "h2",
32616
32940
  value: block.content ?? "",
32617
32941
  readOnly,
32618
- placeholder: placeholder ?? "Heading 2",
32619
- ariaLabel: "Heading 2 block",
32942
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading2"),
32943
+ ariaLabel: t("richBlockEditor.aria.heading2Block"),
32620
32944
  className: "text-2xl font-semibold leading-tight",
32621
32945
  onValueChange: setContent
32622
32946
  }
@@ -32628,8 +32952,8 @@ function BlockRow({
32628
32952
  tag: "h3",
32629
32953
  value: block.content ?? "",
32630
32954
  readOnly,
32631
- placeholder: placeholder ?? "Heading 3",
32632
- ariaLabel: "Heading 3 block",
32955
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading3"),
32956
+ ariaLabel: t("richBlockEditor.aria.heading3Block"),
32633
32957
  className: "text-xl font-semibold leading-tight",
32634
32958
  onValueChange: setContent
32635
32959
  }
@@ -32641,8 +32965,8 @@ function BlockRow({
32641
32965
  tag: "blockquote",
32642
32966
  value: block.content ?? "",
32643
32967
  readOnly,
32644
- placeholder: placeholder ?? "Quote",
32645
- ariaLabel: "Quote block",
32968
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.quote"),
32969
+ ariaLabel: t("richBlockEditor.aria.quoteBlock"),
32646
32970
  className: "border-l-4 border-primary/60 pl-4 italic text-muted-foreground",
32647
32971
  onValueChange: setContent
32648
32972
  }
@@ -32650,13 +32974,13 @@ function BlockRow({
32650
32974
  case "code":
32651
32975
  return /* @__PURE__ */ jsxs(Box, { className: "rounded-md border border-border bg-muted/40", children: [
32652
32976
  /* @__PURE__ */ jsxs(Box, { className: "flex items-center justify-between border-b border-border px-3 py-1 text-xs text-muted-foreground", children: [
32653
- /* @__PURE__ */ jsx(Typography, { as: "span", variant: "caption", className: "uppercase tracking-wide", children: "Code" }),
32977
+ /* @__PURE__ */ jsx(Typography, { as: "span", variant: "caption", className: "uppercase tracking-wide", children: t("richBlockEditor.blockType.code") }),
32654
32978
  !readOnly && /* @__PURE__ */ jsx(
32655
32979
  Input,
32656
32980
  {
32657
32981
  inputType: "text",
32658
32982
  value: String(block.metadata?.language ?? "plaintext"),
32659
- "aria-label": "Code language",
32983
+ "aria-label": t("richBlockEditor.aria.codeLanguage"),
32660
32984
  className: cn(
32661
32985
  "h-6 w-32 rounded-sm border border-border bg-background",
32662
32986
  "px-2 text-xs outline-none focus:ring-1 focus:ring-ring"
@@ -32672,8 +32996,8 @@ function BlockRow({
32672
32996
  tag: "pre",
32673
32997
  value: block.content ?? "",
32674
32998
  readOnly,
32675
- placeholder: placeholder ?? "Enter code",
32676
- ariaLabel: "Code block",
32999
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.code"),
33000
+ ariaLabel: t("richBlockEditor.aria.codeBlock"),
32677
33001
  className: "block whitespace-pre-wrap p-3 font-mono text-sm leading-relaxed",
32678
33002
  onValueChange: setContent
32679
33003
  }
@@ -32686,7 +33010,7 @@ function BlockRow({
32686
33010
  const caption = String(block.metadata?.caption ?? "");
32687
33011
  const imgProps = {
32688
33012
  src: url,
32689
- alt: caption || "Embedded image",
33013
+ alt: caption || t("richBlockEditor.embeddedImage"),
32690
33014
  className: "max-h-96 w-full rounded-md border border-border object-contain"
32691
33015
  };
32692
33016
  return /* @__PURE__ */ jsxs(Box, { className: "space-y-2", children: [
@@ -32700,7 +33024,8 @@ function BlockRow({
32700
33024
  ),
32701
33025
  children: [
32702
33026
  /* @__PURE__ */ jsx(Icon, { name: "image", className: "mr-2 w-4 h-4" }),
32703
- " No image URL set"
33027
+ " ",
33028
+ t("richBlockEditor.noImageUrl")
32704
33029
  ]
32705
33030
  }
32706
33031
  ),
@@ -32711,7 +33036,7 @@ function BlockRow({
32711
33036
  inputType: "url",
32712
33037
  value: url,
32713
33038
  placeholder: "https://example.com/image.png",
32714
- "aria-label": "Image URL",
33039
+ "aria-label": t("richBlockEditor.aria.imageUrl"),
32715
33040
  className: cn(
32716
33041
  "h-8 flex-1 rounded-sm border border-border bg-background",
32717
33042
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -32724,8 +33049,8 @@ function BlockRow({
32724
33049
  {
32725
33050
  inputType: "text",
32726
33051
  value: caption,
32727
- placeholder: "Caption (optional)",
32728
- "aria-label": "Image caption",
33052
+ placeholder: t("richBlockEditor.placeholder.caption"),
33053
+ "aria-label": t("richBlockEditor.aria.imageCaption"),
32729
33054
  className: cn(
32730
33055
  "h-8 flex-1 rounded-sm border border-border bg-background",
32731
33056
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -32756,8 +33081,8 @@ function BlockRow({
32756
33081
  tag: "span",
32757
33082
  value: child.content ?? "",
32758
33083
  readOnly,
32759
- placeholder: "List item",
32760
- ariaLabel: "List item",
33084
+ placeholder: t("richBlockEditor.placeholder.listItem"),
33085
+ ariaLabel: t("richBlockEditor.aria.listItem"),
32761
33086
  className: "inline-block min-w-[1ch] flex-1",
32762
33087
  onValueChange: (next) => setChildContent(child.id, next)
32763
33088
  }
@@ -32767,7 +33092,7 @@ function BlockRow({
32767
33092
  {
32768
33093
  type: "button",
32769
33094
  variant: "ghost",
32770
- "aria-label": "Remove list item",
33095
+ "aria-label": t("richBlockEditor.aria.removeListItem"),
32771
33096
  className: cn(
32772
33097
  "h-5 w-5 shrink-0 rounded-sm text-muted-foreground p-0 gap-0",
32773
33098
  "opacity-0 group-hover/item:opacity-100 hover:bg-muted hover:text-foreground"
@@ -32789,7 +33114,8 @@ function BlockRow({
32789
33114
  onClick: addListItem,
32790
33115
  children: [
32791
33116
  /* @__PURE__ */ jsx(Icon, { name: "plus", className: "w-3 h-3" }),
32792
- " Add item"
33117
+ " ",
33118
+ t("richBlockEditor.addItem")
32793
33119
  ]
32794
33120
  }
32795
33121
  ) })
@@ -32805,8 +33131,8 @@ function BlockRow({
32805
33131
  tag: "p",
32806
33132
  value: block.content ?? "",
32807
33133
  readOnly,
32808
- placeholder: placeholder ?? "Start writing...",
32809
- ariaLabel: "Paragraph block",
33134
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.paragraph"),
33135
+ ariaLabel: t("richBlockEditor.aria.paragraphBlock"),
32810
33136
  className: "leading-7",
32811
33137
  onValueChange: setContent
32812
33138
  }
@@ -32829,7 +33155,7 @@ function BlockRow({
32829
33155
  {
32830
33156
  type: "button",
32831
33157
  variant: "ghost",
32832
- "aria-label": "Insert paragraph below",
33158
+ "aria-label": t("richBlockEditor.insertParagraphBelow"),
32833
33159
  className: cn(
32834
33160
  "inline-flex h-6 w-6 items-center justify-center rounded-sm p-0 gap-0",
32835
33161
  "text-muted-foreground hover:bg-muted hover:text-foreground",
@@ -32856,7 +33182,7 @@ function BlockRow({
32856
33182
  }
32857
33183
  );
32858
33184
  }
32859
- var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES, RichBlockEditor;
33185
+ var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL_KEY, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES, RichBlockEditor;
32860
33186
  var init_RichBlockEditor = __esm({
32861
33187
  "components/core/molecules/RichBlockEditor.tsx"() {
32862
33188
  "use client";
@@ -32869,29 +33195,30 @@ var init_RichBlockEditor = __esm({
32869
33195
  init_Input();
32870
33196
  init_Icon();
32871
33197
  init_useEventBus();
33198
+ init_useTranslate();
32872
33199
  TOOLBAR_ENTRIES = [
32873
- { type: "paragraph", label: "Text", icon: Type },
32874
- { type: "heading-1", label: "H1", icon: Heading1 },
32875
- { type: "heading-2", label: "H2", icon: Heading2 },
32876
- { type: "heading-3", label: "H3", icon: Heading3 },
32877
- { type: "bullet-list", label: "Bullet list", icon: List },
32878
- { type: "numbered-list", label: "Numbered", icon: ListOrdered },
32879
- { type: "quote", label: "Quote", icon: Quote },
32880
- { type: "code", label: "Code", icon: Code },
32881
- { type: "divider", label: "Divider", icon: Minus },
32882
- { type: "image", label: "Image", icon: Image$1 }
33200
+ { type: "paragraph", labelKey: "richBlockEditor.toolbar.text", icon: Type },
33201
+ { type: "heading-1", labelKey: "richBlockEditor.toolbar.h1", icon: Heading1 },
33202
+ { type: "heading-2", labelKey: "richBlockEditor.toolbar.h2", icon: Heading2 },
33203
+ { type: "heading-3", labelKey: "richBlockEditor.toolbar.h3", icon: Heading3 },
33204
+ { type: "bullet-list", labelKey: "richBlockEditor.toolbar.bulletList", icon: List },
33205
+ { type: "numbered-list", labelKey: "richBlockEditor.toolbar.numbered", icon: ListOrdered },
33206
+ { type: "quote", labelKey: "richBlockEditor.toolbar.quote", icon: Quote },
33207
+ { type: "code", labelKey: "richBlockEditor.toolbar.code", icon: Code },
33208
+ { type: "divider", labelKey: "richBlockEditor.toolbar.divider", icon: Minus },
33209
+ { type: "image", labelKey: "richBlockEditor.toolbar.image", icon: Image$1 }
32883
33210
  ];
32884
- BLOCK_TYPE_LABEL = {
32885
- paragraph: "Text",
32886
- "heading-1": "Heading 1",
32887
- "heading-2": "Heading 2",
32888
- "heading-3": "Heading 3",
32889
- "bullet-list": "Bullet list",
32890
- "numbered-list": "Numbered list",
32891
- quote: "Quote",
32892
- code: "Code",
32893
- divider: "Divider",
32894
- image: "Image"
33211
+ BLOCK_TYPE_LABEL_KEY = {
33212
+ paragraph: "richBlockEditor.blockType.paragraph",
33213
+ "heading-1": "richBlockEditor.blockType.heading1",
33214
+ "heading-2": "richBlockEditor.blockType.heading2",
33215
+ "heading-3": "richBlockEditor.blockType.heading3",
33216
+ "bullet-list": "richBlockEditor.blockType.bulletList",
33217
+ "numbered-list": "richBlockEditor.blockType.numberedList",
33218
+ quote: "richBlockEditor.blockType.quote",
33219
+ code: "richBlockEditor.blockType.code",
33220
+ divider: "richBlockEditor.blockType.divider",
33221
+ image: "richBlockEditor.blockType.image"
32895
33222
  };
32896
33223
  CHANGEABLE_TYPES = [
32897
33224
  "paragraph",
@@ -32925,6 +33252,7 @@ var init_RichBlockEditor = __esm({
32925
33252
  showToolbar = true,
32926
33253
  className
32927
33254
  }) => {
33255
+ const { t } = useTranslate();
32928
33256
  const [blocks, setBlocks] = useState(
32929
33257
  () => normalizeBlocks(initialBlocks)
32930
33258
  );
@@ -32996,25 +33324,26 @@ var init_RichBlockEditor = __esm({
32996
33324
  Box,
32997
33325
  {
32998
33326
  role: "toolbar",
32999
- "aria-label": "Block editor toolbar",
33327
+ "aria-label": t("richBlockEditor.editorToolbar"),
33000
33328
  className: cn(
33001
33329
  "flex flex-wrap items-center gap-1",
33002
33330
  "border-b border-border bg-muted/30 px-2 py-2"
33003
33331
  ),
33004
33332
  children: TOOLBAR_ENTRIES.map((entry) => {
33005
33333
  const Icon3 = entry.icon;
33334
+ const entryLabel = t(entry.labelKey);
33006
33335
  return /* @__PURE__ */ jsxs(
33007
33336
  Button,
33008
33337
  {
33009
33338
  type: "button",
33010
33339
  variant: "ghost",
33011
33340
  size: "sm",
33012
- "aria-label": `Insert ${entry.label}`,
33013
- title: entry.label,
33341
+ "aria-label": t("richBlockEditor.insertEntry", { label: entryLabel }),
33342
+ title: entryLabel,
33014
33343
  onClick: () => handleAppend(entry.type),
33015
33344
  children: [
33016
33345
  /* @__PURE__ */ jsx(Icon3, { size: 14 }),
33017
- /* @__PURE__ */ jsx(Typography, { as: "span", variant: "caption", className: "ml-1 hidden text-xs sm:inline", children: entry.label })
33346
+ /* @__PURE__ */ jsx(Typography, { as: "span", variant: "caption", className: "ml-1 hidden text-xs sm:inline", children: entryLabel })
33018
33347
  ]
33019
33348
  },
33020
33349
  entry.type
@@ -33057,6 +33386,7 @@ var init_ReplyTree = __esm({
33057
33386
  "use client";
33058
33387
  init_cn();
33059
33388
  init_useEventBus();
33389
+ init_useTranslate();
33060
33390
  init_atoms2();
33061
33391
  init_VoteStack();
33062
33392
  ReplyTreeNode = ({
@@ -33076,6 +33406,7 @@ var init_ReplyTree = __esm({
33076
33406
  showActions
33077
33407
  }) => {
33078
33408
  const eventBus = useEventBus();
33409
+ const { t } = useTranslate();
33079
33410
  const hasReplies = !!node.replies && node.replies.length > 0;
33080
33411
  const isCollapsed = collapsedSet.has(node.id);
33081
33412
  const atMaxDepth = depth >= maxDepth;
@@ -33122,7 +33453,7 @@ var init_ReplyTree = __esm({
33122
33453
  variant: "ghost",
33123
33454
  size: "sm",
33124
33455
  onClick: handleToggle,
33125
- "aria-label": isCollapsed ? "Expand replies" : "Collapse replies",
33456
+ "aria-label": isCollapsed ? t("replyTree.expandReplies") : t("replyTree.collapseReplies"),
33126
33457
  "aria-expanded": !isCollapsed,
33127
33458
  leftIcon: isCollapsed ? "chevron-right" : "chevron-down",
33128
33459
  className: cn(
@@ -33163,7 +33494,7 @@ var init_ReplyTree = __esm({
33163
33494
  onVote: handleVote,
33164
33495
  size: "sm",
33165
33496
  variant: "horizontal",
33166
- label: `Vote on reply by ${node.authorName}`
33497
+ label: t("replyTree.voteOnReplyBy", { author: node.authorName })
33167
33498
  }
33168
33499
  ),
33169
33500
  /* @__PURE__ */ jsx(
@@ -33173,8 +33504,8 @@ var init_ReplyTree = __esm({
33173
33504
  size: "sm",
33174
33505
  leftIcon: "message-square",
33175
33506
  onClick: handleReply,
33176
- "aria-label": `Reply to ${node.authorName}`,
33177
- children: "Reply"
33507
+ "aria-label": t("replyTree.replyTo", { author: node.authorName }),
33508
+ children: t("replyTree.reply")
33178
33509
  }
33179
33510
  ),
33180
33511
  /* @__PURE__ */ jsx(
@@ -33184,8 +33515,8 @@ var init_ReplyTree = __esm({
33184
33515
  size: "sm",
33185
33516
  leftIcon: "flag",
33186
33517
  onClick: handleFlag,
33187
- "aria-label": `Flag reply by ${node.authorName}`,
33188
- children: "Flag"
33518
+ "aria-label": t("replyTree.flagReplyBy", { author: node.authorName }),
33519
+ children: t("replyTree.flag")
33189
33520
  }
33190
33521
  )
33191
33522
  ] }),
@@ -33196,9 +33527,9 @@ var init_ReplyTree = __esm({
33196
33527
  inputType: "textarea",
33197
33528
  rows: 2,
33198
33529
  value: draft,
33199
- placeholder: `Reply to ${node.authorName}\u2026`,
33530
+ placeholder: t("replyTree.replyToPlaceholder", { author: node.authorName }),
33200
33531
  onChange: (e) => setDraft(e.target.value),
33201
- "aria-label": `Reply to ${node.authorName}`
33532
+ "aria-label": t("replyTree.replyTo", { author: node.authorName })
33202
33533
  }
33203
33534
  ),
33204
33535
  /* @__PURE__ */ jsxs(Box, { className: "flex flex-row gap-2 items-center", children: [
@@ -33210,10 +33541,10 @@ var init_ReplyTree = __esm({
33210
33541
  leftIcon: "send",
33211
33542
  onClick: handleSubmitReply,
33212
33543
  disabled: !draft.trim(),
33213
- children: "Send"
33544
+ children: t("replyTree.send")
33214
33545
  }
33215
33546
  ),
33216
- /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: "Cancel" })
33547
+ /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: t("common.cancel") })
33217
33548
  ] })
33218
33549
  ] }),
33219
33550
  hasReplies && !isCollapsed && (atMaxDepth ? /* @__PURE__ */ jsx(
@@ -33227,7 +33558,7 @@ var init_ReplyTree = __esm({
33227
33558
  "self-start gap-1 px-0 h-auto",
33228
33559
  "text-sm text-primary hover:underline hover:bg-transparent"
33229
33560
  ),
33230
- children: "Continue thread"
33561
+ children: t("replyTree.continueThread")
33231
33562
  }
33232
33563
  ) : /* @__PURE__ */ jsx(Box, { className: "flex flex-col gap-2 mt-1", children: node.replies.map((child) => /* @__PURE__ */ jsx(
33233
33564
  ReplyTreeNode,
@@ -33266,6 +33597,7 @@ var init_ReplyTree = __esm({
33266
33597
  showActions = true,
33267
33598
  className
33268
33599
  }) => {
33600
+ const { t } = useTranslate();
33269
33601
  const nodeList = Array.isArray(nodes) ? nodes : nodes ? [nodes] : [];
33270
33602
  const [collapsedSet, setCollapsedSet] = useState(() => {
33271
33603
  const acc = /* @__PURE__ */ new Set();
@@ -33284,7 +33616,7 @@ var init_ReplyTree = __esm({
33284
33616
  });
33285
33617
  }, []);
33286
33618
  if (nodeList.length === 0) {
33287
- return /* @__PURE__ */ jsx(Box, { className: cn("text-sm text-muted-foreground", className), children: "No replies yet." });
33619
+ return /* @__PURE__ */ jsx(Box, { className: cn("text-sm text-muted-foreground", className), children: t("replyTree.noRepliesYet") });
33288
33620
  }
33289
33621
  return /* @__PURE__ */ jsx(Box, { className: cn("flex flex-col gap-2 min-w-0", className), children: nodeList.map((node) => /* @__PURE__ */ jsx(
33290
33622
  ReplyTreeNode,
@@ -33362,6 +33694,7 @@ var init_VersionDiff = __esm({
33362
33694
  "use client";
33363
33695
  init_cn();
33364
33696
  init_useEventBus();
33697
+ init_useTranslate();
33365
33698
  init_atoms2();
33366
33699
  init_Stack();
33367
33700
  INLINE_STYLES = {
@@ -33384,6 +33717,7 @@ var init_VersionDiff = __esm({
33384
33717
  language,
33385
33718
  className
33386
33719
  }) => {
33720
+ const { t } = useTranslate();
33387
33721
  const eventBus = useEventBus();
33388
33722
  const revisions = Array.isArray(revisionsProp) ? revisionsProp : [];
33389
33723
  const fallbackBefore = revisions[0]?.id ?? "";
@@ -33465,24 +33799,24 @@ var init_VersionDiff = __esm({
33465
33799
  children: [
33466
33800
  /* @__PURE__ */ jsxs(HStack, { gap: "sm", align: "center", className: "flex-wrap", children: [
33467
33801
  /* @__PURE__ */ jsx(Icon, { name: "git-commit", size: "sm", className: "text-muted-foreground" }),
33468
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "whitespace-nowrap", children: "Compare" }),
33802
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "whitespace-nowrap", children: t("versionDiff.compare") }),
33469
33803
  /* @__PURE__ */ jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsx(
33470
33804
  Select,
33471
33805
  {
33472
33806
  options,
33473
33807
  value: activeBeforeId,
33474
33808
  onChange: handleBeforeChange,
33475
- "aria-label": "Before revision"
33809
+ "aria-label": t("versionDiff.beforeRevision")
33476
33810
  }
33477
33811
  ) }),
33478
- /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: "to" }),
33812
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: t("versionDiff.to") }),
33479
33813
  /* @__PURE__ */ jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsx(
33480
33814
  Select,
33481
33815
  {
33482
33816
  options,
33483
33817
  value: activeAfterId,
33484
33818
  onChange: handleAfterChange,
33485
- "aria-label": "After revision"
33819
+ "aria-label": t("versionDiff.afterRevision")
33486
33820
  }
33487
33821
  ) }),
33488
33822
  language && /* @__PURE__ */ jsx(Badge, { variant: "default", children: language }),
@@ -33503,7 +33837,7 @@ var init_VersionDiff = __esm({
33503
33837
  size: "sm",
33504
33838
  icon: activeView === "side-by-side" ? "align-left" : "columns",
33505
33839
  onClick: handleViewToggle,
33506
- "aria-label": activeView === "side-by-side" ? "Switch to inline view" : "Switch to side-by-side view"
33840
+ "aria-label": activeView === "side-by-side" ? t("versionDiff.switchToInline") : t("versionDiff.switchToSideBySide")
33507
33841
  }
33508
33842
  ),
33509
33843
  (onRevert || revertEvent) && /* @__PURE__ */ jsx(
@@ -33513,7 +33847,7 @@ var init_VersionDiff = __esm({
33513
33847
  size: "sm",
33514
33848
  icon: "rotate-ccw",
33515
33849
  onClick: handleRevert,
33516
- children: "Revert"
33850
+ children: t("versionDiff.revert")
33517
33851
  }
33518
33852
  )
33519
33853
  ] })
@@ -33530,12 +33864,12 @@ var init_VersionDiff = __esm({
33530
33864
  children: [
33531
33865
  /* @__PURE__ */ jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
33532
33866
  beforeRev?.label,
33533
- beforeRev?.author ? ` by ${beforeRev.author}` : "",
33867
+ beforeRev?.author ? t("versionDiff.byAuthor", { author: beforeRev.author }) : "",
33534
33868
  beforeRev?.timestamp ? ` (${beforeRev.timestamp})` : ""
33535
33869
  ] }),
33536
33870
  /* @__PURE__ */ jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
33537
33871
  afterRev?.label,
33538
- afterRev?.author ? ` by ${afterRev.author}` : "",
33872
+ afterRev?.author ? t("versionDiff.byAuthor", { author: afterRev.author }) : "",
33539
33873
  afterRev?.timestamp ? ` (${afterRev.timestamp})` : ""
33540
33874
  ] })
33541
33875
  ]
@@ -33928,10 +34262,12 @@ var init_DocPagination = __esm({
33928
34262
  }
33929
34263
  });
33930
34264
  function DocSearch({
33931
- placeholder = "Search documentation...",
34265
+ placeholder,
33932
34266
  onSearch,
33933
34267
  className
33934
34268
  }) {
34269
+ const { t } = useTranslate();
34270
+ const resolvedPlaceholder = placeholder ?? t("docSearch.placeholder");
33935
34271
  const [query, setQuery] = useState("");
33936
34272
  const [results, setResults] = useState([]);
33937
34273
  const [isOpen, setIsOpen] = useState(false);
@@ -34038,7 +34374,7 @@ function DocSearch({
34038
34374
  Input,
34039
34375
  {
34040
34376
  inputType: "search",
34041
- placeholder,
34377
+ placeholder: resolvedPlaceholder,
34042
34378
  value: query,
34043
34379
  onChange: handleChange,
34044
34380
  onFocus: handleFocus,
@@ -34103,6 +34439,7 @@ var init_DocSearch = __esm({
34103
34439
  init_Typography();
34104
34440
  init_Icon();
34105
34441
  init_Input();
34442
+ init_useTranslate();
34106
34443
  }
34107
34444
  });
34108
34445
  var DocSidebarCategory, DocSidebar;
@@ -36235,8 +36572,8 @@ var init_SignaturePad = __esm({
36235
36572
  init_useEventBus();
36236
36573
  init_useTranslate();
36237
36574
  SignaturePad = ({
36238
- label = "Signature",
36239
- helperText = "Draw your signature above",
36575
+ label,
36576
+ helperText,
36240
36577
  strokeColor,
36241
36578
  strokeWidth = 2,
36242
36579
  height = 200,
@@ -36252,6 +36589,8 @@ var init_SignaturePad = __esm({
36252
36589
  }) => {
36253
36590
  const eventBus = useEventBus();
36254
36591
  const { t } = useTranslate();
36592
+ const resolvedLabel = label ?? t("signaturePad.label");
36593
+ const resolvedHelperText = helperText ?? t("signaturePad.helperText");
36255
36594
  const canvasRef = useRef(null);
36256
36595
  const [isDrawing, setIsDrawing] = useState(false);
36257
36596
  const [hasSignature, setHasSignature] = useState(!!value);
@@ -36354,7 +36693,7 @@ var init_SignaturePad = __esm({
36354
36693
  );
36355
36694
  }
36356
36695
  return /* @__PURE__ */ jsx(Card, { className: cn("p-4", className), children: /* @__PURE__ */ jsxs(VStack, { gap: "sm", children: [
36357
- label && /* @__PURE__ */ jsx(Typography, { variant: "label", weight: "medium", children: label }),
36696
+ resolvedLabel && /* @__PURE__ */ jsx(Typography, { variant: "label", weight: "medium", children: resolvedLabel }),
36358
36697
  /* @__PURE__ */ jsx(
36359
36698
  Box,
36360
36699
  {
@@ -36383,7 +36722,7 @@ var init_SignaturePad = __esm({
36383
36722
  )
36384
36723
  }
36385
36724
  ),
36386
- helperText && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: helperText }),
36725
+ resolvedHelperText && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: resolvedHelperText }),
36387
36726
  !readOnly && /* @__PURE__ */ jsxs(HStack, { gap: "sm", justify: "end", children: [
36388
36727
  /* @__PURE__ */ jsx(
36389
36728
  Button,
@@ -36393,7 +36732,7 @@ var init_SignaturePad = __esm({
36393
36732
  icon: Eraser,
36394
36733
  onClick: clearSignature,
36395
36734
  disabled: !hasSignature,
36396
- children: "Clear"
36735
+ children: t("signaturePad.clear")
36397
36736
  }
36398
36737
  ),
36399
36738
  signEvent && /* @__PURE__ */ jsx(
@@ -36404,7 +36743,7 @@ var init_SignaturePad = __esm({
36404
36743
  icon: Check,
36405
36744
  onClick: confirmSignature,
36406
36745
  disabled: !hasSignature,
36407
- children: "Confirm"
36746
+ children: t("signaturePad.confirm")
36408
36747
  }
36409
36748
  )
36410
36749
  ] })
@@ -41071,6 +41410,7 @@ function MasterDetail({
41071
41410
  className,
41072
41411
  ...rest
41073
41412
  }) {
41413
+ const { t } = useTranslate();
41074
41414
  const loading = externalLoading ?? false;
41075
41415
  const isLoading = externalIsLoading ?? false;
41076
41416
  const error = externalError ?? null;
@@ -41083,8 +41423,8 @@ function MasterDetail({
41083
41423
  isLoading: loading || isLoading,
41084
41424
  error,
41085
41425
  className,
41086
- emptyTitle: "No items found",
41087
- emptyDescription: "Create your first item to get started.",
41426
+ emptyTitle: t("table.empty.title"),
41427
+ emptyDescription: t("empty.createFirst"),
41088
41428
  ...rest
41089
41429
  }
41090
41430
  );
@@ -41093,6 +41433,7 @@ var init_MasterDetail = __esm({
41093
41433
  "components/core/organisms/MasterDetail.tsx"() {
41094
41434
  "use client";
41095
41435
  init_DataTable();
41436
+ init_useTranslate();
41096
41437
  MasterDetail.displayName = "MasterDetail";
41097
41438
  }
41098
41439
  });
@@ -41101,14 +41442,18 @@ var init_MasterDetailLayout = __esm({
41101
41442
  "components/core/organisms/layout/MasterDetailLayout.tsx"() {
41102
41443
  init_cn();
41103
41444
  init_Typography();
41104
- DefaultEmptyDetail = () => /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsx(
41105
- Typography,
41106
- {
41107
- variant: "body2",
41108
- className: "text-muted-foreground",
41109
- children: "Select an item to view details"
41110
- }
41111
- ) });
41445
+ init_useTranslate();
41446
+ DefaultEmptyDetail = () => {
41447
+ const { t } = useTranslate();
41448
+ return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsx(
41449
+ Typography,
41450
+ {
41451
+ variant: "body2",
41452
+ className: "text-muted-foreground",
41453
+ children: t("masterDetail.selectItem")
41454
+ }
41455
+ ) });
41456
+ };
41112
41457
  MasterDetailLayout = ({
41113
41458
  master,
41114
41459
  detail,
@@ -41235,7 +41580,7 @@ var init_MediaGallery = __esm({
41235
41580
  {
41236
41581
  icon: Image$1,
41237
41582
  title: t("display.noMedia"),
41238
- description: "No media items to display.",
41583
+ description: t("mediaGallery.noMediaDescription"),
41239
41584
  className
41240
41585
  }
41241
41586
  );
@@ -41252,7 +41597,7 @@ var init_MediaGallery = __esm({
41252
41597
  size: "sm",
41253
41598
  icon: Upload,
41254
41599
  action: "MEDIA_UPLOAD",
41255
- children: "Upload"
41600
+ children: t("mediaGallery.upload")
41256
41601
  }
41257
41602
  ),
41258
41603
  actions?.map((action, idx) => /* @__PURE__ */ jsx(
@@ -41266,10 +41611,7 @@ var init_MediaGallery = __esm({
41266
41611
  ))
41267
41612
  ] })
41268
41613
  ] }),
41269
- selectable && selectedItems.length > 0 && /* @__PURE__ */ jsx(HStack, { gap: "sm", align: "center", children: /* @__PURE__ */ jsxs(Badge, { variant: "info", children: [
41270
- selectedItems.length,
41271
- " selected"
41272
- ] }) }),
41614
+ selectable && selectedItems.length > 0 && /* @__PURE__ */ jsx(HStack, { gap: "sm", align: "center", children: /* @__PURE__ */ jsx(Badge, { variant: "info", children: t("table.bulk.selected", { count: selectedItems.length }) }) }),
41273
41615
  /* @__PURE__ */ jsx(
41274
41616
  Box,
41275
41617
  {
@@ -42262,7 +42604,7 @@ function TraitsTab({ traits: traits2 }) {
42262
42604
  EmptyState,
42263
42605
  {
42264
42606
  title: t("debug.noActiveTraits"),
42265
- description: "Traits will appear when components using them are mounted",
42607
+ description: t("debug.traitsMountHint"),
42266
42608
  className: "py-8"
42267
42609
  }
42268
42610
  );
@@ -42272,14 +42614,11 @@ function TraitsTab({ traits: traits2 }) {
42272
42614
  header: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 w-full", children: [
42273
42615
  /* @__PURE__ */ jsx(Typography, { variant: "body", weight: "semibold", className: "text-purple-600 dark:text-purple-400", children: trait.name }),
42274
42616
  /* @__PURE__ */ jsx(Badge, { variant: "success", size: "sm", children: trait.currentState }),
42275
- /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: [
42276
- trait.transitionCount,
42277
- " transitions"
42278
- ] })
42617
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: t("debug.transitionsCount", { count: trait.transitionCount }) })
42279
42618
  ] }),
42280
42619
  content: /* @__PURE__ */ jsxs(Stack, { gap: "sm", children: [
42281
42620
  /* @__PURE__ */ jsxs("div", { children: [
42282
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "States" }),
42621
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.states") }),
42283
42622
  /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: trait.states.map((state) => /* @__PURE__ */ jsx(
42284
42623
  Badge,
42285
42624
  {
@@ -42291,7 +42630,7 @@ function TraitsTab({ traits: traits2 }) {
42291
42630
  )) })
42292
42631
  ] }),
42293
42632
  trait.transitions.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
42294
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Transitions" }),
42633
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.transitions") }),
42295
42634
  /* @__PURE__ */ jsx(Stack, { gap: "xs", children: trait.transitions.map((t2, i) => /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "font-mono", children: [
42296
42635
  t2.from,
42297
42636
  " \u2192 ",
@@ -42310,7 +42649,7 @@ function TraitsTab({ traits: traits2 }) {
42310
42649
  ] }, i)) })
42311
42650
  ] }),
42312
42651
  trait.guards.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
42313
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Guards" }),
42652
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.guards") }),
42314
42653
  /* @__PURE__ */ jsx(Stack, { gap: "xs", children: trait.guards.map((g, i) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
42315
42654
  /* @__PURE__ */ jsx(Typography, { variant: "small", children: g.name }),
42316
42655
  /* @__PURE__ */ jsx(Badge, { variant: g.lastResult === true ? "success" : g.lastResult === false ? "danger" : "default", size: "sm", children: g.lastResult === void 0 ? "?" : g.lastResult ? "\u2713" : "\u2717" })
@@ -42416,7 +42755,7 @@ function EntitiesTab({ snapshot }) {
42416
42755
  EmptyState,
42417
42756
  {
42418
42757
  title: t("debug.noEntityData"),
42419
- description: "Debug mode may not be enabled",
42758
+ description: t("debug.debugModeHint"),
42420
42759
  className: "py-8"
42421
42760
  }
42422
42761
  );
@@ -42429,7 +42768,7 @@ function EntitiesTab({ snapshot }) {
42429
42768
  EmptyState,
42430
42769
  {
42431
42770
  title: t("debug.noEntities"),
42432
- description: "Entities will appear when spawned",
42771
+ description: t("debug.entitiesSpawnHint"),
42433
42772
  className: "py-8"
42434
42773
  }
42435
42774
  );
@@ -42437,7 +42776,7 @@ function EntitiesTab({ snapshot }) {
42437
42776
  const singletonItems = singletonEntries.map(([name, data]) => ({
42438
42777
  id: `singleton-${name}`,
42439
42778
  header: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
42440
- /* @__PURE__ */ jsx(Badge, { variant: "primary", size: "sm", children: "Singleton" }),
42779
+ /* @__PURE__ */ jsx(Badge, { variant: "primary", size: "sm", children: t("debug.singleton") }),
42441
42780
  /* @__PURE__ */ jsx(Typography, { variant: "body", weight: "semibold", className: "text-sky-600 dark:text-sky-400", children: name })
42442
42781
  ] }),
42443
42782
  content: /* @__PURE__ */ jsx("pre", { className: "text-xs text-gray-600 dark:text-gray-400 bg-gray-50 dark:bg-gray-800 p-2 rounded overflow-auto max-h-40", children: JSON.stringify(data, null, 2) })
@@ -42455,31 +42794,19 @@ function EntitiesTab({ snapshot }) {
42455
42794
  }));
42456
42795
  return /* @__PURE__ */ jsxs("div", { className: "debug-tab debug-tab--entities", children: [
42457
42796
  singletonItems.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
42458
- /* @__PURE__ */ jsxs(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
42459
- "Singletons (",
42460
- singletonItems.length,
42461
- ")"
42462
- ] }),
42797
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.singletonsCount", { count: singletonItems.length }) }),
42463
42798
  /* @__PURE__ */ jsx(Accordion, { items: singletonItems, multiple: true })
42464
42799
  ] }),
42465
42800
  runtimeItems.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
42466
- /* @__PURE__ */ jsxs(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
42467
- "Runtime (",
42468
- runtimeEntities.length,
42469
- ")"
42470
- ] }),
42801
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.runtimeCount", { count: runtimeEntities.length }) }),
42471
42802
  /* @__PURE__ */ jsx(Accordion, { items: runtimeItems, multiple: true }),
42472
- runtimeEntities.length > 20 && /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-gray-400 text-center mt-2", children: [
42473
- "+",
42474
- runtimeEntities.length - 20,
42475
- " more entities"
42476
- ] })
42803
+ runtimeEntities.length > 20 && /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-400 text-center mt-2", children: t("debug.moreEntities", { count: runtimeEntities.length - 20 }) })
42477
42804
  ] }),
42478
42805
  persistentEntries.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
42479
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Persistent" }),
42806
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.persistent") }),
42480
42807
  /* @__PURE__ */ jsx(Stack, { gap: "xs", children: persistentEntries.map(([type, info]) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between py-1", children: [
42481
42808
  /* @__PURE__ */ jsx(Typography, { variant: "small", children: type }),
42482
- /* @__PURE__ */ jsx(Badge, { variant: info.loaded ? "success" : "default", size: "sm", children: info.loaded ? `${info.count} loaded` : "not loaded" })
42809
+ /* @__PURE__ */ jsx(Badge, { variant: info.loaded ? "success" : "default", size: "sm", children: info.loaded ? t("debug.loadedCount", { count: info.count }) : t("debug.notLoaded") })
42483
42810
  ] }, type)) })
42484
42811
  ] })
42485
42812
  ] });
@@ -42523,7 +42850,7 @@ function EventFlowTab({ events: events2 }) {
42523
42850
  EmptyState,
42524
42851
  {
42525
42852
  title: t("debug.noEventsYet"),
42526
- description: "Events will appear as traits, ticks, and other systems execute",
42853
+ description: t("debug.eventsExecuteHint"),
42527
42854
  className: "py-8"
42528
42855
  }
42529
42856
  );
@@ -42534,17 +42861,13 @@ function EventFlowTab({ events: events2 }) {
42534
42861
  return /* @__PURE__ */ jsxs("div", { className: "debug-tab debug-tab--events", children: [
42535
42862
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mb-3 flex-wrap", children: [
42536
42863
  /* @__PURE__ */ jsxs(ButtonGroup, { children: [
42537
- /* @__PURE__ */ jsxs(
42864
+ /* @__PURE__ */ jsx(
42538
42865
  Button,
42539
42866
  {
42540
42867
  size: "sm",
42541
42868
  variant: filter === "all" ? "primary" : "secondary",
42542
42869
  onClick: () => setFilter("all"),
42543
- children: [
42544
- "All (",
42545
- events2.length,
42546
- ")"
42547
- ]
42870
+ children: t("debug.allCount", { count: events2.length })
42548
42871
  }
42549
42872
  ),
42550
42873
  eventTypes.map((type) => {
@@ -42574,7 +42897,7 @@ function EventFlowTab({ events: events2 }) {
42574
42897
  onChange: (e) => setAutoScroll(e.target.checked)
42575
42898
  }
42576
42899
  ),
42577
- "Auto-scroll"
42900
+ t("debug.autoScroll")
42578
42901
  ] })
42579
42902
  ] }),
42580
42903
  /* @__PURE__ */ jsx(
@@ -42632,7 +42955,7 @@ function GuardsPanel({ guards }) {
42632
42955
  EmptyState,
42633
42956
  {
42634
42957
  title: t("debug.noGuardEvaluations"),
42635
- description: "Guard evaluations will appear when transitions or ticks with guards execute",
42958
+ description: t("debug.guardEvaluationsHint"),
42636
42959
  className: "py-8"
42637
42960
  }
42638
42961
  );
@@ -42663,15 +42986,15 @@ function GuardsPanel({ guards }) {
42663
42986
  ] }),
42664
42987
  content: /* @__PURE__ */ jsxs(Stack, { gap: "sm", children: [
42665
42988
  /* @__PURE__ */ jsxs("div", { children: [
42666
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Expression" }),
42989
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.expression") }),
42667
42990
  /* @__PURE__ */ jsx("code", { className: "block mt-1 text-xs text-amber-600 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20 px-2 py-1 rounded", children: guard.expression })
42668
42991
  ] }),
42669
42992
  /* @__PURE__ */ jsxs("div", { children: [
42670
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Inputs" }),
42993
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.inputs") }),
42671
42994
  /* @__PURE__ */ jsx("pre", { className: "mt-1 text-xs text-gray-600 dark:text-gray-400 bg-gray-50 dark:bg-gray-800 p-2 rounded overflow-auto max-h-24", children: JSON.stringify(guard.inputs, null, 2) })
42672
42995
  ] }),
42673
42996
  /* @__PURE__ */ jsxs("div", { children: [
42674
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Trait" }),
42997
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.trait") }),
42675
42998
  /* @__PURE__ */ jsx(Typography, { variant: "small", children: guard.context.traitName })
42676
42999
  ] })
42677
43000
  ] })
@@ -42689,9 +43012,9 @@ function GuardsPanel({ guards }) {
42689
43012
  ] })
42690
43013
  ] }),
42691
43014
  /* @__PURE__ */ jsxs(ButtonGroup, { children: [
42692
- /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: "All" }),
42693
- /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: "Passed" }),
42694
- /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "failed" ? "primary" : "secondary", onClick: () => setFilter("failed"), children: "Failed" })
43015
+ /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: t("debug.filterAll") }),
43016
+ /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: t("debug.filterPassed") }),
43017
+ /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "failed" ? "primary" : "secondary", onClick: () => setFilter("failed"), children: t("debug.filterFailed") })
42695
43018
  ] })
42696
43019
  ] }),
42697
43020
  /* @__PURE__ */ jsx("div", { className: "max-h-80 overflow-y-auto", children: /* @__PURE__ */ jsx(Accordion, { items: accordionItems }) })
@@ -42817,7 +43140,7 @@ function TransitionTimeline({ transitions }) {
42817
43140
  EmptyState,
42818
43141
  {
42819
43142
  title: t("debug.noTransitionsRecorded"),
42820
- description: "Transitions will appear as the state machine processes events",
43143
+ description: t("debug.transitionsProcessHint"),
42821
43144
  className: "py-8"
42822
43145
  }
42823
43146
  );
@@ -42834,10 +43157,7 @@ function TransitionTimeline({ transitions }) {
42834
43157
  const sorted = [...transitions].reverse();
42835
43158
  return /* @__PURE__ */ jsxs("div", { className: "debug-tab debug-tab--timeline", children: [
42836
43159
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-2", children: [
42837
- /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-gray-500", children: [
42838
- transitions.length,
42839
- " transitions recorded"
42840
- ] }),
43160
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-500", children: t("debug.transitionsRecorded", { count: transitions.length }) }),
42841
43161
  /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-1 text-xs text-gray-500 cursor-pointer", children: [
42842
43162
  /* @__PURE__ */ jsx(
42843
43163
  Checkbox,
@@ -42846,7 +43166,7 @@ function TransitionTimeline({ transitions }) {
42846
43166
  onChange: (e) => setAutoScroll(e.target.checked)
42847
43167
  }
42848
43168
  ),
42849
- "Auto-scroll"
43169
+ t("debug.autoScroll")
42850
43170
  ] })
42851
43171
  ] }),
42852
43172
  /* @__PURE__ */ jsx(
@@ -42889,15 +43209,13 @@ function TransitionTimeline({ transitions }) {
42889
43209
  variant: trace.guardResult ? "success" : "danger",
42890
43210
  size: "sm",
42891
43211
  children: [
42892
- "guard: ",
43212
+ t("debug.guardLabel"),
43213
+ " ",
42893
43214
  trace.guardResult ? "\u2713" : "\u2717"
42894
43215
  ]
42895
43216
  }
42896
43217
  ),
42897
- /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: [
42898
- trace.effects.length,
42899
- " effects"
42900
- ] })
43218
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: t("debug.effectsCount", { count: trace.effects.length }) })
42901
43219
  ] }),
42902
43220
  isExpanded && trace.effects.length > 0 && /* @__PURE__ */ jsx("div", { className: "ml-2 mt-1 mb-2 pl-2 border-l border-gray-200 dark:border-gray-700 space-y-1", children: trace.effects.map((effect, eIdx) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
42903
43221
  /* @__PURE__ */ jsx(EffectBadge, { effect }),
@@ -42946,13 +43264,13 @@ function ServerBridgeTab({ bridge }) {
42946
43264
  EmptyState,
42947
43265
  {
42948
43266
  title: t("debug.noBridgeData"),
42949
- description: "The ServerBridge has not been initialized. Bridge health will appear once the runtime connects to the server.",
43267
+ description: t("debug.bridgeInitHint"),
42950
43268
  className: "py-8"
42951
43269
  }
42952
43270
  );
42953
43271
  }
42954
43272
  const formatTime4 = (ts) => {
42955
- if (ts === 0) return "Never";
43273
+ if (ts === 0) return t("debug.never");
42956
43274
  const d = new Date(ts);
42957
43275
  return d.toLocaleTimeString("en-US", {
42958
43276
  hour12: false,
@@ -42965,14 +43283,14 @@ function ServerBridgeTab({ bridge }) {
42965
43283
  /* @__PURE__ */ jsxs(Card, { className: "p-3", children: [
42966
43284
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 mb-3", children: [
42967
43285
  /* @__PURE__ */ jsx("div", { className: `w-3 h-3 rounded-full ${bridge.connected ? "bg-green-500 animate-pulse" : "bg-red-500"}` }),
42968
- /* @__PURE__ */ jsx(Typography, { variant: "h6", children: bridge.connected ? "Connected" : "Disconnected" })
43286
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", children: bridge.connected ? t("debug.connected") : t("debug.disconnected") })
42969
43287
  ] }),
42970
43288
  /* @__PURE__ */ jsxs(Stack, { gap: "xs", children: [
42971
43289
  /* @__PURE__ */ jsx(
42972
43290
  StatRow,
42973
43291
  {
42974
43292
  label: t("debug.status"),
42975
- value: bridge.connected ? "Connected" : "Disconnected",
43293
+ value: bridge.connected ? t("debug.connected") : t("debug.disconnected"),
42976
43294
  variant: bridge.connected ? "success" : "danger"
42977
43295
  }
42978
43296
  ),
@@ -43000,13 +43318,10 @@ function ServerBridgeTab({ bridge }) {
43000
43318
  ] })
43001
43319
  ] }),
43002
43320
  bridge.lastError && /* @__PURE__ */ jsxs(Card, { className: "p-3 border-red-200 dark:border-red-800 bg-red-50 dark:bg-red-950", children: [
43003
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "semibold", className: "text-red-600 dark:text-red-400 mb-1", children: "Last Error" }),
43321
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "semibold", className: "text-red-600 dark:text-red-400 mb-1", children: t("debug.lastError") }),
43004
43322
  /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-red-500 font-mono break-all", children: bridge.lastError })
43005
43323
  ] }),
43006
- bridge.connected && /* @__PURE__ */ jsx("div", { className: "text-center py-2", children: /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-gray-400", children: [
43007
- bridge.eventsForwarded + bridge.eventsReceived,
43008
- " total events processed"
43009
- ] }) })
43324
+ bridge.connected && /* @__PURE__ */ jsx("div", { className: "text-center py-2", children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-400", children: t("debug.totalEventsProcessed", { count: bridge.eventsForwarded + bridge.eventsReceived }) }) })
43010
43325
  ] }) });
43011
43326
  }
43012
43327
  var init_ServerBridgeTab = __esm({
@@ -43116,7 +43431,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43116
43431
  EmptyState,
43117
43432
  {
43118
43433
  title: t("debug.noActiveTraits"),
43119
- description: "Traits will appear when the state machine initializes",
43434
+ description: t("debug.traitsInitHint"),
43120
43435
  className: "py-8"
43121
43436
  }
43122
43437
  );
@@ -43133,7 +43448,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43133
43448
  };
43134
43449
  return /* @__PURE__ */ jsxs("div", { className: "debug-tab debug-tab--dispatch", children: [
43135
43450
  /* @__PURE__ */ jsxs("div", { className: "mb-3", children: [
43136
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Active States" }),
43451
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.activeStates") }),
43137
43452
  /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: traits2.map((trait) => /* @__PURE__ */ jsxs(Badge, { variant: "success", size: "sm", children: [
43138
43453
  trait.name,
43139
43454
  ": ",
@@ -43141,8 +43456,8 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43141
43456
  ] }, trait.id)) })
43142
43457
  ] }),
43143
43458
  /* @__PURE__ */ jsxs("div", { className: "mb-3", children: [
43144
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Available Events" }),
43145
- availableEvents.length === 0 ? /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-400 italic", children: "No transitions from current state" }) : /* @__PURE__ */ jsx(Stack, { gap: "xs", children: availableEvents.map(({ event, transitions }) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
43459
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.availableEvents") }),
43460
+ availableEvents.length === 0 ? /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-400 italic", children: t("debug.noTransitionsFromState") }) : /* @__PURE__ */ jsx(Stack, { gap: "xs", children: availableEvents.map(({ event, transitions }) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
43146
43461
  /* @__PURE__ */ jsx(
43147
43462
  Button,
43148
43463
  {
@@ -43154,15 +43469,15 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43154
43469
  }
43155
43470
  ),
43156
43471
  /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-500", children: transitions.map((t2) => `${t2.from} -> ${t2.to}`).join(", ") }),
43157
- transitions.some((t2) => t2.guard) && /* @__PURE__ */ jsx(Badge, { variant: "warning", size: "sm", children: "guarded" })
43472
+ transitions.some((tr) => tr.guard) && /* @__PURE__ */ jsx(Badge, { variant: "warning", size: "sm", children: t("debug.guarded") })
43158
43473
  ] }, event)) })
43159
43474
  ] }),
43160
43475
  unavailableEvents.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mb-3", children: [
43161
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Other Events (not available from current state)" }),
43476
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.otherEvents") }),
43162
43477
  /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: unavailableEvents.map((event) => /* @__PURE__ */ jsx(Badge, { variant: "default", size: "sm", className: "opacity-50", children: event }, event)) })
43163
43478
  ] }),
43164
43479
  log18.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
43165
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Recent Transitions" }),
43480
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.recentTransitions") }),
43166
43481
  /* @__PURE__ */ jsx(Stack, { gap: "xs", children: log18.map((entry, i) => /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "font-mono text-xs", children: [
43167
43482
  /* @__PURE__ */ jsx("span", { className: "text-purple-400", children: entry.traitName }),
43168
43483
  " ",
@@ -43193,21 +43508,20 @@ var init_RuntimeDebugger = __esm({
43193
43508
  }
43194
43509
  });
43195
43510
  function ServerResponseRow({ sr }) {
43511
+ const { t } = useTranslate();
43196
43512
  const entityEntries = Object.entries(sr.dataEntities);
43197
43513
  return /* @__PURE__ */ jsxs("div", { className: "ml-4 pl-2 border-l border-purple-500/30 py-0.5 text-xs font-mono", children: [
43198
43514
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
43199
43515
  /* @__PURE__ */ jsxs("span", { className: sr.success ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400", children: [
43200
43516
  sr.success ? "\u2713" : "\u2717",
43201
- " server"
43517
+ " ",
43518
+ t("debug.server")
43202
43519
  ] }),
43203
43520
  /* @__PURE__ */ jsx("span", { className: "text-purple-600 dark:text-purple-300", children: sr.orbitalName }),
43204
- sr.clientEffects > 0 && /* @__PURE__ */ jsxs("span", { className: "px-1 rounded bg-purple-500/15 text-purple-600 dark:text-purple-300", children: [
43205
- sr.clientEffects,
43206
- " clientEffect",
43207
- sr.clientEffects !== 1 ? "s" : ""
43208
- ] }),
43521
+ sr.clientEffects > 0 && /* @__PURE__ */ jsx("span", { className: "px-1 rounded bg-purple-500/15 text-purple-600 dark:text-purple-300", children: t("debug.clientEffectsCount", { count: sr.clientEffects }) }),
43209
43522
  sr.emittedEvents.length > 0 && /* @__PURE__ */ jsxs("span", { className: "px-1 rounded bg-blue-500/15 text-blue-300", children: [
43210
- "emit: ",
43523
+ t("debug.emitLabel"),
43524
+ " ",
43211
43525
  sr.emittedEvents.join(", ")
43212
43526
  ] }),
43213
43527
  sr.error && /* @__PURE__ */ jsx("span", { className: "px-1 rounded bg-red-500/15 text-red-600 dark:text-red-400 truncate max-w-[300px]", children: sr.error })
@@ -43215,13 +43529,12 @@ function ServerResponseRow({ sr }) {
43215
43529
  entityEntries.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1 mt-0.5", children: entityEntries.map(([name, count]) => /* @__PURE__ */ jsxs("span", { className: "px-1 rounded bg-[var(--color-card)] text-foreground", children: [
43216
43530
  name,
43217
43531
  ": ",
43218
- count,
43219
- " row",
43220
- count !== 1 ? "s" : ""
43532
+ t("debug.rowsCount", { count })
43221
43533
  ] }, name)) })
43222
43534
  ] });
43223
43535
  }
43224
43536
  function TransitionRow({ trace }) {
43537
+ const { t } = useTranslate();
43225
43538
  const isServerEntry = !!trace.serverResponse && trace.traitName.startsWith("server:");
43226
43539
  const hasFailedEffects = trace.effects.some((e) => e.status === "failed");
43227
43540
  if (isServerEntry && trace.serverResponse) {
@@ -43229,7 +43542,7 @@ function TransitionRow({ trace }) {
43229
43542
  /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2 text-xs font-mono", children: [
43230
43543
  /* @__PURE__ */ jsx("span", { className: "mt-1.5 w-1.5 h-1.5 rounded-full flex-shrink-0 bg-purple-500" }),
43231
43544
  /* @__PURE__ */ jsx(Badge, { variant: "warning", size: "sm", className: "flex-shrink-0", children: trace.event }),
43232
- /* @__PURE__ */ jsx("span", { className: "text-purple-600 dark:text-purple-400 flex-shrink-0", children: "server response" })
43545
+ /* @__PURE__ */ jsx("span", { className: "text-purple-600 dark:text-purple-400 flex-shrink-0", children: t("debug.serverResponse") })
43233
43546
  ] }),
43234
43547
  /* @__PURE__ */ jsx(ServerResponseRow, { sr: trace.serverResponse })
43235
43548
  ] });
@@ -43270,6 +43583,7 @@ function VerifyModePanel({
43270
43583
  serverCount,
43271
43584
  localCount
43272
43585
  }) {
43586
+ const { t } = useTranslate();
43273
43587
  const [expanded, setExpanded] = React79.useState(true);
43274
43588
  const scrollRef = React79.useRef(null);
43275
43589
  const prevCountRef = React79.useRef(0);
@@ -43300,30 +43614,20 @@ function VerifyModePanel({
43300
43614
  onClick: () => setExpanded((v) => !v),
43301
43615
  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",
43302
43616
  "aria-expanded": expanded,
43303
- "aria-label": expanded ? "Collapse verification timeline" : "Expand verification timeline",
43617
+ "aria-label": expanded ? t("debug.collapseVerificationTimeline") : t("debug.expandVerificationTimeline"),
43304
43618
  "data-testid": "debugger-verify-toggle",
43305
43619
  children: [
43306
43620
  /* @__PURE__ */ jsx("span", { className: "text-foreground/50 w-3", "aria-hidden": true, children: expanded ? "\u25BE" : "\u25B8" }),
43307
- /* @__PURE__ */ jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? `${failedChecks} fail` : "OK" }),
43308
- /* @__PURE__ */ jsxs("span", { className: "text-foreground/70", children: [
43309
- localCount,
43310
- " local"
43311
- ] }),
43312
- /* @__PURE__ */ jsxs("span", { className: "text-purple-600 dark:text-purple-400", children: [
43313
- serverCount,
43314
- " server"
43315
- ] }),
43621
+ /* @__PURE__ */ jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? t("debug.failCount", { count: failedChecks }) : t("debug.ok") }),
43622
+ /* @__PURE__ */ jsx("span", { className: "text-foreground/70", children: t("debug.localCount", { count: localCount }) }),
43623
+ /* @__PURE__ */ jsx("span", { className: "text-purple-600 dark:text-purple-400", children: t("debug.serverCount", { count: serverCount }) }),
43316
43624
  traitStates && /* @__PURE__ */ jsx("span", { className: "text-cyan-600 dark:text-cyan-400 truncate max-w-[400px]", children: traitStates }),
43317
- !expanded && transitions.length > 0 && /* @__PURE__ */ jsxs("span", { className: "ml-auto text-foreground/50", children: [
43318
- transitions.length,
43319
- " transition",
43320
- transitions.length !== 1 ? "s" : ""
43321
- ] })
43625
+ !expanded && transitions.length > 0 && /* @__PURE__ */ jsx("span", { className: "ml-auto text-foreground/50", children: t("debug.transitionsCount", { count: transitions.length }) })
43322
43626
  ]
43323
43627
  }
43324
43628
  ),
43325
43629
  expanded && /* @__PURE__ */ jsxs("div", { className: "flex-1 flex overflow-hidden", children: [
43326
- /* @__PURE__ */ jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsx("div", { className: "px-2 py-1", children: transitions.length === 0 ? /* @__PURE__ */ jsx("div", { className: "text-foreground/50 text-xs font-mono py-2 text-center", children: "Waiting for transitions..." }) : /* @__PURE__ */ jsx("div", { className: "space-y-0.5", children: transitions.map((trace) => /* @__PURE__ */ jsx(TransitionRow, { trace }, trace.id)) }) }) }),
43630
+ /* @__PURE__ */ jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsx("div", { className: "px-2 py-1", children: transitions.length === 0 ? /* @__PURE__ */ jsx("div", { className: "text-foreground/50 text-xs font-mono py-2 text-center", children: t("debug.waitingForTransitions") }) : /* @__PURE__ */ jsx("div", { className: "space-y-0.5", children: transitions.map((trace) => /* @__PURE__ */ jsx(TransitionRow, { trace }, trace.id)) }) }) }),
43327
43631
  /* @__PURE__ */ jsx(WalkMinimap, {})
43328
43632
  ] })
43329
43633
  ]
@@ -43339,6 +43643,7 @@ function RuntimeDebugger({
43339
43643
  defaultTab,
43340
43644
  schema
43341
43645
  }) {
43646
+ const { t } = useTranslate();
43342
43647
  const [isCollapsed, setIsCollapsed] = React79.useState(mode === "verify" ? true : defaultCollapsed);
43343
43648
  const [isVisible, setIsVisible] = React79.useState(mode === "inline" || mode === "verify" || isDebugEnabled2());
43344
43649
  const debugData = useDebugData();
@@ -43377,55 +43682,55 @@ function RuntimeDebugger({
43377
43682
  const tabItems = [
43378
43683
  {
43379
43684
  id: "dispatch",
43380
- label: "Dispatch",
43685
+ label: t("debug.tabDispatch"),
43381
43686
  badge: debugData.traits.length || void 0,
43382
43687
  content: /* @__PURE__ */ jsx(EventDispatcherTab, { traits: debugData.traits, schema })
43383
43688
  },
43384
43689
  {
43385
43690
  id: "verify",
43386
- label: failedChecks > 0 ? "Verify (!)" : "Verify",
43691
+ label: failedChecks > 0 ? t("debug.tabVerifyAlert") : t("debug.tabVerify"),
43387
43692
  badge: verification.summary.totalChecks || void 0,
43388
43693
  content: /* @__PURE__ */ jsx(VerificationTab, { checks: verification.checks, summary: verification.summary })
43389
43694
  },
43390
43695
  {
43391
43696
  id: "timeline",
43392
- label: "Timeline",
43697
+ label: t("debug.tabTimeline"),
43393
43698
  badge: verification.transitions.length || void 0,
43394
43699
  content: /* @__PURE__ */ jsx(TransitionTimeline, { transitions: verification.transitions })
43395
43700
  },
43396
43701
  {
43397
43702
  id: "bridge",
43398
- label: "Bridge",
43703
+ label: t("debug.tabBridge"),
43399
43704
  badge: verification.bridge?.connected ? void 0 : 1,
43400
43705
  content: /* @__PURE__ */ jsx(ServerBridgeTab, { bridge: verification.bridge })
43401
43706
  },
43402
43707
  {
43403
43708
  id: "traits",
43404
- label: "Traits",
43709
+ label: t("debug.tabTraits"),
43405
43710
  badge: debugData.traits.length || void 0,
43406
43711
  content: /* @__PURE__ */ jsx(TraitsTab, { traits: debugData.traits })
43407
43712
  },
43408
43713
  {
43409
43714
  id: "ticks",
43410
- label: "Ticks",
43411
- badge: debugData.ticks.filter((t) => t.active).length || void 0,
43715
+ label: t("debug.tabTicks"),
43716
+ badge: debugData.ticks.filter((tick) => tick.active).length || void 0,
43412
43717
  content: /* @__PURE__ */ jsx(TicksTab, { ticks: debugData.ticks })
43413
43718
  },
43414
43719
  {
43415
43720
  id: "entities",
43416
- label: "Entities",
43721
+ label: t("debug.tabEntities"),
43417
43722
  badge: debugData.entitySnapshot?.runtime.length || void 0,
43418
43723
  content: /* @__PURE__ */ jsx(EntitiesTab, { snapshot: debugData.entitySnapshot })
43419
43724
  },
43420
43725
  {
43421
43726
  id: "events",
43422
- label: "Events",
43727
+ label: t("debug.tabEvents"),
43423
43728
  badge: debugData.events.length > 0 ? debugData.events.length : void 0,
43424
43729
  content: /* @__PURE__ */ jsx(EventFlowTab, { events: debugData.events })
43425
43730
  },
43426
43731
  {
43427
43732
  id: "guards",
43428
- label: "Guards",
43733
+ label: t("debug.tabGuards"),
43429
43734
  badge: debugData.guards.filter((g) => !g.result).length || void 0,
43430
43735
  content: /* @__PURE__ */ jsx(GuardsPanel, { guards: debugData.guards })
43431
43736
  }
@@ -43453,15 +43758,10 @@ function RuntimeDebugger({
43453
43758
  children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
43454
43759
  /* @__PURE__ */ jsxs(Typography, { variant: "h6", style: { fontSize: "0.75rem" }, children: [
43455
43760
  isCollapsed ? "\u25B6" : "\u25BC",
43456
- " Debugger"
43761
+ " ",
43762
+ t("debug.debugger")
43457
43763
  ] }),
43458
- failedChecks > 0 ? /* @__PURE__ */ jsxs(Badge, { variant: "danger", size: "sm", children: [
43459
- failedChecks,
43460
- " failed"
43461
- ] }) : debugData.traits.length > 0 ? /* @__PURE__ */ jsxs(Badge, { variant: "success", size: "sm", children: [
43462
- debugData.traits.length,
43463
- " traits"
43464
- ] }) : /* @__PURE__ */ jsx(Badge, { variant: "info", size: "sm", children: "Idle" })
43764
+ failedChecks > 0 ? /* @__PURE__ */ jsx(Badge, { variant: "danger", size: "sm", children: t("debug.failedCount", { count: failedChecks }) }) : debugData.traits.length > 0 ? /* @__PURE__ */ jsx(Badge, { variant: "success", size: "sm", children: t("debug.traitsCount", { count: debugData.traits.length }) }) : /* @__PURE__ */ jsx(Badge, { variant: "info", size: "sm", children: t("debug.idle") })
43465
43765
  ] })
43466
43766
  }
43467
43767
  ),
@@ -43479,9 +43779,9 @@ function RuntimeDebugger({
43479
43779
  );
43480
43780
  }
43481
43781
  if (mode === "verify") {
43482
- const traitStates = debugData.traits.map((t) => `${t.name}:${t.currentState}`).join(" | ");
43483
- const serverEntries = verification.transitions.filter((t) => t.serverResponse);
43484
- const localEntries = verification.transitions.filter((t) => !t.serverResponse);
43782
+ const traitStates = debugData.traits.map((t2) => `${t2.name}:${t2.currentState}`).join(" | ");
43783
+ const serverEntries = verification.transitions.filter((t2) => t2.serverResponse);
43784
+ const localEntries = verification.transitions.filter((t2) => !t2.serverResponse);
43485
43785
  return /* @__PURE__ */ jsx(
43486
43786
  VerifyModePanel,
43487
43787
  {
@@ -43513,7 +43813,7 @@ function RuntimeDebugger({
43513
43813
  variant: "secondary",
43514
43814
  size: "sm",
43515
43815
  className: "runtime-debugger__toggle",
43516
- title: "Open Debugger (`)",
43816
+ title: t("debug.openDebugger"),
43517
43817
  children: failedChecks > 0 ? /* @__PURE__ */ jsxs("span", { className: "relative", children: [
43518
43818
  /* @__PURE__ */ jsx("span", { children: "V" }),
43519
43819
  /* @__PURE__ */ jsx("span", { className: "absolute -top-1 -right-2 w-2 h-2 bg-red-500 rounded-full" })
@@ -43523,11 +43823,8 @@ function RuntimeDebugger({
43523
43823
  /* @__PURE__ */ jsxs("div", { className: "runtime-debugger__header", children: [
43524
43824
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
43525
43825
  /* @__PURE__ */ jsx("span", { className: "text-lg", children: "V" }),
43526
- /* @__PURE__ */ jsx(Typography, { variant: "h6", children: "KFlow Verifier" }),
43527
- failedChecks > 0 ? /* @__PURE__ */ jsxs(Badge, { variant: "danger", size: "sm", children: [
43528
- failedChecks,
43529
- " failed"
43530
- ] }) : verification.summary.totalChecks > 0 ? /* @__PURE__ */ jsx(Badge, { variant: "success", size: "sm", children: "All passing" }) : /* @__PURE__ */ jsx(Badge, { variant: "info", size: "sm", children: "Runtime" })
43826
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", children: t("debug.kflowVerifier") }),
43827
+ failedChecks > 0 ? /* @__PURE__ */ jsx(Badge, { variant: "danger", size: "sm", children: t("debug.failedCount", { count: failedChecks }) }) : verification.summary.totalChecks > 0 ? /* @__PURE__ */ jsx(Badge, { variant: "success", size: "sm", children: t("debug.allPassing") }) : /* @__PURE__ */ jsx(Badge, { variant: "info", size: "sm", children: t("debug.runtime") })
43531
43828
  ] }),
43532
43829
  /* @__PURE__ */ jsx(
43533
43830
  Button,
@@ -43535,7 +43832,7 @@ function RuntimeDebugger({
43535
43832
  onClick: () => setIsCollapsed(true),
43536
43833
  variant: "ghost",
43537
43834
  size: "sm",
43538
- title: "Close (`)",
43835
+ title: t("debug.close"),
43539
43836
  children: "x"
43540
43837
  }
43541
43838
  )
@@ -43549,7 +43846,7 @@ function RuntimeDebugger({
43549
43846
  className: "runtime-debugger__tabs"
43550
43847
  }
43551
43848
  ) }),
43552
- /* @__PURE__ */ jsx("div", { className: "runtime-debugger__footer", children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-foreground/50", children: "Press ` to toggle | window.__orbitalVerification for automation" }) })
43849
+ /* @__PURE__ */ jsx("div", { className: "runtime-debugger__footer", children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-foreground/50", children: t("debug.toggleHint") }) })
43553
43850
  ] })
43554
43851
  }
43555
43852
  );
@@ -43575,6 +43872,7 @@ var init_RuntimeDebugger2 = __esm({
43575
43872
  init_TransitionTimeline();
43576
43873
  init_ServerBridgeTab();
43577
43874
  init_EventDispatcherTab();
43875
+ init_useTranslate();
43578
43876
  init_RuntimeDebugger();
43579
43877
  RuntimeDebugger.displayName = "RuntimeDebugger";
43580
43878
  }
@@ -44974,7 +45272,7 @@ var init_StatCard = __esm({
44974
45272
  }
44975
45273
  );
44976
45274
  }
44977
- const label = schemaStats?.[0]?.label || labelToUse || "Stat";
45275
+ const label = schemaStats?.[0]?.label || labelToUse || t("statCard.defaultLabel");
44978
45276
  const normalizedPropValue = Array.isArray(propValue) ? propValue[0] ?? propValue.length : propValue;
44979
45277
  const value = schemaStats?.[0]?.value ?? normalizedPropValue ?? 0;
44980
45278
  const trendDirection = manualDirection || (calculatedTrend === void 0 || calculatedTrend === 0 ? "neutral" : calculatedTrend > 0 ? "up" : "down");
@@ -45017,7 +45315,7 @@ var init_StatCard = __esm({
45017
45315
  ]
45018
45316
  }
45019
45317
  ),
45020
- /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", as: "span", children: "vs last period" })
45318
+ /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", as: "span", children: t("statCard.vsLastPeriod") })
45021
45319
  ] }),
45022
45320
  subtitle && !calculatedTrend && /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", children: subtitle })
45023
45321
  ] }),