@almadar/ui 5.21.7 → 5.21.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1963,7 +1963,10 @@ var en_default;
1963
1963
  var init_en = __esm({
1964
1964
  "locales/en.json"() {
1965
1965
  en_default = {
1966
- $meta: { locale: "en", direction: "ltr" },
1966
+ $meta: {
1967
+ locale: "en",
1968
+ direction: "ltr"
1969
+ },
1967
1970
  "common.save": "Save",
1968
1971
  "common.cancel": "Cancel",
1969
1972
  "common.delete": "Delete",
@@ -2105,7 +2108,6 @@ var init_en = __esm({
2105
2108
  "error.somethingWentWrong": "Something went wrong",
2106
2109
  "error.loadingItems": "Loading items...",
2107
2110
  "error.noItemsFound": "No items found",
2108
- "error.notFound": "Not found",
2109
2111
  "debug.noEntityData": "No entity data",
2110
2112
  "debug.noEntities": "No entities",
2111
2113
  "debug.noTicks": "No ticks registered",
@@ -2137,7 +2139,298 @@ var init_en = __esm({
2137
2139
  "template.showcase": "Showcase",
2138
2140
  "template.faq": "Frequently Asked Questions",
2139
2141
  "template.ourTeam": "Our Team",
2140
- "template.caseStudies": "Case Studies"
2142
+ "template.caseStudies": "Case Studies",
2143
+ "richBlockEditor.toolbar.text": "Text",
2144
+ "richBlockEditor.toolbar.h1": "H1",
2145
+ "richBlockEditor.toolbar.h2": "H2",
2146
+ "richBlockEditor.toolbar.h3": "H3",
2147
+ "richBlockEditor.toolbar.bulletList": "Bullet list",
2148
+ "richBlockEditor.toolbar.numbered": "Numbered",
2149
+ "richBlockEditor.toolbar.quote": "Quote",
2150
+ "richBlockEditor.toolbar.code": "Code",
2151
+ "richBlockEditor.toolbar.divider": "Divider",
2152
+ "richBlockEditor.toolbar.image": "Image",
2153
+ "richBlockEditor.blockType.paragraph": "Text",
2154
+ "richBlockEditor.blockType.heading1": "Heading 1",
2155
+ "richBlockEditor.blockType.heading2": "Heading 2",
2156
+ "richBlockEditor.blockType.heading3": "Heading 3",
2157
+ "richBlockEditor.blockType.bulletList": "Bullet list",
2158
+ "richBlockEditor.blockType.numberedList": "Numbered list",
2159
+ "richBlockEditor.blockType.quote": "Quote",
2160
+ "richBlockEditor.blockType.code": "Code",
2161
+ "richBlockEditor.blockType.divider": "Divider",
2162
+ "richBlockEditor.blockType.image": "Image",
2163
+ "richBlockEditor.blockActions": "Block actions",
2164
+ "richBlockEditor.duplicate": "Duplicate",
2165
+ "richBlockEditor.turnInto": "Turn into",
2166
+ "richBlockEditor.placeholder.heading1": "Heading 1",
2167
+ "richBlockEditor.placeholder.heading2": "Heading 2",
2168
+ "richBlockEditor.placeholder.heading3": "Heading 3",
2169
+ "richBlockEditor.placeholder.quote": "Quote",
2170
+ "richBlockEditor.placeholder.code": "Enter code",
2171
+ "richBlockEditor.placeholder.paragraph": "Start writing...",
2172
+ "richBlockEditor.placeholder.listItem": "List item",
2173
+ "richBlockEditor.placeholder.caption": "Caption (optional)",
2174
+ "richBlockEditor.aria.heading1Block": "Heading 1 block",
2175
+ "richBlockEditor.aria.heading2Block": "Heading 2 block",
2176
+ "richBlockEditor.aria.heading3Block": "Heading 3 block",
2177
+ "richBlockEditor.aria.quoteBlock": "Quote block",
2178
+ "richBlockEditor.aria.codeBlock": "Code block",
2179
+ "richBlockEditor.aria.codeLanguage": "Code language",
2180
+ "richBlockEditor.aria.imageUrl": "Image URL",
2181
+ "richBlockEditor.aria.imageCaption": "Image caption",
2182
+ "richBlockEditor.aria.listItem": "List item",
2183
+ "richBlockEditor.aria.removeListItem": "Remove list item",
2184
+ "richBlockEditor.aria.paragraphBlock": "Paragraph block",
2185
+ "richBlockEditor.embeddedImage": "Embedded image",
2186
+ "richBlockEditor.noImageUrl": "No image URL set",
2187
+ "richBlockEditor.addItem": "Add item",
2188
+ "richBlockEditor.insertParagraphBelow": "Insert paragraph below",
2189
+ "richBlockEditor.editorToolbar": "Block editor toolbar",
2190
+ "richBlockEditor.insertEntry": "Insert {{label}}",
2191
+ "versionDiff.compare": "Compare",
2192
+ "versionDiff.to": "to",
2193
+ "versionDiff.beforeRevision": "Before revision",
2194
+ "versionDiff.afterRevision": "After revision",
2195
+ "versionDiff.switchToInline": "Switch to inline view",
2196
+ "versionDiff.switchToSideBySide": "Switch to side-by-side view",
2197
+ "versionDiff.revert": "Revert",
2198
+ "versionDiff.byAuthor": " by {{author}}",
2199
+ "violationAlert.actionType.measure": "Corrective Measure",
2200
+ "violationAlert.actionType.admin": "Administrative Action",
2201
+ "violationAlert.actionType.penalty": "Penalty Proceedings",
2202
+ "violationAlert.fallbackMessage": "Violation",
2203
+ "violationAlert.adminLabel": "Admin:",
2204
+ "violationAlert.penaltyLabel": "Penalty:",
2205
+ "violationAlert.goToField": "Go to field",
2206
+ "branchingLogic.title": "Branching logic",
2207
+ "branchingLogic.if": "If",
2208
+ "branchingLogic.goTo": "go to",
2209
+ "branchingLogic.rules": "Rules",
2210
+ "branchingLogic.logicGraph": "Logic graph",
2211
+ "branchingLogic.addRule": "Add rule",
2212
+ "branchingLogic.deleteRule": "Delete rule",
2213
+ "branchingLogic.endOfSurvey": "End of survey",
2214
+ "branchingLogic.brokenReference": "Broken reference",
2215
+ "branchingLogic.selectQuestion": "Select question",
2216
+ "branchingLogic.selectTarget": "Select target",
2217
+ "branchingLogic.selectValue": "Select value",
2218
+ "branchingLogic.addValue": "Add value",
2219
+ "branchingLogic.value": "Value",
2220
+ "branchingLogic.typeValuePressEnter": "Type value, press Enter",
2221
+ "branchingLogic.operatorEquals": "equals",
2222
+ "branchingLogic.operatorNotEquals": "does not equal",
2223
+ "branchingLogic.operatorContains": "contains",
2224
+ "branchingLogic.operatorIn": "is one of",
2225
+ "branchingLogic.graphAriaLabel": "Branching logic graph",
2226
+ "branchingLogic.ruleCountOne": "{{count}} rule",
2227
+ "branchingLogic.ruleCountOther": "{{count}} rules",
2228
+ "branchingLogic.brokenCount": "{{count}} broken",
2229
+ "branchingLogic.emptyNoQuestions": "Add questions before building branching rules.",
2230
+ "branchingLogic.emptyNoRules": "No rules yet. Add a rule to define branching logic.",
2231
+ "filterGroup.filters": "Filters",
2232
+ "filterGroup.all": "All",
2233
+ "filterGroup.clear": "Clear",
2234
+ "filterGroup.clearAll": "Clear all",
2235
+ "filterGroup.from": "From",
2236
+ "filterGroup.to": "To",
2237
+ "filterGroup.allOf": "All {{label}}",
2238
+ "filterGroup.activeCount": "{{count}} active",
2239
+ "debug.guardEvaluationsHint": "Guard evaluations will appear when transitions or ticks with guards execute",
2240
+ "debug.expression": "Expression",
2241
+ "debug.inputs": "Inputs",
2242
+ "debug.trait": "Trait",
2243
+ "debug.filterAll": "All",
2244
+ "debug.filterPassed": "Passed",
2245
+ "debug.filterFailed": "Failed",
2246
+ "debug.traitsInitHint": "Traits will appear when the state machine initializes",
2247
+ "debug.traitsMountHint": "Traits will appear when components using them are mounted",
2248
+ "debug.activeStates": "Active States",
2249
+ "debug.availableEvents": "Available Events",
2250
+ "debug.noTransitionsFromState": "No transitions from current state",
2251
+ "debug.guarded": "guarded",
2252
+ "debug.otherEvents": "Other Events (not available from current state)",
2253
+ "debug.recentTransitions": "Recent Transitions",
2254
+ "debug.transitionsCount": "{{count}} transitions",
2255
+ "debug.states": "States",
2256
+ "debug.transitions": "Transitions",
2257
+ "debug.guards": "Guards",
2258
+ "debug.debugModeHint": "Debug mode may not be enabled",
2259
+ "debug.entitiesSpawnHint": "Entities will appear when spawned",
2260
+ "debug.singleton": "Singleton",
2261
+ "debug.singletonsCount": "Singletons ({{count}})",
2262
+ "debug.runtimeCount": "Runtime ({{count}})",
2263
+ "debug.moreEntities": "+{{count}} more entities",
2264
+ "debug.persistent": "Persistent",
2265
+ "debug.loadedCount": "{{count}} loaded",
2266
+ "debug.notLoaded": "not loaded",
2267
+ "debug.eventsExecuteHint": "Events will appear as traits, ticks, and other systems execute",
2268
+ "debug.allCount": "All ({{count}})",
2269
+ "debug.autoScroll": "Auto-scroll",
2270
+ "debug.transitionsProcessHint": "Transitions will appear as the state machine processes events",
2271
+ "debug.transitionsRecorded": "{{count}} transitions recorded",
2272
+ "debug.guardLabel": "guard:",
2273
+ "debug.effectsCount": "{{count}} effects",
2274
+ "debug.bridgeInitHint": "The ServerBridge has not been initialized. Bridge health will appear once the runtime connects to the server.",
2275
+ "debug.never": "Never",
2276
+ "debug.connected": "Connected",
2277
+ "debug.disconnected": "Disconnected",
2278
+ "debug.lastError": "Last Error",
2279
+ "debug.totalEventsProcessed": "{{count}} total events processed",
2280
+ "debug.server": "server",
2281
+ "debug.clientEffectsCount": "{{count}} clientEffects",
2282
+ "debug.emitLabel": "emit:",
2283
+ "debug.rowsCount": "{{count}} rows",
2284
+ "debug.serverResponse": "server response",
2285
+ "debug.collapseVerificationTimeline": "Collapse verification timeline",
2286
+ "debug.expandVerificationTimeline": "Expand verification timeline",
2287
+ "debug.failCount": "{{count}} fail",
2288
+ "debug.ok": "OK",
2289
+ "debug.localCount": "{{count}} local",
2290
+ "debug.serverCount": "{{count}} server",
2291
+ "debug.waitingForTransitions": "Waiting for transitions...",
2292
+ "debug.tabDispatch": "Dispatch",
2293
+ "debug.tabVerify": "Verify",
2294
+ "debug.tabVerifyAlert": "Verify (!)",
2295
+ "debug.tabTimeline": "Timeline",
2296
+ "debug.tabBridge": "Bridge",
2297
+ "debug.tabTraits": "Traits",
2298
+ "debug.tabTicks": "Ticks",
2299
+ "debug.tabEntities": "Entities",
2300
+ "debug.tabEvents": "Events",
2301
+ "debug.tabGuards": "Guards",
2302
+ "debug.debugger": "Debugger",
2303
+ "debug.failedCount": "{{count}} failed",
2304
+ "debug.traitsCount": "{{count}} traits",
2305
+ "debug.idle": "Idle",
2306
+ "debug.openDebugger": "Open Debugger (`)",
2307
+ "debug.kflowVerifier": "KFlow Verifier",
2308
+ "debug.allPassing": "All passing",
2309
+ "debug.runtime": "Runtime",
2310
+ "debug.close": "Close (`)",
2311
+ "debug.toggleHint": "Press ` to toggle | window.__orbitalVerification for automation",
2312
+ "replyTree.expandReplies": "Expand replies",
2313
+ "replyTree.collapseReplies": "Collapse replies",
2314
+ "replyTree.voteOnReplyBy": "Vote on reply by {{author}}",
2315
+ "replyTree.replyTo": "Reply to {{author}}",
2316
+ "replyTree.replyToPlaceholder": "Reply to {{author}}\u2026",
2317
+ "replyTree.reply": "Reply",
2318
+ "replyTree.flagReplyBy": "Flag reply by {{author}}",
2319
+ "replyTree.flag": "Flag",
2320
+ "replyTree.send": "Send",
2321
+ "replyTree.continueThread": "Continue thread",
2322
+ "replyTree.noRepliesYet": "No replies yet.",
2323
+ "signaturePad.label": "Signature",
2324
+ "signaturePad.helperText": "Draw your signature above",
2325
+ "signaturePad.clear": "Clear",
2326
+ "signaturePad.confirm": "Confirm",
2327
+ "qrScanner.cameraUnavailable": "Camera unavailable",
2328
+ "qrScanner.paused": "Paused",
2329
+ "qrScanner.resumeScanning": "Resume scanning",
2330
+ "qrScanner.pauseScanning": "Pause scanning",
2331
+ "qrScanner.switchToFrontCamera": "Switch to front camera",
2332
+ "qrScanner.switchToRearCamera": "Switch to rear camera",
2333
+ "qrScanner.mockScan": "Mock Scan",
2334
+ "docSearch.placeholder": "Search documentation...",
2335
+ "stateMachine.loading": "Loading state machine\u2026",
2336
+ "stateMachine.noStateMachine": "No state machine to visualize",
2337
+ "avl.trigger": "Trigger",
2338
+ "avl.guard": "Guard",
2339
+ "avl.effects": "Effects",
2340
+ "avl.props": "Props",
2341
+ "avl.entity": "Entity",
2342
+ "avl.traits": "Traits",
2343
+ "avl.transition": "Transition",
2344
+ "avl.onEntity": "on {{entity}}",
2345
+ "avl.linkedTo": "linked to {{entity}}",
2346
+ "avl.pressEscToZoomOut": "Press Esc to zoom out",
2347
+ "avl.zoomIn": "Zoom in",
2348
+ "avl.zoomOut": "Zoom out",
2349
+ "avl.orbitalLabel": "Orbital: {{name}}",
2350
+ "avl.orbitalLabelHighlighted": "Orbital: {{name}} (highlighted)",
2351
+ "avl.noTraitData": "No trait data",
2352
+ "avl.computingLayout": "Computing layout...",
2353
+ "avl.noStateMachine": "No state machine",
2354
+ "avl.listensFor": "listens for {{event}}",
2355
+ "avl.emits": "emits {{event}}",
2356
+ "avl.pageLayout": "Page Layout",
2357
+ "avl.overlaySuffix": "(overlay)",
2358
+ "orbPreview.previewBadge": "Preview",
2359
+ "orbPreview.doubleClickToOpen": "Double-click to open",
2360
+ "orbPreview.dropToAddAndOpen": "Drop to add and open",
2361
+ "orbPreview.dispatching": "Coordinator is dispatching to this orbital",
2362
+ "orbPreview.noPreview": "No preview available",
2363
+ "orbPreview.screensCount": "{{count}} screens",
2364
+ "detailView.noTransitionData": "No transition data",
2365
+ "orbInspector.required": "req",
2366
+ "orbInspector.addField": "Add Field",
2367
+ "orbInspector.serviceMode": "Service Mode",
2368
+ "orbInspector.standalone": "Standalone",
2369
+ "orbInspector.embedded": "Embedded",
2370
+ "orbInspector.rendersOwnUi": "Renders its own UI",
2371
+ "orbInspector.headless": "Headless, wired to other behaviors",
2372
+ "orbInspector.addEffect": "Add Effect",
2373
+ "orbInspector.guardExpression": "Guard expression",
2374
+ "orbInspector.selectPatternForStyles": "Select a pattern to view its style tokens.",
2375
+ "orbInspector.tokens": "Tokens",
2376
+ "orbInspector.noTokenContract": "No token contract declared for this pattern.",
2377
+ "orbInspector.variant": "Variant",
2378
+ "orbInspector.size": "Size",
2379
+ "orbInspector.statesCount": "{{count}} states",
2380
+ "orbInspector.onEntity": " on {{entity}}",
2381
+ "orbInspector.projectThemeTokens": "Project theme tokens",
2382
+ "orbInspector.tokenGroup.colors": "Colors",
2383
+ "orbInspector.tokenGroup.radii": "Radii",
2384
+ "orbInspector.tokenGroup.spacing": "Spacing",
2385
+ "orbInspector.tokenGroup.shadows": "Shadows",
2386
+ "orbInspector.tab.inspector": "Inspector",
2387
+ "orbInspector.tab.styles": "Styles",
2388
+ "orbInspector.tab.code": "Code",
2389
+ "canvas.goBackToOverview": "Go back to overview",
2390
+ "canvas.overview": "Overview",
2391
+ "canvas.expanded": "Expanded",
2392
+ "canvas.modulesCount": "{{count}} modules",
2393
+ "canvas.screensCount": "{{count}} screens",
2394
+ "canvas.switchToView": "Switch to {{label}} view",
2395
+ "lawReference.viewFullText": "View full law text",
2396
+ "statCard.defaultLabel": "Stat",
2397
+ "statCard.vsLastPeriod": "vs last period",
2398
+ "mediaGallery.upload": "Upload",
2399
+ "mediaGallery.noMediaDescription": "No media items to display.",
2400
+ "pagination.jumpPlaceholder": "Page",
2401
+ "table.selectRow": "Select row {{id}}",
2402
+ "card.selectItem": "Select {{item}}",
2403
+ "card.itemFallback": "item",
2404
+ "fileTree.noFiles": "No files",
2405
+ "masterDetail.selectItem": "Select an item to view details",
2406
+ "empty.createFirst": "Create your first item to get started.",
2407
+ "upload.dropOrBrowse": "Drop files here or click to browse",
2408
+ "upload.dropFilesHere": "Drop files here",
2409
+ "upload.accepted": "Accepted: {{accept}}",
2410
+ "upload.maxSize": "Max size: {{size}}",
2411
+ "upload.maxFiles": "Up to {{count}} files",
2412
+ "upload.error.maxFiles": "Maximum {{count}} files allowed",
2413
+ "upload.error.invalidType": "Invalid file type: {{name}}",
2414
+ "upload.error.tooLarge": "File too large: {{name}} (max {{size}})",
2415
+ "optionConstraint.requiredOne": "Required, pick 1",
2416
+ "optionConstraint.optionalOne": "Optional, pick up to 1",
2417
+ "optionConstraint.pickExactly": "Pick exactly {{count}}",
2418
+ "optionConstraint.pickRange": "Pick {{min}}-{{max}}",
2419
+ "optionConstraint.pickAtLeast": "Pick at least {{count}}",
2420
+ "optionConstraint.pickUpTo": "Pick up to {{count}}",
2421
+ "optionConstraint.optional": "Optional",
2422
+ "optionConstraint.outOfStock": "Out of stock",
2423
+ "optionConstraint.error.pickOne": "Pick 1 option",
2424
+ "optionConstraint.error.pickOnlyOne": "Pick only 1 option",
2425
+ "optionConstraint.error.pickMore": "Pick at least {{count}} more",
2426
+ "optionConstraint.error.removeOptions": "Remove {{count}} options",
2427
+ "stateMachine.pinned": "Pinned",
2428
+ "stateMachine.eventCount": "{{count}} events",
2429
+ "stateMachine.externalEffects": "External Effects",
2430
+ "stateMachine.legend.initial": "Initial",
2431
+ "stateMachine.legend.final": "Final",
2432
+ "stateMachine.legend.state": "State",
2433
+ "stateMachine.legend.multiEvent": "Multi-event"
2141
2434
  };
2142
2435
  }
2143
2436
  });
@@ -5225,6 +5518,7 @@ var init_LawReferenceTooltip = __esm({
5225
5518
  init_Typography();
5226
5519
  init_Divider();
5227
5520
  init_cn();
5521
+ init_useTranslate();
5228
5522
  positionStyles2 = {
5229
5523
  top: "bottom-full left-1/2 -translate-x-1/2 mb-2",
5230
5524
  bottom: "top-full left-1/2 -translate-x-1/2 mt-2",
@@ -5243,6 +5537,7 @@ var init_LawReferenceTooltip = __esm({
5243
5537
  position = "top",
5244
5538
  className
5245
5539
  }) => {
5540
+ const { t } = useTranslate();
5246
5541
  const [isVisible, setIsVisible] = React85__namespace.default.useState(false);
5247
5542
  const timeoutRef = React85__namespace.default.useRef(null);
5248
5543
  const handleMouseEnter = () => {
@@ -5326,7 +5621,7 @@ var init_LawReferenceTooltip = __esm({
5326
5621
  target: "_blank",
5327
5622
  rel: "noopener noreferrer",
5328
5623
  onClick: (e) => e.stopPropagation(),
5329
- children: "View full law text"
5624
+ children: t("lawReference.viewFullText")
5330
5625
  }
5331
5626
  )
5332
5627
  ] }),
@@ -13607,6 +13902,7 @@ var log7, SWIM_GUTTER, CENTER_W, BehaviorView;
13607
13902
  var init_BehaviorView = __esm({
13608
13903
  "components/avl/molecules/BehaviorView.tsx"() {
13609
13904
  "use client";
13905
+ init_useTranslate();
13610
13906
  init_AvlState();
13611
13907
  init_AvlTransitionLane();
13612
13908
  init_AvlSwimLane();
@@ -13616,6 +13912,7 @@ var init_BehaviorView = __esm({
13616
13912
  SWIM_GUTTER = 120;
13617
13913
  CENTER_W = 360;
13618
13914
  BehaviorView = ({ data }) => {
13915
+ const { t } = useTranslate();
13619
13916
  const [layout, setLayout] = React85.useState(null);
13620
13917
  const traitName = data.traits[0]?.name;
13621
13918
  const traitData = traitName ? data.traitDetails[traitName] : void 0;
@@ -13625,10 +13922,10 @@ var init_BehaviorView = __esm({
13625
13922
  computeTraitLayout(traitData).then(setLayout).catch((err) => log7.error("compute-trait-layout-failed", { error: err instanceof Error ? err : String(err) }));
13626
13923
  }, [dataKey]);
13627
13924
  if (!traitData) {
13628
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: "No trait data" });
13925
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: t("avl.noTraitData") });
13629
13926
  }
13630
13927
  if (!layout) {
13631
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: "Computing layout..." });
13928
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: t("avl.computingLayout") });
13632
13929
  }
13633
13930
  const hasExternal = traitData.listenedEvents.length > 0 || traitData.emittedEvents.length > 0;
13634
13931
  const viewW = hasExternal ? SWIM_GUTTER + CENTER_W + SWIM_GUTTER : CENTER_W + 60;
@@ -13644,10 +13941,7 @@ var init_BehaviorView = __esm({
13644
13941
  const machineHeight = scaledH + 100;
13645
13942
  const renderMachine = /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
13646
13943
  /* @__PURE__ */ jsxRuntime.jsx("text", { x: CENTER_W / 2, y: 20, textAnchor: "middle", fill: "var(--color-foreground)", fontSize: 18, fontWeight: "700", fontFamily: "inherit", children: traitData.name }),
13647
- /* @__PURE__ */ jsxRuntime.jsxs("text", { x: CENTER_W / 2, y: 36, textAnchor: "middle", fill: "var(--color-muted-foreground)", fontSize: 11, opacity: 0.5, fontFamily: "inherit", children: [
13648
- "on ",
13649
- traitData.linkedEntity
13650
- ] }),
13944
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: CENTER_W / 2, y: 36, textAnchor: "middle", fill: "var(--color-muted-foreground)", fontSize: 11, opacity: 0.5, fontFamily: "inherit", children: t("avl.onEntity", { entity: traitData.linkedEntity }) }),
13651
13945
  /* @__PURE__ */ jsxRuntime.jsxs("defs", { children: [
13652
13946
  /* @__PURE__ */ jsxRuntime.jsx("marker", { id: "bvArrow", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: CONNECTION_COLORS.forward.color, opacity: 0.7 }) }),
13653
13947
  /* @__PURE__ */ jsxRuntime.jsx("marker", { id: "bvArrowBack", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: CONNECTION_COLORS.backward.color, opacity: 0.5 }) })
@@ -13955,7 +14249,7 @@ var init_CodeBlock = __esm({
13955
14249
  const isLolo = language === "lolo";
13956
14250
  const activeStyle = isOrb ? orbStyle : isLolo ? loloStyle : dark__default.default;
13957
14251
  const eventBus = useEventBus();
13958
- const { t: _t } = useTranslate();
14252
+ const { t } = useTranslate();
13959
14253
  const scrollRef = React85.useRef(null);
13960
14254
  const codeRef = React85.useRef(null);
13961
14255
  const savedScrollLeftRef = React85.useRef(0);
@@ -14210,7 +14504,7 @@ var init_CodeBlock = __esm({
14210
14504
  size: "sm",
14211
14505
  onClick: handleCopy,
14212
14506
  className: "opacity-0 group-hover:opacity-100 focus:opacity-100 transition-opacity text-muted-foreground hover:text-white",
14213
- "aria-label": "Copy code",
14507
+ "aria-label": t("common.copy"),
14214
14508
  children: copied ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "check", className: "w-4 h-4 text-green-400" }) : /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "copy", className: "w-4 h-4" })
14215
14509
  }
14216
14510
  )
@@ -14431,9 +14725,18 @@ var init_MarkdownContent = __esm({
14431
14725
  );
14432
14726
  }
14433
14727
  return /* @__PURE__ */ jsxRuntime.jsx(
14434
- "span",
14728
+ "code",
14435
14729
  {
14730
+ ...props,
14731
+ className: codeClassName,
14436
14732
  style: {
14733
+ backgroundColor: "var(--color-muted)",
14734
+ color: "var(--color-foreground)",
14735
+ border: "1px solid var(--color-border)",
14736
+ padding: "0.125rem 0.375rem",
14737
+ borderRadius: "0.25rem",
14738
+ fontSize: "0.875em",
14739
+ fontFamily: "ui-monospace, monospace",
14437
14740
  whiteSpace: "pre-wrap",
14438
14741
  wordBreak: "break-word"
14439
14742
  },
@@ -14856,7 +15159,7 @@ var init_StateMachineView = __esm({
14856
15159
  const endX2 = fromState.x + Math.cos(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
14857
15160
  const endY2 = fromState.y + Math.sin(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
14858
15161
  const isSingle2 = bundle.labels.length === 1;
14859
- const labelText2 = isSingle2 ? bundle.labels[0].event : `${bundle.labels.length} events`;
15162
+ const labelText2 = isSingle2 ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
14860
15163
  const bundleColor2 = isSingle2 ? config.colors.arrow : "var(--color-accent)";
14861
15164
  const labelWidth2 = labelText2.length * 9 + (isSingle2 ? 24 : 40);
14862
15165
  const cx = fromState.x;
@@ -14982,7 +15285,7 @@ var init_StateMachineView = __esm({
14982
15285
  const controlX = midX + perpX;
14983
15286
  const controlY = midY + perpY;
14984
15287
  const isSingle = bundle.labels.length === 1;
14985
- const labelText = isSingle ? bundle.labels[0].event : `${bundle.labels.length} events`;
15288
+ const labelText = isSingle ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
14986
15289
  const labelWidth = labelText.length * 9 + (isSingle ? 24 : 40);
14987
15290
  const bundleColor = isSingle ? config.colors.arrow : "var(--color-accent)";
14988
15291
  const curveMidpoint = {
@@ -15137,7 +15440,7 @@ var init_StateMachineView = __esm({
15137
15440
  {
15138
15441
  className: "absolute -top-2 left-1/2 transform -translate-x-1/2 px-2 py-0.5 rounded-full",
15139
15442
  style: { backgroundColor: "var(--color-success)" },
15140
- children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: "Pinned" })
15443
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: t("stateMachine.pinned") })
15141
15444
  }
15142
15445
  ),
15143
15446
  !isSingle && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -15159,10 +15462,7 @@ var init_StateMachineView = __esm({
15159
15462
  {
15160
15463
  className: "ml-2 px-2 py-0.5 rounded-full",
15161
15464
  style: { backgroundColor: "var(--color-accent)" },
15162
- children: /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: [
15163
- bundle.labels.length,
15164
- " events"
15165
- ] })
15465
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: t("stateMachine.eventCount", { count: bundle.labels.length }) })
15166
15466
  }
15167
15467
  )
15168
15468
  ]
@@ -15307,7 +15607,7 @@ var init_StateMachineView = __esm({
15307
15607
  align: "center",
15308
15608
  className: "mb-2",
15309
15609
  style: { color: "var(--color-warning)", fontSize: "13px" },
15310
- children: "External Effects"
15610
+ children: t("stateMachine.externalEffects")
15311
15611
  }
15312
15612
  ),
15313
15613
  outputs.outputs.map((output, idx) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -15327,10 +15627,10 @@ var init_StateMachineView = __esm({
15327
15627
  Legend = ({ config, y }) => {
15328
15628
  const { t } = useTranslate();
15329
15629
  const items = [
15330
- { label: "Initial", color: config.colors.initialNode },
15331
- { label: "Final", color: config.colors.finalNode },
15332
- { label: "State", color: config.colors.nodeBorder },
15333
- { label: "Multi-event", color: "var(--color-accent)" }
15630
+ { key: "initial", label: t("stateMachine.legend.initial"), color: config.colors.initialNode, isMultiEvent: false },
15631
+ { key: "final", label: t("stateMachine.legend.final"), color: config.colors.finalNode, isMultiEvent: false },
15632
+ { key: "state", label: t("stateMachine.legend.state"), color: config.colors.nodeBorder, isMultiEvent: false },
15633
+ { key: "multiEvent", label: t("stateMachine.legend.multiEvent"), color: "var(--color-accent)", isMultiEvent: true }
15334
15634
  ];
15335
15635
  return /* @__PURE__ */ jsxRuntime.jsx(
15336
15636
  HStack,
@@ -15345,8 +15645,8 @@ var init_StateMachineView = __esm({
15345
15645
  {
15346
15646
  className: "w-3 h-3 rounded-full",
15347
15647
  style: {
15348
- backgroundColor: item.label === "Multi-event" ? item.color : config.colors.node,
15349
- border: item.label !== "Multi-event" ? `2px solid ${item.color}` : "none"
15648
+ backgroundColor: item.isMultiEvent ? item.color : config.colors.node,
15649
+ border: !item.isMultiEvent ? `2px solid ${item.color}` : "none"
15350
15650
  }
15351
15651
  }
15352
15652
  ),
@@ -15358,7 +15658,7 @@ var init_StateMachineView = __esm({
15358
15658
  children: item.label
15359
15659
  }
15360
15660
  )
15361
- ] }, item.label))
15661
+ ] }, item.key))
15362
15662
  }
15363
15663
  );
15364
15664
  };
@@ -16152,13 +16452,13 @@ var init_JazariStateMachine = __esm({
16152
16452
  );
16153
16453
  }, [resolvedTrait, entityFields]);
16154
16454
  if (isLoading) {
16155
- return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: "Loading state machine\u2026" });
16455
+ return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: t("stateMachine.loading") });
16156
16456
  }
16157
16457
  if (error) {
16158
16458
  return /* @__PURE__ */ jsxRuntime.jsx(ErrorState, { message: error instanceof Error ? error.message : String(error) });
16159
16459
  }
16160
16460
  if (!resolvedTrait || !layoutData || layoutData.states.length === 0) {
16161
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { padding: "lg", className: cn("text-center", className), children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", className: "opacity-60", children: "No state machine to visualize" }) });
16461
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { padding: "lg", className: cn("text-center", className), children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", className: "opacity-60", children: t("stateMachine.noStateMachine") }) });
16162
16462
  }
16163
16463
  return /* @__PURE__ */ jsxRuntime.jsx(
16164
16464
  StateMachineView,
@@ -17202,13 +17502,13 @@ var init_LayoutPatterns = __esm({
17202
17502
  function generateRuleId() {
17203
17503
  return `rule-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
17204
17504
  }
17205
- function questionsToOptions(questions, includeEndOfSurvey) {
17505
+ function questionsToOptions(questions, endOfSurveyLabel) {
17206
17506
  const opts = questions.map((q) => ({
17207
17507
  value: q.id,
17208
17508
  label: q.label
17209
17509
  }));
17210
- if (includeEndOfSurvey) {
17211
- opts.push({ value: END_OF_SURVEY, label: "End of survey" });
17510
+ if (endOfSurveyLabel !== null) {
17511
+ opts.push({ value: END_OF_SURVEY, label: endOfSurveyLabel });
17212
17512
  }
17213
17513
  return opts;
17214
17514
  }
@@ -17217,7 +17517,7 @@ function isRuleBroken(rule, questions) {
17217
17517
  const targetExists = rule.targetQuestionId === END_OF_SURVEY || questions.some((q) => q.id === rule.targetQuestionId);
17218
17518
  return !sourceExists || !targetExists;
17219
17519
  }
17220
- var END_OF_SURVEY, OPERATOR_OPTIONS, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph, BranchingLogicBuilder;
17520
+ var END_OF_SURVEY, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph, BranchingLogicBuilder;
17221
17521
  var init_BranchingLogicBuilder = __esm({
17222
17522
  "components/core/molecules/BranchingLogicBuilder.tsx"() {
17223
17523
  "use client";
@@ -17230,14 +17530,9 @@ var init_BranchingLogicBuilder = __esm({
17230
17530
  init_FilterPill();
17231
17531
  init_Box();
17232
17532
  init_useEventBus();
17533
+ init_useTranslate();
17233
17534
  init_cn();
17234
17535
  END_OF_SURVEY = "end-of-survey";
17235
- OPERATOR_OPTIONS = [
17236
- { value: "equals", label: "equals" },
17237
- { value: "not-equals", label: "does not equal" },
17238
- { value: "contains", label: "contains" },
17239
- { value: "in", label: "is one of" }
17240
- ];
17241
17536
  RuleRow = ({
17242
17537
  rule,
17243
17538
  questions,
@@ -17246,8 +17541,21 @@ var init_BranchingLogicBuilder = __esm({
17246
17541
  onChange,
17247
17542
  onDelete
17248
17543
  }) => {
17249
- const sourceOptions = React85.useMemo(() => questionsToOptions(questions, false), [questions]);
17250
- const targetOptions = React85.useMemo(() => questionsToOptions(questions, true), [questions]);
17544
+ const { t } = useTranslate();
17545
+ const operatorOptions = React85.useMemo(
17546
+ () => [
17547
+ { value: "equals", label: t("branchingLogic.operatorEquals") },
17548
+ { value: "not-equals", label: t("branchingLogic.operatorNotEquals") },
17549
+ { value: "contains", label: t("branchingLogic.operatorContains") },
17550
+ { value: "in", label: t("branchingLogic.operatorIn") }
17551
+ ],
17552
+ [t]
17553
+ );
17554
+ const sourceOptions = React85.useMemo(() => questionsToOptions(questions, null), [questions]);
17555
+ const targetOptions = React85.useMemo(
17556
+ () => questionsToOptions(questions, t("branchingLogic.endOfSurvey")),
17557
+ [questions, t]
17558
+ );
17251
17559
  const sourceQuestion = questions.find((q) => q.id === rule.sourceQuestionId);
17252
17560
  const valueOptions = React85.useMemo(() => {
17253
17561
  if (!sourceQuestion?.optionValues) return [];
@@ -17292,22 +17600,22 @@ var init_BranchingLogicBuilder = __esm({
17292
17600
  ),
17293
17601
  children: [
17294
17602
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-wrap items-center gap-2", children: [
17295
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "semibold", className: "shrink-0", children: "If" }),
17603
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "semibold", className: "shrink-0", children: t("branchingLogic.if") }),
17296
17604
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsxRuntime.jsx(
17297
17605
  Select,
17298
17606
  {
17299
17607
  options: sourceOptions,
17300
17608
  value: rule.sourceQuestionId,
17301
- placeholder: "Select question",
17609
+ placeholder: t("branchingLogic.selectQuestion"),
17302
17610
  onChange: handleSource,
17303
17611
  disabled: readOnly,
17304
- error: broken ? "Broken reference" : void 0
17612
+ error: broken ? t("branchingLogic.brokenReference") : void 0
17305
17613
  }
17306
17614
  ) }),
17307
17615
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[8rem] basis-32", children: /* @__PURE__ */ jsxRuntime.jsx(
17308
17616
  Select,
17309
17617
  {
17310
- options: OPERATOR_OPTIONS,
17618
+ options: operatorOptions,
17311
17619
  value: rule.operator,
17312
17620
  onChange: handleOperator,
17313
17621
  disabled: readOnly
@@ -17330,7 +17638,7 @@ var init_BranchingLogicBuilder = __esm({
17330
17638
  {
17331
17639
  options: valueOptions.filter((o) => !chips.includes(o.value)),
17332
17640
  value: "",
17333
- placeholder: "Add value",
17641
+ placeholder: t("branchingLogic.addValue"),
17334
17642
  onChange: handleAddChip,
17335
17643
  disabled: readOnly
17336
17644
  }
@@ -17338,7 +17646,7 @@ var init_BranchingLogicBuilder = __esm({
17338
17646
  Input,
17339
17647
  {
17340
17648
  inputType: "text",
17341
- placeholder: "Type value, press Enter",
17649
+ placeholder: t("branchingLogic.typeValuePressEnter"),
17342
17650
  value: "",
17343
17651
  onKeyDown: (e) => {
17344
17652
  if (e.key !== "Enter") return;
@@ -17356,7 +17664,7 @@ var init_BranchingLogicBuilder = __esm({
17356
17664
  {
17357
17665
  options: valueOptions,
17358
17666
  value: scalarValue,
17359
- placeholder: "Select value",
17667
+ placeholder: t("branchingLogic.selectValue"),
17360
17668
  onChange: (e) => onChange({ ...rule, value: e.target.value }),
17361
17669
  disabled: readOnly
17362
17670
  }
@@ -17364,7 +17672,7 @@ var init_BranchingLogicBuilder = __esm({
17364
17672
  Input,
17365
17673
  {
17366
17674
  inputType: "text",
17367
- placeholder: "Value",
17675
+ placeholder: t("branchingLogic.value"),
17368
17676
  value: scalarValue,
17369
17677
  onChange: handleScalarValue,
17370
17678
  disabled: readOnly
@@ -17372,17 +17680,17 @@ var init_BranchingLogicBuilder = __esm({
17372
17680
  ) }),
17373
17681
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "label", weight: "semibold", className: "shrink-0 inline-flex items-center gap-1", children: [
17374
17682
  /* @__PURE__ */ jsxRuntime.jsx(LucideIcons2.ArrowRight, { className: "h-4 w-4" }),
17375
- "go to"
17683
+ t("branchingLogic.goTo")
17376
17684
  ] }),
17377
17685
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsxRuntime.jsx(
17378
17686
  Select,
17379
17687
  {
17380
17688
  options: targetOptions,
17381
17689
  value: rule.targetQuestionId,
17382
- placeholder: "Select target",
17690
+ placeholder: t("branchingLogic.selectTarget"),
17383
17691
  onChange: handleTarget,
17384
17692
  disabled: readOnly,
17385
- error: broken && rule.targetQuestionId !== END_OF_SURVEY ? "Broken reference" : void 0
17693
+ error: broken && rule.targetQuestionId !== END_OF_SURVEY ? t("branchingLogic.brokenReference") : void 0
17386
17694
  }
17387
17695
  ) }),
17388
17696
  !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
@@ -17394,11 +17702,11 @@ var init_BranchingLogicBuilder = __esm({
17394
17702
  action: "DELETE_RULE",
17395
17703
  actionPayload: { ruleId: rule.id },
17396
17704
  onClick: onDelete,
17397
- "aria-label": "Delete rule"
17705
+ "aria-label": t("branchingLogic.deleteRule")
17398
17706
  }
17399
17707
  )
17400
17708
  ] }),
17401
- broken && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "error", size: "sm", label: "Broken reference" })
17709
+ broken && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "error", size: "sm", label: t("branchingLogic.brokenReference") })
17402
17710
  ]
17403
17711
  }
17404
17712
  );
@@ -17408,10 +17716,12 @@ var init_BranchingLogicBuilder = __esm({
17408
17716
  NODE_GAP_Y = 80;
17409
17717
  PADDING = 32;
17410
17718
  LogicGraph = ({ questions, rules }) => {
17719
+ const { t } = useTranslate();
17720
+ const endOfSurveyLabel = t("branchingLogic.endOfSurvey");
17411
17721
  const layout = React85.useMemo(() => {
17412
17722
  const items = [
17413
17723
  ...questions.map((q) => ({ id: q.id, label: q.label, isEnd: false })),
17414
- { id: END_OF_SURVEY, label: "End of survey", isEnd: true }
17724
+ { id: END_OF_SURVEY, label: endOfSurveyLabel, isEnd: true }
17415
17725
  ];
17416
17726
  const positions = {};
17417
17727
  items.forEach((item, i) => {
@@ -17423,14 +17733,14 @@ var init_BranchingLogicBuilder = __esm({
17423
17733
  const width = NODE_WIDTH + PADDING * 2 + 220;
17424
17734
  const height = PADDING * 2 + items.length * (NODE_HEIGHT + NODE_GAP_Y);
17425
17735
  return { items, positions, width, height };
17426
- }, [questions]);
17736
+ }, [questions, endOfSurveyLabel]);
17427
17737
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "overflow-auto rounded-container border border-border bg-card p-2", children: /* @__PURE__ */ jsxRuntime.jsxs(
17428
17738
  "svg",
17429
17739
  {
17430
17740
  width: layout.width,
17431
17741
  height: layout.height,
17432
17742
  role: "img",
17433
- "aria-label": "Branching logic graph",
17743
+ "aria-label": t("branchingLogic.graphAriaLabel"),
17434
17744
  style: { display: "block" },
17435
17745
  children: [
17436
17746
  /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -17538,6 +17848,7 @@ var init_BranchingLogicBuilder = __esm({
17538
17848
  readOnly = false,
17539
17849
  className
17540
17850
  }) => {
17851
+ const { t } = useTranslate();
17541
17852
  const eventBus = useEventBus();
17542
17853
  const questions = Array.isArray(questionsProp) ? questionsProp : [];
17543
17854
  const rulesInitial = Array.isArray(rulesProp) ? rulesProp : [];
@@ -17590,16 +17901,23 @@ var init_BranchingLogicBuilder = __esm({
17590
17901
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-wrap items-center justify-between gap-2", children: [
17591
17902
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-2", children: [
17592
17903
  /* @__PURE__ */ jsxRuntime.jsx(LucideIcons2.GitBranch, { className: "h-5 w-5 text-foreground" }),
17593
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "subheading", weight: "semibold", children: "Branching logic" }),
17904
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "subheading", weight: "semibold", children: t("branchingLogic.title") }),
17594
17905
  /* @__PURE__ */ jsxRuntime.jsx(
17595
17906
  Badge,
17596
17907
  {
17597
17908
  variant: "neutral",
17598
17909
  size: "sm",
17599
- label: `${rules.length} rule${rules.length === 1 ? "" : "s"}`
17910
+ label: rules.length === 1 ? t("branchingLogic.ruleCountOne", { count: rules.length }) : t("branchingLogic.ruleCountOther", { count: rules.length })
17600
17911
  }
17601
17912
  ),
17602
- brokenCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "error", size: "sm", label: `${brokenCount} broken` })
17913
+ brokenCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
17914
+ Badge,
17915
+ {
17916
+ variant: "error",
17917
+ size: "sm",
17918
+ label: t("branchingLogic.brokenCount", { count: brokenCount })
17919
+ }
17920
+ )
17603
17921
  ] }),
17604
17922
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-1 rounded-sm border border-border bg-card p-0.5", children: [
17605
17923
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -17610,7 +17928,7 @@ var init_BranchingLogicBuilder = __esm({
17610
17928
  leftIcon: LucideIcons2.Pencil,
17611
17929
  action: "VIEW_EDIT",
17612
17930
  onClick: () => setView("edit"),
17613
- children: "Rules"
17931
+ children: t("branchingLogic.rules")
17614
17932
  }
17615
17933
  ),
17616
17934
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -17621,13 +17939,13 @@ var init_BranchingLogicBuilder = __esm({
17621
17939
  leftIcon: LucideIcons2.Eye,
17622
17940
  action: "VIEW_GRAPH",
17623
17941
  onClick: () => setView("graph"),
17624
- children: "Logic graph"
17942
+ children: t("branchingLogic.logicGraph")
17625
17943
  }
17626
17944
  )
17627
17945
  ] })
17628
17946
  ] }),
17629
17947
  view === "edit" ? /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-col gap-2", children: [
17630
- rules.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(Card, { variant: "bordered", padding: "lg", className: "text-center", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", color: "muted", children: noQuestions ? "Add questions before building branching rules." : "No rules yet. Add a rule to define branching logic." }) }) : rules.map((rule) => /* @__PURE__ */ jsxRuntime.jsx(
17948
+ rules.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(Card, { variant: "bordered", padding: "lg", className: "text-center", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", color: "muted", children: noQuestions ? t("branchingLogic.emptyNoQuestions") : t("branchingLogic.emptyNoRules") }) }) : rules.map((rule) => /* @__PURE__ */ jsxRuntime.jsx(
17631
17949
  RuleRow,
17632
17950
  {
17633
17951
  rule,
@@ -17648,7 +17966,7 @@ var init_BranchingLogicBuilder = __esm({
17648
17966
  action: "ADD_RULE",
17649
17967
  onClick: handleAddRule,
17650
17968
  disabled: noQuestions,
17651
- children: "Add rule"
17969
+ children: t("branchingLogic.addRule")
17652
17970
  }
17653
17971
  ) })
17654
17972
  ] }) : /* @__PURE__ */ jsxRuntime.jsx(LogicGraph, { questions, rules })
@@ -18275,7 +18593,7 @@ function CalendarGrid({
18275
18593
  onClick: stepPrev,
18276
18594
  "aria-disabled": !canPrev || void 0,
18277
18595
  "aria-label": t("aria.previousDays"),
18278
- children: "Prev"
18596
+ children: t("nav.previous")
18279
18597
  }
18280
18598
  ),
18281
18599
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground", children: formatDateRange(visibleDays[0], visibleDays[visibleDays.length - 1]) }),
@@ -18288,7 +18606,7 @@ function CalendarGrid({
18288
18606
  onClick: stepNext,
18289
18607
  "aria-disabled": !canNext || void 0,
18290
18608
  "aria-label": t("aria.nextDays"),
18291
- children: "Next"
18609
+ children: t("nav.next")
18292
18610
  }
18293
18611
  )
18294
18612
  ] }),
@@ -19838,7 +20156,7 @@ var init_Pagination = __esm({
19838
20156
  type: "number",
19839
20157
  value: jumpToPage,
19840
20158
  onChange: (e) => setJumpToPage(e.target.value),
19841
- placeholder: "Page",
20159
+ placeholder: t("pagination.jumpPlaceholder"),
19842
20160
  className: "w-20",
19843
20161
  onKeyDown: (e) => {
19844
20162
  if (e.key === "Enter") {
@@ -19976,13 +20294,10 @@ var init_CardGrid = __esm({
19976
20294
  return children;
19977
20295
  }
19978
20296
  if (isLoading) {
19979
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "col-span-full text-center py-8 text-muted-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", color: "secondary", children: "Loading items..." }) });
20297
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "col-span-full text-center py-8 text-muted-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", color: "secondary", children: t("loading.items") }) });
19980
20298
  }
19981
20299
  if (error) {
19982
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "col-span-full text-center py-8 text-error", children: /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "body", color: "error", children: [
19983
- "Error loading items: ",
19984
- error.message
19985
- ] }) });
20300
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "col-span-full text-center py-8 text-error", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", color: "error", children: t("error.loadFailed", { message: error.message }) }) });
19986
20301
  }
19987
20302
  if (normalizedData.length === 0) {
19988
20303
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "col-span-full text-center py-12 text-muted-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", color: "secondary", children: t("empty.noItems") || "No items found" }) });
@@ -23848,7 +24163,7 @@ function DataGrid({
23848
24163
  onChange: () => toggleSelection(id),
23849
24164
  onClick: (e) => e.stopPropagation(),
23850
24165
  className: "w-4 h-4 mt-1 flex-shrink-0 accent-primary",
23851
- "aria-label": `Select ${titleValue !== void 0 ? String(titleValue) : "item"}`
24166
+ "aria-label": t("card.selectItem", { item: titleValue !== void 0 ? String(titleValue) : t("card.itemFallback") })
23852
24167
  }
23853
24168
  ),
23854
24169
  /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "xs", className: "flex-1 min-w-0", children: [
@@ -24046,7 +24361,7 @@ function formatDate3(value) {
24046
24361
  if (isNaN(d.getTime())) return String(value);
24047
24362
  return d.toLocaleDateString(void 0, { year: "numeric", month: "short", day: "numeric" });
24048
24363
  }
24049
- function formatValue2(value, format) {
24364
+ function formatValue2(value, format, boolLabels) {
24050
24365
  if (value === void 0 || value === null) return "";
24051
24366
  switch (format) {
24052
24367
  case "date":
@@ -24058,7 +24373,7 @@ function formatValue2(value, format) {
24058
24373
  case "percent":
24059
24374
  return typeof value === "number" ? `${Math.round(value)}%` : String(value);
24060
24375
  case "boolean":
24061
- return value ? "Yes" : "No";
24376
+ return value ? boolLabels?.yes ?? "Yes" : boolLabels?.no ?? "No";
24062
24377
  default:
24063
24378
  return String(value);
24064
24379
  }
@@ -24354,7 +24669,7 @@ function DataList({
24354
24669
  field.label ?? fieldLabel3(field.name),
24355
24670
  ":"
24356
24671
  ] }),
24357
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: formatValue2(value, field.format) })
24672
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
24358
24673
  ] }, field.name);
24359
24674
  }) }),
24360
24675
  progressFields.map((field) => {
@@ -24484,6 +24799,7 @@ var init_FileTree = __esm({
24484
24799
  init_Box();
24485
24800
  init_Typography();
24486
24801
  init_Icon();
24802
+ init_useTranslate();
24487
24803
  TreeNodeItem = ({
24488
24804
  node,
24489
24805
  depth,
@@ -24569,8 +24885,9 @@ var init_FileTree = __esm({
24569
24885
  className,
24570
24886
  indent = 16
24571
24887
  }) => {
24888
+ const { t } = useTranslate();
24572
24889
  if (tree.length === 0) {
24573
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "muted", children: "No files" }) });
24890
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "muted", children: t("fileTree.noFiles") }) });
24574
24891
  }
24575
24892
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `py-1 overflow-y-auto ${className ?? ""}`, role: "tree", children: tree.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
24576
24893
  TreeNodeItem,
@@ -24689,6 +25006,7 @@ var init_FilterGroup = __esm({
24689
25006
  init_Icon();
24690
25007
  init_useEventBus();
24691
25008
  init_useQuerySingleton();
25009
+ init_useTranslate();
24692
25010
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
24693
25011
  lookStyles6 = {
24694
25012
  toolbar: "",
@@ -24709,6 +25027,7 @@ var init_FilterGroup = __esm({
24709
25027
  isLoading,
24710
25028
  look = "toolbar"
24711
25029
  }) => {
25030
+ const { t } = useTranslate();
24712
25031
  const eventBus = useEventBus();
24713
25032
  const queryState = useQuerySingleton(query);
24714
25033
  const [selectedValues, setSelectedValues] = React85.useState(
@@ -24790,7 +25109,7 @@ var init_FilterGroup = __esm({
24790
25109
  "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24791
25110
  !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24792
25111
  ),
24793
- children: "All"
25112
+ children: t("filterGroup.all")
24794
25113
  }
24795
25114
  ),
24796
25115
  filter.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -24818,7 +25137,7 @@ var init_FilterGroup = __esm({
24818
25137
  size: "sm",
24819
25138
  onClick: handleClearAll,
24820
25139
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24821
- children: "Clear"
25140
+ children: t("filterGroup.clear")
24822
25141
  }
24823
25142
  )
24824
25143
  ]
@@ -24829,7 +25148,7 @@ var init_FilterGroup = __esm({
24829
25148
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", lookStyles6[look], className), children: [
24830
25149
  showIcon && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
24831
25150
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4" }),
24832
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
25151
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
24833
25152
  ] }),
24834
25153
  filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
24835
25154
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-xs font-bold text-muted-foreground uppercase tracking-wide", children: filter.label }),
@@ -24852,7 +25171,7 @@ var init_FilterGroup = __esm({
24852
25171
  `${filter.field}_from`,
24853
25172
  e.target.value || null
24854
25173
  ),
24855
- placeholder: "From",
25174
+ placeholder: t("filterGroup.from"),
24856
25175
  clearable: true,
24857
25176
  onClear: () => handleFilterSelect(`${filter.field}_from`, null)
24858
25177
  }
@@ -24866,7 +25185,7 @@ var init_FilterGroup = __esm({
24866
25185
  `${filter.field}_to`,
24867
25186
  e.target.value || null
24868
25187
  ),
24869
- placeholder: "To",
25188
+ placeholder: t("filterGroup.to"),
24870
25189
  clearable: true,
24871
25190
  onClear: () => handleFilterSelect(`${filter.field}_to`, null)
24872
25191
  }
@@ -24886,7 +25205,7 @@ var init_FilterGroup = __esm({
24886
25205
  value: selectedValues[filter.field] || "all",
24887
25206
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24888
25207
  options: [
24889
- { value: "all", label: "All" },
25208
+ { value: "all", label: t("filterGroup.all") },
24890
25209
  ...filter.options?.map((opt) => ({
24891
25210
  value: opt,
24892
25211
  label: opt
@@ -24903,7 +25222,7 @@ var init_FilterGroup = __esm({
24903
25222
  onClick: handleClearAll,
24904
25223
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24905
25224
  className: "self-start",
24906
- children: "Clear all"
25225
+ children: t("filterGroup.clearAll")
24907
25226
  }
24908
25227
  )
24909
25228
  ] });
@@ -24969,7 +25288,7 @@ var init_FilterGroup = __esm({
24969
25288
  value: selectedValues[filter.field] || "all",
24970
25289
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24971
25290
  options: [
24972
- { value: "all", label: `All ${filter.label}` },
25291
+ { value: "all", label: t("filterGroup.allOf", { label: filter.label }) },
24973
25292
  ...filter.options?.map((opt) => ({
24974
25293
  value: opt,
24975
25294
  label: opt
@@ -24998,7 +25317,7 @@ var init_FilterGroup = __esm({
24998
25317
  field
24999
25318
  );
25000
25319
  }),
25001
- /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
25320
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: t("filterGroup.clearAll") })
25002
25321
  ] })
25003
25322
  ]
25004
25323
  }
@@ -25023,7 +25342,7 @@ var init_FilterGroup = __esm({
25023
25342
  className: "text-muted-foreground",
25024
25343
  children: [
25025
25344
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4" }),
25026
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
25345
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
25027
25346
  ]
25028
25347
  }
25029
25348
  ),
@@ -25049,7 +25368,7 @@ var init_FilterGroup = __esm({
25049
25368
  `${filter.field}_from`,
25050
25369
  e.target.value || null
25051
25370
  ),
25052
- placeholder: "From",
25371
+ placeholder: t("filterGroup.from"),
25053
25372
  clearable: true,
25054
25373
  onClear: () => handleFilterSelect(`${filter.field}_from`, null),
25055
25374
  className: "min-w-[130px]"
@@ -25065,7 +25384,7 @@ var init_FilterGroup = __esm({
25065
25384
  `${filter.field}_to`,
25066
25385
  e.target.value || null
25067
25386
  ),
25068
- placeholder: "To",
25387
+ placeholder: t("filterGroup.to"),
25069
25388
  clearable: true,
25070
25389
  onClear: () => handleFilterSelect(`${filter.field}_to`, null),
25071
25390
  className: "min-w-[130px]"
@@ -25087,7 +25406,7 @@ var init_FilterGroup = __esm({
25087
25406
  value: selectedValues[filter.field] || "all",
25088
25407
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
25089
25408
  options: [
25090
- { value: "all", label: "All" },
25409
+ { value: "all", label: t("filterGroup.all") },
25091
25410
  ...filter.options?.map((opt) => ({
25092
25411
  value: opt,
25093
25412
  label: opt
@@ -25098,10 +25417,7 @@ var init_FilterGroup = __esm({
25098
25417
  )
25099
25418
  ] }, filter.field)),
25100
25419
  activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: "ml-auto", children: [
25101
- /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "primary", size: "md", children: [
25102
- activeFilterCount,
25103
- " active"
25104
- ] }),
25420
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "md", children: t("filterGroup.activeCount", { count: activeFilterCount }) }),
25105
25421
  /* @__PURE__ */ jsxRuntime.jsx(
25106
25422
  Button,
25107
25423
  {
@@ -25109,7 +25425,7 @@ var init_FilterGroup = __esm({
25109
25425
  size: "sm",
25110
25426
  onClick: handleClearAll,
25111
25427
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
25112
- children: "Clear all"
25428
+ children: t("filterGroup.clearAll")
25113
25429
  }
25114
25430
  )
25115
25431
  ] })
@@ -26053,19 +26369,20 @@ var init_RepeatableFormSection = __esm({
26053
26369
  RepeatableFormSection.displayName = "RepeatableFormSection";
26054
26370
  }
26055
26371
  });
26056
- var actionTypeLabels, actionTypeIcons, ViolationAlert;
26372
+ var actionTypeLabelKeys, actionTypeIcons, ViolationAlert;
26057
26373
  var init_ViolationAlert = __esm({
26058
26374
  "components/core/molecules/ViolationAlert.tsx"() {
26059
26375
  init_cn();
26376
+ init_useTranslate();
26060
26377
  init_Box();
26061
26378
  init_Stack();
26062
26379
  init_Typography();
26063
26380
  init_Button();
26064
26381
  init_Icon();
26065
- actionTypeLabels = {
26066
- measure: "Corrective Measure",
26067
- admin: "Administrative Action",
26068
- penalty: "Penalty Proceedings"
26382
+ actionTypeLabelKeys = {
26383
+ measure: "violationAlert.actionType.measure",
26384
+ admin: "violationAlert.actionType.admin",
26385
+ penalty: "violationAlert.actionType.penalty"
26069
26386
  };
26070
26387
  actionTypeIcons = {
26071
26388
  measure: "alert-triangle",
@@ -26082,10 +26399,11 @@ var init_ViolationAlert = __esm({
26082
26399
  className,
26083
26400
  ...flatProps
26084
26401
  }) => {
26402
+ const { t } = useTranslate();
26085
26403
  const resolvedViolation = violation ?? {
26086
26404
  law: "",
26087
26405
  article: "",
26088
- message: flatProps.message ?? "Violation",
26406
+ message: flatProps.message ?? t("violationAlert.fallbackMessage"),
26089
26407
  actionType: "measure"
26090
26408
  };
26091
26409
  const effectiveSeverity = severity ?? (resolvedViolation.actionType === "measure" ? "warning" : "error");
@@ -26170,7 +26488,7 @@ var init_ViolationAlert = __esm({
26170
26488
  {
26171
26489
  variant: "caption",
26172
26490
  className: cn(textColor, "opacity-75"),
26173
- children: actionTypeLabels[resolvedViolation.actionType]
26491
+ children: t(actionTypeLabelKeys[resolvedViolation.actionType])
26174
26492
  }
26175
26493
  )
26176
26494
  ] })
@@ -26201,7 +26519,7 @@ var init_ViolationAlert = __esm({
26201
26519
  {
26202
26520
  variant: "caption",
26203
26521
  className: cn(textColor, "opacity-75"),
26204
- children: "Admin:"
26522
+ children: t("violationAlert.adminLabel")
26205
26523
  }
26206
26524
  ),
26207
26525
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -26220,7 +26538,7 @@ var init_ViolationAlert = __esm({
26220
26538
  {
26221
26539
  variant: "caption",
26222
26540
  className: cn(textColor, "opacity-75"),
26223
- children: "Penalty:"
26541
+ children: t("violationAlert.penaltyLabel")
26224
26542
  }
26225
26543
  ),
26226
26544
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -26245,7 +26563,7 @@ var init_ViolationAlert = __esm({
26245
26563
  className: cn(textColor, "self-start"),
26246
26564
  children: [
26247
26565
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "arrow-right", size: "sm", className: "mr-1" }),
26248
- "Go to field"
26566
+ t("violationAlert.goToField")
26249
26567
  ]
26250
26568
  }
26251
26569
  )
@@ -26561,6 +26879,7 @@ var init_LineChart = __esm({
26561
26879
  "use client";
26562
26880
  init_cn();
26563
26881
  init_atoms2();
26882
+ init_useTranslate();
26564
26883
  LineChart2 = ({
26565
26884
  data,
26566
26885
  width = 400,
@@ -26572,6 +26891,7 @@ var init_LineChart = __esm({
26572
26891
  areaColor = "var(--color-primary)",
26573
26892
  className
26574
26893
  }) => {
26894
+ const { t } = useTranslate();
26575
26895
  const gradientId = React85.useId();
26576
26896
  const safeData = data ?? [];
26577
26897
  const sortedData = React85.useMemo(() => {
@@ -26608,7 +26928,7 @@ var init_LineChart = __esm({
26608
26928
  return `${linePath} L ${last.x} ${bottom} L ${first.x} ${bottom} Z`;
26609
26929
  }, [linePath, points, height, showArea]);
26610
26930
  if (safeData.length === 0) {
26611
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex items-center justify-center text-muted-foreground", className), style: { width, height }, children: "No data" });
26931
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex items-center justify-center text-muted-foreground", className), style: { width, height }, children: t("empty.noData") });
26612
26932
  }
26613
26933
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn(className), children: /* @__PURE__ */ jsxRuntime.jsxs(
26614
26934
  "svg",
@@ -28515,6 +28835,7 @@ var init_GraphView = __esm({
28515
28835
  "use client";
28516
28836
  init_cn();
28517
28837
  init_atoms2();
28838
+ init_useTranslate();
28518
28839
  GROUP_COLORS = [
28519
28840
  "#3b82f6",
28520
28841
  // blue-500
@@ -28547,6 +28868,7 @@ var init_GraphView = __esm({
28547
28868
  showLabels = true,
28548
28869
  zoomToFit = true
28549
28870
  }) => {
28871
+ const { t } = useTranslate();
28550
28872
  const containerRef = React85.useRef(null);
28551
28873
  const animRef = React85.useRef(0);
28552
28874
  const [simNodes, setSimNodes] = React85.useState([]);
@@ -28724,7 +29046,7 @@ var init_GraphView = __esm({
28724
29046
  [onNodeClick]
28725
29047
  );
28726
29048
  if (nodes.length === 0) {
28727
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex items-center justify-center", className), style: { width: w, height: h }, children: /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "text-muted-foreground text-sm", children: "No graph data" }) });
29049
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex items-center justify-center", className), style: { width: w, height: h }, children: /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "text-muted-foreground text-sm", children: t("display.noGraphData") }) });
28728
29050
  }
28729
29051
  return /* @__PURE__ */ jsxRuntime.jsx(
28730
29052
  Box,
@@ -29180,11 +29502,12 @@ var init_UploadDropZone = __esm({
29180
29502
  init_Icon();
29181
29503
  init_Typography();
29182
29504
  init_useEventBus();
29505
+ init_useTranslate();
29183
29506
  UploadDropZone = ({
29184
29507
  accept,
29185
29508
  maxSize,
29186
29509
  maxFiles = 1,
29187
- label = "Drop files here or click to browse",
29510
+ label,
29188
29511
  description,
29189
29512
  disabled = false,
29190
29513
  action,
@@ -29192,22 +29515,24 @@ var init_UploadDropZone = __esm({
29192
29515
  onFiles,
29193
29516
  className
29194
29517
  }) => {
29518
+ const { t } = useTranslate();
29519
+ const resolvedLabel = label ?? t("upload.dropOrBrowse");
29195
29520
  const [isDragOver, setIsDragOver] = React85.useState(false);
29196
29521
  const [error, setError] = React85.useState(null);
29197
29522
  const inputRef = React85.useRef(null);
29198
29523
  const eventBus = useSafeEventBus7();
29199
29524
  const defaultDescription = [
29200
- accept ? `Accepted: ${accept}` : null,
29201
- maxSize ? `Max size: ${formatFileSize(maxSize)}` : null,
29202
- maxFiles > 1 ? `Up to ${maxFiles} files` : null
29525
+ accept ? t("upload.accepted", { accept }) : null,
29526
+ maxSize ? t("upload.maxSize", { size: formatFileSize(maxSize) }) : null,
29527
+ maxFiles > 1 ? t("upload.maxFiles", { count: maxFiles }) : null
29203
29528
  ].filter(Boolean).join(". ");
29204
29529
  const validateFiles = React85.useCallback(
29205
29530
  (files) => {
29206
29531
  if (files.length > maxFiles) {
29207
- return { valid: [], error: `Maximum ${maxFiles} file${maxFiles > 1 ? "s" : ""} allowed` };
29532
+ return { valid: [], error: t("upload.error.maxFiles", { count: maxFiles }) };
29208
29533
  }
29209
29534
  if (accept) {
29210
- const acceptedTypes = accept.split(",").map((t) => t.trim());
29535
+ const acceptedTypes = accept.split(",").map((s) => s.trim());
29211
29536
  const invalid = files.filter((file) => {
29212
29537
  return !acceptedTypes.some((type) => {
29213
29538
  if (type.endsWith("/*")) {
@@ -29217,7 +29542,7 @@ var init_UploadDropZone = __esm({
29217
29542
  });
29218
29543
  });
29219
29544
  if (invalid.length > 0) {
29220
- return { valid: [], error: `Invalid file type: ${invalid[0].name}` };
29545
+ return { valid: [], error: t("upload.error.invalidType", { name: invalid[0].name }) };
29221
29546
  }
29222
29547
  }
29223
29548
  if (maxSize) {
@@ -29225,13 +29550,13 @@ var init_UploadDropZone = __esm({
29225
29550
  if (tooLarge.length > 0) {
29226
29551
  return {
29227
29552
  valid: [],
29228
- error: `File too large: ${tooLarge[0].name} (max ${formatFileSize(maxSize)})`
29553
+ error: t("upload.error.tooLarge", { name: tooLarge[0].name, size: formatFileSize(maxSize) })
29229
29554
  };
29230
29555
  }
29231
29556
  }
29232
29557
  return { valid: files, error: null };
29233
29558
  },
29234
- [accept, maxSize, maxFiles]
29559
+ [accept, maxSize, maxFiles, t]
29235
29560
  );
29236
29561
  const handleFiles = React85.useCallback(
29237
29562
  (files) => {
@@ -29302,7 +29627,7 @@ var init_UploadDropZone = __esm({
29302
29627
  handleClick();
29303
29628
  }
29304
29629
  },
29305
- "aria-label": label,
29630
+ "aria-label": resolvedLabel,
29306
29631
  children: [
29307
29632
  /* @__PURE__ */ jsxRuntime.jsx(
29308
29633
  "input",
@@ -29318,7 +29643,7 @@ var init_UploadDropZone = __esm({
29318
29643
  }
29319
29644
  ),
29320
29645
  error ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "file-warning", size: "lg", className: "text-error mb-2" }) : /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "upload", size: "lg", className: "text-muted-foreground mb-2" }),
29321
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body1", className: "text-center font-medium mb-1", children: isDragOver ? "Drop files here" : label }),
29646
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body1", className: "text-center font-medium mb-1", children: isDragOver ? t("upload.dropFilesHere") : resolvedLabel }),
29322
29647
  error ? /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "error", className: "text-center", children: error }) : /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "muted", className: "text-center", children: description ?? defaultDescription })
29323
29648
  ]
29324
29649
  }
@@ -29740,7 +30065,7 @@ function TableView({
29740
30065
  {
29741
30066
  checked: selected.has(id),
29742
30067
  onChange: () => toggleRow(id),
29743
- "aria-label": `Select row ${id}`
30068
+ "aria-label": t("table.selectRow", { id })
29744
30069
  }
29745
30070
  ) }),
29746
30071
  hasRenderProp ? /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex-1 min-w-0", children: children(row, index) }) : colDefs.map((col) => {
@@ -32587,7 +32912,7 @@ var init_QrScanner = __esm({
32587
32912
  className: "inset-0 flex-col items-center justify-center gap-2 bg-black bg-opacity-80 text-center",
32588
32913
  children: [
32589
32914
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "camera", className: "h-8 w-8 text-white", "aria-hidden": "true" }),
32590
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body2", className: "text-white", children: "Camera unavailable" }),
32915
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body2", className: "text-white", children: t("qrScanner.cameraUnavailable") }),
32591
32916
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", className: "text-white opacity-70", children: cameraError.message })
32592
32917
  ]
32593
32918
  }
@@ -32598,7 +32923,7 @@ var init_QrScanner = __esm({
32598
32923
  position: "absolute",
32599
32924
  display: "flex",
32600
32925
  className: "inset-0 items-center justify-center bg-black bg-opacity-60",
32601
- children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body2", className: "text-white", children: "Paused" })
32926
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body2", className: "text-white", children: t("qrScanner.paused") })
32602
32927
  }
32603
32928
  ),
32604
32929
  showCameraControls && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -32617,7 +32942,7 @@ var init_QrScanner = __esm({
32617
32942
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
32618
32943
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
32619
32944
  ),
32620
- "aria-label": isPaused ? "Resume scanning" : "Pause scanning",
32945
+ "aria-label": isPaused ? t("qrScanner.resumeScanning") : t("qrScanner.pauseScanning"),
32621
32946
  children: isPaused ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "play", className: "h-4 w-4" }) : /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "pause", className: "h-4 w-4" })
32622
32947
  }
32623
32948
  ),
@@ -32630,7 +32955,7 @@ var init_QrScanner = __esm({
32630
32955
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
32631
32956
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
32632
32957
  ),
32633
- "aria-label": `Switch to ${currentFacing === "environment" ? "front" : "rear"} camera`,
32958
+ "aria-label": currentFacing === "environment" ? t("qrScanner.switchToFrontCamera") : t("qrScanner.switchToRearCamera"),
32634
32959
  children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "refresh-cw", className: "h-4 w-4" })
32635
32960
  }
32636
32961
  ),
@@ -32644,7 +32969,7 @@ var init_QrScanner = __esm({
32644
32969
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
32645
32970
  ),
32646
32971
  "aria-label": t("aria.mockScanDev"),
32647
- children: "Mock Scan"
32972
+ children: t("qrScanner.mockScan")
32648
32973
  }
32649
32974
  )
32650
32975
  ]
@@ -32662,6 +32987,7 @@ var init_OptionConstraintGroup = __esm({
32662
32987
  "components/core/molecules/OptionConstraintGroup.tsx"() {
32663
32988
  init_cn();
32664
32989
  init_useEventBus();
32990
+ init_useTranslate();
32665
32991
  init_Typography();
32666
32992
  init_Box();
32667
32993
  init_Label();
@@ -32671,36 +32997,36 @@ var init_OptionConstraintGroup = __esm({
32671
32997
  const sign = delta >= 0 ? "+" : "-";
32672
32998
  return `${sign}$${Math.abs(delta).toFixed(2)}`;
32673
32999
  };
32674
- constraintHint = (constraint) => {
33000
+ constraintHint = (constraint, t) => {
32675
33001
  if (constraint.type === "single") {
32676
- return constraint.required ? "Required, pick 1" : "Optional, pick up to 1";
33002
+ return constraint.required ? t("optionConstraint.requiredOne") : t("optionConstraint.optionalOne");
32677
33003
  }
32678
33004
  const { min, max } = constraint;
32679
33005
  if (min && max) {
32680
- return min === max ? `Pick exactly ${min}` : `Pick ${min}-${max}`;
33006
+ return min === max ? t("optionConstraint.pickExactly", { count: min }) : t("optionConstraint.pickRange", { min, max });
32681
33007
  }
32682
- if (min) return `Pick at least ${min}`;
32683
- if (max) return `Pick up to ${max}`;
32684
- return "Optional";
33008
+ if (min) return t("optionConstraint.pickAtLeast", { count: min });
33009
+ if (max) return t("optionConstraint.pickUpTo", { count: max });
33010
+ return t("optionConstraint.optional");
32685
33011
  };
32686
- validateSelection = (selected, constraint) => {
33012
+ validateSelection = (selected, constraint, t) => {
32687
33013
  if (constraint.type === "single") {
32688
33014
  if (constraint.required && selected.length === 0) {
32689
- return "Pick 1 option";
33015
+ return t("optionConstraint.error.pickOne");
32690
33016
  }
32691
33017
  if (selected.length > 1) {
32692
- return "Pick only 1 option";
33018
+ return t("optionConstraint.error.pickOnlyOne");
32693
33019
  }
32694
33020
  return void 0;
32695
33021
  }
32696
33022
  const { min, max } = constraint;
32697
33023
  if (min !== void 0 && selected.length < min) {
32698
33024
  const remaining = min - selected.length;
32699
- return `Pick at least ${remaining} more`;
33025
+ return t("optionConstraint.error.pickMore", { count: remaining });
32700
33026
  }
32701
33027
  if (max !== void 0 && selected.length > max) {
32702
33028
  const excess = selected.length - max;
32703
- return `Remove ${excess} option${excess === 1 ? "" : "s"}`;
33029
+ return t("optionConstraint.error.removeOptions", { count: excess });
32704
33030
  }
32705
33031
  return void 0;
32706
33032
  };
@@ -32717,8 +33043,9 @@ var init_OptionConstraintGroup = __esm({
32717
33043
  className
32718
33044
  }) => {
32719
33045
  const eventBus = useEventBus();
32720
- const hint = constraintHint(constraint);
32721
- const error = validateSelection(selected, constraint);
33046
+ const { t } = useTranslate();
33047
+ const hint = constraintHint(constraint, t);
33048
+ const error = validateSelection(selected, constraint, t);
32722
33049
  const inputName = `option-${groupId}`;
32723
33050
  const labelTextSize = size === "sm" ? "text-sm" : "text-base";
32724
33051
  const optionGap = size === "sm" ? "gap-2" : "gap-2.5";
@@ -32818,7 +33145,7 @@ var init_OptionConstraintGroup = __esm({
32818
33145
  variant: "caption",
32819
33146
  color: "warning",
32820
33147
  className: "rounded border border-warning/40 px-1.5 py-0.5",
32821
- children: "Out of stock"
33148
+ children: t("optionConstraint.outOfStock")
32822
33149
  }
32823
33150
  )
32824
33151
  ]
@@ -33140,6 +33467,7 @@ function changeBlockType(block, type) {
33140
33467
  return { id: block.id, type, content: seed };
33141
33468
  }
33142
33469
  function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33470
+ const { t } = useTranslate();
33143
33471
  const [open, setOpen] = React85.useState(false);
33144
33472
  const ref = React85.useRef(null);
33145
33473
  React85.useEffect(() => {
@@ -33159,7 +33487,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33159
33487
  {
33160
33488
  type: "button",
33161
33489
  variant: "ghost",
33162
- "aria-label": "Block actions",
33490
+ "aria-label": t("richBlockEditor.blockActions"),
33163
33491
  className: cn(
33164
33492
  "inline-flex items-center justify-center",
33165
33493
  "h-6 w-6 rounded-sm p-0 gap-0",
@@ -33181,7 +33509,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33181
33509
  "py-1 text-sm"
33182
33510
  ),
33183
33511
  children: [
33184
- /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: BLOCK_TYPE_LABEL[block.type] }),
33512
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: t(BLOCK_TYPE_LABEL_KEY[block.type]) }),
33185
33513
  /* @__PURE__ */ jsxRuntime.jsxs(
33186
33514
  Button,
33187
33515
  {
@@ -33195,7 +33523,8 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33195
33523
  },
33196
33524
  children: [
33197
33525
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", className: "w-3.5 h-3.5" }),
33198
- " Duplicate"
33526
+ " ",
33527
+ t("richBlockEditor.duplicate")
33199
33528
  ]
33200
33529
  }
33201
33530
  ),
@@ -33212,14 +33541,15 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33212
33541
  },
33213
33542
  children: [
33214
33543
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "trash", className: "w-3.5 h-3.5" }),
33215
- " Delete"
33544
+ " ",
33545
+ t("common.delete")
33216
33546
  ]
33217
33547
  }
33218
33548
  ),
33219
33549
  CHANGEABLE_TYPES.includes(block.type) && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
33220
33550
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "my-1 border-t border-border" }),
33221
- /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: "Turn into" }),
33222
- CHANGEABLE_TYPES.filter((t) => t !== block.type).map((t) => /* @__PURE__ */ jsxRuntime.jsx(
33551
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: t("richBlockEditor.turnInto") }),
33552
+ CHANGEABLE_TYPES.filter((bt) => bt !== block.type).map((bt) => /* @__PURE__ */ jsxRuntime.jsx(
33223
33553
  Button,
33224
33554
  {
33225
33555
  type: "button",
@@ -33227,12 +33557,12 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33227
33557
  role: "menuitem",
33228
33558
  className: "flex w-full items-center gap-2 px-2 py-1.5 text-left justify-start rounded-none",
33229
33559
  onClick: () => {
33230
- onChangeType(t);
33560
+ onChangeType(bt);
33231
33561
  setOpen(false);
33232
33562
  },
33233
- children: BLOCK_TYPE_LABEL[t]
33563
+ children: t(BLOCK_TYPE_LABEL_KEY[bt])
33234
33564
  },
33235
- t
33565
+ bt
33236
33566
  ))
33237
33567
  ] })
33238
33568
  ]
@@ -33294,6 +33624,7 @@ function BlockRow({
33294
33624
  onInsertAfter,
33295
33625
  onChangeType
33296
33626
  }) {
33627
+ const { t } = useTranslate();
33297
33628
  const setContent = React85.useCallback(
33298
33629
  (next) => onUpdate((b) => ({ ...b, content: next })),
33299
33630
  [onUpdate]
@@ -33343,8 +33674,8 @@ function BlockRow({
33343
33674
  tag: "h1",
33344
33675
  value: block.content ?? "",
33345
33676
  readOnly,
33346
- placeholder: placeholder ?? "Heading 1",
33347
- ariaLabel: "Heading 1 block",
33677
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading1"),
33678
+ ariaLabel: t("richBlockEditor.aria.heading1Block"),
33348
33679
  className: "text-3xl font-bold leading-tight",
33349
33680
  onValueChange: setContent
33350
33681
  }
@@ -33356,8 +33687,8 @@ function BlockRow({
33356
33687
  tag: "h2",
33357
33688
  value: block.content ?? "",
33358
33689
  readOnly,
33359
- placeholder: placeholder ?? "Heading 2",
33360
- ariaLabel: "Heading 2 block",
33690
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading2"),
33691
+ ariaLabel: t("richBlockEditor.aria.heading2Block"),
33361
33692
  className: "text-2xl font-semibold leading-tight",
33362
33693
  onValueChange: setContent
33363
33694
  }
@@ -33369,8 +33700,8 @@ function BlockRow({
33369
33700
  tag: "h3",
33370
33701
  value: block.content ?? "",
33371
33702
  readOnly,
33372
- placeholder: placeholder ?? "Heading 3",
33373
- ariaLabel: "Heading 3 block",
33703
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading3"),
33704
+ ariaLabel: t("richBlockEditor.aria.heading3Block"),
33374
33705
  className: "text-xl font-semibold leading-tight",
33375
33706
  onValueChange: setContent
33376
33707
  }
@@ -33382,8 +33713,8 @@ function BlockRow({
33382
33713
  tag: "blockquote",
33383
33714
  value: block.content ?? "",
33384
33715
  readOnly,
33385
- placeholder: placeholder ?? "Quote",
33386
- ariaLabel: "Quote block",
33716
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.quote"),
33717
+ ariaLabel: t("richBlockEditor.aria.quoteBlock"),
33387
33718
  className: "border-l-4 border-primary/60 pl-4 italic text-muted-foreground",
33388
33719
  onValueChange: setContent
33389
33720
  }
@@ -33391,13 +33722,13 @@ function BlockRow({
33391
33722
  case "code":
33392
33723
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "rounded-md border border-border bg-muted/40", children: [
33393
33724
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center justify-between border-b border-border px-3 py-1 text-xs text-muted-foreground", children: [
33394
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", variant: "caption", className: "uppercase tracking-wide", children: "Code" }),
33725
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", variant: "caption", className: "uppercase tracking-wide", children: t("richBlockEditor.blockType.code") }),
33395
33726
  !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
33396
33727
  Input,
33397
33728
  {
33398
33729
  inputType: "text",
33399
33730
  value: String(block.metadata?.language ?? "plaintext"),
33400
- "aria-label": "Code language",
33731
+ "aria-label": t("richBlockEditor.aria.codeLanguage"),
33401
33732
  className: cn(
33402
33733
  "h-6 w-32 rounded-sm border border-border bg-background",
33403
33734
  "px-2 text-xs outline-none focus:ring-1 focus:ring-ring"
@@ -33413,8 +33744,8 @@ function BlockRow({
33413
33744
  tag: "pre",
33414
33745
  value: block.content ?? "",
33415
33746
  readOnly,
33416
- placeholder: placeholder ?? "Enter code",
33417
- ariaLabel: "Code block",
33747
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.code"),
33748
+ ariaLabel: t("richBlockEditor.aria.codeBlock"),
33418
33749
  className: "block whitespace-pre-wrap p-3 font-mono text-sm leading-relaxed",
33419
33750
  onValueChange: setContent
33420
33751
  }
@@ -33427,7 +33758,7 @@ function BlockRow({
33427
33758
  const caption = String(block.metadata?.caption ?? "");
33428
33759
  const imgProps = {
33429
33760
  src: url,
33430
- alt: caption || "Embedded image",
33761
+ alt: caption || t("richBlockEditor.embeddedImage"),
33431
33762
  className: "max-h-96 w-full rounded-md border border-border object-contain"
33432
33763
  };
33433
33764
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "space-y-2", children: [
@@ -33441,7 +33772,8 @@ function BlockRow({
33441
33772
  ),
33442
33773
  children: [
33443
33774
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "image", className: "mr-2 w-4 h-4" }),
33444
- " No image URL set"
33775
+ " ",
33776
+ t("richBlockEditor.noImageUrl")
33445
33777
  ]
33446
33778
  }
33447
33779
  ),
@@ -33452,7 +33784,7 @@ function BlockRow({
33452
33784
  inputType: "url",
33453
33785
  value: url,
33454
33786
  placeholder: "https://example.com/image.png",
33455
- "aria-label": "Image URL",
33787
+ "aria-label": t("richBlockEditor.aria.imageUrl"),
33456
33788
  className: cn(
33457
33789
  "h-8 flex-1 rounded-sm border border-border bg-background",
33458
33790
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -33465,8 +33797,8 @@ function BlockRow({
33465
33797
  {
33466
33798
  inputType: "text",
33467
33799
  value: caption,
33468
- placeholder: "Caption (optional)",
33469
- "aria-label": "Image caption",
33800
+ placeholder: t("richBlockEditor.placeholder.caption"),
33801
+ "aria-label": t("richBlockEditor.aria.imageCaption"),
33470
33802
  className: cn(
33471
33803
  "h-8 flex-1 rounded-sm border border-border bg-background",
33472
33804
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -33497,8 +33829,8 @@ function BlockRow({
33497
33829
  tag: "span",
33498
33830
  value: child.content ?? "",
33499
33831
  readOnly,
33500
- placeholder: "List item",
33501
- ariaLabel: "List item",
33832
+ placeholder: t("richBlockEditor.placeholder.listItem"),
33833
+ ariaLabel: t("richBlockEditor.aria.listItem"),
33502
33834
  className: "inline-block min-w-[1ch] flex-1",
33503
33835
  onValueChange: (next) => setChildContent(child.id, next)
33504
33836
  }
@@ -33508,7 +33840,7 @@ function BlockRow({
33508
33840
  {
33509
33841
  type: "button",
33510
33842
  variant: "ghost",
33511
- "aria-label": "Remove list item",
33843
+ "aria-label": t("richBlockEditor.aria.removeListItem"),
33512
33844
  className: cn(
33513
33845
  "h-5 w-5 shrink-0 rounded-sm text-muted-foreground p-0 gap-0",
33514
33846
  "opacity-0 group-hover/item:opacity-100 hover:bg-muted hover:text-foreground"
@@ -33530,7 +33862,8 @@ function BlockRow({
33530
33862
  onClick: addListItem,
33531
33863
  children: [
33532
33864
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", className: "w-3 h-3" }),
33533
- " Add item"
33865
+ " ",
33866
+ t("richBlockEditor.addItem")
33534
33867
  ]
33535
33868
  }
33536
33869
  ) })
@@ -33546,8 +33879,8 @@ function BlockRow({
33546
33879
  tag: "p",
33547
33880
  value: block.content ?? "",
33548
33881
  readOnly,
33549
- placeholder: placeholder ?? "Start writing...",
33550
- ariaLabel: "Paragraph block",
33882
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.paragraph"),
33883
+ ariaLabel: t("richBlockEditor.aria.paragraphBlock"),
33551
33884
  className: "leading-7",
33552
33885
  onValueChange: setContent
33553
33886
  }
@@ -33570,7 +33903,7 @@ function BlockRow({
33570
33903
  {
33571
33904
  type: "button",
33572
33905
  variant: "ghost",
33573
- "aria-label": "Insert paragraph below",
33906
+ "aria-label": t("richBlockEditor.insertParagraphBelow"),
33574
33907
  className: cn(
33575
33908
  "inline-flex h-6 w-6 items-center justify-center rounded-sm p-0 gap-0",
33576
33909
  "text-muted-foreground hover:bg-muted hover:text-foreground",
@@ -33597,7 +33930,7 @@ function BlockRow({
33597
33930
  }
33598
33931
  );
33599
33932
  }
33600
- var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES, RichBlockEditor;
33933
+ var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL_KEY, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES, RichBlockEditor;
33601
33934
  var init_RichBlockEditor = __esm({
33602
33935
  "components/core/molecules/RichBlockEditor.tsx"() {
33603
33936
  "use client";
@@ -33610,29 +33943,30 @@ var init_RichBlockEditor = __esm({
33610
33943
  init_Input();
33611
33944
  init_Icon();
33612
33945
  init_useEventBus();
33946
+ init_useTranslate();
33613
33947
  TOOLBAR_ENTRIES = [
33614
- { type: "paragraph", label: "Text", icon: LucideIcons2.Type },
33615
- { type: "heading-1", label: "H1", icon: LucideIcons2.Heading1 },
33616
- { type: "heading-2", label: "H2", icon: LucideIcons2.Heading2 },
33617
- { type: "heading-3", label: "H3", icon: LucideIcons2.Heading3 },
33618
- { type: "bullet-list", label: "Bullet list", icon: LucideIcons2.List },
33619
- { type: "numbered-list", label: "Numbered", icon: LucideIcons2.ListOrdered },
33620
- { type: "quote", label: "Quote", icon: LucideIcons2.Quote },
33621
- { type: "code", label: "Code", icon: LucideIcons2.Code },
33622
- { type: "divider", label: "Divider", icon: LucideIcons2.Minus },
33623
- { type: "image", label: "Image", icon: LucideIcons2.Image }
33948
+ { type: "paragraph", labelKey: "richBlockEditor.toolbar.text", icon: LucideIcons2.Type },
33949
+ { type: "heading-1", labelKey: "richBlockEditor.toolbar.h1", icon: LucideIcons2.Heading1 },
33950
+ { type: "heading-2", labelKey: "richBlockEditor.toolbar.h2", icon: LucideIcons2.Heading2 },
33951
+ { type: "heading-3", labelKey: "richBlockEditor.toolbar.h3", icon: LucideIcons2.Heading3 },
33952
+ { type: "bullet-list", labelKey: "richBlockEditor.toolbar.bulletList", icon: LucideIcons2.List },
33953
+ { type: "numbered-list", labelKey: "richBlockEditor.toolbar.numbered", icon: LucideIcons2.ListOrdered },
33954
+ { type: "quote", labelKey: "richBlockEditor.toolbar.quote", icon: LucideIcons2.Quote },
33955
+ { type: "code", labelKey: "richBlockEditor.toolbar.code", icon: LucideIcons2.Code },
33956
+ { type: "divider", labelKey: "richBlockEditor.toolbar.divider", icon: LucideIcons2.Minus },
33957
+ { type: "image", labelKey: "richBlockEditor.toolbar.image", icon: LucideIcons2.Image }
33624
33958
  ];
33625
- BLOCK_TYPE_LABEL = {
33626
- paragraph: "Text",
33627
- "heading-1": "Heading 1",
33628
- "heading-2": "Heading 2",
33629
- "heading-3": "Heading 3",
33630
- "bullet-list": "Bullet list",
33631
- "numbered-list": "Numbered list",
33632
- quote: "Quote",
33633
- code: "Code",
33634
- divider: "Divider",
33635
- image: "Image"
33959
+ BLOCK_TYPE_LABEL_KEY = {
33960
+ paragraph: "richBlockEditor.blockType.paragraph",
33961
+ "heading-1": "richBlockEditor.blockType.heading1",
33962
+ "heading-2": "richBlockEditor.blockType.heading2",
33963
+ "heading-3": "richBlockEditor.blockType.heading3",
33964
+ "bullet-list": "richBlockEditor.blockType.bulletList",
33965
+ "numbered-list": "richBlockEditor.blockType.numberedList",
33966
+ quote: "richBlockEditor.blockType.quote",
33967
+ code: "richBlockEditor.blockType.code",
33968
+ divider: "richBlockEditor.blockType.divider",
33969
+ image: "richBlockEditor.blockType.image"
33636
33970
  };
33637
33971
  CHANGEABLE_TYPES = [
33638
33972
  "paragraph",
@@ -33666,6 +34000,7 @@ var init_RichBlockEditor = __esm({
33666
34000
  showToolbar = true,
33667
34001
  className
33668
34002
  }) => {
34003
+ const { t } = useTranslate();
33669
34004
  const [blocks, setBlocks] = React85.useState(
33670
34005
  () => normalizeBlocks(initialBlocks)
33671
34006
  );
@@ -33737,25 +34072,26 @@ var init_RichBlockEditor = __esm({
33737
34072
  Box,
33738
34073
  {
33739
34074
  role: "toolbar",
33740
- "aria-label": "Block editor toolbar",
34075
+ "aria-label": t("richBlockEditor.editorToolbar"),
33741
34076
  className: cn(
33742
34077
  "flex flex-wrap items-center gap-1",
33743
34078
  "border-b border-border bg-muted/30 px-2 py-2"
33744
34079
  ),
33745
34080
  children: TOOLBAR_ENTRIES.map((entry) => {
33746
34081
  const Icon3 = entry.icon;
34082
+ const entryLabel = t(entry.labelKey);
33747
34083
  return /* @__PURE__ */ jsxRuntime.jsxs(
33748
34084
  Button,
33749
34085
  {
33750
34086
  type: "button",
33751
34087
  variant: "ghost",
33752
34088
  size: "sm",
33753
- "aria-label": `Insert ${entry.label}`,
33754
- title: entry.label,
34089
+ "aria-label": t("richBlockEditor.insertEntry", { label: entryLabel }),
34090
+ title: entryLabel,
33755
34091
  onClick: () => handleAppend(entry.type),
33756
34092
  children: [
33757
34093
  /* @__PURE__ */ jsxRuntime.jsx(Icon3, { size: 14 }),
33758
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", variant: "caption", className: "ml-1 hidden text-xs sm:inline", children: entry.label })
34094
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", variant: "caption", className: "ml-1 hidden text-xs sm:inline", children: entryLabel })
33759
34095
  ]
33760
34096
  },
33761
34097
  entry.type
@@ -33798,6 +34134,7 @@ var init_ReplyTree = __esm({
33798
34134
  "use client";
33799
34135
  init_cn();
33800
34136
  init_useEventBus();
34137
+ init_useTranslate();
33801
34138
  init_atoms2();
33802
34139
  init_VoteStack();
33803
34140
  ReplyTreeNode = ({
@@ -33817,6 +34154,7 @@ var init_ReplyTree = __esm({
33817
34154
  showActions
33818
34155
  }) => {
33819
34156
  const eventBus = useEventBus();
34157
+ const { t } = useTranslate();
33820
34158
  const hasReplies = !!node.replies && node.replies.length > 0;
33821
34159
  const isCollapsed = collapsedSet.has(node.id);
33822
34160
  const atMaxDepth = depth >= maxDepth;
@@ -33863,7 +34201,7 @@ var init_ReplyTree = __esm({
33863
34201
  variant: "ghost",
33864
34202
  size: "sm",
33865
34203
  onClick: handleToggle,
33866
- "aria-label": isCollapsed ? "Expand replies" : "Collapse replies",
34204
+ "aria-label": isCollapsed ? t("replyTree.expandReplies") : t("replyTree.collapseReplies"),
33867
34205
  "aria-expanded": !isCollapsed,
33868
34206
  leftIcon: isCollapsed ? "chevron-right" : "chevron-down",
33869
34207
  className: cn(
@@ -33904,7 +34242,7 @@ var init_ReplyTree = __esm({
33904
34242
  onVote: handleVote,
33905
34243
  size: "sm",
33906
34244
  variant: "horizontal",
33907
- label: `Vote on reply by ${node.authorName}`
34245
+ label: t("replyTree.voteOnReplyBy", { author: node.authorName })
33908
34246
  }
33909
34247
  ),
33910
34248
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -33914,8 +34252,8 @@ var init_ReplyTree = __esm({
33914
34252
  size: "sm",
33915
34253
  leftIcon: "message-square",
33916
34254
  onClick: handleReply,
33917
- "aria-label": `Reply to ${node.authorName}`,
33918
- children: "Reply"
34255
+ "aria-label": t("replyTree.replyTo", { author: node.authorName }),
34256
+ children: t("replyTree.reply")
33919
34257
  }
33920
34258
  ),
33921
34259
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -33925,8 +34263,8 @@ var init_ReplyTree = __esm({
33925
34263
  size: "sm",
33926
34264
  leftIcon: "flag",
33927
34265
  onClick: handleFlag,
33928
- "aria-label": `Flag reply by ${node.authorName}`,
33929
- children: "Flag"
34266
+ "aria-label": t("replyTree.flagReplyBy", { author: node.authorName }),
34267
+ children: t("replyTree.flag")
33930
34268
  }
33931
34269
  )
33932
34270
  ] }),
@@ -33937,9 +34275,9 @@ var init_ReplyTree = __esm({
33937
34275
  inputType: "textarea",
33938
34276
  rows: 2,
33939
34277
  value: draft,
33940
- placeholder: `Reply to ${node.authorName}\u2026`,
34278
+ placeholder: t("replyTree.replyToPlaceholder", { author: node.authorName }),
33941
34279
  onChange: (e) => setDraft(e.target.value),
33942
- "aria-label": `Reply to ${node.authorName}`
34280
+ "aria-label": t("replyTree.replyTo", { author: node.authorName })
33943
34281
  }
33944
34282
  ),
33945
34283
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-row gap-2 items-center", children: [
@@ -33951,10 +34289,10 @@ var init_ReplyTree = __esm({
33951
34289
  leftIcon: "send",
33952
34290
  onClick: handleSubmitReply,
33953
34291
  disabled: !draft.trim(),
33954
- children: "Send"
34292
+ children: t("replyTree.send")
33955
34293
  }
33956
34294
  ),
33957
- /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: "Cancel" })
34295
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: t("common.cancel") })
33958
34296
  ] })
33959
34297
  ] }),
33960
34298
  hasReplies && !isCollapsed && (atMaxDepth ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -33968,7 +34306,7 @@ var init_ReplyTree = __esm({
33968
34306
  "self-start gap-1 px-0 h-auto",
33969
34307
  "text-sm text-primary hover:underline hover:bg-transparent"
33970
34308
  ),
33971
- children: "Continue thread"
34309
+ children: t("replyTree.continueThread")
33972
34310
  }
33973
34311
  ) : /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex flex-col gap-2 mt-1", children: node.replies.map((child) => /* @__PURE__ */ jsxRuntime.jsx(
33974
34312
  ReplyTreeNode,
@@ -34007,6 +34345,7 @@ var init_ReplyTree = __esm({
34007
34345
  showActions = true,
34008
34346
  className
34009
34347
  }) => {
34348
+ const { t } = useTranslate();
34010
34349
  const nodeList = Array.isArray(nodes) ? nodes : nodes ? [nodes] : [];
34011
34350
  const [collapsedSet, setCollapsedSet] = React85.useState(() => {
34012
34351
  const acc = /* @__PURE__ */ new Set();
@@ -34025,7 +34364,7 @@ var init_ReplyTree = __esm({
34025
34364
  });
34026
34365
  }, []);
34027
34366
  if (nodeList.length === 0) {
34028
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("text-sm text-muted-foreground", className), children: "No replies yet." });
34367
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("text-sm text-muted-foreground", className), children: t("replyTree.noRepliesYet") });
34029
34368
  }
34030
34369
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex flex-col gap-2 min-w-0", className), children: nodeList.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
34031
34370
  ReplyTreeNode,
@@ -34103,6 +34442,7 @@ var init_VersionDiff = __esm({
34103
34442
  "use client";
34104
34443
  init_cn();
34105
34444
  init_useEventBus();
34445
+ init_useTranslate();
34106
34446
  init_atoms2();
34107
34447
  init_Stack();
34108
34448
  INLINE_STYLES = {
@@ -34125,6 +34465,7 @@ var init_VersionDiff = __esm({
34125
34465
  language,
34126
34466
  className
34127
34467
  }) => {
34468
+ const { t } = useTranslate();
34128
34469
  const eventBus = useEventBus();
34129
34470
  const revisions = Array.isArray(revisionsProp) ? revisionsProp : [];
34130
34471
  const fallbackBefore = revisions[0]?.id ?? "";
@@ -34206,24 +34547,24 @@ var init_VersionDiff = __esm({
34206
34547
  children: [
34207
34548
  /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: "flex-wrap", children: [
34208
34549
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "git-commit", size: "sm", className: "text-muted-foreground" }),
34209
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "whitespace-nowrap", children: "Compare" }),
34550
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "whitespace-nowrap", children: t("versionDiff.compare") }),
34210
34551
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsxRuntime.jsx(
34211
34552
  Select,
34212
34553
  {
34213
34554
  options,
34214
34555
  value: activeBeforeId,
34215
34556
  onChange: handleBeforeChange,
34216
- "aria-label": "Before revision"
34557
+ "aria-label": t("versionDiff.beforeRevision")
34217
34558
  }
34218
34559
  ) }),
34219
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: "to" }),
34560
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: t("versionDiff.to") }),
34220
34561
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsxRuntime.jsx(
34221
34562
  Select,
34222
34563
  {
34223
34564
  options,
34224
34565
  value: activeAfterId,
34225
34566
  onChange: handleAfterChange,
34226
- "aria-label": "After revision"
34567
+ "aria-label": t("versionDiff.afterRevision")
34227
34568
  }
34228
34569
  ) }),
34229
34570
  language && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "default", children: language }),
@@ -34244,7 +34585,7 @@ var init_VersionDiff = __esm({
34244
34585
  size: "sm",
34245
34586
  icon: activeView === "side-by-side" ? "align-left" : "columns",
34246
34587
  onClick: handleViewToggle,
34247
- "aria-label": activeView === "side-by-side" ? "Switch to inline view" : "Switch to side-by-side view"
34588
+ "aria-label": activeView === "side-by-side" ? t("versionDiff.switchToInline") : t("versionDiff.switchToSideBySide")
34248
34589
  }
34249
34590
  ),
34250
34591
  (onRevert || revertEvent) && /* @__PURE__ */ jsxRuntime.jsx(
@@ -34254,7 +34595,7 @@ var init_VersionDiff = __esm({
34254
34595
  size: "sm",
34255
34596
  icon: "rotate-ccw",
34256
34597
  onClick: handleRevert,
34257
- children: "Revert"
34598
+ children: t("versionDiff.revert")
34258
34599
  }
34259
34600
  )
34260
34601
  ] })
@@ -34271,12 +34612,12 @@ var init_VersionDiff = __esm({
34271
34612
  children: [
34272
34613
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
34273
34614
  beforeRev?.label,
34274
- beforeRev?.author ? ` by ${beforeRev.author}` : "",
34615
+ beforeRev?.author ? t("versionDiff.byAuthor", { author: beforeRev.author }) : "",
34275
34616
  beforeRev?.timestamp ? ` (${beforeRev.timestamp})` : ""
34276
34617
  ] }),
34277
34618
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
34278
34619
  afterRev?.label,
34279
- afterRev?.author ? ` by ${afterRev.author}` : "",
34620
+ afterRev?.author ? t("versionDiff.byAuthor", { author: afterRev.author }) : "",
34280
34621
  afterRev?.timestamp ? ` (${afterRev.timestamp})` : ""
34281
34622
  ] })
34282
34623
  ]
@@ -34669,10 +35010,12 @@ var init_DocPagination = __esm({
34669
35010
  }
34670
35011
  });
34671
35012
  function DocSearch({
34672
- placeholder = "Search documentation...",
35013
+ placeholder,
34673
35014
  onSearch,
34674
35015
  className
34675
35016
  }) {
35017
+ const { t } = useTranslate();
35018
+ const resolvedPlaceholder = placeholder ?? t("docSearch.placeholder");
34676
35019
  const [query, setQuery] = React85.useState("");
34677
35020
  const [results, setResults] = React85.useState([]);
34678
35021
  const [isOpen, setIsOpen] = React85.useState(false);
@@ -34779,7 +35122,7 @@ function DocSearch({
34779
35122
  Input,
34780
35123
  {
34781
35124
  inputType: "search",
34782
- placeholder,
35125
+ placeholder: resolvedPlaceholder,
34783
35126
  value: query,
34784
35127
  onChange: handleChange,
34785
35128
  onFocus: handleFocus,
@@ -34844,6 +35187,7 @@ var init_DocSearch = __esm({
34844
35187
  init_Typography();
34845
35188
  init_Icon();
34846
35189
  init_Input();
35190
+ init_useTranslate();
34847
35191
  }
34848
35192
  });
34849
35193
  var DocSidebarCategory, DocSidebar;
@@ -36848,8 +37192,8 @@ var init_SignaturePad = __esm({
36848
37192
  init_useEventBus();
36849
37193
  init_useTranslate();
36850
37194
  SignaturePad = ({
36851
- label = "Signature",
36852
- helperText = "Draw your signature above",
37195
+ label,
37196
+ helperText,
36853
37197
  strokeColor,
36854
37198
  strokeWidth = 2,
36855
37199
  height = 200,
@@ -36865,6 +37209,8 @@ var init_SignaturePad = __esm({
36865
37209
  }) => {
36866
37210
  const eventBus = useEventBus();
36867
37211
  const { t } = useTranslate();
37212
+ const resolvedLabel = label ?? t("signaturePad.label");
37213
+ const resolvedHelperText = helperText ?? t("signaturePad.helperText");
36868
37214
  const canvasRef = React85.useRef(null);
36869
37215
  const [isDrawing, setIsDrawing] = React85.useState(false);
36870
37216
  const [hasSignature, setHasSignature] = React85.useState(!!value);
@@ -36967,7 +37313,7 @@ var init_SignaturePad = __esm({
36967
37313
  );
36968
37314
  }
36969
37315
  return /* @__PURE__ */ jsxRuntime.jsx(Card, { className: cn("p-4", className), children: /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "sm", children: [
36970
- label && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "medium", children: label }),
37316
+ resolvedLabel && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "medium", children: resolvedLabel }),
36971
37317
  /* @__PURE__ */ jsxRuntime.jsx(
36972
37318
  Box,
36973
37319
  {
@@ -36996,7 +37342,7 @@ var init_SignaturePad = __esm({
36996
37342
  )
36997
37343
  }
36998
37344
  ),
36999
- helperText && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: helperText }),
37345
+ resolvedHelperText && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: resolvedHelperText }),
37000
37346
  !readOnly && /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", justify: "end", children: [
37001
37347
  /* @__PURE__ */ jsxRuntime.jsx(
37002
37348
  Button,
@@ -37006,7 +37352,7 @@ var init_SignaturePad = __esm({
37006
37352
  icon: LucideIcons2.Eraser,
37007
37353
  onClick: clearSignature,
37008
37354
  disabled: !hasSignature,
37009
- children: "Clear"
37355
+ children: t("signaturePad.clear")
37010
37356
  }
37011
37357
  ),
37012
37358
  signEvent && /* @__PURE__ */ jsxRuntime.jsx(
@@ -37017,7 +37363,7 @@ var init_SignaturePad = __esm({
37017
37363
  icon: LucideIcons2.Check,
37018
37364
  onClick: confirmSignature,
37019
37365
  disabled: !hasSignature,
37020
- children: "Confirm"
37366
+ children: t("signaturePad.confirm")
37021
37367
  }
37022
37368
  )
37023
37369
  ] })
@@ -41462,6 +41808,7 @@ function MasterDetail({
41462
41808
  className,
41463
41809
  ...rest
41464
41810
  }) {
41811
+ const { t } = useTranslate();
41465
41812
  const loading = externalLoading ?? false;
41466
41813
  const isLoading = externalIsLoading ?? false;
41467
41814
  const error = externalError ?? null;
@@ -41474,8 +41821,8 @@ function MasterDetail({
41474
41821
  isLoading: loading || isLoading,
41475
41822
  error,
41476
41823
  className,
41477
- emptyTitle: "No items found",
41478
- emptyDescription: "Create your first item to get started.",
41824
+ emptyTitle: t("table.empty.title"),
41825
+ emptyDescription: t("empty.createFirst"),
41479
41826
  ...rest
41480
41827
  }
41481
41828
  );
@@ -41484,6 +41831,7 @@ var init_MasterDetail = __esm({
41484
41831
  "components/core/organisms/MasterDetail.tsx"() {
41485
41832
  "use client";
41486
41833
  init_DataTable();
41834
+ init_useTranslate();
41487
41835
  MasterDetail.displayName = "MasterDetail";
41488
41836
  }
41489
41837
  });
@@ -41492,14 +41840,18 @@ var init_MasterDetailLayout = __esm({
41492
41840
  "components/core/organisms/layout/MasterDetailLayout.tsx"() {
41493
41841
  init_cn();
41494
41842
  init_Typography();
41495
- DefaultEmptyDetail = () => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsxRuntime.jsx(
41496
- Typography,
41497
- {
41498
- variant: "body2",
41499
- className: "text-muted-foreground",
41500
- children: "Select an item to view details"
41501
- }
41502
- ) });
41843
+ init_useTranslate();
41844
+ DefaultEmptyDetail = () => {
41845
+ const { t } = useTranslate();
41846
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsxRuntime.jsx(
41847
+ Typography,
41848
+ {
41849
+ variant: "body2",
41850
+ className: "text-muted-foreground",
41851
+ children: t("masterDetail.selectItem")
41852
+ }
41853
+ ) });
41854
+ };
41503
41855
  MasterDetailLayout = ({
41504
41856
  master,
41505
41857
  detail,
@@ -41626,7 +41978,7 @@ var init_MediaGallery = __esm({
41626
41978
  {
41627
41979
  icon: LucideIcons2.Image,
41628
41980
  title: t("display.noMedia"),
41629
- description: "No media items to display.",
41981
+ description: t("mediaGallery.noMediaDescription"),
41630
41982
  className
41631
41983
  }
41632
41984
  );
@@ -41643,7 +41995,7 @@ var init_MediaGallery = __esm({
41643
41995
  size: "sm",
41644
41996
  icon: LucideIcons2.Upload,
41645
41997
  action: "MEDIA_UPLOAD",
41646
- children: "Upload"
41998
+ children: t("mediaGallery.upload")
41647
41999
  }
41648
42000
  ),
41649
42001
  actions?.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -41657,10 +42009,7 @@ var init_MediaGallery = __esm({
41657
42009
  ))
41658
42010
  ] })
41659
42011
  ] }),
41660
- selectable && selectedItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(HStack, { gap: "sm", align: "center", children: /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "info", children: [
41661
- selectedItems.length,
41662
- " selected"
41663
- ] }) }),
42012
+ selectable && selectedItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(HStack, { gap: "sm", align: "center", children: /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "info", children: t("table.bulk.selected", { count: selectedItems.length }) }) }),
41664
42013
  /* @__PURE__ */ jsxRuntime.jsx(
41665
42014
  Box,
41666
42015
  {
@@ -42515,7 +42864,7 @@ function TraitsTab({ traits: traits2 }) {
42515
42864
  EmptyState,
42516
42865
  {
42517
42866
  title: t("debug.noActiveTraits"),
42518
- description: "Traits will appear when components using them are mounted",
42867
+ description: t("debug.traitsMountHint"),
42519
42868
  className: "py-8"
42520
42869
  }
42521
42870
  );
@@ -42525,14 +42874,11 @@ function TraitsTab({ traits: traits2 }) {
42525
42874
  header: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 w-full", children: [
42526
42875
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", weight: "semibold", className: "text-purple-600 dark:text-purple-400", children: trait.name }),
42527
42876
  /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "success", size: "sm", children: trait.currentState }),
42528
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: [
42529
- trait.transitionCount,
42530
- " transitions"
42531
- ] })
42877
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: t("debug.transitionsCount", { count: trait.transitionCount }) })
42532
42878
  ] }),
42533
42879
  content: /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "sm", children: [
42534
42880
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42535
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "States" }),
42881
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.states") }),
42536
42882
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: trait.states.map((state) => /* @__PURE__ */ jsxRuntime.jsx(
42537
42883
  Badge,
42538
42884
  {
@@ -42544,7 +42890,7 @@ function TraitsTab({ traits: traits2 }) {
42544
42890
  )) })
42545
42891
  ] }),
42546
42892
  trait.transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42547
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Transitions" }),
42893
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.transitions") }),
42548
42894
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: trait.transitions.map((t2, i) => /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "font-mono", children: [
42549
42895
  t2.from,
42550
42896
  " \u2192 ",
@@ -42563,7 +42909,7 @@ function TraitsTab({ traits: traits2 }) {
42563
42909
  ] }, i)) })
42564
42910
  ] }),
42565
42911
  trait.guards.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42566
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Guards" }),
42912
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.guards") }),
42567
42913
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: trait.guards.map((g, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
42568
42914
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: g.name }),
42569
42915
  /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: g.lastResult === true ? "success" : g.lastResult === false ? "danger" : "default", size: "sm", children: g.lastResult === void 0 ? "?" : g.lastResult ? "\u2713" : "\u2717" })
@@ -42669,7 +43015,7 @@ function EntitiesTab({ snapshot }) {
42669
43015
  EmptyState,
42670
43016
  {
42671
43017
  title: t("debug.noEntityData"),
42672
- description: "Debug mode may not be enabled",
43018
+ description: t("debug.debugModeHint"),
42673
43019
  className: "py-8"
42674
43020
  }
42675
43021
  );
@@ -42682,7 +43028,7 @@ function EntitiesTab({ snapshot }) {
42682
43028
  EmptyState,
42683
43029
  {
42684
43030
  title: t("debug.noEntities"),
42685
- description: "Entities will appear when spawned",
43031
+ description: t("debug.entitiesSpawnHint"),
42686
43032
  className: "py-8"
42687
43033
  }
42688
43034
  );
@@ -42690,7 +43036,7 @@ function EntitiesTab({ snapshot }) {
42690
43036
  const singletonItems = singletonEntries.map(([name, data]) => ({
42691
43037
  id: `singleton-${name}`,
42692
43038
  header: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
42693
- /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "sm", children: "Singleton" }),
43039
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "sm", children: t("debug.singleton") }),
42694
43040
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", weight: "semibold", className: "text-sky-600 dark:text-sky-400", children: name })
42695
43041
  ] }),
42696
43042
  content: /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "text-xs text-gray-600 dark:text-gray-400 bg-gray-50 dark:bg-gray-800 p-2 rounded overflow-auto max-h-40", children: JSON.stringify(data, null, 2) })
@@ -42708,31 +43054,19 @@ function EntitiesTab({ snapshot }) {
42708
43054
  }));
42709
43055
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--entities", children: [
42710
43056
  singletonItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4", children: [
42711
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
42712
- "Singletons (",
42713
- singletonItems.length,
42714
- ")"
42715
- ] }),
43057
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.singletonsCount", { count: singletonItems.length }) }),
42716
43058
  /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: singletonItems, multiple: true })
42717
43059
  ] }),
42718
43060
  runtimeItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4", children: [
42719
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
42720
- "Runtime (",
42721
- runtimeEntities.length,
42722
- ")"
42723
- ] }),
43061
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.runtimeCount", { count: runtimeEntities.length }) }),
42724
43062
  /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: runtimeItems, multiple: true }),
42725
- runtimeEntities.length > 20 && /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-400 text-center mt-2", children: [
42726
- "+",
42727
- runtimeEntities.length - 20,
42728
- " more entities"
42729
- ] })
43063
+ runtimeEntities.length > 20 && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-400 text-center mt-2", children: t("debug.moreEntities", { count: runtimeEntities.length - 20 }) })
42730
43064
  ] }),
42731
43065
  persistentEntries.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42732
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Persistent" }),
43066
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.persistent") }),
42733
43067
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: persistentEntries.map(([type, info]) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between py-1", children: [
42734
43068
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: type }),
42735
- /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: info.loaded ? "success" : "default", size: "sm", children: info.loaded ? `${info.count} loaded` : "not loaded" })
43069
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: info.loaded ? "success" : "default", size: "sm", children: info.loaded ? t("debug.loadedCount", { count: info.count }) : t("debug.notLoaded") })
42736
43070
  ] }, type)) })
42737
43071
  ] })
42738
43072
  ] });
@@ -42776,7 +43110,7 @@ function EventFlowTab({ events: events2 }) {
42776
43110
  EmptyState,
42777
43111
  {
42778
43112
  title: t("debug.noEventsYet"),
42779
- description: "Events will appear as traits, ticks, and other systems execute",
43113
+ description: t("debug.eventsExecuteHint"),
42780
43114
  className: "py-8"
42781
43115
  }
42782
43116
  );
@@ -42787,17 +43121,13 @@ function EventFlowTab({ events: events2 }) {
42787
43121
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--events", children: [
42788
43122
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 mb-3 flex-wrap", children: [
42789
43123
  /* @__PURE__ */ jsxRuntime.jsxs(ButtonGroup, { children: [
42790
- /* @__PURE__ */ jsxRuntime.jsxs(
43124
+ /* @__PURE__ */ jsxRuntime.jsx(
42791
43125
  Button,
42792
43126
  {
42793
43127
  size: "sm",
42794
43128
  variant: filter === "all" ? "primary" : "secondary",
42795
43129
  onClick: () => setFilter("all"),
42796
- children: [
42797
- "All (",
42798
- events2.length,
42799
- ")"
42800
- ]
43130
+ children: t("debug.allCount", { count: events2.length })
42801
43131
  }
42802
43132
  ),
42803
43133
  eventTypes.map((type) => {
@@ -42827,7 +43157,7 @@ function EventFlowTab({ events: events2 }) {
42827
43157
  onChange: (e) => setAutoScroll(e.target.checked)
42828
43158
  }
42829
43159
  ),
42830
- "Auto-scroll"
43160
+ t("debug.autoScroll")
42831
43161
  ] })
42832
43162
  ] }),
42833
43163
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -42885,7 +43215,7 @@ function GuardsPanel({ guards }) {
42885
43215
  EmptyState,
42886
43216
  {
42887
43217
  title: t("debug.noGuardEvaluations"),
42888
- description: "Guard evaluations will appear when transitions or ticks with guards execute",
43218
+ description: t("debug.guardEvaluationsHint"),
42889
43219
  className: "py-8"
42890
43220
  }
42891
43221
  );
@@ -42916,15 +43246,15 @@ function GuardsPanel({ guards }) {
42916
43246
  ] }),
42917
43247
  content: /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "sm", children: [
42918
43248
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42919
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Expression" }),
43249
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.expression") }),
42920
43250
  /* @__PURE__ */ jsxRuntime.jsx("code", { className: "block mt-1 text-xs text-amber-600 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20 px-2 py-1 rounded", children: guard.expression })
42921
43251
  ] }),
42922
43252
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42923
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Inputs" }),
43253
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.inputs") }),
42924
43254
  /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "mt-1 text-xs text-gray-600 dark:text-gray-400 bg-gray-50 dark:bg-gray-800 p-2 rounded overflow-auto max-h-24", children: JSON.stringify(guard.inputs, null, 2) })
42925
43255
  ] }),
42926
43256
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42927
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Trait" }),
43257
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.trait") }),
42928
43258
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: guard.context.traitName })
42929
43259
  ] })
42930
43260
  ] })
@@ -42942,9 +43272,9 @@ function GuardsPanel({ guards }) {
42942
43272
  ] })
42943
43273
  ] }),
42944
43274
  /* @__PURE__ */ jsxRuntime.jsxs(ButtonGroup, { children: [
42945
- /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: "All" }),
42946
- /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: "Passed" }),
42947
- /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "failed" ? "primary" : "secondary", onClick: () => setFilter("failed"), children: "Failed" })
43275
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: t("debug.filterAll") }),
43276
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: t("debug.filterPassed") }),
43277
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "failed" ? "primary" : "secondary", onClick: () => setFilter("failed"), children: t("debug.filterFailed") })
42948
43278
  ] })
42949
43279
  ] }),
42950
43280
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-80 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: accordionItems }) })
@@ -43070,7 +43400,7 @@ function TransitionTimeline({ transitions }) {
43070
43400
  EmptyState,
43071
43401
  {
43072
43402
  title: t("debug.noTransitionsRecorded"),
43073
- description: "Transitions will appear as the state machine processes events",
43403
+ description: t("debug.transitionsProcessHint"),
43074
43404
  className: "py-8"
43075
43405
  }
43076
43406
  );
@@ -43087,10 +43417,7 @@ function TransitionTimeline({ transitions }) {
43087
43417
  const sorted = [...transitions].reverse();
43088
43418
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--timeline", children: [
43089
43419
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-2", children: [
43090
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-500", children: [
43091
- transitions.length,
43092
- " transitions recorded"
43093
- ] }),
43420
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500", children: t("debug.transitionsRecorded", { count: transitions.length }) }),
43094
43421
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-1 text-xs text-gray-500 cursor-pointer", children: [
43095
43422
  /* @__PURE__ */ jsxRuntime.jsx(
43096
43423
  Checkbox,
@@ -43099,7 +43426,7 @@ function TransitionTimeline({ transitions }) {
43099
43426
  onChange: (e) => setAutoScroll(e.target.checked)
43100
43427
  }
43101
43428
  ),
43102
- "Auto-scroll"
43429
+ t("debug.autoScroll")
43103
43430
  ] })
43104
43431
  ] }),
43105
43432
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -43142,15 +43469,13 @@ function TransitionTimeline({ transitions }) {
43142
43469
  variant: trace.guardResult ? "success" : "danger",
43143
43470
  size: "sm",
43144
43471
  children: [
43145
- "guard: ",
43472
+ t("debug.guardLabel"),
43473
+ " ",
43146
43474
  trace.guardResult ? "\u2713" : "\u2717"
43147
43475
  ]
43148
43476
  }
43149
43477
  ),
43150
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: [
43151
- trace.effects.length,
43152
- " effects"
43153
- ] })
43478
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: t("debug.effectsCount", { count: trace.effects.length }) })
43154
43479
  ] }),
43155
43480
  isExpanded && trace.effects.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-2 mt-1 mb-2 pl-2 border-l border-gray-200 dark:border-gray-700 space-y-1", children: trace.effects.map((effect, eIdx) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [
43156
43481
  /* @__PURE__ */ jsxRuntime.jsx(EffectBadge, { effect }),
@@ -43199,13 +43524,13 @@ function ServerBridgeTab({ bridge }) {
43199
43524
  EmptyState,
43200
43525
  {
43201
43526
  title: t("debug.noBridgeData"),
43202
- description: "The ServerBridge has not been initialized. Bridge health will appear once the runtime connects to the server.",
43527
+ description: t("debug.bridgeInitHint"),
43203
43528
  className: "py-8"
43204
43529
  }
43205
43530
  );
43206
43531
  }
43207
43532
  const formatTime4 = (ts) => {
43208
- if (ts === 0) return "Never";
43533
+ if (ts === 0) return t("debug.never");
43209
43534
  const d = new Date(ts);
43210
43535
  return d.toLocaleTimeString("en-US", {
43211
43536
  hour12: false,
@@ -43218,14 +43543,14 @@ function ServerBridgeTab({ bridge }) {
43218
43543
  /* @__PURE__ */ jsxRuntime.jsxs(Card, { className: "p-3", children: [
43219
43544
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 mb-3", children: [
43220
43545
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: `w-3 h-3 rounded-full ${bridge.connected ? "bg-green-500 animate-pulse" : "bg-red-500"}` }),
43221
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: bridge.connected ? "Connected" : "Disconnected" })
43546
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: bridge.connected ? t("debug.connected") : t("debug.disconnected") })
43222
43547
  ] }),
43223
43548
  /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "xs", children: [
43224
43549
  /* @__PURE__ */ jsxRuntime.jsx(
43225
43550
  StatRow,
43226
43551
  {
43227
43552
  label: t("debug.status"),
43228
- value: bridge.connected ? "Connected" : "Disconnected",
43553
+ value: bridge.connected ? t("debug.connected") : t("debug.disconnected"),
43229
43554
  variant: bridge.connected ? "success" : "danger"
43230
43555
  }
43231
43556
  ),
@@ -43253,13 +43578,10 @@ function ServerBridgeTab({ bridge }) {
43253
43578
  ] })
43254
43579
  ] }),
43255
43580
  bridge.lastError && /* @__PURE__ */ jsxRuntime.jsxs(Card, { className: "p-3 border-red-200 dark:border-red-800 bg-red-50 dark:bg-red-950", children: [
43256
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "semibold", className: "text-red-600 dark:text-red-400 mb-1", children: "Last Error" }),
43581
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "semibold", className: "text-red-600 dark:text-red-400 mb-1", children: t("debug.lastError") }),
43257
43582
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-red-500 font-mono break-all", children: bridge.lastError })
43258
43583
  ] }),
43259
- bridge.connected && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-2", children: /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-400", children: [
43260
- bridge.eventsForwarded + bridge.eventsReceived,
43261
- " total events processed"
43262
- ] }) })
43584
+ bridge.connected && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-2", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-400", children: t("debug.totalEventsProcessed", { count: bridge.eventsForwarded + bridge.eventsReceived }) }) })
43263
43585
  ] }) });
43264
43586
  }
43265
43587
  var init_ServerBridgeTab = __esm({
@@ -43369,7 +43691,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43369
43691
  EmptyState,
43370
43692
  {
43371
43693
  title: t("debug.noActiveTraits"),
43372
- description: "Traits will appear when the state machine initializes",
43694
+ description: t("debug.traitsInitHint"),
43373
43695
  className: "py-8"
43374
43696
  }
43375
43697
  );
@@ -43386,7 +43708,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43386
43708
  };
43387
43709
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--dispatch", children: [
43388
43710
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3", children: [
43389
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Active States" }),
43711
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.activeStates") }),
43390
43712
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: traits2.map((trait) => /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "success", size: "sm", children: [
43391
43713
  trait.name,
43392
43714
  ": ",
@@ -43394,8 +43716,8 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43394
43716
  ] }, trait.id)) })
43395
43717
  ] }),
43396
43718
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3", children: [
43397
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Available Events" }),
43398
- availableEvents.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-400 italic", children: "No transitions from current state" }) : /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: availableEvents.map(({ event, transitions }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43719
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.availableEvents") }),
43720
+ availableEvents.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-400 italic", children: t("debug.noTransitionsFromState") }) : /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: availableEvents.map(({ event, transitions }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43399
43721
  /* @__PURE__ */ jsxRuntime.jsx(
43400
43722
  Button,
43401
43723
  {
@@ -43407,15 +43729,15 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43407
43729
  }
43408
43730
  ),
43409
43731
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500", children: transitions.map((t2) => `${t2.from} -> ${t2.to}`).join(", ") }),
43410
- transitions.some((t2) => t2.guard) && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "warning", size: "sm", children: "guarded" })
43732
+ transitions.some((tr) => tr.guard) && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "warning", size: "sm", children: t("debug.guarded") })
43411
43733
  ] }, event)) })
43412
43734
  ] }),
43413
43735
  unavailableEvents.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3", children: [
43414
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Other Events (not available from current state)" }),
43736
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.otherEvents") }),
43415
43737
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: unavailableEvents.map((event) => /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "default", size: "sm", className: "opacity-50", children: event }, event)) })
43416
43738
  ] }),
43417
43739
  log12.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
43418
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Recent Transitions" }),
43740
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.recentTransitions") }),
43419
43741
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: log12.map((entry, i) => /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "font-mono text-xs", children: [
43420
43742
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-400", children: entry.traitName }),
43421
43743
  " ",
@@ -43446,21 +43768,20 @@ var init_RuntimeDebugger = __esm({
43446
43768
  }
43447
43769
  });
43448
43770
  function ServerResponseRow({ sr }) {
43771
+ const { t } = useTranslate();
43449
43772
  const entityEntries = Object.entries(sr.dataEntities);
43450
43773
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-4 pl-2 border-l border-purple-500/30 py-0.5 text-xs font-mono", children: [
43451
43774
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43452
43775
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: sr.success ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400", children: [
43453
43776
  sr.success ? "\u2713" : "\u2717",
43454
- " server"
43777
+ " ",
43778
+ t("debug.server")
43455
43779
  ] }),
43456
43780
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-300", children: sr.orbitalName }),
43457
- sr.clientEffects > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "px-1 rounded bg-purple-500/15 text-purple-600 dark:text-purple-300", children: [
43458
- sr.clientEffects,
43459
- " clientEffect",
43460
- sr.clientEffects !== 1 ? "s" : ""
43461
- ] }),
43781
+ sr.clientEffects > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "px-1 rounded bg-purple-500/15 text-purple-600 dark:text-purple-300", children: t("debug.clientEffectsCount", { count: sr.clientEffects }) }),
43462
43782
  sr.emittedEvents.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "px-1 rounded bg-blue-500/15 text-blue-300", children: [
43463
- "emit: ",
43783
+ t("debug.emitLabel"),
43784
+ " ",
43464
43785
  sr.emittedEvents.join(", ")
43465
43786
  ] }),
43466
43787
  sr.error && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "px-1 rounded bg-red-500/15 text-red-600 dark:text-red-400 truncate max-w-[300px]", children: sr.error })
@@ -43468,13 +43789,12 @@ function ServerResponseRow({ sr }) {
43468
43789
  entityEntries.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1 mt-0.5", children: entityEntries.map(([name, count]) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "px-1 rounded bg-[var(--color-card)] text-foreground", children: [
43469
43790
  name,
43470
43791
  ": ",
43471
- count,
43472
- " row",
43473
- count !== 1 ? "s" : ""
43792
+ t("debug.rowsCount", { count })
43474
43793
  ] }, name)) })
43475
43794
  ] });
43476
43795
  }
43477
43796
  function TransitionRow({ trace }) {
43797
+ const { t } = useTranslate();
43478
43798
  const isServerEntry = !!trace.serverResponse && trace.traitName.startsWith("server:");
43479
43799
  const hasFailedEffects = trace.effects.some((e) => e.status === "failed");
43480
43800
  if (isServerEntry && trace.serverResponse) {
@@ -43482,7 +43802,7 @@ function TransitionRow({ trace }) {
43482
43802
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-2 text-xs font-mono", children: [
43483
43803
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-1.5 w-1.5 h-1.5 rounded-full flex-shrink-0 bg-purple-500" }),
43484
43804
  /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "warning", size: "sm", className: "flex-shrink-0", children: trace.event }),
43485
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-400 flex-shrink-0", children: "server response" })
43805
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-400 flex-shrink-0", children: t("debug.serverResponse") })
43486
43806
  ] }),
43487
43807
  /* @__PURE__ */ jsxRuntime.jsx(ServerResponseRow, { sr: trace.serverResponse })
43488
43808
  ] });
@@ -43523,6 +43843,7 @@ function VerifyModePanel({
43523
43843
  serverCount,
43524
43844
  localCount
43525
43845
  }) {
43846
+ const { t } = useTranslate();
43526
43847
  const [expanded, setExpanded] = React85__namespace.useState(true);
43527
43848
  const scrollRef = React85__namespace.useRef(null);
43528
43849
  const prevCountRef = React85__namespace.useRef(0);
@@ -43553,30 +43874,20 @@ function VerifyModePanel({
43553
43874
  onClick: () => setExpanded((v) => !v),
43554
43875
  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",
43555
43876
  "aria-expanded": expanded,
43556
- "aria-label": expanded ? "Collapse verification timeline" : "Expand verification timeline",
43877
+ "aria-label": expanded ? t("debug.collapseVerificationTimeline") : t("debug.expandVerificationTimeline"),
43557
43878
  "data-testid": "debugger-verify-toggle",
43558
43879
  children: [
43559
43880
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground/50 w-3", "aria-hidden": true, children: expanded ? "\u25BE" : "\u25B8" }),
43560
- /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? `${failedChecks} fail` : "OK" }),
43561
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-foreground/70", children: [
43562
- localCount,
43563
- " local"
43564
- ] }),
43565
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-purple-600 dark:text-purple-400", children: [
43566
- serverCount,
43567
- " server"
43568
- ] }),
43881
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? t("debug.failCount", { count: failedChecks }) : t("debug.ok") }),
43882
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground/70", children: t("debug.localCount", { count: localCount }) }),
43883
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-400", children: t("debug.serverCount", { count: serverCount }) }),
43569
43884
  traitStates && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-cyan-600 dark:text-cyan-400 truncate max-w-[400px]", children: traitStates }),
43570
- !expanded && transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ml-auto text-foreground/50", children: [
43571
- transitions.length,
43572
- " transition",
43573
- transitions.length !== 1 ? "s" : ""
43574
- ] })
43885
+ !expanded && transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto text-foreground/50", children: t("debug.transitionsCount", { count: transitions.length }) })
43575
43886
  ]
43576
43887
  }
43577
43888
  ),
43578
43889
  expanded && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 flex overflow-hidden", children: [
43579
- /* @__PURE__ */ jsxRuntime.jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-1", children: transitions.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-foreground/50 text-xs font-mono py-2 text-center", children: "Waiting for transitions..." }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-0.5", children: transitions.map((trace) => /* @__PURE__ */ jsxRuntime.jsx(TransitionRow, { trace }, trace.id)) }) }) }),
43890
+ /* @__PURE__ */ jsxRuntime.jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-1", children: transitions.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-foreground/50 text-xs font-mono py-2 text-center", children: t("debug.waitingForTransitions") }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-0.5", children: transitions.map((trace) => /* @__PURE__ */ jsxRuntime.jsx(TransitionRow, { trace }, trace.id)) }) }) }),
43580
43891
  /* @__PURE__ */ jsxRuntime.jsx(WalkMinimap, {})
43581
43892
  ] })
43582
43893
  ]
@@ -43592,6 +43903,7 @@ function RuntimeDebugger({
43592
43903
  defaultTab,
43593
43904
  schema
43594
43905
  }) {
43906
+ const { t } = useTranslate();
43595
43907
  const [isCollapsed, setIsCollapsed] = React85__namespace.useState(mode === "verify" ? true : defaultCollapsed);
43596
43908
  const [isVisible, setIsVisible] = React85__namespace.useState(mode === "inline" || mode === "verify" || isDebugEnabled2());
43597
43909
  const debugData = useDebugData();
@@ -43630,55 +43942,55 @@ function RuntimeDebugger({
43630
43942
  const tabItems = [
43631
43943
  {
43632
43944
  id: "dispatch",
43633
- label: "Dispatch",
43945
+ label: t("debug.tabDispatch"),
43634
43946
  badge: debugData.traits.length || void 0,
43635
43947
  content: /* @__PURE__ */ jsxRuntime.jsx(EventDispatcherTab, { traits: debugData.traits, schema })
43636
43948
  },
43637
43949
  {
43638
43950
  id: "verify",
43639
- label: failedChecks > 0 ? "Verify (!)" : "Verify",
43951
+ label: failedChecks > 0 ? t("debug.tabVerifyAlert") : t("debug.tabVerify"),
43640
43952
  badge: verification.summary.totalChecks || void 0,
43641
43953
  content: /* @__PURE__ */ jsxRuntime.jsx(VerificationTab, { checks: verification.checks, summary: verification.summary })
43642
43954
  },
43643
43955
  {
43644
43956
  id: "timeline",
43645
- label: "Timeline",
43957
+ label: t("debug.tabTimeline"),
43646
43958
  badge: verification.transitions.length || void 0,
43647
43959
  content: /* @__PURE__ */ jsxRuntime.jsx(TransitionTimeline, { transitions: verification.transitions })
43648
43960
  },
43649
43961
  {
43650
43962
  id: "bridge",
43651
- label: "Bridge",
43963
+ label: t("debug.tabBridge"),
43652
43964
  badge: verification.bridge?.connected ? void 0 : 1,
43653
43965
  content: /* @__PURE__ */ jsxRuntime.jsx(ServerBridgeTab, { bridge: verification.bridge })
43654
43966
  },
43655
43967
  {
43656
43968
  id: "traits",
43657
- label: "Traits",
43969
+ label: t("debug.tabTraits"),
43658
43970
  badge: debugData.traits.length || void 0,
43659
43971
  content: /* @__PURE__ */ jsxRuntime.jsx(TraitsTab, { traits: debugData.traits })
43660
43972
  },
43661
43973
  {
43662
43974
  id: "ticks",
43663
- label: "Ticks",
43664
- badge: debugData.ticks.filter((t) => t.active).length || void 0,
43975
+ label: t("debug.tabTicks"),
43976
+ badge: debugData.ticks.filter((tick) => tick.active).length || void 0,
43665
43977
  content: /* @__PURE__ */ jsxRuntime.jsx(TicksTab, { ticks: debugData.ticks })
43666
43978
  },
43667
43979
  {
43668
43980
  id: "entities",
43669
- label: "Entities",
43981
+ label: t("debug.tabEntities"),
43670
43982
  badge: debugData.entitySnapshot?.runtime.length || void 0,
43671
43983
  content: /* @__PURE__ */ jsxRuntime.jsx(EntitiesTab, { snapshot: debugData.entitySnapshot })
43672
43984
  },
43673
43985
  {
43674
43986
  id: "events",
43675
- label: "Events",
43987
+ label: t("debug.tabEvents"),
43676
43988
  badge: debugData.events.length > 0 ? debugData.events.length : void 0,
43677
43989
  content: /* @__PURE__ */ jsxRuntime.jsx(EventFlowTab, { events: debugData.events })
43678
43990
  },
43679
43991
  {
43680
43992
  id: "guards",
43681
- label: "Guards",
43993
+ label: t("debug.tabGuards"),
43682
43994
  badge: debugData.guards.filter((g) => !g.result).length || void 0,
43683
43995
  content: /* @__PURE__ */ jsxRuntime.jsx(GuardsPanel, { guards: debugData.guards })
43684
43996
  }
@@ -43706,15 +44018,10 @@ function RuntimeDebugger({
43706
44018
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43707
44019
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "h6", style: { fontSize: "0.75rem" }, children: [
43708
44020
  isCollapsed ? "\u25B6" : "\u25BC",
43709
- " Debugger"
44021
+ " ",
44022
+ t("debug.debugger")
43710
44023
  ] }),
43711
- failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "danger", size: "sm", children: [
43712
- failedChecks,
43713
- " failed"
43714
- ] }) : debugData.traits.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "success", size: "sm", children: [
43715
- debugData.traits.length,
43716
- " traits"
43717
- ] }) : /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "info", size: "sm", children: "Idle" })
44024
+ failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "danger", size: "sm", children: t("debug.failedCount", { count: failedChecks }) }) : debugData.traits.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "success", size: "sm", children: t("debug.traitsCount", { count: debugData.traits.length }) }) : /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "info", size: "sm", children: t("debug.idle") })
43718
44025
  ] })
43719
44026
  }
43720
44027
  ),
@@ -43732,9 +44039,9 @@ function RuntimeDebugger({
43732
44039
  );
43733
44040
  }
43734
44041
  if (mode === "verify") {
43735
- const traitStates = debugData.traits.map((t) => `${t.name}:${t.currentState}`).join(" | ");
43736
- const serverEntries = verification.transitions.filter((t) => t.serverResponse);
43737
- const localEntries = verification.transitions.filter((t) => !t.serverResponse);
44042
+ const traitStates = debugData.traits.map((t2) => `${t2.name}:${t2.currentState}`).join(" | ");
44043
+ const serverEntries = verification.transitions.filter((t2) => t2.serverResponse);
44044
+ const localEntries = verification.transitions.filter((t2) => !t2.serverResponse);
43738
44045
  return /* @__PURE__ */ jsxRuntime.jsx(
43739
44046
  VerifyModePanel,
43740
44047
  {
@@ -43766,7 +44073,7 @@ function RuntimeDebugger({
43766
44073
  variant: "secondary",
43767
44074
  size: "sm",
43768
44075
  className: "runtime-debugger__toggle",
43769
- title: "Open Debugger (`)",
44076
+ title: t("debug.openDebugger"),
43770
44077
  children: failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "relative", children: [
43771
44078
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: "V" }),
43772
44079
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute -top-1 -right-2 w-2 h-2 bg-red-500 rounded-full" })
@@ -43776,11 +44083,8 @@ function RuntimeDebugger({
43776
44083
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "runtime-debugger__header", children: [
43777
44084
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43778
44085
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-lg", children: "V" }),
43779
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: "KFlow Verifier" }),
43780
- failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "danger", size: "sm", children: [
43781
- failedChecks,
43782
- " failed"
43783
- ] }) : verification.summary.totalChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "success", size: "sm", children: "All passing" }) : /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "info", size: "sm", children: "Runtime" })
44086
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: t("debug.kflowVerifier") }),
44087
+ failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "danger", size: "sm", children: t("debug.failedCount", { count: failedChecks }) }) : verification.summary.totalChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "success", size: "sm", children: t("debug.allPassing") }) : /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "info", size: "sm", children: t("debug.runtime") })
43784
44088
  ] }),
43785
44089
  /* @__PURE__ */ jsxRuntime.jsx(
43786
44090
  Button,
@@ -43788,7 +44092,7 @@ function RuntimeDebugger({
43788
44092
  onClick: () => setIsCollapsed(true),
43789
44093
  variant: "ghost",
43790
44094
  size: "sm",
43791
- title: "Close (`)",
44095
+ title: t("debug.close"),
43792
44096
  children: "x"
43793
44097
  }
43794
44098
  )
@@ -43802,7 +44106,7 @@ function RuntimeDebugger({
43802
44106
  className: "runtime-debugger__tabs"
43803
44107
  }
43804
44108
  ) }),
43805
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "runtime-debugger__footer", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-foreground/50", children: "Press ` to toggle | window.__orbitalVerification for automation" }) })
44109
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "runtime-debugger__footer", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-foreground/50", children: t("debug.toggleHint") }) })
43806
44110
  ] })
43807
44111
  }
43808
44112
  );
@@ -43828,6 +44132,7 @@ var init_RuntimeDebugger2 = __esm({
43828
44132
  init_TransitionTimeline();
43829
44133
  init_ServerBridgeTab();
43830
44134
  init_EventDispatcherTab();
44135
+ init_useTranslate();
43831
44136
  init_RuntimeDebugger();
43832
44137
  RuntimeDebugger.displayName = "RuntimeDebugger";
43833
44138
  }
@@ -45116,7 +45421,7 @@ var init_StatCard = __esm({
45116
45421
  }
45117
45422
  );
45118
45423
  }
45119
- const label = schemaStats?.[0]?.label || labelToUse || "Stat";
45424
+ const label = schemaStats?.[0]?.label || labelToUse || t("statCard.defaultLabel");
45120
45425
  const normalizedPropValue = Array.isArray(propValue) ? propValue[0] ?? propValue.length : propValue;
45121
45426
  const value = schemaStats?.[0]?.value ?? normalizedPropValue ?? 0;
45122
45427
  const trendDirection = manualDirection || (calculatedTrend === void 0 || calculatedTrend === 0 ? "neutral" : calculatedTrend > 0 ? "up" : "down");
@@ -45159,7 +45464,7 @@ var init_StatCard = __esm({
45159
45464
  ]
45160
45465
  }
45161
45466
  ),
45162
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", as: "span", children: "vs last period" })
45467
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", as: "span", children: t("statCard.vsLastPeriod") })
45163
45468
  ] }),
45164
45469
  subtitle && !calculatedTrend && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", children: subtitle })
45165
45470
  ] }),