@almadar/ui 5.21.8 → 5.21.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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,299 @@ 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",
2434
+ "relationSelect.selectPlaceholder": "Select..."
2141
2435
  };
2142
2436
  }
2143
2437
  });
@@ -5225,6 +5519,7 @@ var init_LawReferenceTooltip = __esm({
5225
5519
  init_Typography();
5226
5520
  init_Divider();
5227
5521
  init_cn();
5522
+ init_useTranslate();
5228
5523
  positionStyles2 = {
5229
5524
  top: "bottom-full left-1/2 -translate-x-1/2 mb-2",
5230
5525
  bottom: "top-full left-1/2 -translate-x-1/2 mt-2",
@@ -5243,6 +5538,7 @@ var init_LawReferenceTooltip = __esm({
5243
5538
  position = "top",
5244
5539
  className
5245
5540
  }) => {
5541
+ const { t } = useTranslate();
5246
5542
  const [isVisible, setIsVisible] = React85__namespace.default.useState(false);
5247
5543
  const timeoutRef = React85__namespace.default.useRef(null);
5248
5544
  const handleMouseEnter = () => {
@@ -5326,7 +5622,7 @@ var init_LawReferenceTooltip = __esm({
5326
5622
  target: "_blank",
5327
5623
  rel: "noopener noreferrer",
5328
5624
  onClick: (e) => e.stopPropagation(),
5329
- children: "View full law text"
5625
+ children: t("lawReference.viewFullText")
5330
5626
  }
5331
5627
  )
5332
5628
  ] }),
@@ -13607,6 +13903,7 @@ var log7, SWIM_GUTTER, CENTER_W, BehaviorView;
13607
13903
  var init_BehaviorView = __esm({
13608
13904
  "components/avl/molecules/BehaviorView.tsx"() {
13609
13905
  "use client";
13906
+ init_useTranslate();
13610
13907
  init_AvlState();
13611
13908
  init_AvlTransitionLane();
13612
13909
  init_AvlSwimLane();
@@ -13616,6 +13913,7 @@ var init_BehaviorView = __esm({
13616
13913
  SWIM_GUTTER = 120;
13617
13914
  CENTER_W = 360;
13618
13915
  BehaviorView = ({ data }) => {
13916
+ const { t } = useTranslate();
13619
13917
  const [layout, setLayout] = React85.useState(null);
13620
13918
  const traitName = data.traits[0]?.name;
13621
13919
  const traitData = traitName ? data.traitDetails[traitName] : void 0;
@@ -13625,10 +13923,10 @@ var init_BehaviorView = __esm({
13625
13923
  computeTraitLayout(traitData).then(setLayout).catch((err) => log7.error("compute-trait-layout-failed", { error: err instanceof Error ? err : String(err) }));
13626
13924
  }, [dataKey]);
13627
13925
  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" });
13926
+ 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
13927
  }
13630
13928
  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..." });
13929
+ 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
13930
  }
13633
13931
  const hasExternal = traitData.listenedEvents.length > 0 || traitData.emittedEvents.length > 0;
13634
13932
  const viewW = hasExternal ? SWIM_GUTTER + CENTER_W + SWIM_GUTTER : CENTER_W + 60;
@@ -13644,10 +13942,7 @@ var init_BehaviorView = __esm({
13644
13942
  const machineHeight = scaledH + 100;
13645
13943
  const renderMachine = /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
13646
13944
  /* @__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
- ] }),
13945
+ /* @__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
13946
  /* @__PURE__ */ jsxRuntime.jsxs("defs", { children: [
13652
13947
  /* @__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
13948
  /* @__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 +14250,7 @@ var init_CodeBlock = __esm({
13955
14250
  const isLolo = language === "lolo";
13956
14251
  const activeStyle = isOrb ? orbStyle : isLolo ? loloStyle : dark__default.default;
13957
14252
  const eventBus = useEventBus();
13958
- const { t: _t } = useTranslate();
14253
+ const { t } = useTranslate();
13959
14254
  const scrollRef = React85.useRef(null);
13960
14255
  const codeRef = React85.useRef(null);
13961
14256
  const savedScrollLeftRef = React85.useRef(0);
@@ -14210,7 +14505,7 @@ var init_CodeBlock = __esm({
14210
14505
  size: "sm",
14211
14506
  onClick: handleCopy,
14212
14507
  className: "opacity-0 group-hover:opacity-100 focus:opacity-100 transition-opacity text-muted-foreground hover:text-white",
14213
- "aria-label": "Copy code",
14508
+ "aria-label": t("common.copy"),
14214
14509
  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
14510
  }
14216
14511
  )
@@ -14865,7 +15160,7 @@ var init_StateMachineView = __esm({
14865
15160
  const endX2 = fromState.x + Math.cos(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
14866
15161
  const endY2 = fromState.y + Math.sin(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
14867
15162
  const isSingle2 = bundle.labels.length === 1;
14868
- const labelText2 = isSingle2 ? bundle.labels[0].event : `${bundle.labels.length} events`;
15163
+ const labelText2 = isSingle2 ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
14869
15164
  const bundleColor2 = isSingle2 ? config.colors.arrow : "var(--color-accent)";
14870
15165
  const labelWidth2 = labelText2.length * 9 + (isSingle2 ? 24 : 40);
14871
15166
  const cx = fromState.x;
@@ -14991,7 +15286,7 @@ var init_StateMachineView = __esm({
14991
15286
  const controlX = midX + perpX;
14992
15287
  const controlY = midY + perpY;
14993
15288
  const isSingle = bundle.labels.length === 1;
14994
- const labelText = isSingle ? bundle.labels[0].event : `${bundle.labels.length} events`;
15289
+ const labelText = isSingle ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
14995
15290
  const labelWidth = labelText.length * 9 + (isSingle ? 24 : 40);
14996
15291
  const bundleColor = isSingle ? config.colors.arrow : "var(--color-accent)";
14997
15292
  const curveMidpoint = {
@@ -15146,7 +15441,7 @@ var init_StateMachineView = __esm({
15146
15441
  {
15147
15442
  className: "absolute -top-2 left-1/2 transform -translate-x-1/2 px-2 py-0.5 rounded-full",
15148
15443
  style: { backgroundColor: "var(--color-success)" },
15149
- children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: "Pinned" })
15444
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: t("stateMachine.pinned") })
15150
15445
  }
15151
15446
  ),
15152
15447
  !isSingle && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -15168,10 +15463,7 @@ var init_StateMachineView = __esm({
15168
15463
  {
15169
15464
  className: "ml-2 px-2 py-0.5 rounded-full",
15170
15465
  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
- ] })
15466
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: t("stateMachine.eventCount", { count: bundle.labels.length }) })
15175
15467
  }
15176
15468
  )
15177
15469
  ]
@@ -15316,7 +15608,7 @@ var init_StateMachineView = __esm({
15316
15608
  align: "center",
15317
15609
  className: "mb-2",
15318
15610
  style: { color: "var(--color-warning)", fontSize: "13px" },
15319
- children: "External Effects"
15611
+ children: t("stateMachine.externalEffects")
15320
15612
  }
15321
15613
  ),
15322
15614
  outputs.outputs.map((output, idx) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -15336,10 +15628,10 @@ var init_StateMachineView = __esm({
15336
15628
  Legend = ({ config, y }) => {
15337
15629
  const { t } = useTranslate();
15338
15630
  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)" }
15631
+ { key: "initial", label: t("stateMachine.legend.initial"), color: config.colors.initialNode, isMultiEvent: false },
15632
+ { key: "final", label: t("stateMachine.legend.final"), color: config.colors.finalNode, isMultiEvent: false },
15633
+ { key: "state", label: t("stateMachine.legend.state"), color: config.colors.nodeBorder, isMultiEvent: false },
15634
+ { key: "multiEvent", label: t("stateMachine.legend.multiEvent"), color: "var(--color-accent)", isMultiEvent: true }
15343
15635
  ];
15344
15636
  return /* @__PURE__ */ jsxRuntime.jsx(
15345
15637
  HStack,
@@ -15354,8 +15646,8 @@ var init_StateMachineView = __esm({
15354
15646
  {
15355
15647
  className: "w-3 h-3 rounded-full",
15356
15648
  style: {
15357
- backgroundColor: item.label === "Multi-event" ? item.color : config.colors.node,
15358
- border: item.label !== "Multi-event" ? `2px solid ${item.color}` : "none"
15649
+ backgroundColor: item.isMultiEvent ? item.color : config.colors.node,
15650
+ border: !item.isMultiEvent ? `2px solid ${item.color}` : "none"
15359
15651
  }
15360
15652
  }
15361
15653
  ),
@@ -15367,7 +15659,7 @@ var init_StateMachineView = __esm({
15367
15659
  children: item.label
15368
15660
  }
15369
15661
  )
15370
- ] }, item.label))
15662
+ ] }, item.key))
15371
15663
  }
15372
15664
  );
15373
15665
  };
@@ -16161,13 +16453,13 @@ var init_JazariStateMachine = __esm({
16161
16453
  );
16162
16454
  }, [resolvedTrait, entityFields]);
16163
16455
  if (isLoading) {
16164
- return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: "Loading state machine\u2026" });
16456
+ return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: t("stateMachine.loading") });
16165
16457
  }
16166
16458
  if (error) {
16167
16459
  return /* @__PURE__ */ jsxRuntime.jsx(ErrorState, { message: error instanceof Error ? error.message : String(error) });
16168
16460
  }
16169
16461
  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" }) });
16462
+ 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
16463
  }
16172
16464
  return /* @__PURE__ */ jsxRuntime.jsx(
16173
16465
  StateMachineView,
@@ -17211,13 +17503,13 @@ var init_LayoutPatterns = __esm({
17211
17503
  function generateRuleId() {
17212
17504
  return `rule-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
17213
17505
  }
17214
- function questionsToOptions(questions, includeEndOfSurvey) {
17506
+ function questionsToOptions(questions, endOfSurveyLabel) {
17215
17507
  const opts = questions.map((q) => ({
17216
17508
  value: q.id,
17217
17509
  label: q.label
17218
17510
  }));
17219
- if (includeEndOfSurvey) {
17220
- opts.push({ value: END_OF_SURVEY, label: "End of survey" });
17511
+ if (endOfSurveyLabel !== null) {
17512
+ opts.push({ value: END_OF_SURVEY, label: endOfSurveyLabel });
17221
17513
  }
17222
17514
  return opts;
17223
17515
  }
@@ -17226,7 +17518,7 @@ function isRuleBroken(rule, questions) {
17226
17518
  const targetExists = rule.targetQuestionId === END_OF_SURVEY || questions.some((q) => q.id === rule.targetQuestionId);
17227
17519
  return !sourceExists || !targetExists;
17228
17520
  }
17229
- var END_OF_SURVEY, OPERATOR_OPTIONS, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph, BranchingLogicBuilder;
17521
+ var END_OF_SURVEY, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph, BranchingLogicBuilder;
17230
17522
  var init_BranchingLogicBuilder = __esm({
17231
17523
  "components/core/molecules/BranchingLogicBuilder.tsx"() {
17232
17524
  "use client";
@@ -17239,14 +17531,9 @@ var init_BranchingLogicBuilder = __esm({
17239
17531
  init_FilterPill();
17240
17532
  init_Box();
17241
17533
  init_useEventBus();
17534
+ init_useTranslate();
17242
17535
  init_cn();
17243
17536
  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
17537
  RuleRow = ({
17251
17538
  rule,
17252
17539
  questions,
@@ -17255,8 +17542,21 @@ var init_BranchingLogicBuilder = __esm({
17255
17542
  onChange,
17256
17543
  onDelete
17257
17544
  }) => {
17258
- const sourceOptions = React85.useMemo(() => questionsToOptions(questions, false), [questions]);
17259
- const targetOptions = React85.useMemo(() => questionsToOptions(questions, true), [questions]);
17545
+ const { t } = useTranslate();
17546
+ const operatorOptions = React85.useMemo(
17547
+ () => [
17548
+ { value: "equals", label: t("branchingLogic.operatorEquals") },
17549
+ { value: "not-equals", label: t("branchingLogic.operatorNotEquals") },
17550
+ { value: "contains", label: t("branchingLogic.operatorContains") },
17551
+ { value: "in", label: t("branchingLogic.operatorIn") }
17552
+ ],
17553
+ [t]
17554
+ );
17555
+ const sourceOptions = React85.useMemo(() => questionsToOptions(questions, null), [questions]);
17556
+ const targetOptions = React85.useMemo(
17557
+ () => questionsToOptions(questions, t("branchingLogic.endOfSurvey")),
17558
+ [questions, t]
17559
+ );
17260
17560
  const sourceQuestion = questions.find((q) => q.id === rule.sourceQuestionId);
17261
17561
  const valueOptions = React85.useMemo(() => {
17262
17562
  if (!sourceQuestion?.optionValues) return [];
@@ -17301,22 +17601,22 @@ var init_BranchingLogicBuilder = __esm({
17301
17601
  ),
17302
17602
  children: [
17303
17603
  /* @__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" }),
17604
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "semibold", className: "shrink-0", children: t("branchingLogic.if") }),
17305
17605
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsxRuntime.jsx(
17306
17606
  Select,
17307
17607
  {
17308
17608
  options: sourceOptions,
17309
17609
  value: rule.sourceQuestionId,
17310
- placeholder: "Select question",
17610
+ placeholder: t("branchingLogic.selectQuestion"),
17311
17611
  onChange: handleSource,
17312
17612
  disabled: readOnly,
17313
- error: broken ? "Broken reference" : void 0
17613
+ error: broken ? t("branchingLogic.brokenReference") : void 0
17314
17614
  }
17315
17615
  ) }),
17316
17616
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[8rem] basis-32", children: /* @__PURE__ */ jsxRuntime.jsx(
17317
17617
  Select,
17318
17618
  {
17319
- options: OPERATOR_OPTIONS,
17619
+ options: operatorOptions,
17320
17620
  value: rule.operator,
17321
17621
  onChange: handleOperator,
17322
17622
  disabled: readOnly
@@ -17339,7 +17639,7 @@ var init_BranchingLogicBuilder = __esm({
17339
17639
  {
17340
17640
  options: valueOptions.filter((o) => !chips.includes(o.value)),
17341
17641
  value: "",
17342
- placeholder: "Add value",
17642
+ placeholder: t("branchingLogic.addValue"),
17343
17643
  onChange: handleAddChip,
17344
17644
  disabled: readOnly
17345
17645
  }
@@ -17347,7 +17647,7 @@ var init_BranchingLogicBuilder = __esm({
17347
17647
  Input,
17348
17648
  {
17349
17649
  inputType: "text",
17350
- placeholder: "Type value, press Enter",
17650
+ placeholder: t("branchingLogic.typeValuePressEnter"),
17351
17651
  value: "",
17352
17652
  onKeyDown: (e) => {
17353
17653
  if (e.key !== "Enter") return;
@@ -17365,7 +17665,7 @@ var init_BranchingLogicBuilder = __esm({
17365
17665
  {
17366
17666
  options: valueOptions,
17367
17667
  value: scalarValue,
17368
- placeholder: "Select value",
17668
+ placeholder: t("branchingLogic.selectValue"),
17369
17669
  onChange: (e) => onChange({ ...rule, value: e.target.value }),
17370
17670
  disabled: readOnly
17371
17671
  }
@@ -17373,7 +17673,7 @@ var init_BranchingLogicBuilder = __esm({
17373
17673
  Input,
17374
17674
  {
17375
17675
  inputType: "text",
17376
- placeholder: "Value",
17676
+ placeholder: t("branchingLogic.value"),
17377
17677
  value: scalarValue,
17378
17678
  onChange: handleScalarValue,
17379
17679
  disabled: readOnly
@@ -17381,17 +17681,17 @@ var init_BranchingLogicBuilder = __esm({
17381
17681
  ) }),
17382
17682
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "label", weight: "semibold", className: "shrink-0 inline-flex items-center gap-1", children: [
17383
17683
  /* @__PURE__ */ jsxRuntime.jsx(LucideIcons2.ArrowRight, { className: "h-4 w-4" }),
17384
- "go to"
17684
+ t("branchingLogic.goTo")
17385
17685
  ] }),
17386
17686
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsxRuntime.jsx(
17387
17687
  Select,
17388
17688
  {
17389
17689
  options: targetOptions,
17390
17690
  value: rule.targetQuestionId,
17391
- placeholder: "Select target",
17691
+ placeholder: t("branchingLogic.selectTarget"),
17392
17692
  onChange: handleTarget,
17393
17693
  disabled: readOnly,
17394
- error: broken && rule.targetQuestionId !== END_OF_SURVEY ? "Broken reference" : void 0
17694
+ error: broken && rule.targetQuestionId !== END_OF_SURVEY ? t("branchingLogic.brokenReference") : void 0
17395
17695
  }
17396
17696
  ) }),
17397
17697
  !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
@@ -17403,11 +17703,11 @@ var init_BranchingLogicBuilder = __esm({
17403
17703
  action: "DELETE_RULE",
17404
17704
  actionPayload: { ruleId: rule.id },
17405
17705
  onClick: onDelete,
17406
- "aria-label": "Delete rule"
17706
+ "aria-label": t("branchingLogic.deleteRule")
17407
17707
  }
17408
17708
  )
17409
17709
  ] }),
17410
- broken && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "error", size: "sm", label: "Broken reference" })
17710
+ broken && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "error", size: "sm", label: t("branchingLogic.brokenReference") })
17411
17711
  ]
17412
17712
  }
17413
17713
  );
@@ -17417,10 +17717,12 @@ var init_BranchingLogicBuilder = __esm({
17417
17717
  NODE_GAP_Y = 80;
17418
17718
  PADDING = 32;
17419
17719
  LogicGraph = ({ questions, rules }) => {
17720
+ const { t } = useTranslate();
17721
+ const endOfSurveyLabel = t("branchingLogic.endOfSurvey");
17420
17722
  const layout = React85.useMemo(() => {
17421
17723
  const items = [
17422
17724
  ...questions.map((q) => ({ id: q.id, label: q.label, isEnd: false })),
17423
- { id: END_OF_SURVEY, label: "End of survey", isEnd: true }
17725
+ { id: END_OF_SURVEY, label: endOfSurveyLabel, isEnd: true }
17424
17726
  ];
17425
17727
  const positions = {};
17426
17728
  items.forEach((item, i) => {
@@ -17432,14 +17734,14 @@ var init_BranchingLogicBuilder = __esm({
17432
17734
  const width = NODE_WIDTH + PADDING * 2 + 220;
17433
17735
  const height = PADDING * 2 + items.length * (NODE_HEIGHT + NODE_GAP_Y);
17434
17736
  return { items, positions, width, height };
17435
- }, [questions]);
17737
+ }, [questions, endOfSurveyLabel]);
17436
17738
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "overflow-auto rounded-container border border-border bg-card p-2", children: /* @__PURE__ */ jsxRuntime.jsxs(
17437
17739
  "svg",
17438
17740
  {
17439
17741
  width: layout.width,
17440
17742
  height: layout.height,
17441
17743
  role: "img",
17442
- "aria-label": "Branching logic graph",
17744
+ "aria-label": t("branchingLogic.graphAriaLabel"),
17443
17745
  style: { display: "block" },
17444
17746
  children: [
17445
17747
  /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -17547,6 +17849,7 @@ var init_BranchingLogicBuilder = __esm({
17547
17849
  readOnly = false,
17548
17850
  className
17549
17851
  }) => {
17852
+ const { t } = useTranslate();
17550
17853
  const eventBus = useEventBus();
17551
17854
  const questions = Array.isArray(questionsProp) ? questionsProp : [];
17552
17855
  const rulesInitial = Array.isArray(rulesProp) ? rulesProp : [];
@@ -17599,16 +17902,23 @@ var init_BranchingLogicBuilder = __esm({
17599
17902
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-wrap items-center justify-between gap-2", children: [
17600
17903
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-2", children: [
17601
17904
  /* @__PURE__ */ jsxRuntime.jsx(LucideIcons2.GitBranch, { className: "h-5 w-5 text-foreground" }),
17602
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "subheading", weight: "semibold", children: "Branching logic" }),
17905
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "subheading", weight: "semibold", children: t("branchingLogic.title") }),
17603
17906
  /* @__PURE__ */ jsxRuntime.jsx(
17604
17907
  Badge,
17605
17908
  {
17606
17909
  variant: "neutral",
17607
17910
  size: "sm",
17608
- label: `${rules.length} rule${rules.length === 1 ? "" : "s"}`
17911
+ label: rules.length === 1 ? t("branchingLogic.ruleCountOne", { count: rules.length }) : t("branchingLogic.ruleCountOther", { count: rules.length })
17609
17912
  }
17610
17913
  ),
17611
- brokenCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "error", size: "sm", label: `${brokenCount} broken` })
17914
+ brokenCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
17915
+ Badge,
17916
+ {
17917
+ variant: "error",
17918
+ size: "sm",
17919
+ label: t("branchingLogic.brokenCount", { count: brokenCount })
17920
+ }
17921
+ )
17612
17922
  ] }),
17613
17923
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-1 rounded-sm border border-border bg-card p-0.5", children: [
17614
17924
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -17619,7 +17929,7 @@ var init_BranchingLogicBuilder = __esm({
17619
17929
  leftIcon: LucideIcons2.Pencil,
17620
17930
  action: "VIEW_EDIT",
17621
17931
  onClick: () => setView("edit"),
17622
- children: "Rules"
17932
+ children: t("branchingLogic.rules")
17623
17933
  }
17624
17934
  ),
17625
17935
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -17630,13 +17940,13 @@ var init_BranchingLogicBuilder = __esm({
17630
17940
  leftIcon: LucideIcons2.Eye,
17631
17941
  action: "VIEW_GRAPH",
17632
17942
  onClick: () => setView("graph"),
17633
- children: "Logic graph"
17943
+ children: t("branchingLogic.logicGraph")
17634
17944
  }
17635
17945
  )
17636
17946
  ] })
17637
17947
  ] }),
17638
17948
  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(
17949
+ 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
17950
  RuleRow,
17641
17951
  {
17642
17952
  rule,
@@ -17657,7 +17967,7 @@ var init_BranchingLogicBuilder = __esm({
17657
17967
  action: "ADD_RULE",
17658
17968
  onClick: handleAddRule,
17659
17969
  disabled: noQuestions,
17660
- children: "Add rule"
17970
+ children: t("branchingLogic.addRule")
17661
17971
  }
17662
17972
  ) })
17663
17973
  ] }) : /* @__PURE__ */ jsxRuntime.jsx(LogicGraph, { questions, rules })
@@ -18284,7 +18594,7 @@ function CalendarGrid({
18284
18594
  onClick: stepPrev,
18285
18595
  "aria-disabled": !canPrev || void 0,
18286
18596
  "aria-label": t("aria.previousDays"),
18287
- children: "Prev"
18597
+ children: t("nav.previous")
18288
18598
  }
18289
18599
  ),
18290
18600
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground", children: formatDateRange(visibleDays[0], visibleDays[visibleDays.length - 1]) }),
@@ -18297,7 +18607,7 @@ function CalendarGrid({
18297
18607
  onClick: stepNext,
18298
18608
  "aria-disabled": !canNext || void 0,
18299
18609
  "aria-label": t("aria.nextDays"),
18300
- children: "Next"
18610
+ children: t("nav.next")
18301
18611
  }
18302
18612
  )
18303
18613
  ] }),
@@ -19847,7 +20157,7 @@ var init_Pagination = __esm({
19847
20157
  type: "number",
19848
20158
  value: jumpToPage,
19849
20159
  onChange: (e) => setJumpToPage(e.target.value),
19850
- placeholder: "Page",
20160
+ placeholder: t("pagination.jumpPlaceholder"),
19851
20161
  className: "w-20",
19852
20162
  onKeyDown: (e) => {
19853
20163
  if (e.key === "Enter") {
@@ -19985,13 +20295,10 @@ var init_CardGrid = __esm({
19985
20295
  return children;
19986
20296
  }
19987
20297
  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..." }) });
20298
+ 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
20299
  }
19990
20300
  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
- ] }) });
20301
+ 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
20302
  }
19996
20303
  if (normalizedData.length === 0) {
19997
20304
  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 +24164,7 @@ function DataGrid({
23857
24164
  onChange: () => toggleSelection(id),
23858
24165
  onClick: (e) => e.stopPropagation(),
23859
24166
  className: "w-4 h-4 mt-1 flex-shrink-0 accent-primary",
23860
- "aria-label": `Select ${titleValue !== void 0 ? String(titleValue) : "item"}`
24167
+ "aria-label": t("card.selectItem", { item: titleValue !== void 0 ? String(titleValue) : t("card.itemFallback") })
23861
24168
  }
23862
24169
  ),
23863
24170
  /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "xs", className: "flex-1 min-w-0", children: [
@@ -24055,7 +24362,7 @@ function formatDate3(value) {
24055
24362
  if (isNaN(d.getTime())) return String(value);
24056
24363
  return d.toLocaleDateString(void 0, { year: "numeric", month: "short", day: "numeric" });
24057
24364
  }
24058
- function formatValue2(value, format) {
24365
+ function formatValue2(value, format, boolLabels) {
24059
24366
  if (value === void 0 || value === null) return "";
24060
24367
  switch (format) {
24061
24368
  case "date":
@@ -24067,7 +24374,7 @@ function formatValue2(value, format) {
24067
24374
  case "percent":
24068
24375
  return typeof value === "number" ? `${Math.round(value)}%` : String(value);
24069
24376
  case "boolean":
24070
- return value ? "Yes" : "No";
24377
+ return value ? boolLabels?.yes ?? "Yes" : boolLabels?.no ?? "No";
24071
24378
  default:
24072
24379
  return String(value);
24073
24380
  }
@@ -24363,7 +24670,7 @@ function DataList({
24363
24670
  field.label ?? fieldLabel3(field.name),
24364
24671
  ":"
24365
24672
  ] }),
24366
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: formatValue2(value, field.format) })
24673
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
24367
24674
  ] }, field.name);
24368
24675
  }) }),
24369
24676
  progressFields.map((field) => {
@@ -24493,6 +24800,7 @@ var init_FileTree = __esm({
24493
24800
  init_Box();
24494
24801
  init_Typography();
24495
24802
  init_Icon();
24803
+ init_useTranslate();
24496
24804
  TreeNodeItem = ({
24497
24805
  node,
24498
24806
  depth,
@@ -24578,8 +24886,9 @@ var init_FileTree = __esm({
24578
24886
  className,
24579
24887
  indent = 16
24580
24888
  }) => {
24889
+ const { t } = useTranslate();
24581
24890
  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" }) });
24891
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "muted", children: t("fileTree.noFiles") }) });
24583
24892
  }
24584
24893
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `py-1 overflow-y-auto ${className ?? ""}`, role: "tree", children: tree.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
24585
24894
  TreeNodeItem,
@@ -24698,6 +25007,7 @@ var init_FilterGroup = __esm({
24698
25007
  init_Icon();
24699
25008
  init_useEventBus();
24700
25009
  init_useQuerySingleton();
25010
+ init_useTranslate();
24701
25011
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
24702
25012
  lookStyles6 = {
24703
25013
  toolbar: "",
@@ -24718,6 +25028,7 @@ var init_FilterGroup = __esm({
24718
25028
  isLoading,
24719
25029
  look = "toolbar"
24720
25030
  }) => {
25031
+ const { t } = useTranslate();
24721
25032
  const eventBus = useEventBus();
24722
25033
  const queryState = useQuerySingleton(query);
24723
25034
  const [selectedValues, setSelectedValues] = React85.useState(
@@ -24799,7 +25110,7 @@ var init_FilterGroup = __esm({
24799
25110
  "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24800
25111
  !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24801
25112
  ),
24802
- children: "All"
25113
+ children: t("filterGroup.all")
24803
25114
  }
24804
25115
  ),
24805
25116
  filter.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -24827,7 +25138,7 @@ var init_FilterGroup = __esm({
24827
25138
  size: "sm",
24828
25139
  onClick: handleClearAll,
24829
25140
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24830
- children: "Clear"
25141
+ children: t("filterGroup.clear")
24831
25142
  }
24832
25143
  )
24833
25144
  ]
@@ -24838,7 +25149,7 @@ var init_FilterGroup = __esm({
24838
25149
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", lookStyles6[look], className), children: [
24839
25150
  showIcon && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
24840
25151
  /* @__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" })
25152
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
24842
25153
  ] }),
24843
25154
  filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
24844
25155
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-xs font-bold text-muted-foreground uppercase tracking-wide", children: filter.label }),
@@ -24861,7 +25172,7 @@ var init_FilterGroup = __esm({
24861
25172
  `${filter.field}_from`,
24862
25173
  e.target.value || null
24863
25174
  ),
24864
- placeholder: "From",
25175
+ placeholder: t("filterGroup.from"),
24865
25176
  clearable: true,
24866
25177
  onClear: () => handleFilterSelect(`${filter.field}_from`, null)
24867
25178
  }
@@ -24875,7 +25186,7 @@ var init_FilterGroup = __esm({
24875
25186
  `${filter.field}_to`,
24876
25187
  e.target.value || null
24877
25188
  ),
24878
- placeholder: "To",
25189
+ placeholder: t("filterGroup.to"),
24879
25190
  clearable: true,
24880
25191
  onClear: () => handleFilterSelect(`${filter.field}_to`, null)
24881
25192
  }
@@ -24895,7 +25206,7 @@ var init_FilterGroup = __esm({
24895
25206
  value: selectedValues[filter.field] || "all",
24896
25207
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24897
25208
  options: [
24898
- { value: "all", label: "All" },
25209
+ { value: "all", label: t("filterGroup.all") },
24899
25210
  ...filter.options?.map((opt) => ({
24900
25211
  value: opt,
24901
25212
  label: opt
@@ -24912,7 +25223,7 @@ var init_FilterGroup = __esm({
24912
25223
  onClick: handleClearAll,
24913
25224
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24914
25225
  className: "self-start",
24915
- children: "Clear all"
25226
+ children: t("filterGroup.clearAll")
24916
25227
  }
24917
25228
  )
24918
25229
  ] });
@@ -24978,7 +25289,7 @@ var init_FilterGroup = __esm({
24978
25289
  value: selectedValues[filter.field] || "all",
24979
25290
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24980
25291
  options: [
24981
- { value: "all", label: `All ${filter.label}` },
25292
+ { value: "all", label: t("filterGroup.allOf", { label: filter.label }) },
24982
25293
  ...filter.options?.map((opt) => ({
24983
25294
  value: opt,
24984
25295
  label: opt
@@ -25007,7 +25318,7 @@ var init_FilterGroup = __esm({
25007
25318
  field
25008
25319
  );
25009
25320
  }),
25010
- /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
25321
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: t("filterGroup.clearAll") })
25011
25322
  ] })
25012
25323
  ]
25013
25324
  }
@@ -25032,7 +25343,7 @@ var init_FilterGroup = __esm({
25032
25343
  className: "text-muted-foreground",
25033
25344
  children: [
25034
25345
  /* @__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" })
25346
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
25036
25347
  ]
25037
25348
  }
25038
25349
  ),
@@ -25058,7 +25369,7 @@ var init_FilterGroup = __esm({
25058
25369
  `${filter.field}_from`,
25059
25370
  e.target.value || null
25060
25371
  ),
25061
- placeholder: "From",
25372
+ placeholder: t("filterGroup.from"),
25062
25373
  clearable: true,
25063
25374
  onClear: () => handleFilterSelect(`${filter.field}_from`, null),
25064
25375
  className: "min-w-[130px]"
@@ -25074,7 +25385,7 @@ var init_FilterGroup = __esm({
25074
25385
  `${filter.field}_to`,
25075
25386
  e.target.value || null
25076
25387
  ),
25077
- placeholder: "To",
25388
+ placeholder: t("filterGroup.to"),
25078
25389
  clearable: true,
25079
25390
  onClear: () => handleFilterSelect(`${filter.field}_to`, null),
25080
25391
  className: "min-w-[130px]"
@@ -25096,7 +25407,7 @@ var init_FilterGroup = __esm({
25096
25407
  value: selectedValues[filter.field] || "all",
25097
25408
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
25098
25409
  options: [
25099
- { value: "all", label: "All" },
25410
+ { value: "all", label: t("filterGroup.all") },
25100
25411
  ...filter.options?.map((opt) => ({
25101
25412
  value: opt,
25102
25413
  label: opt
@@ -25107,10 +25418,7 @@ var init_FilterGroup = __esm({
25107
25418
  )
25108
25419
  ] }, filter.field)),
25109
25420
  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
- ] }),
25421
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "md", children: t("filterGroup.activeCount", { count: activeFilterCount }) }),
25114
25422
  /* @__PURE__ */ jsxRuntime.jsx(
25115
25423
  Button,
25116
25424
  {
@@ -25118,7 +25426,7 @@ var init_FilterGroup = __esm({
25118
25426
  size: "sm",
25119
25427
  onClick: handleClearAll,
25120
25428
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
25121
- children: "Clear all"
25429
+ children: t("filterGroup.clearAll")
25122
25430
  }
25123
25431
  )
25124
25432
  ] })
@@ -25347,7 +25655,7 @@ var init_RelationSelect = __esm({
25347
25655
  value,
25348
25656
  onChange,
25349
25657
  options = [],
25350
- placeholder = "Select...",
25658
+ placeholder,
25351
25659
  required = false,
25352
25660
  disabled = false,
25353
25661
  isLoading = false,
@@ -25359,6 +25667,7 @@ var init_RelationSelect = __esm({
25359
25667
  emptyMessage
25360
25668
  }) => {
25361
25669
  const { t } = useTranslate();
25670
+ const resolvedPlaceholder = placeholder ?? t("relationSelect.selectPlaceholder");
25362
25671
  const resolvedSearchPlaceholder = searchPlaceholder ?? t("common.search");
25363
25672
  const resolvedEmptyMessage = emptyMessage ?? t("empty.noOptionsFound");
25364
25673
  const [isOpen, setIsOpen] = React85.useState(false);
@@ -25468,7 +25777,7 @@ var init_RelationSelect = __esm({
25468
25777
  children: isLoading ? /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
25469
25778
  /* @__PURE__ */ jsxRuntime.jsx(Spinner, { size: "sm" }),
25470
25779
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", children: t("common.loading") })
25471
- ] }) : selectedOption ? selectedOption.label : placeholder
25780
+ ] }) : selectedOption ? selectedOption.label : resolvedPlaceholder
25472
25781
  }
25473
25782
  ),
25474
25783
  /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
@@ -26062,19 +26371,20 @@ var init_RepeatableFormSection = __esm({
26062
26371
  RepeatableFormSection.displayName = "RepeatableFormSection";
26063
26372
  }
26064
26373
  });
26065
- var actionTypeLabels, actionTypeIcons, ViolationAlert;
26374
+ var actionTypeLabelKeys, actionTypeIcons, ViolationAlert;
26066
26375
  var init_ViolationAlert = __esm({
26067
26376
  "components/core/molecules/ViolationAlert.tsx"() {
26068
26377
  init_cn();
26378
+ init_useTranslate();
26069
26379
  init_Box();
26070
26380
  init_Stack();
26071
26381
  init_Typography();
26072
26382
  init_Button();
26073
26383
  init_Icon();
26074
- actionTypeLabels = {
26075
- measure: "Corrective Measure",
26076
- admin: "Administrative Action",
26077
- penalty: "Penalty Proceedings"
26384
+ actionTypeLabelKeys = {
26385
+ measure: "violationAlert.actionType.measure",
26386
+ admin: "violationAlert.actionType.admin",
26387
+ penalty: "violationAlert.actionType.penalty"
26078
26388
  };
26079
26389
  actionTypeIcons = {
26080
26390
  measure: "alert-triangle",
@@ -26091,10 +26401,11 @@ var init_ViolationAlert = __esm({
26091
26401
  className,
26092
26402
  ...flatProps
26093
26403
  }) => {
26404
+ const { t } = useTranslate();
26094
26405
  const resolvedViolation = violation ?? {
26095
26406
  law: "",
26096
26407
  article: "",
26097
- message: flatProps.message ?? "Violation",
26408
+ message: flatProps.message ?? t("violationAlert.fallbackMessage"),
26098
26409
  actionType: "measure"
26099
26410
  };
26100
26411
  const effectiveSeverity = severity ?? (resolvedViolation.actionType === "measure" ? "warning" : "error");
@@ -26179,7 +26490,7 @@ var init_ViolationAlert = __esm({
26179
26490
  {
26180
26491
  variant: "caption",
26181
26492
  className: cn(textColor, "opacity-75"),
26182
- children: actionTypeLabels[resolvedViolation.actionType]
26493
+ children: t(actionTypeLabelKeys[resolvedViolation.actionType])
26183
26494
  }
26184
26495
  )
26185
26496
  ] })
@@ -26210,7 +26521,7 @@ var init_ViolationAlert = __esm({
26210
26521
  {
26211
26522
  variant: "caption",
26212
26523
  className: cn(textColor, "opacity-75"),
26213
- children: "Admin:"
26524
+ children: t("violationAlert.adminLabel")
26214
26525
  }
26215
26526
  ),
26216
26527
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -26229,7 +26540,7 @@ var init_ViolationAlert = __esm({
26229
26540
  {
26230
26541
  variant: "caption",
26231
26542
  className: cn(textColor, "opacity-75"),
26232
- children: "Penalty:"
26543
+ children: t("violationAlert.penaltyLabel")
26233
26544
  }
26234
26545
  ),
26235
26546
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -26254,7 +26565,7 @@ var init_ViolationAlert = __esm({
26254
26565
  className: cn(textColor, "self-start"),
26255
26566
  children: [
26256
26567
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "arrow-right", size: "sm", className: "mr-1" }),
26257
- "Go to field"
26568
+ t("violationAlert.goToField")
26258
26569
  ]
26259
26570
  }
26260
26571
  )
@@ -26570,6 +26881,7 @@ var init_LineChart = __esm({
26570
26881
  "use client";
26571
26882
  init_cn();
26572
26883
  init_atoms2();
26884
+ init_useTranslate();
26573
26885
  LineChart2 = ({
26574
26886
  data,
26575
26887
  width = 400,
@@ -26581,6 +26893,7 @@ var init_LineChart = __esm({
26581
26893
  areaColor = "var(--color-primary)",
26582
26894
  className
26583
26895
  }) => {
26896
+ const { t } = useTranslate();
26584
26897
  const gradientId = React85.useId();
26585
26898
  const safeData = data ?? [];
26586
26899
  const sortedData = React85.useMemo(() => {
@@ -26617,7 +26930,7 @@ var init_LineChart = __esm({
26617
26930
  return `${linePath} L ${last.x} ${bottom} L ${first.x} ${bottom} Z`;
26618
26931
  }, [linePath, points, height, showArea]);
26619
26932
  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" });
26933
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex items-center justify-center text-muted-foreground", className), style: { width, height }, children: t("empty.noData") });
26621
26934
  }
26622
26935
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn(className), children: /* @__PURE__ */ jsxRuntime.jsxs(
26623
26936
  "svg",
@@ -28524,6 +28837,7 @@ var init_GraphView = __esm({
28524
28837
  "use client";
28525
28838
  init_cn();
28526
28839
  init_atoms2();
28840
+ init_useTranslate();
28527
28841
  GROUP_COLORS = [
28528
28842
  "#3b82f6",
28529
28843
  // blue-500
@@ -28556,6 +28870,7 @@ var init_GraphView = __esm({
28556
28870
  showLabels = true,
28557
28871
  zoomToFit = true
28558
28872
  }) => {
28873
+ const { t } = useTranslate();
28559
28874
  const containerRef = React85.useRef(null);
28560
28875
  const animRef = React85.useRef(0);
28561
28876
  const [simNodes, setSimNodes] = React85.useState([]);
@@ -28733,7 +29048,7 @@ var init_GraphView = __esm({
28733
29048
  [onNodeClick]
28734
29049
  );
28735
29050
  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" }) });
29051
+ 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
29052
  }
28738
29053
  return /* @__PURE__ */ jsxRuntime.jsx(
28739
29054
  Box,
@@ -29189,11 +29504,12 @@ var init_UploadDropZone = __esm({
29189
29504
  init_Icon();
29190
29505
  init_Typography();
29191
29506
  init_useEventBus();
29507
+ init_useTranslate();
29192
29508
  UploadDropZone = ({
29193
29509
  accept,
29194
29510
  maxSize,
29195
29511
  maxFiles = 1,
29196
- label = "Drop files here or click to browse",
29512
+ label,
29197
29513
  description,
29198
29514
  disabled = false,
29199
29515
  action,
@@ -29201,22 +29517,24 @@ var init_UploadDropZone = __esm({
29201
29517
  onFiles,
29202
29518
  className
29203
29519
  }) => {
29520
+ const { t } = useTranslate();
29521
+ const resolvedLabel = label ?? t("upload.dropOrBrowse");
29204
29522
  const [isDragOver, setIsDragOver] = React85.useState(false);
29205
29523
  const [error, setError] = React85.useState(null);
29206
29524
  const inputRef = React85.useRef(null);
29207
29525
  const eventBus = useSafeEventBus7();
29208
29526
  const defaultDescription = [
29209
- accept ? `Accepted: ${accept}` : null,
29210
- maxSize ? `Max size: ${formatFileSize(maxSize)}` : null,
29211
- maxFiles > 1 ? `Up to ${maxFiles} files` : null
29527
+ accept ? t("upload.accepted", { accept }) : null,
29528
+ maxSize ? t("upload.maxSize", { size: formatFileSize(maxSize) }) : null,
29529
+ maxFiles > 1 ? t("upload.maxFiles", { count: maxFiles }) : null
29212
29530
  ].filter(Boolean).join(". ");
29213
29531
  const validateFiles = React85.useCallback(
29214
29532
  (files) => {
29215
29533
  if (files.length > maxFiles) {
29216
- return { valid: [], error: `Maximum ${maxFiles} file${maxFiles > 1 ? "s" : ""} allowed` };
29534
+ return { valid: [], error: t("upload.error.maxFiles", { count: maxFiles }) };
29217
29535
  }
29218
29536
  if (accept) {
29219
- const acceptedTypes = accept.split(",").map((t) => t.trim());
29537
+ const acceptedTypes = accept.split(",").map((s) => s.trim());
29220
29538
  const invalid = files.filter((file) => {
29221
29539
  return !acceptedTypes.some((type) => {
29222
29540
  if (type.endsWith("/*")) {
@@ -29226,7 +29544,7 @@ var init_UploadDropZone = __esm({
29226
29544
  });
29227
29545
  });
29228
29546
  if (invalid.length > 0) {
29229
- return { valid: [], error: `Invalid file type: ${invalid[0].name}` };
29547
+ return { valid: [], error: t("upload.error.invalidType", { name: invalid[0].name }) };
29230
29548
  }
29231
29549
  }
29232
29550
  if (maxSize) {
@@ -29234,13 +29552,13 @@ var init_UploadDropZone = __esm({
29234
29552
  if (tooLarge.length > 0) {
29235
29553
  return {
29236
29554
  valid: [],
29237
- error: `File too large: ${tooLarge[0].name} (max ${formatFileSize(maxSize)})`
29555
+ error: t("upload.error.tooLarge", { name: tooLarge[0].name, size: formatFileSize(maxSize) })
29238
29556
  };
29239
29557
  }
29240
29558
  }
29241
29559
  return { valid: files, error: null };
29242
29560
  },
29243
- [accept, maxSize, maxFiles]
29561
+ [accept, maxSize, maxFiles, t]
29244
29562
  );
29245
29563
  const handleFiles = React85.useCallback(
29246
29564
  (files) => {
@@ -29311,7 +29629,7 @@ var init_UploadDropZone = __esm({
29311
29629
  handleClick();
29312
29630
  }
29313
29631
  },
29314
- "aria-label": label,
29632
+ "aria-label": resolvedLabel,
29315
29633
  children: [
29316
29634
  /* @__PURE__ */ jsxRuntime.jsx(
29317
29635
  "input",
@@ -29327,7 +29645,7 @@ var init_UploadDropZone = __esm({
29327
29645
  }
29328
29646
  ),
29329
29647
  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 }),
29648
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body1", className: "text-center font-medium mb-1", children: isDragOver ? t("upload.dropFilesHere") : resolvedLabel }),
29331
29649
  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
29650
  ]
29333
29651
  }
@@ -29749,7 +30067,7 @@ function TableView({
29749
30067
  {
29750
30068
  checked: selected.has(id),
29751
30069
  onChange: () => toggleRow(id),
29752
- "aria-label": `Select row ${id}`
30070
+ "aria-label": t("table.selectRow", { id })
29753
30071
  }
29754
30072
  ) }),
29755
30073
  hasRenderProp ? /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex-1 min-w-0", children: children(row, index) }) : colDefs.map((col) => {
@@ -32596,7 +32914,7 @@ var init_QrScanner = __esm({
32596
32914
  className: "inset-0 flex-col items-center justify-center gap-2 bg-black bg-opacity-80 text-center",
32597
32915
  children: [
32598
32916
  /* @__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" }),
32917
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body2", className: "text-white", children: t("qrScanner.cameraUnavailable") }),
32600
32918
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", className: "text-white opacity-70", children: cameraError.message })
32601
32919
  ]
32602
32920
  }
@@ -32607,7 +32925,7 @@ var init_QrScanner = __esm({
32607
32925
  position: "absolute",
32608
32926
  display: "flex",
32609
32927
  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" })
32928
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body2", className: "text-white", children: t("qrScanner.paused") })
32611
32929
  }
32612
32930
  ),
32613
32931
  showCameraControls && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -32626,7 +32944,7 @@ var init_QrScanner = __esm({
32626
32944
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
32627
32945
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
32628
32946
  ),
32629
- "aria-label": isPaused ? "Resume scanning" : "Pause scanning",
32947
+ "aria-label": isPaused ? t("qrScanner.resumeScanning") : t("qrScanner.pauseScanning"),
32630
32948
  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
32949
  }
32632
32950
  ),
@@ -32639,7 +32957,7 @@ var init_QrScanner = __esm({
32639
32957
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
32640
32958
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
32641
32959
  ),
32642
- "aria-label": `Switch to ${currentFacing === "environment" ? "front" : "rear"} camera`,
32960
+ "aria-label": currentFacing === "environment" ? t("qrScanner.switchToFrontCamera") : t("qrScanner.switchToRearCamera"),
32643
32961
  children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "refresh-cw", className: "h-4 w-4" })
32644
32962
  }
32645
32963
  ),
@@ -32653,7 +32971,7 @@ var init_QrScanner = __esm({
32653
32971
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
32654
32972
  ),
32655
32973
  "aria-label": t("aria.mockScanDev"),
32656
- children: "Mock Scan"
32974
+ children: t("qrScanner.mockScan")
32657
32975
  }
32658
32976
  )
32659
32977
  ]
@@ -32671,6 +32989,7 @@ var init_OptionConstraintGroup = __esm({
32671
32989
  "components/core/molecules/OptionConstraintGroup.tsx"() {
32672
32990
  init_cn();
32673
32991
  init_useEventBus();
32992
+ init_useTranslate();
32674
32993
  init_Typography();
32675
32994
  init_Box();
32676
32995
  init_Label();
@@ -32680,36 +32999,36 @@ var init_OptionConstraintGroup = __esm({
32680
32999
  const sign = delta >= 0 ? "+" : "-";
32681
33000
  return `${sign}$${Math.abs(delta).toFixed(2)}`;
32682
33001
  };
32683
- constraintHint = (constraint) => {
33002
+ constraintHint = (constraint, t) => {
32684
33003
  if (constraint.type === "single") {
32685
- return constraint.required ? "Required, pick 1" : "Optional, pick up to 1";
33004
+ return constraint.required ? t("optionConstraint.requiredOne") : t("optionConstraint.optionalOne");
32686
33005
  }
32687
33006
  const { min, max } = constraint;
32688
33007
  if (min && max) {
32689
- return min === max ? `Pick exactly ${min}` : `Pick ${min}-${max}`;
33008
+ return min === max ? t("optionConstraint.pickExactly", { count: min }) : t("optionConstraint.pickRange", { min, max });
32690
33009
  }
32691
- if (min) return `Pick at least ${min}`;
32692
- if (max) return `Pick up to ${max}`;
32693
- return "Optional";
33010
+ if (min) return t("optionConstraint.pickAtLeast", { count: min });
33011
+ if (max) return t("optionConstraint.pickUpTo", { count: max });
33012
+ return t("optionConstraint.optional");
32694
33013
  };
32695
- validateSelection = (selected, constraint) => {
33014
+ validateSelection = (selected, constraint, t) => {
32696
33015
  if (constraint.type === "single") {
32697
33016
  if (constraint.required && selected.length === 0) {
32698
- return "Pick 1 option";
33017
+ return t("optionConstraint.error.pickOne");
32699
33018
  }
32700
33019
  if (selected.length > 1) {
32701
- return "Pick only 1 option";
33020
+ return t("optionConstraint.error.pickOnlyOne");
32702
33021
  }
32703
33022
  return void 0;
32704
33023
  }
32705
33024
  const { min, max } = constraint;
32706
33025
  if (min !== void 0 && selected.length < min) {
32707
33026
  const remaining = min - selected.length;
32708
- return `Pick at least ${remaining} more`;
33027
+ return t("optionConstraint.error.pickMore", { count: remaining });
32709
33028
  }
32710
33029
  if (max !== void 0 && selected.length > max) {
32711
33030
  const excess = selected.length - max;
32712
- return `Remove ${excess} option${excess === 1 ? "" : "s"}`;
33031
+ return t("optionConstraint.error.removeOptions", { count: excess });
32713
33032
  }
32714
33033
  return void 0;
32715
33034
  };
@@ -32726,8 +33045,9 @@ var init_OptionConstraintGroup = __esm({
32726
33045
  className
32727
33046
  }) => {
32728
33047
  const eventBus = useEventBus();
32729
- const hint = constraintHint(constraint);
32730
- const error = validateSelection(selected, constraint);
33048
+ const { t } = useTranslate();
33049
+ const hint = constraintHint(constraint, t);
33050
+ const error = validateSelection(selected, constraint, t);
32731
33051
  const inputName = `option-${groupId}`;
32732
33052
  const labelTextSize = size === "sm" ? "text-sm" : "text-base";
32733
33053
  const optionGap = size === "sm" ? "gap-2" : "gap-2.5";
@@ -32827,7 +33147,7 @@ var init_OptionConstraintGroup = __esm({
32827
33147
  variant: "caption",
32828
33148
  color: "warning",
32829
33149
  className: "rounded border border-warning/40 px-1.5 py-0.5",
32830
- children: "Out of stock"
33150
+ children: t("optionConstraint.outOfStock")
32831
33151
  }
32832
33152
  )
32833
33153
  ]
@@ -33149,6 +33469,7 @@ function changeBlockType(block, type) {
33149
33469
  return { id: block.id, type, content: seed };
33150
33470
  }
33151
33471
  function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33472
+ const { t } = useTranslate();
33152
33473
  const [open, setOpen] = React85.useState(false);
33153
33474
  const ref = React85.useRef(null);
33154
33475
  React85.useEffect(() => {
@@ -33168,7 +33489,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33168
33489
  {
33169
33490
  type: "button",
33170
33491
  variant: "ghost",
33171
- "aria-label": "Block actions",
33492
+ "aria-label": t("richBlockEditor.blockActions"),
33172
33493
  className: cn(
33173
33494
  "inline-flex items-center justify-center",
33174
33495
  "h-6 w-6 rounded-sm p-0 gap-0",
@@ -33190,7 +33511,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33190
33511
  "py-1 text-sm"
33191
33512
  ),
33192
33513
  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] }),
33514
+ /* @__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
33515
  /* @__PURE__ */ jsxRuntime.jsxs(
33195
33516
  Button,
33196
33517
  {
@@ -33204,7 +33525,8 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33204
33525
  },
33205
33526
  children: [
33206
33527
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", className: "w-3.5 h-3.5" }),
33207
- " Duplicate"
33528
+ " ",
33529
+ t("richBlockEditor.duplicate")
33208
33530
  ]
33209
33531
  }
33210
33532
  ),
@@ -33221,14 +33543,15 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33221
33543
  },
33222
33544
  children: [
33223
33545
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "trash", className: "w-3.5 h-3.5" }),
33224
- " Delete"
33546
+ " ",
33547
+ t("common.delete")
33225
33548
  ]
33226
33549
  }
33227
33550
  ),
33228
33551
  CHANGEABLE_TYPES.includes(block.type) && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
33229
33552
  /* @__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(
33553
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: t("richBlockEditor.turnInto") }),
33554
+ CHANGEABLE_TYPES.filter((bt) => bt !== block.type).map((bt) => /* @__PURE__ */ jsxRuntime.jsx(
33232
33555
  Button,
33233
33556
  {
33234
33557
  type: "button",
@@ -33236,12 +33559,12 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33236
33559
  role: "menuitem",
33237
33560
  className: "flex w-full items-center gap-2 px-2 py-1.5 text-left justify-start rounded-none",
33238
33561
  onClick: () => {
33239
- onChangeType(t);
33562
+ onChangeType(bt);
33240
33563
  setOpen(false);
33241
33564
  },
33242
- children: BLOCK_TYPE_LABEL[t]
33565
+ children: t(BLOCK_TYPE_LABEL_KEY[bt])
33243
33566
  },
33244
- t
33567
+ bt
33245
33568
  ))
33246
33569
  ] })
33247
33570
  ]
@@ -33303,6 +33626,7 @@ function BlockRow({
33303
33626
  onInsertAfter,
33304
33627
  onChangeType
33305
33628
  }) {
33629
+ const { t } = useTranslate();
33306
33630
  const setContent = React85.useCallback(
33307
33631
  (next) => onUpdate((b) => ({ ...b, content: next })),
33308
33632
  [onUpdate]
@@ -33352,8 +33676,8 @@ function BlockRow({
33352
33676
  tag: "h1",
33353
33677
  value: block.content ?? "",
33354
33678
  readOnly,
33355
- placeholder: placeholder ?? "Heading 1",
33356
- ariaLabel: "Heading 1 block",
33679
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading1"),
33680
+ ariaLabel: t("richBlockEditor.aria.heading1Block"),
33357
33681
  className: "text-3xl font-bold leading-tight",
33358
33682
  onValueChange: setContent
33359
33683
  }
@@ -33365,8 +33689,8 @@ function BlockRow({
33365
33689
  tag: "h2",
33366
33690
  value: block.content ?? "",
33367
33691
  readOnly,
33368
- placeholder: placeholder ?? "Heading 2",
33369
- ariaLabel: "Heading 2 block",
33692
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading2"),
33693
+ ariaLabel: t("richBlockEditor.aria.heading2Block"),
33370
33694
  className: "text-2xl font-semibold leading-tight",
33371
33695
  onValueChange: setContent
33372
33696
  }
@@ -33378,8 +33702,8 @@ function BlockRow({
33378
33702
  tag: "h3",
33379
33703
  value: block.content ?? "",
33380
33704
  readOnly,
33381
- placeholder: placeholder ?? "Heading 3",
33382
- ariaLabel: "Heading 3 block",
33705
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading3"),
33706
+ ariaLabel: t("richBlockEditor.aria.heading3Block"),
33383
33707
  className: "text-xl font-semibold leading-tight",
33384
33708
  onValueChange: setContent
33385
33709
  }
@@ -33391,8 +33715,8 @@ function BlockRow({
33391
33715
  tag: "blockquote",
33392
33716
  value: block.content ?? "",
33393
33717
  readOnly,
33394
- placeholder: placeholder ?? "Quote",
33395
- ariaLabel: "Quote block",
33718
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.quote"),
33719
+ ariaLabel: t("richBlockEditor.aria.quoteBlock"),
33396
33720
  className: "border-l-4 border-primary/60 pl-4 italic text-muted-foreground",
33397
33721
  onValueChange: setContent
33398
33722
  }
@@ -33400,13 +33724,13 @@ function BlockRow({
33400
33724
  case "code":
33401
33725
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "rounded-md border border-border bg-muted/40", children: [
33402
33726
  /* @__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" }),
33727
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", variant: "caption", className: "uppercase tracking-wide", children: t("richBlockEditor.blockType.code") }),
33404
33728
  !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
33405
33729
  Input,
33406
33730
  {
33407
33731
  inputType: "text",
33408
33732
  value: String(block.metadata?.language ?? "plaintext"),
33409
- "aria-label": "Code language",
33733
+ "aria-label": t("richBlockEditor.aria.codeLanguage"),
33410
33734
  className: cn(
33411
33735
  "h-6 w-32 rounded-sm border border-border bg-background",
33412
33736
  "px-2 text-xs outline-none focus:ring-1 focus:ring-ring"
@@ -33422,8 +33746,8 @@ function BlockRow({
33422
33746
  tag: "pre",
33423
33747
  value: block.content ?? "",
33424
33748
  readOnly,
33425
- placeholder: placeholder ?? "Enter code",
33426
- ariaLabel: "Code block",
33749
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.code"),
33750
+ ariaLabel: t("richBlockEditor.aria.codeBlock"),
33427
33751
  className: "block whitespace-pre-wrap p-3 font-mono text-sm leading-relaxed",
33428
33752
  onValueChange: setContent
33429
33753
  }
@@ -33436,7 +33760,7 @@ function BlockRow({
33436
33760
  const caption = String(block.metadata?.caption ?? "");
33437
33761
  const imgProps = {
33438
33762
  src: url,
33439
- alt: caption || "Embedded image",
33763
+ alt: caption || t("richBlockEditor.embeddedImage"),
33440
33764
  className: "max-h-96 w-full rounded-md border border-border object-contain"
33441
33765
  };
33442
33766
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "space-y-2", children: [
@@ -33450,7 +33774,8 @@ function BlockRow({
33450
33774
  ),
33451
33775
  children: [
33452
33776
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "image", className: "mr-2 w-4 h-4" }),
33453
- " No image URL set"
33777
+ " ",
33778
+ t("richBlockEditor.noImageUrl")
33454
33779
  ]
33455
33780
  }
33456
33781
  ),
@@ -33461,7 +33786,7 @@ function BlockRow({
33461
33786
  inputType: "url",
33462
33787
  value: url,
33463
33788
  placeholder: "https://example.com/image.png",
33464
- "aria-label": "Image URL",
33789
+ "aria-label": t("richBlockEditor.aria.imageUrl"),
33465
33790
  className: cn(
33466
33791
  "h-8 flex-1 rounded-sm border border-border bg-background",
33467
33792
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -33474,8 +33799,8 @@ function BlockRow({
33474
33799
  {
33475
33800
  inputType: "text",
33476
33801
  value: caption,
33477
- placeholder: "Caption (optional)",
33478
- "aria-label": "Image caption",
33802
+ placeholder: t("richBlockEditor.placeholder.caption"),
33803
+ "aria-label": t("richBlockEditor.aria.imageCaption"),
33479
33804
  className: cn(
33480
33805
  "h-8 flex-1 rounded-sm border border-border bg-background",
33481
33806
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -33506,8 +33831,8 @@ function BlockRow({
33506
33831
  tag: "span",
33507
33832
  value: child.content ?? "",
33508
33833
  readOnly,
33509
- placeholder: "List item",
33510
- ariaLabel: "List item",
33834
+ placeholder: t("richBlockEditor.placeholder.listItem"),
33835
+ ariaLabel: t("richBlockEditor.aria.listItem"),
33511
33836
  className: "inline-block min-w-[1ch] flex-1",
33512
33837
  onValueChange: (next) => setChildContent(child.id, next)
33513
33838
  }
@@ -33517,7 +33842,7 @@ function BlockRow({
33517
33842
  {
33518
33843
  type: "button",
33519
33844
  variant: "ghost",
33520
- "aria-label": "Remove list item",
33845
+ "aria-label": t("richBlockEditor.aria.removeListItem"),
33521
33846
  className: cn(
33522
33847
  "h-5 w-5 shrink-0 rounded-sm text-muted-foreground p-0 gap-0",
33523
33848
  "opacity-0 group-hover/item:opacity-100 hover:bg-muted hover:text-foreground"
@@ -33539,7 +33864,8 @@ function BlockRow({
33539
33864
  onClick: addListItem,
33540
33865
  children: [
33541
33866
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", className: "w-3 h-3" }),
33542
- " Add item"
33867
+ " ",
33868
+ t("richBlockEditor.addItem")
33543
33869
  ]
33544
33870
  }
33545
33871
  ) })
@@ -33555,8 +33881,8 @@ function BlockRow({
33555
33881
  tag: "p",
33556
33882
  value: block.content ?? "",
33557
33883
  readOnly,
33558
- placeholder: placeholder ?? "Start writing...",
33559
- ariaLabel: "Paragraph block",
33884
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.paragraph"),
33885
+ ariaLabel: t("richBlockEditor.aria.paragraphBlock"),
33560
33886
  className: "leading-7",
33561
33887
  onValueChange: setContent
33562
33888
  }
@@ -33579,7 +33905,7 @@ function BlockRow({
33579
33905
  {
33580
33906
  type: "button",
33581
33907
  variant: "ghost",
33582
- "aria-label": "Insert paragraph below",
33908
+ "aria-label": t("richBlockEditor.insertParagraphBelow"),
33583
33909
  className: cn(
33584
33910
  "inline-flex h-6 w-6 items-center justify-center rounded-sm p-0 gap-0",
33585
33911
  "text-muted-foreground hover:bg-muted hover:text-foreground",
@@ -33606,7 +33932,7 @@ function BlockRow({
33606
33932
  }
33607
33933
  );
33608
33934
  }
33609
- var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES, RichBlockEditor;
33935
+ var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL_KEY, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES, RichBlockEditor;
33610
33936
  var init_RichBlockEditor = __esm({
33611
33937
  "components/core/molecules/RichBlockEditor.tsx"() {
33612
33938
  "use client";
@@ -33619,29 +33945,30 @@ var init_RichBlockEditor = __esm({
33619
33945
  init_Input();
33620
33946
  init_Icon();
33621
33947
  init_useEventBus();
33948
+ init_useTranslate();
33622
33949
  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 }
33950
+ { type: "paragraph", labelKey: "richBlockEditor.toolbar.text", icon: LucideIcons2.Type },
33951
+ { type: "heading-1", labelKey: "richBlockEditor.toolbar.h1", icon: LucideIcons2.Heading1 },
33952
+ { type: "heading-2", labelKey: "richBlockEditor.toolbar.h2", icon: LucideIcons2.Heading2 },
33953
+ { type: "heading-3", labelKey: "richBlockEditor.toolbar.h3", icon: LucideIcons2.Heading3 },
33954
+ { type: "bullet-list", labelKey: "richBlockEditor.toolbar.bulletList", icon: LucideIcons2.List },
33955
+ { type: "numbered-list", labelKey: "richBlockEditor.toolbar.numbered", icon: LucideIcons2.ListOrdered },
33956
+ { type: "quote", labelKey: "richBlockEditor.toolbar.quote", icon: LucideIcons2.Quote },
33957
+ { type: "code", labelKey: "richBlockEditor.toolbar.code", icon: LucideIcons2.Code },
33958
+ { type: "divider", labelKey: "richBlockEditor.toolbar.divider", icon: LucideIcons2.Minus },
33959
+ { type: "image", labelKey: "richBlockEditor.toolbar.image", icon: LucideIcons2.Image }
33633
33960
  ];
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"
33961
+ BLOCK_TYPE_LABEL_KEY = {
33962
+ paragraph: "richBlockEditor.blockType.paragraph",
33963
+ "heading-1": "richBlockEditor.blockType.heading1",
33964
+ "heading-2": "richBlockEditor.blockType.heading2",
33965
+ "heading-3": "richBlockEditor.blockType.heading3",
33966
+ "bullet-list": "richBlockEditor.blockType.bulletList",
33967
+ "numbered-list": "richBlockEditor.blockType.numberedList",
33968
+ quote: "richBlockEditor.blockType.quote",
33969
+ code: "richBlockEditor.blockType.code",
33970
+ divider: "richBlockEditor.blockType.divider",
33971
+ image: "richBlockEditor.blockType.image"
33645
33972
  };
33646
33973
  CHANGEABLE_TYPES = [
33647
33974
  "paragraph",
@@ -33675,6 +34002,7 @@ var init_RichBlockEditor = __esm({
33675
34002
  showToolbar = true,
33676
34003
  className
33677
34004
  }) => {
34005
+ const { t } = useTranslate();
33678
34006
  const [blocks, setBlocks] = React85.useState(
33679
34007
  () => normalizeBlocks(initialBlocks)
33680
34008
  );
@@ -33746,25 +34074,26 @@ var init_RichBlockEditor = __esm({
33746
34074
  Box,
33747
34075
  {
33748
34076
  role: "toolbar",
33749
- "aria-label": "Block editor toolbar",
34077
+ "aria-label": t("richBlockEditor.editorToolbar"),
33750
34078
  className: cn(
33751
34079
  "flex flex-wrap items-center gap-1",
33752
34080
  "border-b border-border bg-muted/30 px-2 py-2"
33753
34081
  ),
33754
34082
  children: TOOLBAR_ENTRIES.map((entry) => {
33755
34083
  const Icon3 = entry.icon;
34084
+ const entryLabel = t(entry.labelKey);
33756
34085
  return /* @__PURE__ */ jsxRuntime.jsxs(
33757
34086
  Button,
33758
34087
  {
33759
34088
  type: "button",
33760
34089
  variant: "ghost",
33761
34090
  size: "sm",
33762
- "aria-label": `Insert ${entry.label}`,
33763
- title: entry.label,
34091
+ "aria-label": t("richBlockEditor.insertEntry", { label: entryLabel }),
34092
+ title: entryLabel,
33764
34093
  onClick: () => handleAppend(entry.type),
33765
34094
  children: [
33766
34095
  /* @__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 })
34096
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", variant: "caption", className: "ml-1 hidden text-xs sm:inline", children: entryLabel })
33768
34097
  ]
33769
34098
  },
33770
34099
  entry.type
@@ -33807,6 +34136,7 @@ var init_ReplyTree = __esm({
33807
34136
  "use client";
33808
34137
  init_cn();
33809
34138
  init_useEventBus();
34139
+ init_useTranslate();
33810
34140
  init_atoms2();
33811
34141
  init_VoteStack();
33812
34142
  ReplyTreeNode = ({
@@ -33826,6 +34156,7 @@ var init_ReplyTree = __esm({
33826
34156
  showActions
33827
34157
  }) => {
33828
34158
  const eventBus = useEventBus();
34159
+ const { t } = useTranslate();
33829
34160
  const hasReplies = !!node.replies && node.replies.length > 0;
33830
34161
  const isCollapsed = collapsedSet.has(node.id);
33831
34162
  const atMaxDepth = depth >= maxDepth;
@@ -33872,7 +34203,7 @@ var init_ReplyTree = __esm({
33872
34203
  variant: "ghost",
33873
34204
  size: "sm",
33874
34205
  onClick: handleToggle,
33875
- "aria-label": isCollapsed ? "Expand replies" : "Collapse replies",
34206
+ "aria-label": isCollapsed ? t("replyTree.expandReplies") : t("replyTree.collapseReplies"),
33876
34207
  "aria-expanded": !isCollapsed,
33877
34208
  leftIcon: isCollapsed ? "chevron-right" : "chevron-down",
33878
34209
  className: cn(
@@ -33913,7 +34244,7 @@ var init_ReplyTree = __esm({
33913
34244
  onVote: handleVote,
33914
34245
  size: "sm",
33915
34246
  variant: "horizontal",
33916
- label: `Vote on reply by ${node.authorName}`
34247
+ label: t("replyTree.voteOnReplyBy", { author: node.authorName })
33917
34248
  }
33918
34249
  ),
33919
34250
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -33923,8 +34254,8 @@ var init_ReplyTree = __esm({
33923
34254
  size: "sm",
33924
34255
  leftIcon: "message-square",
33925
34256
  onClick: handleReply,
33926
- "aria-label": `Reply to ${node.authorName}`,
33927
- children: "Reply"
34257
+ "aria-label": t("replyTree.replyTo", { author: node.authorName }),
34258
+ children: t("replyTree.reply")
33928
34259
  }
33929
34260
  ),
33930
34261
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -33934,8 +34265,8 @@ var init_ReplyTree = __esm({
33934
34265
  size: "sm",
33935
34266
  leftIcon: "flag",
33936
34267
  onClick: handleFlag,
33937
- "aria-label": `Flag reply by ${node.authorName}`,
33938
- children: "Flag"
34268
+ "aria-label": t("replyTree.flagReplyBy", { author: node.authorName }),
34269
+ children: t("replyTree.flag")
33939
34270
  }
33940
34271
  )
33941
34272
  ] }),
@@ -33946,9 +34277,9 @@ var init_ReplyTree = __esm({
33946
34277
  inputType: "textarea",
33947
34278
  rows: 2,
33948
34279
  value: draft,
33949
- placeholder: `Reply to ${node.authorName}\u2026`,
34280
+ placeholder: t("replyTree.replyToPlaceholder", { author: node.authorName }),
33950
34281
  onChange: (e) => setDraft(e.target.value),
33951
- "aria-label": `Reply to ${node.authorName}`
34282
+ "aria-label": t("replyTree.replyTo", { author: node.authorName })
33952
34283
  }
33953
34284
  ),
33954
34285
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-row gap-2 items-center", children: [
@@ -33960,10 +34291,10 @@ var init_ReplyTree = __esm({
33960
34291
  leftIcon: "send",
33961
34292
  onClick: handleSubmitReply,
33962
34293
  disabled: !draft.trim(),
33963
- children: "Send"
34294
+ children: t("replyTree.send")
33964
34295
  }
33965
34296
  ),
33966
- /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: "Cancel" })
34297
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: t("common.cancel") })
33967
34298
  ] })
33968
34299
  ] }),
33969
34300
  hasReplies && !isCollapsed && (atMaxDepth ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -33977,7 +34308,7 @@ var init_ReplyTree = __esm({
33977
34308
  "self-start gap-1 px-0 h-auto",
33978
34309
  "text-sm text-primary hover:underline hover:bg-transparent"
33979
34310
  ),
33980
- children: "Continue thread"
34311
+ children: t("replyTree.continueThread")
33981
34312
  }
33982
34313
  ) : /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex flex-col gap-2 mt-1", children: node.replies.map((child) => /* @__PURE__ */ jsxRuntime.jsx(
33983
34314
  ReplyTreeNode,
@@ -34016,6 +34347,7 @@ var init_ReplyTree = __esm({
34016
34347
  showActions = true,
34017
34348
  className
34018
34349
  }) => {
34350
+ const { t } = useTranslate();
34019
34351
  const nodeList = Array.isArray(nodes) ? nodes : nodes ? [nodes] : [];
34020
34352
  const [collapsedSet, setCollapsedSet] = React85.useState(() => {
34021
34353
  const acc = /* @__PURE__ */ new Set();
@@ -34034,7 +34366,7 @@ var init_ReplyTree = __esm({
34034
34366
  });
34035
34367
  }, []);
34036
34368
  if (nodeList.length === 0) {
34037
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("text-sm text-muted-foreground", className), children: "No replies yet." });
34369
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("text-sm text-muted-foreground", className), children: t("replyTree.noRepliesYet") });
34038
34370
  }
34039
34371
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex flex-col gap-2 min-w-0", className), children: nodeList.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
34040
34372
  ReplyTreeNode,
@@ -34112,6 +34444,7 @@ var init_VersionDiff = __esm({
34112
34444
  "use client";
34113
34445
  init_cn();
34114
34446
  init_useEventBus();
34447
+ init_useTranslate();
34115
34448
  init_atoms2();
34116
34449
  init_Stack();
34117
34450
  INLINE_STYLES = {
@@ -34134,6 +34467,7 @@ var init_VersionDiff = __esm({
34134
34467
  language,
34135
34468
  className
34136
34469
  }) => {
34470
+ const { t } = useTranslate();
34137
34471
  const eventBus = useEventBus();
34138
34472
  const revisions = Array.isArray(revisionsProp) ? revisionsProp : [];
34139
34473
  const fallbackBefore = revisions[0]?.id ?? "";
@@ -34215,24 +34549,24 @@ var init_VersionDiff = __esm({
34215
34549
  children: [
34216
34550
  /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: "flex-wrap", children: [
34217
34551
  /* @__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" }),
34552
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "whitespace-nowrap", children: t("versionDiff.compare") }),
34219
34553
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsxRuntime.jsx(
34220
34554
  Select,
34221
34555
  {
34222
34556
  options,
34223
34557
  value: activeBeforeId,
34224
34558
  onChange: handleBeforeChange,
34225
- "aria-label": "Before revision"
34559
+ "aria-label": t("versionDiff.beforeRevision")
34226
34560
  }
34227
34561
  ) }),
34228
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: "to" }),
34562
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: t("versionDiff.to") }),
34229
34563
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsxRuntime.jsx(
34230
34564
  Select,
34231
34565
  {
34232
34566
  options,
34233
34567
  value: activeAfterId,
34234
34568
  onChange: handleAfterChange,
34235
- "aria-label": "After revision"
34569
+ "aria-label": t("versionDiff.afterRevision")
34236
34570
  }
34237
34571
  ) }),
34238
34572
  language && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "default", children: language }),
@@ -34253,7 +34587,7 @@ var init_VersionDiff = __esm({
34253
34587
  size: "sm",
34254
34588
  icon: activeView === "side-by-side" ? "align-left" : "columns",
34255
34589
  onClick: handleViewToggle,
34256
- "aria-label": activeView === "side-by-side" ? "Switch to inline view" : "Switch to side-by-side view"
34590
+ "aria-label": activeView === "side-by-side" ? t("versionDiff.switchToInline") : t("versionDiff.switchToSideBySide")
34257
34591
  }
34258
34592
  ),
34259
34593
  (onRevert || revertEvent) && /* @__PURE__ */ jsxRuntime.jsx(
@@ -34263,7 +34597,7 @@ var init_VersionDiff = __esm({
34263
34597
  size: "sm",
34264
34598
  icon: "rotate-ccw",
34265
34599
  onClick: handleRevert,
34266
- children: "Revert"
34600
+ children: t("versionDiff.revert")
34267
34601
  }
34268
34602
  )
34269
34603
  ] })
@@ -34280,12 +34614,12 @@ var init_VersionDiff = __esm({
34280
34614
  children: [
34281
34615
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
34282
34616
  beforeRev?.label,
34283
- beforeRev?.author ? ` by ${beforeRev.author}` : "",
34617
+ beforeRev?.author ? t("versionDiff.byAuthor", { author: beforeRev.author }) : "",
34284
34618
  beforeRev?.timestamp ? ` (${beforeRev.timestamp})` : ""
34285
34619
  ] }),
34286
34620
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
34287
34621
  afterRev?.label,
34288
- afterRev?.author ? ` by ${afterRev.author}` : "",
34622
+ afterRev?.author ? t("versionDiff.byAuthor", { author: afterRev.author }) : "",
34289
34623
  afterRev?.timestamp ? ` (${afterRev.timestamp})` : ""
34290
34624
  ] })
34291
34625
  ]
@@ -34678,10 +35012,12 @@ var init_DocPagination = __esm({
34678
35012
  }
34679
35013
  });
34680
35014
  function DocSearch({
34681
- placeholder = "Search documentation...",
35015
+ placeholder,
34682
35016
  onSearch,
34683
35017
  className
34684
35018
  }) {
35019
+ const { t } = useTranslate();
35020
+ const resolvedPlaceholder = placeholder ?? t("docSearch.placeholder");
34685
35021
  const [query, setQuery] = React85.useState("");
34686
35022
  const [results, setResults] = React85.useState([]);
34687
35023
  const [isOpen, setIsOpen] = React85.useState(false);
@@ -34788,7 +35124,7 @@ function DocSearch({
34788
35124
  Input,
34789
35125
  {
34790
35126
  inputType: "search",
34791
- placeholder,
35127
+ placeholder: resolvedPlaceholder,
34792
35128
  value: query,
34793
35129
  onChange: handleChange,
34794
35130
  onFocus: handleFocus,
@@ -34853,6 +35189,7 @@ var init_DocSearch = __esm({
34853
35189
  init_Typography();
34854
35190
  init_Icon();
34855
35191
  init_Input();
35192
+ init_useTranslate();
34856
35193
  }
34857
35194
  });
34858
35195
  var DocSidebarCategory, DocSidebar;
@@ -36857,8 +37194,8 @@ var init_SignaturePad = __esm({
36857
37194
  init_useEventBus();
36858
37195
  init_useTranslate();
36859
37196
  SignaturePad = ({
36860
- label = "Signature",
36861
- helperText = "Draw your signature above",
37197
+ label,
37198
+ helperText,
36862
37199
  strokeColor,
36863
37200
  strokeWidth = 2,
36864
37201
  height = 200,
@@ -36874,6 +37211,8 @@ var init_SignaturePad = __esm({
36874
37211
  }) => {
36875
37212
  const eventBus = useEventBus();
36876
37213
  const { t } = useTranslate();
37214
+ const resolvedLabel = label ?? t("signaturePad.label");
37215
+ const resolvedHelperText = helperText ?? t("signaturePad.helperText");
36877
37216
  const canvasRef = React85.useRef(null);
36878
37217
  const [isDrawing, setIsDrawing] = React85.useState(false);
36879
37218
  const [hasSignature, setHasSignature] = React85.useState(!!value);
@@ -36976,7 +37315,7 @@ var init_SignaturePad = __esm({
36976
37315
  );
36977
37316
  }
36978
37317
  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 }),
37318
+ resolvedLabel && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "medium", children: resolvedLabel }),
36980
37319
  /* @__PURE__ */ jsxRuntime.jsx(
36981
37320
  Box,
36982
37321
  {
@@ -37005,7 +37344,7 @@ var init_SignaturePad = __esm({
37005
37344
  )
37006
37345
  }
37007
37346
  ),
37008
- helperText && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: helperText }),
37347
+ resolvedHelperText && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: resolvedHelperText }),
37009
37348
  !readOnly && /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", justify: "end", children: [
37010
37349
  /* @__PURE__ */ jsxRuntime.jsx(
37011
37350
  Button,
@@ -37015,7 +37354,7 @@ var init_SignaturePad = __esm({
37015
37354
  icon: LucideIcons2.Eraser,
37016
37355
  onClick: clearSignature,
37017
37356
  disabled: !hasSignature,
37018
- children: "Clear"
37357
+ children: t("signaturePad.clear")
37019
37358
  }
37020
37359
  ),
37021
37360
  signEvent && /* @__PURE__ */ jsxRuntime.jsx(
@@ -37026,7 +37365,7 @@ var init_SignaturePad = __esm({
37026
37365
  icon: LucideIcons2.Check,
37027
37366
  onClick: confirmSignature,
37028
37367
  disabled: !hasSignature,
37029
- children: "Confirm"
37368
+ children: t("signaturePad.confirm")
37030
37369
  }
37031
37370
  )
37032
37371
  ] })
@@ -41471,6 +41810,7 @@ function MasterDetail({
41471
41810
  className,
41472
41811
  ...rest
41473
41812
  }) {
41813
+ const { t } = useTranslate();
41474
41814
  const loading = externalLoading ?? false;
41475
41815
  const isLoading = externalIsLoading ?? false;
41476
41816
  const error = externalError ?? null;
@@ -41483,8 +41823,8 @@ function MasterDetail({
41483
41823
  isLoading: loading || isLoading,
41484
41824
  error,
41485
41825
  className,
41486
- emptyTitle: "No items found",
41487
- emptyDescription: "Create your first item to get started.",
41826
+ emptyTitle: t("table.empty.title"),
41827
+ emptyDescription: t("empty.createFirst"),
41488
41828
  ...rest
41489
41829
  }
41490
41830
  );
@@ -41493,6 +41833,7 @@ var init_MasterDetail = __esm({
41493
41833
  "components/core/organisms/MasterDetail.tsx"() {
41494
41834
  "use client";
41495
41835
  init_DataTable();
41836
+ init_useTranslate();
41496
41837
  MasterDetail.displayName = "MasterDetail";
41497
41838
  }
41498
41839
  });
@@ -41501,14 +41842,18 @@ var init_MasterDetailLayout = __esm({
41501
41842
  "components/core/organisms/layout/MasterDetailLayout.tsx"() {
41502
41843
  init_cn();
41503
41844
  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
- ) });
41845
+ init_useTranslate();
41846
+ DefaultEmptyDetail = () => {
41847
+ const { t } = useTranslate();
41848
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsxRuntime.jsx(
41849
+ Typography,
41850
+ {
41851
+ variant: "body2",
41852
+ className: "text-muted-foreground",
41853
+ children: t("masterDetail.selectItem")
41854
+ }
41855
+ ) });
41856
+ };
41512
41857
  MasterDetailLayout = ({
41513
41858
  master,
41514
41859
  detail,
@@ -41635,7 +41980,7 @@ var init_MediaGallery = __esm({
41635
41980
  {
41636
41981
  icon: LucideIcons2.Image,
41637
41982
  title: t("display.noMedia"),
41638
- description: "No media items to display.",
41983
+ description: t("mediaGallery.noMediaDescription"),
41639
41984
  className
41640
41985
  }
41641
41986
  );
@@ -41652,7 +41997,7 @@ var init_MediaGallery = __esm({
41652
41997
  size: "sm",
41653
41998
  icon: LucideIcons2.Upload,
41654
41999
  action: "MEDIA_UPLOAD",
41655
- children: "Upload"
42000
+ children: t("mediaGallery.upload")
41656
42001
  }
41657
42002
  ),
41658
42003
  actions?.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -41666,10 +42011,7 @@ var init_MediaGallery = __esm({
41666
42011
  ))
41667
42012
  ] })
41668
42013
  ] }),
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
- ] }) }),
42014
+ 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
42015
  /* @__PURE__ */ jsxRuntime.jsx(
41674
42016
  Box,
41675
42017
  {
@@ -42524,7 +42866,7 @@ function TraitsTab({ traits: traits2 }) {
42524
42866
  EmptyState,
42525
42867
  {
42526
42868
  title: t("debug.noActiveTraits"),
42527
- description: "Traits will appear when components using them are mounted",
42869
+ description: t("debug.traitsMountHint"),
42528
42870
  className: "py-8"
42529
42871
  }
42530
42872
  );
@@ -42534,14 +42876,11 @@ function TraitsTab({ traits: traits2 }) {
42534
42876
  header: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 w-full", children: [
42535
42877
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", weight: "semibold", className: "text-purple-600 dark:text-purple-400", children: trait.name }),
42536
42878
  /* @__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
- ] })
42879
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: t("debug.transitionsCount", { count: trait.transitionCount }) })
42541
42880
  ] }),
42542
42881
  content: /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "sm", children: [
42543
42882
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42544
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "States" }),
42883
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.states") }),
42545
42884
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: trait.states.map((state) => /* @__PURE__ */ jsxRuntime.jsx(
42546
42885
  Badge,
42547
42886
  {
@@ -42553,7 +42892,7 @@ function TraitsTab({ traits: traits2 }) {
42553
42892
  )) })
42554
42893
  ] }),
42555
42894
  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" }),
42895
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.transitions") }),
42557
42896
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: trait.transitions.map((t2, i) => /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "font-mono", children: [
42558
42897
  t2.from,
42559
42898
  " \u2192 ",
@@ -42572,7 +42911,7 @@ function TraitsTab({ traits: traits2 }) {
42572
42911
  ] }, i)) })
42573
42912
  ] }),
42574
42913
  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" }),
42914
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.guards") }),
42576
42915
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: trait.guards.map((g, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
42577
42916
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: g.name }),
42578
42917
  /* @__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 +43017,7 @@ function EntitiesTab({ snapshot }) {
42678
43017
  EmptyState,
42679
43018
  {
42680
43019
  title: t("debug.noEntityData"),
42681
- description: "Debug mode may not be enabled",
43020
+ description: t("debug.debugModeHint"),
42682
43021
  className: "py-8"
42683
43022
  }
42684
43023
  );
@@ -42691,7 +43030,7 @@ function EntitiesTab({ snapshot }) {
42691
43030
  EmptyState,
42692
43031
  {
42693
43032
  title: t("debug.noEntities"),
42694
- description: "Entities will appear when spawned",
43033
+ description: t("debug.entitiesSpawnHint"),
42695
43034
  className: "py-8"
42696
43035
  }
42697
43036
  );
@@ -42699,7 +43038,7 @@ function EntitiesTab({ snapshot }) {
42699
43038
  const singletonItems = singletonEntries.map(([name, data]) => ({
42700
43039
  id: `singleton-${name}`,
42701
43040
  header: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
42702
- /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "sm", children: "Singleton" }),
43041
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "sm", children: t("debug.singleton") }),
42703
43042
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", weight: "semibold", className: "text-sky-600 dark:text-sky-400", children: name })
42704
43043
  ] }),
42705
43044
  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 +43056,19 @@ function EntitiesTab({ snapshot }) {
42717
43056
  }));
42718
43057
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--entities", children: [
42719
43058
  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
- ] }),
43059
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.singletonsCount", { count: singletonItems.length }) }),
42725
43060
  /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: singletonItems, multiple: true })
42726
43061
  ] }),
42727
43062
  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
- ] }),
43063
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.runtimeCount", { count: runtimeEntities.length }) }),
42733
43064
  /* @__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
- ] })
43065
+ 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
43066
  ] }),
42740
43067
  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" }),
43068
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.persistent") }),
42742
43069
  /* @__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
43070
  /* @__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" })
43071
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: info.loaded ? "success" : "default", size: "sm", children: info.loaded ? t("debug.loadedCount", { count: info.count }) : t("debug.notLoaded") })
42745
43072
  ] }, type)) })
42746
43073
  ] })
42747
43074
  ] });
@@ -42785,7 +43112,7 @@ function EventFlowTab({ events: events2 }) {
42785
43112
  EmptyState,
42786
43113
  {
42787
43114
  title: t("debug.noEventsYet"),
42788
- description: "Events will appear as traits, ticks, and other systems execute",
43115
+ description: t("debug.eventsExecuteHint"),
42789
43116
  className: "py-8"
42790
43117
  }
42791
43118
  );
@@ -42796,17 +43123,13 @@ function EventFlowTab({ events: events2 }) {
42796
43123
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--events", children: [
42797
43124
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 mb-3 flex-wrap", children: [
42798
43125
  /* @__PURE__ */ jsxRuntime.jsxs(ButtonGroup, { children: [
42799
- /* @__PURE__ */ jsxRuntime.jsxs(
43126
+ /* @__PURE__ */ jsxRuntime.jsx(
42800
43127
  Button,
42801
43128
  {
42802
43129
  size: "sm",
42803
43130
  variant: filter === "all" ? "primary" : "secondary",
42804
43131
  onClick: () => setFilter("all"),
42805
- children: [
42806
- "All (",
42807
- events2.length,
42808
- ")"
42809
- ]
43132
+ children: t("debug.allCount", { count: events2.length })
42810
43133
  }
42811
43134
  ),
42812
43135
  eventTypes.map((type) => {
@@ -42836,7 +43159,7 @@ function EventFlowTab({ events: events2 }) {
42836
43159
  onChange: (e) => setAutoScroll(e.target.checked)
42837
43160
  }
42838
43161
  ),
42839
- "Auto-scroll"
43162
+ t("debug.autoScroll")
42840
43163
  ] })
42841
43164
  ] }),
42842
43165
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -42894,7 +43217,7 @@ function GuardsPanel({ guards }) {
42894
43217
  EmptyState,
42895
43218
  {
42896
43219
  title: t("debug.noGuardEvaluations"),
42897
- description: "Guard evaluations will appear when transitions or ticks with guards execute",
43220
+ description: t("debug.guardEvaluationsHint"),
42898
43221
  className: "py-8"
42899
43222
  }
42900
43223
  );
@@ -42925,15 +43248,15 @@ function GuardsPanel({ guards }) {
42925
43248
  ] }),
42926
43249
  content: /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "sm", children: [
42927
43250
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42928
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Expression" }),
43251
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.expression") }),
42929
43252
  /* @__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
43253
  ] }),
42931
43254
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42932
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Inputs" }),
43255
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.inputs") }),
42933
43256
  /* @__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
43257
  ] }),
42935
43258
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
42936
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Trait" }),
43259
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.trait") }),
42937
43260
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: guard.context.traitName })
42938
43261
  ] })
42939
43262
  ] })
@@ -42951,9 +43274,9 @@ function GuardsPanel({ guards }) {
42951
43274
  ] })
42952
43275
  ] }),
42953
43276
  /* @__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" })
43277
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: t("debug.filterAll") }),
43278
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: t("debug.filterPassed") }),
43279
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "failed" ? "primary" : "secondary", onClick: () => setFilter("failed"), children: t("debug.filterFailed") })
42957
43280
  ] })
42958
43281
  ] }),
42959
43282
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-80 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: accordionItems }) })
@@ -43079,7 +43402,7 @@ function TransitionTimeline({ transitions }) {
43079
43402
  EmptyState,
43080
43403
  {
43081
43404
  title: t("debug.noTransitionsRecorded"),
43082
- description: "Transitions will appear as the state machine processes events",
43405
+ description: t("debug.transitionsProcessHint"),
43083
43406
  className: "py-8"
43084
43407
  }
43085
43408
  );
@@ -43096,10 +43419,7 @@ function TransitionTimeline({ transitions }) {
43096
43419
  const sorted = [...transitions].reverse();
43097
43420
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--timeline", children: [
43098
43421
  /* @__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
- ] }),
43422
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500", children: t("debug.transitionsRecorded", { count: transitions.length }) }),
43103
43423
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-1 text-xs text-gray-500 cursor-pointer", children: [
43104
43424
  /* @__PURE__ */ jsxRuntime.jsx(
43105
43425
  Checkbox,
@@ -43108,7 +43428,7 @@ function TransitionTimeline({ transitions }) {
43108
43428
  onChange: (e) => setAutoScroll(e.target.checked)
43109
43429
  }
43110
43430
  ),
43111
- "Auto-scroll"
43431
+ t("debug.autoScroll")
43112
43432
  ] })
43113
43433
  ] }),
43114
43434
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -43151,15 +43471,13 @@ function TransitionTimeline({ transitions }) {
43151
43471
  variant: trace.guardResult ? "success" : "danger",
43152
43472
  size: "sm",
43153
43473
  children: [
43154
- "guard: ",
43474
+ t("debug.guardLabel"),
43475
+ " ",
43155
43476
  trace.guardResult ? "\u2713" : "\u2717"
43156
43477
  ]
43157
43478
  }
43158
43479
  ),
43159
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: [
43160
- trace.effects.length,
43161
- " effects"
43162
- ] })
43480
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: t("debug.effectsCount", { count: trace.effects.length }) })
43163
43481
  ] }),
43164
43482
  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
43483
  /* @__PURE__ */ jsxRuntime.jsx(EffectBadge, { effect }),
@@ -43208,13 +43526,13 @@ function ServerBridgeTab({ bridge }) {
43208
43526
  EmptyState,
43209
43527
  {
43210
43528
  title: t("debug.noBridgeData"),
43211
- description: "The ServerBridge has not been initialized. Bridge health will appear once the runtime connects to the server.",
43529
+ description: t("debug.bridgeInitHint"),
43212
43530
  className: "py-8"
43213
43531
  }
43214
43532
  );
43215
43533
  }
43216
43534
  const formatTime4 = (ts) => {
43217
- if (ts === 0) return "Never";
43535
+ if (ts === 0) return t("debug.never");
43218
43536
  const d = new Date(ts);
43219
43537
  return d.toLocaleTimeString("en-US", {
43220
43538
  hour12: false,
@@ -43227,14 +43545,14 @@ function ServerBridgeTab({ bridge }) {
43227
43545
  /* @__PURE__ */ jsxRuntime.jsxs(Card, { className: "p-3", children: [
43228
43546
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 mb-3", children: [
43229
43547
  /* @__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" })
43548
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: bridge.connected ? t("debug.connected") : t("debug.disconnected") })
43231
43549
  ] }),
43232
43550
  /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "xs", children: [
43233
43551
  /* @__PURE__ */ jsxRuntime.jsx(
43234
43552
  StatRow,
43235
43553
  {
43236
43554
  label: t("debug.status"),
43237
- value: bridge.connected ? "Connected" : "Disconnected",
43555
+ value: bridge.connected ? t("debug.connected") : t("debug.disconnected"),
43238
43556
  variant: bridge.connected ? "success" : "danger"
43239
43557
  }
43240
43558
  ),
@@ -43262,13 +43580,10 @@ function ServerBridgeTab({ bridge }) {
43262
43580
  ] })
43263
43581
  ] }),
43264
43582
  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" }),
43583
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "semibold", className: "text-red-600 dark:text-red-400 mb-1", children: t("debug.lastError") }),
43266
43584
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-red-500 font-mono break-all", children: bridge.lastError })
43267
43585
  ] }),
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
- ] }) })
43586
+ 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
43587
  ] }) });
43273
43588
  }
43274
43589
  var init_ServerBridgeTab = __esm({
@@ -43378,7 +43693,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43378
43693
  EmptyState,
43379
43694
  {
43380
43695
  title: t("debug.noActiveTraits"),
43381
- description: "Traits will appear when the state machine initializes",
43696
+ description: t("debug.traitsInitHint"),
43382
43697
  className: "py-8"
43383
43698
  }
43384
43699
  );
@@ -43395,7 +43710,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43395
43710
  };
43396
43711
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--dispatch", children: [
43397
43712
  /* @__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" }),
43713
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.activeStates") }),
43399
43714
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: traits2.map((trait) => /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "success", size: "sm", children: [
43400
43715
  trait.name,
43401
43716
  ": ",
@@ -43403,8 +43718,8 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43403
43718
  ] }, trait.id)) })
43404
43719
  ] }),
43405
43720
  /* @__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: [
43721
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.availableEvents") }),
43722
+ 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
43723
  /* @__PURE__ */ jsxRuntime.jsx(
43409
43724
  Button,
43410
43725
  {
@@ -43416,15 +43731,15 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43416
43731
  }
43417
43732
  ),
43418
43733
  /* @__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" })
43734
+ transitions.some((tr) => tr.guard) && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "warning", size: "sm", children: t("debug.guarded") })
43420
43735
  ] }, event)) })
43421
43736
  ] }),
43422
43737
  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)" }),
43738
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.otherEvents") }),
43424
43739
  /* @__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
43740
  ] }),
43426
43741
  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" }),
43742
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.recentTransitions") }),
43428
43743
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: log12.map((entry, i) => /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "font-mono text-xs", children: [
43429
43744
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-400", children: entry.traitName }),
43430
43745
  " ",
@@ -43455,21 +43770,20 @@ var init_RuntimeDebugger = __esm({
43455
43770
  }
43456
43771
  });
43457
43772
  function ServerResponseRow({ sr }) {
43773
+ const { t } = useTranslate();
43458
43774
  const entityEntries = Object.entries(sr.dataEntities);
43459
43775
  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
43776
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43461
43777
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: sr.success ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400", children: [
43462
43778
  sr.success ? "\u2713" : "\u2717",
43463
- " server"
43779
+ " ",
43780
+ t("debug.server")
43464
43781
  ] }),
43465
43782
  /* @__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
- ] }),
43783
+ 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
43784
  sr.emittedEvents.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "px-1 rounded bg-blue-500/15 text-blue-300", children: [
43472
- "emit: ",
43785
+ t("debug.emitLabel"),
43786
+ " ",
43473
43787
  sr.emittedEvents.join(", ")
43474
43788
  ] }),
43475
43789
  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 +43791,12 @@ function ServerResponseRow({ sr }) {
43477
43791
  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
43792
  name,
43479
43793
  ": ",
43480
- count,
43481
- " row",
43482
- count !== 1 ? "s" : ""
43794
+ t("debug.rowsCount", { count })
43483
43795
  ] }, name)) })
43484
43796
  ] });
43485
43797
  }
43486
43798
  function TransitionRow({ trace }) {
43799
+ const { t } = useTranslate();
43487
43800
  const isServerEntry = !!trace.serverResponse && trace.traitName.startsWith("server:");
43488
43801
  const hasFailedEffects = trace.effects.some((e) => e.status === "failed");
43489
43802
  if (isServerEntry && trace.serverResponse) {
@@ -43491,7 +43804,7 @@ function TransitionRow({ trace }) {
43491
43804
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-2 text-xs font-mono", children: [
43492
43805
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-1.5 w-1.5 h-1.5 rounded-full flex-shrink-0 bg-purple-500" }),
43493
43806
  /* @__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" })
43807
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-400 flex-shrink-0", children: t("debug.serverResponse") })
43495
43808
  ] }),
43496
43809
  /* @__PURE__ */ jsxRuntime.jsx(ServerResponseRow, { sr: trace.serverResponse })
43497
43810
  ] });
@@ -43532,6 +43845,7 @@ function VerifyModePanel({
43532
43845
  serverCount,
43533
43846
  localCount
43534
43847
  }) {
43848
+ const { t } = useTranslate();
43535
43849
  const [expanded, setExpanded] = React85__namespace.useState(true);
43536
43850
  const scrollRef = React85__namespace.useRef(null);
43537
43851
  const prevCountRef = React85__namespace.useRef(0);
@@ -43562,30 +43876,20 @@ function VerifyModePanel({
43562
43876
  onClick: () => setExpanded((v) => !v),
43563
43877
  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
43878
  "aria-expanded": expanded,
43565
- "aria-label": expanded ? "Collapse verification timeline" : "Expand verification timeline",
43879
+ "aria-label": expanded ? t("debug.collapseVerificationTimeline") : t("debug.expandVerificationTimeline"),
43566
43880
  "data-testid": "debugger-verify-toggle",
43567
43881
  children: [
43568
43882
  /* @__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
- ] }),
43883
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? t("debug.failCount", { count: failedChecks }) : t("debug.ok") }),
43884
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground/70", children: t("debug.localCount", { count: localCount }) }),
43885
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-400", children: t("debug.serverCount", { count: serverCount }) }),
43578
43886
  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
- ] })
43887
+ !expanded && transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto text-foreground/50", children: t("debug.transitionsCount", { count: transitions.length }) })
43584
43888
  ]
43585
43889
  }
43586
43890
  ),
43587
43891
  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)) }) }) }),
43892
+ /* @__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
43893
  /* @__PURE__ */ jsxRuntime.jsx(WalkMinimap, {})
43590
43894
  ] })
43591
43895
  ]
@@ -43601,6 +43905,7 @@ function RuntimeDebugger({
43601
43905
  defaultTab,
43602
43906
  schema
43603
43907
  }) {
43908
+ const { t } = useTranslate();
43604
43909
  const [isCollapsed, setIsCollapsed] = React85__namespace.useState(mode === "verify" ? true : defaultCollapsed);
43605
43910
  const [isVisible, setIsVisible] = React85__namespace.useState(mode === "inline" || mode === "verify" || isDebugEnabled2());
43606
43911
  const debugData = useDebugData();
@@ -43639,55 +43944,55 @@ function RuntimeDebugger({
43639
43944
  const tabItems = [
43640
43945
  {
43641
43946
  id: "dispatch",
43642
- label: "Dispatch",
43947
+ label: t("debug.tabDispatch"),
43643
43948
  badge: debugData.traits.length || void 0,
43644
43949
  content: /* @__PURE__ */ jsxRuntime.jsx(EventDispatcherTab, { traits: debugData.traits, schema })
43645
43950
  },
43646
43951
  {
43647
43952
  id: "verify",
43648
- label: failedChecks > 0 ? "Verify (!)" : "Verify",
43953
+ label: failedChecks > 0 ? t("debug.tabVerifyAlert") : t("debug.tabVerify"),
43649
43954
  badge: verification.summary.totalChecks || void 0,
43650
43955
  content: /* @__PURE__ */ jsxRuntime.jsx(VerificationTab, { checks: verification.checks, summary: verification.summary })
43651
43956
  },
43652
43957
  {
43653
43958
  id: "timeline",
43654
- label: "Timeline",
43959
+ label: t("debug.tabTimeline"),
43655
43960
  badge: verification.transitions.length || void 0,
43656
43961
  content: /* @__PURE__ */ jsxRuntime.jsx(TransitionTimeline, { transitions: verification.transitions })
43657
43962
  },
43658
43963
  {
43659
43964
  id: "bridge",
43660
- label: "Bridge",
43965
+ label: t("debug.tabBridge"),
43661
43966
  badge: verification.bridge?.connected ? void 0 : 1,
43662
43967
  content: /* @__PURE__ */ jsxRuntime.jsx(ServerBridgeTab, { bridge: verification.bridge })
43663
43968
  },
43664
43969
  {
43665
43970
  id: "traits",
43666
- label: "Traits",
43971
+ label: t("debug.tabTraits"),
43667
43972
  badge: debugData.traits.length || void 0,
43668
43973
  content: /* @__PURE__ */ jsxRuntime.jsx(TraitsTab, { traits: debugData.traits })
43669
43974
  },
43670
43975
  {
43671
43976
  id: "ticks",
43672
- label: "Ticks",
43673
- badge: debugData.ticks.filter((t) => t.active).length || void 0,
43977
+ label: t("debug.tabTicks"),
43978
+ badge: debugData.ticks.filter((tick) => tick.active).length || void 0,
43674
43979
  content: /* @__PURE__ */ jsxRuntime.jsx(TicksTab, { ticks: debugData.ticks })
43675
43980
  },
43676
43981
  {
43677
43982
  id: "entities",
43678
- label: "Entities",
43983
+ label: t("debug.tabEntities"),
43679
43984
  badge: debugData.entitySnapshot?.runtime.length || void 0,
43680
43985
  content: /* @__PURE__ */ jsxRuntime.jsx(EntitiesTab, { snapshot: debugData.entitySnapshot })
43681
43986
  },
43682
43987
  {
43683
43988
  id: "events",
43684
- label: "Events",
43989
+ label: t("debug.tabEvents"),
43685
43990
  badge: debugData.events.length > 0 ? debugData.events.length : void 0,
43686
43991
  content: /* @__PURE__ */ jsxRuntime.jsx(EventFlowTab, { events: debugData.events })
43687
43992
  },
43688
43993
  {
43689
43994
  id: "guards",
43690
- label: "Guards",
43995
+ label: t("debug.tabGuards"),
43691
43996
  badge: debugData.guards.filter((g) => !g.result).length || void 0,
43692
43997
  content: /* @__PURE__ */ jsxRuntime.jsx(GuardsPanel, { guards: debugData.guards })
43693
43998
  }
@@ -43715,15 +44020,10 @@ function RuntimeDebugger({
43715
44020
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43716
44021
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "h6", style: { fontSize: "0.75rem" }, children: [
43717
44022
  isCollapsed ? "\u25B6" : "\u25BC",
43718
- " Debugger"
44023
+ " ",
44024
+ t("debug.debugger")
43719
44025
  ] }),
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" })
44026
+ 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
44027
  ] })
43728
44028
  }
43729
44029
  ),
@@ -43741,9 +44041,9 @@ function RuntimeDebugger({
43741
44041
  );
43742
44042
  }
43743
44043
  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);
44044
+ const traitStates = debugData.traits.map((t2) => `${t2.name}:${t2.currentState}`).join(" | ");
44045
+ const serverEntries = verification.transitions.filter((t2) => t2.serverResponse);
44046
+ const localEntries = verification.transitions.filter((t2) => !t2.serverResponse);
43747
44047
  return /* @__PURE__ */ jsxRuntime.jsx(
43748
44048
  VerifyModePanel,
43749
44049
  {
@@ -43775,7 +44075,7 @@ function RuntimeDebugger({
43775
44075
  variant: "secondary",
43776
44076
  size: "sm",
43777
44077
  className: "runtime-debugger__toggle",
43778
- title: "Open Debugger (`)",
44078
+ title: t("debug.openDebugger"),
43779
44079
  children: failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "relative", children: [
43780
44080
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: "V" }),
43781
44081
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute -top-1 -right-2 w-2 h-2 bg-red-500 rounded-full" })
@@ -43785,11 +44085,8 @@ function RuntimeDebugger({
43785
44085
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "runtime-debugger__header", children: [
43786
44086
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43787
44087
  /* @__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" })
44088
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: t("debug.kflowVerifier") }),
44089
+ 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
44090
  ] }),
43794
44091
  /* @__PURE__ */ jsxRuntime.jsx(
43795
44092
  Button,
@@ -43797,7 +44094,7 @@ function RuntimeDebugger({
43797
44094
  onClick: () => setIsCollapsed(true),
43798
44095
  variant: "ghost",
43799
44096
  size: "sm",
43800
- title: "Close (`)",
44097
+ title: t("debug.close"),
43801
44098
  children: "x"
43802
44099
  }
43803
44100
  )
@@ -43811,7 +44108,7 @@ function RuntimeDebugger({
43811
44108
  className: "runtime-debugger__tabs"
43812
44109
  }
43813
44110
  ) }),
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" }) })
44111
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "runtime-debugger__footer", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-foreground/50", children: t("debug.toggleHint") }) })
43815
44112
  ] })
43816
44113
  }
43817
44114
  );
@@ -43837,6 +44134,7 @@ var init_RuntimeDebugger2 = __esm({
43837
44134
  init_TransitionTimeline();
43838
44135
  init_ServerBridgeTab();
43839
44136
  init_EventDispatcherTab();
44137
+ init_useTranslate();
43840
44138
  init_RuntimeDebugger();
43841
44139
  RuntimeDebugger.displayName = "RuntimeDebugger";
43842
44140
  }
@@ -45125,7 +45423,7 @@ var init_StatCard = __esm({
45125
45423
  }
45126
45424
  );
45127
45425
  }
45128
- const label = schemaStats?.[0]?.label || labelToUse || "Stat";
45426
+ const label = schemaStats?.[0]?.label || labelToUse || t("statCard.defaultLabel");
45129
45427
  const normalizedPropValue = Array.isArray(propValue) ? propValue[0] ?? propValue.length : propValue;
45130
45428
  const value = schemaStats?.[0]?.value ?? normalizedPropValue ?? 0;
45131
45429
  const trendDirection = manualDirection || (calculatedTrend === void 0 || calculatedTrend === 0 ? "neutral" : calculatedTrend > 0 ? "up" : "down");
@@ -45168,7 +45466,7 @@ var init_StatCard = __esm({
45168
45466
  ]
45169
45467
  }
45170
45468
  ),
45171
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", as: "span", children: "vs last period" })
45469
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", as: "span", children: t("statCard.vsLastPeriod") })
45172
45470
  ] }),
45173
45471
  subtitle && !calculatedTrend && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", children: subtitle })
45174
45472
  ] }),