@almadar/ui 5.21.8 → 5.21.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
  )
@@ -14865,7 +15159,7 @@ var init_StateMachineView = __esm({
14865
15159
  const endX2 = fromState.x + Math.cos(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
14866
15160
  const endY2 = fromState.y + Math.sin(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
14867
15161
  const isSingle2 = bundle.labels.length === 1;
14868
- 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 });
14869
15163
  const bundleColor2 = isSingle2 ? config.colors.arrow : "var(--color-accent)";
14870
15164
  const labelWidth2 = labelText2.length * 9 + (isSingle2 ? 24 : 40);
14871
15165
  const cx = fromState.x;
@@ -14991,7 +15285,7 @@ var init_StateMachineView = __esm({
14991
15285
  const controlX = midX + perpX;
14992
15286
  const controlY = midY + perpY;
14993
15287
  const isSingle = bundle.labels.length === 1;
14994
- 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 });
14995
15289
  const labelWidth = labelText.length * 9 + (isSingle ? 24 : 40);
14996
15290
  const bundleColor = isSingle ? config.colors.arrow : "var(--color-accent)";
14997
15291
  const curveMidpoint = {
@@ -15146,7 +15440,7 @@ var init_StateMachineView = __esm({
15146
15440
  {
15147
15441
  className: "absolute -top-2 left-1/2 transform -translate-x-1/2 px-2 py-0.5 rounded-full",
15148
15442
  style: { backgroundColor: "var(--color-success)" },
15149
- 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") })
15150
15444
  }
15151
15445
  ),
15152
15446
  !isSingle && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -15168,10 +15462,7 @@ var init_StateMachineView = __esm({
15168
15462
  {
15169
15463
  className: "ml-2 px-2 py-0.5 rounded-full",
15170
15464
  style: { backgroundColor: "var(--color-accent)" },
15171
- children: /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: [
15172
- bundle.labels.length,
15173
- " events"
15174
- ] })
15465
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: t("stateMachine.eventCount", { count: bundle.labels.length }) })
15175
15466
  }
15176
15467
  )
15177
15468
  ]
@@ -15316,7 +15607,7 @@ var init_StateMachineView = __esm({
15316
15607
  align: "center",
15317
15608
  className: "mb-2",
15318
15609
  style: { color: "var(--color-warning)", fontSize: "13px" },
15319
- children: "External Effects"
15610
+ children: t("stateMachine.externalEffects")
15320
15611
  }
15321
15612
  ),
15322
15613
  outputs.outputs.map((output, idx) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -15336,10 +15627,10 @@ var init_StateMachineView = __esm({
15336
15627
  Legend = ({ config, y }) => {
15337
15628
  const { t } = useTranslate();
15338
15629
  const items = [
15339
- { label: "Initial", color: config.colors.initialNode },
15340
- { label: "Final", color: config.colors.finalNode },
15341
- { label: "State", color: config.colors.nodeBorder },
15342
- { 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 }
15343
15634
  ];
15344
15635
  return /* @__PURE__ */ jsxRuntime.jsx(
15345
15636
  HStack,
@@ -15354,8 +15645,8 @@ var init_StateMachineView = __esm({
15354
15645
  {
15355
15646
  className: "w-3 h-3 rounded-full",
15356
15647
  style: {
15357
- backgroundColor: item.label === "Multi-event" ? item.color : config.colors.node,
15358
- 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"
15359
15650
  }
15360
15651
  }
15361
15652
  ),
@@ -15367,7 +15658,7 @@ var init_StateMachineView = __esm({
15367
15658
  children: item.label
15368
15659
  }
15369
15660
  )
15370
- ] }, item.label))
15661
+ ] }, item.key))
15371
15662
  }
15372
15663
  );
15373
15664
  };
@@ -16161,13 +16452,13 @@ var init_JazariStateMachine = __esm({
16161
16452
  );
16162
16453
  }, [resolvedTrait, entityFields]);
16163
16454
  if (isLoading) {
16164
- return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: "Loading state machine\u2026" });
16455
+ return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: t("stateMachine.loading") });
16165
16456
  }
16166
16457
  if (error) {
16167
16458
  return /* @__PURE__ */ jsxRuntime.jsx(ErrorState, { message: error instanceof Error ? error.message : String(error) });
16168
16459
  }
16169
16460
  if (!resolvedTrait || !layoutData || layoutData.states.length === 0) {
16170
- 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") }) });
16171
16462
  }
16172
16463
  return /* @__PURE__ */ jsxRuntime.jsx(
16173
16464
  StateMachineView,
@@ -17211,13 +17502,13 @@ var init_LayoutPatterns = __esm({
17211
17502
  function generateRuleId() {
17212
17503
  return `rule-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
17213
17504
  }
17214
- function questionsToOptions(questions, includeEndOfSurvey) {
17505
+ function questionsToOptions(questions, endOfSurveyLabel) {
17215
17506
  const opts = questions.map((q) => ({
17216
17507
  value: q.id,
17217
17508
  label: q.label
17218
17509
  }));
17219
- if (includeEndOfSurvey) {
17220
- opts.push({ value: END_OF_SURVEY, label: "End of survey" });
17510
+ if (endOfSurveyLabel !== null) {
17511
+ opts.push({ value: END_OF_SURVEY, label: endOfSurveyLabel });
17221
17512
  }
17222
17513
  return opts;
17223
17514
  }
@@ -17226,7 +17517,7 @@ function isRuleBroken(rule, questions) {
17226
17517
  const targetExists = rule.targetQuestionId === END_OF_SURVEY || questions.some((q) => q.id === rule.targetQuestionId);
17227
17518
  return !sourceExists || !targetExists;
17228
17519
  }
17229
- 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;
17230
17521
  var init_BranchingLogicBuilder = __esm({
17231
17522
  "components/core/molecules/BranchingLogicBuilder.tsx"() {
17232
17523
  "use client";
@@ -17239,14 +17530,9 @@ var init_BranchingLogicBuilder = __esm({
17239
17530
  init_FilterPill();
17240
17531
  init_Box();
17241
17532
  init_useEventBus();
17533
+ init_useTranslate();
17242
17534
  init_cn();
17243
17535
  END_OF_SURVEY = "end-of-survey";
17244
- OPERATOR_OPTIONS = [
17245
- { value: "equals", label: "equals" },
17246
- { value: "not-equals", label: "does not equal" },
17247
- { value: "contains", label: "contains" },
17248
- { value: "in", label: "is one of" }
17249
- ];
17250
17536
  RuleRow = ({
17251
17537
  rule,
17252
17538
  questions,
@@ -17255,8 +17541,21 @@ var init_BranchingLogicBuilder = __esm({
17255
17541
  onChange,
17256
17542
  onDelete
17257
17543
  }) => {
17258
- const sourceOptions = React85.useMemo(() => questionsToOptions(questions, false), [questions]);
17259
- 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
+ );
17260
17559
  const sourceQuestion = questions.find((q) => q.id === rule.sourceQuestionId);
17261
17560
  const valueOptions = React85.useMemo(() => {
17262
17561
  if (!sourceQuestion?.optionValues) return [];
@@ -17301,22 +17600,22 @@ var init_BranchingLogicBuilder = __esm({
17301
17600
  ),
17302
17601
  children: [
17303
17602
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-wrap items-center gap-2", children: [
17304
- /* @__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") }),
17305
17604
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsxRuntime.jsx(
17306
17605
  Select,
17307
17606
  {
17308
17607
  options: sourceOptions,
17309
17608
  value: rule.sourceQuestionId,
17310
- placeholder: "Select question",
17609
+ placeholder: t("branchingLogic.selectQuestion"),
17311
17610
  onChange: handleSource,
17312
17611
  disabled: readOnly,
17313
- error: broken ? "Broken reference" : void 0
17612
+ error: broken ? t("branchingLogic.brokenReference") : void 0
17314
17613
  }
17315
17614
  ) }),
17316
17615
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[8rem] basis-32", children: /* @__PURE__ */ jsxRuntime.jsx(
17317
17616
  Select,
17318
17617
  {
17319
- options: OPERATOR_OPTIONS,
17618
+ options: operatorOptions,
17320
17619
  value: rule.operator,
17321
17620
  onChange: handleOperator,
17322
17621
  disabled: readOnly
@@ -17339,7 +17638,7 @@ var init_BranchingLogicBuilder = __esm({
17339
17638
  {
17340
17639
  options: valueOptions.filter((o) => !chips.includes(o.value)),
17341
17640
  value: "",
17342
- placeholder: "Add value",
17641
+ placeholder: t("branchingLogic.addValue"),
17343
17642
  onChange: handleAddChip,
17344
17643
  disabled: readOnly
17345
17644
  }
@@ -17347,7 +17646,7 @@ var init_BranchingLogicBuilder = __esm({
17347
17646
  Input,
17348
17647
  {
17349
17648
  inputType: "text",
17350
- placeholder: "Type value, press Enter",
17649
+ placeholder: t("branchingLogic.typeValuePressEnter"),
17351
17650
  value: "",
17352
17651
  onKeyDown: (e) => {
17353
17652
  if (e.key !== "Enter") return;
@@ -17365,7 +17664,7 @@ var init_BranchingLogicBuilder = __esm({
17365
17664
  {
17366
17665
  options: valueOptions,
17367
17666
  value: scalarValue,
17368
- placeholder: "Select value",
17667
+ placeholder: t("branchingLogic.selectValue"),
17369
17668
  onChange: (e) => onChange({ ...rule, value: e.target.value }),
17370
17669
  disabled: readOnly
17371
17670
  }
@@ -17373,7 +17672,7 @@ var init_BranchingLogicBuilder = __esm({
17373
17672
  Input,
17374
17673
  {
17375
17674
  inputType: "text",
17376
- placeholder: "Value",
17675
+ placeholder: t("branchingLogic.value"),
17377
17676
  value: scalarValue,
17378
17677
  onChange: handleScalarValue,
17379
17678
  disabled: readOnly
@@ -17381,17 +17680,17 @@ var init_BranchingLogicBuilder = __esm({
17381
17680
  ) }),
17382
17681
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "label", weight: "semibold", className: "shrink-0 inline-flex items-center gap-1", children: [
17383
17682
  /* @__PURE__ */ jsxRuntime.jsx(LucideIcons2.ArrowRight, { className: "h-4 w-4" }),
17384
- "go to"
17683
+ t("branchingLogic.goTo")
17385
17684
  ] }),
17386
17685
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsxRuntime.jsx(
17387
17686
  Select,
17388
17687
  {
17389
17688
  options: targetOptions,
17390
17689
  value: rule.targetQuestionId,
17391
- placeholder: "Select target",
17690
+ placeholder: t("branchingLogic.selectTarget"),
17392
17691
  onChange: handleTarget,
17393
17692
  disabled: readOnly,
17394
- error: broken && rule.targetQuestionId !== END_OF_SURVEY ? "Broken reference" : void 0
17693
+ error: broken && rule.targetQuestionId !== END_OF_SURVEY ? t("branchingLogic.brokenReference") : void 0
17395
17694
  }
17396
17695
  ) }),
17397
17696
  !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
@@ -17403,11 +17702,11 @@ var init_BranchingLogicBuilder = __esm({
17403
17702
  action: "DELETE_RULE",
17404
17703
  actionPayload: { ruleId: rule.id },
17405
17704
  onClick: onDelete,
17406
- "aria-label": "Delete rule"
17705
+ "aria-label": t("branchingLogic.deleteRule")
17407
17706
  }
17408
17707
  )
17409
17708
  ] }),
17410
- 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") })
17411
17710
  ]
17412
17711
  }
17413
17712
  );
@@ -17417,10 +17716,12 @@ var init_BranchingLogicBuilder = __esm({
17417
17716
  NODE_GAP_Y = 80;
17418
17717
  PADDING = 32;
17419
17718
  LogicGraph = ({ questions, rules }) => {
17719
+ const { t } = useTranslate();
17720
+ const endOfSurveyLabel = t("branchingLogic.endOfSurvey");
17420
17721
  const layout = React85.useMemo(() => {
17421
17722
  const items = [
17422
17723
  ...questions.map((q) => ({ id: q.id, label: q.label, isEnd: false })),
17423
- { id: END_OF_SURVEY, label: "End of survey", isEnd: true }
17724
+ { id: END_OF_SURVEY, label: endOfSurveyLabel, isEnd: true }
17424
17725
  ];
17425
17726
  const positions = {};
17426
17727
  items.forEach((item, i) => {
@@ -17432,14 +17733,14 @@ var init_BranchingLogicBuilder = __esm({
17432
17733
  const width = NODE_WIDTH + PADDING * 2 + 220;
17433
17734
  const height = PADDING * 2 + items.length * (NODE_HEIGHT + NODE_GAP_Y);
17434
17735
  return { items, positions, width, height };
17435
- }, [questions]);
17736
+ }, [questions, endOfSurveyLabel]);
17436
17737
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "overflow-auto rounded-container border border-border bg-card p-2", children: /* @__PURE__ */ jsxRuntime.jsxs(
17437
17738
  "svg",
17438
17739
  {
17439
17740
  width: layout.width,
17440
17741
  height: layout.height,
17441
17742
  role: "img",
17442
- "aria-label": "Branching logic graph",
17743
+ "aria-label": t("branchingLogic.graphAriaLabel"),
17443
17744
  style: { display: "block" },
17444
17745
  children: [
17445
17746
  /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -17547,6 +17848,7 @@ var init_BranchingLogicBuilder = __esm({
17547
17848
  readOnly = false,
17548
17849
  className
17549
17850
  }) => {
17851
+ const { t } = useTranslate();
17550
17852
  const eventBus = useEventBus();
17551
17853
  const questions = Array.isArray(questionsProp) ? questionsProp : [];
17552
17854
  const rulesInitial = Array.isArray(rulesProp) ? rulesProp : [];
@@ -17599,16 +17901,23 @@ var init_BranchingLogicBuilder = __esm({
17599
17901
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-wrap items-center justify-between gap-2", children: [
17600
17902
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-2", children: [
17601
17903
  /* @__PURE__ */ jsxRuntime.jsx(LucideIcons2.GitBranch, { className: "h-5 w-5 text-foreground" }),
17602
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "subheading", weight: "semibold", children: "Branching logic" }),
17904
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "subheading", weight: "semibold", children: t("branchingLogic.title") }),
17603
17905
  /* @__PURE__ */ jsxRuntime.jsx(
17604
17906
  Badge,
17605
17907
  {
17606
17908
  variant: "neutral",
17607
17909
  size: "sm",
17608
- 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 })
17609
17911
  }
17610
17912
  ),
17611
- 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
+ )
17612
17921
  ] }),
17613
17922
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-1 rounded-sm border border-border bg-card p-0.5", children: [
17614
17923
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -17619,7 +17928,7 @@ var init_BranchingLogicBuilder = __esm({
17619
17928
  leftIcon: LucideIcons2.Pencil,
17620
17929
  action: "VIEW_EDIT",
17621
17930
  onClick: () => setView("edit"),
17622
- children: "Rules"
17931
+ children: t("branchingLogic.rules")
17623
17932
  }
17624
17933
  ),
17625
17934
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -17630,13 +17939,13 @@ var init_BranchingLogicBuilder = __esm({
17630
17939
  leftIcon: LucideIcons2.Eye,
17631
17940
  action: "VIEW_GRAPH",
17632
17941
  onClick: () => setView("graph"),
17633
- children: "Logic graph"
17942
+ children: t("branchingLogic.logicGraph")
17634
17943
  }
17635
17944
  )
17636
17945
  ] })
17637
17946
  ] }),
17638
17947
  view === "edit" ? /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-col gap-2", children: [
17639
- 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(
17640
17949
  RuleRow,
17641
17950
  {
17642
17951
  rule,
@@ -17657,7 +17966,7 @@ var init_BranchingLogicBuilder = __esm({
17657
17966
  action: "ADD_RULE",
17658
17967
  onClick: handleAddRule,
17659
17968
  disabled: noQuestions,
17660
- children: "Add rule"
17969
+ children: t("branchingLogic.addRule")
17661
17970
  }
17662
17971
  ) })
17663
17972
  ] }) : /* @__PURE__ */ jsxRuntime.jsx(LogicGraph, { questions, rules })
@@ -18284,7 +18593,7 @@ function CalendarGrid({
18284
18593
  onClick: stepPrev,
18285
18594
  "aria-disabled": !canPrev || void 0,
18286
18595
  "aria-label": t("aria.previousDays"),
18287
- children: "Prev"
18596
+ children: t("nav.previous")
18288
18597
  }
18289
18598
  ),
18290
18599
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground", children: formatDateRange(visibleDays[0], visibleDays[visibleDays.length - 1]) }),
@@ -18297,7 +18606,7 @@ function CalendarGrid({
18297
18606
  onClick: stepNext,
18298
18607
  "aria-disabled": !canNext || void 0,
18299
18608
  "aria-label": t("aria.nextDays"),
18300
- children: "Next"
18609
+ children: t("nav.next")
18301
18610
  }
18302
18611
  )
18303
18612
  ] }),
@@ -19847,7 +20156,7 @@ var init_Pagination = __esm({
19847
20156
  type: "number",
19848
20157
  value: jumpToPage,
19849
20158
  onChange: (e) => setJumpToPage(e.target.value),
19850
- placeholder: "Page",
20159
+ placeholder: t("pagination.jumpPlaceholder"),
19851
20160
  className: "w-20",
19852
20161
  onKeyDown: (e) => {
19853
20162
  if (e.key === "Enter") {
@@ -19985,13 +20294,10 @@ var init_CardGrid = __esm({
19985
20294
  return children;
19986
20295
  }
19987
20296
  if (isLoading) {
19988
- 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") }) });
19989
20298
  }
19990
20299
  if (error) {
19991
- 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: [
19992
- "Error loading items: ",
19993
- error.message
19994
- ] }) });
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 }) }) });
19995
20301
  }
19996
20302
  if (normalizedData.length === 0) {
19997
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" }) });
@@ -23857,7 +24163,7 @@ function DataGrid({
23857
24163
  onChange: () => toggleSelection(id),
23858
24164
  onClick: (e) => e.stopPropagation(),
23859
24165
  className: "w-4 h-4 mt-1 flex-shrink-0 accent-primary",
23860
- "aria-label": `Select ${titleValue !== void 0 ? String(titleValue) : "item"}`
24166
+ "aria-label": t("card.selectItem", { item: titleValue !== void 0 ? String(titleValue) : t("card.itemFallback") })
23861
24167
  }
23862
24168
  ),
23863
24169
  /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "xs", className: "flex-1 min-w-0", children: [
@@ -24055,7 +24361,7 @@ function formatDate3(value) {
24055
24361
  if (isNaN(d.getTime())) return String(value);
24056
24362
  return d.toLocaleDateString(void 0, { year: "numeric", month: "short", day: "numeric" });
24057
24363
  }
24058
- function formatValue2(value, format) {
24364
+ function formatValue2(value, format, boolLabels) {
24059
24365
  if (value === void 0 || value === null) return "";
24060
24366
  switch (format) {
24061
24367
  case "date":
@@ -24067,7 +24373,7 @@ function formatValue2(value, format) {
24067
24373
  case "percent":
24068
24374
  return typeof value === "number" ? `${Math.round(value)}%` : String(value);
24069
24375
  case "boolean":
24070
- return value ? "Yes" : "No";
24376
+ return value ? boolLabels?.yes ?? "Yes" : boolLabels?.no ?? "No";
24071
24377
  default:
24072
24378
  return String(value);
24073
24379
  }
@@ -24363,7 +24669,7 @@ function DataList({
24363
24669
  field.label ?? fieldLabel3(field.name),
24364
24670
  ":"
24365
24671
  ] }),
24366
- /* @__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") }) })
24367
24673
  ] }, field.name);
24368
24674
  }) }),
24369
24675
  progressFields.map((field) => {
@@ -24493,6 +24799,7 @@ var init_FileTree = __esm({
24493
24799
  init_Box();
24494
24800
  init_Typography();
24495
24801
  init_Icon();
24802
+ init_useTranslate();
24496
24803
  TreeNodeItem = ({
24497
24804
  node,
24498
24805
  depth,
@@ -24578,8 +24885,9 @@ var init_FileTree = __esm({
24578
24885
  className,
24579
24886
  indent = 16
24580
24887
  }) => {
24888
+ const { t } = useTranslate();
24581
24889
  if (tree.length === 0) {
24582
- 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") }) });
24583
24891
  }
24584
24892
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `py-1 overflow-y-auto ${className ?? ""}`, role: "tree", children: tree.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
24585
24893
  TreeNodeItem,
@@ -24698,6 +25006,7 @@ var init_FilterGroup = __esm({
24698
25006
  init_Icon();
24699
25007
  init_useEventBus();
24700
25008
  init_useQuerySingleton();
25009
+ init_useTranslate();
24701
25010
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
24702
25011
  lookStyles6 = {
24703
25012
  toolbar: "",
@@ -24718,6 +25027,7 @@ var init_FilterGroup = __esm({
24718
25027
  isLoading,
24719
25028
  look = "toolbar"
24720
25029
  }) => {
25030
+ const { t } = useTranslate();
24721
25031
  const eventBus = useEventBus();
24722
25032
  const queryState = useQuerySingleton(query);
24723
25033
  const [selectedValues, setSelectedValues] = React85.useState(
@@ -24799,7 +25109,7 @@ var init_FilterGroup = __esm({
24799
25109
  "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24800
25110
  !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24801
25111
  ),
24802
- children: "All"
25112
+ children: t("filterGroup.all")
24803
25113
  }
24804
25114
  ),
24805
25115
  filter.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -24827,7 +25137,7 @@ var init_FilterGroup = __esm({
24827
25137
  size: "sm",
24828
25138
  onClick: handleClearAll,
24829
25139
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24830
- children: "Clear"
25140
+ children: t("filterGroup.clear")
24831
25141
  }
24832
25142
  )
24833
25143
  ]
@@ -24838,7 +25148,7 @@ var init_FilterGroup = __esm({
24838
25148
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", lookStyles6[look], className), children: [
24839
25149
  showIcon && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
24840
25150
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4" }),
24841
- /* @__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") })
24842
25152
  ] }),
24843
25153
  filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
24844
25154
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-xs font-bold text-muted-foreground uppercase tracking-wide", children: filter.label }),
@@ -24861,7 +25171,7 @@ var init_FilterGroup = __esm({
24861
25171
  `${filter.field}_from`,
24862
25172
  e.target.value || null
24863
25173
  ),
24864
- placeholder: "From",
25174
+ placeholder: t("filterGroup.from"),
24865
25175
  clearable: true,
24866
25176
  onClear: () => handleFilterSelect(`${filter.field}_from`, null)
24867
25177
  }
@@ -24875,7 +25185,7 @@ var init_FilterGroup = __esm({
24875
25185
  `${filter.field}_to`,
24876
25186
  e.target.value || null
24877
25187
  ),
24878
- placeholder: "To",
25188
+ placeholder: t("filterGroup.to"),
24879
25189
  clearable: true,
24880
25190
  onClear: () => handleFilterSelect(`${filter.field}_to`, null)
24881
25191
  }
@@ -24895,7 +25205,7 @@ var init_FilterGroup = __esm({
24895
25205
  value: selectedValues[filter.field] || "all",
24896
25206
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24897
25207
  options: [
24898
- { value: "all", label: "All" },
25208
+ { value: "all", label: t("filterGroup.all") },
24899
25209
  ...filter.options?.map((opt) => ({
24900
25210
  value: opt,
24901
25211
  label: opt
@@ -24912,7 +25222,7 @@ var init_FilterGroup = __esm({
24912
25222
  onClick: handleClearAll,
24913
25223
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24914
25224
  className: "self-start",
24915
- children: "Clear all"
25225
+ children: t("filterGroup.clearAll")
24916
25226
  }
24917
25227
  )
24918
25228
  ] });
@@ -24978,7 +25288,7 @@ var init_FilterGroup = __esm({
24978
25288
  value: selectedValues[filter.field] || "all",
24979
25289
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24980
25290
  options: [
24981
- { value: "all", label: `All ${filter.label}` },
25291
+ { value: "all", label: t("filterGroup.allOf", { label: filter.label }) },
24982
25292
  ...filter.options?.map((opt) => ({
24983
25293
  value: opt,
24984
25294
  label: opt
@@ -25007,7 +25317,7 @@ var init_FilterGroup = __esm({
25007
25317
  field
25008
25318
  );
25009
25319
  }),
25010
- /* @__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") })
25011
25321
  ] })
25012
25322
  ]
25013
25323
  }
@@ -25032,7 +25342,7 @@ var init_FilterGroup = __esm({
25032
25342
  className: "text-muted-foreground",
25033
25343
  children: [
25034
25344
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4" }),
25035
- /* @__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") })
25036
25346
  ]
25037
25347
  }
25038
25348
  ),
@@ -25058,7 +25368,7 @@ var init_FilterGroup = __esm({
25058
25368
  `${filter.field}_from`,
25059
25369
  e.target.value || null
25060
25370
  ),
25061
- placeholder: "From",
25371
+ placeholder: t("filterGroup.from"),
25062
25372
  clearable: true,
25063
25373
  onClear: () => handleFilterSelect(`${filter.field}_from`, null),
25064
25374
  className: "min-w-[130px]"
@@ -25074,7 +25384,7 @@ var init_FilterGroup = __esm({
25074
25384
  `${filter.field}_to`,
25075
25385
  e.target.value || null
25076
25386
  ),
25077
- placeholder: "To",
25387
+ placeholder: t("filterGroup.to"),
25078
25388
  clearable: true,
25079
25389
  onClear: () => handleFilterSelect(`${filter.field}_to`, null),
25080
25390
  className: "min-w-[130px]"
@@ -25096,7 +25406,7 @@ var init_FilterGroup = __esm({
25096
25406
  value: selectedValues[filter.field] || "all",
25097
25407
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
25098
25408
  options: [
25099
- { value: "all", label: "All" },
25409
+ { value: "all", label: t("filterGroup.all") },
25100
25410
  ...filter.options?.map((opt) => ({
25101
25411
  value: opt,
25102
25412
  label: opt
@@ -25107,10 +25417,7 @@ var init_FilterGroup = __esm({
25107
25417
  )
25108
25418
  ] }, filter.field)),
25109
25419
  activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: "ml-auto", children: [
25110
- /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "primary", size: "md", children: [
25111
- activeFilterCount,
25112
- " active"
25113
- ] }),
25420
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "md", children: t("filterGroup.activeCount", { count: activeFilterCount }) }),
25114
25421
  /* @__PURE__ */ jsxRuntime.jsx(
25115
25422
  Button,
25116
25423
  {
@@ -25118,7 +25425,7 @@ var init_FilterGroup = __esm({
25118
25425
  size: "sm",
25119
25426
  onClick: handleClearAll,
25120
25427
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
25121
- children: "Clear all"
25428
+ children: t("filterGroup.clearAll")
25122
25429
  }
25123
25430
  )
25124
25431
  ] })
@@ -26062,19 +26369,20 @@ var init_RepeatableFormSection = __esm({
26062
26369
  RepeatableFormSection.displayName = "RepeatableFormSection";
26063
26370
  }
26064
26371
  });
26065
- var actionTypeLabels, actionTypeIcons, ViolationAlert;
26372
+ var actionTypeLabelKeys, actionTypeIcons, ViolationAlert;
26066
26373
  var init_ViolationAlert = __esm({
26067
26374
  "components/core/molecules/ViolationAlert.tsx"() {
26068
26375
  init_cn();
26376
+ init_useTranslate();
26069
26377
  init_Box();
26070
26378
  init_Stack();
26071
26379
  init_Typography();
26072
26380
  init_Button();
26073
26381
  init_Icon();
26074
- actionTypeLabels = {
26075
- measure: "Corrective Measure",
26076
- admin: "Administrative Action",
26077
- penalty: "Penalty Proceedings"
26382
+ actionTypeLabelKeys = {
26383
+ measure: "violationAlert.actionType.measure",
26384
+ admin: "violationAlert.actionType.admin",
26385
+ penalty: "violationAlert.actionType.penalty"
26078
26386
  };
26079
26387
  actionTypeIcons = {
26080
26388
  measure: "alert-triangle",
@@ -26091,10 +26399,11 @@ var init_ViolationAlert = __esm({
26091
26399
  className,
26092
26400
  ...flatProps
26093
26401
  }) => {
26402
+ const { t } = useTranslate();
26094
26403
  const resolvedViolation = violation ?? {
26095
26404
  law: "",
26096
26405
  article: "",
26097
- message: flatProps.message ?? "Violation",
26406
+ message: flatProps.message ?? t("violationAlert.fallbackMessage"),
26098
26407
  actionType: "measure"
26099
26408
  };
26100
26409
  const effectiveSeverity = severity ?? (resolvedViolation.actionType === "measure" ? "warning" : "error");
@@ -26179,7 +26488,7 @@ var init_ViolationAlert = __esm({
26179
26488
  {
26180
26489
  variant: "caption",
26181
26490
  className: cn(textColor, "opacity-75"),
26182
- children: actionTypeLabels[resolvedViolation.actionType]
26491
+ children: t(actionTypeLabelKeys[resolvedViolation.actionType])
26183
26492
  }
26184
26493
  )
26185
26494
  ] })
@@ -26210,7 +26519,7 @@ var init_ViolationAlert = __esm({
26210
26519
  {
26211
26520
  variant: "caption",
26212
26521
  className: cn(textColor, "opacity-75"),
26213
- children: "Admin:"
26522
+ children: t("violationAlert.adminLabel")
26214
26523
  }
26215
26524
  ),
26216
26525
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -26229,7 +26538,7 @@ var init_ViolationAlert = __esm({
26229
26538
  {
26230
26539
  variant: "caption",
26231
26540
  className: cn(textColor, "opacity-75"),
26232
- children: "Penalty:"
26541
+ children: t("violationAlert.penaltyLabel")
26233
26542
  }
26234
26543
  ),
26235
26544
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -26254,7 +26563,7 @@ var init_ViolationAlert = __esm({
26254
26563
  className: cn(textColor, "self-start"),
26255
26564
  children: [
26256
26565
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "arrow-right", size: "sm", className: "mr-1" }),
26257
- "Go to field"
26566
+ t("violationAlert.goToField")
26258
26567
  ]
26259
26568
  }
26260
26569
  )
@@ -26570,6 +26879,7 @@ var init_LineChart = __esm({
26570
26879
  "use client";
26571
26880
  init_cn();
26572
26881
  init_atoms2();
26882
+ init_useTranslate();
26573
26883
  LineChart2 = ({
26574
26884
  data,
26575
26885
  width = 400,
@@ -26581,6 +26891,7 @@ var init_LineChart = __esm({
26581
26891
  areaColor = "var(--color-primary)",
26582
26892
  className
26583
26893
  }) => {
26894
+ const { t } = useTranslate();
26584
26895
  const gradientId = React85.useId();
26585
26896
  const safeData = data ?? [];
26586
26897
  const sortedData = React85.useMemo(() => {
@@ -26617,7 +26928,7 @@ var init_LineChart = __esm({
26617
26928
  return `${linePath} L ${last.x} ${bottom} L ${first.x} ${bottom} Z`;
26618
26929
  }, [linePath, points, height, showArea]);
26619
26930
  if (safeData.length === 0) {
26620
- 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") });
26621
26932
  }
26622
26933
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn(className), children: /* @__PURE__ */ jsxRuntime.jsxs(
26623
26934
  "svg",
@@ -28524,6 +28835,7 @@ var init_GraphView = __esm({
28524
28835
  "use client";
28525
28836
  init_cn();
28526
28837
  init_atoms2();
28838
+ init_useTranslate();
28527
28839
  GROUP_COLORS = [
28528
28840
  "#3b82f6",
28529
28841
  // blue-500
@@ -28556,6 +28868,7 @@ var init_GraphView = __esm({
28556
28868
  showLabels = true,
28557
28869
  zoomToFit = true
28558
28870
  }) => {
28871
+ const { t } = useTranslate();
28559
28872
  const containerRef = React85.useRef(null);
28560
28873
  const animRef = React85.useRef(0);
28561
28874
  const [simNodes, setSimNodes] = React85.useState([]);
@@ -28733,7 +29046,7 @@ var init_GraphView = __esm({
28733
29046
  [onNodeClick]
28734
29047
  );
28735
29048
  if (nodes.length === 0) {
28736
- 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") }) });
28737
29050
  }
28738
29051
  return /* @__PURE__ */ jsxRuntime.jsx(
28739
29052
  Box,
@@ -29189,11 +29502,12 @@ var init_UploadDropZone = __esm({
29189
29502
  init_Icon();
29190
29503
  init_Typography();
29191
29504
  init_useEventBus();
29505
+ init_useTranslate();
29192
29506
  UploadDropZone = ({
29193
29507
  accept,
29194
29508
  maxSize,
29195
29509
  maxFiles = 1,
29196
- label = "Drop files here or click to browse",
29510
+ label,
29197
29511
  description,
29198
29512
  disabled = false,
29199
29513
  action,
@@ -29201,22 +29515,24 @@ var init_UploadDropZone = __esm({
29201
29515
  onFiles,
29202
29516
  className
29203
29517
  }) => {
29518
+ const { t } = useTranslate();
29519
+ const resolvedLabel = label ?? t("upload.dropOrBrowse");
29204
29520
  const [isDragOver, setIsDragOver] = React85.useState(false);
29205
29521
  const [error, setError] = React85.useState(null);
29206
29522
  const inputRef = React85.useRef(null);
29207
29523
  const eventBus = useSafeEventBus7();
29208
29524
  const defaultDescription = [
29209
- accept ? `Accepted: ${accept}` : null,
29210
- maxSize ? `Max size: ${formatFileSize(maxSize)}` : null,
29211
- 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
29212
29528
  ].filter(Boolean).join(". ");
29213
29529
  const validateFiles = React85.useCallback(
29214
29530
  (files) => {
29215
29531
  if (files.length > maxFiles) {
29216
- return { valid: [], error: `Maximum ${maxFiles} file${maxFiles > 1 ? "s" : ""} allowed` };
29532
+ return { valid: [], error: t("upload.error.maxFiles", { count: maxFiles }) };
29217
29533
  }
29218
29534
  if (accept) {
29219
- const acceptedTypes = accept.split(",").map((t) => t.trim());
29535
+ const acceptedTypes = accept.split(",").map((s) => s.trim());
29220
29536
  const invalid = files.filter((file) => {
29221
29537
  return !acceptedTypes.some((type) => {
29222
29538
  if (type.endsWith("/*")) {
@@ -29226,7 +29542,7 @@ var init_UploadDropZone = __esm({
29226
29542
  });
29227
29543
  });
29228
29544
  if (invalid.length > 0) {
29229
- return { valid: [], error: `Invalid file type: ${invalid[0].name}` };
29545
+ return { valid: [], error: t("upload.error.invalidType", { name: invalid[0].name }) };
29230
29546
  }
29231
29547
  }
29232
29548
  if (maxSize) {
@@ -29234,13 +29550,13 @@ var init_UploadDropZone = __esm({
29234
29550
  if (tooLarge.length > 0) {
29235
29551
  return {
29236
29552
  valid: [],
29237
- error: `File too large: ${tooLarge[0].name} (max ${formatFileSize(maxSize)})`
29553
+ error: t("upload.error.tooLarge", { name: tooLarge[0].name, size: formatFileSize(maxSize) })
29238
29554
  };
29239
29555
  }
29240
29556
  }
29241
29557
  return { valid: files, error: null };
29242
29558
  },
29243
- [accept, maxSize, maxFiles]
29559
+ [accept, maxSize, maxFiles, t]
29244
29560
  );
29245
29561
  const handleFiles = React85.useCallback(
29246
29562
  (files) => {
@@ -29311,7 +29627,7 @@ var init_UploadDropZone = __esm({
29311
29627
  handleClick();
29312
29628
  }
29313
29629
  },
29314
- "aria-label": label,
29630
+ "aria-label": resolvedLabel,
29315
29631
  children: [
29316
29632
  /* @__PURE__ */ jsxRuntime.jsx(
29317
29633
  "input",
@@ -29327,7 +29643,7 @@ var init_UploadDropZone = __esm({
29327
29643
  }
29328
29644
  ),
29329
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" }),
29330
- /* @__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 }),
29331
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 })
29332
29648
  ]
29333
29649
  }
@@ -29749,7 +30065,7 @@ function TableView({
29749
30065
  {
29750
30066
  checked: selected.has(id),
29751
30067
  onChange: () => toggleRow(id),
29752
- "aria-label": `Select row ${id}`
30068
+ "aria-label": t("table.selectRow", { id })
29753
30069
  }
29754
30070
  ) }),
29755
30071
  hasRenderProp ? /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex-1 min-w-0", children: children(row, index) }) : colDefs.map((col) => {
@@ -32596,7 +32912,7 @@ var init_QrScanner = __esm({
32596
32912
  className: "inset-0 flex-col items-center justify-center gap-2 bg-black bg-opacity-80 text-center",
32597
32913
  children: [
32598
32914
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "camera", className: "h-8 w-8 text-white", "aria-hidden": "true" }),
32599
- /* @__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") }),
32600
32916
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", className: "text-white opacity-70", children: cameraError.message })
32601
32917
  ]
32602
32918
  }
@@ -32607,7 +32923,7 @@ var init_QrScanner = __esm({
32607
32923
  position: "absolute",
32608
32924
  display: "flex",
32609
32925
  className: "inset-0 items-center justify-center bg-black bg-opacity-60",
32610
- 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") })
32611
32927
  }
32612
32928
  ),
32613
32929
  showCameraControls && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -32626,7 +32942,7 @@ var init_QrScanner = __esm({
32626
32942
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
32627
32943
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
32628
32944
  ),
32629
- "aria-label": isPaused ? "Resume scanning" : "Pause scanning",
32945
+ "aria-label": isPaused ? t("qrScanner.resumeScanning") : t("qrScanner.pauseScanning"),
32630
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" })
32631
32947
  }
32632
32948
  ),
@@ -32639,7 +32955,7 @@ var init_QrScanner = __esm({
32639
32955
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
32640
32956
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
32641
32957
  ),
32642
- "aria-label": `Switch to ${currentFacing === "environment" ? "front" : "rear"} camera`,
32958
+ "aria-label": currentFacing === "environment" ? t("qrScanner.switchToFrontCamera") : t("qrScanner.switchToRearCamera"),
32643
32959
  children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "refresh-cw", className: "h-4 w-4" })
32644
32960
  }
32645
32961
  ),
@@ -32653,7 +32969,7 @@ var init_QrScanner = __esm({
32653
32969
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
32654
32970
  ),
32655
32971
  "aria-label": t("aria.mockScanDev"),
32656
- children: "Mock Scan"
32972
+ children: t("qrScanner.mockScan")
32657
32973
  }
32658
32974
  )
32659
32975
  ]
@@ -32671,6 +32987,7 @@ var init_OptionConstraintGroup = __esm({
32671
32987
  "components/core/molecules/OptionConstraintGroup.tsx"() {
32672
32988
  init_cn();
32673
32989
  init_useEventBus();
32990
+ init_useTranslate();
32674
32991
  init_Typography();
32675
32992
  init_Box();
32676
32993
  init_Label();
@@ -32680,36 +32997,36 @@ var init_OptionConstraintGroup = __esm({
32680
32997
  const sign = delta >= 0 ? "+" : "-";
32681
32998
  return `${sign}$${Math.abs(delta).toFixed(2)}`;
32682
32999
  };
32683
- constraintHint = (constraint) => {
33000
+ constraintHint = (constraint, t) => {
32684
33001
  if (constraint.type === "single") {
32685
- return constraint.required ? "Required, pick 1" : "Optional, pick up to 1";
33002
+ return constraint.required ? t("optionConstraint.requiredOne") : t("optionConstraint.optionalOne");
32686
33003
  }
32687
33004
  const { min, max } = constraint;
32688
33005
  if (min && max) {
32689
- return min === max ? `Pick exactly ${min}` : `Pick ${min}-${max}`;
33006
+ return min === max ? t("optionConstraint.pickExactly", { count: min }) : t("optionConstraint.pickRange", { min, max });
32690
33007
  }
32691
- if (min) return `Pick at least ${min}`;
32692
- if (max) return `Pick up to ${max}`;
32693
- 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");
32694
33011
  };
32695
- validateSelection = (selected, constraint) => {
33012
+ validateSelection = (selected, constraint, t) => {
32696
33013
  if (constraint.type === "single") {
32697
33014
  if (constraint.required && selected.length === 0) {
32698
- return "Pick 1 option";
33015
+ return t("optionConstraint.error.pickOne");
32699
33016
  }
32700
33017
  if (selected.length > 1) {
32701
- return "Pick only 1 option";
33018
+ return t("optionConstraint.error.pickOnlyOne");
32702
33019
  }
32703
33020
  return void 0;
32704
33021
  }
32705
33022
  const { min, max } = constraint;
32706
33023
  if (min !== void 0 && selected.length < min) {
32707
33024
  const remaining = min - selected.length;
32708
- return `Pick at least ${remaining} more`;
33025
+ return t("optionConstraint.error.pickMore", { count: remaining });
32709
33026
  }
32710
33027
  if (max !== void 0 && selected.length > max) {
32711
33028
  const excess = selected.length - max;
32712
- return `Remove ${excess} option${excess === 1 ? "" : "s"}`;
33029
+ return t("optionConstraint.error.removeOptions", { count: excess });
32713
33030
  }
32714
33031
  return void 0;
32715
33032
  };
@@ -32726,8 +33043,9 @@ var init_OptionConstraintGroup = __esm({
32726
33043
  className
32727
33044
  }) => {
32728
33045
  const eventBus = useEventBus();
32729
- const hint = constraintHint(constraint);
32730
- const error = validateSelection(selected, constraint);
33046
+ const { t } = useTranslate();
33047
+ const hint = constraintHint(constraint, t);
33048
+ const error = validateSelection(selected, constraint, t);
32731
33049
  const inputName = `option-${groupId}`;
32732
33050
  const labelTextSize = size === "sm" ? "text-sm" : "text-base";
32733
33051
  const optionGap = size === "sm" ? "gap-2" : "gap-2.5";
@@ -32827,7 +33145,7 @@ var init_OptionConstraintGroup = __esm({
32827
33145
  variant: "caption",
32828
33146
  color: "warning",
32829
33147
  className: "rounded border border-warning/40 px-1.5 py-0.5",
32830
- children: "Out of stock"
33148
+ children: t("optionConstraint.outOfStock")
32831
33149
  }
32832
33150
  )
32833
33151
  ]
@@ -33149,6 +33467,7 @@ function changeBlockType(block, type) {
33149
33467
  return { id: block.id, type, content: seed };
33150
33468
  }
33151
33469
  function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33470
+ const { t } = useTranslate();
33152
33471
  const [open, setOpen] = React85.useState(false);
33153
33472
  const ref = React85.useRef(null);
33154
33473
  React85.useEffect(() => {
@@ -33168,7 +33487,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33168
33487
  {
33169
33488
  type: "button",
33170
33489
  variant: "ghost",
33171
- "aria-label": "Block actions",
33490
+ "aria-label": t("richBlockEditor.blockActions"),
33172
33491
  className: cn(
33173
33492
  "inline-flex items-center justify-center",
33174
33493
  "h-6 w-6 rounded-sm p-0 gap-0",
@@ -33190,7 +33509,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33190
33509
  "py-1 text-sm"
33191
33510
  ),
33192
33511
  children: [
33193
- /* @__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]) }),
33194
33513
  /* @__PURE__ */ jsxRuntime.jsxs(
33195
33514
  Button,
33196
33515
  {
@@ -33204,7 +33523,8 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33204
33523
  },
33205
33524
  children: [
33206
33525
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", className: "w-3.5 h-3.5" }),
33207
- " Duplicate"
33526
+ " ",
33527
+ t("richBlockEditor.duplicate")
33208
33528
  ]
33209
33529
  }
33210
33530
  ),
@@ -33221,14 +33541,15 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33221
33541
  },
33222
33542
  children: [
33223
33543
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "trash", className: "w-3.5 h-3.5" }),
33224
- " Delete"
33544
+ " ",
33545
+ t("common.delete")
33225
33546
  ]
33226
33547
  }
33227
33548
  ),
33228
33549
  CHANGEABLE_TYPES.includes(block.type) && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
33229
33550
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "my-1 border-t border-border" }),
33230
- /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: "Turn into" }),
33231
- 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(
33232
33553
  Button,
33233
33554
  {
33234
33555
  type: "button",
@@ -33236,12 +33557,12 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33236
33557
  role: "menuitem",
33237
33558
  className: "flex w-full items-center gap-2 px-2 py-1.5 text-left justify-start rounded-none",
33238
33559
  onClick: () => {
33239
- onChangeType(t);
33560
+ onChangeType(bt);
33240
33561
  setOpen(false);
33241
33562
  },
33242
- children: BLOCK_TYPE_LABEL[t]
33563
+ children: t(BLOCK_TYPE_LABEL_KEY[bt])
33243
33564
  },
33244
- t
33565
+ bt
33245
33566
  ))
33246
33567
  ] })
33247
33568
  ]
@@ -33303,6 +33624,7 @@ function BlockRow({
33303
33624
  onInsertAfter,
33304
33625
  onChangeType
33305
33626
  }) {
33627
+ const { t } = useTranslate();
33306
33628
  const setContent = React85.useCallback(
33307
33629
  (next) => onUpdate((b) => ({ ...b, content: next })),
33308
33630
  [onUpdate]
@@ -33352,8 +33674,8 @@ function BlockRow({
33352
33674
  tag: "h1",
33353
33675
  value: block.content ?? "",
33354
33676
  readOnly,
33355
- placeholder: placeholder ?? "Heading 1",
33356
- ariaLabel: "Heading 1 block",
33677
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading1"),
33678
+ ariaLabel: t("richBlockEditor.aria.heading1Block"),
33357
33679
  className: "text-3xl font-bold leading-tight",
33358
33680
  onValueChange: setContent
33359
33681
  }
@@ -33365,8 +33687,8 @@ function BlockRow({
33365
33687
  tag: "h2",
33366
33688
  value: block.content ?? "",
33367
33689
  readOnly,
33368
- placeholder: placeholder ?? "Heading 2",
33369
- ariaLabel: "Heading 2 block",
33690
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading2"),
33691
+ ariaLabel: t("richBlockEditor.aria.heading2Block"),
33370
33692
  className: "text-2xl font-semibold leading-tight",
33371
33693
  onValueChange: setContent
33372
33694
  }
@@ -33378,8 +33700,8 @@ function BlockRow({
33378
33700
  tag: "h3",
33379
33701
  value: block.content ?? "",
33380
33702
  readOnly,
33381
- placeholder: placeholder ?? "Heading 3",
33382
- ariaLabel: "Heading 3 block",
33703
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading3"),
33704
+ ariaLabel: t("richBlockEditor.aria.heading3Block"),
33383
33705
  className: "text-xl font-semibold leading-tight",
33384
33706
  onValueChange: setContent
33385
33707
  }
@@ -33391,8 +33713,8 @@ function BlockRow({
33391
33713
  tag: "blockquote",
33392
33714
  value: block.content ?? "",
33393
33715
  readOnly,
33394
- placeholder: placeholder ?? "Quote",
33395
- ariaLabel: "Quote block",
33716
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.quote"),
33717
+ ariaLabel: t("richBlockEditor.aria.quoteBlock"),
33396
33718
  className: "border-l-4 border-primary/60 pl-4 italic text-muted-foreground",
33397
33719
  onValueChange: setContent
33398
33720
  }
@@ -33400,13 +33722,13 @@ function BlockRow({
33400
33722
  case "code":
33401
33723
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "rounded-md border border-border bg-muted/40", children: [
33402
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: [
33403
- /* @__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") }),
33404
33726
  !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
33405
33727
  Input,
33406
33728
  {
33407
33729
  inputType: "text",
33408
33730
  value: String(block.metadata?.language ?? "plaintext"),
33409
- "aria-label": "Code language",
33731
+ "aria-label": t("richBlockEditor.aria.codeLanguage"),
33410
33732
  className: cn(
33411
33733
  "h-6 w-32 rounded-sm border border-border bg-background",
33412
33734
  "px-2 text-xs outline-none focus:ring-1 focus:ring-ring"
@@ -33422,8 +33744,8 @@ function BlockRow({
33422
33744
  tag: "pre",
33423
33745
  value: block.content ?? "",
33424
33746
  readOnly,
33425
- placeholder: placeholder ?? "Enter code",
33426
- ariaLabel: "Code block",
33747
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.code"),
33748
+ ariaLabel: t("richBlockEditor.aria.codeBlock"),
33427
33749
  className: "block whitespace-pre-wrap p-3 font-mono text-sm leading-relaxed",
33428
33750
  onValueChange: setContent
33429
33751
  }
@@ -33436,7 +33758,7 @@ function BlockRow({
33436
33758
  const caption = String(block.metadata?.caption ?? "");
33437
33759
  const imgProps = {
33438
33760
  src: url,
33439
- alt: caption || "Embedded image",
33761
+ alt: caption || t("richBlockEditor.embeddedImage"),
33440
33762
  className: "max-h-96 w-full rounded-md border border-border object-contain"
33441
33763
  };
33442
33764
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "space-y-2", children: [
@@ -33450,7 +33772,8 @@ function BlockRow({
33450
33772
  ),
33451
33773
  children: [
33452
33774
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "image", className: "mr-2 w-4 h-4" }),
33453
- " No image URL set"
33775
+ " ",
33776
+ t("richBlockEditor.noImageUrl")
33454
33777
  ]
33455
33778
  }
33456
33779
  ),
@@ -33461,7 +33784,7 @@ function BlockRow({
33461
33784
  inputType: "url",
33462
33785
  value: url,
33463
33786
  placeholder: "https://example.com/image.png",
33464
- "aria-label": "Image URL",
33787
+ "aria-label": t("richBlockEditor.aria.imageUrl"),
33465
33788
  className: cn(
33466
33789
  "h-8 flex-1 rounded-sm border border-border bg-background",
33467
33790
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -33474,8 +33797,8 @@ function BlockRow({
33474
33797
  {
33475
33798
  inputType: "text",
33476
33799
  value: caption,
33477
- placeholder: "Caption (optional)",
33478
- "aria-label": "Image caption",
33800
+ placeholder: t("richBlockEditor.placeholder.caption"),
33801
+ "aria-label": t("richBlockEditor.aria.imageCaption"),
33479
33802
  className: cn(
33480
33803
  "h-8 flex-1 rounded-sm border border-border bg-background",
33481
33804
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -33506,8 +33829,8 @@ function BlockRow({
33506
33829
  tag: "span",
33507
33830
  value: child.content ?? "",
33508
33831
  readOnly,
33509
- placeholder: "List item",
33510
- ariaLabel: "List item",
33832
+ placeholder: t("richBlockEditor.placeholder.listItem"),
33833
+ ariaLabel: t("richBlockEditor.aria.listItem"),
33511
33834
  className: "inline-block min-w-[1ch] flex-1",
33512
33835
  onValueChange: (next) => setChildContent(child.id, next)
33513
33836
  }
@@ -33517,7 +33840,7 @@ function BlockRow({
33517
33840
  {
33518
33841
  type: "button",
33519
33842
  variant: "ghost",
33520
- "aria-label": "Remove list item",
33843
+ "aria-label": t("richBlockEditor.aria.removeListItem"),
33521
33844
  className: cn(
33522
33845
  "h-5 w-5 shrink-0 rounded-sm text-muted-foreground p-0 gap-0",
33523
33846
  "opacity-0 group-hover/item:opacity-100 hover:bg-muted hover:text-foreground"
@@ -33539,7 +33862,8 @@ function BlockRow({
33539
33862
  onClick: addListItem,
33540
33863
  children: [
33541
33864
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", className: "w-3 h-3" }),
33542
- " Add item"
33865
+ " ",
33866
+ t("richBlockEditor.addItem")
33543
33867
  ]
33544
33868
  }
33545
33869
  ) })
@@ -33555,8 +33879,8 @@ function BlockRow({
33555
33879
  tag: "p",
33556
33880
  value: block.content ?? "",
33557
33881
  readOnly,
33558
- placeholder: placeholder ?? "Start writing...",
33559
- ariaLabel: "Paragraph block",
33882
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.paragraph"),
33883
+ ariaLabel: t("richBlockEditor.aria.paragraphBlock"),
33560
33884
  className: "leading-7",
33561
33885
  onValueChange: setContent
33562
33886
  }
@@ -33579,7 +33903,7 @@ function BlockRow({
33579
33903
  {
33580
33904
  type: "button",
33581
33905
  variant: "ghost",
33582
- "aria-label": "Insert paragraph below",
33906
+ "aria-label": t("richBlockEditor.insertParagraphBelow"),
33583
33907
  className: cn(
33584
33908
  "inline-flex h-6 w-6 items-center justify-center rounded-sm p-0 gap-0",
33585
33909
  "text-muted-foreground hover:bg-muted hover:text-foreground",
@@ -33606,7 +33930,7 @@ function BlockRow({
33606
33930
  }
33607
33931
  );
33608
33932
  }
33609
- 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;
33610
33934
  var init_RichBlockEditor = __esm({
33611
33935
  "components/core/molecules/RichBlockEditor.tsx"() {
33612
33936
  "use client";
@@ -33619,29 +33943,30 @@ var init_RichBlockEditor = __esm({
33619
33943
  init_Input();
33620
33944
  init_Icon();
33621
33945
  init_useEventBus();
33946
+ init_useTranslate();
33622
33947
  TOOLBAR_ENTRIES = [
33623
- { type: "paragraph", label: "Text", icon: LucideIcons2.Type },
33624
- { type: "heading-1", label: "H1", icon: LucideIcons2.Heading1 },
33625
- { type: "heading-2", label: "H2", icon: LucideIcons2.Heading2 },
33626
- { type: "heading-3", label: "H3", icon: LucideIcons2.Heading3 },
33627
- { type: "bullet-list", label: "Bullet list", icon: LucideIcons2.List },
33628
- { type: "numbered-list", label: "Numbered", icon: LucideIcons2.ListOrdered },
33629
- { type: "quote", label: "Quote", icon: LucideIcons2.Quote },
33630
- { type: "code", label: "Code", icon: LucideIcons2.Code },
33631
- { type: "divider", label: "Divider", icon: LucideIcons2.Minus },
33632
- { 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 }
33633
33958
  ];
33634
- BLOCK_TYPE_LABEL = {
33635
- paragraph: "Text",
33636
- "heading-1": "Heading 1",
33637
- "heading-2": "Heading 2",
33638
- "heading-3": "Heading 3",
33639
- "bullet-list": "Bullet list",
33640
- "numbered-list": "Numbered list",
33641
- quote: "Quote",
33642
- code: "Code",
33643
- divider: "Divider",
33644
- 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"
33645
33970
  };
33646
33971
  CHANGEABLE_TYPES = [
33647
33972
  "paragraph",
@@ -33675,6 +34000,7 @@ var init_RichBlockEditor = __esm({
33675
34000
  showToolbar = true,
33676
34001
  className
33677
34002
  }) => {
34003
+ const { t } = useTranslate();
33678
34004
  const [blocks, setBlocks] = React85.useState(
33679
34005
  () => normalizeBlocks(initialBlocks)
33680
34006
  );
@@ -33746,25 +34072,26 @@ var init_RichBlockEditor = __esm({
33746
34072
  Box,
33747
34073
  {
33748
34074
  role: "toolbar",
33749
- "aria-label": "Block editor toolbar",
34075
+ "aria-label": t("richBlockEditor.editorToolbar"),
33750
34076
  className: cn(
33751
34077
  "flex flex-wrap items-center gap-1",
33752
34078
  "border-b border-border bg-muted/30 px-2 py-2"
33753
34079
  ),
33754
34080
  children: TOOLBAR_ENTRIES.map((entry) => {
33755
34081
  const Icon3 = entry.icon;
34082
+ const entryLabel = t(entry.labelKey);
33756
34083
  return /* @__PURE__ */ jsxRuntime.jsxs(
33757
34084
  Button,
33758
34085
  {
33759
34086
  type: "button",
33760
34087
  variant: "ghost",
33761
34088
  size: "sm",
33762
- "aria-label": `Insert ${entry.label}`,
33763
- title: entry.label,
34089
+ "aria-label": t("richBlockEditor.insertEntry", { label: entryLabel }),
34090
+ title: entryLabel,
33764
34091
  onClick: () => handleAppend(entry.type),
33765
34092
  children: [
33766
34093
  /* @__PURE__ */ jsxRuntime.jsx(Icon3, { size: 14 }),
33767
- /* @__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 })
33768
34095
  ]
33769
34096
  },
33770
34097
  entry.type
@@ -33807,6 +34134,7 @@ var init_ReplyTree = __esm({
33807
34134
  "use client";
33808
34135
  init_cn();
33809
34136
  init_useEventBus();
34137
+ init_useTranslate();
33810
34138
  init_atoms2();
33811
34139
  init_VoteStack();
33812
34140
  ReplyTreeNode = ({
@@ -33826,6 +34154,7 @@ var init_ReplyTree = __esm({
33826
34154
  showActions
33827
34155
  }) => {
33828
34156
  const eventBus = useEventBus();
34157
+ const { t } = useTranslate();
33829
34158
  const hasReplies = !!node.replies && node.replies.length > 0;
33830
34159
  const isCollapsed = collapsedSet.has(node.id);
33831
34160
  const atMaxDepth = depth >= maxDepth;
@@ -33872,7 +34201,7 @@ var init_ReplyTree = __esm({
33872
34201
  variant: "ghost",
33873
34202
  size: "sm",
33874
34203
  onClick: handleToggle,
33875
- "aria-label": isCollapsed ? "Expand replies" : "Collapse replies",
34204
+ "aria-label": isCollapsed ? t("replyTree.expandReplies") : t("replyTree.collapseReplies"),
33876
34205
  "aria-expanded": !isCollapsed,
33877
34206
  leftIcon: isCollapsed ? "chevron-right" : "chevron-down",
33878
34207
  className: cn(
@@ -33913,7 +34242,7 @@ var init_ReplyTree = __esm({
33913
34242
  onVote: handleVote,
33914
34243
  size: "sm",
33915
34244
  variant: "horizontal",
33916
- label: `Vote on reply by ${node.authorName}`
34245
+ label: t("replyTree.voteOnReplyBy", { author: node.authorName })
33917
34246
  }
33918
34247
  ),
33919
34248
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -33923,8 +34252,8 @@ var init_ReplyTree = __esm({
33923
34252
  size: "sm",
33924
34253
  leftIcon: "message-square",
33925
34254
  onClick: handleReply,
33926
- "aria-label": `Reply to ${node.authorName}`,
33927
- children: "Reply"
34255
+ "aria-label": t("replyTree.replyTo", { author: node.authorName }),
34256
+ children: t("replyTree.reply")
33928
34257
  }
33929
34258
  ),
33930
34259
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -33934,8 +34263,8 @@ var init_ReplyTree = __esm({
33934
34263
  size: "sm",
33935
34264
  leftIcon: "flag",
33936
34265
  onClick: handleFlag,
33937
- "aria-label": `Flag reply by ${node.authorName}`,
33938
- children: "Flag"
34266
+ "aria-label": t("replyTree.flagReplyBy", { author: node.authorName }),
34267
+ children: t("replyTree.flag")
33939
34268
  }
33940
34269
  )
33941
34270
  ] }),
@@ -33946,9 +34275,9 @@ var init_ReplyTree = __esm({
33946
34275
  inputType: "textarea",
33947
34276
  rows: 2,
33948
34277
  value: draft,
33949
- placeholder: `Reply to ${node.authorName}\u2026`,
34278
+ placeholder: t("replyTree.replyToPlaceholder", { author: node.authorName }),
33950
34279
  onChange: (e) => setDraft(e.target.value),
33951
- "aria-label": `Reply to ${node.authorName}`
34280
+ "aria-label": t("replyTree.replyTo", { author: node.authorName })
33952
34281
  }
33953
34282
  ),
33954
34283
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-row gap-2 items-center", children: [
@@ -33960,10 +34289,10 @@ var init_ReplyTree = __esm({
33960
34289
  leftIcon: "send",
33961
34290
  onClick: handleSubmitReply,
33962
34291
  disabled: !draft.trim(),
33963
- children: "Send"
34292
+ children: t("replyTree.send")
33964
34293
  }
33965
34294
  ),
33966
- /* @__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") })
33967
34296
  ] })
33968
34297
  ] }),
33969
34298
  hasReplies && !isCollapsed && (atMaxDepth ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -33977,7 +34306,7 @@ var init_ReplyTree = __esm({
33977
34306
  "self-start gap-1 px-0 h-auto",
33978
34307
  "text-sm text-primary hover:underline hover:bg-transparent"
33979
34308
  ),
33980
- children: "Continue thread"
34309
+ children: t("replyTree.continueThread")
33981
34310
  }
33982
34311
  ) : /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex flex-col gap-2 mt-1", children: node.replies.map((child) => /* @__PURE__ */ jsxRuntime.jsx(
33983
34312
  ReplyTreeNode,
@@ -34016,6 +34345,7 @@ var init_ReplyTree = __esm({
34016
34345
  showActions = true,
34017
34346
  className
34018
34347
  }) => {
34348
+ const { t } = useTranslate();
34019
34349
  const nodeList = Array.isArray(nodes) ? nodes : nodes ? [nodes] : [];
34020
34350
  const [collapsedSet, setCollapsedSet] = React85.useState(() => {
34021
34351
  const acc = /* @__PURE__ */ new Set();
@@ -34034,7 +34364,7 @@ var init_ReplyTree = __esm({
34034
34364
  });
34035
34365
  }, []);
34036
34366
  if (nodeList.length === 0) {
34037
- 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") });
34038
34368
  }
34039
34369
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex flex-col gap-2 min-w-0", className), children: nodeList.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
34040
34370
  ReplyTreeNode,
@@ -34112,6 +34442,7 @@ var init_VersionDiff = __esm({
34112
34442
  "use client";
34113
34443
  init_cn();
34114
34444
  init_useEventBus();
34445
+ init_useTranslate();
34115
34446
  init_atoms2();
34116
34447
  init_Stack();
34117
34448
  INLINE_STYLES = {
@@ -34134,6 +34465,7 @@ var init_VersionDiff = __esm({
34134
34465
  language,
34135
34466
  className
34136
34467
  }) => {
34468
+ const { t } = useTranslate();
34137
34469
  const eventBus = useEventBus();
34138
34470
  const revisions = Array.isArray(revisionsProp) ? revisionsProp : [];
34139
34471
  const fallbackBefore = revisions[0]?.id ?? "";
@@ -34215,24 +34547,24 @@ var init_VersionDiff = __esm({
34215
34547
  children: [
34216
34548
  /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: "flex-wrap", children: [
34217
34549
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "git-commit", size: "sm", className: "text-muted-foreground" }),
34218
- /* @__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") }),
34219
34551
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsxRuntime.jsx(
34220
34552
  Select,
34221
34553
  {
34222
34554
  options,
34223
34555
  value: activeBeforeId,
34224
34556
  onChange: handleBeforeChange,
34225
- "aria-label": "Before revision"
34557
+ "aria-label": t("versionDiff.beforeRevision")
34226
34558
  }
34227
34559
  ) }),
34228
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: "to" }),
34560
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: t("versionDiff.to") }),
34229
34561
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsxRuntime.jsx(
34230
34562
  Select,
34231
34563
  {
34232
34564
  options,
34233
34565
  value: activeAfterId,
34234
34566
  onChange: handleAfterChange,
34235
- "aria-label": "After revision"
34567
+ "aria-label": t("versionDiff.afterRevision")
34236
34568
  }
34237
34569
  ) }),
34238
34570
  language && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "default", children: language }),
@@ -34253,7 +34585,7 @@ var init_VersionDiff = __esm({
34253
34585
  size: "sm",
34254
34586
  icon: activeView === "side-by-side" ? "align-left" : "columns",
34255
34587
  onClick: handleViewToggle,
34256
- "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")
34257
34589
  }
34258
34590
  ),
34259
34591
  (onRevert || revertEvent) && /* @__PURE__ */ jsxRuntime.jsx(
@@ -34263,7 +34595,7 @@ var init_VersionDiff = __esm({
34263
34595
  size: "sm",
34264
34596
  icon: "rotate-ccw",
34265
34597
  onClick: handleRevert,
34266
- children: "Revert"
34598
+ children: t("versionDiff.revert")
34267
34599
  }
34268
34600
  )
34269
34601
  ] })
@@ -34280,12 +34612,12 @@ var init_VersionDiff = __esm({
34280
34612
  children: [
34281
34613
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
34282
34614
  beforeRev?.label,
34283
- beforeRev?.author ? ` by ${beforeRev.author}` : "",
34615
+ beforeRev?.author ? t("versionDiff.byAuthor", { author: beforeRev.author }) : "",
34284
34616
  beforeRev?.timestamp ? ` (${beforeRev.timestamp})` : ""
34285
34617
  ] }),
34286
34618
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
34287
34619
  afterRev?.label,
34288
- afterRev?.author ? ` by ${afterRev.author}` : "",
34620
+ afterRev?.author ? t("versionDiff.byAuthor", { author: afterRev.author }) : "",
34289
34621
  afterRev?.timestamp ? ` (${afterRev.timestamp})` : ""
34290
34622
  ] })
34291
34623
  ]
@@ -34678,10 +35010,12 @@ var init_DocPagination = __esm({
34678
35010
  }
34679
35011
  });
34680
35012
  function DocSearch({
34681
- placeholder = "Search documentation...",
35013
+ placeholder,
34682
35014
  onSearch,
34683
35015
  className
34684
35016
  }) {
35017
+ const { t } = useTranslate();
35018
+ const resolvedPlaceholder = placeholder ?? t("docSearch.placeholder");
34685
35019
  const [query, setQuery] = React85.useState("");
34686
35020
  const [results, setResults] = React85.useState([]);
34687
35021
  const [isOpen, setIsOpen] = React85.useState(false);
@@ -34788,7 +35122,7 @@ function DocSearch({
34788
35122
  Input,
34789
35123
  {
34790
35124
  inputType: "search",
34791
- placeholder,
35125
+ placeholder: resolvedPlaceholder,
34792
35126
  value: query,
34793
35127
  onChange: handleChange,
34794
35128
  onFocus: handleFocus,
@@ -34853,6 +35187,7 @@ var init_DocSearch = __esm({
34853
35187
  init_Typography();
34854
35188
  init_Icon();
34855
35189
  init_Input();
35190
+ init_useTranslate();
34856
35191
  }
34857
35192
  });
34858
35193
  var DocSidebarCategory, DocSidebar;
@@ -36857,8 +37192,8 @@ var init_SignaturePad = __esm({
36857
37192
  init_useEventBus();
36858
37193
  init_useTranslate();
36859
37194
  SignaturePad = ({
36860
- label = "Signature",
36861
- helperText = "Draw your signature above",
37195
+ label,
37196
+ helperText,
36862
37197
  strokeColor,
36863
37198
  strokeWidth = 2,
36864
37199
  height = 200,
@@ -36874,6 +37209,8 @@ var init_SignaturePad = __esm({
36874
37209
  }) => {
36875
37210
  const eventBus = useEventBus();
36876
37211
  const { t } = useTranslate();
37212
+ const resolvedLabel = label ?? t("signaturePad.label");
37213
+ const resolvedHelperText = helperText ?? t("signaturePad.helperText");
36877
37214
  const canvasRef = React85.useRef(null);
36878
37215
  const [isDrawing, setIsDrawing] = React85.useState(false);
36879
37216
  const [hasSignature, setHasSignature] = React85.useState(!!value);
@@ -36976,7 +37313,7 @@ var init_SignaturePad = __esm({
36976
37313
  );
36977
37314
  }
36978
37315
  return /* @__PURE__ */ jsxRuntime.jsx(Card, { className: cn("p-4", className), children: /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "sm", children: [
36979
- label && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "medium", children: label }),
37316
+ resolvedLabel && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "medium", children: resolvedLabel }),
36980
37317
  /* @__PURE__ */ jsxRuntime.jsx(
36981
37318
  Box,
36982
37319
  {
@@ -37005,7 +37342,7 @@ var init_SignaturePad = __esm({
37005
37342
  )
37006
37343
  }
37007
37344
  ),
37008
- helperText && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: helperText }),
37345
+ resolvedHelperText && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: resolvedHelperText }),
37009
37346
  !readOnly && /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", justify: "end", children: [
37010
37347
  /* @__PURE__ */ jsxRuntime.jsx(
37011
37348
  Button,
@@ -37015,7 +37352,7 @@ var init_SignaturePad = __esm({
37015
37352
  icon: LucideIcons2.Eraser,
37016
37353
  onClick: clearSignature,
37017
37354
  disabled: !hasSignature,
37018
- children: "Clear"
37355
+ children: t("signaturePad.clear")
37019
37356
  }
37020
37357
  ),
37021
37358
  signEvent && /* @__PURE__ */ jsxRuntime.jsx(
@@ -37026,7 +37363,7 @@ var init_SignaturePad = __esm({
37026
37363
  icon: LucideIcons2.Check,
37027
37364
  onClick: confirmSignature,
37028
37365
  disabled: !hasSignature,
37029
- children: "Confirm"
37366
+ children: t("signaturePad.confirm")
37030
37367
  }
37031
37368
  )
37032
37369
  ] })
@@ -41471,6 +41808,7 @@ function MasterDetail({
41471
41808
  className,
41472
41809
  ...rest
41473
41810
  }) {
41811
+ const { t } = useTranslate();
41474
41812
  const loading = externalLoading ?? false;
41475
41813
  const isLoading = externalIsLoading ?? false;
41476
41814
  const error = externalError ?? null;
@@ -41483,8 +41821,8 @@ function MasterDetail({
41483
41821
  isLoading: loading || isLoading,
41484
41822
  error,
41485
41823
  className,
41486
- emptyTitle: "No items found",
41487
- emptyDescription: "Create your first item to get started.",
41824
+ emptyTitle: t("table.empty.title"),
41825
+ emptyDescription: t("empty.createFirst"),
41488
41826
  ...rest
41489
41827
  }
41490
41828
  );
@@ -41493,6 +41831,7 @@ var init_MasterDetail = __esm({
41493
41831
  "components/core/organisms/MasterDetail.tsx"() {
41494
41832
  "use client";
41495
41833
  init_DataTable();
41834
+ init_useTranslate();
41496
41835
  MasterDetail.displayName = "MasterDetail";
41497
41836
  }
41498
41837
  });
@@ -41501,14 +41840,18 @@ var init_MasterDetailLayout = __esm({
41501
41840
  "components/core/organisms/layout/MasterDetailLayout.tsx"() {
41502
41841
  init_cn();
41503
41842
  init_Typography();
41504
- DefaultEmptyDetail = () => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsxRuntime.jsx(
41505
- Typography,
41506
- {
41507
- variant: "body2",
41508
- className: "text-muted-foreground",
41509
- children: "Select an item to view details"
41510
- }
41511
- ) });
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
+ };
41512
41855
  MasterDetailLayout = ({
41513
41856
  master,
41514
41857
  detail,
@@ -41635,7 +41978,7 @@ var init_MediaGallery = __esm({
41635
41978
  {
41636
41979
  icon: LucideIcons2.Image,
41637
41980
  title: t("display.noMedia"),
41638
- description: "No media items to display.",
41981
+ description: t("mediaGallery.noMediaDescription"),
41639
41982
  className
41640
41983
  }
41641
41984
  );
@@ -41652,7 +41995,7 @@ var init_MediaGallery = __esm({
41652
41995
  size: "sm",
41653
41996
  icon: LucideIcons2.Upload,
41654
41997
  action: "MEDIA_UPLOAD",
41655
- children: "Upload"
41998
+ children: t("mediaGallery.upload")
41656
41999
  }
41657
42000
  ),
41658
42001
  actions?.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -41666,10 +42009,7 @@ var init_MediaGallery = __esm({
41666
42009
  ))
41667
42010
  ] })
41668
42011
  ] }),
41669
- selectable && selectedItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(HStack, { gap: "sm", align: "center", children: /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "info", children: [
41670
- selectedItems.length,
41671
- " selected"
41672
- ] }) }),
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 }) }) }),
41673
42013
  /* @__PURE__ */ jsxRuntime.jsx(
41674
42014
  Box,
41675
42015
  {
@@ -42524,7 +42864,7 @@ function TraitsTab({ traits: traits2 }) {
42524
42864
  EmptyState,
42525
42865
  {
42526
42866
  title: t("debug.noActiveTraits"),
42527
- description: "Traits will appear when components using them are mounted",
42867
+ description: t("debug.traitsMountHint"),
42528
42868
  className: "py-8"
42529
42869
  }
42530
42870
  );
@@ -42534,14 +42874,11 @@ function TraitsTab({ traits: traits2 }) {
42534
42874
  header: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 w-full", children: [
42535
42875
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", weight: "semibold", className: "text-purple-600 dark:text-purple-400", children: trait.name }),
42536
42876
  /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "success", size: "sm", children: trait.currentState }),
42537
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: [
42538
- trait.transitionCount,
42539
- " transitions"
42540
- ] })
42877
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: t("debug.transitionsCount", { count: trait.transitionCount }) })
42541
42878
  ] }),
42542
42879
  content: /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "sm", children: [
42543
42880
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42544
- /* @__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") }),
42545
42882
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: trait.states.map((state) => /* @__PURE__ */ jsxRuntime.jsx(
42546
42883
  Badge,
42547
42884
  {
@@ -42553,7 +42890,7 @@ function TraitsTab({ traits: traits2 }) {
42553
42890
  )) })
42554
42891
  ] }),
42555
42892
  trait.transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42556
- /* @__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") }),
42557
42894
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: trait.transitions.map((t2, i) => /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "font-mono", children: [
42558
42895
  t2.from,
42559
42896
  " \u2192 ",
@@ -42572,7 +42909,7 @@ function TraitsTab({ traits: traits2 }) {
42572
42909
  ] }, i)) })
42573
42910
  ] }),
42574
42911
  trait.guards.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42575
- /* @__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") }),
42576
42913
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: trait.guards.map((g, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
42577
42914
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: g.name }),
42578
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" })
@@ -42678,7 +43015,7 @@ function EntitiesTab({ snapshot }) {
42678
43015
  EmptyState,
42679
43016
  {
42680
43017
  title: t("debug.noEntityData"),
42681
- description: "Debug mode may not be enabled",
43018
+ description: t("debug.debugModeHint"),
42682
43019
  className: "py-8"
42683
43020
  }
42684
43021
  );
@@ -42691,7 +43028,7 @@ function EntitiesTab({ snapshot }) {
42691
43028
  EmptyState,
42692
43029
  {
42693
43030
  title: t("debug.noEntities"),
42694
- description: "Entities will appear when spawned",
43031
+ description: t("debug.entitiesSpawnHint"),
42695
43032
  className: "py-8"
42696
43033
  }
42697
43034
  );
@@ -42699,7 +43036,7 @@ function EntitiesTab({ snapshot }) {
42699
43036
  const singletonItems = singletonEntries.map(([name, data]) => ({
42700
43037
  id: `singleton-${name}`,
42701
43038
  header: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
42702
- /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "sm", children: "Singleton" }),
43039
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "sm", children: t("debug.singleton") }),
42703
43040
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", weight: "semibold", className: "text-sky-600 dark:text-sky-400", children: name })
42704
43041
  ] }),
42705
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) })
@@ -42717,31 +43054,19 @@ function EntitiesTab({ snapshot }) {
42717
43054
  }));
42718
43055
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--entities", children: [
42719
43056
  singletonItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4", children: [
42720
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
42721
- "Singletons (",
42722
- singletonItems.length,
42723
- ")"
42724
- ] }),
43057
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.singletonsCount", { count: singletonItems.length }) }),
42725
43058
  /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: singletonItems, multiple: true })
42726
43059
  ] }),
42727
43060
  runtimeItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4", children: [
42728
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
42729
- "Runtime (",
42730
- runtimeEntities.length,
42731
- ")"
42732
- ] }),
43061
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.runtimeCount", { count: runtimeEntities.length }) }),
42733
43062
  /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: runtimeItems, multiple: true }),
42734
- runtimeEntities.length > 20 && /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-400 text-center mt-2", children: [
42735
- "+",
42736
- runtimeEntities.length - 20,
42737
- " more entities"
42738
- ] })
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 }) })
42739
43064
  ] }),
42740
43065
  persistentEntries.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42741
- /* @__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") }),
42742
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: [
42743
43068
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: type }),
42744
- /* @__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") })
42745
43070
  ] }, type)) })
42746
43071
  ] })
42747
43072
  ] });
@@ -42785,7 +43110,7 @@ function EventFlowTab({ events: events2 }) {
42785
43110
  EmptyState,
42786
43111
  {
42787
43112
  title: t("debug.noEventsYet"),
42788
- description: "Events will appear as traits, ticks, and other systems execute",
43113
+ description: t("debug.eventsExecuteHint"),
42789
43114
  className: "py-8"
42790
43115
  }
42791
43116
  );
@@ -42796,17 +43121,13 @@ function EventFlowTab({ events: events2 }) {
42796
43121
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--events", children: [
42797
43122
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 mb-3 flex-wrap", children: [
42798
43123
  /* @__PURE__ */ jsxRuntime.jsxs(ButtonGroup, { children: [
42799
- /* @__PURE__ */ jsxRuntime.jsxs(
43124
+ /* @__PURE__ */ jsxRuntime.jsx(
42800
43125
  Button,
42801
43126
  {
42802
43127
  size: "sm",
42803
43128
  variant: filter === "all" ? "primary" : "secondary",
42804
43129
  onClick: () => setFilter("all"),
42805
- children: [
42806
- "All (",
42807
- events2.length,
42808
- ")"
42809
- ]
43130
+ children: t("debug.allCount", { count: events2.length })
42810
43131
  }
42811
43132
  ),
42812
43133
  eventTypes.map((type) => {
@@ -42836,7 +43157,7 @@ function EventFlowTab({ events: events2 }) {
42836
43157
  onChange: (e) => setAutoScroll(e.target.checked)
42837
43158
  }
42838
43159
  ),
42839
- "Auto-scroll"
43160
+ t("debug.autoScroll")
42840
43161
  ] })
42841
43162
  ] }),
42842
43163
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -42894,7 +43215,7 @@ function GuardsPanel({ guards }) {
42894
43215
  EmptyState,
42895
43216
  {
42896
43217
  title: t("debug.noGuardEvaluations"),
42897
- description: "Guard evaluations will appear when transitions or ticks with guards execute",
43218
+ description: t("debug.guardEvaluationsHint"),
42898
43219
  className: "py-8"
42899
43220
  }
42900
43221
  );
@@ -42925,15 +43246,15 @@ function GuardsPanel({ guards }) {
42925
43246
  ] }),
42926
43247
  content: /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "sm", children: [
42927
43248
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42928
- /* @__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") }),
42929
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 })
42930
43251
  ] }),
42931
43252
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42932
- /* @__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") }),
42933
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) })
42934
43255
  ] }),
42935
43256
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42936
- /* @__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") }),
42937
43258
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: guard.context.traitName })
42938
43259
  ] })
42939
43260
  ] })
@@ -42951,9 +43272,9 @@ function GuardsPanel({ guards }) {
42951
43272
  ] })
42952
43273
  ] }),
42953
43274
  /* @__PURE__ */ jsxRuntime.jsxs(ButtonGroup, { children: [
42954
- /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: "All" }),
42955
- /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: "Passed" }),
42956
- /* @__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") })
42957
43278
  ] })
42958
43279
  ] }),
42959
43280
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-80 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: accordionItems }) })
@@ -43079,7 +43400,7 @@ function TransitionTimeline({ transitions }) {
43079
43400
  EmptyState,
43080
43401
  {
43081
43402
  title: t("debug.noTransitionsRecorded"),
43082
- description: "Transitions will appear as the state machine processes events",
43403
+ description: t("debug.transitionsProcessHint"),
43083
43404
  className: "py-8"
43084
43405
  }
43085
43406
  );
@@ -43096,10 +43417,7 @@ function TransitionTimeline({ transitions }) {
43096
43417
  const sorted = [...transitions].reverse();
43097
43418
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--timeline", children: [
43098
43419
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-2", children: [
43099
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-500", children: [
43100
- transitions.length,
43101
- " transitions recorded"
43102
- ] }),
43420
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500", children: t("debug.transitionsRecorded", { count: transitions.length }) }),
43103
43421
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-1 text-xs text-gray-500 cursor-pointer", children: [
43104
43422
  /* @__PURE__ */ jsxRuntime.jsx(
43105
43423
  Checkbox,
@@ -43108,7 +43426,7 @@ function TransitionTimeline({ transitions }) {
43108
43426
  onChange: (e) => setAutoScroll(e.target.checked)
43109
43427
  }
43110
43428
  ),
43111
- "Auto-scroll"
43429
+ t("debug.autoScroll")
43112
43430
  ] })
43113
43431
  ] }),
43114
43432
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -43151,15 +43469,13 @@ function TransitionTimeline({ transitions }) {
43151
43469
  variant: trace.guardResult ? "success" : "danger",
43152
43470
  size: "sm",
43153
43471
  children: [
43154
- "guard: ",
43472
+ t("debug.guardLabel"),
43473
+ " ",
43155
43474
  trace.guardResult ? "\u2713" : "\u2717"
43156
43475
  ]
43157
43476
  }
43158
43477
  ),
43159
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: [
43160
- trace.effects.length,
43161
- " effects"
43162
- ] })
43478
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: t("debug.effectsCount", { count: trace.effects.length }) })
43163
43479
  ] }),
43164
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: [
43165
43481
  /* @__PURE__ */ jsxRuntime.jsx(EffectBadge, { effect }),
@@ -43208,13 +43524,13 @@ function ServerBridgeTab({ bridge }) {
43208
43524
  EmptyState,
43209
43525
  {
43210
43526
  title: t("debug.noBridgeData"),
43211
- description: "The ServerBridge has not been initialized. Bridge health will appear once the runtime connects to the server.",
43527
+ description: t("debug.bridgeInitHint"),
43212
43528
  className: "py-8"
43213
43529
  }
43214
43530
  );
43215
43531
  }
43216
43532
  const formatTime4 = (ts) => {
43217
- if (ts === 0) return "Never";
43533
+ if (ts === 0) return t("debug.never");
43218
43534
  const d = new Date(ts);
43219
43535
  return d.toLocaleTimeString("en-US", {
43220
43536
  hour12: false,
@@ -43227,14 +43543,14 @@ function ServerBridgeTab({ bridge }) {
43227
43543
  /* @__PURE__ */ jsxRuntime.jsxs(Card, { className: "p-3", children: [
43228
43544
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 mb-3", children: [
43229
43545
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: `w-3 h-3 rounded-full ${bridge.connected ? "bg-green-500 animate-pulse" : "bg-red-500"}` }),
43230
- /* @__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") })
43231
43547
  ] }),
43232
43548
  /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "xs", children: [
43233
43549
  /* @__PURE__ */ jsxRuntime.jsx(
43234
43550
  StatRow,
43235
43551
  {
43236
43552
  label: t("debug.status"),
43237
- value: bridge.connected ? "Connected" : "Disconnected",
43553
+ value: bridge.connected ? t("debug.connected") : t("debug.disconnected"),
43238
43554
  variant: bridge.connected ? "success" : "danger"
43239
43555
  }
43240
43556
  ),
@@ -43262,13 +43578,10 @@ function ServerBridgeTab({ bridge }) {
43262
43578
  ] })
43263
43579
  ] }),
43264
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: [
43265
- /* @__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") }),
43266
43582
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-red-500 font-mono break-all", children: bridge.lastError })
43267
43583
  ] }),
43268
- bridge.connected && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-2", children: /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-400", children: [
43269
- bridge.eventsForwarded + bridge.eventsReceived,
43270
- " total events processed"
43271
- ] }) })
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 }) }) })
43272
43585
  ] }) });
43273
43586
  }
43274
43587
  var init_ServerBridgeTab = __esm({
@@ -43378,7 +43691,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43378
43691
  EmptyState,
43379
43692
  {
43380
43693
  title: t("debug.noActiveTraits"),
43381
- description: "Traits will appear when the state machine initializes",
43694
+ description: t("debug.traitsInitHint"),
43382
43695
  className: "py-8"
43383
43696
  }
43384
43697
  );
@@ -43395,7 +43708,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43395
43708
  };
43396
43709
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--dispatch", children: [
43397
43710
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3", children: [
43398
- /* @__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") }),
43399
43712
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: traits2.map((trait) => /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "success", size: "sm", children: [
43400
43713
  trait.name,
43401
43714
  ": ",
@@ -43403,8 +43716,8 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43403
43716
  ] }, trait.id)) })
43404
43717
  ] }),
43405
43718
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3", children: [
43406
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Available Events" }),
43407
- 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: [
43408
43721
  /* @__PURE__ */ jsxRuntime.jsx(
43409
43722
  Button,
43410
43723
  {
@@ -43416,15 +43729,15 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43416
43729
  }
43417
43730
  ),
43418
43731
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500", children: transitions.map((t2) => `${t2.from} -> ${t2.to}`).join(", ") }),
43419
- 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") })
43420
43733
  ] }, event)) })
43421
43734
  ] }),
43422
43735
  unavailableEvents.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3", children: [
43423
- /* @__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") }),
43424
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)) })
43425
43738
  ] }),
43426
43739
  log12.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
43427
- /* @__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") }),
43428
43741
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: log12.map((entry, i) => /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "font-mono text-xs", children: [
43429
43742
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-400", children: entry.traitName }),
43430
43743
  " ",
@@ -43455,21 +43768,20 @@ var init_RuntimeDebugger = __esm({
43455
43768
  }
43456
43769
  });
43457
43770
  function ServerResponseRow({ sr }) {
43771
+ const { t } = useTranslate();
43458
43772
  const entityEntries = Object.entries(sr.dataEntities);
43459
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: [
43460
43774
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43461
43775
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: sr.success ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400", children: [
43462
43776
  sr.success ? "\u2713" : "\u2717",
43463
- " server"
43777
+ " ",
43778
+ t("debug.server")
43464
43779
  ] }),
43465
43780
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-300", children: sr.orbitalName }),
43466
- sr.clientEffects > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "px-1 rounded bg-purple-500/15 text-purple-600 dark:text-purple-300", children: [
43467
- sr.clientEffects,
43468
- " clientEffect",
43469
- sr.clientEffects !== 1 ? "s" : ""
43470
- ] }),
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 }) }),
43471
43782
  sr.emittedEvents.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "px-1 rounded bg-blue-500/15 text-blue-300", children: [
43472
- "emit: ",
43783
+ t("debug.emitLabel"),
43784
+ " ",
43473
43785
  sr.emittedEvents.join(", ")
43474
43786
  ] }),
43475
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 })
@@ -43477,13 +43789,12 @@ function ServerResponseRow({ sr }) {
43477
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: [
43478
43790
  name,
43479
43791
  ": ",
43480
- count,
43481
- " row",
43482
- count !== 1 ? "s" : ""
43792
+ t("debug.rowsCount", { count })
43483
43793
  ] }, name)) })
43484
43794
  ] });
43485
43795
  }
43486
43796
  function TransitionRow({ trace }) {
43797
+ const { t } = useTranslate();
43487
43798
  const isServerEntry = !!trace.serverResponse && trace.traitName.startsWith("server:");
43488
43799
  const hasFailedEffects = trace.effects.some((e) => e.status === "failed");
43489
43800
  if (isServerEntry && trace.serverResponse) {
@@ -43491,7 +43802,7 @@ function TransitionRow({ trace }) {
43491
43802
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-2 text-xs font-mono", children: [
43492
43803
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-1.5 w-1.5 h-1.5 rounded-full flex-shrink-0 bg-purple-500" }),
43493
43804
  /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "warning", size: "sm", className: "flex-shrink-0", children: trace.event }),
43494
- /* @__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") })
43495
43806
  ] }),
43496
43807
  /* @__PURE__ */ jsxRuntime.jsx(ServerResponseRow, { sr: trace.serverResponse })
43497
43808
  ] });
@@ -43532,6 +43843,7 @@ function VerifyModePanel({
43532
43843
  serverCount,
43533
43844
  localCount
43534
43845
  }) {
43846
+ const { t } = useTranslate();
43535
43847
  const [expanded, setExpanded] = React85__namespace.useState(true);
43536
43848
  const scrollRef = React85__namespace.useRef(null);
43537
43849
  const prevCountRef = React85__namespace.useRef(0);
@@ -43562,30 +43874,20 @@ function VerifyModePanel({
43562
43874
  onClick: () => setExpanded((v) => !v),
43563
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",
43564
43876
  "aria-expanded": expanded,
43565
- "aria-label": expanded ? "Collapse verification timeline" : "Expand verification timeline",
43877
+ "aria-label": expanded ? t("debug.collapseVerificationTimeline") : t("debug.expandVerificationTimeline"),
43566
43878
  "data-testid": "debugger-verify-toggle",
43567
43879
  children: [
43568
43880
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground/50 w-3", "aria-hidden": true, children: expanded ? "\u25BE" : "\u25B8" }),
43569
- /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? `${failedChecks} fail` : "OK" }),
43570
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-foreground/70", children: [
43571
- localCount,
43572
- " local"
43573
- ] }),
43574
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-purple-600 dark:text-purple-400", children: [
43575
- serverCount,
43576
- " server"
43577
- ] }),
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 }) }),
43578
43884
  traitStates && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-cyan-600 dark:text-cyan-400 truncate max-w-[400px]", children: traitStates }),
43579
- !expanded && transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ml-auto text-foreground/50", children: [
43580
- transitions.length,
43581
- " transition",
43582
- transitions.length !== 1 ? "s" : ""
43583
- ] })
43885
+ !expanded && transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto text-foreground/50", children: t("debug.transitionsCount", { count: transitions.length }) })
43584
43886
  ]
43585
43887
  }
43586
43888
  ),
43587
43889
  expanded && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 flex overflow-hidden", children: [
43588
- /* @__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)) }) }) }),
43589
43891
  /* @__PURE__ */ jsxRuntime.jsx(WalkMinimap, {})
43590
43892
  ] })
43591
43893
  ]
@@ -43601,6 +43903,7 @@ function RuntimeDebugger({
43601
43903
  defaultTab,
43602
43904
  schema
43603
43905
  }) {
43906
+ const { t } = useTranslate();
43604
43907
  const [isCollapsed, setIsCollapsed] = React85__namespace.useState(mode === "verify" ? true : defaultCollapsed);
43605
43908
  const [isVisible, setIsVisible] = React85__namespace.useState(mode === "inline" || mode === "verify" || isDebugEnabled2());
43606
43909
  const debugData = useDebugData();
@@ -43639,55 +43942,55 @@ function RuntimeDebugger({
43639
43942
  const tabItems = [
43640
43943
  {
43641
43944
  id: "dispatch",
43642
- label: "Dispatch",
43945
+ label: t("debug.tabDispatch"),
43643
43946
  badge: debugData.traits.length || void 0,
43644
43947
  content: /* @__PURE__ */ jsxRuntime.jsx(EventDispatcherTab, { traits: debugData.traits, schema })
43645
43948
  },
43646
43949
  {
43647
43950
  id: "verify",
43648
- label: failedChecks > 0 ? "Verify (!)" : "Verify",
43951
+ label: failedChecks > 0 ? t("debug.tabVerifyAlert") : t("debug.tabVerify"),
43649
43952
  badge: verification.summary.totalChecks || void 0,
43650
43953
  content: /* @__PURE__ */ jsxRuntime.jsx(VerificationTab, { checks: verification.checks, summary: verification.summary })
43651
43954
  },
43652
43955
  {
43653
43956
  id: "timeline",
43654
- label: "Timeline",
43957
+ label: t("debug.tabTimeline"),
43655
43958
  badge: verification.transitions.length || void 0,
43656
43959
  content: /* @__PURE__ */ jsxRuntime.jsx(TransitionTimeline, { transitions: verification.transitions })
43657
43960
  },
43658
43961
  {
43659
43962
  id: "bridge",
43660
- label: "Bridge",
43963
+ label: t("debug.tabBridge"),
43661
43964
  badge: verification.bridge?.connected ? void 0 : 1,
43662
43965
  content: /* @__PURE__ */ jsxRuntime.jsx(ServerBridgeTab, { bridge: verification.bridge })
43663
43966
  },
43664
43967
  {
43665
43968
  id: "traits",
43666
- label: "Traits",
43969
+ label: t("debug.tabTraits"),
43667
43970
  badge: debugData.traits.length || void 0,
43668
43971
  content: /* @__PURE__ */ jsxRuntime.jsx(TraitsTab, { traits: debugData.traits })
43669
43972
  },
43670
43973
  {
43671
43974
  id: "ticks",
43672
- label: "Ticks",
43673
- 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,
43674
43977
  content: /* @__PURE__ */ jsxRuntime.jsx(TicksTab, { ticks: debugData.ticks })
43675
43978
  },
43676
43979
  {
43677
43980
  id: "entities",
43678
- label: "Entities",
43981
+ label: t("debug.tabEntities"),
43679
43982
  badge: debugData.entitySnapshot?.runtime.length || void 0,
43680
43983
  content: /* @__PURE__ */ jsxRuntime.jsx(EntitiesTab, { snapshot: debugData.entitySnapshot })
43681
43984
  },
43682
43985
  {
43683
43986
  id: "events",
43684
- label: "Events",
43987
+ label: t("debug.tabEvents"),
43685
43988
  badge: debugData.events.length > 0 ? debugData.events.length : void 0,
43686
43989
  content: /* @__PURE__ */ jsxRuntime.jsx(EventFlowTab, { events: debugData.events })
43687
43990
  },
43688
43991
  {
43689
43992
  id: "guards",
43690
- label: "Guards",
43993
+ label: t("debug.tabGuards"),
43691
43994
  badge: debugData.guards.filter((g) => !g.result).length || void 0,
43692
43995
  content: /* @__PURE__ */ jsxRuntime.jsx(GuardsPanel, { guards: debugData.guards })
43693
43996
  }
@@ -43715,15 +44018,10 @@ function RuntimeDebugger({
43715
44018
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43716
44019
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "h6", style: { fontSize: "0.75rem" }, children: [
43717
44020
  isCollapsed ? "\u25B6" : "\u25BC",
43718
- " Debugger"
44021
+ " ",
44022
+ t("debug.debugger")
43719
44023
  ] }),
43720
- failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "danger", size: "sm", children: [
43721
- failedChecks,
43722
- " failed"
43723
- ] }) : debugData.traits.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "success", size: "sm", children: [
43724
- debugData.traits.length,
43725
- " traits"
43726
- ] }) : /* @__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") })
43727
44025
  ] })
43728
44026
  }
43729
44027
  ),
@@ -43741,9 +44039,9 @@ function RuntimeDebugger({
43741
44039
  );
43742
44040
  }
43743
44041
  if (mode === "verify") {
43744
- const traitStates = debugData.traits.map((t) => `${t.name}:${t.currentState}`).join(" | ");
43745
- const serverEntries = verification.transitions.filter((t) => t.serverResponse);
43746
- 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);
43747
44045
  return /* @__PURE__ */ jsxRuntime.jsx(
43748
44046
  VerifyModePanel,
43749
44047
  {
@@ -43775,7 +44073,7 @@ function RuntimeDebugger({
43775
44073
  variant: "secondary",
43776
44074
  size: "sm",
43777
44075
  className: "runtime-debugger__toggle",
43778
- title: "Open Debugger (`)",
44076
+ title: t("debug.openDebugger"),
43779
44077
  children: failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "relative", children: [
43780
44078
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: "V" }),
43781
44079
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute -top-1 -right-2 w-2 h-2 bg-red-500 rounded-full" })
@@ -43785,11 +44083,8 @@ function RuntimeDebugger({
43785
44083
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "runtime-debugger__header", children: [
43786
44084
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43787
44085
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-lg", children: "V" }),
43788
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: "KFlow Verifier" }),
43789
- failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "danger", size: "sm", children: [
43790
- failedChecks,
43791
- " failed"
43792
- ] }) : 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") })
43793
44088
  ] }),
43794
44089
  /* @__PURE__ */ jsxRuntime.jsx(
43795
44090
  Button,
@@ -43797,7 +44092,7 @@ function RuntimeDebugger({
43797
44092
  onClick: () => setIsCollapsed(true),
43798
44093
  variant: "ghost",
43799
44094
  size: "sm",
43800
- title: "Close (`)",
44095
+ title: t("debug.close"),
43801
44096
  children: "x"
43802
44097
  }
43803
44098
  )
@@ -43811,7 +44106,7 @@ function RuntimeDebugger({
43811
44106
  className: "runtime-debugger__tabs"
43812
44107
  }
43813
44108
  ) }),
43814
- /* @__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") }) })
43815
44110
  ] })
43816
44111
  }
43817
44112
  );
@@ -43837,6 +44132,7 @@ var init_RuntimeDebugger2 = __esm({
43837
44132
  init_TransitionTimeline();
43838
44133
  init_ServerBridgeTab();
43839
44134
  init_EventDispatcherTab();
44135
+ init_useTranslate();
43840
44136
  init_RuntimeDebugger();
43841
44137
  RuntimeDebugger.displayName = "RuntimeDebugger";
43842
44138
  }
@@ -45125,7 +45421,7 @@ var init_StatCard = __esm({
45125
45421
  }
45126
45422
  );
45127
45423
  }
45128
- const label = schemaStats?.[0]?.label || labelToUse || "Stat";
45424
+ const label = schemaStats?.[0]?.label || labelToUse || t("statCard.defaultLabel");
45129
45425
  const normalizedPropValue = Array.isArray(propValue) ? propValue[0] ?? propValue.length : propValue;
45130
45426
  const value = schemaStats?.[0]?.value ?? normalizedPropValue ?? 0;
45131
45427
  const trendDirection = manualDirection || (calculatedTrend === void 0 || calculatedTrend === 0 ? "neutral" : calculatedTrend > 0 ? "up" : "down");
@@ -45168,7 +45464,7 @@ var init_StatCard = __esm({
45168
45464
  ]
45169
45465
  }
45170
45466
  ),
45171
- /* @__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") })
45172
45468
  ] }),
45173
45469
  subtitle && !calculatedTrend && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", children: subtitle })
45174
45470
  ] }),