@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.
@@ -1914,7 +1914,10 @@ var en_default;
1914
1914
  var init_en = __esm({
1915
1915
  "locales/en.json"() {
1916
1916
  en_default = {
1917
- $meta: { locale: "en", direction: "ltr" },
1917
+ $meta: {
1918
+ locale: "en",
1919
+ direction: "ltr"
1920
+ },
1918
1921
  "common.save": "Save",
1919
1922
  "common.cancel": "Cancel",
1920
1923
  "common.delete": "Delete",
@@ -2056,7 +2059,6 @@ var init_en = __esm({
2056
2059
  "error.somethingWentWrong": "Something went wrong",
2057
2060
  "error.loadingItems": "Loading items...",
2058
2061
  "error.noItemsFound": "No items found",
2059
- "error.notFound": "Not found",
2060
2062
  "debug.noEntityData": "No entity data",
2061
2063
  "debug.noEntities": "No entities",
2062
2064
  "debug.noTicks": "No ticks registered",
@@ -2088,7 +2090,299 @@ var init_en = __esm({
2088
2090
  "template.showcase": "Showcase",
2089
2091
  "template.faq": "Frequently Asked Questions",
2090
2092
  "template.ourTeam": "Our Team",
2091
- "template.caseStudies": "Case Studies"
2093
+ "template.caseStudies": "Case Studies",
2094
+ "richBlockEditor.toolbar.text": "Text",
2095
+ "richBlockEditor.toolbar.h1": "H1",
2096
+ "richBlockEditor.toolbar.h2": "H2",
2097
+ "richBlockEditor.toolbar.h3": "H3",
2098
+ "richBlockEditor.toolbar.bulletList": "Bullet list",
2099
+ "richBlockEditor.toolbar.numbered": "Numbered",
2100
+ "richBlockEditor.toolbar.quote": "Quote",
2101
+ "richBlockEditor.toolbar.code": "Code",
2102
+ "richBlockEditor.toolbar.divider": "Divider",
2103
+ "richBlockEditor.toolbar.image": "Image",
2104
+ "richBlockEditor.blockType.paragraph": "Text",
2105
+ "richBlockEditor.blockType.heading1": "Heading 1",
2106
+ "richBlockEditor.blockType.heading2": "Heading 2",
2107
+ "richBlockEditor.blockType.heading3": "Heading 3",
2108
+ "richBlockEditor.blockType.bulletList": "Bullet list",
2109
+ "richBlockEditor.blockType.numberedList": "Numbered list",
2110
+ "richBlockEditor.blockType.quote": "Quote",
2111
+ "richBlockEditor.blockType.code": "Code",
2112
+ "richBlockEditor.blockType.divider": "Divider",
2113
+ "richBlockEditor.blockType.image": "Image",
2114
+ "richBlockEditor.blockActions": "Block actions",
2115
+ "richBlockEditor.duplicate": "Duplicate",
2116
+ "richBlockEditor.turnInto": "Turn into",
2117
+ "richBlockEditor.placeholder.heading1": "Heading 1",
2118
+ "richBlockEditor.placeholder.heading2": "Heading 2",
2119
+ "richBlockEditor.placeholder.heading3": "Heading 3",
2120
+ "richBlockEditor.placeholder.quote": "Quote",
2121
+ "richBlockEditor.placeholder.code": "Enter code",
2122
+ "richBlockEditor.placeholder.paragraph": "Start writing...",
2123
+ "richBlockEditor.placeholder.listItem": "List item",
2124
+ "richBlockEditor.placeholder.caption": "Caption (optional)",
2125
+ "richBlockEditor.aria.heading1Block": "Heading 1 block",
2126
+ "richBlockEditor.aria.heading2Block": "Heading 2 block",
2127
+ "richBlockEditor.aria.heading3Block": "Heading 3 block",
2128
+ "richBlockEditor.aria.quoteBlock": "Quote block",
2129
+ "richBlockEditor.aria.codeBlock": "Code block",
2130
+ "richBlockEditor.aria.codeLanguage": "Code language",
2131
+ "richBlockEditor.aria.imageUrl": "Image URL",
2132
+ "richBlockEditor.aria.imageCaption": "Image caption",
2133
+ "richBlockEditor.aria.listItem": "List item",
2134
+ "richBlockEditor.aria.removeListItem": "Remove list item",
2135
+ "richBlockEditor.aria.paragraphBlock": "Paragraph block",
2136
+ "richBlockEditor.embeddedImage": "Embedded image",
2137
+ "richBlockEditor.noImageUrl": "No image URL set",
2138
+ "richBlockEditor.addItem": "Add item",
2139
+ "richBlockEditor.insertParagraphBelow": "Insert paragraph below",
2140
+ "richBlockEditor.editorToolbar": "Block editor toolbar",
2141
+ "richBlockEditor.insertEntry": "Insert {{label}}",
2142
+ "versionDiff.compare": "Compare",
2143
+ "versionDiff.to": "to",
2144
+ "versionDiff.beforeRevision": "Before revision",
2145
+ "versionDiff.afterRevision": "After revision",
2146
+ "versionDiff.switchToInline": "Switch to inline view",
2147
+ "versionDiff.switchToSideBySide": "Switch to side-by-side view",
2148
+ "versionDiff.revert": "Revert",
2149
+ "versionDiff.byAuthor": " by {{author}}",
2150
+ "violationAlert.actionType.measure": "Corrective Measure",
2151
+ "violationAlert.actionType.admin": "Administrative Action",
2152
+ "violationAlert.actionType.penalty": "Penalty Proceedings",
2153
+ "violationAlert.fallbackMessage": "Violation",
2154
+ "violationAlert.adminLabel": "Admin:",
2155
+ "violationAlert.penaltyLabel": "Penalty:",
2156
+ "violationAlert.goToField": "Go to field",
2157
+ "branchingLogic.title": "Branching logic",
2158
+ "branchingLogic.if": "If",
2159
+ "branchingLogic.goTo": "go to",
2160
+ "branchingLogic.rules": "Rules",
2161
+ "branchingLogic.logicGraph": "Logic graph",
2162
+ "branchingLogic.addRule": "Add rule",
2163
+ "branchingLogic.deleteRule": "Delete rule",
2164
+ "branchingLogic.endOfSurvey": "End of survey",
2165
+ "branchingLogic.brokenReference": "Broken reference",
2166
+ "branchingLogic.selectQuestion": "Select question",
2167
+ "branchingLogic.selectTarget": "Select target",
2168
+ "branchingLogic.selectValue": "Select value",
2169
+ "branchingLogic.addValue": "Add value",
2170
+ "branchingLogic.value": "Value",
2171
+ "branchingLogic.typeValuePressEnter": "Type value, press Enter",
2172
+ "branchingLogic.operatorEquals": "equals",
2173
+ "branchingLogic.operatorNotEquals": "does not equal",
2174
+ "branchingLogic.operatorContains": "contains",
2175
+ "branchingLogic.operatorIn": "is one of",
2176
+ "branchingLogic.graphAriaLabel": "Branching logic graph",
2177
+ "branchingLogic.ruleCountOne": "{{count}} rule",
2178
+ "branchingLogic.ruleCountOther": "{{count}} rules",
2179
+ "branchingLogic.brokenCount": "{{count}} broken",
2180
+ "branchingLogic.emptyNoQuestions": "Add questions before building branching rules.",
2181
+ "branchingLogic.emptyNoRules": "No rules yet. Add a rule to define branching logic.",
2182
+ "filterGroup.filters": "Filters",
2183
+ "filterGroup.all": "All",
2184
+ "filterGroup.clear": "Clear",
2185
+ "filterGroup.clearAll": "Clear all",
2186
+ "filterGroup.from": "From",
2187
+ "filterGroup.to": "To",
2188
+ "filterGroup.allOf": "All {{label}}",
2189
+ "filterGroup.activeCount": "{{count}} active",
2190
+ "debug.guardEvaluationsHint": "Guard evaluations will appear when transitions or ticks with guards execute",
2191
+ "debug.expression": "Expression",
2192
+ "debug.inputs": "Inputs",
2193
+ "debug.trait": "Trait",
2194
+ "debug.filterAll": "All",
2195
+ "debug.filterPassed": "Passed",
2196
+ "debug.filterFailed": "Failed",
2197
+ "debug.traitsInitHint": "Traits will appear when the state machine initializes",
2198
+ "debug.traitsMountHint": "Traits will appear when components using them are mounted",
2199
+ "debug.activeStates": "Active States",
2200
+ "debug.availableEvents": "Available Events",
2201
+ "debug.noTransitionsFromState": "No transitions from current state",
2202
+ "debug.guarded": "guarded",
2203
+ "debug.otherEvents": "Other Events (not available from current state)",
2204
+ "debug.recentTransitions": "Recent Transitions",
2205
+ "debug.transitionsCount": "{{count}} transitions",
2206
+ "debug.states": "States",
2207
+ "debug.transitions": "Transitions",
2208
+ "debug.guards": "Guards",
2209
+ "debug.debugModeHint": "Debug mode may not be enabled",
2210
+ "debug.entitiesSpawnHint": "Entities will appear when spawned",
2211
+ "debug.singleton": "Singleton",
2212
+ "debug.singletonsCount": "Singletons ({{count}})",
2213
+ "debug.runtimeCount": "Runtime ({{count}})",
2214
+ "debug.moreEntities": "+{{count}} more entities",
2215
+ "debug.persistent": "Persistent",
2216
+ "debug.loadedCount": "{{count}} loaded",
2217
+ "debug.notLoaded": "not loaded",
2218
+ "debug.eventsExecuteHint": "Events will appear as traits, ticks, and other systems execute",
2219
+ "debug.allCount": "All ({{count}})",
2220
+ "debug.autoScroll": "Auto-scroll",
2221
+ "debug.transitionsProcessHint": "Transitions will appear as the state machine processes events",
2222
+ "debug.transitionsRecorded": "{{count}} transitions recorded",
2223
+ "debug.guardLabel": "guard:",
2224
+ "debug.effectsCount": "{{count}} effects",
2225
+ "debug.bridgeInitHint": "The ServerBridge has not been initialized. Bridge health will appear once the runtime connects to the server.",
2226
+ "debug.never": "Never",
2227
+ "debug.connected": "Connected",
2228
+ "debug.disconnected": "Disconnected",
2229
+ "debug.lastError": "Last Error",
2230
+ "debug.totalEventsProcessed": "{{count}} total events processed",
2231
+ "debug.server": "server",
2232
+ "debug.clientEffectsCount": "{{count}} clientEffects",
2233
+ "debug.emitLabel": "emit:",
2234
+ "debug.rowsCount": "{{count}} rows",
2235
+ "debug.serverResponse": "server response",
2236
+ "debug.collapseVerificationTimeline": "Collapse verification timeline",
2237
+ "debug.expandVerificationTimeline": "Expand verification timeline",
2238
+ "debug.failCount": "{{count}} fail",
2239
+ "debug.ok": "OK",
2240
+ "debug.localCount": "{{count}} local",
2241
+ "debug.serverCount": "{{count}} server",
2242
+ "debug.waitingForTransitions": "Waiting for transitions...",
2243
+ "debug.tabDispatch": "Dispatch",
2244
+ "debug.tabVerify": "Verify",
2245
+ "debug.tabVerifyAlert": "Verify (!)",
2246
+ "debug.tabTimeline": "Timeline",
2247
+ "debug.tabBridge": "Bridge",
2248
+ "debug.tabTraits": "Traits",
2249
+ "debug.tabTicks": "Ticks",
2250
+ "debug.tabEntities": "Entities",
2251
+ "debug.tabEvents": "Events",
2252
+ "debug.tabGuards": "Guards",
2253
+ "debug.debugger": "Debugger",
2254
+ "debug.failedCount": "{{count}} failed",
2255
+ "debug.traitsCount": "{{count}} traits",
2256
+ "debug.idle": "Idle",
2257
+ "debug.openDebugger": "Open Debugger (`)",
2258
+ "debug.kflowVerifier": "KFlow Verifier",
2259
+ "debug.allPassing": "All passing",
2260
+ "debug.runtime": "Runtime",
2261
+ "debug.close": "Close (`)",
2262
+ "debug.toggleHint": "Press ` to toggle | window.__orbitalVerification for automation",
2263
+ "replyTree.expandReplies": "Expand replies",
2264
+ "replyTree.collapseReplies": "Collapse replies",
2265
+ "replyTree.voteOnReplyBy": "Vote on reply by {{author}}",
2266
+ "replyTree.replyTo": "Reply to {{author}}",
2267
+ "replyTree.replyToPlaceholder": "Reply to {{author}}\u2026",
2268
+ "replyTree.reply": "Reply",
2269
+ "replyTree.flagReplyBy": "Flag reply by {{author}}",
2270
+ "replyTree.flag": "Flag",
2271
+ "replyTree.send": "Send",
2272
+ "replyTree.continueThread": "Continue thread",
2273
+ "replyTree.noRepliesYet": "No replies yet.",
2274
+ "signaturePad.label": "Signature",
2275
+ "signaturePad.helperText": "Draw your signature above",
2276
+ "signaturePad.clear": "Clear",
2277
+ "signaturePad.confirm": "Confirm",
2278
+ "qrScanner.cameraUnavailable": "Camera unavailable",
2279
+ "qrScanner.paused": "Paused",
2280
+ "qrScanner.resumeScanning": "Resume scanning",
2281
+ "qrScanner.pauseScanning": "Pause scanning",
2282
+ "qrScanner.switchToFrontCamera": "Switch to front camera",
2283
+ "qrScanner.switchToRearCamera": "Switch to rear camera",
2284
+ "qrScanner.mockScan": "Mock Scan",
2285
+ "docSearch.placeholder": "Search documentation...",
2286
+ "stateMachine.loading": "Loading state machine\u2026",
2287
+ "stateMachine.noStateMachine": "No state machine to visualize",
2288
+ "avl.trigger": "Trigger",
2289
+ "avl.guard": "Guard",
2290
+ "avl.effects": "Effects",
2291
+ "avl.props": "Props",
2292
+ "avl.entity": "Entity",
2293
+ "avl.traits": "Traits",
2294
+ "avl.transition": "Transition",
2295
+ "avl.onEntity": "on {{entity}}",
2296
+ "avl.linkedTo": "linked to {{entity}}",
2297
+ "avl.pressEscToZoomOut": "Press Esc to zoom out",
2298
+ "avl.zoomIn": "Zoom in",
2299
+ "avl.zoomOut": "Zoom out",
2300
+ "avl.orbitalLabel": "Orbital: {{name}}",
2301
+ "avl.orbitalLabelHighlighted": "Orbital: {{name}} (highlighted)",
2302
+ "avl.noTraitData": "No trait data",
2303
+ "avl.computingLayout": "Computing layout...",
2304
+ "avl.noStateMachine": "No state machine",
2305
+ "avl.listensFor": "listens for {{event}}",
2306
+ "avl.emits": "emits {{event}}",
2307
+ "avl.pageLayout": "Page Layout",
2308
+ "avl.overlaySuffix": "(overlay)",
2309
+ "orbPreview.previewBadge": "Preview",
2310
+ "orbPreview.doubleClickToOpen": "Double-click to open",
2311
+ "orbPreview.dropToAddAndOpen": "Drop to add and open",
2312
+ "orbPreview.dispatching": "Coordinator is dispatching to this orbital",
2313
+ "orbPreview.noPreview": "No preview available",
2314
+ "orbPreview.screensCount": "{{count}} screens",
2315
+ "detailView.noTransitionData": "No transition data",
2316
+ "orbInspector.required": "req",
2317
+ "orbInspector.addField": "Add Field",
2318
+ "orbInspector.serviceMode": "Service Mode",
2319
+ "orbInspector.standalone": "Standalone",
2320
+ "orbInspector.embedded": "Embedded",
2321
+ "orbInspector.rendersOwnUi": "Renders its own UI",
2322
+ "orbInspector.headless": "Headless, wired to other behaviors",
2323
+ "orbInspector.addEffect": "Add Effect",
2324
+ "orbInspector.guardExpression": "Guard expression",
2325
+ "orbInspector.selectPatternForStyles": "Select a pattern to view its style tokens.",
2326
+ "orbInspector.tokens": "Tokens",
2327
+ "orbInspector.noTokenContract": "No token contract declared for this pattern.",
2328
+ "orbInspector.variant": "Variant",
2329
+ "orbInspector.size": "Size",
2330
+ "orbInspector.statesCount": "{{count}} states",
2331
+ "orbInspector.onEntity": " on {{entity}}",
2332
+ "orbInspector.projectThemeTokens": "Project theme tokens",
2333
+ "orbInspector.tokenGroup.colors": "Colors",
2334
+ "orbInspector.tokenGroup.radii": "Radii",
2335
+ "orbInspector.tokenGroup.spacing": "Spacing",
2336
+ "orbInspector.tokenGroup.shadows": "Shadows",
2337
+ "orbInspector.tab.inspector": "Inspector",
2338
+ "orbInspector.tab.styles": "Styles",
2339
+ "orbInspector.tab.code": "Code",
2340
+ "canvas.goBackToOverview": "Go back to overview",
2341
+ "canvas.overview": "Overview",
2342
+ "canvas.expanded": "Expanded",
2343
+ "canvas.modulesCount": "{{count}} modules",
2344
+ "canvas.screensCount": "{{count}} screens",
2345
+ "canvas.switchToView": "Switch to {{label}} view",
2346
+ "lawReference.viewFullText": "View full law text",
2347
+ "statCard.defaultLabel": "Stat",
2348
+ "statCard.vsLastPeriod": "vs last period",
2349
+ "mediaGallery.upload": "Upload",
2350
+ "mediaGallery.noMediaDescription": "No media items to display.",
2351
+ "pagination.jumpPlaceholder": "Page",
2352
+ "table.selectRow": "Select row {{id}}",
2353
+ "card.selectItem": "Select {{item}}",
2354
+ "card.itemFallback": "item",
2355
+ "fileTree.noFiles": "No files",
2356
+ "masterDetail.selectItem": "Select an item to view details",
2357
+ "empty.createFirst": "Create your first item to get started.",
2358
+ "upload.dropOrBrowse": "Drop files here or click to browse",
2359
+ "upload.dropFilesHere": "Drop files here",
2360
+ "upload.accepted": "Accepted: {{accept}}",
2361
+ "upload.maxSize": "Max size: {{size}}",
2362
+ "upload.maxFiles": "Up to {{count}} files",
2363
+ "upload.error.maxFiles": "Maximum {{count}} files allowed",
2364
+ "upload.error.invalidType": "Invalid file type: {{name}}",
2365
+ "upload.error.tooLarge": "File too large: {{name}} (max {{size}})",
2366
+ "optionConstraint.requiredOne": "Required, pick 1",
2367
+ "optionConstraint.optionalOne": "Optional, pick up to 1",
2368
+ "optionConstraint.pickExactly": "Pick exactly {{count}}",
2369
+ "optionConstraint.pickRange": "Pick {{min}}-{{max}}",
2370
+ "optionConstraint.pickAtLeast": "Pick at least {{count}}",
2371
+ "optionConstraint.pickUpTo": "Pick up to {{count}}",
2372
+ "optionConstraint.optional": "Optional",
2373
+ "optionConstraint.outOfStock": "Out of stock",
2374
+ "optionConstraint.error.pickOne": "Pick 1 option",
2375
+ "optionConstraint.error.pickOnlyOne": "Pick only 1 option",
2376
+ "optionConstraint.error.pickMore": "Pick at least {{count}} more",
2377
+ "optionConstraint.error.removeOptions": "Remove {{count}} options",
2378
+ "stateMachine.pinned": "Pinned",
2379
+ "stateMachine.eventCount": "{{count}} events",
2380
+ "stateMachine.externalEffects": "External Effects",
2381
+ "stateMachine.legend.initial": "Initial",
2382
+ "stateMachine.legend.final": "Final",
2383
+ "stateMachine.legend.state": "State",
2384
+ "stateMachine.legend.multiEvent": "Multi-event",
2385
+ "relationSelect.selectPlaceholder": "Select..."
2092
2386
  };
2093
2387
  }
2094
2388
  });
@@ -5176,6 +5470,7 @@ var init_LawReferenceTooltip = __esm({
5176
5470
  init_Typography();
5177
5471
  init_Divider();
5178
5472
  init_cn();
5473
+ init_useTranslate();
5179
5474
  positionStyles2 = {
5180
5475
  top: "bottom-full left-1/2 -translate-x-1/2 mb-2",
5181
5476
  bottom: "top-full left-1/2 -translate-x-1/2 mt-2",
@@ -5194,6 +5489,7 @@ var init_LawReferenceTooltip = __esm({
5194
5489
  position = "top",
5195
5490
  className
5196
5491
  }) => {
5492
+ const { t } = useTranslate();
5197
5493
  const [isVisible, setIsVisible] = React85__default.useState(false);
5198
5494
  const timeoutRef = React85__default.useRef(null);
5199
5495
  const handleMouseEnter = () => {
@@ -5277,7 +5573,7 @@ var init_LawReferenceTooltip = __esm({
5277
5573
  target: "_blank",
5278
5574
  rel: "noopener noreferrer",
5279
5575
  onClick: (e) => e.stopPropagation(),
5280
- children: "View full law text"
5576
+ children: t("lawReference.viewFullText")
5281
5577
  }
5282
5578
  )
5283
5579
  ] }),
@@ -13558,6 +13854,7 @@ var log7, SWIM_GUTTER, CENTER_W, BehaviorView;
13558
13854
  var init_BehaviorView = __esm({
13559
13855
  "components/avl/molecules/BehaviorView.tsx"() {
13560
13856
  "use client";
13857
+ init_useTranslate();
13561
13858
  init_AvlState();
13562
13859
  init_AvlTransitionLane();
13563
13860
  init_AvlSwimLane();
@@ -13567,6 +13864,7 @@ var init_BehaviorView = __esm({
13567
13864
  SWIM_GUTTER = 120;
13568
13865
  CENTER_W = 360;
13569
13866
  BehaviorView = ({ data }) => {
13867
+ const { t } = useTranslate();
13570
13868
  const [layout, setLayout] = useState(null);
13571
13869
  const traitName = data.traits[0]?.name;
13572
13870
  const traitData = traitName ? data.traitDetails[traitName] : void 0;
@@ -13576,10 +13874,10 @@ var init_BehaviorView = __esm({
13576
13874
  computeTraitLayout(traitData).then(setLayout).catch((err) => log7.error("compute-trait-layout-failed", { error: err instanceof Error ? err : String(err) }));
13577
13875
  }, [dataKey]);
13578
13876
  if (!traitData) {
13579
- return /* @__PURE__ */ jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: "No trait data" });
13877
+ return /* @__PURE__ */ jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: t("avl.noTraitData") });
13580
13878
  }
13581
13879
  if (!layout) {
13582
- return /* @__PURE__ */ jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: "Computing layout..." });
13880
+ return /* @__PURE__ */ jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: t("avl.computingLayout") });
13583
13881
  }
13584
13882
  const hasExternal = traitData.listenedEvents.length > 0 || traitData.emittedEvents.length > 0;
13585
13883
  const viewW = hasExternal ? SWIM_GUTTER + CENTER_W + SWIM_GUTTER : CENTER_W + 60;
@@ -13595,10 +13893,7 @@ var init_BehaviorView = __esm({
13595
13893
  const machineHeight = scaledH + 100;
13596
13894
  const renderMachine = /* @__PURE__ */ jsxs("g", { children: [
13597
13895
  /* @__PURE__ */ jsx("text", { x: CENTER_W / 2, y: 20, textAnchor: "middle", fill: "var(--color-foreground)", fontSize: 18, fontWeight: "700", fontFamily: "inherit", children: traitData.name }),
13598
- /* @__PURE__ */ jsxs("text", { x: CENTER_W / 2, y: 36, textAnchor: "middle", fill: "var(--color-muted-foreground)", fontSize: 11, opacity: 0.5, fontFamily: "inherit", children: [
13599
- "on ",
13600
- traitData.linkedEntity
13601
- ] }),
13896
+ /* @__PURE__ */ jsx("text", { x: CENTER_W / 2, y: 36, textAnchor: "middle", fill: "var(--color-muted-foreground)", fontSize: 11, opacity: 0.5, fontFamily: "inherit", children: t("avl.onEntity", { entity: traitData.linkedEntity }) }),
13602
13897
  /* @__PURE__ */ jsxs("defs", { children: [
13603
13898
  /* @__PURE__ */ jsx("marker", { id: "bvArrow", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: CONNECTION_COLORS.forward.color, opacity: 0.7 }) }),
13604
13899
  /* @__PURE__ */ jsx("marker", { id: "bvArrowBack", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: CONNECTION_COLORS.backward.color, opacity: 0.5 }) })
@@ -13906,7 +14201,7 @@ var init_CodeBlock = __esm({
13906
14201
  const isLolo = language === "lolo";
13907
14202
  const activeStyle = isOrb ? orbStyle : isLolo ? loloStyle : dark;
13908
14203
  const eventBus = useEventBus();
13909
- const { t: _t } = useTranslate();
14204
+ const { t } = useTranslate();
13910
14205
  const scrollRef = useRef(null);
13911
14206
  const codeRef = useRef(null);
13912
14207
  const savedScrollLeftRef = useRef(0);
@@ -14161,7 +14456,7 @@ var init_CodeBlock = __esm({
14161
14456
  size: "sm",
14162
14457
  onClick: handleCopy,
14163
14458
  className: "opacity-0 group-hover:opacity-100 focus:opacity-100 transition-opacity text-muted-foreground hover:text-white",
14164
- "aria-label": "Copy code",
14459
+ "aria-label": t("common.copy"),
14165
14460
  children: copied ? /* @__PURE__ */ jsx(Icon, { name: "check", className: "w-4 h-4 text-green-400" }) : /* @__PURE__ */ jsx(Icon, { name: "copy", className: "w-4 h-4" })
14166
14461
  }
14167
14462
  )
@@ -14816,7 +15111,7 @@ var init_StateMachineView = __esm({
14816
15111
  const endX2 = fromState.x + Math.cos(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
14817
15112
  const endY2 = fromState.y + Math.sin(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
14818
15113
  const isSingle2 = bundle.labels.length === 1;
14819
- const labelText2 = isSingle2 ? bundle.labels[0].event : `${bundle.labels.length} events`;
15114
+ const labelText2 = isSingle2 ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
14820
15115
  const bundleColor2 = isSingle2 ? config.colors.arrow : "var(--color-accent)";
14821
15116
  const labelWidth2 = labelText2.length * 9 + (isSingle2 ? 24 : 40);
14822
15117
  const cx = fromState.x;
@@ -14942,7 +15237,7 @@ var init_StateMachineView = __esm({
14942
15237
  const controlX = midX + perpX;
14943
15238
  const controlY = midY + perpY;
14944
15239
  const isSingle = bundle.labels.length === 1;
14945
- const labelText = isSingle ? bundle.labels[0].event : `${bundle.labels.length} events`;
15240
+ const labelText = isSingle ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
14946
15241
  const labelWidth = labelText.length * 9 + (isSingle ? 24 : 40);
14947
15242
  const bundleColor = isSingle ? config.colors.arrow : "var(--color-accent)";
14948
15243
  const curveMidpoint = {
@@ -15097,7 +15392,7 @@ var init_StateMachineView = __esm({
15097
15392
  {
15098
15393
  className: "absolute -top-2 left-1/2 transform -translate-x-1/2 px-2 py-0.5 rounded-full",
15099
15394
  style: { backgroundColor: "var(--color-success)" },
15100
- children: /* @__PURE__ */ jsx(Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: "Pinned" })
15395
+ children: /* @__PURE__ */ jsx(Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: t("stateMachine.pinned") })
15101
15396
  }
15102
15397
  ),
15103
15398
  !isSingle && /* @__PURE__ */ jsxs(
@@ -15119,10 +15414,7 @@ var init_StateMachineView = __esm({
15119
15414
  {
15120
15415
  className: "ml-2 px-2 py-0.5 rounded-full",
15121
15416
  style: { backgroundColor: "var(--color-accent)" },
15122
- children: /* @__PURE__ */ jsxs(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: [
15123
- bundle.labels.length,
15124
- " events"
15125
- ] })
15417
+ children: /* @__PURE__ */ jsx(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: t("stateMachine.eventCount", { count: bundle.labels.length }) })
15126
15418
  }
15127
15419
  )
15128
15420
  ]
@@ -15267,7 +15559,7 @@ var init_StateMachineView = __esm({
15267
15559
  align: "center",
15268
15560
  className: "mb-2",
15269
15561
  style: { color: "var(--color-warning)", fontSize: "13px" },
15270
- children: "External Effects"
15562
+ children: t("stateMachine.externalEffects")
15271
15563
  }
15272
15564
  ),
15273
15565
  outputs.outputs.map((output, idx) => /* @__PURE__ */ jsx(
@@ -15287,10 +15579,10 @@ var init_StateMachineView = __esm({
15287
15579
  Legend = ({ config, y }) => {
15288
15580
  const { t } = useTranslate();
15289
15581
  const items = [
15290
- { label: "Initial", color: config.colors.initialNode },
15291
- { label: "Final", color: config.colors.finalNode },
15292
- { label: "State", color: config.colors.nodeBorder },
15293
- { label: "Multi-event", color: "var(--color-accent)" }
15582
+ { key: "initial", label: t("stateMachine.legend.initial"), color: config.colors.initialNode, isMultiEvent: false },
15583
+ { key: "final", label: t("stateMachine.legend.final"), color: config.colors.finalNode, isMultiEvent: false },
15584
+ { key: "state", label: t("stateMachine.legend.state"), color: config.colors.nodeBorder, isMultiEvent: false },
15585
+ { key: "multiEvent", label: t("stateMachine.legend.multiEvent"), color: "var(--color-accent)", isMultiEvent: true }
15294
15586
  ];
15295
15587
  return /* @__PURE__ */ jsx(
15296
15588
  HStack,
@@ -15305,8 +15597,8 @@ var init_StateMachineView = __esm({
15305
15597
  {
15306
15598
  className: "w-3 h-3 rounded-full",
15307
15599
  style: {
15308
- backgroundColor: item.label === "Multi-event" ? item.color : config.colors.node,
15309
- border: item.label !== "Multi-event" ? `2px solid ${item.color}` : "none"
15600
+ backgroundColor: item.isMultiEvent ? item.color : config.colors.node,
15601
+ border: !item.isMultiEvent ? `2px solid ${item.color}` : "none"
15310
15602
  }
15311
15603
  }
15312
15604
  ),
@@ -15318,7 +15610,7 @@ var init_StateMachineView = __esm({
15318
15610
  children: item.label
15319
15611
  }
15320
15612
  )
15321
- ] }, item.label))
15613
+ ] }, item.key))
15322
15614
  }
15323
15615
  );
15324
15616
  };
@@ -16112,13 +16404,13 @@ var init_JazariStateMachine = __esm({
16112
16404
  );
16113
16405
  }, [resolvedTrait, entityFields]);
16114
16406
  if (isLoading) {
16115
- return /* @__PURE__ */ jsx(LoadingState, { message: "Loading state machine\u2026" });
16407
+ return /* @__PURE__ */ jsx(LoadingState, { message: t("stateMachine.loading") });
16116
16408
  }
16117
16409
  if (error) {
16118
16410
  return /* @__PURE__ */ jsx(ErrorState, { message: error instanceof Error ? error.message : String(error) });
16119
16411
  }
16120
16412
  if (!resolvedTrait || !layoutData || layoutData.states.length === 0) {
16121
- return /* @__PURE__ */ jsx(Box, { padding: "lg", className: cn("text-center", className), children: /* @__PURE__ */ jsx(Typography, { variant: "body", className: "opacity-60", children: "No state machine to visualize" }) });
16413
+ return /* @__PURE__ */ jsx(Box, { padding: "lg", className: cn("text-center", className), children: /* @__PURE__ */ jsx(Typography, { variant: "body", className: "opacity-60", children: t("stateMachine.noStateMachine") }) });
16122
16414
  }
16123
16415
  return /* @__PURE__ */ jsx(
16124
16416
  StateMachineView,
@@ -17162,13 +17454,13 @@ var init_LayoutPatterns = __esm({
17162
17454
  function generateRuleId() {
17163
17455
  return `rule-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
17164
17456
  }
17165
- function questionsToOptions(questions, includeEndOfSurvey) {
17457
+ function questionsToOptions(questions, endOfSurveyLabel) {
17166
17458
  const opts = questions.map((q) => ({
17167
17459
  value: q.id,
17168
17460
  label: q.label
17169
17461
  }));
17170
- if (includeEndOfSurvey) {
17171
- opts.push({ value: END_OF_SURVEY, label: "End of survey" });
17462
+ if (endOfSurveyLabel !== null) {
17463
+ opts.push({ value: END_OF_SURVEY, label: endOfSurveyLabel });
17172
17464
  }
17173
17465
  return opts;
17174
17466
  }
@@ -17177,7 +17469,7 @@ function isRuleBroken(rule, questions) {
17177
17469
  const targetExists = rule.targetQuestionId === END_OF_SURVEY || questions.some((q) => q.id === rule.targetQuestionId);
17178
17470
  return !sourceExists || !targetExists;
17179
17471
  }
17180
- var END_OF_SURVEY, OPERATOR_OPTIONS, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph, BranchingLogicBuilder;
17472
+ var END_OF_SURVEY, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph, BranchingLogicBuilder;
17181
17473
  var init_BranchingLogicBuilder = __esm({
17182
17474
  "components/core/molecules/BranchingLogicBuilder.tsx"() {
17183
17475
  "use client";
@@ -17190,14 +17482,9 @@ var init_BranchingLogicBuilder = __esm({
17190
17482
  init_FilterPill();
17191
17483
  init_Box();
17192
17484
  init_useEventBus();
17485
+ init_useTranslate();
17193
17486
  init_cn();
17194
17487
  END_OF_SURVEY = "end-of-survey";
17195
- OPERATOR_OPTIONS = [
17196
- { value: "equals", label: "equals" },
17197
- { value: "not-equals", label: "does not equal" },
17198
- { value: "contains", label: "contains" },
17199
- { value: "in", label: "is one of" }
17200
- ];
17201
17488
  RuleRow = ({
17202
17489
  rule,
17203
17490
  questions,
@@ -17206,8 +17493,21 @@ var init_BranchingLogicBuilder = __esm({
17206
17493
  onChange,
17207
17494
  onDelete
17208
17495
  }) => {
17209
- const sourceOptions = useMemo(() => questionsToOptions(questions, false), [questions]);
17210
- const targetOptions = useMemo(() => questionsToOptions(questions, true), [questions]);
17496
+ const { t } = useTranslate();
17497
+ const operatorOptions = useMemo(
17498
+ () => [
17499
+ { value: "equals", label: t("branchingLogic.operatorEquals") },
17500
+ { value: "not-equals", label: t("branchingLogic.operatorNotEquals") },
17501
+ { value: "contains", label: t("branchingLogic.operatorContains") },
17502
+ { value: "in", label: t("branchingLogic.operatorIn") }
17503
+ ],
17504
+ [t]
17505
+ );
17506
+ const sourceOptions = useMemo(() => questionsToOptions(questions, null), [questions]);
17507
+ const targetOptions = useMemo(
17508
+ () => questionsToOptions(questions, t("branchingLogic.endOfSurvey")),
17509
+ [questions, t]
17510
+ );
17211
17511
  const sourceQuestion = questions.find((q) => q.id === rule.sourceQuestionId);
17212
17512
  const valueOptions = useMemo(() => {
17213
17513
  if (!sourceQuestion?.optionValues) return [];
@@ -17252,22 +17552,22 @@ var init_BranchingLogicBuilder = __esm({
17252
17552
  ),
17253
17553
  children: [
17254
17554
  /* @__PURE__ */ jsxs(Box, { className: "flex flex-wrap items-center gap-2", children: [
17255
- /* @__PURE__ */ jsx(Typography, { variant: "label", weight: "semibold", className: "shrink-0", children: "If" }),
17555
+ /* @__PURE__ */ jsx(Typography, { variant: "label", weight: "semibold", className: "shrink-0", children: t("branchingLogic.if") }),
17256
17556
  /* @__PURE__ */ jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsx(
17257
17557
  Select,
17258
17558
  {
17259
17559
  options: sourceOptions,
17260
17560
  value: rule.sourceQuestionId,
17261
- placeholder: "Select question",
17561
+ placeholder: t("branchingLogic.selectQuestion"),
17262
17562
  onChange: handleSource,
17263
17563
  disabled: readOnly,
17264
- error: broken ? "Broken reference" : void 0
17564
+ error: broken ? t("branchingLogic.brokenReference") : void 0
17265
17565
  }
17266
17566
  ) }),
17267
17567
  /* @__PURE__ */ jsx(Box, { className: "min-w-[8rem] basis-32", children: /* @__PURE__ */ jsx(
17268
17568
  Select,
17269
17569
  {
17270
- options: OPERATOR_OPTIONS,
17570
+ options: operatorOptions,
17271
17571
  value: rule.operator,
17272
17572
  onChange: handleOperator,
17273
17573
  disabled: readOnly
@@ -17290,7 +17590,7 @@ var init_BranchingLogicBuilder = __esm({
17290
17590
  {
17291
17591
  options: valueOptions.filter((o) => !chips.includes(o.value)),
17292
17592
  value: "",
17293
- placeholder: "Add value",
17593
+ placeholder: t("branchingLogic.addValue"),
17294
17594
  onChange: handleAddChip,
17295
17595
  disabled: readOnly
17296
17596
  }
@@ -17298,7 +17598,7 @@ var init_BranchingLogicBuilder = __esm({
17298
17598
  Input,
17299
17599
  {
17300
17600
  inputType: "text",
17301
- placeholder: "Type value, press Enter",
17601
+ placeholder: t("branchingLogic.typeValuePressEnter"),
17302
17602
  value: "",
17303
17603
  onKeyDown: (e) => {
17304
17604
  if (e.key !== "Enter") return;
@@ -17316,7 +17616,7 @@ var init_BranchingLogicBuilder = __esm({
17316
17616
  {
17317
17617
  options: valueOptions,
17318
17618
  value: scalarValue,
17319
- placeholder: "Select value",
17619
+ placeholder: t("branchingLogic.selectValue"),
17320
17620
  onChange: (e) => onChange({ ...rule, value: e.target.value }),
17321
17621
  disabled: readOnly
17322
17622
  }
@@ -17324,7 +17624,7 @@ var init_BranchingLogicBuilder = __esm({
17324
17624
  Input,
17325
17625
  {
17326
17626
  inputType: "text",
17327
- placeholder: "Value",
17627
+ placeholder: t("branchingLogic.value"),
17328
17628
  value: scalarValue,
17329
17629
  onChange: handleScalarValue,
17330
17630
  disabled: readOnly
@@ -17332,17 +17632,17 @@ var init_BranchingLogicBuilder = __esm({
17332
17632
  ) }),
17333
17633
  /* @__PURE__ */ jsxs(Typography, { variant: "label", weight: "semibold", className: "shrink-0 inline-flex items-center gap-1", children: [
17334
17634
  /* @__PURE__ */ jsx(ArrowRight, { className: "h-4 w-4" }),
17335
- "go to"
17635
+ t("branchingLogic.goTo")
17336
17636
  ] }),
17337
17637
  /* @__PURE__ */ jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsx(
17338
17638
  Select,
17339
17639
  {
17340
17640
  options: targetOptions,
17341
17641
  value: rule.targetQuestionId,
17342
- placeholder: "Select target",
17642
+ placeholder: t("branchingLogic.selectTarget"),
17343
17643
  onChange: handleTarget,
17344
17644
  disabled: readOnly,
17345
- error: broken && rule.targetQuestionId !== END_OF_SURVEY ? "Broken reference" : void 0
17645
+ error: broken && rule.targetQuestionId !== END_OF_SURVEY ? t("branchingLogic.brokenReference") : void 0
17346
17646
  }
17347
17647
  ) }),
17348
17648
  !readOnly && /* @__PURE__ */ jsx(
@@ -17354,11 +17654,11 @@ var init_BranchingLogicBuilder = __esm({
17354
17654
  action: "DELETE_RULE",
17355
17655
  actionPayload: { ruleId: rule.id },
17356
17656
  onClick: onDelete,
17357
- "aria-label": "Delete rule"
17657
+ "aria-label": t("branchingLogic.deleteRule")
17358
17658
  }
17359
17659
  )
17360
17660
  ] }),
17361
- broken && /* @__PURE__ */ jsx(Badge, { variant: "error", size: "sm", label: "Broken reference" })
17661
+ broken && /* @__PURE__ */ jsx(Badge, { variant: "error", size: "sm", label: t("branchingLogic.brokenReference") })
17362
17662
  ]
17363
17663
  }
17364
17664
  );
@@ -17368,10 +17668,12 @@ var init_BranchingLogicBuilder = __esm({
17368
17668
  NODE_GAP_Y = 80;
17369
17669
  PADDING = 32;
17370
17670
  LogicGraph = ({ questions, rules }) => {
17671
+ const { t } = useTranslate();
17672
+ const endOfSurveyLabel = t("branchingLogic.endOfSurvey");
17371
17673
  const layout = useMemo(() => {
17372
17674
  const items = [
17373
17675
  ...questions.map((q) => ({ id: q.id, label: q.label, isEnd: false })),
17374
- { id: END_OF_SURVEY, label: "End of survey", isEnd: true }
17676
+ { id: END_OF_SURVEY, label: endOfSurveyLabel, isEnd: true }
17375
17677
  ];
17376
17678
  const positions = {};
17377
17679
  items.forEach((item, i) => {
@@ -17383,14 +17685,14 @@ var init_BranchingLogicBuilder = __esm({
17383
17685
  const width = NODE_WIDTH + PADDING * 2 + 220;
17384
17686
  const height = PADDING * 2 + items.length * (NODE_HEIGHT + NODE_GAP_Y);
17385
17687
  return { items, positions, width, height };
17386
- }, [questions]);
17688
+ }, [questions, endOfSurveyLabel]);
17387
17689
  return /* @__PURE__ */ jsx(Box, { className: "overflow-auto rounded-container border border-border bg-card p-2", children: /* @__PURE__ */ jsxs(
17388
17690
  "svg",
17389
17691
  {
17390
17692
  width: layout.width,
17391
17693
  height: layout.height,
17392
17694
  role: "img",
17393
- "aria-label": "Branching logic graph",
17695
+ "aria-label": t("branchingLogic.graphAriaLabel"),
17394
17696
  style: { display: "block" },
17395
17697
  children: [
17396
17698
  /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx(
@@ -17498,6 +17800,7 @@ var init_BranchingLogicBuilder = __esm({
17498
17800
  readOnly = false,
17499
17801
  className
17500
17802
  }) => {
17803
+ const { t } = useTranslate();
17501
17804
  const eventBus = useEventBus();
17502
17805
  const questions = Array.isArray(questionsProp) ? questionsProp : [];
17503
17806
  const rulesInitial = Array.isArray(rulesProp) ? rulesProp : [];
@@ -17550,16 +17853,23 @@ var init_BranchingLogicBuilder = __esm({
17550
17853
  /* @__PURE__ */ jsxs(Box, { className: "flex flex-wrap items-center justify-between gap-2", children: [
17551
17854
  /* @__PURE__ */ jsxs(Box, { className: "flex items-center gap-2", children: [
17552
17855
  /* @__PURE__ */ jsx(GitBranch, { className: "h-5 w-5 text-foreground" }),
17553
- /* @__PURE__ */ jsx(Typography, { variant: "subheading", weight: "semibold", children: "Branching logic" }),
17856
+ /* @__PURE__ */ jsx(Typography, { variant: "subheading", weight: "semibold", children: t("branchingLogic.title") }),
17554
17857
  /* @__PURE__ */ jsx(
17555
17858
  Badge,
17556
17859
  {
17557
17860
  variant: "neutral",
17558
17861
  size: "sm",
17559
- label: `${rules.length} rule${rules.length === 1 ? "" : "s"}`
17862
+ label: rules.length === 1 ? t("branchingLogic.ruleCountOne", { count: rules.length }) : t("branchingLogic.ruleCountOther", { count: rules.length })
17560
17863
  }
17561
17864
  ),
17562
- brokenCount > 0 && /* @__PURE__ */ jsx(Badge, { variant: "error", size: "sm", label: `${brokenCount} broken` })
17865
+ brokenCount > 0 && /* @__PURE__ */ jsx(
17866
+ Badge,
17867
+ {
17868
+ variant: "error",
17869
+ size: "sm",
17870
+ label: t("branchingLogic.brokenCount", { count: brokenCount })
17871
+ }
17872
+ )
17563
17873
  ] }),
17564
17874
  /* @__PURE__ */ jsxs(Box, { className: "flex items-center gap-1 rounded-sm border border-border bg-card p-0.5", children: [
17565
17875
  /* @__PURE__ */ jsx(
@@ -17570,7 +17880,7 @@ var init_BranchingLogicBuilder = __esm({
17570
17880
  leftIcon: Pencil,
17571
17881
  action: "VIEW_EDIT",
17572
17882
  onClick: () => setView("edit"),
17573
- children: "Rules"
17883
+ children: t("branchingLogic.rules")
17574
17884
  }
17575
17885
  ),
17576
17886
  /* @__PURE__ */ jsx(
@@ -17581,13 +17891,13 @@ var init_BranchingLogicBuilder = __esm({
17581
17891
  leftIcon: Eye,
17582
17892
  action: "VIEW_GRAPH",
17583
17893
  onClick: () => setView("graph"),
17584
- children: "Logic graph"
17894
+ children: t("branchingLogic.logicGraph")
17585
17895
  }
17586
17896
  )
17587
17897
  ] })
17588
17898
  ] }),
17589
17899
  view === "edit" ? /* @__PURE__ */ jsxs(Box, { className: "flex flex-col gap-2", children: [
17590
- rules.length === 0 ? /* @__PURE__ */ jsx(Card, { variant: "bordered", padding: "lg", className: "text-center", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "muted", children: noQuestions ? "Add questions before building branching rules." : "No rules yet. Add a rule to define branching logic." }) }) : rules.map((rule) => /* @__PURE__ */ jsx(
17900
+ rules.length === 0 ? /* @__PURE__ */ jsx(Card, { variant: "bordered", padding: "lg", className: "text-center", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "muted", children: noQuestions ? t("branchingLogic.emptyNoQuestions") : t("branchingLogic.emptyNoRules") }) }) : rules.map((rule) => /* @__PURE__ */ jsx(
17591
17901
  RuleRow,
17592
17902
  {
17593
17903
  rule,
@@ -17608,7 +17918,7 @@ var init_BranchingLogicBuilder = __esm({
17608
17918
  action: "ADD_RULE",
17609
17919
  onClick: handleAddRule,
17610
17920
  disabled: noQuestions,
17611
- children: "Add rule"
17921
+ children: t("branchingLogic.addRule")
17612
17922
  }
17613
17923
  ) })
17614
17924
  ] }) : /* @__PURE__ */ jsx(LogicGraph, { questions, rules })
@@ -18235,7 +18545,7 @@ function CalendarGrid({
18235
18545
  onClick: stepPrev,
18236
18546
  "aria-disabled": !canPrev || void 0,
18237
18547
  "aria-label": t("aria.previousDays"),
18238
- children: "Prev"
18548
+ children: t("nav.previous")
18239
18549
  }
18240
18550
  ),
18241
18551
  /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground", children: formatDateRange(visibleDays[0], visibleDays[visibleDays.length - 1]) }),
@@ -18248,7 +18558,7 @@ function CalendarGrid({
18248
18558
  onClick: stepNext,
18249
18559
  "aria-disabled": !canNext || void 0,
18250
18560
  "aria-label": t("aria.nextDays"),
18251
- children: "Next"
18561
+ children: t("nav.next")
18252
18562
  }
18253
18563
  )
18254
18564
  ] }),
@@ -19798,7 +20108,7 @@ var init_Pagination = __esm({
19798
20108
  type: "number",
19799
20109
  value: jumpToPage,
19800
20110
  onChange: (e) => setJumpToPage(e.target.value),
19801
- placeholder: "Page",
20111
+ placeholder: t("pagination.jumpPlaceholder"),
19802
20112
  className: "w-20",
19803
20113
  onKeyDown: (e) => {
19804
20114
  if (e.key === "Enter") {
@@ -19936,13 +20246,10 @@ var init_CardGrid = __esm({
19936
20246
  return children;
19937
20247
  }
19938
20248
  if (isLoading) {
19939
- return /* @__PURE__ */ jsx(Box, { className: "col-span-full text-center py-8 text-muted-foreground", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "secondary", children: "Loading items..." }) });
20249
+ return /* @__PURE__ */ jsx(Box, { className: "col-span-full text-center py-8 text-muted-foreground", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "secondary", children: t("loading.items") }) });
19940
20250
  }
19941
20251
  if (error) {
19942
- return /* @__PURE__ */ jsx(Box, { className: "col-span-full text-center py-8 text-error", children: /* @__PURE__ */ jsxs(Typography, { variant: "body", color: "error", children: [
19943
- "Error loading items: ",
19944
- error.message
19945
- ] }) });
20252
+ return /* @__PURE__ */ jsx(Box, { className: "col-span-full text-center py-8 text-error", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "error", children: t("error.loadFailed", { message: error.message }) }) });
19946
20253
  }
19947
20254
  if (normalizedData.length === 0) {
19948
20255
  return /* @__PURE__ */ jsx(Box, { className: "col-span-full text-center py-12 text-muted-foreground", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "secondary", children: t("empty.noItems") || "No items found" }) });
@@ -23808,7 +24115,7 @@ function DataGrid({
23808
24115
  onChange: () => toggleSelection(id),
23809
24116
  onClick: (e) => e.stopPropagation(),
23810
24117
  className: "w-4 h-4 mt-1 flex-shrink-0 accent-primary",
23811
- "aria-label": `Select ${titleValue !== void 0 ? String(titleValue) : "item"}`
24118
+ "aria-label": t("card.selectItem", { item: titleValue !== void 0 ? String(titleValue) : t("card.itemFallback") })
23812
24119
  }
23813
24120
  ),
23814
24121
  /* @__PURE__ */ jsxs(VStack, { gap: "xs", className: "flex-1 min-w-0", children: [
@@ -24006,7 +24313,7 @@ function formatDate3(value) {
24006
24313
  if (isNaN(d.getTime())) return String(value);
24007
24314
  return d.toLocaleDateString(void 0, { year: "numeric", month: "short", day: "numeric" });
24008
24315
  }
24009
- function formatValue2(value, format) {
24316
+ function formatValue2(value, format, boolLabels) {
24010
24317
  if (value === void 0 || value === null) return "";
24011
24318
  switch (format) {
24012
24319
  case "date":
@@ -24018,7 +24325,7 @@ function formatValue2(value, format) {
24018
24325
  case "percent":
24019
24326
  return typeof value === "number" ? `${Math.round(value)}%` : String(value);
24020
24327
  case "boolean":
24021
- return value ? "Yes" : "No";
24328
+ return value ? boolLabels?.yes ?? "Yes" : boolLabels?.no ?? "No";
24022
24329
  default:
24023
24330
  return String(value);
24024
24331
  }
@@ -24314,7 +24621,7 @@ function DataList({
24314
24621
  field.label ?? fieldLabel3(field.name),
24315
24622
  ":"
24316
24623
  ] }),
24317
- /* @__PURE__ */ jsx(Typography, { variant: "small", children: formatValue2(value, field.format) })
24624
+ /* @__PURE__ */ jsx(Typography, { variant: "small", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
24318
24625
  ] }, field.name);
24319
24626
  }) }),
24320
24627
  progressFields.map((field) => {
@@ -24444,6 +24751,7 @@ var init_FileTree = __esm({
24444
24751
  init_Box();
24445
24752
  init_Typography();
24446
24753
  init_Icon();
24754
+ init_useTranslate();
24447
24755
  TreeNodeItem = ({
24448
24756
  node,
24449
24757
  depth,
@@ -24529,8 +24837,9 @@ var init_FileTree = __esm({
24529
24837
  className,
24530
24838
  indent = 16
24531
24839
  }) => {
24840
+ const { t } = useTranslate();
24532
24841
  if (tree.length === 0) {
24533
- return /* @__PURE__ */ jsx(Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: "No files" }) });
24842
+ return /* @__PURE__ */ jsx(Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: t("fileTree.noFiles") }) });
24534
24843
  }
24535
24844
  return /* @__PURE__ */ jsx(Box, { className: `py-1 overflow-y-auto ${className ?? ""}`, role: "tree", children: tree.map((node) => /* @__PURE__ */ jsx(
24536
24845
  TreeNodeItem,
@@ -24649,6 +24958,7 @@ var init_FilterGroup = __esm({
24649
24958
  init_Icon();
24650
24959
  init_useEventBus();
24651
24960
  init_useQuerySingleton();
24961
+ init_useTranslate();
24652
24962
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
24653
24963
  lookStyles6 = {
24654
24964
  toolbar: "",
@@ -24669,6 +24979,7 @@ var init_FilterGroup = __esm({
24669
24979
  isLoading,
24670
24980
  look = "toolbar"
24671
24981
  }) => {
24982
+ const { t } = useTranslate();
24672
24983
  const eventBus = useEventBus();
24673
24984
  const queryState = useQuerySingleton(query);
24674
24985
  const [selectedValues, setSelectedValues] = useState(
@@ -24750,7 +25061,7 @@ var init_FilterGroup = __esm({
24750
25061
  "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24751
25062
  !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24752
25063
  ),
24753
- children: "All"
25064
+ children: t("filterGroup.all")
24754
25065
  }
24755
25066
  ),
24756
25067
  filter.options?.map((option) => /* @__PURE__ */ jsx(
@@ -24778,7 +25089,7 @@ var init_FilterGroup = __esm({
24778
25089
  size: "sm",
24779
25090
  onClick: handleClearAll,
24780
25091
  leftIcon: /* @__PURE__ */ jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24781
- children: "Clear"
25092
+ children: t("filterGroup.clear")
24782
25093
  }
24783
25094
  )
24784
25095
  ]
@@ -24789,7 +25100,7 @@ var init_FilterGroup = __esm({
24789
25100
  return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-4", lookStyles6[look], className), children: [
24790
25101
  showIcon && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
24791
25102
  /* @__PURE__ */ jsx(Icon, { name: "filter", className: "h-4 w-4" }),
24792
- /* @__PURE__ */ jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
25103
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
24793
25104
  ] }),
24794
25105
  filters.map((filter) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
24795
25106
  /* @__PURE__ */ jsx("label", { className: "text-xs font-bold text-muted-foreground uppercase tracking-wide", children: filter.label }),
@@ -24812,7 +25123,7 @@ var init_FilterGroup = __esm({
24812
25123
  `${filter.field}_from`,
24813
25124
  e.target.value || null
24814
25125
  ),
24815
- placeholder: "From",
25126
+ placeholder: t("filterGroup.from"),
24816
25127
  clearable: true,
24817
25128
  onClear: () => handleFilterSelect(`${filter.field}_from`, null)
24818
25129
  }
@@ -24826,7 +25137,7 @@ var init_FilterGroup = __esm({
24826
25137
  `${filter.field}_to`,
24827
25138
  e.target.value || null
24828
25139
  ),
24829
- placeholder: "To",
25140
+ placeholder: t("filterGroup.to"),
24830
25141
  clearable: true,
24831
25142
  onClear: () => handleFilterSelect(`${filter.field}_to`, null)
24832
25143
  }
@@ -24846,7 +25157,7 @@ var init_FilterGroup = __esm({
24846
25157
  value: selectedValues[filter.field] || "all",
24847
25158
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24848
25159
  options: [
24849
- { value: "all", label: "All" },
25160
+ { value: "all", label: t("filterGroup.all") },
24850
25161
  ...filter.options?.map((opt) => ({
24851
25162
  value: opt,
24852
25163
  label: opt
@@ -24863,7 +25174,7 @@ var init_FilterGroup = __esm({
24863
25174
  onClick: handleClearAll,
24864
25175
  leftIcon: /* @__PURE__ */ jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24865
25176
  className: "self-start",
24866
- children: "Clear all"
25177
+ children: t("filterGroup.clearAll")
24867
25178
  }
24868
25179
  )
24869
25180
  ] });
@@ -24929,7 +25240,7 @@ var init_FilterGroup = __esm({
24929
25240
  value: selectedValues[filter.field] || "all",
24930
25241
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24931
25242
  options: [
24932
- { value: "all", label: `All ${filter.label}` },
25243
+ { value: "all", label: t("filterGroup.allOf", { label: filter.label }) },
24933
25244
  ...filter.options?.map((opt) => ({
24934
25245
  value: opt,
24935
25246
  label: opt
@@ -24958,7 +25269,7 @@ var init_FilterGroup = __esm({
24958
25269
  field
24959
25270
  );
24960
25271
  }),
24961
- /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
25272
+ /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: t("filterGroup.clearAll") })
24962
25273
  ] })
24963
25274
  ]
24964
25275
  }
@@ -24983,7 +25294,7 @@ var init_FilterGroup = __esm({
24983
25294
  className: "text-muted-foreground",
24984
25295
  children: [
24985
25296
  /* @__PURE__ */ jsx(Icon, { name: "filter", className: "h-4 w-4" }),
24986
- /* @__PURE__ */ jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
25297
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
24987
25298
  ]
24988
25299
  }
24989
25300
  ),
@@ -25009,7 +25320,7 @@ var init_FilterGroup = __esm({
25009
25320
  `${filter.field}_from`,
25010
25321
  e.target.value || null
25011
25322
  ),
25012
- placeholder: "From",
25323
+ placeholder: t("filterGroup.from"),
25013
25324
  clearable: true,
25014
25325
  onClear: () => handleFilterSelect(`${filter.field}_from`, null),
25015
25326
  className: "min-w-[130px]"
@@ -25025,7 +25336,7 @@ var init_FilterGroup = __esm({
25025
25336
  `${filter.field}_to`,
25026
25337
  e.target.value || null
25027
25338
  ),
25028
- placeholder: "To",
25339
+ placeholder: t("filterGroup.to"),
25029
25340
  clearable: true,
25030
25341
  onClear: () => handleFilterSelect(`${filter.field}_to`, null),
25031
25342
  className: "min-w-[130px]"
@@ -25047,7 +25358,7 @@ var init_FilterGroup = __esm({
25047
25358
  value: selectedValues[filter.field] || "all",
25048
25359
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
25049
25360
  options: [
25050
- { value: "all", label: "All" },
25361
+ { value: "all", label: t("filterGroup.all") },
25051
25362
  ...filter.options?.map((opt) => ({
25052
25363
  value: opt,
25053
25364
  label: opt
@@ -25058,10 +25369,7 @@ var init_FilterGroup = __esm({
25058
25369
  )
25059
25370
  ] }, filter.field)),
25060
25371
  activeFilterCount > 0 && /* @__PURE__ */ jsxs(HStack, { gap: "sm", align: "center", className: "ml-auto", children: [
25061
- /* @__PURE__ */ jsxs(Badge, { variant: "primary", size: "md", children: [
25062
- activeFilterCount,
25063
- " active"
25064
- ] }),
25372
+ /* @__PURE__ */ jsx(Badge, { variant: "primary", size: "md", children: t("filterGroup.activeCount", { count: activeFilterCount }) }),
25065
25373
  /* @__PURE__ */ jsx(
25066
25374
  Button,
25067
25375
  {
@@ -25069,7 +25377,7 @@ var init_FilterGroup = __esm({
25069
25377
  size: "sm",
25070
25378
  onClick: handleClearAll,
25071
25379
  leftIcon: /* @__PURE__ */ jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
25072
- children: "Clear all"
25380
+ children: t("filterGroup.clearAll")
25073
25381
  }
25074
25382
  )
25075
25383
  ] })
@@ -25298,7 +25606,7 @@ var init_RelationSelect = __esm({
25298
25606
  value,
25299
25607
  onChange,
25300
25608
  options = [],
25301
- placeholder = "Select...",
25609
+ placeholder,
25302
25610
  required = false,
25303
25611
  disabled = false,
25304
25612
  isLoading = false,
@@ -25310,6 +25618,7 @@ var init_RelationSelect = __esm({
25310
25618
  emptyMessage
25311
25619
  }) => {
25312
25620
  const { t } = useTranslate();
25621
+ const resolvedPlaceholder = placeholder ?? t("relationSelect.selectPlaceholder");
25313
25622
  const resolvedSearchPlaceholder = searchPlaceholder ?? t("common.search");
25314
25623
  const resolvedEmptyMessage = emptyMessage ?? t("empty.noOptionsFound");
25315
25624
  const [isOpen, setIsOpen] = useState(false);
@@ -25419,7 +25728,7 @@ var init_RelationSelect = __esm({
25419
25728
  children: isLoading ? /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
25420
25729
  /* @__PURE__ */ jsx(Spinner, { size: "sm" }),
25421
25730
  /* @__PURE__ */ jsx(Typography, { as: "span", children: t("common.loading") })
25422
- ] }) : selectedOption ? selectedOption.label : placeholder
25731
+ ] }) : selectedOption ? selectedOption.label : resolvedPlaceholder
25423
25732
  }
25424
25733
  ),
25425
25734
  /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
@@ -26013,19 +26322,20 @@ var init_RepeatableFormSection = __esm({
26013
26322
  RepeatableFormSection.displayName = "RepeatableFormSection";
26014
26323
  }
26015
26324
  });
26016
- var actionTypeLabels, actionTypeIcons, ViolationAlert;
26325
+ var actionTypeLabelKeys, actionTypeIcons, ViolationAlert;
26017
26326
  var init_ViolationAlert = __esm({
26018
26327
  "components/core/molecules/ViolationAlert.tsx"() {
26019
26328
  init_cn();
26329
+ init_useTranslate();
26020
26330
  init_Box();
26021
26331
  init_Stack();
26022
26332
  init_Typography();
26023
26333
  init_Button();
26024
26334
  init_Icon();
26025
- actionTypeLabels = {
26026
- measure: "Corrective Measure",
26027
- admin: "Administrative Action",
26028
- penalty: "Penalty Proceedings"
26335
+ actionTypeLabelKeys = {
26336
+ measure: "violationAlert.actionType.measure",
26337
+ admin: "violationAlert.actionType.admin",
26338
+ penalty: "violationAlert.actionType.penalty"
26029
26339
  };
26030
26340
  actionTypeIcons = {
26031
26341
  measure: "alert-triangle",
@@ -26042,10 +26352,11 @@ var init_ViolationAlert = __esm({
26042
26352
  className,
26043
26353
  ...flatProps
26044
26354
  }) => {
26355
+ const { t } = useTranslate();
26045
26356
  const resolvedViolation = violation ?? {
26046
26357
  law: "",
26047
26358
  article: "",
26048
- message: flatProps.message ?? "Violation",
26359
+ message: flatProps.message ?? t("violationAlert.fallbackMessage"),
26049
26360
  actionType: "measure"
26050
26361
  };
26051
26362
  const effectiveSeverity = severity ?? (resolvedViolation.actionType === "measure" ? "warning" : "error");
@@ -26130,7 +26441,7 @@ var init_ViolationAlert = __esm({
26130
26441
  {
26131
26442
  variant: "caption",
26132
26443
  className: cn(textColor, "opacity-75"),
26133
- children: actionTypeLabels[resolvedViolation.actionType]
26444
+ children: t(actionTypeLabelKeys[resolvedViolation.actionType])
26134
26445
  }
26135
26446
  )
26136
26447
  ] })
@@ -26161,7 +26472,7 @@ var init_ViolationAlert = __esm({
26161
26472
  {
26162
26473
  variant: "caption",
26163
26474
  className: cn(textColor, "opacity-75"),
26164
- children: "Admin:"
26475
+ children: t("violationAlert.adminLabel")
26165
26476
  }
26166
26477
  ),
26167
26478
  /* @__PURE__ */ jsx(
@@ -26180,7 +26491,7 @@ var init_ViolationAlert = __esm({
26180
26491
  {
26181
26492
  variant: "caption",
26182
26493
  className: cn(textColor, "opacity-75"),
26183
- children: "Penalty:"
26494
+ children: t("violationAlert.penaltyLabel")
26184
26495
  }
26185
26496
  ),
26186
26497
  /* @__PURE__ */ jsx(
@@ -26205,7 +26516,7 @@ var init_ViolationAlert = __esm({
26205
26516
  className: cn(textColor, "self-start"),
26206
26517
  children: [
26207
26518
  /* @__PURE__ */ jsx(Icon, { name: "arrow-right", size: "sm", className: "mr-1" }),
26208
- "Go to field"
26519
+ t("violationAlert.goToField")
26209
26520
  ]
26210
26521
  }
26211
26522
  )
@@ -26521,6 +26832,7 @@ var init_LineChart = __esm({
26521
26832
  "use client";
26522
26833
  init_cn();
26523
26834
  init_atoms2();
26835
+ init_useTranslate();
26524
26836
  LineChart2 = ({
26525
26837
  data,
26526
26838
  width = 400,
@@ -26532,6 +26844,7 @@ var init_LineChart = __esm({
26532
26844
  areaColor = "var(--color-primary)",
26533
26845
  className
26534
26846
  }) => {
26847
+ const { t } = useTranslate();
26535
26848
  const gradientId = useId();
26536
26849
  const safeData = data ?? [];
26537
26850
  const sortedData = useMemo(() => {
@@ -26568,7 +26881,7 @@ var init_LineChart = __esm({
26568
26881
  return `${linePath} L ${last.x} ${bottom} L ${first.x} ${bottom} Z`;
26569
26882
  }, [linePath, points, height, showArea]);
26570
26883
  if (safeData.length === 0) {
26571
- return /* @__PURE__ */ jsx(Box, { className: cn("flex items-center justify-center text-muted-foreground", className), style: { width, height }, children: "No data" });
26884
+ return /* @__PURE__ */ jsx(Box, { className: cn("flex items-center justify-center text-muted-foreground", className), style: { width, height }, children: t("empty.noData") });
26572
26885
  }
26573
26886
  return /* @__PURE__ */ jsx(Box, { className: cn(className), children: /* @__PURE__ */ jsxs(
26574
26887
  "svg",
@@ -28475,6 +28788,7 @@ var init_GraphView = __esm({
28475
28788
  "use client";
28476
28789
  init_cn();
28477
28790
  init_atoms2();
28791
+ init_useTranslate();
28478
28792
  GROUP_COLORS = [
28479
28793
  "#3b82f6",
28480
28794
  // blue-500
@@ -28507,6 +28821,7 @@ var init_GraphView = __esm({
28507
28821
  showLabels = true,
28508
28822
  zoomToFit = true
28509
28823
  }) => {
28824
+ const { t } = useTranslate();
28510
28825
  const containerRef = useRef(null);
28511
28826
  const animRef = useRef(0);
28512
28827
  const [simNodes, setSimNodes] = useState([]);
@@ -28684,7 +28999,7 @@ var init_GraphView = __esm({
28684
28999
  [onNodeClick]
28685
29000
  );
28686
29001
  if (nodes.length === 0) {
28687
- return /* @__PURE__ */ jsx(Box, { className: cn("flex items-center justify-center", className), style: { width: w, height: h }, children: /* @__PURE__ */ jsx(Box, { className: "text-muted-foreground text-sm", children: "No graph data" }) });
29002
+ return /* @__PURE__ */ jsx(Box, { className: cn("flex items-center justify-center", className), style: { width: w, height: h }, children: /* @__PURE__ */ jsx(Box, { className: "text-muted-foreground text-sm", children: t("display.noGraphData") }) });
28688
29003
  }
28689
29004
  return /* @__PURE__ */ jsx(
28690
29005
  Box,
@@ -29140,11 +29455,12 @@ var init_UploadDropZone = __esm({
29140
29455
  init_Icon();
29141
29456
  init_Typography();
29142
29457
  init_useEventBus();
29458
+ init_useTranslate();
29143
29459
  UploadDropZone = ({
29144
29460
  accept,
29145
29461
  maxSize,
29146
29462
  maxFiles = 1,
29147
- label = "Drop files here or click to browse",
29463
+ label,
29148
29464
  description,
29149
29465
  disabled = false,
29150
29466
  action,
@@ -29152,22 +29468,24 @@ var init_UploadDropZone = __esm({
29152
29468
  onFiles,
29153
29469
  className
29154
29470
  }) => {
29471
+ const { t } = useTranslate();
29472
+ const resolvedLabel = label ?? t("upload.dropOrBrowse");
29155
29473
  const [isDragOver, setIsDragOver] = useState(false);
29156
29474
  const [error, setError] = useState(null);
29157
29475
  const inputRef = useRef(null);
29158
29476
  const eventBus = useSafeEventBus7();
29159
29477
  const defaultDescription = [
29160
- accept ? `Accepted: ${accept}` : null,
29161
- maxSize ? `Max size: ${formatFileSize(maxSize)}` : null,
29162
- maxFiles > 1 ? `Up to ${maxFiles} files` : null
29478
+ accept ? t("upload.accepted", { accept }) : null,
29479
+ maxSize ? t("upload.maxSize", { size: formatFileSize(maxSize) }) : null,
29480
+ maxFiles > 1 ? t("upload.maxFiles", { count: maxFiles }) : null
29163
29481
  ].filter(Boolean).join(". ");
29164
29482
  const validateFiles = useCallback(
29165
29483
  (files) => {
29166
29484
  if (files.length > maxFiles) {
29167
- return { valid: [], error: `Maximum ${maxFiles} file${maxFiles > 1 ? "s" : ""} allowed` };
29485
+ return { valid: [], error: t("upload.error.maxFiles", { count: maxFiles }) };
29168
29486
  }
29169
29487
  if (accept) {
29170
- const acceptedTypes = accept.split(",").map((t) => t.trim());
29488
+ const acceptedTypes = accept.split(",").map((s) => s.trim());
29171
29489
  const invalid = files.filter((file) => {
29172
29490
  return !acceptedTypes.some((type) => {
29173
29491
  if (type.endsWith("/*")) {
@@ -29177,7 +29495,7 @@ var init_UploadDropZone = __esm({
29177
29495
  });
29178
29496
  });
29179
29497
  if (invalid.length > 0) {
29180
- return { valid: [], error: `Invalid file type: ${invalid[0].name}` };
29498
+ return { valid: [], error: t("upload.error.invalidType", { name: invalid[0].name }) };
29181
29499
  }
29182
29500
  }
29183
29501
  if (maxSize) {
@@ -29185,13 +29503,13 @@ var init_UploadDropZone = __esm({
29185
29503
  if (tooLarge.length > 0) {
29186
29504
  return {
29187
29505
  valid: [],
29188
- error: `File too large: ${tooLarge[0].name} (max ${formatFileSize(maxSize)})`
29506
+ error: t("upload.error.tooLarge", { name: tooLarge[0].name, size: formatFileSize(maxSize) })
29189
29507
  };
29190
29508
  }
29191
29509
  }
29192
29510
  return { valid: files, error: null };
29193
29511
  },
29194
- [accept, maxSize, maxFiles]
29512
+ [accept, maxSize, maxFiles, t]
29195
29513
  );
29196
29514
  const handleFiles = useCallback(
29197
29515
  (files) => {
@@ -29262,7 +29580,7 @@ var init_UploadDropZone = __esm({
29262
29580
  handleClick();
29263
29581
  }
29264
29582
  },
29265
- "aria-label": label,
29583
+ "aria-label": resolvedLabel,
29266
29584
  children: [
29267
29585
  /* @__PURE__ */ jsx(
29268
29586
  "input",
@@ -29278,7 +29596,7 @@ var init_UploadDropZone = __esm({
29278
29596
  }
29279
29597
  ),
29280
29598
  error ? /* @__PURE__ */ jsx(Icon, { name: "file-warning", size: "lg", className: "text-error mb-2" }) : /* @__PURE__ */ jsx(Icon, { name: "upload", size: "lg", className: "text-muted-foreground mb-2" }),
29281
- /* @__PURE__ */ jsx(Typography, { variant: "body1", className: "text-center font-medium mb-1", children: isDragOver ? "Drop files here" : label }),
29599
+ /* @__PURE__ */ jsx(Typography, { variant: "body1", className: "text-center font-medium mb-1", children: isDragOver ? t("upload.dropFilesHere") : resolvedLabel }),
29282
29600
  error ? /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "error", className: "text-center", children: error }) : /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "text-center", children: description ?? defaultDescription })
29283
29601
  ]
29284
29602
  }
@@ -29700,7 +30018,7 @@ function TableView({
29700
30018
  {
29701
30019
  checked: selected.has(id),
29702
30020
  onChange: () => toggleRow(id),
29703
- "aria-label": `Select row ${id}`
30021
+ "aria-label": t("table.selectRow", { id })
29704
30022
  }
29705
30023
  ) }),
29706
30024
  hasRenderProp ? /* @__PURE__ */ jsx(Box, { className: "flex-1 min-w-0", children: children(row, index) }) : colDefs.map((col) => {
@@ -32547,7 +32865,7 @@ var init_QrScanner = __esm({
32547
32865
  className: "inset-0 flex-col items-center justify-center gap-2 bg-black bg-opacity-80 text-center",
32548
32866
  children: [
32549
32867
  /* @__PURE__ */ jsx(Icon, { name: "camera", className: "h-8 w-8 text-white", "aria-hidden": "true" }),
32550
- /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "text-white", children: "Camera unavailable" }),
32868
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "text-white", children: t("qrScanner.cameraUnavailable") }),
32551
32869
  /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-white opacity-70", children: cameraError.message })
32552
32870
  ]
32553
32871
  }
@@ -32558,7 +32876,7 @@ var init_QrScanner = __esm({
32558
32876
  position: "absolute",
32559
32877
  display: "flex",
32560
32878
  className: "inset-0 items-center justify-center bg-black bg-opacity-60",
32561
- children: /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "text-white", children: "Paused" })
32879
+ children: /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "text-white", children: t("qrScanner.paused") })
32562
32880
  }
32563
32881
  ),
32564
32882
  showCameraControls && /* @__PURE__ */ jsxs(
@@ -32577,7 +32895,7 @@ var init_QrScanner = __esm({
32577
32895
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
32578
32896
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
32579
32897
  ),
32580
- "aria-label": isPaused ? "Resume scanning" : "Pause scanning",
32898
+ "aria-label": isPaused ? t("qrScanner.resumeScanning") : t("qrScanner.pauseScanning"),
32581
32899
  children: isPaused ? /* @__PURE__ */ jsx(Icon, { name: "play", className: "h-4 w-4" }) : /* @__PURE__ */ jsx(Icon, { name: "pause", className: "h-4 w-4" })
32582
32900
  }
32583
32901
  ),
@@ -32590,7 +32908,7 @@ var init_QrScanner = __esm({
32590
32908
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
32591
32909
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
32592
32910
  ),
32593
- "aria-label": `Switch to ${currentFacing === "environment" ? "front" : "rear"} camera`,
32911
+ "aria-label": currentFacing === "environment" ? t("qrScanner.switchToFrontCamera") : t("qrScanner.switchToRearCamera"),
32594
32912
  children: /* @__PURE__ */ jsx(Icon, { name: "refresh-cw", className: "h-4 w-4" })
32595
32913
  }
32596
32914
  ),
@@ -32604,7 +32922,7 @@ var init_QrScanner = __esm({
32604
32922
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
32605
32923
  ),
32606
32924
  "aria-label": t("aria.mockScanDev"),
32607
- children: "Mock Scan"
32925
+ children: t("qrScanner.mockScan")
32608
32926
  }
32609
32927
  )
32610
32928
  ]
@@ -32622,6 +32940,7 @@ var init_OptionConstraintGroup = __esm({
32622
32940
  "components/core/molecules/OptionConstraintGroup.tsx"() {
32623
32941
  init_cn();
32624
32942
  init_useEventBus();
32943
+ init_useTranslate();
32625
32944
  init_Typography();
32626
32945
  init_Box();
32627
32946
  init_Label();
@@ -32631,36 +32950,36 @@ var init_OptionConstraintGroup = __esm({
32631
32950
  const sign = delta >= 0 ? "+" : "-";
32632
32951
  return `${sign}$${Math.abs(delta).toFixed(2)}`;
32633
32952
  };
32634
- constraintHint = (constraint) => {
32953
+ constraintHint = (constraint, t) => {
32635
32954
  if (constraint.type === "single") {
32636
- return constraint.required ? "Required, pick 1" : "Optional, pick up to 1";
32955
+ return constraint.required ? t("optionConstraint.requiredOne") : t("optionConstraint.optionalOne");
32637
32956
  }
32638
32957
  const { min, max } = constraint;
32639
32958
  if (min && max) {
32640
- return min === max ? `Pick exactly ${min}` : `Pick ${min}-${max}`;
32959
+ return min === max ? t("optionConstraint.pickExactly", { count: min }) : t("optionConstraint.pickRange", { min, max });
32641
32960
  }
32642
- if (min) return `Pick at least ${min}`;
32643
- if (max) return `Pick up to ${max}`;
32644
- return "Optional";
32961
+ if (min) return t("optionConstraint.pickAtLeast", { count: min });
32962
+ if (max) return t("optionConstraint.pickUpTo", { count: max });
32963
+ return t("optionConstraint.optional");
32645
32964
  };
32646
- validateSelection = (selected, constraint) => {
32965
+ validateSelection = (selected, constraint, t) => {
32647
32966
  if (constraint.type === "single") {
32648
32967
  if (constraint.required && selected.length === 0) {
32649
- return "Pick 1 option";
32968
+ return t("optionConstraint.error.pickOne");
32650
32969
  }
32651
32970
  if (selected.length > 1) {
32652
- return "Pick only 1 option";
32971
+ return t("optionConstraint.error.pickOnlyOne");
32653
32972
  }
32654
32973
  return void 0;
32655
32974
  }
32656
32975
  const { min, max } = constraint;
32657
32976
  if (min !== void 0 && selected.length < min) {
32658
32977
  const remaining = min - selected.length;
32659
- return `Pick at least ${remaining} more`;
32978
+ return t("optionConstraint.error.pickMore", { count: remaining });
32660
32979
  }
32661
32980
  if (max !== void 0 && selected.length > max) {
32662
32981
  const excess = selected.length - max;
32663
- return `Remove ${excess} option${excess === 1 ? "" : "s"}`;
32982
+ return t("optionConstraint.error.removeOptions", { count: excess });
32664
32983
  }
32665
32984
  return void 0;
32666
32985
  };
@@ -32677,8 +32996,9 @@ var init_OptionConstraintGroup = __esm({
32677
32996
  className
32678
32997
  }) => {
32679
32998
  const eventBus = useEventBus();
32680
- const hint = constraintHint(constraint);
32681
- const error = validateSelection(selected, constraint);
32999
+ const { t } = useTranslate();
33000
+ const hint = constraintHint(constraint, t);
33001
+ const error = validateSelection(selected, constraint, t);
32682
33002
  const inputName = `option-${groupId}`;
32683
33003
  const labelTextSize = size === "sm" ? "text-sm" : "text-base";
32684
33004
  const optionGap = size === "sm" ? "gap-2" : "gap-2.5";
@@ -32778,7 +33098,7 @@ var init_OptionConstraintGroup = __esm({
32778
33098
  variant: "caption",
32779
33099
  color: "warning",
32780
33100
  className: "rounded border border-warning/40 px-1.5 py-0.5",
32781
- children: "Out of stock"
33101
+ children: t("optionConstraint.outOfStock")
32782
33102
  }
32783
33103
  )
32784
33104
  ]
@@ -33100,6 +33420,7 @@ function changeBlockType(block, type) {
33100
33420
  return { id: block.id, type, content: seed };
33101
33421
  }
33102
33422
  function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33423
+ const { t } = useTranslate();
33103
33424
  const [open, setOpen] = useState(false);
33104
33425
  const ref = useRef(null);
33105
33426
  useEffect(() => {
@@ -33119,7 +33440,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33119
33440
  {
33120
33441
  type: "button",
33121
33442
  variant: "ghost",
33122
- "aria-label": "Block actions",
33443
+ "aria-label": t("richBlockEditor.blockActions"),
33123
33444
  className: cn(
33124
33445
  "inline-flex items-center justify-center",
33125
33446
  "h-6 w-6 rounded-sm p-0 gap-0",
@@ -33141,7 +33462,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33141
33462
  "py-1 text-sm"
33142
33463
  ),
33143
33464
  children: [
33144
- /* @__PURE__ */ jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: BLOCK_TYPE_LABEL[block.type] }),
33465
+ /* @__PURE__ */ jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: t(BLOCK_TYPE_LABEL_KEY[block.type]) }),
33145
33466
  /* @__PURE__ */ jsxs(
33146
33467
  Button,
33147
33468
  {
@@ -33155,7 +33476,8 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33155
33476
  },
33156
33477
  children: [
33157
33478
  /* @__PURE__ */ jsx(Icon, { name: "plus", className: "w-3.5 h-3.5" }),
33158
- " Duplicate"
33479
+ " ",
33480
+ t("richBlockEditor.duplicate")
33159
33481
  ]
33160
33482
  }
33161
33483
  ),
@@ -33172,14 +33494,15 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33172
33494
  },
33173
33495
  children: [
33174
33496
  /* @__PURE__ */ jsx(Icon, { name: "trash", className: "w-3.5 h-3.5" }),
33175
- " Delete"
33497
+ " ",
33498
+ t("common.delete")
33176
33499
  ]
33177
33500
  }
33178
33501
  ),
33179
33502
  CHANGEABLE_TYPES.includes(block.type) && /* @__PURE__ */ jsxs(Fragment, { children: [
33180
33503
  /* @__PURE__ */ jsx(Box, { className: "my-1 border-t border-border" }),
33181
- /* @__PURE__ */ jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: "Turn into" }),
33182
- CHANGEABLE_TYPES.filter((t) => t !== block.type).map((t) => /* @__PURE__ */ jsx(
33504
+ /* @__PURE__ */ jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: t("richBlockEditor.turnInto") }),
33505
+ CHANGEABLE_TYPES.filter((bt) => bt !== block.type).map((bt) => /* @__PURE__ */ jsx(
33183
33506
  Button,
33184
33507
  {
33185
33508
  type: "button",
@@ -33187,12 +33510,12 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
33187
33510
  role: "menuitem",
33188
33511
  className: "flex w-full items-center gap-2 px-2 py-1.5 text-left justify-start rounded-none",
33189
33512
  onClick: () => {
33190
- onChangeType(t);
33513
+ onChangeType(bt);
33191
33514
  setOpen(false);
33192
33515
  },
33193
- children: BLOCK_TYPE_LABEL[t]
33516
+ children: t(BLOCK_TYPE_LABEL_KEY[bt])
33194
33517
  },
33195
- t
33518
+ bt
33196
33519
  ))
33197
33520
  ] })
33198
33521
  ]
@@ -33254,6 +33577,7 @@ function BlockRow({
33254
33577
  onInsertAfter,
33255
33578
  onChangeType
33256
33579
  }) {
33580
+ const { t } = useTranslate();
33257
33581
  const setContent = useCallback(
33258
33582
  (next) => onUpdate((b) => ({ ...b, content: next })),
33259
33583
  [onUpdate]
@@ -33303,8 +33627,8 @@ function BlockRow({
33303
33627
  tag: "h1",
33304
33628
  value: block.content ?? "",
33305
33629
  readOnly,
33306
- placeholder: placeholder ?? "Heading 1",
33307
- ariaLabel: "Heading 1 block",
33630
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading1"),
33631
+ ariaLabel: t("richBlockEditor.aria.heading1Block"),
33308
33632
  className: "text-3xl font-bold leading-tight",
33309
33633
  onValueChange: setContent
33310
33634
  }
@@ -33316,8 +33640,8 @@ function BlockRow({
33316
33640
  tag: "h2",
33317
33641
  value: block.content ?? "",
33318
33642
  readOnly,
33319
- placeholder: placeholder ?? "Heading 2",
33320
- ariaLabel: "Heading 2 block",
33643
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading2"),
33644
+ ariaLabel: t("richBlockEditor.aria.heading2Block"),
33321
33645
  className: "text-2xl font-semibold leading-tight",
33322
33646
  onValueChange: setContent
33323
33647
  }
@@ -33329,8 +33653,8 @@ function BlockRow({
33329
33653
  tag: "h3",
33330
33654
  value: block.content ?? "",
33331
33655
  readOnly,
33332
- placeholder: placeholder ?? "Heading 3",
33333
- ariaLabel: "Heading 3 block",
33656
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading3"),
33657
+ ariaLabel: t("richBlockEditor.aria.heading3Block"),
33334
33658
  className: "text-xl font-semibold leading-tight",
33335
33659
  onValueChange: setContent
33336
33660
  }
@@ -33342,8 +33666,8 @@ function BlockRow({
33342
33666
  tag: "blockquote",
33343
33667
  value: block.content ?? "",
33344
33668
  readOnly,
33345
- placeholder: placeholder ?? "Quote",
33346
- ariaLabel: "Quote block",
33669
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.quote"),
33670
+ ariaLabel: t("richBlockEditor.aria.quoteBlock"),
33347
33671
  className: "border-l-4 border-primary/60 pl-4 italic text-muted-foreground",
33348
33672
  onValueChange: setContent
33349
33673
  }
@@ -33351,13 +33675,13 @@ function BlockRow({
33351
33675
  case "code":
33352
33676
  return /* @__PURE__ */ jsxs(Box, { className: "rounded-md border border-border bg-muted/40", children: [
33353
33677
  /* @__PURE__ */ jsxs(Box, { className: "flex items-center justify-between border-b border-border px-3 py-1 text-xs text-muted-foreground", children: [
33354
- /* @__PURE__ */ jsx(Typography, { as: "span", variant: "caption", className: "uppercase tracking-wide", children: "Code" }),
33678
+ /* @__PURE__ */ jsx(Typography, { as: "span", variant: "caption", className: "uppercase tracking-wide", children: t("richBlockEditor.blockType.code") }),
33355
33679
  !readOnly && /* @__PURE__ */ jsx(
33356
33680
  Input,
33357
33681
  {
33358
33682
  inputType: "text",
33359
33683
  value: String(block.metadata?.language ?? "plaintext"),
33360
- "aria-label": "Code language",
33684
+ "aria-label": t("richBlockEditor.aria.codeLanguage"),
33361
33685
  className: cn(
33362
33686
  "h-6 w-32 rounded-sm border border-border bg-background",
33363
33687
  "px-2 text-xs outline-none focus:ring-1 focus:ring-ring"
@@ -33373,8 +33697,8 @@ function BlockRow({
33373
33697
  tag: "pre",
33374
33698
  value: block.content ?? "",
33375
33699
  readOnly,
33376
- placeholder: placeholder ?? "Enter code",
33377
- ariaLabel: "Code block",
33700
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.code"),
33701
+ ariaLabel: t("richBlockEditor.aria.codeBlock"),
33378
33702
  className: "block whitespace-pre-wrap p-3 font-mono text-sm leading-relaxed",
33379
33703
  onValueChange: setContent
33380
33704
  }
@@ -33387,7 +33711,7 @@ function BlockRow({
33387
33711
  const caption = String(block.metadata?.caption ?? "");
33388
33712
  const imgProps = {
33389
33713
  src: url,
33390
- alt: caption || "Embedded image",
33714
+ alt: caption || t("richBlockEditor.embeddedImage"),
33391
33715
  className: "max-h-96 w-full rounded-md border border-border object-contain"
33392
33716
  };
33393
33717
  return /* @__PURE__ */ jsxs(Box, { className: "space-y-2", children: [
@@ -33401,7 +33725,8 @@ function BlockRow({
33401
33725
  ),
33402
33726
  children: [
33403
33727
  /* @__PURE__ */ jsx(Icon, { name: "image", className: "mr-2 w-4 h-4" }),
33404
- " No image URL set"
33728
+ " ",
33729
+ t("richBlockEditor.noImageUrl")
33405
33730
  ]
33406
33731
  }
33407
33732
  ),
@@ -33412,7 +33737,7 @@ function BlockRow({
33412
33737
  inputType: "url",
33413
33738
  value: url,
33414
33739
  placeholder: "https://example.com/image.png",
33415
- "aria-label": "Image URL",
33740
+ "aria-label": t("richBlockEditor.aria.imageUrl"),
33416
33741
  className: cn(
33417
33742
  "h-8 flex-1 rounded-sm border border-border bg-background",
33418
33743
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -33425,8 +33750,8 @@ function BlockRow({
33425
33750
  {
33426
33751
  inputType: "text",
33427
33752
  value: caption,
33428
- placeholder: "Caption (optional)",
33429
- "aria-label": "Image caption",
33753
+ placeholder: t("richBlockEditor.placeholder.caption"),
33754
+ "aria-label": t("richBlockEditor.aria.imageCaption"),
33430
33755
  className: cn(
33431
33756
  "h-8 flex-1 rounded-sm border border-border bg-background",
33432
33757
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -33457,8 +33782,8 @@ function BlockRow({
33457
33782
  tag: "span",
33458
33783
  value: child.content ?? "",
33459
33784
  readOnly,
33460
- placeholder: "List item",
33461
- ariaLabel: "List item",
33785
+ placeholder: t("richBlockEditor.placeholder.listItem"),
33786
+ ariaLabel: t("richBlockEditor.aria.listItem"),
33462
33787
  className: "inline-block min-w-[1ch] flex-1",
33463
33788
  onValueChange: (next) => setChildContent(child.id, next)
33464
33789
  }
@@ -33468,7 +33793,7 @@ function BlockRow({
33468
33793
  {
33469
33794
  type: "button",
33470
33795
  variant: "ghost",
33471
- "aria-label": "Remove list item",
33796
+ "aria-label": t("richBlockEditor.aria.removeListItem"),
33472
33797
  className: cn(
33473
33798
  "h-5 w-5 shrink-0 rounded-sm text-muted-foreground p-0 gap-0",
33474
33799
  "opacity-0 group-hover/item:opacity-100 hover:bg-muted hover:text-foreground"
@@ -33490,7 +33815,8 @@ function BlockRow({
33490
33815
  onClick: addListItem,
33491
33816
  children: [
33492
33817
  /* @__PURE__ */ jsx(Icon, { name: "plus", className: "w-3 h-3" }),
33493
- " Add item"
33818
+ " ",
33819
+ t("richBlockEditor.addItem")
33494
33820
  ]
33495
33821
  }
33496
33822
  ) })
@@ -33506,8 +33832,8 @@ function BlockRow({
33506
33832
  tag: "p",
33507
33833
  value: block.content ?? "",
33508
33834
  readOnly,
33509
- placeholder: placeholder ?? "Start writing...",
33510
- ariaLabel: "Paragraph block",
33835
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.paragraph"),
33836
+ ariaLabel: t("richBlockEditor.aria.paragraphBlock"),
33511
33837
  className: "leading-7",
33512
33838
  onValueChange: setContent
33513
33839
  }
@@ -33530,7 +33856,7 @@ function BlockRow({
33530
33856
  {
33531
33857
  type: "button",
33532
33858
  variant: "ghost",
33533
- "aria-label": "Insert paragraph below",
33859
+ "aria-label": t("richBlockEditor.insertParagraphBelow"),
33534
33860
  className: cn(
33535
33861
  "inline-flex h-6 w-6 items-center justify-center rounded-sm p-0 gap-0",
33536
33862
  "text-muted-foreground hover:bg-muted hover:text-foreground",
@@ -33557,7 +33883,7 @@ function BlockRow({
33557
33883
  }
33558
33884
  );
33559
33885
  }
33560
- var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES, RichBlockEditor;
33886
+ var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL_KEY, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES, RichBlockEditor;
33561
33887
  var init_RichBlockEditor = __esm({
33562
33888
  "components/core/molecules/RichBlockEditor.tsx"() {
33563
33889
  "use client";
@@ -33570,29 +33896,30 @@ var init_RichBlockEditor = __esm({
33570
33896
  init_Input();
33571
33897
  init_Icon();
33572
33898
  init_useEventBus();
33899
+ init_useTranslate();
33573
33900
  TOOLBAR_ENTRIES = [
33574
- { type: "paragraph", label: "Text", icon: Type },
33575
- { type: "heading-1", label: "H1", icon: Heading1 },
33576
- { type: "heading-2", label: "H2", icon: Heading2 },
33577
- { type: "heading-3", label: "H3", icon: Heading3 },
33578
- { type: "bullet-list", label: "Bullet list", icon: List },
33579
- { type: "numbered-list", label: "Numbered", icon: ListOrdered },
33580
- { type: "quote", label: "Quote", icon: Quote },
33581
- { type: "code", label: "Code", icon: Code },
33582
- { type: "divider", label: "Divider", icon: Minus },
33583
- { type: "image", label: "Image", icon: Image$1 }
33901
+ { type: "paragraph", labelKey: "richBlockEditor.toolbar.text", icon: Type },
33902
+ { type: "heading-1", labelKey: "richBlockEditor.toolbar.h1", icon: Heading1 },
33903
+ { type: "heading-2", labelKey: "richBlockEditor.toolbar.h2", icon: Heading2 },
33904
+ { type: "heading-3", labelKey: "richBlockEditor.toolbar.h3", icon: Heading3 },
33905
+ { type: "bullet-list", labelKey: "richBlockEditor.toolbar.bulletList", icon: List },
33906
+ { type: "numbered-list", labelKey: "richBlockEditor.toolbar.numbered", icon: ListOrdered },
33907
+ { type: "quote", labelKey: "richBlockEditor.toolbar.quote", icon: Quote },
33908
+ { type: "code", labelKey: "richBlockEditor.toolbar.code", icon: Code },
33909
+ { type: "divider", labelKey: "richBlockEditor.toolbar.divider", icon: Minus },
33910
+ { type: "image", labelKey: "richBlockEditor.toolbar.image", icon: Image$1 }
33584
33911
  ];
33585
- BLOCK_TYPE_LABEL = {
33586
- paragraph: "Text",
33587
- "heading-1": "Heading 1",
33588
- "heading-2": "Heading 2",
33589
- "heading-3": "Heading 3",
33590
- "bullet-list": "Bullet list",
33591
- "numbered-list": "Numbered list",
33592
- quote: "Quote",
33593
- code: "Code",
33594
- divider: "Divider",
33595
- image: "Image"
33912
+ BLOCK_TYPE_LABEL_KEY = {
33913
+ paragraph: "richBlockEditor.blockType.paragraph",
33914
+ "heading-1": "richBlockEditor.blockType.heading1",
33915
+ "heading-2": "richBlockEditor.blockType.heading2",
33916
+ "heading-3": "richBlockEditor.blockType.heading3",
33917
+ "bullet-list": "richBlockEditor.blockType.bulletList",
33918
+ "numbered-list": "richBlockEditor.blockType.numberedList",
33919
+ quote: "richBlockEditor.blockType.quote",
33920
+ code: "richBlockEditor.blockType.code",
33921
+ divider: "richBlockEditor.blockType.divider",
33922
+ image: "richBlockEditor.blockType.image"
33596
33923
  };
33597
33924
  CHANGEABLE_TYPES = [
33598
33925
  "paragraph",
@@ -33626,6 +33953,7 @@ var init_RichBlockEditor = __esm({
33626
33953
  showToolbar = true,
33627
33954
  className
33628
33955
  }) => {
33956
+ const { t } = useTranslate();
33629
33957
  const [blocks, setBlocks] = useState(
33630
33958
  () => normalizeBlocks(initialBlocks)
33631
33959
  );
@@ -33697,25 +34025,26 @@ var init_RichBlockEditor = __esm({
33697
34025
  Box,
33698
34026
  {
33699
34027
  role: "toolbar",
33700
- "aria-label": "Block editor toolbar",
34028
+ "aria-label": t("richBlockEditor.editorToolbar"),
33701
34029
  className: cn(
33702
34030
  "flex flex-wrap items-center gap-1",
33703
34031
  "border-b border-border bg-muted/30 px-2 py-2"
33704
34032
  ),
33705
34033
  children: TOOLBAR_ENTRIES.map((entry) => {
33706
34034
  const Icon3 = entry.icon;
34035
+ const entryLabel = t(entry.labelKey);
33707
34036
  return /* @__PURE__ */ jsxs(
33708
34037
  Button,
33709
34038
  {
33710
34039
  type: "button",
33711
34040
  variant: "ghost",
33712
34041
  size: "sm",
33713
- "aria-label": `Insert ${entry.label}`,
33714
- title: entry.label,
34042
+ "aria-label": t("richBlockEditor.insertEntry", { label: entryLabel }),
34043
+ title: entryLabel,
33715
34044
  onClick: () => handleAppend(entry.type),
33716
34045
  children: [
33717
34046
  /* @__PURE__ */ jsx(Icon3, { size: 14 }),
33718
- /* @__PURE__ */ jsx(Typography, { as: "span", variant: "caption", className: "ml-1 hidden text-xs sm:inline", children: entry.label })
34047
+ /* @__PURE__ */ jsx(Typography, { as: "span", variant: "caption", className: "ml-1 hidden text-xs sm:inline", children: entryLabel })
33719
34048
  ]
33720
34049
  },
33721
34050
  entry.type
@@ -33758,6 +34087,7 @@ var init_ReplyTree = __esm({
33758
34087
  "use client";
33759
34088
  init_cn();
33760
34089
  init_useEventBus();
34090
+ init_useTranslate();
33761
34091
  init_atoms2();
33762
34092
  init_VoteStack();
33763
34093
  ReplyTreeNode = ({
@@ -33777,6 +34107,7 @@ var init_ReplyTree = __esm({
33777
34107
  showActions
33778
34108
  }) => {
33779
34109
  const eventBus = useEventBus();
34110
+ const { t } = useTranslate();
33780
34111
  const hasReplies = !!node.replies && node.replies.length > 0;
33781
34112
  const isCollapsed = collapsedSet.has(node.id);
33782
34113
  const atMaxDepth = depth >= maxDepth;
@@ -33823,7 +34154,7 @@ var init_ReplyTree = __esm({
33823
34154
  variant: "ghost",
33824
34155
  size: "sm",
33825
34156
  onClick: handleToggle,
33826
- "aria-label": isCollapsed ? "Expand replies" : "Collapse replies",
34157
+ "aria-label": isCollapsed ? t("replyTree.expandReplies") : t("replyTree.collapseReplies"),
33827
34158
  "aria-expanded": !isCollapsed,
33828
34159
  leftIcon: isCollapsed ? "chevron-right" : "chevron-down",
33829
34160
  className: cn(
@@ -33864,7 +34195,7 @@ var init_ReplyTree = __esm({
33864
34195
  onVote: handleVote,
33865
34196
  size: "sm",
33866
34197
  variant: "horizontal",
33867
- label: `Vote on reply by ${node.authorName}`
34198
+ label: t("replyTree.voteOnReplyBy", { author: node.authorName })
33868
34199
  }
33869
34200
  ),
33870
34201
  /* @__PURE__ */ jsx(
@@ -33874,8 +34205,8 @@ var init_ReplyTree = __esm({
33874
34205
  size: "sm",
33875
34206
  leftIcon: "message-square",
33876
34207
  onClick: handleReply,
33877
- "aria-label": `Reply to ${node.authorName}`,
33878
- children: "Reply"
34208
+ "aria-label": t("replyTree.replyTo", { author: node.authorName }),
34209
+ children: t("replyTree.reply")
33879
34210
  }
33880
34211
  ),
33881
34212
  /* @__PURE__ */ jsx(
@@ -33885,8 +34216,8 @@ var init_ReplyTree = __esm({
33885
34216
  size: "sm",
33886
34217
  leftIcon: "flag",
33887
34218
  onClick: handleFlag,
33888
- "aria-label": `Flag reply by ${node.authorName}`,
33889
- children: "Flag"
34219
+ "aria-label": t("replyTree.flagReplyBy", { author: node.authorName }),
34220
+ children: t("replyTree.flag")
33890
34221
  }
33891
34222
  )
33892
34223
  ] }),
@@ -33897,9 +34228,9 @@ var init_ReplyTree = __esm({
33897
34228
  inputType: "textarea",
33898
34229
  rows: 2,
33899
34230
  value: draft,
33900
- placeholder: `Reply to ${node.authorName}\u2026`,
34231
+ placeholder: t("replyTree.replyToPlaceholder", { author: node.authorName }),
33901
34232
  onChange: (e) => setDraft(e.target.value),
33902
- "aria-label": `Reply to ${node.authorName}`
34233
+ "aria-label": t("replyTree.replyTo", { author: node.authorName })
33903
34234
  }
33904
34235
  ),
33905
34236
  /* @__PURE__ */ jsxs(Box, { className: "flex flex-row gap-2 items-center", children: [
@@ -33911,10 +34242,10 @@ var init_ReplyTree = __esm({
33911
34242
  leftIcon: "send",
33912
34243
  onClick: handleSubmitReply,
33913
34244
  disabled: !draft.trim(),
33914
- children: "Send"
34245
+ children: t("replyTree.send")
33915
34246
  }
33916
34247
  ),
33917
- /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: "Cancel" })
34248
+ /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: t("common.cancel") })
33918
34249
  ] })
33919
34250
  ] }),
33920
34251
  hasReplies && !isCollapsed && (atMaxDepth ? /* @__PURE__ */ jsx(
@@ -33928,7 +34259,7 @@ var init_ReplyTree = __esm({
33928
34259
  "self-start gap-1 px-0 h-auto",
33929
34260
  "text-sm text-primary hover:underline hover:bg-transparent"
33930
34261
  ),
33931
- children: "Continue thread"
34262
+ children: t("replyTree.continueThread")
33932
34263
  }
33933
34264
  ) : /* @__PURE__ */ jsx(Box, { className: "flex flex-col gap-2 mt-1", children: node.replies.map((child) => /* @__PURE__ */ jsx(
33934
34265
  ReplyTreeNode,
@@ -33967,6 +34298,7 @@ var init_ReplyTree = __esm({
33967
34298
  showActions = true,
33968
34299
  className
33969
34300
  }) => {
34301
+ const { t } = useTranslate();
33970
34302
  const nodeList = Array.isArray(nodes) ? nodes : nodes ? [nodes] : [];
33971
34303
  const [collapsedSet, setCollapsedSet] = useState(() => {
33972
34304
  const acc = /* @__PURE__ */ new Set();
@@ -33985,7 +34317,7 @@ var init_ReplyTree = __esm({
33985
34317
  });
33986
34318
  }, []);
33987
34319
  if (nodeList.length === 0) {
33988
- return /* @__PURE__ */ jsx(Box, { className: cn("text-sm text-muted-foreground", className), children: "No replies yet." });
34320
+ return /* @__PURE__ */ jsx(Box, { className: cn("text-sm text-muted-foreground", className), children: t("replyTree.noRepliesYet") });
33989
34321
  }
33990
34322
  return /* @__PURE__ */ jsx(Box, { className: cn("flex flex-col gap-2 min-w-0", className), children: nodeList.map((node) => /* @__PURE__ */ jsx(
33991
34323
  ReplyTreeNode,
@@ -34063,6 +34395,7 @@ var init_VersionDiff = __esm({
34063
34395
  "use client";
34064
34396
  init_cn();
34065
34397
  init_useEventBus();
34398
+ init_useTranslate();
34066
34399
  init_atoms2();
34067
34400
  init_Stack();
34068
34401
  INLINE_STYLES = {
@@ -34085,6 +34418,7 @@ var init_VersionDiff = __esm({
34085
34418
  language,
34086
34419
  className
34087
34420
  }) => {
34421
+ const { t } = useTranslate();
34088
34422
  const eventBus = useEventBus();
34089
34423
  const revisions = Array.isArray(revisionsProp) ? revisionsProp : [];
34090
34424
  const fallbackBefore = revisions[0]?.id ?? "";
@@ -34166,24 +34500,24 @@ var init_VersionDiff = __esm({
34166
34500
  children: [
34167
34501
  /* @__PURE__ */ jsxs(HStack, { gap: "sm", align: "center", className: "flex-wrap", children: [
34168
34502
  /* @__PURE__ */ jsx(Icon, { name: "git-commit", size: "sm", className: "text-muted-foreground" }),
34169
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "whitespace-nowrap", children: "Compare" }),
34503
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "whitespace-nowrap", children: t("versionDiff.compare") }),
34170
34504
  /* @__PURE__ */ jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsx(
34171
34505
  Select,
34172
34506
  {
34173
34507
  options,
34174
34508
  value: activeBeforeId,
34175
34509
  onChange: handleBeforeChange,
34176
- "aria-label": "Before revision"
34510
+ "aria-label": t("versionDiff.beforeRevision")
34177
34511
  }
34178
34512
  ) }),
34179
- /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: "to" }),
34513
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: t("versionDiff.to") }),
34180
34514
  /* @__PURE__ */ jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsx(
34181
34515
  Select,
34182
34516
  {
34183
34517
  options,
34184
34518
  value: activeAfterId,
34185
34519
  onChange: handleAfterChange,
34186
- "aria-label": "After revision"
34520
+ "aria-label": t("versionDiff.afterRevision")
34187
34521
  }
34188
34522
  ) }),
34189
34523
  language && /* @__PURE__ */ jsx(Badge, { variant: "default", children: language }),
@@ -34204,7 +34538,7 @@ var init_VersionDiff = __esm({
34204
34538
  size: "sm",
34205
34539
  icon: activeView === "side-by-side" ? "align-left" : "columns",
34206
34540
  onClick: handleViewToggle,
34207
- "aria-label": activeView === "side-by-side" ? "Switch to inline view" : "Switch to side-by-side view"
34541
+ "aria-label": activeView === "side-by-side" ? t("versionDiff.switchToInline") : t("versionDiff.switchToSideBySide")
34208
34542
  }
34209
34543
  ),
34210
34544
  (onRevert || revertEvent) && /* @__PURE__ */ jsx(
@@ -34214,7 +34548,7 @@ var init_VersionDiff = __esm({
34214
34548
  size: "sm",
34215
34549
  icon: "rotate-ccw",
34216
34550
  onClick: handleRevert,
34217
- children: "Revert"
34551
+ children: t("versionDiff.revert")
34218
34552
  }
34219
34553
  )
34220
34554
  ] })
@@ -34231,12 +34565,12 @@ var init_VersionDiff = __esm({
34231
34565
  children: [
34232
34566
  /* @__PURE__ */ jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
34233
34567
  beforeRev?.label,
34234
- beforeRev?.author ? ` by ${beforeRev.author}` : "",
34568
+ beforeRev?.author ? t("versionDiff.byAuthor", { author: beforeRev.author }) : "",
34235
34569
  beforeRev?.timestamp ? ` (${beforeRev.timestamp})` : ""
34236
34570
  ] }),
34237
34571
  /* @__PURE__ */ jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
34238
34572
  afterRev?.label,
34239
- afterRev?.author ? ` by ${afterRev.author}` : "",
34573
+ afterRev?.author ? t("versionDiff.byAuthor", { author: afterRev.author }) : "",
34240
34574
  afterRev?.timestamp ? ` (${afterRev.timestamp})` : ""
34241
34575
  ] })
34242
34576
  ]
@@ -34629,10 +34963,12 @@ var init_DocPagination = __esm({
34629
34963
  }
34630
34964
  });
34631
34965
  function DocSearch({
34632
- placeholder = "Search documentation...",
34966
+ placeholder,
34633
34967
  onSearch,
34634
34968
  className
34635
34969
  }) {
34970
+ const { t } = useTranslate();
34971
+ const resolvedPlaceholder = placeholder ?? t("docSearch.placeholder");
34636
34972
  const [query, setQuery] = useState("");
34637
34973
  const [results, setResults] = useState([]);
34638
34974
  const [isOpen, setIsOpen] = useState(false);
@@ -34739,7 +35075,7 @@ function DocSearch({
34739
35075
  Input,
34740
35076
  {
34741
35077
  inputType: "search",
34742
- placeholder,
35078
+ placeholder: resolvedPlaceholder,
34743
35079
  value: query,
34744
35080
  onChange: handleChange,
34745
35081
  onFocus: handleFocus,
@@ -34804,6 +35140,7 @@ var init_DocSearch = __esm({
34804
35140
  init_Typography();
34805
35141
  init_Icon();
34806
35142
  init_Input();
35143
+ init_useTranslate();
34807
35144
  }
34808
35145
  });
34809
35146
  var DocSidebarCategory, DocSidebar;
@@ -36808,8 +37145,8 @@ var init_SignaturePad = __esm({
36808
37145
  init_useEventBus();
36809
37146
  init_useTranslate();
36810
37147
  SignaturePad = ({
36811
- label = "Signature",
36812
- helperText = "Draw your signature above",
37148
+ label,
37149
+ helperText,
36813
37150
  strokeColor,
36814
37151
  strokeWidth = 2,
36815
37152
  height = 200,
@@ -36825,6 +37162,8 @@ var init_SignaturePad = __esm({
36825
37162
  }) => {
36826
37163
  const eventBus = useEventBus();
36827
37164
  const { t } = useTranslate();
37165
+ const resolvedLabel = label ?? t("signaturePad.label");
37166
+ const resolvedHelperText = helperText ?? t("signaturePad.helperText");
36828
37167
  const canvasRef = useRef(null);
36829
37168
  const [isDrawing, setIsDrawing] = useState(false);
36830
37169
  const [hasSignature, setHasSignature] = useState(!!value);
@@ -36927,7 +37266,7 @@ var init_SignaturePad = __esm({
36927
37266
  );
36928
37267
  }
36929
37268
  return /* @__PURE__ */ jsx(Card, { className: cn("p-4", className), children: /* @__PURE__ */ jsxs(VStack, { gap: "sm", children: [
36930
- label && /* @__PURE__ */ jsx(Typography, { variant: "label", weight: "medium", children: label }),
37269
+ resolvedLabel && /* @__PURE__ */ jsx(Typography, { variant: "label", weight: "medium", children: resolvedLabel }),
36931
37270
  /* @__PURE__ */ jsx(
36932
37271
  Box,
36933
37272
  {
@@ -36956,7 +37295,7 @@ var init_SignaturePad = __esm({
36956
37295
  )
36957
37296
  }
36958
37297
  ),
36959
- helperText && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: helperText }),
37298
+ resolvedHelperText && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: resolvedHelperText }),
36960
37299
  !readOnly && /* @__PURE__ */ jsxs(HStack, { gap: "sm", justify: "end", children: [
36961
37300
  /* @__PURE__ */ jsx(
36962
37301
  Button,
@@ -36966,7 +37305,7 @@ var init_SignaturePad = __esm({
36966
37305
  icon: Eraser,
36967
37306
  onClick: clearSignature,
36968
37307
  disabled: !hasSignature,
36969
- children: "Clear"
37308
+ children: t("signaturePad.clear")
36970
37309
  }
36971
37310
  ),
36972
37311
  signEvent && /* @__PURE__ */ jsx(
@@ -36977,7 +37316,7 @@ var init_SignaturePad = __esm({
36977
37316
  icon: Check,
36978
37317
  onClick: confirmSignature,
36979
37318
  disabled: !hasSignature,
36980
- children: "Confirm"
37319
+ children: t("signaturePad.confirm")
36981
37320
  }
36982
37321
  )
36983
37322
  ] })
@@ -41422,6 +41761,7 @@ function MasterDetail({
41422
41761
  className,
41423
41762
  ...rest
41424
41763
  }) {
41764
+ const { t } = useTranslate();
41425
41765
  const loading = externalLoading ?? false;
41426
41766
  const isLoading = externalIsLoading ?? false;
41427
41767
  const error = externalError ?? null;
@@ -41434,8 +41774,8 @@ function MasterDetail({
41434
41774
  isLoading: loading || isLoading,
41435
41775
  error,
41436
41776
  className,
41437
- emptyTitle: "No items found",
41438
- emptyDescription: "Create your first item to get started.",
41777
+ emptyTitle: t("table.empty.title"),
41778
+ emptyDescription: t("empty.createFirst"),
41439
41779
  ...rest
41440
41780
  }
41441
41781
  );
@@ -41444,6 +41784,7 @@ var init_MasterDetail = __esm({
41444
41784
  "components/core/organisms/MasterDetail.tsx"() {
41445
41785
  "use client";
41446
41786
  init_DataTable();
41787
+ init_useTranslate();
41447
41788
  MasterDetail.displayName = "MasterDetail";
41448
41789
  }
41449
41790
  });
@@ -41452,14 +41793,18 @@ var init_MasterDetailLayout = __esm({
41452
41793
  "components/core/organisms/layout/MasterDetailLayout.tsx"() {
41453
41794
  init_cn();
41454
41795
  init_Typography();
41455
- DefaultEmptyDetail = () => /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsx(
41456
- Typography,
41457
- {
41458
- variant: "body2",
41459
- className: "text-muted-foreground",
41460
- children: "Select an item to view details"
41461
- }
41462
- ) });
41796
+ init_useTranslate();
41797
+ DefaultEmptyDetail = () => {
41798
+ const { t } = useTranslate();
41799
+ return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsx(
41800
+ Typography,
41801
+ {
41802
+ variant: "body2",
41803
+ className: "text-muted-foreground",
41804
+ children: t("masterDetail.selectItem")
41805
+ }
41806
+ ) });
41807
+ };
41463
41808
  MasterDetailLayout = ({
41464
41809
  master,
41465
41810
  detail,
@@ -41586,7 +41931,7 @@ var init_MediaGallery = __esm({
41586
41931
  {
41587
41932
  icon: Image$1,
41588
41933
  title: t("display.noMedia"),
41589
- description: "No media items to display.",
41934
+ description: t("mediaGallery.noMediaDescription"),
41590
41935
  className
41591
41936
  }
41592
41937
  );
@@ -41603,7 +41948,7 @@ var init_MediaGallery = __esm({
41603
41948
  size: "sm",
41604
41949
  icon: Upload,
41605
41950
  action: "MEDIA_UPLOAD",
41606
- children: "Upload"
41951
+ children: t("mediaGallery.upload")
41607
41952
  }
41608
41953
  ),
41609
41954
  actions?.map((action, idx) => /* @__PURE__ */ jsx(
@@ -41617,10 +41962,7 @@ var init_MediaGallery = __esm({
41617
41962
  ))
41618
41963
  ] })
41619
41964
  ] }),
41620
- selectable && selectedItems.length > 0 && /* @__PURE__ */ jsx(HStack, { gap: "sm", align: "center", children: /* @__PURE__ */ jsxs(Badge, { variant: "info", children: [
41621
- selectedItems.length,
41622
- " selected"
41623
- ] }) }),
41965
+ selectable && selectedItems.length > 0 && /* @__PURE__ */ jsx(HStack, { gap: "sm", align: "center", children: /* @__PURE__ */ jsx(Badge, { variant: "info", children: t("table.bulk.selected", { count: selectedItems.length }) }) }),
41624
41966
  /* @__PURE__ */ jsx(
41625
41967
  Box,
41626
41968
  {
@@ -42475,7 +42817,7 @@ function TraitsTab({ traits: traits2 }) {
42475
42817
  EmptyState,
42476
42818
  {
42477
42819
  title: t("debug.noActiveTraits"),
42478
- description: "Traits will appear when components using them are mounted",
42820
+ description: t("debug.traitsMountHint"),
42479
42821
  className: "py-8"
42480
42822
  }
42481
42823
  );
@@ -42485,14 +42827,11 @@ function TraitsTab({ traits: traits2 }) {
42485
42827
  header: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 w-full", children: [
42486
42828
  /* @__PURE__ */ jsx(Typography, { variant: "body", weight: "semibold", className: "text-purple-600 dark:text-purple-400", children: trait.name }),
42487
42829
  /* @__PURE__ */ jsx(Badge, { variant: "success", size: "sm", children: trait.currentState }),
42488
- /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: [
42489
- trait.transitionCount,
42490
- " transitions"
42491
- ] })
42830
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: t("debug.transitionsCount", { count: trait.transitionCount }) })
42492
42831
  ] }),
42493
42832
  content: /* @__PURE__ */ jsxs(Stack, { gap: "sm", children: [
42494
42833
  /* @__PURE__ */ jsxs("div", { children: [
42495
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "States" }),
42834
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.states") }),
42496
42835
  /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: trait.states.map((state) => /* @__PURE__ */ jsx(
42497
42836
  Badge,
42498
42837
  {
@@ -42504,7 +42843,7 @@ function TraitsTab({ traits: traits2 }) {
42504
42843
  )) })
42505
42844
  ] }),
42506
42845
  trait.transitions.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
42507
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Transitions" }),
42846
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.transitions") }),
42508
42847
  /* @__PURE__ */ jsx(Stack, { gap: "xs", children: trait.transitions.map((t2, i) => /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "font-mono", children: [
42509
42848
  t2.from,
42510
42849
  " \u2192 ",
@@ -42523,7 +42862,7 @@ function TraitsTab({ traits: traits2 }) {
42523
42862
  ] }, i)) })
42524
42863
  ] }),
42525
42864
  trait.guards.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
42526
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Guards" }),
42865
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.guards") }),
42527
42866
  /* @__PURE__ */ jsx(Stack, { gap: "xs", children: trait.guards.map((g, i) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
42528
42867
  /* @__PURE__ */ jsx(Typography, { variant: "small", children: g.name }),
42529
42868
  /* @__PURE__ */ jsx(Badge, { variant: g.lastResult === true ? "success" : g.lastResult === false ? "danger" : "default", size: "sm", children: g.lastResult === void 0 ? "?" : g.lastResult ? "\u2713" : "\u2717" })
@@ -42629,7 +42968,7 @@ function EntitiesTab({ snapshot }) {
42629
42968
  EmptyState,
42630
42969
  {
42631
42970
  title: t("debug.noEntityData"),
42632
- description: "Debug mode may not be enabled",
42971
+ description: t("debug.debugModeHint"),
42633
42972
  className: "py-8"
42634
42973
  }
42635
42974
  );
@@ -42642,7 +42981,7 @@ function EntitiesTab({ snapshot }) {
42642
42981
  EmptyState,
42643
42982
  {
42644
42983
  title: t("debug.noEntities"),
42645
- description: "Entities will appear when spawned",
42984
+ description: t("debug.entitiesSpawnHint"),
42646
42985
  className: "py-8"
42647
42986
  }
42648
42987
  );
@@ -42650,7 +42989,7 @@ function EntitiesTab({ snapshot }) {
42650
42989
  const singletonItems = singletonEntries.map(([name, data]) => ({
42651
42990
  id: `singleton-${name}`,
42652
42991
  header: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
42653
- /* @__PURE__ */ jsx(Badge, { variant: "primary", size: "sm", children: "Singleton" }),
42992
+ /* @__PURE__ */ jsx(Badge, { variant: "primary", size: "sm", children: t("debug.singleton") }),
42654
42993
  /* @__PURE__ */ jsx(Typography, { variant: "body", weight: "semibold", className: "text-sky-600 dark:text-sky-400", children: name })
42655
42994
  ] }),
42656
42995
  content: /* @__PURE__ */ jsx("pre", { className: "text-xs text-gray-600 dark:text-gray-400 bg-gray-50 dark:bg-gray-800 p-2 rounded overflow-auto max-h-40", children: JSON.stringify(data, null, 2) })
@@ -42668,31 +43007,19 @@ function EntitiesTab({ snapshot }) {
42668
43007
  }));
42669
43008
  return /* @__PURE__ */ jsxs("div", { className: "debug-tab debug-tab--entities", children: [
42670
43009
  singletonItems.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
42671
- /* @__PURE__ */ jsxs(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
42672
- "Singletons (",
42673
- singletonItems.length,
42674
- ")"
42675
- ] }),
43010
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.singletonsCount", { count: singletonItems.length }) }),
42676
43011
  /* @__PURE__ */ jsx(Accordion, { items: singletonItems, multiple: true })
42677
43012
  ] }),
42678
43013
  runtimeItems.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
42679
- /* @__PURE__ */ jsxs(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
42680
- "Runtime (",
42681
- runtimeEntities.length,
42682
- ")"
42683
- ] }),
43014
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.runtimeCount", { count: runtimeEntities.length }) }),
42684
43015
  /* @__PURE__ */ jsx(Accordion, { items: runtimeItems, multiple: true }),
42685
- runtimeEntities.length > 20 && /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-gray-400 text-center mt-2", children: [
42686
- "+",
42687
- runtimeEntities.length - 20,
42688
- " more entities"
42689
- ] })
43016
+ runtimeEntities.length > 20 && /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-400 text-center mt-2", children: t("debug.moreEntities", { count: runtimeEntities.length - 20 }) })
42690
43017
  ] }),
42691
43018
  persistentEntries.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
42692
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Persistent" }),
43019
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.persistent") }),
42693
43020
  /* @__PURE__ */ jsx(Stack, { gap: "xs", children: persistentEntries.map(([type, info]) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between py-1", children: [
42694
43021
  /* @__PURE__ */ jsx(Typography, { variant: "small", children: type }),
42695
- /* @__PURE__ */ jsx(Badge, { variant: info.loaded ? "success" : "default", size: "sm", children: info.loaded ? `${info.count} loaded` : "not loaded" })
43022
+ /* @__PURE__ */ jsx(Badge, { variant: info.loaded ? "success" : "default", size: "sm", children: info.loaded ? t("debug.loadedCount", { count: info.count }) : t("debug.notLoaded") })
42696
43023
  ] }, type)) })
42697
43024
  ] })
42698
43025
  ] });
@@ -42736,7 +43063,7 @@ function EventFlowTab({ events: events2 }) {
42736
43063
  EmptyState,
42737
43064
  {
42738
43065
  title: t("debug.noEventsYet"),
42739
- description: "Events will appear as traits, ticks, and other systems execute",
43066
+ description: t("debug.eventsExecuteHint"),
42740
43067
  className: "py-8"
42741
43068
  }
42742
43069
  );
@@ -42747,17 +43074,13 @@ function EventFlowTab({ events: events2 }) {
42747
43074
  return /* @__PURE__ */ jsxs("div", { className: "debug-tab debug-tab--events", children: [
42748
43075
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mb-3 flex-wrap", children: [
42749
43076
  /* @__PURE__ */ jsxs(ButtonGroup, { children: [
42750
- /* @__PURE__ */ jsxs(
43077
+ /* @__PURE__ */ jsx(
42751
43078
  Button,
42752
43079
  {
42753
43080
  size: "sm",
42754
43081
  variant: filter === "all" ? "primary" : "secondary",
42755
43082
  onClick: () => setFilter("all"),
42756
- children: [
42757
- "All (",
42758
- events2.length,
42759
- ")"
42760
- ]
43083
+ children: t("debug.allCount", { count: events2.length })
42761
43084
  }
42762
43085
  ),
42763
43086
  eventTypes.map((type) => {
@@ -42787,7 +43110,7 @@ function EventFlowTab({ events: events2 }) {
42787
43110
  onChange: (e) => setAutoScroll(e.target.checked)
42788
43111
  }
42789
43112
  ),
42790
- "Auto-scroll"
43113
+ t("debug.autoScroll")
42791
43114
  ] })
42792
43115
  ] }),
42793
43116
  /* @__PURE__ */ jsx(
@@ -42845,7 +43168,7 @@ function GuardsPanel({ guards }) {
42845
43168
  EmptyState,
42846
43169
  {
42847
43170
  title: t("debug.noGuardEvaluations"),
42848
- description: "Guard evaluations will appear when transitions or ticks with guards execute",
43171
+ description: t("debug.guardEvaluationsHint"),
42849
43172
  className: "py-8"
42850
43173
  }
42851
43174
  );
@@ -42876,15 +43199,15 @@ function GuardsPanel({ guards }) {
42876
43199
  ] }),
42877
43200
  content: /* @__PURE__ */ jsxs(Stack, { gap: "sm", children: [
42878
43201
  /* @__PURE__ */ jsxs("div", { children: [
42879
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Expression" }),
43202
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.expression") }),
42880
43203
  /* @__PURE__ */ jsx("code", { className: "block mt-1 text-xs text-amber-600 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20 px-2 py-1 rounded", children: guard.expression })
42881
43204
  ] }),
42882
43205
  /* @__PURE__ */ jsxs("div", { children: [
42883
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Inputs" }),
43206
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.inputs") }),
42884
43207
  /* @__PURE__ */ jsx("pre", { className: "mt-1 text-xs text-gray-600 dark:text-gray-400 bg-gray-50 dark:bg-gray-800 p-2 rounded overflow-auto max-h-24", children: JSON.stringify(guard.inputs, null, 2) })
42885
43208
  ] }),
42886
43209
  /* @__PURE__ */ jsxs("div", { children: [
42887
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Trait" }),
43210
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.trait") }),
42888
43211
  /* @__PURE__ */ jsx(Typography, { variant: "small", children: guard.context.traitName })
42889
43212
  ] })
42890
43213
  ] })
@@ -42902,9 +43225,9 @@ function GuardsPanel({ guards }) {
42902
43225
  ] })
42903
43226
  ] }),
42904
43227
  /* @__PURE__ */ jsxs(ButtonGroup, { children: [
42905
- /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: "All" }),
42906
- /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: "Passed" }),
42907
- /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "failed" ? "primary" : "secondary", onClick: () => setFilter("failed"), children: "Failed" })
43228
+ /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: t("debug.filterAll") }),
43229
+ /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: t("debug.filterPassed") }),
43230
+ /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "failed" ? "primary" : "secondary", onClick: () => setFilter("failed"), children: t("debug.filterFailed") })
42908
43231
  ] })
42909
43232
  ] }),
42910
43233
  /* @__PURE__ */ jsx("div", { className: "max-h-80 overflow-y-auto", children: /* @__PURE__ */ jsx(Accordion, { items: accordionItems }) })
@@ -43030,7 +43353,7 @@ function TransitionTimeline({ transitions }) {
43030
43353
  EmptyState,
43031
43354
  {
43032
43355
  title: t("debug.noTransitionsRecorded"),
43033
- description: "Transitions will appear as the state machine processes events",
43356
+ description: t("debug.transitionsProcessHint"),
43034
43357
  className: "py-8"
43035
43358
  }
43036
43359
  );
@@ -43047,10 +43370,7 @@ function TransitionTimeline({ transitions }) {
43047
43370
  const sorted = [...transitions].reverse();
43048
43371
  return /* @__PURE__ */ jsxs("div", { className: "debug-tab debug-tab--timeline", children: [
43049
43372
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-2", children: [
43050
- /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-gray-500", children: [
43051
- transitions.length,
43052
- " transitions recorded"
43053
- ] }),
43373
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-500", children: t("debug.transitionsRecorded", { count: transitions.length }) }),
43054
43374
  /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-1 text-xs text-gray-500 cursor-pointer", children: [
43055
43375
  /* @__PURE__ */ jsx(
43056
43376
  Checkbox,
@@ -43059,7 +43379,7 @@ function TransitionTimeline({ transitions }) {
43059
43379
  onChange: (e) => setAutoScroll(e.target.checked)
43060
43380
  }
43061
43381
  ),
43062
- "Auto-scroll"
43382
+ t("debug.autoScroll")
43063
43383
  ] })
43064
43384
  ] }),
43065
43385
  /* @__PURE__ */ jsx(
@@ -43102,15 +43422,13 @@ function TransitionTimeline({ transitions }) {
43102
43422
  variant: trace.guardResult ? "success" : "danger",
43103
43423
  size: "sm",
43104
43424
  children: [
43105
- "guard: ",
43425
+ t("debug.guardLabel"),
43426
+ " ",
43106
43427
  trace.guardResult ? "\u2713" : "\u2717"
43107
43428
  ]
43108
43429
  }
43109
43430
  ),
43110
- /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: [
43111
- trace.effects.length,
43112
- " effects"
43113
- ] })
43431
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: t("debug.effectsCount", { count: trace.effects.length }) })
43114
43432
  ] }),
43115
43433
  isExpanded && trace.effects.length > 0 && /* @__PURE__ */ jsx("div", { className: "ml-2 mt-1 mb-2 pl-2 border-l border-gray-200 dark:border-gray-700 space-y-1", children: trace.effects.map((effect, eIdx) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
43116
43434
  /* @__PURE__ */ jsx(EffectBadge, { effect }),
@@ -43159,13 +43477,13 @@ function ServerBridgeTab({ bridge }) {
43159
43477
  EmptyState,
43160
43478
  {
43161
43479
  title: t("debug.noBridgeData"),
43162
- description: "The ServerBridge has not been initialized. Bridge health will appear once the runtime connects to the server.",
43480
+ description: t("debug.bridgeInitHint"),
43163
43481
  className: "py-8"
43164
43482
  }
43165
43483
  );
43166
43484
  }
43167
43485
  const formatTime4 = (ts) => {
43168
- if (ts === 0) return "Never";
43486
+ if (ts === 0) return t("debug.never");
43169
43487
  const d = new Date(ts);
43170
43488
  return d.toLocaleTimeString("en-US", {
43171
43489
  hour12: false,
@@ -43178,14 +43496,14 @@ function ServerBridgeTab({ bridge }) {
43178
43496
  /* @__PURE__ */ jsxs(Card, { className: "p-3", children: [
43179
43497
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 mb-3", children: [
43180
43498
  /* @__PURE__ */ jsx("div", { className: `w-3 h-3 rounded-full ${bridge.connected ? "bg-green-500 animate-pulse" : "bg-red-500"}` }),
43181
- /* @__PURE__ */ jsx(Typography, { variant: "h6", children: bridge.connected ? "Connected" : "Disconnected" })
43499
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", children: bridge.connected ? t("debug.connected") : t("debug.disconnected") })
43182
43500
  ] }),
43183
43501
  /* @__PURE__ */ jsxs(Stack, { gap: "xs", children: [
43184
43502
  /* @__PURE__ */ jsx(
43185
43503
  StatRow,
43186
43504
  {
43187
43505
  label: t("debug.status"),
43188
- value: bridge.connected ? "Connected" : "Disconnected",
43506
+ value: bridge.connected ? t("debug.connected") : t("debug.disconnected"),
43189
43507
  variant: bridge.connected ? "success" : "danger"
43190
43508
  }
43191
43509
  ),
@@ -43213,13 +43531,10 @@ function ServerBridgeTab({ bridge }) {
43213
43531
  ] })
43214
43532
  ] }),
43215
43533
  bridge.lastError && /* @__PURE__ */ jsxs(Card, { className: "p-3 border-red-200 dark:border-red-800 bg-red-50 dark:bg-red-950", children: [
43216
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "semibold", className: "text-red-600 dark:text-red-400 mb-1", children: "Last Error" }),
43534
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "semibold", className: "text-red-600 dark:text-red-400 mb-1", children: t("debug.lastError") }),
43217
43535
  /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-red-500 font-mono break-all", children: bridge.lastError })
43218
43536
  ] }),
43219
- bridge.connected && /* @__PURE__ */ jsx("div", { className: "text-center py-2", children: /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-gray-400", children: [
43220
- bridge.eventsForwarded + bridge.eventsReceived,
43221
- " total events processed"
43222
- ] }) })
43537
+ bridge.connected && /* @__PURE__ */ jsx("div", { className: "text-center py-2", children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-400", children: t("debug.totalEventsProcessed", { count: bridge.eventsForwarded + bridge.eventsReceived }) }) })
43223
43538
  ] }) });
43224
43539
  }
43225
43540
  var init_ServerBridgeTab = __esm({
@@ -43329,7 +43644,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43329
43644
  EmptyState,
43330
43645
  {
43331
43646
  title: t("debug.noActiveTraits"),
43332
- description: "Traits will appear when the state machine initializes",
43647
+ description: t("debug.traitsInitHint"),
43333
43648
  className: "py-8"
43334
43649
  }
43335
43650
  );
@@ -43346,7 +43661,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43346
43661
  };
43347
43662
  return /* @__PURE__ */ jsxs("div", { className: "debug-tab debug-tab--dispatch", children: [
43348
43663
  /* @__PURE__ */ jsxs("div", { className: "mb-3", children: [
43349
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Active States" }),
43664
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.activeStates") }),
43350
43665
  /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: traits2.map((trait) => /* @__PURE__ */ jsxs(Badge, { variant: "success", size: "sm", children: [
43351
43666
  trait.name,
43352
43667
  ": ",
@@ -43354,8 +43669,8 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43354
43669
  ] }, trait.id)) })
43355
43670
  ] }),
43356
43671
  /* @__PURE__ */ jsxs("div", { className: "mb-3", children: [
43357
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Available Events" }),
43358
- availableEvents.length === 0 ? /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-400 italic", children: "No transitions from current state" }) : /* @__PURE__ */ jsx(Stack, { gap: "xs", children: availableEvents.map(({ event, transitions }) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
43672
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.availableEvents") }),
43673
+ availableEvents.length === 0 ? /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-400 italic", children: t("debug.noTransitionsFromState") }) : /* @__PURE__ */ jsx(Stack, { gap: "xs", children: availableEvents.map(({ event, transitions }) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
43359
43674
  /* @__PURE__ */ jsx(
43360
43675
  Button,
43361
43676
  {
@@ -43367,15 +43682,15 @@ function EventDispatcherTab({ traits: traits2, schema }) {
43367
43682
  }
43368
43683
  ),
43369
43684
  /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-500", children: transitions.map((t2) => `${t2.from} -> ${t2.to}`).join(", ") }),
43370
- transitions.some((t2) => t2.guard) && /* @__PURE__ */ jsx(Badge, { variant: "warning", size: "sm", children: "guarded" })
43685
+ transitions.some((tr) => tr.guard) && /* @__PURE__ */ jsx(Badge, { variant: "warning", size: "sm", children: t("debug.guarded") })
43371
43686
  ] }, event)) })
43372
43687
  ] }),
43373
43688
  unavailableEvents.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mb-3", children: [
43374
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Other Events (not available from current state)" }),
43689
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.otherEvents") }),
43375
43690
  /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: unavailableEvents.map((event) => /* @__PURE__ */ jsx(Badge, { variant: "default", size: "sm", className: "opacity-50", children: event }, event)) })
43376
43691
  ] }),
43377
43692
  log12.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
43378
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Recent Transitions" }),
43693
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.recentTransitions") }),
43379
43694
  /* @__PURE__ */ jsx(Stack, { gap: "xs", children: log12.map((entry, i) => /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "font-mono text-xs", children: [
43380
43695
  /* @__PURE__ */ jsx("span", { className: "text-purple-400", children: entry.traitName }),
43381
43696
  " ",
@@ -43406,21 +43721,20 @@ var init_RuntimeDebugger = __esm({
43406
43721
  }
43407
43722
  });
43408
43723
  function ServerResponseRow({ sr }) {
43724
+ const { t } = useTranslate();
43409
43725
  const entityEntries = Object.entries(sr.dataEntities);
43410
43726
  return /* @__PURE__ */ jsxs("div", { className: "ml-4 pl-2 border-l border-purple-500/30 py-0.5 text-xs font-mono", children: [
43411
43727
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
43412
43728
  /* @__PURE__ */ jsxs("span", { className: sr.success ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400", children: [
43413
43729
  sr.success ? "\u2713" : "\u2717",
43414
- " server"
43730
+ " ",
43731
+ t("debug.server")
43415
43732
  ] }),
43416
43733
  /* @__PURE__ */ jsx("span", { className: "text-purple-600 dark:text-purple-300", children: sr.orbitalName }),
43417
- sr.clientEffects > 0 && /* @__PURE__ */ jsxs("span", { className: "px-1 rounded bg-purple-500/15 text-purple-600 dark:text-purple-300", children: [
43418
- sr.clientEffects,
43419
- " clientEffect",
43420
- sr.clientEffects !== 1 ? "s" : ""
43421
- ] }),
43734
+ sr.clientEffects > 0 && /* @__PURE__ */ jsx("span", { className: "px-1 rounded bg-purple-500/15 text-purple-600 dark:text-purple-300", children: t("debug.clientEffectsCount", { count: sr.clientEffects }) }),
43422
43735
  sr.emittedEvents.length > 0 && /* @__PURE__ */ jsxs("span", { className: "px-1 rounded bg-blue-500/15 text-blue-300", children: [
43423
- "emit: ",
43736
+ t("debug.emitLabel"),
43737
+ " ",
43424
43738
  sr.emittedEvents.join(", ")
43425
43739
  ] }),
43426
43740
  sr.error && /* @__PURE__ */ jsx("span", { className: "px-1 rounded bg-red-500/15 text-red-600 dark:text-red-400 truncate max-w-[300px]", children: sr.error })
@@ -43428,13 +43742,12 @@ function ServerResponseRow({ sr }) {
43428
43742
  entityEntries.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1 mt-0.5", children: entityEntries.map(([name, count]) => /* @__PURE__ */ jsxs("span", { className: "px-1 rounded bg-[var(--color-card)] text-foreground", children: [
43429
43743
  name,
43430
43744
  ": ",
43431
- count,
43432
- " row",
43433
- count !== 1 ? "s" : ""
43745
+ t("debug.rowsCount", { count })
43434
43746
  ] }, name)) })
43435
43747
  ] });
43436
43748
  }
43437
43749
  function TransitionRow({ trace }) {
43750
+ const { t } = useTranslate();
43438
43751
  const isServerEntry = !!trace.serverResponse && trace.traitName.startsWith("server:");
43439
43752
  const hasFailedEffects = trace.effects.some((e) => e.status === "failed");
43440
43753
  if (isServerEntry && trace.serverResponse) {
@@ -43442,7 +43755,7 @@ function TransitionRow({ trace }) {
43442
43755
  /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2 text-xs font-mono", children: [
43443
43756
  /* @__PURE__ */ jsx("span", { className: "mt-1.5 w-1.5 h-1.5 rounded-full flex-shrink-0 bg-purple-500" }),
43444
43757
  /* @__PURE__ */ jsx(Badge, { variant: "warning", size: "sm", className: "flex-shrink-0", children: trace.event }),
43445
- /* @__PURE__ */ jsx("span", { className: "text-purple-600 dark:text-purple-400 flex-shrink-0", children: "server response" })
43758
+ /* @__PURE__ */ jsx("span", { className: "text-purple-600 dark:text-purple-400 flex-shrink-0", children: t("debug.serverResponse") })
43446
43759
  ] }),
43447
43760
  /* @__PURE__ */ jsx(ServerResponseRow, { sr: trace.serverResponse })
43448
43761
  ] });
@@ -43483,6 +43796,7 @@ function VerifyModePanel({
43483
43796
  serverCount,
43484
43797
  localCount
43485
43798
  }) {
43799
+ const { t } = useTranslate();
43486
43800
  const [expanded, setExpanded] = React85.useState(true);
43487
43801
  const scrollRef = React85.useRef(null);
43488
43802
  const prevCountRef = React85.useRef(0);
@@ -43513,30 +43827,20 @@ function VerifyModePanel({
43513
43827
  onClick: () => setExpanded((v) => !v),
43514
43828
  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",
43515
43829
  "aria-expanded": expanded,
43516
- "aria-label": expanded ? "Collapse verification timeline" : "Expand verification timeline",
43830
+ "aria-label": expanded ? t("debug.collapseVerificationTimeline") : t("debug.expandVerificationTimeline"),
43517
43831
  "data-testid": "debugger-verify-toggle",
43518
43832
  children: [
43519
43833
  /* @__PURE__ */ jsx("span", { className: "text-foreground/50 w-3", "aria-hidden": true, children: expanded ? "\u25BE" : "\u25B8" }),
43520
- /* @__PURE__ */ jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? `${failedChecks} fail` : "OK" }),
43521
- /* @__PURE__ */ jsxs("span", { className: "text-foreground/70", children: [
43522
- localCount,
43523
- " local"
43524
- ] }),
43525
- /* @__PURE__ */ jsxs("span", { className: "text-purple-600 dark:text-purple-400", children: [
43526
- serverCount,
43527
- " server"
43528
- ] }),
43834
+ /* @__PURE__ */ jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? t("debug.failCount", { count: failedChecks }) : t("debug.ok") }),
43835
+ /* @__PURE__ */ jsx("span", { className: "text-foreground/70", children: t("debug.localCount", { count: localCount }) }),
43836
+ /* @__PURE__ */ jsx("span", { className: "text-purple-600 dark:text-purple-400", children: t("debug.serverCount", { count: serverCount }) }),
43529
43837
  traitStates && /* @__PURE__ */ jsx("span", { className: "text-cyan-600 dark:text-cyan-400 truncate max-w-[400px]", children: traitStates }),
43530
- !expanded && transitions.length > 0 && /* @__PURE__ */ jsxs("span", { className: "ml-auto text-foreground/50", children: [
43531
- transitions.length,
43532
- " transition",
43533
- transitions.length !== 1 ? "s" : ""
43534
- ] })
43838
+ !expanded && transitions.length > 0 && /* @__PURE__ */ jsx("span", { className: "ml-auto text-foreground/50", children: t("debug.transitionsCount", { count: transitions.length }) })
43535
43839
  ]
43536
43840
  }
43537
43841
  ),
43538
43842
  expanded && /* @__PURE__ */ jsxs("div", { className: "flex-1 flex overflow-hidden", children: [
43539
- /* @__PURE__ */ jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsx("div", { className: "px-2 py-1", children: transitions.length === 0 ? /* @__PURE__ */ jsx("div", { className: "text-foreground/50 text-xs font-mono py-2 text-center", children: "Waiting for transitions..." }) : /* @__PURE__ */ jsx("div", { className: "space-y-0.5", children: transitions.map((trace) => /* @__PURE__ */ jsx(TransitionRow, { trace }, trace.id)) }) }) }),
43843
+ /* @__PURE__ */ jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsx("div", { className: "px-2 py-1", children: transitions.length === 0 ? /* @__PURE__ */ jsx("div", { className: "text-foreground/50 text-xs font-mono py-2 text-center", children: t("debug.waitingForTransitions") }) : /* @__PURE__ */ jsx("div", { className: "space-y-0.5", children: transitions.map((trace) => /* @__PURE__ */ jsx(TransitionRow, { trace }, trace.id)) }) }) }),
43540
43844
  /* @__PURE__ */ jsx(WalkMinimap, {})
43541
43845
  ] })
43542
43846
  ]
@@ -43552,6 +43856,7 @@ function RuntimeDebugger({
43552
43856
  defaultTab,
43553
43857
  schema
43554
43858
  }) {
43859
+ const { t } = useTranslate();
43555
43860
  const [isCollapsed, setIsCollapsed] = React85.useState(mode === "verify" ? true : defaultCollapsed);
43556
43861
  const [isVisible, setIsVisible] = React85.useState(mode === "inline" || mode === "verify" || isDebugEnabled2());
43557
43862
  const debugData = useDebugData();
@@ -43590,55 +43895,55 @@ function RuntimeDebugger({
43590
43895
  const tabItems = [
43591
43896
  {
43592
43897
  id: "dispatch",
43593
- label: "Dispatch",
43898
+ label: t("debug.tabDispatch"),
43594
43899
  badge: debugData.traits.length || void 0,
43595
43900
  content: /* @__PURE__ */ jsx(EventDispatcherTab, { traits: debugData.traits, schema })
43596
43901
  },
43597
43902
  {
43598
43903
  id: "verify",
43599
- label: failedChecks > 0 ? "Verify (!)" : "Verify",
43904
+ label: failedChecks > 0 ? t("debug.tabVerifyAlert") : t("debug.tabVerify"),
43600
43905
  badge: verification.summary.totalChecks || void 0,
43601
43906
  content: /* @__PURE__ */ jsx(VerificationTab, { checks: verification.checks, summary: verification.summary })
43602
43907
  },
43603
43908
  {
43604
43909
  id: "timeline",
43605
- label: "Timeline",
43910
+ label: t("debug.tabTimeline"),
43606
43911
  badge: verification.transitions.length || void 0,
43607
43912
  content: /* @__PURE__ */ jsx(TransitionTimeline, { transitions: verification.transitions })
43608
43913
  },
43609
43914
  {
43610
43915
  id: "bridge",
43611
- label: "Bridge",
43916
+ label: t("debug.tabBridge"),
43612
43917
  badge: verification.bridge?.connected ? void 0 : 1,
43613
43918
  content: /* @__PURE__ */ jsx(ServerBridgeTab, { bridge: verification.bridge })
43614
43919
  },
43615
43920
  {
43616
43921
  id: "traits",
43617
- label: "Traits",
43922
+ label: t("debug.tabTraits"),
43618
43923
  badge: debugData.traits.length || void 0,
43619
43924
  content: /* @__PURE__ */ jsx(TraitsTab, { traits: debugData.traits })
43620
43925
  },
43621
43926
  {
43622
43927
  id: "ticks",
43623
- label: "Ticks",
43624
- badge: debugData.ticks.filter((t) => t.active).length || void 0,
43928
+ label: t("debug.tabTicks"),
43929
+ badge: debugData.ticks.filter((tick) => tick.active).length || void 0,
43625
43930
  content: /* @__PURE__ */ jsx(TicksTab, { ticks: debugData.ticks })
43626
43931
  },
43627
43932
  {
43628
43933
  id: "entities",
43629
- label: "Entities",
43934
+ label: t("debug.tabEntities"),
43630
43935
  badge: debugData.entitySnapshot?.runtime.length || void 0,
43631
43936
  content: /* @__PURE__ */ jsx(EntitiesTab, { snapshot: debugData.entitySnapshot })
43632
43937
  },
43633
43938
  {
43634
43939
  id: "events",
43635
- label: "Events",
43940
+ label: t("debug.tabEvents"),
43636
43941
  badge: debugData.events.length > 0 ? debugData.events.length : void 0,
43637
43942
  content: /* @__PURE__ */ jsx(EventFlowTab, { events: debugData.events })
43638
43943
  },
43639
43944
  {
43640
43945
  id: "guards",
43641
- label: "Guards",
43946
+ label: t("debug.tabGuards"),
43642
43947
  badge: debugData.guards.filter((g) => !g.result).length || void 0,
43643
43948
  content: /* @__PURE__ */ jsx(GuardsPanel, { guards: debugData.guards })
43644
43949
  }
@@ -43666,15 +43971,10 @@ function RuntimeDebugger({
43666
43971
  children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
43667
43972
  /* @__PURE__ */ jsxs(Typography, { variant: "h6", style: { fontSize: "0.75rem" }, children: [
43668
43973
  isCollapsed ? "\u25B6" : "\u25BC",
43669
- " Debugger"
43974
+ " ",
43975
+ t("debug.debugger")
43670
43976
  ] }),
43671
- failedChecks > 0 ? /* @__PURE__ */ jsxs(Badge, { variant: "danger", size: "sm", children: [
43672
- failedChecks,
43673
- " failed"
43674
- ] }) : debugData.traits.length > 0 ? /* @__PURE__ */ jsxs(Badge, { variant: "success", size: "sm", children: [
43675
- debugData.traits.length,
43676
- " traits"
43677
- ] }) : /* @__PURE__ */ jsx(Badge, { variant: "info", size: "sm", children: "Idle" })
43977
+ failedChecks > 0 ? /* @__PURE__ */ jsx(Badge, { variant: "danger", size: "sm", children: t("debug.failedCount", { count: failedChecks }) }) : debugData.traits.length > 0 ? /* @__PURE__ */ jsx(Badge, { variant: "success", size: "sm", children: t("debug.traitsCount", { count: debugData.traits.length }) }) : /* @__PURE__ */ jsx(Badge, { variant: "info", size: "sm", children: t("debug.idle") })
43678
43978
  ] })
43679
43979
  }
43680
43980
  ),
@@ -43692,9 +43992,9 @@ function RuntimeDebugger({
43692
43992
  );
43693
43993
  }
43694
43994
  if (mode === "verify") {
43695
- const traitStates = debugData.traits.map((t) => `${t.name}:${t.currentState}`).join(" | ");
43696
- const serverEntries = verification.transitions.filter((t) => t.serverResponse);
43697
- const localEntries = verification.transitions.filter((t) => !t.serverResponse);
43995
+ const traitStates = debugData.traits.map((t2) => `${t2.name}:${t2.currentState}`).join(" | ");
43996
+ const serverEntries = verification.transitions.filter((t2) => t2.serverResponse);
43997
+ const localEntries = verification.transitions.filter((t2) => !t2.serverResponse);
43698
43998
  return /* @__PURE__ */ jsx(
43699
43999
  VerifyModePanel,
43700
44000
  {
@@ -43726,7 +44026,7 @@ function RuntimeDebugger({
43726
44026
  variant: "secondary",
43727
44027
  size: "sm",
43728
44028
  className: "runtime-debugger__toggle",
43729
- title: "Open Debugger (`)",
44029
+ title: t("debug.openDebugger"),
43730
44030
  children: failedChecks > 0 ? /* @__PURE__ */ jsxs("span", { className: "relative", children: [
43731
44031
  /* @__PURE__ */ jsx("span", { children: "V" }),
43732
44032
  /* @__PURE__ */ jsx("span", { className: "absolute -top-1 -right-2 w-2 h-2 bg-red-500 rounded-full" })
@@ -43736,11 +44036,8 @@ function RuntimeDebugger({
43736
44036
  /* @__PURE__ */ jsxs("div", { className: "runtime-debugger__header", children: [
43737
44037
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
43738
44038
  /* @__PURE__ */ jsx("span", { className: "text-lg", children: "V" }),
43739
- /* @__PURE__ */ jsx(Typography, { variant: "h6", children: "KFlow Verifier" }),
43740
- failedChecks > 0 ? /* @__PURE__ */ jsxs(Badge, { variant: "danger", size: "sm", children: [
43741
- failedChecks,
43742
- " failed"
43743
- ] }) : verification.summary.totalChecks > 0 ? /* @__PURE__ */ jsx(Badge, { variant: "success", size: "sm", children: "All passing" }) : /* @__PURE__ */ jsx(Badge, { variant: "info", size: "sm", children: "Runtime" })
44039
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", children: t("debug.kflowVerifier") }),
44040
+ failedChecks > 0 ? /* @__PURE__ */ jsx(Badge, { variant: "danger", size: "sm", children: t("debug.failedCount", { count: failedChecks }) }) : verification.summary.totalChecks > 0 ? /* @__PURE__ */ jsx(Badge, { variant: "success", size: "sm", children: t("debug.allPassing") }) : /* @__PURE__ */ jsx(Badge, { variant: "info", size: "sm", children: t("debug.runtime") })
43744
44041
  ] }),
43745
44042
  /* @__PURE__ */ jsx(
43746
44043
  Button,
@@ -43748,7 +44045,7 @@ function RuntimeDebugger({
43748
44045
  onClick: () => setIsCollapsed(true),
43749
44046
  variant: "ghost",
43750
44047
  size: "sm",
43751
- title: "Close (`)",
44048
+ title: t("debug.close"),
43752
44049
  children: "x"
43753
44050
  }
43754
44051
  )
@@ -43762,7 +44059,7 @@ function RuntimeDebugger({
43762
44059
  className: "runtime-debugger__tabs"
43763
44060
  }
43764
44061
  ) }),
43765
- /* @__PURE__ */ jsx("div", { className: "runtime-debugger__footer", children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-foreground/50", children: "Press ` to toggle | window.__orbitalVerification for automation" }) })
44062
+ /* @__PURE__ */ jsx("div", { className: "runtime-debugger__footer", children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-foreground/50", children: t("debug.toggleHint") }) })
43766
44063
  ] })
43767
44064
  }
43768
44065
  );
@@ -43788,6 +44085,7 @@ var init_RuntimeDebugger2 = __esm({
43788
44085
  init_TransitionTimeline();
43789
44086
  init_ServerBridgeTab();
43790
44087
  init_EventDispatcherTab();
44088
+ init_useTranslate();
43791
44089
  init_RuntimeDebugger();
43792
44090
  RuntimeDebugger.displayName = "RuntimeDebugger";
43793
44091
  }
@@ -45076,7 +45374,7 @@ var init_StatCard = __esm({
45076
45374
  }
45077
45375
  );
45078
45376
  }
45079
- const label = schemaStats?.[0]?.label || labelToUse || "Stat";
45377
+ const label = schemaStats?.[0]?.label || labelToUse || t("statCard.defaultLabel");
45080
45378
  const normalizedPropValue = Array.isArray(propValue) ? propValue[0] ?? propValue.length : propValue;
45081
45379
  const value = schemaStats?.[0]?.value ?? normalizedPropValue ?? 0;
45082
45380
  const trendDirection = manualDirection || (calculatedTrend === void 0 || calculatedTrend === 0 ? "neutral" : calculatedTrend > 0 ? "up" : "down");
@@ -45119,7 +45417,7 @@ var init_StatCard = __esm({
45119
45417
  ]
45120
45418
  }
45121
45419
  ),
45122
- /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", as: "span", children: "vs last period" })
45420
+ /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", as: "span", children: t("statCard.vsLastPeriod") })
45123
45421
  ] }),
45124
45422
  subtitle && !calculatedTrend && /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", children: subtitle })
45125
45423
  ] }),