@almadar/ui 5.21.7 → 5.21.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3900,6 +3900,503 @@ var init_Stack = __esm({
3900
3900
  HStack = (props) => /* @__PURE__ */ jsxRuntime.jsx(Stack, { direction: "horizontal", ...props });
3901
3901
  }
3902
3902
  });
3903
+
3904
+ // locales/en.json
3905
+ var en_default;
3906
+ var init_en = __esm({
3907
+ "locales/en.json"() {
3908
+ en_default = {
3909
+ $meta: {
3910
+ locale: "en",
3911
+ direction: "ltr"
3912
+ },
3913
+ "common.save": "Save",
3914
+ "common.cancel": "Cancel",
3915
+ "common.delete": "Delete",
3916
+ "common.close": "Close",
3917
+ "common.confirm": "Are you sure?",
3918
+ "common.create": "Create",
3919
+ "common.edit": "Edit",
3920
+ "common.view": "View",
3921
+ "common.add": "Add",
3922
+ "common.remove": "Remove",
3923
+ "common.search": "Search...",
3924
+ "common.filter": "Filter",
3925
+ "common.actions": "Actions",
3926
+ "common.yes": "Yes",
3927
+ "common.no": "No",
3928
+ "common.selected": "selected",
3929
+ "common.ok": "OK",
3930
+ "common.done": "Done",
3931
+ "common.apply": "Apply",
3932
+ "common.reset": "Reset",
3933
+ "common.refresh": "Refresh",
3934
+ "common.export": "Export",
3935
+ "common.import": "Import",
3936
+ "common.copy": "Copy",
3937
+ "common.settings": "Settings",
3938
+ "nav.previous": "Previous",
3939
+ "nav.next": "Next",
3940
+ "nav.back": "Back",
3941
+ "nav.home": "Home",
3942
+ "form.submit": "Submit",
3943
+ "form.saving": "Saving...",
3944
+ "form.required": "This field is required",
3945
+ "form.invalidEmail": "Enter a valid email address",
3946
+ "form.selectPlaceholder": "Select {{label}}...",
3947
+ "form.searchPlaceholder": "Search {{entity}}...",
3948
+ "table.empty.title": "No items found",
3949
+ "table.empty.description": "No items to display.",
3950
+ "table.search.placeholder": "Search...",
3951
+ "table.pagination.showing": "Showing {{start}} to {{end}} of {{total}} results",
3952
+ "table.pagination.page": "Page {{page}} of {{totalPages}}",
3953
+ "table.bulk.selected": "{{count}} selected",
3954
+ "table.loading": "Loading...",
3955
+ "status.loading": "Loading...",
3956
+ "status.scheduled": "Scheduled",
3957
+ "status.inProgress": "In Progress",
3958
+ "status.completed": "Completed",
3959
+ "status.cancelled": "Cancelled",
3960
+ "status.pending": "Pending",
3961
+ "status.active": "Active",
3962
+ "status.inactive": "Inactive",
3963
+ "status.draft": "Draft",
3964
+ "status.archived": "Archived",
3965
+ "error.generic": "Something went wrong",
3966
+ "error.retry": "Try again",
3967
+ "error.notFound": "Not found",
3968
+ "error.loadFailed": "Failed to load: {{message}}",
3969
+ "error.configMissing": "Configuration not found for: {{id}}",
3970
+ "common.loading": "Loading...",
3971
+ "common.showMore": "Show More",
3972
+ "common.showLess": "Show Less",
3973
+ "common.noResults": "No results found",
3974
+ "common.saveChanges": "Save Changes",
3975
+ "common.retry": "Retry",
3976
+ "common.open": "Open",
3977
+ "common.back": "Back",
3978
+ "empty.noItems": "No items",
3979
+ "empty.noData": "No data available",
3980
+ "empty.noItemsYet": "No items yet",
3981
+ "empty.noItemsAdded": "No items added yet",
3982
+ "empty.noOptionsFound": "No options found",
3983
+ "list.addItemPlaceholder": "Add new item...",
3984
+ "error.occurred": "An error occurred",
3985
+ "error.failedToLoad": "Failed to load data",
3986
+ "wizard.back": "Back",
3987
+ "wizard.next": "Next",
3988
+ "wizard.complete": "Complete",
3989
+ "wizard.stepOf": "Step {{current}} of {{total}}",
3990
+ "pagination.previous": "Previous",
3991
+ "pagination.next": "Next",
3992
+ "pagination.total": "Total:",
3993
+ "pagination.show": "Show:",
3994
+ "pagination.goTo": "Go to:",
3995
+ "pagination.go": "Go",
3996
+ "auth.signIn": "Sign in",
3997
+ "auth.signOut": "Sign out",
3998
+ "dialog.confirm": "Confirm",
3999
+ "dialog.cancel": "Cancel",
4000
+ "dialog.loading": "Loading...",
4001
+ "dialog.delete.title": "Delete {{item}}?",
4002
+ "dialog.delete.message": "This action cannot be undone.",
4003
+ "trait.availableActions": "Available Actions",
4004
+ "trait.transitions": "Transitions",
4005
+ "trait.availableNow": "Available now",
4006
+ "book.startReading": "Start Reading",
4007
+ "book.tableOfContents": "Table of Contents",
4008
+ "book.partNumber": "Part {{number}}",
4009
+ "book.print": "Print",
4010
+ "book.previousPage": "Previous page",
4011
+ "book.nextPage": "Next page",
4012
+ "quiz.showAnswer": "Show answer",
4013
+ "quiz.hideAnswer": "Hide answer",
4014
+ "aria.closeModal": "Close modal",
4015
+ "aria.closeToast": "Dismiss toast",
4016
+ "aria.closeAlert": "Dismiss alert",
4017
+ "aria.removeFilter": "Remove filter",
4018
+ "aria.closeDrawer": "Close drawer",
4019
+ "aria.closePanel": "Close panel",
4020
+ "aria.previousImage": "Previous image",
4021
+ "aria.nextImage": "Next image",
4022
+ "aria.dismiss": "Dismiss",
4023
+ "aria.previousSlide": "Previous slide",
4024
+ "aria.nextSlide": "Next slide",
4025
+ "aria.previousDays": "Previous days",
4026
+ "aria.nextDays": "Next days",
4027
+ "aria.decrease": "Decrease",
4028
+ "aria.increase": "Increase",
4029
+ "aria.breadcrumb": "Breadcrumb",
4030
+ "aria.tableOfContents": "Table of contents",
4031
+ "aria.docsSidebar": "Documentation sidebar",
4032
+ "aria.selectAllRows": "Select all rows",
4033
+ "aria.selectAll": "Select all",
4034
+ "aria.upvote": "Upvote",
4035
+ "aria.downvote": "Downvote",
4036
+ "aria.qrScanner": "QR scanner",
4037
+ "aria.mockScanDev": "Mock scan (dev)",
4038
+ "aria.openMenu": "Open menu",
4039
+ "aria.closeMenu": "Close menu",
4040
+ "aria.openSidebar": "Open sidebar",
4041
+ "sidebar.expand": "Expand sidebar",
4042
+ "sidebar.collapse": "Collapse sidebar",
4043
+ "sidebar.close": "Close sidebar",
4044
+ "loading.items": "Loading items...",
4045
+ "card.imageAlt": "Image",
4046
+ "canvas.emptyMessage": "No content",
4047
+ "canvas.errorTitle": "Canvas error",
4048
+ "book.noData": "No data",
4049
+ "common.notifications": "Notifications",
4050
+ "common.remaining": "{{count}} remaining",
4051
+ "error.somethingWentWrong": "Something went wrong",
4052
+ "error.loadingItems": "Loading items...",
4053
+ "error.noItemsFound": "No items found",
4054
+ "debug.noEntityData": "No entity data",
4055
+ "debug.noEntities": "No entities",
4056
+ "debug.noTicks": "No ticks registered",
4057
+ "debug.noActiveTraits": "No active traits",
4058
+ "debug.noGuardEvaluations": "No guard evaluations",
4059
+ "debug.noBridgeData": "No bridge data",
4060
+ "debug.status": "Status",
4061
+ "debug.eventsForwarded": "Events Forwarded (Client \u2192 Server)",
4062
+ "debug.eventsReceived": "Events Received (Server \u2192 Client)",
4063
+ "debug.lastHeartbeat": "Last Heartbeat",
4064
+ "debug.noEventsYet": "No events yet",
4065
+ "debug.noTransitionsRecorded": "No transitions recorded",
4066
+ "debug.noVerificationChecks": "No verification checks yet",
4067
+ "display.chartError": "Chart error",
4068
+ "display.codeViewerError": "Code viewer error",
4069
+ "display.noCode": "No code",
4070
+ "display.documentError": "Document error",
4071
+ "display.noDocument": "No document",
4072
+ "display.graphError": "Graph error",
4073
+ "display.noGraphData": "No graph data",
4074
+ "display.galleryError": "Gallery error",
4075
+ "display.noMedia": "No media",
4076
+ "display.meterError": "Meter error",
4077
+ "display.signaturePadError": "Signature pad error",
4078
+ "display.timelineError": "Timeline error",
4079
+ "display.noEvents": "No events",
4080
+ "template.features": "Features",
4081
+ "template.howItWorks": "How It Works",
4082
+ "template.showcase": "Showcase",
4083
+ "template.faq": "Frequently Asked Questions",
4084
+ "template.ourTeam": "Our Team",
4085
+ "template.caseStudies": "Case Studies",
4086
+ "richBlockEditor.toolbar.text": "Text",
4087
+ "richBlockEditor.toolbar.h1": "H1",
4088
+ "richBlockEditor.toolbar.h2": "H2",
4089
+ "richBlockEditor.toolbar.h3": "H3",
4090
+ "richBlockEditor.toolbar.bulletList": "Bullet list",
4091
+ "richBlockEditor.toolbar.numbered": "Numbered",
4092
+ "richBlockEditor.toolbar.quote": "Quote",
4093
+ "richBlockEditor.toolbar.code": "Code",
4094
+ "richBlockEditor.toolbar.divider": "Divider",
4095
+ "richBlockEditor.toolbar.image": "Image",
4096
+ "richBlockEditor.blockType.paragraph": "Text",
4097
+ "richBlockEditor.blockType.heading1": "Heading 1",
4098
+ "richBlockEditor.blockType.heading2": "Heading 2",
4099
+ "richBlockEditor.blockType.heading3": "Heading 3",
4100
+ "richBlockEditor.blockType.bulletList": "Bullet list",
4101
+ "richBlockEditor.blockType.numberedList": "Numbered list",
4102
+ "richBlockEditor.blockType.quote": "Quote",
4103
+ "richBlockEditor.blockType.code": "Code",
4104
+ "richBlockEditor.blockType.divider": "Divider",
4105
+ "richBlockEditor.blockType.image": "Image",
4106
+ "richBlockEditor.blockActions": "Block actions",
4107
+ "richBlockEditor.duplicate": "Duplicate",
4108
+ "richBlockEditor.turnInto": "Turn into",
4109
+ "richBlockEditor.placeholder.heading1": "Heading 1",
4110
+ "richBlockEditor.placeholder.heading2": "Heading 2",
4111
+ "richBlockEditor.placeholder.heading3": "Heading 3",
4112
+ "richBlockEditor.placeholder.quote": "Quote",
4113
+ "richBlockEditor.placeholder.code": "Enter code",
4114
+ "richBlockEditor.placeholder.paragraph": "Start writing...",
4115
+ "richBlockEditor.placeholder.listItem": "List item",
4116
+ "richBlockEditor.placeholder.caption": "Caption (optional)",
4117
+ "richBlockEditor.aria.heading1Block": "Heading 1 block",
4118
+ "richBlockEditor.aria.heading2Block": "Heading 2 block",
4119
+ "richBlockEditor.aria.heading3Block": "Heading 3 block",
4120
+ "richBlockEditor.aria.quoteBlock": "Quote block",
4121
+ "richBlockEditor.aria.codeBlock": "Code block",
4122
+ "richBlockEditor.aria.codeLanguage": "Code language",
4123
+ "richBlockEditor.aria.imageUrl": "Image URL",
4124
+ "richBlockEditor.aria.imageCaption": "Image caption",
4125
+ "richBlockEditor.aria.listItem": "List item",
4126
+ "richBlockEditor.aria.removeListItem": "Remove list item",
4127
+ "richBlockEditor.aria.paragraphBlock": "Paragraph block",
4128
+ "richBlockEditor.embeddedImage": "Embedded image",
4129
+ "richBlockEditor.noImageUrl": "No image URL set",
4130
+ "richBlockEditor.addItem": "Add item",
4131
+ "richBlockEditor.insertParagraphBelow": "Insert paragraph below",
4132
+ "richBlockEditor.editorToolbar": "Block editor toolbar",
4133
+ "richBlockEditor.insertEntry": "Insert {{label}}",
4134
+ "versionDiff.compare": "Compare",
4135
+ "versionDiff.to": "to",
4136
+ "versionDiff.beforeRevision": "Before revision",
4137
+ "versionDiff.afterRevision": "After revision",
4138
+ "versionDiff.switchToInline": "Switch to inline view",
4139
+ "versionDiff.switchToSideBySide": "Switch to side-by-side view",
4140
+ "versionDiff.revert": "Revert",
4141
+ "versionDiff.byAuthor": " by {{author}}",
4142
+ "violationAlert.actionType.measure": "Corrective Measure",
4143
+ "violationAlert.actionType.admin": "Administrative Action",
4144
+ "violationAlert.actionType.penalty": "Penalty Proceedings",
4145
+ "violationAlert.fallbackMessage": "Violation",
4146
+ "violationAlert.adminLabel": "Admin:",
4147
+ "violationAlert.penaltyLabel": "Penalty:",
4148
+ "violationAlert.goToField": "Go to field",
4149
+ "branchingLogic.title": "Branching logic",
4150
+ "branchingLogic.if": "If",
4151
+ "branchingLogic.goTo": "go to",
4152
+ "branchingLogic.rules": "Rules",
4153
+ "branchingLogic.logicGraph": "Logic graph",
4154
+ "branchingLogic.addRule": "Add rule",
4155
+ "branchingLogic.deleteRule": "Delete rule",
4156
+ "branchingLogic.endOfSurvey": "End of survey",
4157
+ "branchingLogic.brokenReference": "Broken reference",
4158
+ "branchingLogic.selectQuestion": "Select question",
4159
+ "branchingLogic.selectTarget": "Select target",
4160
+ "branchingLogic.selectValue": "Select value",
4161
+ "branchingLogic.addValue": "Add value",
4162
+ "branchingLogic.value": "Value",
4163
+ "branchingLogic.typeValuePressEnter": "Type value, press Enter",
4164
+ "branchingLogic.operatorEquals": "equals",
4165
+ "branchingLogic.operatorNotEquals": "does not equal",
4166
+ "branchingLogic.operatorContains": "contains",
4167
+ "branchingLogic.operatorIn": "is one of",
4168
+ "branchingLogic.graphAriaLabel": "Branching logic graph",
4169
+ "branchingLogic.ruleCountOne": "{{count}} rule",
4170
+ "branchingLogic.ruleCountOther": "{{count}} rules",
4171
+ "branchingLogic.brokenCount": "{{count}} broken",
4172
+ "branchingLogic.emptyNoQuestions": "Add questions before building branching rules.",
4173
+ "branchingLogic.emptyNoRules": "No rules yet. Add a rule to define branching logic.",
4174
+ "filterGroup.filters": "Filters",
4175
+ "filterGroup.all": "All",
4176
+ "filterGroup.clear": "Clear",
4177
+ "filterGroup.clearAll": "Clear all",
4178
+ "filterGroup.from": "From",
4179
+ "filterGroup.to": "To",
4180
+ "filterGroup.allOf": "All {{label}}",
4181
+ "filterGroup.activeCount": "{{count}} active",
4182
+ "debug.guardEvaluationsHint": "Guard evaluations will appear when transitions or ticks with guards execute",
4183
+ "debug.expression": "Expression",
4184
+ "debug.inputs": "Inputs",
4185
+ "debug.trait": "Trait",
4186
+ "debug.filterAll": "All",
4187
+ "debug.filterPassed": "Passed",
4188
+ "debug.filterFailed": "Failed",
4189
+ "debug.traitsInitHint": "Traits will appear when the state machine initializes",
4190
+ "debug.traitsMountHint": "Traits will appear when components using them are mounted",
4191
+ "debug.activeStates": "Active States",
4192
+ "debug.availableEvents": "Available Events",
4193
+ "debug.noTransitionsFromState": "No transitions from current state",
4194
+ "debug.guarded": "guarded",
4195
+ "debug.otherEvents": "Other Events (not available from current state)",
4196
+ "debug.recentTransitions": "Recent Transitions",
4197
+ "debug.transitionsCount": "{{count}} transitions",
4198
+ "debug.states": "States",
4199
+ "debug.transitions": "Transitions",
4200
+ "debug.guards": "Guards",
4201
+ "debug.debugModeHint": "Debug mode may not be enabled",
4202
+ "debug.entitiesSpawnHint": "Entities will appear when spawned",
4203
+ "debug.singleton": "Singleton",
4204
+ "debug.singletonsCount": "Singletons ({{count}})",
4205
+ "debug.runtimeCount": "Runtime ({{count}})",
4206
+ "debug.moreEntities": "+{{count}} more entities",
4207
+ "debug.persistent": "Persistent",
4208
+ "debug.loadedCount": "{{count}} loaded",
4209
+ "debug.notLoaded": "not loaded",
4210
+ "debug.eventsExecuteHint": "Events will appear as traits, ticks, and other systems execute",
4211
+ "debug.allCount": "All ({{count}})",
4212
+ "debug.autoScroll": "Auto-scroll",
4213
+ "debug.transitionsProcessHint": "Transitions will appear as the state machine processes events",
4214
+ "debug.transitionsRecorded": "{{count}} transitions recorded",
4215
+ "debug.guardLabel": "guard:",
4216
+ "debug.effectsCount": "{{count}} effects",
4217
+ "debug.bridgeInitHint": "The ServerBridge has not been initialized. Bridge health will appear once the runtime connects to the server.",
4218
+ "debug.never": "Never",
4219
+ "debug.connected": "Connected",
4220
+ "debug.disconnected": "Disconnected",
4221
+ "debug.lastError": "Last Error",
4222
+ "debug.totalEventsProcessed": "{{count}} total events processed",
4223
+ "debug.server": "server",
4224
+ "debug.clientEffectsCount": "{{count}} clientEffects",
4225
+ "debug.emitLabel": "emit:",
4226
+ "debug.rowsCount": "{{count}} rows",
4227
+ "debug.serverResponse": "server response",
4228
+ "debug.collapseVerificationTimeline": "Collapse verification timeline",
4229
+ "debug.expandVerificationTimeline": "Expand verification timeline",
4230
+ "debug.failCount": "{{count}} fail",
4231
+ "debug.ok": "OK",
4232
+ "debug.localCount": "{{count}} local",
4233
+ "debug.serverCount": "{{count}} server",
4234
+ "debug.waitingForTransitions": "Waiting for transitions...",
4235
+ "debug.tabDispatch": "Dispatch",
4236
+ "debug.tabVerify": "Verify",
4237
+ "debug.tabVerifyAlert": "Verify (!)",
4238
+ "debug.tabTimeline": "Timeline",
4239
+ "debug.tabBridge": "Bridge",
4240
+ "debug.tabTraits": "Traits",
4241
+ "debug.tabTicks": "Ticks",
4242
+ "debug.tabEntities": "Entities",
4243
+ "debug.tabEvents": "Events",
4244
+ "debug.tabGuards": "Guards",
4245
+ "debug.debugger": "Debugger",
4246
+ "debug.failedCount": "{{count}} failed",
4247
+ "debug.traitsCount": "{{count}} traits",
4248
+ "debug.idle": "Idle",
4249
+ "debug.openDebugger": "Open Debugger (`)",
4250
+ "debug.kflowVerifier": "KFlow Verifier",
4251
+ "debug.allPassing": "All passing",
4252
+ "debug.runtime": "Runtime",
4253
+ "debug.close": "Close (`)",
4254
+ "debug.toggleHint": "Press ` to toggle | window.__orbitalVerification for automation",
4255
+ "replyTree.expandReplies": "Expand replies",
4256
+ "replyTree.collapseReplies": "Collapse replies",
4257
+ "replyTree.voteOnReplyBy": "Vote on reply by {{author}}",
4258
+ "replyTree.replyTo": "Reply to {{author}}",
4259
+ "replyTree.replyToPlaceholder": "Reply to {{author}}\u2026",
4260
+ "replyTree.reply": "Reply",
4261
+ "replyTree.flagReplyBy": "Flag reply by {{author}}",
4262
+ "replyTree.flag": "Flag",
4263
+ "replyTree.send": "Send",
4264
+ "replyTree.continueThread": "Continue thread",
4265
+ "replyTree.noRepliesYet": "No replies yet.",
4266
+ "signaturePad.label": "Signature",
4267
+ "signaturePad.helperText": "Draw your signature above",
4268
+ "signaturePad.clear": "Clear",
4269
+ "signaturePad.confirm": "Confirm",
4270
+ "qrScanner.cameraUnavailable": "Camera unavailable",
4271
+ "qrScanner.paused": "Paused",
4272
+ "qrScanner.resumeScanning": "Resume scanning",
4273
+ "qrScanner.pauseScanning": "Pause scanning",
4274
+ "qrScanner.switchToFrontCamera": "Switch to front camera",
4275
+ "qrScanner.switchToRearCamera": "Switch to rear camera",
4276
+ "qrScanner.mockScan": "Mock Scan",
4277
+ "docSearch.placeholder": "Search documentation...",
4278
+ "stateMachine.loading": "Loading state machine\u2026",
4279
+ "stateMachine.noStateMachine": "No state machine to visualize",
4280
+ "avl.trigger": "Trigger",
4281
+ "avl.guard": "Guard",
4282
+ "avl.effects": "Effects",
4283
+ "avl.props": "Props",
4284
+ "avl.entity": "Entity",
4285
+ "avl.traits": "Traits",
4286
+ "avl.transition": "Transition",
4287
+ "avl.onEntity": "on {{entity}}",
4288
+ "avl.linkedTo": "linked to {{entity}}",
4289
+ "avl.pressEscToZoomOut": "Press Esc to zoom out",
4290
+ "avl.zoomIn": "Zoom in",
4291
+ "avl.zoomOut": "Zoom out",
4292
+ "avl.orbitalLabel": "Orbital: {{name}}",
4293
+ "avl.orbitalLabelHighlighted": "Orbital: {{name}} (highlighted)",
4294
+ "avl.noTraitData": "No trait data",
4295
+ "avl.computingLayout": "Computing layout...",
4296
+ "avl.noStateMachine": "No state machine",
4297
+ "avl.listensFor": "listens for {{event}}",
4298
+ "avl.emits": "emits {{event}}",
4299
+ "avl.pageLayout": "Page Layout",
4300
+ "avl.overlaySuffix": "(overlay)",
4301
+ "orbPreview.previewBadge": "Preview",
4302
+ "orbPreview.doubleClickToOpen": "Double-click to open",
4303
+ "orbPreview.dropToAddAndOpen": "Drop to add and open",
4304
+ "orbPreview.dispatching": "Coordinator is dispatching to this orbital",
4305
+ "orbPreview.noPreview": "No preview available",
4306
+ "orbPreview.screensCount": "{{count}} screens",
4307
+ "detailView.noTransitionData": "No transition data",
4308
+ "orbInspector.required": "req",
4309
+ "orbInspector.addField": "Add Field",
4310
+ "orbInspector.serviceMode": "Service Mode",
4311
+ "orbInspector.standalone": "Standalone",
4312
+ "orbInspector.embedded": "Embedded",
4313
+ "orbInspector.rendersOwnUi": "Renders its own UI",
4314
+ "orbInspector.headless": "Headless, wired to other behaviors",
4315
+ "orbInspector.addEffect": "Add Effect",
4316
+ "orbInspector.guardExpression": "Guard expression",
4317
+ "orbInspector.selectPatternForStyles": "Select a pattern to view its style tokens.",
4318
+ "orbInspector.tokens": "Tokens",
4319
+ "orbInspector.noTokenContract": "No token contract declared for this pattern.",
4320
+ "orbInspector.variant": "Variant",
4321
+ "orbInspector.size": "Size",
4322
+ "orbInspector.statesCount": "{{count}} states",
4323
+ "orbInspector.onEntity": " on {{entity}}",
4324
+ "orbInspector.projectThemeTokens": "Project theme tokens",
4325
+ "orbInspector.tokenGroup.colors": "Colors",
4326
+ "orbInspector.tokenGroup.radii": "Radii",
4327
+ "orbInspector.tokenGroup.spacing": "Spacing",
4328
+ "orbInspector.tokenGroup.shadows": "Shadows",
4329
+ "orbInspector.tab.inspector": "Inspector",
4330
+ "orbInspector.tab.styles": "Styles",
4331
+ "orbInspector.tab.code": "Code",
4332
+ "canvas.goBackToOverview": "Go back to overview",
4333
+ "canvas.overview": "Overview",
4334
+ "canvas.expanded": "Expanded",
4335
+ "canvas.modulesCount": "{{count}} modules",
4336
+ "canvas.screensCount": "{{count}} screens",
4337
+ "canvas.switchToView": "Switch to {{label}} view",
4338
+ "lawReference.viewFullText": "View full law text",
4339
+ "statCard.defaultLabel": "Stat",
4340
+ "statCard.vsLastPeriod": "vs last period",
4341
+ "mediaGallery.upload": "Upload",
4342
+ "mediaGallery.noMediaDescription": "No media items to display.",
4343
+ "pagination.jumpPlaceholder": "Page",
4344
+ "table.selectRow": "Select row {{id}}",
4345
+ "card.selectItem": "Select {{item}}",
4346
+ "card.itemFallback": "item",
4347
+ "fileTree.noFiles": "No files",
4348
+ "masterDetail.selectItem": "Select an item to view details",
4349
+ "empty.createFirst": "Create your first item to get started.",
4350
+ "upload.dropOrBrowse": "Drop files here or click to browse",
4351
+ "upload.dropFilesHere": "Drop files here",
4352
+ "upload.accepted": "Accepted: {{accept}}",
4353
+ "upload.maxSize": "Max size: {{size}}",
4354
+ "upload.maxFiles": "Up to {{count}} files",
4355
+ "upload.error.maxFiles": "Maximum {{count}} files allowed",
4356
+ "upload.error.invalidType": "Invalid file type: {{name}}",
4357
+ "upload.error.tooLarge": "File too large: {{name}} (max {{size}})",
4358
+ "optionConstraint.requiredOne": "Required, pick 1",
4359
+ "optionConstraint.optionalOne": "Optional, pick up to 1",
4360
+ "optionConstraint.pickExactly": "Pick exactly {{count}}",
4361
+ "optionConstraint.pickRange": "Pick {{min}}-{{max}}",
4362
+ "optionConstraint.pickAtLeast": "Pick at least {{count}}",
4363
+ "optionConstraint.pickUpTo": "Pick up to {{count}}",
4364
+ "optionConstraint.optional": "Optional",
4365
+ "optionConstraint.outOfStock": "Out of stock",
4366
+ "optionConstraint.error.pickOne": "Pick 1 option",
4367
+ "optionConstraint.error.pickOnlyOne": "Pick only 1 option",
4368
+ "optionConstraint.error.pickMore": "Pick at least {{count}} more",
4369
+ "optionConstraint.error.removeOptions": "Remove {{count}} options",
4370
+ "stateMachine.pinned": "Pinned",
4371
+ "stateMachine.eventCount": "{{count}} events",
4372
+ "stateMachine.externalEffects": "External Effects",
4373
+ "stateMachine.legend.initial": "Initial",
4374
+ "stateMachine.legend.final": "Final",
4375
+ "stateMachine.legend.state": "State",
4376
+ "stateMachine.legend.multiEvent": "Multi-event"
4377
+ };
4378
+ }
4379
+ });
4380
+ function useTranslate() {
4381
+ return React97.useContext(I18nContext);
4382
+ }
4383
+ var _meta, coreMessages, coreLocale, I18nContext;
4384
+ var init_useTranslate = __esm({
4385
+ "hooks/useTranslate.ts"() {
4386
+ "use client";
4387
+ init_en();
4388
+ ({ $meta: _meta, ...coreMessages } = en_default);
4389
+ coreLocale = coreMessages;
4390
+ I18nContext = React97.createContext({
4391
+ locale: "en",
4392
+ direction: "ltr",
4393
+ t: (key) => coreLocale[key] ?? key
4394
+ // core locale fallback
4395
+ });
4396
+ I18nContext.displayName = "I18nContext";
4397
+ I18nContext.Provider;
4398
+ }
4399
+ });
3903
4400
  var MAX_VISIBLE_EFFECTS; exports.AvlTransitionLane = void 0;
3904
4401
  var init_AvlTransitionLane = __esm({
3905
4402
  "components/avl/molecules/AvlTransitionLane.tsx"() {
@@ -4529,6 +5026,7 @@ var log2, SWIM_GUTTER, CENTER_W; exports.BehaviorView = void 0;
4529
5026
  var init_BehaviorView = __esm({
4530
5027
  "components/avl/molecules/BehaviorView.tsx"() {
4531
5028
  "use client";
5029
+ init_useTranslate();
4532
5030
  init_AvlState();
4533
5031
  init_AvlTransitionLane();
4534
5032
  init_AvlSwimLane();
@@ -4538,6 +5036,7 @@ var init_BehaviorView = __esm({
4538
5036
  SWIM_GUTTER = 120;
4539
5037
  CENTER_W = 360;
4540
5038
  exports.BehaviorView = ({ data }) => {
5039
+ const { t } = useTranslate();
4541
5040
  const [layout, setLayout] = React97.useState(null);
4542
5041
  const traitName = data.traits[0]?.name;
4543
5042
  const traitData = traitName ? data.traitDetails[traitName] : void 0;
@@ -4547,10 +5046,10 @@ var init_BehaviorView = __esm({
4547
5046
  computeTraitLayout(traitData).then(setLayout).catch((err) => log2.error("compute-trait-layout-failed", { error: err instanceof Error ? err : String(err) }));
4548
5047
  }, [dataKey]);
4549
5048
  if (!traitData) {
4550
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: "No trait data" });
5049
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: t("avl.noTraitData") });
4551
5050
  }
4552
5051
  if (!layout) {
4553
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: "Computing layout..." });
5052
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: t("avl.computingLayout") });
4554
5053
  }
4555
5054
  const hasExternal = traitData.listenedEvents.length > 0 || traitData.emittedEvents.length > 0;
4556
5055
  const viewW = hasExternal ? SWIM_GUTTER + CENTER_W + SWIM_GUTTER : CENTER_W + 60;
@@ -4566,10 +5065,7 @@ var init_BehaviorView = __esm({
4566
5065
  const machineHeight = scaledH + 100;
4567
5066
  const renderMachine = /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
4568
5067
  /* @__PURE__ */ jsxRuntime.jsx("text", { x: CENTER_W / 2, y: 20, textAnchor: "middle", fill: "var(--color-foreground)", fontSize: 18, fontWeight: "700", fontFamily: "inherit", children: traitData.name }),
4569
- /* @__PURE__ */ jsxRuntime.jsxs("text", { x: CENTER_W / 2, y: 36, textAnchor: "middle", fill: "var(--color-muted-foreground)", fontSize: 11, opacity: 0.5, fontFamily: "inherit", children: [
4570
- "on ",
4571
- traitData.linkedEntity
4572
- ] }),
5068
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: CENTER_W / 2, y: 36, textAnchor: "middle", fill: "var(--color-muted-foreground)", fontSize: 11, opacity: 0.5, fontFamily: "inherit", children: t("avl.onEntity", { entity: traitData.linkedEntity }) }),
4573
5069
  /* @__PURE__ */ jsxRuntime.jsxs("defs", { children: [
4574
5070
  /* @__PURE__ */ jsxRuntime.jsx("marker", { id: "bvArrow", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: exports.CONNECTION_COLORS.forward.color, opacity: 0.7 }) }),
4575
5071
  /* @__PURE__ */ jsxRuntime.jsx("marker", { id: "bvArrowBack", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: exports.CONNECTION_COLORS.backward.color, opacity: 0.5 }) })
@@ -6371,210 +6867,6 @@ var init_Overlay = __esm({
6371
6867
  };
6372
6868
  }
6373
6869
  });
6374
-
6375
- // locales/en.json
6376
- var en_default;
6377
- var init_en = __esm({
6378
- "locales/en.json"() {
6379
- en_default = {
6380
- $meta: { locale: "en", direction: "ltr" },
6381
- "common.save": "Save",
6382
- "common.cancel": "Cancel",
6383
- "common.delete": "Delete",
6384
- "common.close": "Close",
6385
- "common.confirm": "Are you sure?",
6386
- "common.create": "Create",
6387
- "common.edit": "Edit",
6388
- "common.view": "View",
6389
- "common.add": "Add",
6390
- "common.remove": "Remove",
6391
- "common.search": "Search...",
6392
- "common.filter": "Filter",
6393
- "common.actions": "Actions",
6394
- "common.yes": "Yes",
6395
- "common.no": "No",
6396
- "common.selected": "selected",
6397
- "common.ok": "OK",
6398
- "common.done": "Done",
6399
- "common.apply": "Apply",
6400
- "common.reset": "Reset",
6401
- "common.refresh": "Refresh",
6402
- "common.export": "Export",
6403
- "common.import": "Import",
6404
- "common.copy": "Copy",
6405
- "common.settings": "Settings",
6406
- "nav.previous": "Previous",
6407
- "nav.next": "Next",
6408
- "nav.back": "Back",
6409
- "nav.home": "Home",
6410
- "form.submit": "Submit",
6411
- "form.saving": "Saving...",
6412
- "form.required": "This field is required",
6413
- "form.invalidEmail": "Enter a valid email address",
6414
- "form.selectPlaceholder": "Select {{label}}...",
6415
- "form.searchPlaceholder": "Search {{entity}}...",
6416
- "table.empty.title": "No items found",
6417
- "table.empty.description": "No items to display.",
6418
- "table.search.placeholder": "Search...",
6419
- "table.pagination.showing": "Showing {{start}} to {{end}} of {{total}} results",
6420
- "table.pagination.page": "Page {{page}} of {{totalPages}}",
6421
- "table.bulk.selected": "{{count}} selected",
6422
- "table.loading": "Loading...",
6423
- "status.loading": "Loading...",
6424
- "status.scheduled": "Scheduled",
6425
- "status.inProgress": "In Progress",
6426
- "status.completed": "Completed",
6427
- "status.cancelled": "Cancelled",
6428
- "status.pending": "Pending",
6429
- "status.active": "Active",
6430
- "status.inactive": "Inactive",
6431
- "status.draft": "Draft",
6432
- "status.archived": "Archived",
6433
- "error.generic": "Something went wrong",
6434
- "error.retry": "Try again",
6435
- "error.notFound": "Not found",
6436
- "error.loadFailed": "Failed to load: {{message}}",
6437
- "error.configMissing": "Configuration not found for: {{id}}",
6438
- "common.loading": "Loading...",
6439
- "common.showMore": "Show More",
6440
- "common.showLess": "Show Less",
6441
- "common.noResults": "No results found",
6442
- "common.saveChanges": "Save Changes",
6443
- "common.retry": "Retry",
6444
- "common.open": "Open",
6445
- "common.back": "Back",
6446
- "empty.noItems": "No items",
6447
- "empty.noData": "No data available",
6448
- "empty.noItemsYet": "No items yet",
6449
- "empty.noItemsAdded": "No items added yet",
6450
- "empty.noOptionsFound": "No options found",
6451
- "list.addItemPlaceholder": "Add new item...",
6452
- "error.occurred": "An error occurred",
6453
- "error.failedToLoad": "Failed to load data",
6454
- "wizard.back": "Back",
6455
- "wizard.next": "Next",
6456
- "wizard.complete": "Complete",
6457
- "wizard.stepOf": "Step {{current}} of {{total}}",
6458
- "pagination.previous": "Previous",
6459
- "pagination.next": "Next",
6460
- "pagination.total": "Total:",
6461
- "pagination.show": "Show:",
6462
- "pagination.goTo": "Go to:",
6463
- "pagination.go": "Go",
6464
- "auth.signIn": "Sign in",
6465
- "auth.signOut": "Sign out",
6466
- "dialog.confirm": "Confirm",
6467
- "dialog.cancel": "Cancel",
6468
- "dialog.loading": "Loading...",
6469
- "dialog.delete.title": "Delete {{item}}?",
6470
- "dialog.delete.message": "This action cannot be undone.",
6471
- "trait.availableActions": "Available Actions",
6472
- "trait.transitions": "Transitions",
6473
- "trait.availableNow": "Available now",
6474
- "book.startReading": "Start Reading",
6475
- "book.tableOfContents": "Table of Contents",
6476
- "book.partNumber": "Part {{number}}",
6477
- "book.print": "Print",
6478
- "book.previousPage": "Previous page",
6479
- "book.nextPage": "Next page",
6480
- "quiz.showAnswer": "Show answer",
6481
- "quiz.hideAnswer": "Hide answer",
6482
- "aria.closeModal": "Close modal",
6483
- "aria.closeToast": "Dismiss toast",
6484
- "aria.closeAlert": "Dismiss alert",
6485
- "aria.removeFilter": "Remove filter",
6486
- "aria.closeDrawer": "Close drawer",
6487
- "aria.closePanel": "Close panel",
6488
- "aria.previousImage": "Previous image",
6489
- "aria.nextImage": "Next image",
6490
- "aria.dismiss": "Dismiss",
6491
- "aria.previousSlide": "Previous slide",
6492
- "aria.nextSlide": "Next slide",
6493
- "aria.previousDays": "Previous days",
6494
- "aria.nextDays": "Next days",
6495
- "aria.decrease": "Decrease",
6496
- "aria.increase": "Increase",
6497
- "aria.breadcrumb": "Breadcrumb",
6498
- "aria.tableOfContents": "Table of contents",
6499
- "aria.docsSidebar": "Documentation sidebar",
6500
- "aria.selectAllRows": "Select all rows",
6501
- "aria.selectAll": "Select all",
6502
- "aria.upvote": "Upvote",
6503
- "aria.downvote": "Downvote",
6504
- "aria.qrScanner": "QR scanner",
6505
- "aria.mockScanDev": "Mock scan (dev)",
6506
- "aria.openMenu": "Open menu",
6507
- "aria.closeMenu": "Close menu",
6508
- "aria.openSidebar": "Open sidebar",
6509
- "sidebar.expand": "Expand sidebar",
6510
- "sidebar.collapse": "Collapse sidebar",
6511
- "sidebar.close": "Close sidebar",
6512
- "loading.items": "Loading items...",
6513
- "card.imageAlt": "Image",
6514
- "canvas.emptyMessage": "No content",
6515
- "canvas.errorTitle": "Canvas error",
6516
- "book.noData": "No data",
6517
- "common.notifications": "Notifications",
6518
- "common.remaining": "{{count}} remaining",
6519
- "error.somethingWentWrong": "Something went wrong",
6520
- "error.loadingItems": "Loading items...",
6521
- "error.noItemsFound": "No items found",
6522
- "error.notFound": "Not found",
6523
- "debug.noEntityData": "No entity data",
6524
- "debug.noEntities": "No entities",
6525
- "debug.noTicks": "No ticks registered",
6526
- "debug.noActiveTraits": "No active traits",
6527
- "debug.noGuardEvaluations": "No guard evaluations",
6528
- "debug.noBridgeData": "No bridge data",
6529
- "debug.status": "Status",
6530
- "debug.eventsForwarded": "Events Forwarded (Client \u2192 Server)",
6531
- "debug.eventsReceived": "Events Received (Server \u2192 Client)",
6532
- "debug.lastHeartbeat": "Last Heartbeat",
6533
- "debug.noEventsYet": "No events yet",
6534
- "debug.noTransitionsRecorded": "No transitions recorded",
6535
- "debug.noVerificationChecks": "No verification checks yet",
6536
- "display.chartError": "Chart error",
6537
- "display.codeViewerError": "Code viewer error",
6538
- "display.noCode": "No code",
6539
- "display.documentError": "Document error",
6540
- "display.noDocument": "No document",
6541
- "display.graphError": "Graph error",
6542
- "display.noGraphData": "No graph data",
6543
- "display.galleryError": "Gallery error",
6544
- "display.noMedia": "No media",
6545
- "display.meterError": "Meter error",
6546
- "display.signaturePadError": "Signature pad error",
6547
- "display.timelineError": "Timeline error",
6548
- "display.noEvents": "No events",
6549
- "template.features": "Features",
6550
- "template.howItWorks": "How It Works",
6551
- "template.showcase": "Showcase",
6552
- "template.faq": "Frequently Asked Questions",
6553
- "template.ourTeam": "Our Team",
6554
- "template.caseStudies": "Case Studies"
6555
- };
6556
- }
6557
- });
6558
- function useTranslate() {
6559
- return React97.useContext(I18nContext);
6560
- }
6561
- var _meta, coreMessages, coreLocale, I18nContext;
6562
- var init_useTranslate = __esm({
6563
- "hooks/useTranslate.ts"() {
6564
- "use client";
6565
- init_en();
6566
- ({ $meta: _meta, ...coreMessages } = en_default);
6567
- coreLocale = coreMessages;
6568
- I18nContext = React97.createContext({
6569
- locale: "en",
6570
- direction: "ltr",
6571
- t: (key) => coreLocale[key] ?? key
6572
- // core locale fallback
6573
- });
6574
- I18nContext.displayName = "I18nContext";
6575
- I18nContext.Provider;
6576
- }
6577
- });
6578
6870
  var sizeClasses2, minWidthClasses, lookStyles, Modal;
6579
6871
  var init_Modal = __esm({
6580
6872
  "components/core/molecules/Modal.tsx"() {
@@ -9553,6 +9845,7 @@ var init_LawReferenceTooltip = __esm({
9553
9845
  init_Typography();
9554
9846
  init_Divider();
9555
9847
  init_cn();
9848
+ init_useTranslate();
9556
9849
  positionStyles2 = {
9557
9850
  top: "bottom-full left-1/2 -translate-x-1/2 mb-2",
9558
9851
  bottom: "top-full left-1/2 -translate-x-1/2 mt-2",
@@ -9571,6 +9864,7 @@ var init_LawReferenceTooltip = __esm({
9571
9864
  position = "top",
9572
9865
  className
9573
9866
  }) => {
9867
+ const { t } = useTranslate();
9574
9868
  const [isVisible, setIsVisible] = React97__namespace.default.useState(false);
9575
9869
  const timeoutRef = React97__namespace.default.useRef(null);
9576
9870
  const handleMouseEnter = () => {
@@ -9654,7 +9948,7 @@ var init_LawReferenceTooltip = __esm({
9654
9948
  target: "_blank",
9655
9949
  rel: "noopener noreferrer",
9656
9950
  onClick: (e) => e.stopPropagation(),
9657
- children: "View full law text"
9951
+ children: t("lawReference.viewFullText")
9658
9952
  }
9659
9953
  )
9660
9954
  ] }),
@@ -17142,7 +17436,7 @@ var init_CodeBlock = __esm({
17142
17436
  const isLolo = language === "lolo";
17143
17437
  const activeStyle = isOrb ? orbStyle : isLolo ? loloStyle : dark__default.default;
17144
17438
  const eventBus = useEventBus();
17145
- const { t: _t } = useTranslate();
17439
+ const { t } = useTranslate();
17146
17440
  const scrollRef = React97.useRef(null);
17147
17441
  const codeRef = React97.useRef(null);
17148
17442
  const savedScrollLeftRef = React97.useRef(0);
@@ -17397,7 +17691,7 @@ var init_CodeBlock = __esm({
17397
17691
  size: "sm",
17398
17692
  onClick: handleCopy,
17399
17693
  className: "opacity-0 group-hover:opacity-100 focus:opacity-100 transition-opacity text-muted-foreground hover:text-white",
17400
- "aria-label": "Copy code",
17694
+ "aria-label": t("common.copy"),
17401
17695
  children: copied ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "check", className: "w-4 h-4 text-green-400" }) : /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "copy", className: "w-4 h-4" })
17402
17696
  }
17403
17697
  )
@@ -17618,9 +17912,18 @@ var init_MarkdownContent = __esm({
17618
17912
  );
17619
17913
  }
17620
17914
  return /* @__PURE__ */ jsxRuntime.jsx(
17621
- "span",
17915
+ "code",
17622
17916
  {
17917
+ ...props,
17918
+ className: codeClassName,
17623
17919
  style: {
17920
+ backgroundColor: "var(--color-muted)",
17921
+ color: "var(--color-foreground)",
17922
+ border: "1px solid var(--color-border)",
17923
+ padding: "0.125rem 0.375rem",
17924
+ borderRadius: "0.25rem",
17925
+ fontSize: "0.875em",
17926
+ fontFamily: "ui-monospace, monospace",
17624
17927
  whiteSpace: "pre-wrap",
17625
17928
  wordBreak: "break-word"
17626
17929
  },
@@ -18043,7 +18346,7 @@ var init_StateMachineView = __esm({
18043
18346
  const endX2 = fromState.x + Math.cos(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
18044
18347
  const endY2 = fromState.y + Math.sin(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
18045
18348
  const isSingle2 = bundle.labels.length === 1;
18046
- const labelText2 = isSingle2 ? bundle.labels[0].event : `${bundle.labels.length} events`;
18349
+ const labelText2 = isSingle2 ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
18047
18350
  const bundleColor2 = isSingle2 ? config.colors.arrow : "var(--color-accent)";
18048
18351
  const labelWidth2 = labelText2.length * 9 + (isSingle2 ? 24 : 40);
18049
18352
  const cx = fromState.x;
@@ -18169,7 +18472,7 @@ var init_StateMachineView = __esm({
18169
18472
  const controlX = midX + perpX;
18170
18473
  const controlY = midY + perpY;
18171
18474
  const isSingle = bundle.labels.length === 1;
18172
- const labelText = isSingle ? bundle.labels[0].event : `${bundle.labels.length} events`;
18475
+ const labelText = isSingle ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
18173
18476
  const labelWidth = labelText.length * 9 + (isSingle ? 24 : 40);
18174
18477
  const bundleColor = isSingle ? config.colors.arrow : "var(--color-accent)";
18175
18478
  const curveMidpoint = {
@@ -18324,7 +18627,7 @@ var init_StateMachineView = __esm({
18324
18627
  {
18325
18628
  className: "absolute -top-2 left-1/2 transform -translate-x-1/2 px-2 py-0.5 rounded-full",
18326
18629
  style: { backgroundColor: "var(--color-success)" },
18327
- children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: "Pinned" })
18630
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: t("stateMachine.pinned") })
18328
18631
  }
18329
18632
  ),
18330
18633
  !isSingle && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -18346,10 +18649,7 @@ var init_StateMachineView = __esm({
18346
18649
  {
18347
18650
  className: "ml-2 px-2 py-0.5 rounded-full",
18348
18651
  style: { backgroundColor: "var(--color-accent)" },
18349
- children: /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: [
18350
- bundle.labels.length,
18351
- " events"
18352
- ] })
18652
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: t("stateMachine.eventCount", { count: bundle.labels.length }) })
18353
18653
  }
18354
18654
  )
18355
18655
  ]
@@ -18494,7 +18794,7 @@ var init_StateMachineView = __esm({
18494
18794
  align: "center",
18495
18795
  className: "mb-2",
18496
18796
  style: { color: "var(--color-warning)", fontSize: "13px" },
18497
- children: "External Effects"
18797
+ children: t("stateMachine.externalEffects")
18498
18798
  }
18499
18799
  ),
18500
18800
  outputs.outputs.map((output, idx) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -18514,10 +18814,10 @@ var init_StateMachineView = __esm({
18514
18814
  Legend = ({ config, y }) => {
18515
18815
  const { t } = useTranslate();
18516
18816
  const items = [
18517
- { label: "Initial", color: config.colors.initialNode },
18518
- { label: "Final", color: config.colors.finalNode },
18519
- { label: "State", color: config.colors.nodeBorder },
18520
- { label: "Multi-event", color: "var(--color-accent)" }
18817
+ { key: "initial", label: t("stateMachine.legend.initial"), color: config.colors.initialNode, isMultiEvent: false },
18818
+ { key: "final", label: t("stateMachine.legend.final"), color: config.colors.finalNode, isMultiEvent: false },
18819
+ { key: "state", label: t("stateMachine.legend.state"), color: config.colors.nodeBorder, isMultiEvent: false },
18820
+ { key: "multiEvent", label: t("stateMachine.legend.multiEvent"), color: "var(--color-accent)", isMultiEvent: true }
18521
18821
  ];
18522
18822
  return /* @__PURE__ */ jsxRuntime.jsx(
18523
18823
  HStack,
@@ -18532,8 +18832,8 @@ var init_StateMachineView = __esm({
18532
18832
  {
18533
18833
  className: "w-3 h-3 rounded-full",
18534
18834
  style: {
18535
- backgroundColor: item.label === "Multi-event" ? item.color : config.colors.node,
18536
- border: item.label !== "Multi-event" ? `2px solid ${item.color}` : "none"
18835
+ backgroundColor: item.isMultiEvent ? item.color : config.colors.node,
18836
+ border: !item.isMultiEvent ? `2px solid ${item.color}` : "none"
18537
18837
  }
18538
18838
  }
18539
18839
  ),
@@ -18545,7 +18845,7 @@ var init_StateMachineView = __esm({
18545
18845
  children: item.label
18546
18846
  }
18547
18847
  )
18548
- ] }, item.label))
18848
+ ] }, item.key))
18549
18849
  }
18550
18850
  );
18551
18851
  };
@@ -19339,13 +19639,13 @@ var init_JazariStateMachine = __esm({
19339
19639
  );
19340
19640
  }, [resolvedTrait, entityFields]);
19341
19641
  if (isLoading) {
19342
- return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: "Loading state machine\u2026" });
19642
+ return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: t("stateMachine.loading") });
19343
19643
  }
19344
19644
  if (error) {
19345
19645
  return /* @__PURE__ */ jsxRuntime.jsx(ErrorState, { message: error instanceof Error ? error.message : String(error) });
19346
19646
  }
19347
19647
  if (!resolvedTrait || !layoutData || layoutData.states.length === 0) {
19348
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { padding: "lg", className: cn("text-center", className), children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", className: "opacity-60", children: "No state machine to visualize" }) });
19648
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { padding: "lg", className: cn("text-center", className), children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", className: "opacity-60", children: t("stateMachine.noStateMachine") }) });
19349
19649
  }
19350
19650
  return /* @__PURE__ */ jsxRuntime.jsx(
19351
19651
  StateMachineView,
@@ -20389,13 +20689,13 @@ var init_LayoutPatterns = __esm({
20389
20689
  function generateRuleId() {
20390
20690
  return `rule-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
20391
20691
  }
20392
- function questionsToOptions(questions, includeEndOfSurvey) {
20692
+ function questionsToOptions(questions, endOfSurveyLabel) {
20393
20693
  const opts = questions.map((q) => ({
20394
20694
  value: q.id,
20395
20695
  label: q.label
20396
20696
  }));
20397
- if (includeEndOfSurvey) {
20398
- opts.push({ value: END_OF_SURVEY, label: "End of survey" });
20697
+ if (endOfSurveyLabel !== null) {
20698
+ opts.push({ value: END_OF_SURVEY, label: endOfSurveyLabel });
20399
20699
  }
20400
20700
  return opts;
20401
20701
  }
@@ -20404,7 +20704,7 @@ function isRuleBroken(rule, questions) {
20404
20704
  const targetExists = rule.targetQuestionId === END_OF_SURVEY || questions.some((q) => q.id === rule.targetQuestionId);
20405
20705
  return !sourceExists || !targetExists;
20406
20706
  }
20407
- var END_OF_SURVEY, OPERATOR_OPTIONS, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph, BranchingLogicBuilder;
20707
+ var END_OF_SURVEY, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph, BranchingLogicBuilder;
20408
20708
  var init_BranchingLogicBuilder = __esm({
20409
20709
  "components/core/molecules/BranchingLogicBuilder.tsx"() {
20410
20710
  "use client";
@@ -20417,14 +20717,9 @@ var init_BranchingLogicBuilder = __esm({
20417
20717
  init_FilterPill();
20418
20718
  init_Box();
20419
20719
  init_useEventBus();
20720
+ init_useTranslate();
20420
20721
  init_cn();
20421
20722
  END_OF_SURVEY = "end-of-survey";
20422
- OPERATOR_OPTIONS = [
20423
- { value: "equals", label: "equals" },
20424
- { value: "not-equals", label: "does not equal" },
20425
- { value: "contains", label: "contains" },
20426
- { value: "in", label: "is one of" }
20427
- ];
20428
20723
  RuleRow = ({
20429
20724
  rule,
20430
20725
  questions,
@@ -20433,8 +20728,21 @@ var init_BranchingLogicBuilder = __esm({
20433
20728
  onChange,
20434
20729
  onDelete
20435
20730
  }) => {
20436
- const sourceOptions = React97.useMemo(() => questionsToOptions(questions, false), [questions]);
20437
- const targetOptions = React97.useMemo(() => questionsToOptions(questions, true), [questions]);
20731
+ const { t } = useTranslate();
20732
+ const operatorOptions = React97.useMemo(
20733
+ () => [
20734
+ { value: "equals", label: t("branchingLogic.operatorEquals") },
20735
+ { value: "not-equals", label: t("branchingLogic.operatorNotEquals") },
20736
+ { value: "contains", label: t("branchingLogic.operatorContains") },
20737
+ { value: "in", label: t("branchingLogic.operatorIn") }
20738
+ ],
20739
+ [t]
20740
+ );
20741
+ const sourceOptions = React97.useMemo(() => questionsToOptions(questions, null), [questions]);
20742
+ const targetOptions = React97.useMemo(
20743
+ () => questionsToOptions(questions, t("branchingLogic.endOfSurvey")),
20744
+ [questions, t]
20745
+ );
20438
20746
  const sourceQuestion = questions.find((q) => q.id === rule.sourceQuestionId);
20439
20747
  const valueOptions = React97.useMemo(() => {
20440
20748
  if (!sourceQuestion?.optionValues) return [];
@@ -20479,22 +20787,22 @@ var init_BranchingLogicBuilder = __esm({
20479
20787
  ),
20480
20788
  children: [
20481
20789
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-wrap items-center gap-2", children: [
20482
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "semibold", className: "shrink-0", children: "If" }),
20790
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "semibold", className: "shrink-0", children: t("branchingLogic.if") }),
20483
20791
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsxRuntime.jsx(
20484
20792
  Select,
20485
20793
  {
20486
20794
  options: sourceOptions,
20487
20795
  value: rule.sourceQuestionId,
20488
- placeholder: "Select question",
20796
+ placeholder: t("branchingLogic.selectQuestion"),
20489
20797
  onChange: handleSource,
20490
20798
  disabled: readOnly,
20491
- error: broken ? "Broken reference" : void 0
20799
+ error: broken ? t("branchingLogic.brokenReference") : void 0
20492
20800
  }
20493
20801
  ) }),
20494
20802
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[8rem] basis-32", children: /* @__PURE__ */ jsxRuntime.jsx(
20495
20803
  Select,
20496
20804
  {
20497
- options: OPERATOR_OPTIONS,
20805
+ options: operatorOptions,
20498
20806
  value: rule.operator,
20499
20807
  onChange: handleOperator,
20500
20808
  disabled: readOnly
@@ -20517,7 +20825,7 @@ var init_BranchingLogicBuilder = __esm({
20517
20825
  {
20518
20826
  options: valueOptions.filter((o) => !chips.includes(o.value)),
20519
20827
  value: "",
20520
- placeholder: "Add value",
20828
+ placeholder: t("branchingLogic.addValue"),
20521
20829
  onChange: handleAddChip,
20522
20830
  disabled: readOnly
20523
20831
  }
@@ -20525,7 +20833,7 @@ var init_BranchingLogicBuilder = __esm({
20525
20833
  Input,
20526
20834
  {
20527
20835
  inputType: "text",
20528
- placeholder: "Type value, press Enter",
20836
+ placeholder: t("branchingLogic.typeValuePressEnter"),
20529
20837
  value: "",
20530
20838
  onKeyDown: (e) => {
20531
20839
  if (e.key !== "Enter") return;
@@ -20543,7 +20851,7 @@ var init_BranchingLogicBuilder = __esm({
20543
20851
  {
20544
20852
  options: valueOptions,
20545
20853
  value: scalarValue,
20546
- placeholder: "Select value",
20854
+ placeholder: t("branchingLogic.selectValue"),
20547
20855
  onChange: (e) => onChange({ ...rule, value: e.target.value }),
20548
20856
  disabled: readOnly
20549
20857
  }
@@ -20551,7 +20859,7 @@ var init_BranchingLogicBuilder = __esm({
20551
20859
  Input,
20552
20860
  {
20553
20861
  inputType: "text",
20554
- placeholder: "Value",
20862
+ placeholder: t("branchingLogic.value"),
20555
20863
  value: scalarValue,
20556
20864
  onChange: handleScalarValue,
20557
20865
  disabled: readOnly
@@ -20559,17 +20867,17 @@ var init_BranchingLogicBuilder = __esm({
20559
20867
  ) }),
20560
20868
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "label", weight: "semibold", className: "shrink-0 inline-flex items-center gap-1", children: [
20561
20869
  /* @__PURE__ */ jsxRuntime.jsx(LucideIcons2.ArrowRight, { className: "h-4 w-4" }),
20562
- "go to"
20870
+ t("branchingLogic.goTo")
20563
20871
  ] }),
20564
20872
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsxRuntime.jsx(
20565
20873
  Select,
20566
20874
  {
20567
20875
  options: targetOptions,
20568
20876
  value: rule.targetQuestionId,
20569
- placeholder: "Select target",
20877
+ placeholder: t("branchingLogic.selectTarget"),
20570
20878
  onChange: handleTarget,
20571
20879
  disabled: readOnly,
20572
- error: broken && rule.targetQuestionId !== END_OF_SURVEY ? "Broken reference" : void 0
20880
+ error: broken && rule.targetQuestionId !== END_OF_SURVEY ? t("branchingLogic.brokenReference") : void 0
20573
20881
  }
20574
20882
  ) }),
20575
20883
  !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
@@ -20581,11 +20889,11 @@ var init_BranchingLogicBuilder = __esm({
20581
20889
  action: "DELETE_RULE",
20582
20890
  actionPayload: { ruleId: rule.id },
20583
20891
  onClick: onDelete,
20584
- "aria-label": "Delete rule"
20892
+ "aria-label": t("branchingLogic.deleteRule")
20585
20893
  }
20586
20894
  )
20587
20895
  ] }),
20588
- broken && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "error", size: "sm", label: "Broken reference" })
20896
+ broken && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "error", size: "sm", label: t("branchingLogic.brokenReference") })
20589
20897
  ]
20590
20898
  }
20591
20899
  );
@@ -20595,10 +20903,12 @@ var init_BranchingLogicBuilder = __esm({
20595
20903
  NODE_GAP_Y = 80;
20596
20904
  PADDING = 32;
20597
20905
  LogicGraph = ({ questions, rules }) => {
20906
+ const { t } = useTranslate();
20907
+ const endOfSurveyLabel = t("branchingLogic.endOfSurvey");
20598
20908
  const layout = React97.useMemo(() => {
20599
20909
  const items = [
20600
20910
  ...questions.map((q) => ({ id: q.id, label: q.label, isEnd: false })),
20601
- { id: END_OF_SURVEY, label: "End of survey", isEnd: true }
20911
+ { id: END_OF_SURVEY, label: endOfSurveyLabel, isEnd: true }
20602
20912
  ];
20603
20913
  const positions = {};
20604
20914
  items.forEach((item, i) => {
@@ -20610,14 +20920,14 @@ var init_BranchingLogicBuilder = __esm({
20610
20920
  const width = NODE_WIDTH + PADDING * 2 + 220;
20611
20921
  const height = PADDING * 2 + items.length * (NODE_HEIGHT + NODE_GAP_Y);
20612
20922
  return { items, positions, width, height };
20613
- }, [questions]);
20923
+ }, [questions, endOfSurveyLabel]);
20614
20924
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "overflow-auto rounded-container border border-border bg-card p-2", children: /* @__PURE__ */ jsxRuntime.jsxs(
20615
20925
  "svg",
20616
20926
  {
20617
20927
  width: layout.width,
20618
20928
  height: layout.height,
20619
20929
  role: "img",
20620
- "aria-label": "Branching logic graph",
20930
+ "aria-label": t("branchingLogic.graphAriaLabel"),
20621
20931
  style: { display: "block" },
20622
20932
  children: [
20623
20933
  /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -20725,6 +21035,7 @@ var init_BranchingLogicBuilder = __esm({
20725
21035
  readOnly = false,
20726
21036
  className
20727
21037
  }) => {
21038
+ const { t } = useTranslate();
20728
21039
  const eventBus = useEventBus();
20729
21040
  const questions = Array.isArray(questionsProp) ? questionsProp : [];
20730
21041
  const rulesInitial = Array.isArray(rulesProp) ? rulesProp : [];
@@ -20777,16 +21088,23 @@ var init_BranchingLogicBuilder = __esm({
20777
21088
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-wrap items-center justify-between gap-2", children: [
20778
21089
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-2", children: [
20779
21090
  /* @__PURE__ */ jsxRuntime.jsx(LucideIcons2.GitBranch, { className: "h-5 w-5 text-foreground" }),
20780
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "subheading", weight: "semibold", children: "Branching logic" }),
21091
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "subheading", weight: "semibold", children: t("branchingLogic.title") }),
20781
21092
  /* @__PURE__ */ jsxRuntime.jsx(
20782
21093
  Badge,
20783
21094
  {
20784
21095
  variant: "neutral",
20785
21096
  size: "sm",
20786
- label: `${rules.length} rule${rules.length === 1 ? "" : "s"}`
21097
+ label: rules.length === 1 ? t("branchingLogic.ruleCountOne", { count: rules.length }) : t("branchingLogic.ruleCountOther", { count: rules.length })
20787
21098
  }
20788
21099
  ),
20789
- brokenCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "error", size: "sm", label: `${brokenCount} broken` })
21100
+ brokenCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
21101
+ Badge,
21102
+ {
21103
+ variant: "error",
21104
+ size: "sm",
21105
+ label: t("branchingLogic.brokenCount", { count: brokenCount })
21106
+ }
21107
+ )
20790
21108
  ] }),
20791
21109
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-1 rounded-sm border border-border bg-card p-0.5", children: [
20792
21110
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -20797,7 +21115,7 @@ var init_BranchingLogicBuilder = __esm({
20797
21115
  leftIcon: LucideIcons2.Pencil,
20798
21116
  action: "VIEW_EDIT",
20799
21117
  onClick: () => setView("edit"),
20800
- children: "Rules"
21118
+ children: t("branchingLogic.rules")
20801
21119
  }
20802
21120
  ),
20803
21121
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -20808,13 +21126,13 @@ var init_BranchingLogicBuilder = __esm({
20808
21126
  leftIcon: LucideIcons2.Eye,
20809
21127
  action: "VIEW_GRAPH",
20810
21128
  onClick: () => setView("graph"),
20811
- children: "Logic graph"
21129
+ children: t("branchingLogic.logicGraph")
20812
21130
  }
20813
21131
  )
20814
21132
  ] })
20815
21133
  ] }),
20816
21134
  view === "edit" ? /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-col gap-2", children: [
20817
- rules.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(Card, { variant: "bordered", padding: "lg", className: "text-center", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", color: "muted", children: noQuestions ? "Add questions before building branching rules." : "No rules yet. Add a rule to define branching logic." }) }) : rules.map((rule) => /* @__PURE__ */ jsxRuntime.jsx(
21135
+ rules.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(Card, { variant: "bordered", padding: "lg", className: "text-center", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", color: "muted", children: noQuestions ? t("branchingLogic.emptyNoQuestions") : t("branchingLogic.emptyNoRules") }) }) : rules.map((rule) => /* @__PURE__ */ jsxRuntime.jsx(
20818
21136
  RuleRow,
20819
21137
  {
20820
21138
  rule,
@@ -20835,7 +21153,7 @@ var init_BranchingLogicBuilder = __esm({
20835
21153
  action: "ADD_RULE",
20836
21154
  onClick: handleAddRule,
20837
21155
  disabled: noQuestions,
20838
- children: "Add rule"
21156
+ children: t("branchingLogic.addRule")
20839
21157
  }
20840
21158
  ) })
20841
21159
  ] }) : /* @__PURE__ */ jsxRuntime.jsx(LogicGraph, { questions, rules })
@@ -21462,7 +21780,7 @@ function CalendarGrid({
21462
21780
  onClick: stepPrev,
21463
21781
  "aria-disabled": !canPrev || void 0,
21464
21782
  "aria-label": t("aria.previousDays"),
21465
- children: "Prev"
21783
+ children: t("nav.previous")
21466
21784
  }
21467
21785
  ),
21468
21786
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground", children: formatDateRange(visibleDays[0], visibleDays[visibleDays.length - 1]) }),
@@ -21475,7 +21793,7 @@ function CalendarGrid({
21475
21793
  onClick: stepNext,
21476
21794
  "aria-disabled": !canNext || void 0,
21477
21795
  "aria-label": t("aria.nextDays"),
21478
- children: "Next"
21796
+ children: t("nav.next")
21479
21797
  }
21480
21798
  )
21481
21799
  ] }),
@@ -23025,7 +23343,7 @@ var init_Pagination = __esm({
23025
23343
  type: "number",
23026
23344
  value: jumpToPage,
23027
23345
  onChange: (e) => setJumpToPage(e.target.value),
23028
- placeholder: "Page",
23346
+ placeholder: t("pagination.jumpPlaceholder"),
23029
23347
  className: "w-20",
23030
23348
  onKeyDown: (e) => {
23031
23349
  if (e.key === "Enter") {
@@ -23163,13 +23481,10 @@ var init_CardGrid = __esm({
23163
23481
  return children;
23164
23482
  }
23165
23483
  if (isLoading) {
23166
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "col-span-full text-center py-8 text-muted-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", color: "secondary", children: "Loading items..." }) });
23484
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "col-span-full text-center py-8 text-muted-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", color: "secondary", children: t("loading.items") }) });
23167
23485
  }
23168
23486
  if (error) {
23169
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "col-span-full text-center py-8 text-error", children: /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "body", color: "error", children: [
23170
- "Error loading items: ",
23171
- error.message
23172
- ] }) });
23487
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "col-span-full text-center py-8 text-error", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", color: "error", children: t("error.loadFailed", { message: error.message }) }) });
23173
23488
  }
23174
23489
  if (normalizedData.length === 0) {
23175
23490
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "col-span-full text-center py-12 text-muted-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", color: "secondary", children: t("empty.noItems") || "No items found" }) });
@@ -27035,7 +27350,7 @@ function DataGrid({
27035
27350
  onChange: () => toggleSelection(id),
27036
27351
  onClick: (e) => e.stopPropagation(),
27037
27352
  className: "w-4 h-4 mt-1 flex-shrink-0 accent-primary",
27038
- "aria-label": `Select ${titleValue !== void 0 ? String(titleValue) : "item"}`
27353
+ "aria-label": t("card.selectItem", { item: titleValue !== void 0 ? String(titleValue) : t("card.itemFallback") })
27039
27354
  }
27040
27355
  ),
27041
27356
  /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "xs", className: "flex-1 min-w-0", children: [
@@ -27233,7 +27548,7 @@ function formatDate3(value) {
27233
27548
  if (isNaN(d.getTime())) return String(value);
27234
27549
  return d.toLocaleDateString(void 0, { year: "numeric", month: "short", day: "numeric" });
27235
27550
  }
27236
- function formatValue2(value, format) {
27551
+ function formatValue2(value, format, boolLabels) {
27237
27552
  if (value === void 0 || value === null) return "";
27238
27553
  switch (format) {
27239
27554
  case "date":
@@ -27245,7 +27560,7 @@ function formatValue2(value, format) {
27245
27560
  case "percent":
27246
27561
  return typeof value === "number" ? `${Math.round(value)}%` : String(value);
27247
27562
  case "boolean":
27248
- return value ? "Yes" : "No";
27563
+ return value ? boolLabels?.yes ?? "Yes" : boolLabels?.no ?? "No";
27249
27564
  default:
27250
27565
  return String(value);
27251
27566
  }
@@ -27541,7 +27856,7 @@ function DataList({
27541
27856
  field.label ?? fieldLabel3(field.name),
27542
27857
  ":"
27543
27858
  ] }),
27544
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: formatValue2(value, field.format) })
27859
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
27545
27860
  ] }, field.name);
27546
27861
  }) }),
27547
27862
  progressFields.map((field) => {
@@ -27671,6 +27986,7 @@ var init_FileTree = __esm({
27671
27986
  init_Box();
27672
27987
  init_Typography();
27673
27988
  init_Icon();
27989
+ init_useTranslate();
27674
27990
  TreeNodeItem = ({
27675
27991
  node,
27676
27992
  depth,
@@ -27756,8 +28072,9 @@ var init_FileTree = __esm({
27756
28072
  className,
27757
28073
  indent = 16
27758
28074
  }) => {
28075
+ const { t } = useTranslate();
27759
28076
  if (tree.length === 0) {
27760
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "muted", children: "No files" }) });
28077
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "muted", children: t("fileTree.noFiles") }) });
27761
28078
  }
27762
28079
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `py-1 overflow-y-auto ${className ?? ""}`, role: "tree", children: tree.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
27763
28080
  TreeNodeItem,
@@ -27876,6 +28193,7 @@ var init_FilterGroup = __esm({
27876
28193
  init_Icon();
27877
28194
  init_useEventBus();
27878
28195
  init_useQuerySingleton();
28196
+ init_useTranslate();
27879
28197
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
27880
28198
  lookStyles6 = {
27881
28199
  toolbar: "",
@@ -27896,6 +28214,7 @@ var init_FilterGroup = __esm({
27896
28214
  isLoading,
27897
28215
  look = "toolbar"
27898
28216
  }) => {
28217
+ const { t } = useTranslate();
27899
28218
  const eventBus = useEventBus();
27900
28219
  const queryState = useQuerySingleton(query);
27901
28220
  const [selectedValues, setSelectedValues] = React97.useState(
@@ -27977,7 +28296,7 @@ var init_FilterGroup = __esm({
27977
28296
  "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
27978
28297
  !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
27979
28298
  ),
27980
- children: "All"
28299
+ children: t("filterGroup.all")
27981
28300
  }
27982
28301
  ),
27983
28302
  filter.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -28005,7 +28324,7 @@ var init_FilterGroup = __esm({
28005
28324
  size: "sm",
28006
28325
  onClick: handleClearAll,
28007
28326
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
28008
- children: "Clear"
28327
+ children: t("filterGroup.clear")
28009
28328
  }
28010
28329
  )
28011
28330
  ]
@@ -28016,7 +28335,7 @@ var init_FilterGroup = __esm({
28016
28335
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", lookStyles6[look], className), children: [
28017
28336
  showIcon && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
28018
28337
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4" }),
28019
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
28338
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
28020
28339
  ] }),
28021
28340
  filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
28022
28341
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-xs font-bold text-muted-foreground uppercase tracking-wide", children: filter.label }),
@@ -28039,7 +28358,7 @@ var init_FilterGroup = __esm({
28039
28358
  `${filter.field}_from`,
28040
28359
  e.target.value || null
28041
28360
  ),
28042
- placeholder: "From",
28361
+ placeholder: t("filterGroup.from"),
28043
28362
  clearable: true,
28044
28363
  onClear: () => handleFilterSelect(`${filter.field}_from`, null)
28045
28364
  }
@@ -28053,7 +28372,7 @@ var init_FilterGroup = __esm({
28053
28372
  `${filter.field}_to`,
28054
28373
  e.target.value || null
28055
28374
  ),
28056
- placeholder: "To",
28375
+ placeholder: t("filterGroup.to"),
28057
28376
  clearable: true,
28058
28377
  onClear: () => handleFilterSelect(`${filter.field}_to`, null)
28059
28378
  }
@@ -28073,7 +28392,7 @@ var init_FilterGroup = __esm({
28073
28392
  value: selectedValues[filter.field] || "all",
28074
28393
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
28075
28394
  options: [
28076
- { value: "all", label: "All" },
28395
+ { value: "all", label: t("filterGroup.all") },
28077
28396
  ...filter.options?.map((opt) => ({
28078
28397
  value: opt,
28079
28398
  label: opt
@@ -28090,7 +28409,7 @@ var init_FilterGroup = __esm({
28090
28409
  onClick: handleClearAll,
28091
28410
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
28092
28411
  className: "self-start",
28093
- children: "Clear all"
28412
+ children: t("filterGroup.clearAll")
28094
28413
  }
28095
28414
  )
28096
28415
  ] });
@@ -28156,7 +28475,7 @@ var init_FilterGroup = __esm({
28156
28475
  value: selectedValues[filter.field] || "all",
28157
28476
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
28158
28477
  options: [
28159
- { value: "all", label: `All ${filter.label}` },
28478
+ { value: "all", label: t("filterGroup.allOf", { label: filter.label }) },
28160
28479
  ...filter.options?.map((opt) => ({
28161
28480
  value: opt,
28162
28481
  label: opt
@@ -28185,7 +28504,7 @@ var init_FilterGroup = __esm({
28185
28504
  field
28186
28505
  );
28187
28506
  }),
28188
- /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
28507
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: t("filterGroup.clearAll") })
28189
28508
  ] })
28190
28509
  ]
28191
28510
  }
@@ -28210,7 +28529,7 @@ var init_FilterGroup = __esm({
28210
28529
  className: "text-muted-foreground",
28211
28530
  children: [
28212
28531
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4" }),
28213
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
28532
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
28214
28533
  ]
28215
28534
  }
28216
28535
  ),
@@ -28236,7 +28555,7 @@ var init_FilterGroup = __esm({
28236
28555
  `${filter.field}_from`,
28237
28556
  e.target.value || null
28238
28557
  ),
28239
- placeholder: "From",
28558
+ placeholder: t("filterGroup.from"),
28240
28559
  clearable: true,
28241
28560
  onClear: () => handleFilterSelect(`${filter.field}_from`, null),
28242
28561
  className: "min-w-[130px]"
@@ -28252,7 +28571,7 @@ var init_FilterGroup = __esm({
28252
28571
  `${filter.field}_to`,
28253
28572
  e.target.value || null
28254
28573
  ),
28255
- placeholder: "To",
28574
+ placeholder: t("filterGroup.to"),
28256
28575
  clearable: true,
28257
28576
  onClear: () => handleFilterSelect(`${filter.field}_to`, null),
28258
28577
  className: "min-w-[130px]"
@@ -28274,7 +28593,7 @@ var init_FilterGroup = __esm({
28274
28593
  value: selectedValues[filter.field] || "all",
28275
28594
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
28276
28595
  options: [
28277
- { value: "all", label: "All" },
28596
+ { value: "all", label: t("filterGroup.all") },
28278
28597
  ...filter.options?.map((opt) => ({
28279
28598
  value: opt,
28280
28599
  label: opt
@@ -28285,10 +28604,7 @@ var init_FilterGroup = __esm({
28285
28604
  )
28286
28605
  ] }, filter.field)),
28287
28606
  activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: "ml-auto", children: [
28288
- /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "primary", size: "md", children: [
28289
- activeFilterCount,
28290
- " active"
28291
- ] }),
28607
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "md", children: t("filterGroup.activeCount", { count: activeFilterCount }) }),
28292
28608
  /* @__PURE__ */ jsxRuntime.jsx(
28293
28609
  Button,
28294
28610
  {
@@ -28296,7 +28612,7 @@ var init_FilterGroup = __esm({
28296
28612
  size: "sm",
28297
28613
  onClick: handleClearAll,
28298
28614
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
28299
- children: "Clear all"
28615
+ children: t("filterGroup.clearAll")
28300
28616
  }
28301
28617
  )
28302
28618
  ] })
@@ -29240,19 +29556,20 @@ var init_RepeatableFormSection = __esm({
29240
29556
  RepeatableFormSection.displayName = "RepeatableFormSection";
29241
29557
  }
29242
29558
  });
29243
- var actionTypeLabels, actionTypeIcons, ViolationAlert;
29559
+ var actionTypeLabelKeys, actionTypeIcons, ViolationAlert;
29244
29560
  var init_ViolationAlert = __esm({
29245
29561
  "components/core/molecules/ViolationAlert.tsx"() {
29246
29562
  init_cn();
29563
+ init_useTranslate();
29247
29564
  init_Box();
29248
29565
  init_Stack();
29249
29566
  init_Typography();
29250
29567
  init_Button();
29251
29568
  init_Icon();
29252
- actionTypeLabels = {
29253
- measure: "Corrective Measure",
29254
- admin: "Administrative Action",
29255
- penalty: "Penalty Proceedings"
29569
+ actionTypeLabelKeys = {
29570
+ measure: "violationAlert.actionType.measure",
29571
+ admin: "violationAlert.actionType.admin",
29572
+ penalty: "violationAlert.actionType.penalty"
29256
29573
  };
29257
29574
  actionTypeIcons = {
29258
29575
  measure: "alert-triangle",
@@ -29269,10 +29586,11 @@ var init_ViolationAlert = __esm({
29269
29586
  className,
29270
29587
  ...flatProps
29271
29588
  }) => {
29589
+ const { t } = useTranslate();
29272
29590
  const resolvedViolation = violation ?? {
29273
29591
  law: "",
29274
29592
  article: "",
29275
- message: flatProps.message ?? "Violation",
29593
+ message: flatProps.message ?? t("violationAlert.fallbackMessage"),
29276
29594
  actionType: "measure"
29277
29595
  };
29278
29596
  const effectiveSeverity = severity ?? (resolvedViolation.actionType === "measure" ? "warning" : "error");
@@ -29357,7 +29675,7 @@ var init_ViolationAlert = __esm({
29357
29675
  {
29358
29676
  variant: "caption",
29359
29677
  className: cn(textColor, "opacity-75"),
29360
- children: actionTypeLabels[resolvedViolation.actionType]
29678
+ children: t(actionTypeLabelKeys[resolvedViolation.actionType])
29361
29679
  }
29362
29680
  )
29363
29681
  ] })
@@ -29388,7 +29706,7 @@ var init_ViolationAlert = __esm({
29388
29706
  {
29389
29707
  variant: "caption",
29390
29708
  className: cn(textColor, "opacity-75"),
29391
- children: "Admin:"
29709
+ children: t("violationAlert.adminLabel")
29392
29710
  }
29393
29711
  ),
29394
29712
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -29407,7 +29725,7 @@ var init_ViolationAlert = __esm({
29407
29725
  {
29408
29726
  variant: "caption",
29409
29727
  className: cn(textColor, "opacity-75"),
29410
- children: "Penalty:"
29728
+ children: t("violationAlert.penaltyLabel")
29411
29729
  }
29412
29730
  ),
29413
29731
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -29432,7 +29750,7 @@ var init_ViolationAlert = __esm({
29432
29750
  className: cn(textColor, "self-start"),
29433
29751
  children: [
29434
29752
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "arrow-right", size: "sm", className: "mr-1" }),
29435
- "Go to field"
29753
+ t("violationAlert.goToField")
29436
29754
  ]
29437
29755
  }
29438
29756
  )
@@ -29748,6 +30066,7 @@ var init_LineChart = __esm({
29748
30066
  "use client";
29749
30067
  init_cn();
29750
30068
  init_atoms2();
30069
+ init_useTranslate();
29751
30070
  LineChart2 = ({
29752
30071
  data,
29753
30072
  width = 400,
@@ -29759,6 +30078,7 @@ var init_LineChart = __esm({
29759
30078
  areaColor = "var(--color-primary)",
29760
30079
  className
29761
30080
  }) => {
30081
+ const { t } = useTranslate();
29762
30082
  const gradientId = React97.useId();
29763
30083
  const safeData = data ?? [];
29764
30084
  const sortedData = React97.useMemo(() => {
@@ -29795,7 +30115,7 @@ var init_LineChart = __esm({
29795
30115
  return `${linePath} L ${last.x} ${bottom} L ${first.x} ${bottom} Z`;
29796
30116
  }, [linePath, points, height, showArea]);
29797
30117
  if (safeData.length === 0) {
29798
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex items-center justify-center text-muted-foreground", className), style: { width, height }, children: "No data" });
30118
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex items-center justify-center text-muted-foreground", className), style: { width, height }, children: t("empty.noData") });
29799
30119
  }
29800
30120
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn(className), children: /* @__PURE__ */ jsxRuntime.jsxs(
29801
30121
  "svg",
@@ -31702,6 +32022,7 @@ var init_GraphView = __esm({
31702
32022
  "use client";
31703
32023
  init_cn();
31704
32024
  init_atoms2();
32025
+ init_useTranslate();
31705
32026
  GROUP_COLORS = [
31706
32027
  "#3b82f6",
31707
32028
  // blue-500
@@ -31734,6 +32055,7 @@ var init_GraphView = __esm({
31734
32055
  showLabels = true,
31735
32056
  zoomToFit = true
31736
32057
  }) => {
32058
+ const { t } = useTranslate();
31737
32059
  const containerRef = React97.useRef(null);
31738
32060
  const animRef = React97.useRef(0);
31739
32061
  const [simNodes, setSimNodes] = React97.useState([]);
@@ -31911,7 +32233,7 @@ var init_GraphView = __esm({
31911
32233
  [onNodeClick]
31912
32234
  );
31913
32235
  if (nodes.length === 0) {
31914
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex items-center justify-center", className), style: { width: w, height: h }, children: /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "text-muted-foreground text-sm", children: "No graph data" }) });
32236
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex items-center justify-center", className), style: { width: w, height: h }, children: /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "text-muted-foreground text-sm", children: t("display.noGraphData") }) });
31915
32237
  }
31916
32238
  return /* @__PURE__ */ jsxRuntime.jsx(
31917
32239
  Box,
@@ -32367,11 +32689,12 @@ var init_UploadDropZone = __esm({
32367
32689
  init_Icon();
32368
32690
  init_Typography();
32369
32691
  init_useEventBus();
32692
+ init_useTranslate();
32370
32693
  UploadDropZone = ({
32371
32694
  accept,
32372
32695
  maxSize,
32373
32696
  maxFiles = 1,
32374
- label = "Drop files here or click to browse",
32697
+ label,
32375
32698
  description,
32376
32699
  disabled = false,
32377
32700
  action,
@@ -32379,22 +32702,24 @@ var init_UploadDropZone = __esm({
32379
32702
  onFiles,
32380
32703
  className
32381
32704
  }) => {
32705
+ const { t } = useTranslate();
32706
+ const resolvedLabel = label ?? t("upload.dropOrBrowse");
32382
32707
  const [isDragOver, setIsDragOver] = React97.useState(false);
32383
32708
  const [error, setError] = React97.useState(null);
32384
32709
  const inputRef = React97.useRef(null);
32385
32710
  const eventBus = useSafeEventBus7();
32386
32711
  const defaultDescription = [
32387
- accept ? `Accepted: ${accept}` : null,
32388
- maxSize ? `Max size: ${formatFileSize(maxSize)}` : null,
32389
- maxFiles > 1 ? `Up to ${maxFiles} files` : null
32712
+ accept ? t("upload.accepted", { accept }) : null,
32713
+ maxSize ? t("upload.maxSize", { size: formatFileSize(maxSize) }) : null,
32714
+ maxFiles > 1 ? t("upload.maxFiles", { count: maxFiles }) : null
32390
32715
  ].filter(Boolean).join(". ");
32391
32716
  const validateFiles = React97.useCallback(
32392
32717
  (files) => {
32393
32718
  if (files.length > maxFiles) {
32394
- return { valid: [], error: `Maximum ${maxFiles} file${maxFiles > 1 ? "s" : ""} allowed` };
32719
+ return { valid: [], error: t("upload.error.maxFiles", { count: maxFiles }) };
32395
32720
  }
32396
32721
  if (accept) {
32397
- const acceptedTypes = accept.split(",").map((t) => t.trim());
32722
+ const acceptedTypes = accept.split(",").map((s) => s.trim());
32398
32723
  const invalid = files.filter((file) => {
32399
32724
  return !acceptedTypes.some((type) => {
32400
32725
  if (type.endsWith("/*")) {
@@ -32404,7 +32729,7 @@ var init_UploadDropZone = __esm({
32404
32729
  });
32405
32730
  });
32406
32731
  if (invalid.length > 0) {
32407
- return { valid: [], error: `Invalid file type: ${invalid[0].name}` };
32732
+ return { valid: [], error: t("upload.error.invalidType", { name: invalid[0].name }) };
32408
32733
  }
32409
32734
  }
32410
32735
  if (maxSize) {
@@ -32412,13 +32737,13 @@ var init_UploadDropZone = __esm({
32412
32737
  if (tooLarge.length > 0) {
32413
32738
  return {
32414
32739
  valid: [],
32415
- error: `File too large: ${tooLarge[0].name} (max ${formatFileSize(maxSize)})`
32740
+ error: t("upload.error.tooLarge", { name: tooLarge[0].name, size: formatFileSize(maxSize) })
32416
32741
  };
32417
32742
  }
32418
32743
  }
32419
32744
  return { valid: files, error: null };
32420
32745
  },
32421
- [accept, maxSize, maxFiles]
32746
+ [accept, maxSize, maxFiles, t]
32422
32747
  );
32423
32748
  const handleFiles = React97.useCallback(
32424
32749
  (files) => {
@@ -32489,7 +32814,7 @@ var init_UploadDropZone = __esm({
32489
32814
  handleClick();
32490
32815
  }
32491
32816
  },
32492
- "aria-label": label,
32817
+ "aria-label": resolvedLabel,
32493
32818
  children: [
32494
32819
  /* @__PURE__ */ jsxRuntime.jsx(
32495
32820
  "input",
@@ -32505,7 +32830,7 @@ var init_UploadDropZone = __esm({
32505
32830
  }
32506
32831
  ),
32507
32832
  error ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "file-warning", size: "lg", className: "text-error mb-2" }) : /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "upload", size: "lg", className: "text-muted-foreground mb-2" }),
32508
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body1", className: "text-center font-medium mb-1", children: isDragOver ? "Drop files here" : label }),
32833
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body1", className: "text-center font-medium mb-1", children: isDragOver ? t("upload.dropFilesHere") : resolvedLabel }),
32509
32834
  error ? /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "error", className: "text-center", children: error }) : /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "muted", className: "text-center", children: description ?? defaultDescription })
32510
32835
  ]
32511
32836
  }
@@ -32927,7 +33252,7 @@ function TableView({
32927
33252
  {
32928
33253
  checked: selected.has(id),
32929
33254
  onChange: () => toggleRow(id),
32930
- "aria-label": `Select row ${id}`
33255
+ "aria-label": t("table.selectRow", { id })
32931
33256
  }
32932
33257
  ) }),
32933
33258
  hasRenderProp ? /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex-1 min-w-0", children: children(row, index) }) : colDefs.map((col) => {
@@ -35774,7 +36099,7 @@ var init_QrScanner = __esm({
35774
36099
  className: "inset-0 flex-col items-center justify-center gap-2 bg-black bg-opacity-80 text-center",
35775
36100
  children: [
35776
36101
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "camera", className: "h-8 w-8 text-white", "aria-hidden": "true" }),
35777
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body2", className: "text-white", children: "Camera unavailable" }),
36102
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body2", className: "text-white", children: t("qrScanner.cameraUnavailable") }),
35778
36103
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", className: "text-white opacity-70", children: cameraError.message })
35779
36104
  ]
35780
36105
  }
@@ -35785,7 +36110,7 @@ var init_QrScanner = __esm({
35785
36110
  position: "absolute",
35786
36111
  display: "flex",
35787
36112
  className: "inset-0 items-center justify-center bg-black bg-opacity-60",
35788
- children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body2", className: "text-white", children: "Paused" })
36113
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body2", className: "text-white", children: t("qrScanner.paused") })
35789
36114
  }
35790
36115
  ),
35791
36116
  showCameraControls && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -35804,7 +36129,7 @@ var init_QrScanner = __esm({
35804
36129
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
35805
36130
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
35806
36131
  ),
35807
- "aria-label": isPaused ? "Resume scanning" : "Pause scanning",
36132
+ "aria-label": isPaused ? t("qrScanner.resumeScanning") : t("qrScanner.pauseScanning"),
35808
36133
  children: isPaused ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "play", className: "h-4 w-4" }) : /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "pause", className: "h-4 w-4" })
35809
36134
  }
35810
36135
  ),
@@ -35817,7 +36142,7 @@ var init_QrScanner = __esm({
35817
36142
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
35818
36143
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
35819
36144
  ),
35820
- "aria-label": `Switch to ${currentFacing === "environment" ? "front" : "rear"} camera`,
36145
+ "aria-label": currentFacing === "environment" ? t("qrScanner.switchToFrontCamera") : t("qrScanner.switchToRearCamera"),
35821
36146
  children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "refresh-cw", className: "h-4 w-4" })
35822
36147
  }
35823
36148
  ),
@@ -35831,7 +36156,7 @@ var init_QrScanner = __esm({
35831
36156
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
35832
36157
  ),
35833
36158
  "aria-label": t("aria.mockScanDev"),
35834
- children: "Mock Scan"
36159
+ children: t("qrScanner.mockScan")
35835
36160
  }
35836
36161
  )
35837
36162
  ]
@@ -35849,6 +36174,7 @@ var init_OptionConstraintGroup = __esm({
35849
36174
  "components/core/molecules/OptionConstraintGroup.tsx"() {
35850
36175
  init_cn();
35851
36176
  init_useEventBus();
36177
+ init_useTranslate();
35852
36178
  init_Typography();
35853
36179
  init_Box();
35854
36180
  init_Label();
@@ -35858,36 +36184,36 @@ var init_OptionConstraintGroup = __esm({
35858
36184
  const sign = delta >= 0 ? "+" : "-";
35859
36185
  return `${sign}$${Math.abs(delta).toFixed(2)}`;
35860
36186
  };
35861
- constraintHint = (constraint) => {
36187
+ constraintHint = (constraint, t) => {
35862
36188
  if (constraint.type === "single") {
35863
- return constraint.required ? "Required, pick 1" : "Optional, pick up to 1";
36189
+ return constraint.required ? t("optionConstraint.requiredOne") : t("optionConstraint.optionalOne");
35864
36190
  }
35865
36191
  const { min, max } = constraint;
35866
36192
  if (min && max) {
35867
- return min === max ? `Pick exactly ${min}` : `Pick ${min}-${max}`;
36193
+ return min === max ? t("optionConstraint.pickExactly", { count: min }) : t("optionConstraint.pickRange", { min, max });
35868
36194
  }
35869
- if (min) return `Pick at least ${min}`;
35870
- if (max) return `Pick up to ${max}`;
35871
- return "Optional";
36195
+ if (min) return t("optionConstraint.pickAtLeast", { count: min });
36196
+ if (max) return t("optionConstraint.pickUpTo", { count: max });
36197
+ return t("optionConstraint.optional");
35872
36198
  };
35873
- validateSelection = (selected, constraint) => {
36199
+ validateSelection = (selected, constraint, t) => {
35874
36200
  if (constraint.type === "single") {
35875
36201
  if (constraint.required && selected.length === 0) {
35876
- return "Pick 1 option";
36202
+ return t("optionConstraint.error.pickOne");
35877
36203
  }
35878
36204
  if (selected.length > 1) {
35879
- return "Pick only 1 option";
36205
+ return t("optionConstraint.error.pickOnlyOne");
35880
36206
  }
35881
36207
  return void 0;
35882
36208
  }
35883
36209
  const { min, max } = constraint;
35884
36210
  if (min !== void 0 && selected.length < min) {
35885
36211
  const remaining = min - selected.length;
35886
- return `Pick at least ${remaining} more`;
36212
+ return t("optionConstraint.error.pickMore", { count: remaining });
35887
36213
  }
35888
36214
  if (max !== void 0 && selected.length > max) {
35889
36215
  const excess = selected.length - max;
35890
- return `Remove ${excess} option${excess === 1 ? "" : "s"}`;
36216
+ return t("optionConstraint.error.removeOptions", { count: excess });
35891
36217
  }
35892
36218
  return void 0;
35893
36219
  };
@@ -35904,8 +36230,9 @@ var init_OptionConstraintGroup = __esm({
35904
36230
  className
35905
36231
  }) => {
35906
36232
  const eventBus = useEventBus();
35907
- const hint = constraintHint(constraint);
35908
- const error = validateSelection(selected, constraint);
36233
+ const { t } = useTranslate();
36234
+ const hint = constraintHint(constraint, t);
36235
+ const error = validateSelection(selected, constraint, t);
35909
36236
  const inputName = `option-${groupId}`;
35910
36237
  const labelTextSize = size === "sm" ? "text-sm" : "text-base";
35911
36238
  const optionGap = size === "sm" ? "gap-2" : "gap-2.5";
@@ -36005,7 +36332,7 @@ var init_OptionConstraintGroup = __esm({
36005
36332
  variant: "caption",
36006
36333
  color: "warning",
36007
36334
  className: "rounded border border-warning/40 px-1.5 py-0.5",
36008
- children: "Out of stock"
36335
+ children: t("optionConstraint.outOfStock")
36009
36336
  }
36010
36337
  )
36011
36338
  ]
@@ -36327,6 +36654,7 @@ function changeBlockType(block, type) {
36327
36654
  return { id: block.id, type, content: seed };
36328
36655
  }
36329
36656
  function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36657
+ const { t } = useTranslate();
36330
36658
  const [open, setOpen] = React97.useState(false);
36331
36659
  const ref = React97.useRef(null);
36332
36660
  React97.useEffect(() => {
@@ -36346,7 +36674,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36346
36674
  {
36347
36675
  type: "button",
36348
36676
  variant: "ghost",
36349
- "aria-label": "Block actions",
36677
+ "aria-label": t("richBlockEditor.blockActions"),
36350
36678
  className: cn(
36351
36679
  "inline-flex items-center justify-center",
36352
36680
  "h-6 w-6 rounded-sm p-0 gap-0",
@@ -36368,7 +36696,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36368
36696
  "py-1 text-sm"
36369
36697
  ),
36370
36698
  children: [
36371
- /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: BLOCK_TYPE_LABEL[block.type] }),
36699
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: t(BLOCK_TYPE_LABEL_KEY[block.type]) }),
36372
36700
  /* @__PURE__ */ jsxRuntime.jsxs(
36373
36701
  Button,
36374
36702
  {
@@ -36382,7 +36710,8 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36382
36710
  },
36383
36711
  children: [
36384
36712
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", className: "w-3.5 h-3.5" }),
36385
- " Duplicate"
36713
+ " ",
36714
+ t("richBlockEditor.duplicate")
36386
36715
  ]
36387
36716
  }
36388
36717
  ),
@@ -36399,14 +36728,15 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36399
36728
  },
36400
36729
  children: [
36401
36730
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "trash", className: "w-3.5 h-3.5" }),
36402
- " Delete"
36731
+ " ",
36732
+ t("common.delete")
36403
36733
  ]
36404
36734
  }
36405
36735
  ),
36406
36736
  CHANGEABLE_TYPES.includes(block.type) && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
36407
36737
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "my-1 border-t border-border" }),
36408
- /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: "Turn into" }),
36409
- CHANGEABLE_TYPES.filter((t) => t !== block.type).map((t) => /* @__PURE__ */ jsxRuntime.jsx(
36738
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: t("richBlockEditor.turnInto") }),
36739
+ CHANGEABLE_TYPES.filter((bt) => bt !== block.type).map((bt) => /* @__PURE__ */ jsxRuntime.jsx(
36410
36740
  Button,
36411
36741
  {
36412
36742
  type: "button",
@@ -36414,12 +36744,12 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36414
36744
  role: "menuitem",
36415
36745
  className: "flex w-full items-center gap-2 px-2 py-1.5 text-left justify-start rounded-none",
36416
36746
  onClick: () => {
36417
- onChangeType(t);
36747
+ onChangeType(bt);
36418
36748
  setOpen(false);
36419
36749
  },
36420
- children: BLOCK_TYPE_LABEL[t]
36750
+ children: t(BLOCK_TYPE_LABEL_KEY[bt])
36421
36751
  },
36422
- t
36752
+ bt
36423
36753
  ))
36424
36754
  ] })
36425
36755
  ]
@@ -36481,6 +36811,7 @@ function BlockRow({
36481
36811
  onInsertAfter,
36482
36812
  onChangeType
36483
36813
  }) {
36814
+ const { t } = useTranslate();
36484
36815
  const setContent = React97.useCallback(
36485
36816
  (next) => onUpdate((b) => ({ ...b, content: next })),
36486
36817
  [onUpdate]
@@ -36530,8 +36861,8 @@ function BlockRow({
36530
36861
  tag: "h1",
36531
36862
  value: block.content ?? "",
36532
36863
  readOnly,
36533
- placeholder: placeholder ?? "Heading 1",
36534
- ariaLabel: "Heading 1 block",
36864
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading1"),
36865
+ ariaLabel: t("richBlockEditor.aria.heading1Block"),
36535
36866
  className: "text-3xl font-bold leading-tight",
36536
36867
  onValueChange: setContent
36537
36868
  }
@@ -36543,8 +36874,8 @@ function BlockRow({
36543
36874
  tag: "h2",
36544
36875
  value: block.content ?? "",
36545
36876
  readOnly,
36546
- placeholder: placeholder ?? "Heading 2",
36547
- ariaLabel: "Heading 2 block",
36877
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading2"),
36878
+ ariaLabel: t("richBlockEditor.aria.heading2Block"),
36548
36879
  className: "text-2xl font-semibold leading-tight",
36549
36880
  onValueChange: setContent
36550
36881
  }
@@ -36556,8 +36887,8 @@ function BlockRow({
36556
36887
  tag: "h3",
36557
36888
  value: block.content ?? "",
36558
36889
  readOnly,
36559
- placeholder: placeholder ?? "Heading 3",
36560
- ariaLabel: "Heading 3 block",
36890
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading3"),
36891
+ ariaLabel: t("richBlockEditor.aria.heading3Block"),
36561
36892
  className: "text-xl font-semibold leading-tight",
36562
36893
  onValueChange: setContent
36563
36894
  }
@@ -36569,8 +36900,8 @@ function BlockRow({
36569
36900
  tag: "blockquote",
36570
36901
  value: block.content ?? "",
36571
36902
  readOnly,
36572
- placeholder: placeholder ?? "Quote",
36573
- ariaLabel: "Quote block",
36903
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.quote"),
36904
+ ariaLabel: t("richBlockEditor.aria.quoteBlock"),
36574
36905
  className: "border-l-4 border-primary/60 pl-4 italic text-muted-foreground",
36575
36906
  onValueChange: setContent
36576
36907
  }
@@ -36578,13 +36909,13 @@ function BlockRow({
36578
36909
  case "code":
36579
36910
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "rounded-md border border-border bg-muted/40", children: [
36580
36911
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center justify-between border-b border-border px-3 py-1 text-xs text-muted-foreground", children: [
36581
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", variant: "caption", className: "uppercase tracking-wide", children: "Code" }),
36912
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", variant: "caption", className: "uppercase tracking-wide", children: t("richBlockEditor.blockType.code") }),
36582
36913
  !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
36583
36914
  Input,
36584
36915
  {
36585
36916
  inputType: "text",
36586
36917
  value: String(block.metadata?.language ?? "plaintext"),
36587
- "aria-label": "Code language",
36918
+ "aria-label": t("richBlockEditor.aria.codeLanguage"),
36588
36919
  className: cn(
36589
36920
  "h-6 w-32 rounded-sm border border-border bg-background",
36590
36921
  "px-2 text-xs outline-none focus:ring-1 focus:ring-ring"
@@ -36600,8 +36931,8 @@ function BlockRow({
36600
36931
  tag: "pre",
36601
36932
  value: block.content ?? "",
36602
36933
  readOnly,
36603
- placeholder: placeholder ?? "Enter code",
36604
- ariaLabel: "Code block",
36934
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.code"),
36935
+ ariaLabel: t("richBlockEditor.aria.codeBlock"),
36605
36936
  className: "block whitespace-pre-wrap p-3 font-mono text-sm leading-relaxed",
36606
36937
  onValueChange: setContent
36607
36938
  }
@@ -36614,7 +36945,7 @@ function BlockRow({
36614
36945
  const caption = String(block.metadata?.caption ?? "");
36615
36946
  const imgProps = {
36616
36947
  src: url,
36617
- alt: caption || "Embedded image",
36948
+ alt: caption || t("richBlockEditor.embeddedImage"),
36618
36949
  className: "max-h-96 w-full rounded-md border border-border object-contain"
36619
36950
  };
36620
36951
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "space-y-2", children: [
@@ -36628,7 +36959,8 @@ function BlockRow({
36628
36959
  ),
36629
36960
  children: [
36630
36961
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "image", className: "mr-2 w-4 h-4" }),
36631
- " No image URL set"
36962
+ " ",
36963
+ t("richBlockEditor.noImageUrl")
36632
36964
  ]
36633
36965
  }
36634
36966
  ),
@@ -36639,7 +36971,7 @@ function BlockRow({
36639
36971
  inputType: "url",
36640
36972
  value: url,
36641
36973
  placeholder: "https://example.com/image.png",
36642
- "aria-label": "Image URL",
36974
+ "aria-label": t("richBlockEditor.aria.imageUrl"),
36643
36975
  className: cn(
36644
36976
  "h-8 flex-1 rounded-sm border border-border bg-background",
36645
36977
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -36652,8 +36984,8 @@ function BlockRow({
36652
36984
  {
36653
36985
  inputType: "text",
36654
36986
  value: caption,
36655
- placeholder: "Caption (optional)",
36656
- "aria-label": "Image caption",
36987
+ placeholder: t("richBlockEditor.placeholder.caption"),
36988
+ "aria-label": t("richBlockEditor.aria.imageCaption"),
36657
36989
  className: cn(
36658
36990
  "h-8 flex-1 rounded-sm border border-border bg-background",
36659
36991
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -36684,8 +37016,8 @@ function BlockRow({
36684
37016
  tag: "span",
36685
37017
  value: child.content ?? "",
36686
37018
  readOnly,
36687
- placeholder: "List item",
36688
- ariaLabel: "List item",
37019
+ placeholder: t("richBlockEditor.placeholder.listItem"),
37020
+ ariaLabel: t("richBlockEditor.aria.listItem"),
36689
37021
  className: "inline-block min-w-[1ch] flex-1",
36690
37022
  onValueChange: (next) => setChildContent(child.id, next)
36691
37023
  }
@@ -36695,7 +37027,7 @@ function BlockRow({
36695
37027
  {
36696
37028
  type: "button",
36697
37029
  variant: "ghost",
36698
- "aria-label": "Remove list item",
37030
+ "aria-label": t("richBlockEditor.aria.removeListItem"),
36699
37031
  className: cn(
36700
37032
  "h-5 w-5 shrink-0 rounded-sm text-muted-foreground p-0 gap-0",
36701
37033
  "opacity-0 group-hover/item:opacity-100 hover:bg-muted hover:text-foreground"
@@ -36717,7 +37049,8 @@ function BlockRow({
36717
37049
  onClick: addListItem,
36718
37050
  children: [
36719
37051
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", className: "w-3 h-3" }),
36720
- " Add item"
37052
+ " ",
37053
+ t("richBlockEditor.addItem")
36721
37054
  ]
36722
37055
  }
36723
37056
  ) })
@@ -36733,8 +37066,8 @@ function BlockRow({
36733
37066
  tag: "p",
36734
37067
  value: block.content ?? "",
36735
37068
  readOnly,
36736
- placeholder: placeholder ?? "Start writing...",
36737
- ariaLabel: "Paragraph block",
37069
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.paragraph"),
37070
+ ariaLabel: t("richBlockEditor.aria.paragraphBlock"),
36738
37071
  className: "leading-7",
36739
37072
  onValueChange: setContent
36740
37073
  }
@@ -36757,7 +37090,7 @@ function BlockRow({
36757
37090
  {
36758
37091
  type: "button",
36759
37092
  variant: "ghost",
36760
- "aria-label": "Insert paragraph below",
37093
+ "aria-label": t("richBlockEditor.insertParagraphBelow"),
36761
37094
  className: cn(
36762
37095
  "inline-flex h-6 w-6 items-center justify-center rounded-sm p-0 gap-0",
36763
37096
  "text-muted-foreground hover:bg-muted hover:text-foreground",
@@ -36784,7 +37117,7 @@ function BlockRow({
36784
37117
  }
36785
37118
  );
36786
37119
  }
36787
- var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES, RichBlockEditor;
37120
+ var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL_KEY, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES, RichBlockEditor;
36788
37121
  var init_RichBlockEditor = __esm({
36789
37122
  "components/core/molecules/RichBlockEditor.tsx"() {
36790
37123
  "use client";
@@ -36797,29 +37130,30 @@ var init_RichBlockEditor = __esm({
36797
37130
  init_Input();
36798
37131
  init_Icon();
36799
37132
  init_useEventBus();
37133
+ init_useTranslate();
36800
37134
  TOOLBAR_ENTRIES = [
36801
- { type: "paragraph", label: "Text", icon: LucideIcons2.Type },
36802
- { type: "heading-1", label: "H1", icon: LucideIcons2.Heading1 },
36803
- { type: "heading-2", label: "H2", icon: LucideIcons2.Heading2 },
36804
- { type: "heading-3", label: "H3", icon: LucideIcons2.Heading3 },
36805
- { type: "bullet-list", label: "Bullet list", icon: LucideIcons2.List },
36806
- { type: "numbered-list", label: "Numbered", icon: LucideIcons2.ListOrdered },
36807
- { type: "quote", label: "Quote", icon: LucideIcons2.Quote },
36808
- { type: "code", label: "Code", icon: LucideIcons2.Code },
36809
- { type: "divider", label: "Divider", icon: LucideIcons2.Minus },
36810
- { type: "image", label: "Image", icon: LucideIcons2.Image }
37135
+ { type: "paragraph", labelKey: "richBlockEditor.toolbar.text", icon: LucideIcons2.Type },
37136
+ { type: "heading-1", labelKey: "richBlockEditor.toolbar.h1", icon: LucideIcons2.Heading1 },
37137
+ { type: "heading-2", labelKey: "richBlockEditor.toolbar.h2", icon: LucideIcons2.Heading2 },
37138
+ { type: "heading-3", labelKey: "richBlockEditor.toolbar.h3", icon: LucideIcons2.Heading3 },
37139
+ { type: "bullet-list", labelKey: "richBlockEditor.toolbar.bulletList", icon: LucideIcons2.List },
37140
+ { type: "numbered-list", labelKey: "richBlockEditor.toolbar.numbered", icon: LucideIcons2.ListOrdered },
37141
+ { type: "quote", labelKey: "richBlockEditor.toolbar.quote", icon: LucideIcons2.Quote },
37142
+ { type: "code", labelKey: "richBlockEditor.toolbar.code", icon: LucideIcons2.Code },
37143
+ { type: "divider", labelKey: "richBlockEditor.toolbar.divider", icon: LucideIcons2.Minus },
37144
+ { type: "image", labelKey: "richBlockEditor.toolbar.image", icon: LucideIcons2.Image }
36811
37145
  ];
36812
- BLOCK_TYPE_LABEL = {
36813
- paragraph: "Text",
36814
- "heading-1": "Heading 1",
36815
- "heading-2": "Heading 2",
36816
- "heading-3": "Heading 3",
36817
- "bullet-list": "Bullet list",
36818
- "numbered-list": "Numbered list",
36819
- quote: "Quote",
36820
- code: "Code",
36821
- divider: "Divider",
36822
- image: "Image"
37146
+ BLOCK_TYPE_LABEL_KEY = {
37147
+ paragraph: "richBlockEditor.blockType.paragraph",
37148
+ "heading-1": "richBlockEditor.blockType.heading1",
37149
+ "heading-2": "richBlockEditor.blockType.heading2",
37150
+ "heading-3": "richBlockEditor.blockType.heading3",
37151
+ "bullet-list": "richBlockEditor.blockType.bulletList",
37152
+ "numbered-list": "richBlockEditor.blockType.numberedList",
37153
+ quote: "richBlockEditor.blockType.quote",
37154
+ code: "richBlockEditor.blockType.code",
37155
+ divider: "richBlockEditor.blockType.divider",
37156
+ image: "richBlockEditor.blockType.image"
36823
37157
  };
36824
37158
  CHANGEABLE_TYPES = [
36825
37159
  "paragraph",
@@ -36853,6 +37187,7 @@ var init_RichBlockEditor = __esm({
36853
37187
  showToolbar = true,
36854
37188
  className
36855
37189
  }) => {
37190
+ const { t } = useTranslate();
36856
37191
  const [blocks, setBlocks] = React97.useState(
36857
37192
  () => normalizeBlocks(initialBlocks)
36858
37193
  );
@@ -36924,25 +37259,26 @@ var init_RichBlockEditor = __esm({
36924
37259
  Box,
36925
37260
  {
36926
37261
  role: "toolbar",
36927
- "aria-label": "Block editor toolbar",
37262
+ "aria-label": t("richBlockEditor.editorToolbar"),
36928
37263
  className: cn(
36929
37264
  "flex flex-wrap items-center gap-1",
36930
37265
  "border-b border-border bg-muted/30 px-2 py-2"
36931
37266
  ),
36932
37267
  children: TOOLBAR_ENTRIES.map((entry) => {
36933
37268
  const Icon3 = entry.icon;
37269
+ const entryLabel = t(entry.labelKey);
36934
37270
  return /* @__PURE__ */ jsxRuntime.jsxs(
36935
37271
  Button,
36936
37272
  {
36937
37273
  type: "button",
36938
37274
  variant: "ghost",
36939
37275
  size: "sm",
36940
- "aria-label": `Insert ${entry.label}`,
36941
- title: entry.label,
37276
+ "aria-label": t("richBlockEditor.insertEntry", { label: entryLabel }),
37277
+ title: entryLabel,
36942
37278
  onClick: () => handleAppend(entry.type),
36943
37279
  children: [
36944
37280
  /* @__PURE__ */ jsxRuntime.jsx(Icon3, { size: 14 }),
36945
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", variant: "caption", className: "ml-1 hidden text-xs sm:inline", children: entry.label })
37281
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", variant: "caption", className: "ml-1 hidden text-xs sm:inline", children: entryLabel })
36946
37282
  ]
36947
37283
  },
36948
37284
  entry.type
@@ -36985,6 +37321,7 @@ var init_ReplyTree = __esm({
36985
37321
  "use client";
36986
37322
  init_cn();
36987
37323
  init_useEventBus();
37324
+ init_useTranslate();
36988
37325
  init_atoms2();
36989
37326
  init_VoteStack();
36990
37327
  ReplyTreeNode = ({
@@ -37004,6 +37341,7 @@ var init_ReplyTree = __esm({
37004
37341
  showActions
37005
37342
  }) => {
37006
37343
  const eventBus = useEventBus();
37344
+ const { t } = useTranslate();
37007
37345
  const hasReplies = !!node.replies && node.replies.length > 0;
37008
37346
  const isCollapsed = collapsedSet.has(node.id);
37009
37347
  const atMaxDepth = depth >= maxDepth;
@@ -37050,7 +37388,7 @@ var init_ReplyTree = __esm({
37050
37388
  variant: "ghost",
37051
37389
  size: "sm",
37052
37390
  onClick: handleToggle,
37053
- "aria-label": isCollapsed ? "Expand replies" : "Collapse replies",
37391
+ "aria-label": isCollapsed ? t("replyTree.expandReplies") : t("replyTree.collapseReplies"),
37054
37392
  "aria-expanded": !isCollapsed,
37055
37393
  leftIcon: isCollapsed ? "chevron-right" : "chevron-down",
37056
37394
  className: cn(
@@ -37091,7 +37429,7 @@ var init_ReplyTree = __esm({
37091
37429
  onVote: handleVote,
37092
37430
  size: "sm",
37093
37431
  variant: "horizontal",
37094
- label: `Vote on reply by ${node.authorName}`
37432
+ label: t("replyTree.voteOnReplyBy", { author: node.authorName })
37095
37433
  }
37096
37434
  ),
37097
37435
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -37101,8 +37439,8 @@ var init_ReplyTree = __esm({
37101
37439
  size: "sm",
37102
37440
  leftIcon: "message-square",
37103
37441
  onClick: handleReply,
37104
- "aria-label": `Reply to ${node.authorName}`,
37105
- children: "Reply"
37442
+ "aria-label": t("replyTree.replyTo", { author: node.authorName }),
37443
+ children: t("replyTree.reply")
37106
37444
  }
37107
37445
  ),
37108
37446
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -37112,8 +37450,8 @@ var init_ReplyTree = __esm({
37112
37450
  size: "sm",
37113
37451
  leftIcon: "flag",
37114
37452
  onClick: handleFlag,
37115
- "aria-label": `Flag reply by ${node.authorName}`,
37116
- children: "Flag"
37453
+ "aria-label": t("replyTree.flagReplyBy", { author: node.authorName }),
37454
+ children: t("replyTree.flag")
37117
37455
  }
37118
37456
  )
37119
37457
  ] }),
@@ -37124,9 +37462,9 @@ var init_ReplyTree = __esm({
37124
37462
  inputType: "textarea",
37125
37463
  rows: 2,
37126
37464
  value: draft,
37127
- placeholder: `Reply to ${node.authorName}\u2026`,
37465
+ placeholder: t("replyTree.replyToPlaceholder", { author: node.authorName }),
37128
37466
  onChange: (e) => setDraft(e.target.value),
37129
- "aria-label": `Reply to ${node.authorName}`
37467
+ "aria-label": t("replyTree.replyTo", { author: node.authorName })
37130
37468
  }
37131
37469
  ),
37132
37470
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-row gap-2 items-center", children: [
@@ -37138,10 +37476,10 @@ var init_ReplyTree = __esm({
37138
37476
  leftIcon: "send",
37139
37477
  onClick: handleSubmitReply,
37140
37478
  disabled: !draft.trim(),
37141
- children: "Send"
37479
+ children: t("replyTree.send")
37142
37480
  }
37143
37481
  ),
37144
- /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: "Cancel" })
37482
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: t("common.cancel") })
37145
37483
  ] })
37146
37484
  ] }),
37147
37485
  hasReplies && !isCollapsed && (atMaxDepth ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -37155,7 +37493,7 @@ var init_ReplyTree = __esm({
37155
37493
  "self-start gap-1 px-0 h-auto",
37156
37494
  "text-sm text-primary hover:underline hover:bg-transparent"
37157
37495
  ),
37158
- children: "Continue thread"
37496
+ children: t("replyTree.continueThread")
37159
37497
  }
37160
37498
  ) : /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex flex-col gap-2 mt-1", children: node.replies.map((child) => /* @__PURE__ */ jsxRuntime.jsx(
37161
37499
  ReplyTreeNode,
@@ -37194,6 +37532,7 @@ var init_ReplyTree = __esm({
37194
37532
  showActions = true,
37195
37533
  className
37196
37534
  }) => {
37535
+ const { t } = useTranslate();
37197
37536
  const nodeList = Array.isArray(nodes) ? nodes : nodes ? [nodes] : [];
37198
37537
  const [collapsedSet, setCollapsedSet] = React97.useState(() => {
37199
37538
  const acc = /* @__PURE__ */ new Set();
@@ -37212,7 +37551,7 @@ var init_ReplyTree = __esm({
37212
37551
  });
37213
37552
  }, []);
37214
37553
  if (nodeList.length === 0) {
37215
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("text-sm text-muted-foreground", className), children: "No replies yet." });
37554
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("text-sm text-muted-foreground", className), children: t("replyTree.noRepliesYet") });
37216
37555
  }
37217
37556
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex flex-col gap-2 min-w-0", className), children: nodeList.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
37218
37557
  ReplyTreeNode,
@@ -37290,6 +37629,7 @@ var init_VersionDiff = __esm({
37290
37629
  "use client";
37291
37630
  init_cn();
37292
37631
  init_useEventBus();
37632
+ init_useTranslate();
37293
37633
  init_atoms2();
37294
37634
  init_Stack();
37295
37635
  INLINE_STYLES = {
@@ -37312,6 +37652,7 @@ var init_VersionDiff = __esm({
37312
37652
  language,
37313
37653
  className
37314
37654
  }) => {
37655
+ const { t } = useTranslate();
37315
37656
  const eventBus = useEventBus();
37316
37657
  const revisions = Array.isArray(revisionsProp) ? revisionsProp : [];
37317
37658
  const fallbackBefore = revisions[0]?.id ?? "";
@@ -37393,24 +37734,24 @@ var init_VersionDiff = __esm({
37393
37734
  children: [
37394
37735
  /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: "flex-wrap", children: [
37395
37736
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "git-commit", size: "sm", className: "text-muted-foreground" }),
37396
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "whitespace-nowrap", children: "Compare" }),
37737
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "whitespace-nowrap", children: t("versionDiff.compare") }),
37397
37738
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsxRuntime.jsx(
37398
37739
  Select,
37399
37740
  {
37400
37741
  options,
37401
37742
  value: activeBeforeId,
37402
37743
  onChange: handleBeforeChange,
37403
- "aria-label": "Before revision"
37744
+ "aria-label": t("versionDiff.beforeRevision")
37404
37745
  }
37405
37746
  ) }),
37406
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: "to" }),
37747
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: t("versionDiff.to") }),
37407
37748
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsxRuntime.jsx(
37408
37749
  Select,
37409
37750
  {
37410
37751
  options,
37411
37752
  value: activeAfterId,
37412
37753
  onChange: handleAfterChange,
37413
- "aria-label": "After revision"
37754
+ "aria-label": t("versionDiff.afterRevision")
37414
37755
  }
37415
37756
  ) }),
37416
37757
  language && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "default", children: language }),
@@ -37431,7 +37772,7 @@ var init_VersionDiff = __esm({
37431
37772
  size: "sm",
37432
37773
  icon: activeView === "side-by-side" ? "align-left" : "columns",
37433
37774
  onClick: handleViewToggle,
37434
- "aria-label": activeView === "side-by-side" ? "Switch to inline view" : "Switch to side-by-side view"
37775
+ "aria-label": activeView === "side-by-side" ? t("versionDiff.switchToInline") : t("versionDiff.switchToSideBySide")
37435
37776
  }
37436
37777
  ),
37437
37778
  (onRevert || revertEvent) && /* @__PURE__ */ jsxRuntime.jsx(
@@ -37441,7 +37782,7 @@ var init_VersionDiff = __esm({
37441
37782
  size: "sm",
37442
37783
  icon: "rotate-ccw",
37443
37784
  onClick: handleRevert,
37444
- children: "Revert"
37785
+ children: t("versionDiff.revert")
37445
37786
  }
37446
37787
  )
37447
37788
  ] })
@@ -37458,12 +37799,12 @@ var init_VersionDiff = __esm({
37458
37799
  children: [
37459
37800
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
37460
37801
  beforeRev?.label,
37461
- beforeRev?.author ? ` by ${beforeRev.author}` : "",
37802
+ beforeRev?.author ? t("versionDiff.byAuthor", { author: beforeRev.author }) : "",
37462
37803
  beforeRev?.timestamp ? ` (${beforeRev.timestamp})` : ""
37463
37804
  ] }),
37464
37805
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
37465
37806
  afterRev?.label,
37466
- afterRev?.author ? ` by ${afterRev.author}` : "",
37807
+ afterRev?.author ? t("versionDiff.byAuthor", { author: afterRev.author }) : "",
37467
37808
  afterRev?.timestamp ? ` (${afterRev.timestamp})` : ""
37468
37809
  ] })
37469
37810
  ]
@@ -37856,10 +38197,12 @@ var init_DocPagination = __esm({
37856
38197
  }
37857
38198
  });
37858
38199
  function DocSearch({
37859
- placeholder = "Search documentation...",
38200
+ placeholder,
37860
38201
  onSearch,
37861
38202
  className
37862
38203
  }) {
38204
+ const { t } = useTranslate();
38205
+ const resolvedPlaceholder = placeholder ?? t("docSearch.placeholder");
37863
38206
  const [query, setQuery] = React97.useState("");
37864
38207
  const [results, setResults] = React97.useState([]);
37865
38208
  const [isOpen, setIsOpen] = React97.useState(false);
@@ -37966,7 +38309,7 @@ function DocSearch({
37966
38309
  Input,
37967
38310
  {
37968
38311
  inputType: "search",
37969
- placeholder,
38312
+ placeholder: resolvedPlaceholder,
37970
38313
  value: query,
37971
38314
  onChange: handleChange,
37972
38315
  onFocus: handleFocus,
@@ -38031,6 +38374,7 @@ var init_DocSearch = __esm({
38031
38374
  init_Typography();
38032
38375
  init_Icon();
38033
38376
  init_Input();
38377
+ init_useTranslate();
38034
38378
  }
38035
38379
  });
38036
38380
  var DocSidebarCategory, DocSidebar;
@@ -39626,8 +39970,8 @@ var init_SignaturePad = __esm({
39626
39970
  init_useEventBus();
39627
39971
  init_useTranslate();
39628
39972
  SignaturePad = ({
39629
- label = "Signature",
39630
- helperText = "Draw your signature above",
39973
+ label,
39974
+ helperText,
39631
39975
  strokeColor,
39632
39976
  strokeWidth = 2,
39633
39977
  height = 200,
@@ -39643,6 +39987,8 @@ var init_SignaturePad = __esm({
39643
39987
  }) => {
39644
39988
  const eventBus = useEventBus();
39645
39989
  const { t } = useTranslate();
39990
+ const resolvedLabel = label ?? t("signaturePad.label");
39991
+ const resolvedHelperText = helperText ?? t("signaturePad.helperText");
39646
39992
  const canvasRef = React97.useRef(null);
39647
39993
  const [isDrawing, setIsDrawing] = React97.useState(false);
39648
39994
  const [hasSignature, setHasSignature] = React97.useState(!!value);
@@ -39745,7 +40091,7 @@ var init_SignaturePad = __esm({
39745
40091
  );
39746
40092
  }
39747
40093
  return /* @__PURE__ */ jsxRuntime.jsx(Card, { className: cn("p-4", className), children: /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "sm", children: [
39748
- label && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "medium", children: label }),
40094
+ resolvedLabel && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "medium", children: resolvedLabel }),
39749
40095
  /* @__PURE__ */ jsxRuntime.jsx(
39750
40096
  Box,
39751
40097
  {
@@ -39774,7 +40120,7 @@ var init_SignaturePad = __esm({
39774
40120
  )
39775
40121
  }
39776
40122
  ),
39777
- helperText && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: helperText }),
40123
+ resolvedHelperText && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: resolvedHelperText }),
39778
40124
  !readOnly && /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", justify: "end", children: [
39779
40125
  /* @__PURE__ */ jsxRuntime.jsx(
39780
40126
  Button,
@@ -39784,7 +40130,7 @@ var init_SignaturePad = __esm({
39784
40130
  icon: LucideIcons2.Eraser,
39785
40131
  onClick: clearSignature,
39786
40132
  disabled: !hasSignature,
39787
- children: "Clear"
40133
+ children: t("signaturePad.clear")
39788
40134
  }
39789
40135
  ),
39790
40136
  signEvent && /* @__PURE__ */ jsxRuntime.jsx(
@@ -39795,7 +40141,7 @@ var init_SignaturePad = __esm({
39795
40141
  icon: LucideIcons2.Check,
39796
40142
  onClick: confirmSignature,
39797
40143
  disabled: !hasSignature,
39798
- children: "Confirm"
40144
+ children: t("signaturePad.confirm")
39799
40145
  }
39800
40146
  )
39801
40147
  ] })
@@ -44240,6 +44586,7 @@ function MasterDetail({
44240
44586
  className,
44241
44587
  ...rest
44242
44588
  }) {
44589
+ const { t } = useTranslate();
44243
44590
  const loading = externalLoading ?? false;
44244
44591
  const isLoading = externalIsLoading ?? false;
44245
44592
  const error = externalError ?? null;
@@ -44252,8 +44599,8 @@ function MasterDetail({
44252
44599
  isLoading: loading || isLoading,
44253
44600
  error,
44254
44601
  className,
44255
- emptyTitle: "No items found",
44256
- emptyDescription: "Create your first item to get started.",
44602
+ emptyTitle: t("table.empty.title"),
44603
+ emptyDescription: t("empty.createFirst"),
44257
44604
  ...rest
44258
44605
  }
44259
44606
  );
@@ -44262,6 +44609,7 @@ var init_MasterDetail = __esm({
44262
44609
  "components/core/organisms/MasterDetail.tsx"() {
44263
44610
  "use client";
44264
44611
  init_DataTable();
44612
+ init_useTranslate();
44265
44613
  MasterDetail.displayName = "MasterDetail";
44266
44614
  }
44267
44615
  });
@@ -44270,14 +44618,18 @@ var init_MasterDetailLayout = __esm({
44270
44618
  "components/core/organisms/layout/MasterDetailLayout.tsx"() {
44271
44619
  init_cn();
44272
44620
  init_Typography();
44273
- DefaultEmptyDetail = () => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsxRuntime.jsx(
44274
- Typography,
44275
- {
44276
- variant: "body2",
44277
- className: "text-muted-foreground",
44278
- children: "Select an item to view details"
44279
- }
44280
- ) });
44621
+ init_useTranslate();
44622
+ DefaultEmptyDetail = () => {
44623
+ const { t } = useTranslate();
44624
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsxRuntime.jsx(
44625
+ Typography,
44626
+ {
44627
+ variant: "body2",
44628
+ className: "text-muted-foreground",
44629
+ children: t("masterDetail.selectItem")
44630
+ }
44631
+ ) });
44632
+ };
44281
44633
  MasterDetailLayout = ({
44282
44634
  master,
44283
44635
  detail,
@@ -44404,7 +44756,7 @@ var init_MediaGallery = __esm({
44404
44756
  {
44405
44757
  icon: LucideIcons2.Image,
44406
44758
  title: t("display.noMedia"),
44407
- description: "No media items to display.",
44759
+ description: t("mediaGallery.noMediaDescription"),
44408
44760
  className
44409
44761
  }
44410
44762
  );
@@ -44421,7 +44773,7 @@ var init_MediaGallery = __esm({
44421
44773
  size: "sm",
44422
44774
  icon: LucideIcons2.Upload,
44423
44775
  action: "MEDIA_UPLOAD",
44424
- children: "Upload"
44776
+ children: t("mediaGallery.upload")
44425
44777
  }
44426
44778
  ),
44427
44779
  actions?.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -44435,10 +44787,7 @@ var init_MediaGallery = __esm({
44435
44787
  ))
44436
44788
  ] })
44437
44789
  ] }),
44438
- selectable && selectedItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(HStack, { gap: "sm", align: "center", children: /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "info", children: [
44439
- selectedItems.length,
44440
- " selected"
44441
- ] }) }),
44790
+ selectable && selectedItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(HStack, { gap: "sm", align: "center", children: /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "info", children: t("table.bulk.selected", { count: selectedItems.length }) }) }),
44442
44791
  /* @__PURE__ */ jsxRuntime.jsx(
44443
44792
  Box,
44444
44793
  {
@@ -45312,7 +45661,7 @@ function TraitsTab({ traits: traits2 }) {
45312
45661
  EmptyState,
45313
45662
  {
45314
45663
  title: t("debug.noActiveTraits"),
45315
- description: "Traits will appear when components using them are mounted",
45664
+ description: t("debug.traitsMountHint"),
45316
45665
  className: "py-8"
45317
45666
  }
45318
45667
  );
@@ -45322,14 +45671,11 @@ function TraitsTab({ traits: traits2 }) {
45322
45671
  header: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 w-full", children: [
45323
45672
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", weight: "semibold", className: "text-purple-600 dark:text-purple-400", children: trait.name }),
45324
45673
  /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "success", size: "sm", children: trait.currentState }),
45325
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: [
45326
- trait.transitionCount,
45327
- " transitions"
45328
- ] })
45674
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: t("debug.transitionsCount", { count: trait.transitionCount }) })
45329
45675
  ] }),
45330
45676
  content: /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "sm", children: [
45331
45677
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
45332
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "States" }),
45678
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.states") }),
45333
45679
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: trait.states.map((state) => /* @__PURE__ */ jsxRuntime.jsx(
45334
45680
  Badge,
45335
45681
  {
@@ -45341,7 +45687,7 @@ function TraitsTab({ traits: traits2 }) {
45341
45687
  )) })
45342
45688
  ] }),
45343
45689
  trait.transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
45344
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Transitions" }),
45690
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.transitions") }),
45345
45691
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: trait.transitions.map((t2, i) => /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "font-mono", children: [
45346
45692
  t2.from,
45347
45693
  " \u2192 ",
@@ -45360,7 +45706,7 @@ function TraitsTab({ traits: traits2 }) {
45360
45706
  ] }, i)) })
45361
45707
  ] }),
45362
45708
  trait.guards.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
45363
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Guards" }),
45709
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.guards") }),
45364
45710
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: trait.guards.map((g, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
45365
45711
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: g.name }),
45366
45712
  /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: g.lastResult === true ? "success" : g.lastResult === false ? "danger" : "default", size: "sm", children: g.lastResult === void 0 ? "?" : g.lastResult ? "\u2713" : "\u2717" })
@@ -45466,7 +45812,7 @@ function EntitiesTab({ snapshot }) {
45466
45812
  EmptyState,
45467
45813
  {
45468
45814
  title: t("debug.noEntityData"),
45469
- description: "Debug mode may not be enabled",
45815
+ description: t("debug.debugModeHint"),
45470
45816
  className: "py-8"
45471
45817
  }
45472
45818
  );
@@ -45479,7 +45825,7 @@ function EntitiesTab({ snapshot }) {
45479
45825
  EmptyState,
45480
45826
  {
45481
45827
  title: t("debug.noEntities"),
45482
- description: "Entities will appear when spawned",
45828
+ description: t("debug.entitiesSpawnHint"),
45483
45829
  className: "py-8"
45484
45830
  }
45485
45831
  );
@@ -45487,7 +45833,7 @@ function EntitiesTab({ snapshot }) {
45487
45833
  const singletonItems = singletonEntries.map(([name, data]) => ({
45488
45834
  id: `singleton-${name}`,
45489
45835
  header: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
45490
- /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "sm", children: "Singleton" }),
45836
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "sm", children: t("debug.singleton") }),
45491
45837
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", weight: "semibold", className: "text-sky-600 dark:text-sky-400", children: name })
45492
45838
  ] }),
45493
45839
  content: /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "text-xs text-gray-600 dark:text-gray-400 bg-gray-50 dark:bg-gray-800 p-2 rounded overflow-auto max-h-40", children: JSON.stringify(data, null, 2) })
@@ -45505,31 +45851,19 @@ function EntitiesTab({ snapshot }) {
45505
45851
  }));
45506
45852
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--entities", children: [
45507
45853
  singletonItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4", children: [
45508
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
45509
- "Singletons (",
45510
- singletonItems.length,
45511
- ")"
45512
- ] }),
45854
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.singletonsCount", { count: singletonItems.length }) }),
45513
45855
  /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: singletonItems, multiple: true })
45514
45856
  ] }),
45515
45857
  runtimeItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4", children: [
45516
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
45517
- "Runtime (",
45518
- runtimeEntities.length,
45519
- ")"
45520
- ] }),
45858
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.runtimeCount", { count: runtimeEntities.length }) }),
45521
45859
  /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: runtimeItems, multiple: true }),
45522
- runtimeEntities.length > 20 && /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-400 text-center mt-2", children: [
45523
- "+",
45524
- runtimeEntities.length - 20,
45525
- " more entities"
45526
- ] })
45860
+ runtimeEntities.length > 20 && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-400 text-center mt-2", children: t("debug.moreEntities", { count: runtimeEntities.length - 20 }) })
45527
45861
  ] }),
45528
45862
  persistentEntries.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
45529
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Persistent" }),
45863
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.persistent") }),
45530
45864
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: persistentEntries.map(([type, info]) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between py-1", children: [
45531
45865
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: type }),
45532
- /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: info.loaded ? "success" : "default", size: "sm", children: info.loaded ? `${info.count} loaded` : "not loaded" })
45866
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: info.loaded ? "success" : "default", size: "sm", children: info.loaded ? t("debug.loadedCount", { count: info.count }) : t("debug.notLoaded") })
45533
45867
  ] }, type)) })
45534
45868
  ] })
45535
45869
  ] });
@@ -45573,7 +45907,7 @@ function EventFlowTab({ events: events2 }) {
45573
45907
  EmptyState,
45574
45908
  {
45575
45909
  title: t("debug.noEventsYet"),
45576
- description: "Events will appear as traits, ticks, and other systems execute",
45910
+ description: t("debug.eventsExecuteHint"),
45577
45911
  className: "py-8"
45578
45912
  }
45579
45913
  );
@@ -45584,17 +45918,13 @@ function EventFlowTab({ events: events2 }) {
45584
45918
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--events", children: [
45585
45919
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 mb-3 flex-wrap", children: [
45586
45920
  /* @__PURE__ */ jsxRuntime.jsxs(ButtonGroup, { children: [
45587
- /* @__PURE__ */ jsxRuntime.jsxs(
45921
+ /* @__PURE__ */ jsxRuntime.jsx(
45588
45922
  Button,
45589
45923
  {
45590
45924
  size: "sm",
45591
45925
  variant: filter === "all" ? "primary" : "secondary",
45592
45926
  onClick: () => setFilter("all"),
45593
- children: [
45594
- "All (",
45595
- events2.length,
45596
- ")"
45597
- ]
45927
+ children: t("debug.allCount", { count: events2.length })
45598
45928
  }
45599
45929
  ),
45600
45930
  eventTypes.map((type) => {
@@ -45624,7 +45954,7 @@ function EventFlowTab({ events: events2 }) {
45624
45954
  onChange: (e) => setAutoScroll(e.target.checked)
45625
45955
  }
45626
45956
  ),
45627
- "Auto-scroll"
45957
+ t("debug.autoScroll")
45628
45958
  ] })
45629
45959
  ] }),
45630
45960
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -45682,7 +46012,7 @@ function GuardsPanel({ guards }) {
45682
46012
  EmptyState,
45683
46013
  {
45684
46014
  title: t("debug.noGuardEvaluations"),
45685
- description: "Guard evaluations will appear when transitions or ticks with guards execute",
46015
+ description: t("debug.guardEvaluationsHint"),
45686
46016
  className: "py-8"
45687
46017
  }
45688
46018
  );
@@ -45713,15 +46043,15 @@ function GuardsPanel({ guards }) {
45713
46043
  ] }),
45714
46044
  content: /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "sm", children: [
45715
46045
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
45716
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Expression" }),
46046
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.expression") }),
45717
46047
  /* @__PURE__ */ jsxRuntime.jsx("code", { className: "block mt-1 text-xs text-amber-600 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20 px-2 py-1 rounded", children: guard.expression })
45718
46048
  ] }),
45719
46049
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
45720
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Inputs" }),
46050
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.inputs") }),
45721
46051
  /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "mt-1 text-xs text-gray-600 dark:text-gray-400 bg-gray-50 dark:bg-gray-800 p-2 rounded overflow-auto max-h-24", children: JSON.stringify(guard.inputs, null, 2) })
45722
46052
  ] }),
45723
46053
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
45724
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Trait" }),
46054
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.trait") }),
45725
46055
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: guard.context.traitName })
45726
46056
  ] })
45727
46057
  ] })
@@ -45739,9 +46069,9 @@ function GuardsPanel({ guards }) {
45739
46069
  ] })
45740
46070
  ] }),
45741
46071
  /* @__PURE__ */ jsxRuntime.jsxs(ButtonGroup, { children: [
45742
- /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: "All" }),
45743
- /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: "Passed" }),
45744
- /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "failed" ? "primary" : "secondary", onClick: () => setFilter("failed"), children: "Failed" })
46072
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: t("debug.filterAll") }),
46073
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: t("debug.filterPassed") }),
46074
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "failed" ? "primary" : "secondary", onClick: () => setFilter("failed"), children: t("debug.filterFailed") })
45745
46075
  ] })
45746
46076
  ] }),
45747
46077
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-80 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: accordionItems }) })
@@ -45867,7 +46197,7 @@ function TransitionTimeline({ transitions }) {
45867
46197
  EmptyState,
45868
46198
  {
45869
46199
  title: t("debug.noTransitionsRecorded"),
45870
- description: "Transitions will appear as the state machine processes events",
46200
+ description: t("debug.transitionsProcessHint"),
45871
46201
  className: "py-8"
45872
46202
  }
45873
46203
  );
@@ -45884,10 +46214,7 @@ function TransitionTimeline({ transitions }) {
45884
46214
  const sorted = [...transitions].reverse();
45885
46215
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--timeline", children: [
45886
46216
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-2", children: [
45887
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-500", children: [
45888
- transitions.length,
45889
- " transitions recorded"
45890
- ] }),
46217
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500", children: t("debug.transitionsRecorded", { count: transitions.length }) }),
45891
46218
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-1 text-xs text-gray-500 cursor-pointer", children: [
45892
46219
  /* @__PURE__ */ jsxRuntime.jsx(
45893
46220
  Checkbox,
@@ -45896,7 +46223,7 @@ function TransitionTimeline({ transitions }) {
45896
46223
  onChange: (e) => setAutoScroll(e.target.checked)
45897
46224
  }
45898
46225
  ),
45899
- "Auto-scroll"
46226
+ t("debug.autoScroll")
45900
46227
  ] })
45901
46228
  ] }),
45902
46229
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -45939,15 +46266,13 @@ function TransitionTimeline({ transitions }) {
45939
46266
  variant: trace.guardResult ? "success" : "danger",
45940
46267
  size: "sm",
45941
46268
  children: [
45942
- "guard: ",
46269
+ t("debug.guardLabel"),
46270
+ " ",
45943
46271
  trace.guardResult ? "\u2713" : "\u2717"
45944
46272
  ]
45945
46273
  }
45946
46274
  ),
45947
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: [
45948
- trace.effects.length,
45949
- " effects"
45950
- ] })
46275
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: t("debug.effectsCount", { count: trace.effects.length }) })
45951
46276
  ] }),
45952
46277
  isExpanded && trace.effects.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-2 mt-1 mb-2 pl-2 border-l border-gray-200 dark:border-gray-700 space-y-1", children: trace.effects.map((effect, eIdx) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [
45953
46278
  /* @__PURE__ */ jsxRuntime.jsx(EffectBadge, { effect }),
@@ -45996,13 +46321,13 @@ function ServerBridgeTab({ bridge }) {
45996
46321
  EmptyState,
45997
46322
  {
45998
46323
  title: t("debug.noBridgeData"),
45999
- description: "The ServerBridge has not been initialized. Bridge health will appear once the runtime connects to the server.",
46324
+ description: t("debug.bridgeInitHint"),
46000
46325
  className: "py-8"
46001
46326
  }
46002
46327
  );
46003
46328
  }
46004
46329
  const formatTime4 = (ts) => {
46005
- if (ts === 0) return "Never";
46330
+ if (ts === 0) return t("debug.never");
46006
46331
  const d = new Date(ts);
46007
46332
  return d.toLocaleTimeString("en-US", {
46008
46333
  hour12: false,
@@ -46015,14 +46340,14 @@ function ServerBridgeTab({ bridge }) {
46015
46340
  /* @__PURE__ */ jsxRuntime.jsxs(Card, { className: "p-3", children: [
46016
46341
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 mb-3", children: [
46017
46342
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: `w-3 h-3 rounded-full ${bridge.connected ? "bg-green-500 animate-pulse" : "bg-red-500"}` }),
46018
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: bridge.connected ? "Connected" : "Disconnected" })
46343
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: bridge.connected ? t("debug.connected") : t("debug.disconnected") })
46019
46344
  ] }),
46020
46345
  /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "xs", children: [
46021
46346
  /* @__PURE__ */ jsxRuntime.jsx(
46022
46347
  StatRow,
46023
46348
  {
46024
46349
  label: t("debug.status"),
46025
- value: bridge.connected ? "Connected" : "Disconnected",
46350
+ value: bridge.connected ? t("debug.connected") : t("debug.disconnected"),
46026
46351
  variant: bridge.connected ? "success" : "danger"
46027
46352
  }
46028
46353
  ),
@@ -46050,13 +46375,10 @@ function ServerBridgeTab({ bridge }) {
46050
46375
  ] })
46051
46376
  ] }),
46052
46377
  bridge.lastError && /* @__PURE__ */ jsxRuntime.jsxs(Card, { className: "p-3 border-red-200 dark:border-red-800 bg-red-50 dark:bg-red-950", children: [
46053
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "semibold", className: "text-red-600 dark:text-red-400 mb-1", children: "Last Error" }),
46378
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "semibold", className: "text-red-600 dark:text-red-400 mb-1", children: t("debug.lastError") }),
46054
46379
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-red-500 font-mono break-all", children: bridge.lastError })
46055
46380
  ] }),
46056
- bridge.connected && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-2", children: /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-400", children: [
46057
- bridge.eventsForwarded + bridge.eventsReceived,
46058
- " total events processed"
46059
- ] }) })
46381
+ bridge.connected && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-2", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-400", children: t("debug.totalEventsProcessed", { count: bridge.eventsForwarded + bridge.eventsReceived }) }) })
46060
46382
  ] }) });
46061
46383
  }
46062
46384
  var init_ServerBridgeTab = __esm({
@@ -46166,7 +46488,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
46166
46488
  EmptyState,
46167
46489
  {
46168
46490
  title: t("debug.noActiveTraits"),
46169
- description: "Traits will appear when the state machine initializes",
46491
+ description: t("debug.traitsInitHint"),
46170
46492
  className: "py-8"
46171
46493
  }
46172
46494
  );
@@ -46183,7 +46505,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
46183
46505
  };
46184
46506
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--dispatch", children: [
46185
46507
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3", children: [
46186
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Active States" }),
46508
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.activeStates") }),
46187
46509
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: traits2.map((trait) => /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "success", size: "sm", children: [
46188
46510
  trait.name,
46189
46511
  ": ",
@@ -46191,8 +46513,8 @@ function EventDispatcherTab({ traits: traits2, schema }) {
46191
46513
  ] }, trait.id)) })
46192
46514
  ] }),
46193
46515
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3", children: [
46194
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Available Events" }),
46195
- availableEvents.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-400 italic", children: "No transitions from current state" }) : /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: availableEvents.map(({ event, transitions }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
46516
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.availableEvents") }),
46517
+ availableEvents.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-400 italic", children: t("debug.noTransitionsFromState") }) : /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: availableEvents.map(({ event, transitions }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
46196
46518
  /* @__PURE__ */ jsxRuntime.jsx(
46197
46519
  Button,
46198
46520
  {
@@ -46204,15 +46526,15 @@ function EventDispatcherTab({ traits: traits2, schema }) {
46204
46526
  }
46205
46527
  ),
46206
46528
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500", children: transitions.map((t2) => `${t2.from} -> ${t2.to}`).join(", ") }),
46207
- transitions.some((t2) => t2.guard) && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "warning", size: "sm", children: "guarded" })
46529
+ transitions.some((tr) => tr.guard) && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "warning", size: "sm", children: t("debug.guarded") })
46208
46530
  ] }, event)) })
46209
46531
  ] }),
46210
46532
  unavailableEvents.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3", children: [
46211
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Other Events (not available from current state)" }),
46533
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.otherEvents") }),
46212
46534
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: unavailableEvents.map((event) => /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "default", size: "sm", className: "opacity-50", children: event }, event)) })
46213
46535
  ] }),
46214
46536
  log16.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
46215
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Recent Transitions" }),
46537
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.recentTransitions") }),
46216
46538
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: log16.map((entry, i) => /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "font-mono text-xs", children: [
46217
46539
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-400", children: entry.traitName }),
46218
46540
  " ",
@@ -46243,21 +46565,20 @@ var init_RuntimeDebugger = __esm({
46243
46565
  }
46244
46566
  });
46245
46567
  function ServerResponseRow({ sr }) {
46568
+ const { t } = useTranslate();
46246
46569
  const entityEntries = Object.entries(sr.dataEntities);
46247
46570
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-4 pl-2 border-l border-purple-500/30 py-0.5 text-xs font-mono", children: [
46248
46571
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
46249
46572
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: sr.success ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400", children: [
46250
46573
  sr.success ? "\u2713" : "\u2717",
46251
- " server"
46574
+ " ",
46575
+ t("debug.server")
46252
46576
  ] }),
46253
46577
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-300", children: sr.orbitalName }),
46254
- sr.clientEffects > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "px-1 rounded bg-purple-500/15 text-purple-600 dark:text-purple-300", children: [
46255
- sr.clientEffects,
46256
- " clientEffect",
46257
- sr.clientEffects !== 1 ? "s" : ""
46258
- ] }),
46578
+ sr.clientEffects > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "px-1 rounded bg-purple-500/15 text-purple-600 dark:text-purple-300", children: t("debug.clientEffectsCount", { count: sr.clientEffects }) }),
46259
46579
  sr.emittedEvents.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "px-1 rounded bg-blue-500/15 text-blue-300", children: [
46260
- "emit: ",
46580
+ t("debug.emitLabel"),
46581
+ " ",
46261
46582
  sr.emittedEvents.join(", ")
46262
46583
  ] }),
46263
46584
  sr.error && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "px-1 rounded bg-red-500/15 text-red-600 dark:text-red-400 truncate max-w-[300px]", children: sr.error })
@@ -46265,13 +46586,12 @@ function ServerResponseRow({ sr }) {
46265
46586
  entityEntries.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1 mt-0.5", children: entityEntries.map(([name, count]) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "px-1 rounded bg-[var(--color-card)] text-foreground", children: [
46266
46587
  name,
46267
46588
  ": ",
46268
- count,
46269
- " row",
46270
- count !== 1 ? "s" : ""
46589
+ t("debug.rowsCount", { count })
46271
46590
  ] }, name)) })
46272
46591
  ] });
46273
46592
  }
46274
46593
  function TransitionRow({ trace }) {
46594
+ const { t } = useTranslate();
46275
46595
  const isServerEntry = !!trace.serverResponse && trace.traitName.startsWith("server:");
46276
46596
  const hasFailedEffects = trace.effects.some((e) => e.status === "failed");
46277
46597
  if (isServerEntry && trace.serverResponse) {
@@ -46279,7 +46599,7 @@ function TransitionRow({ trace }) {
46279
46599
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-2 text-xs font-mono", children: [
46280
46600
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-1.5 w-1.5 h-1.5 rounded-full flex-shrink-0 bg-purple-500" }),
46281
46601
  /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "warning", size: "sm", className: "flex-shrink-0", children: trace.event }),
46282
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-400 flex-shrink-0", children: "server response" })
46602
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-400 flex-shrink-0", children: t("debug.serverResponse") })
46283
46603
  ] }),
46284
46604
  /* @__PURE__ */ jsxRuntime.jsx(ServerResponseRow, { sr: trace.serverResponse })
46285
46605
  ] });
@@ -46320,6 +46640,7 @@ function VerifyModePanel({
46320
46640
  serverCount,
46321
46641
  localCount
46322
46642
  }) {
46643
+ const { t } = useTranslate();
46323
46644
  const [expanded, setExpanded] = React97__namespace.useState(true);
46324
46645
  const scrollRef = React97__namespace.useRef(null);
46325
46646
  const prevCountRef = React97__namespace.useRef(0);
@@ -46350,30 +46671,20 @@ function VerifyModePanel({
46350
46671
  onClick: () => setExpanded((v) => !v),
46351
46672
  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",
46352
46673
  "aria-expanded": expanded,
46353
- "aria-label": expanded ? "Collapse verification timeline" : "Expand verification timeline",
46674
+ "aria-label": expanded ? t("debug.collapseVerificationTimeline") : t("debug.expandVerificationTimeline"),
46354
46675
  "data-testid": "debugger-verify-toggle",
46355
46676
  children: [
46356
46677
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground/50 w-3", "aria-hidden": true, children: expanded ? "\u25BE" : "\u25B8" }),
46357
- /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? `${failedChecks} fail` : "OK" }),
46358
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-foreground/70", children: [
46359
- localCount,
46360
- " local"
46361
- ] }),
46362
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-purple-600 dark:text-purple-400", children: [
46363
- serverCount,
46364
- " server"
46365
- ] }),
46678
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? t("debug.failCount", { count: failedChecks }) : t("debug.ok") }),
46679
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground/70", children: t("debug.localCount", { count: localCount }) }),
46680
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-400", children: t("debug.serverCount", { count: serverCount }) }),
46366
46681
  traitStates && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-cyan-600 dark:text-cyan-400 truncate max-w-[400px]", children: traitStates }),
46367
- !expanded && transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ml-auto text-foreground/50", children: [
46368
- transitions.length,
46369
- " transition",
46370
- transitions.length !== 1 ? "s" : ""
46371
- ] })
46682
+ !expanded && transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto text-foreground/50", children: t("debug.transitionsCount", { count: transitions.length }) })
46372
46683
  ]
46373
46684
  }
46374
46685
  ),
46375
46686
  expanded && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 flex overflow-hidden", children: [
46376
- /* @__PURE__ */ jsxRuntime.jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-1", children: transitions.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-foreground/50 text-xs font-mono py-2 text-center", children: "Waiting for transitions..." }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-0.5", children: transitions.map((trace) => /* @__PURE__ */ jsxRuntime.jsx(TransitionRow, { trace }, trace.id)) }) }) }),
46687
+ /* @__PURE__ */ jsxRuntime.jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-1", children: transitions.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-foreground/50 text-xs font-mono py-2 text-center", children: t("debug.waitingForTransitions") }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-0.5", children: transitions.map((trace) => /* @__PURE__ */ jsxRuntime.jsx(TransitionRow, { trace }, trace.id)) }) }) }),
46377
46688
  /* @__PURE__ */ jsxRuntime.jsx(WalkMinimap, {})
46378
46689
  ] })
46379
46690
  ]
@@ -46389,6 +46700,7 @@ function RuntimeDebugger({
46389
46700
  defaultTab,
46390
46701
  schema
46391
46702
  }) {
46703
+ const { t } = useTranslate();
46392
46704
  const [isCollapsed, setIsCollapsed] = React97__namespace.useState(mode === "verify" ? true : defaultCollapsed);
46393
46705
  const [isVisible, setIsVisible] = React97__namespace.useState(mode === "inline" || mode === "verify" || isDebugEnabled2());
46394
46706
  const debugData = useDebugData();
@@ -46427,55 +46739,55 @@ function RuntimeDebugger({
46427
46739
  const tabItems = [
46428
46740
  {
46429
46741
  id: "dispatch",
46430
- label: "Dispatch",
46742
+ label: t("debug.tabDispatch"),
46431
46743
  badge: debugData.traits.length || void 0,
46432
46744
  content: /* @__PURE__ */ jsxRuntime.jsx(EventDispatcherTab, { traits: debugData.traits, schema })
46433
46745
  },
46434
46746
  {
46435
46747
  id: "verify",
46436
- label: failedChecks > 0 ? "Verify (!)" : "Verify",
46748
+ label: failedChecks > 0 ? t("debug.tabVerifyAlert") : t("debug.tabVerify"),
46437
46749
  badge: verification.summary.totalChecks || void 0,
46438
46750
  content: /* @__PURE__ */ jsxRuntime.jsx(VerificationTab, { checks: verification.checks, summary: verification.summary })
46439
46751
  },
46440
46752
  {
46441
46753
  id: "timeline",
46442
- label: "Timeline",
46754
+ label: t("debug.tabTimeline"),
46443
46755
  badge: verification.transitions.length || void 0,
46444
46756
  content: /* @__PURE__ */ jsxRuntime.jsx(TransitionTimeline, { transitions: verification.transitions })
46445
46757
  },
46446
46758
  {
46447
46759
  id: "bridge",
46448
- label: "Bridge",
46760
+ label: t("debug.tabBridge"),
46449
46761
  badge: verification.bridge?.connected ? void 0 : 1,
46450
46762
  content: /* @__PURE__ */ jsxRuntime.jsx(ServerBridgeTab, { bridge: verification.bridge })
46451
46763
  },
46452
46764
  {
46453
46765
  id: "traits",
46454
- label: "Traits",
46766
+ label: t("debug.tabTraits"),
46455
46767
  badge: debugData.traits.length || void 0,
46456
46768
  content: /* @__PURE__ */ jsxRuntime.jsx(TraitsTab, { traits: debugData.traits })
46457
46769
  },
46458
46770
  {
46459
46771
  id: "ticks",
46460
- label: "Ticks",
46461
- badge: debugData.ticks.filter((t) => t.active).length || void 0,
46772
+ label: t("debug.tabTicks"),
46773
+ badge: debugData.ticks.filter((tick) => tick.active).length || void 0,
46462
46774
  content: /* @__PURE__ */ jsxRuntime.jsx(TicksTab, { ticks: debugData.ticks })
46463
46775
  },
46464
46776
  {
46465
46777
  id: "entities",
46466
- label: "Entities",
46778
+ label: t("debug.tabEntities"),
46467
46779
  badge: debugData.entitySnapshot?.runtime.length || void 0,
46468
46780
  content: /* @__PURE__ */ jsxRuntime.jsx(EntitiesTab, { snapshot: debugData.entitySnapshot })
46469
46781
  },
46470
46782
  {
46471
46783
  id: "events",
46472
- label: "Events",
46784
+ label: t("debug.tabEvents"),
46473
46785
  badge: debugData.events.length > 0 ? debugData.events.length : void 0,
46474
46786
  content: /* @__PURE__ */ jsxRuntime.jsx(EventFlowTab, { events: debugData.events })
46475
46787
  },
46476
46788
  {
46477
46789
  id: "guards",
46478
- label: "Guards",
46790
+ label: t("debug.tabGuards"),
46479
46791
  badge: debugData.guards.filter((g) => !g.result).length || void 0,
46480
46792
  content: /* @__PURE__ */ jsxRuntime.jsx(GuardsPanel, { guards: debugData.guards })
46481
46793
  }
@@ -46503,15 +46815,10 @@ function RuntimeDebugger({
46503
46815
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
46504
46816
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "h6", style: { fontSize: "0.75rem" }, children: [
46505
46817
  isCollapsed ? "\u25B6" : "\u25BC",
46506
- " Debugger"
46818
+ " ",
46819
+ t("debug.debugger")
46507
46820
  ] }),
46508
- failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "danger", size: "sm", children: [
46509
- failedChecks,
46510
- " failed"
46511
- ] }) : debugData.traits.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "success", size: "sm", children: [
46512
- debugData.traits.length,
46513
- " traits"
46514
- ] }) : /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "info", size: "sm", children: "Idle" })
46821
+ failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "danger", size: "sm", children: t("debug.failedCount", { count: failedChecks }) }) : debugData.traits.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "success", size: "sm", children: t("debug.traitsCount", { count: debugData.traits.length }) }) : /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "info", size: "sm", children: t("debug.idle") })
46515
46822
  ] })
46516
46823
  }
46517
46824
  ),
@@ -46529,9 +46836,9 @@ function RuntimeDebugger({
46529
46836
  );
46530
46837
  }
46531
46838
  if (mode === "verify") {
46532
- const traitStates = debugData.traits.map((t) => `${t.name}:${t.currentState}`).join(" | ");
46533
- const serverEntries = verification.transitions.filter((t) => t.serverResponse);
46534
- const localEntries = verification.transitions.filter((t) => !t.serverResponse);
46839
+ const traitStates = debugData.traits.map((t2) => `${t2.name}:${t2.currentState}`).join(" | ");
46840
+ const serverEntries = verification.transitions.filter((t2) => t2.serverResponse);
46841
+ const localEntries = verification.transitions.filter((t2) => !t2.serverResponse);
46535
46842
  return /* @__PURE__ */ jsxRuntime.jsx(
46536
46843
  VerifyModePanel,
46537
46844
  {
@@ -46563,7 +46870,7 @@ function RuntimeDebugger({
46563
46870
  variant: "secondary",
46564
46871
  size: "sm",
46565
46872
  className: "runtime-debugger__toggle",
46566
- title: "Open Debugger (`)",
46873
+ title: t("debug.openDebugger"),
46567
46874
  children: failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "relative", children: [
46568
46875
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: "V" }),
46569
46876
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute -top-1 -right-2 w-2 h-2 bg-red-500 rounded-full" })
@@ -46573,11 +46880,8 @@ function RuntimeDebugger({
46573
46880
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "runtime-debugger__header", children: [
46574
46881
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
46575
46882
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-lg", children: "V" }),
46576
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: "KFlow Verifier" }),
46577
- failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "danger", size: "sm", children: [
46578
- failedChecks,
46579
- " failed"
46580
- ] }) : verification.summary.totalChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "success", size: "sm", children: "All passing" }) : /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "info", size: "sm", children: "Runtime" })
46883
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: t("debug.kflowVerifier") }),
46884
+ failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "danger", size: "sm", children: t("debug.failedCount", { count: failedChecks }) }) : verification.summary.totalChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "success", size: "sm", children: t("debug.allPassing") }) : /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "info", size: "sm", children: t("debug.runtime") })
46581
46885
  ] }),
46582
46886
  /* @__PURE__ */ jsxRuntime.jsx(
46583
46887
  Button,
@@ -46585,7 +46889,7 @@ function RuntimeDebugger({
46585
46889
  onClick: () => setIsCollapsed(true),
46586
46890
  variant: "ghost",
46587
46891
  size: "sm",
46588
- title: "Close (`)",
46892
+ title: t("debug.close"),
46589
46893
  children: "x"
46590
46894
  }
46591
46895
  )
@@ -46599,7 +46903,7 @@ function RuntimeDebugger({
46599
46903
  className: "runtime-debugger__tabs"
46600
46904
  }
46601
46905
  ) }),
46602
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "runtime-debugger__footer", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-foreground/50", children: "Press ` to toggle | window.__orbitalVerification for automation" }) })
46906
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "runtime-debugger__footer", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-foreground/50", children: t("debug.toggleHint") }) })
46603
46907
  ] })
46604
46908
  }
46605
46909
  );
@@ -46625,6 +46929,7 @@ var init_RuntimeDebugger2 = __esm({
46625
46929
  init_TransitionTimeline();
46626
46930
  init_ServerBridgeTab();
46627
46931
  init_EventDispatcherTab();
46932
+ init_useTranslate();
46628
46933
  init_RuntimeDebugger();
46629
46934
  RuntimeDebugger.displayName = "RuntimeDebugger";
46630
46935
  }
@@ -47913,7 +48218,7 @@ var init_StatCard = __esm({
47913
48218
  }
47914
48219
  );
47915
48220
  }
47916
- const label = schemaStats?.[0]?.label || labelToUse || "Stat";
48221
+ const label = schemaStats?.[0]?.label || labelToUse || t("statCard.defaultLabel");
47917
48222
  const normalizedPropValue = Array.isArray(propValue) ? propValue[0] ?? propValue.length : propValue;
47918
48223
  const value = schemaStats?.[0]?.value ?? normalizedPropValue ?? 0;
47919
48224
  const trendDirection = manualDirection || (calculatedTrend === void 0 || calculatedTrend === 0 ? "neutral" : calculatedTrend > 0 ? "up" : "down");
@@ -47956,7 +48261,7 @@ var init_StatCard = __esm({
47956
48261
  ]
47957
48262
  }
47958
48263
  ),
47959
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", as: "span", children: "vs last period" })
48264
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", as: "span", children: t("statCard.vsLastPeriod") })
47960
48265
  ] }),
47961
48266
  subtitle && !calculatedTrend && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", children: subtitle })
47962
48267
  ] }),
@@ -52161,6 +52466,9 @@ var AvlEmitListen = ({
52161
52466
  ] });
52162
52467
  };
52163
52468
  AvlEmitListen.displayName = "AvlEmitListen";
52469
+
52470
+ // components/avl/molecules/AvlSlotMap.tsx
52471
+ init_useTranslate();
52164
52472
  var SLOT_PRESETS = {
52165
52473
  header: { x: 10, y: 5, width: 340, height: 35 },
52166
52474
  main: { x: 120, y: 50, width: 230, height: 195 },
@@ -52205,6 +52513,7 @@ var AvlSlotMap = ({
52205
52513
  color = "var(--color-primary)",
52206
52514
  animated = false
52207
52515
  }) => {
52516
+ const { t } = useTranslate();
52208
52517
  const ox = (600 - pageWidth) / 2;
52209
52518
  const oy = (400 - pageHeight) / 2;
52210
52519
  let unknownIdx = 0;
@@ -52255,7 +52564,7 @@ var AvlSlotMap = ({
52255
52564
  fontSize: 10,
52256
52565
  fontFamily: "inherit",
52257
52566
  fontWeight: "bold",
52258
- children: "Page Layout"
52567
+ children: t("avl.pageLayout")
52259
52568
  }
52260
52569
  ),
52261
52570
  resolvedSlots.map((slot) => {
@@ -52304,7 +52613,7 @@ var AvlSlotMap = ({
52304
52613
  opacity: 0.6,
52305
52614
  children: [
52306
52615
  slot.name,
52307
- isOverlay ? " (overlay)" : ""
52616
+ isOverlay ? ` ${t("avl.overlaySuffix")}` : ""
52308
52617
  ]
52309
52618
  }
52310
52619
  )
@@ -53236,23 +53545,25 @@ var SystemNode = ({ data }) => {
53236
53545
  SystemNode.displayName = "SystemNode";
53237
53546
 
53238
53547
  // components/avl/molecules/DetailView.tsx
53548
+ init_useTranslate();
53239
53549
  init_AvlState();
53240
53550
  init_AvlEffect();
53241
53551
  init_types();
53242
53552
  var DetailView = ({ data }) => {
53553
+ const { t } = useTranslate();
53243
53554
  const traitName = data.traits[0]?.name;
53244
53555
  const traitData = traitName ? data.traitDetails[traitName] : void 0;
53245
53556
  if (!traitData || traitData.transitions.length === 0) {
53246
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border-2 border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: "No transition data" });
53557
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border-2 border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: t("detailView.noTransitionData") });
53247
53558
  }
53248
53559
  const transition = traitData.transitions[0];
53249
53560
  const fromState = traitData.states.find((s) => s.name === transition.from);
53250
53561
  const toState = traitData.states.find((s) => s.name === transition.to);
53251
53562
  const transitionCounts = {};
53252
53563
  for (const s of traitData.states) transitionCounts[s.name] = 0;
53253
- for (const t of traitData.transitions) {
53254
- transitionCounts[t.from] = (transitionCounts[t.from] ?? 0) + 1;
53255
- transitionCounts[t.to] = (transitionCounts[t.to] ?? 0) + 1;
53564
+ for (const t2 of traitData.transitions) {
53565
+ transitionCounts[t2.from] = (transitionCounts[t2.from] ?? 0) + 1;
53566
+ transitionCounts[t2.to] = (transitionCounts[t2.to] ?? 0) + 1;
53256
53567
  }
53257
53568
  const maxTC = Math.max(...Object.values(transitionCounts), 0);
53258
53569
  const fromRole = getStateRole(transition.from, fromState?.isInitial, fromState?.isTerminal, transitionCounts[transition.from] ?? 0, maxTC);
@@ -53269,21 +53580,21 @@ var DetailView = ({ data }) => {
53269
53580
  ] }) }),
53270
53581
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-4 py-3 space-y-3", children: [
53271
53582
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
53272
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs uppercase tracking-wider text-[var(--color-muted-foreground)] mb-1", children: "Trigger" }),
53583
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs uppercase tracking-wider text-[var(--color-muted-foreground)] mb-1", children: t("avl.trigger") }),
53273
53584
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5", children: [
53274
53585
  /* @__PURE__ */ jsxRuntime.jsx("svg", { width: 16, height: 16, viewBox: "0 0 16 16", children: /* @__PURE__ */ jsxRuntime.jsx(AvlEvent, { x: 8, y: 8, size: 7 }) }),
53275
53586
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-semibold text-[var(--color-foreground)]", children: transition.event })
53276
53587
  ] })
53277
53588
  ] }),
53278
53589
  hasGuard && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
53279
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs uppercase tracking-wider text-[var(--color-muted-foreground)] mb-1", children: "Guard" }),
53590
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs uppercase tracking-wider text-[var(--color-muted-foreground)] mb-1", children: t("avl.guard") }),
53280
53591
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5", children: [
53281
53592
  /* @__PURE__ */ jsxRuntime.jsx("svg", { width: 14, height: 14, viewBox: "0 0 14 14", children: /* @__PURE__ */ jsxRuntime.jsx(AvlGuard, { x: 7, y: 7, size: 6 }) }),
53282
53593
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-mono text-[var(--color-muted-foreground)] opacity-60", children: typeof transition.guard === "string" ? transition.guard : JSON.stringify(transition.guard) })
53283
53594
  ] })
53284
53595
  ] }),
53285
53596
  transition.effects.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
53286
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs uppercase tracking-wider text-[var(--color-muted-foreground)] mb-1", children: "Effects" }),
53597
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs uppercase tracking-wider text-[var(--color-muted-foreground)] mb-1", children: t("avl.effects") }),
53287
53598
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-1.5", children: transition.effects.map((effect, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-1.5", children: [
53288
53599
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs text-[var(--color-muted-foreground)] w-3 text-right mt-0.5", children: [
53289
53600
  i + 1,
@@ -53319,6 +53630,7 @@ AvlOrbitalNode.displayName = "AvlOrbitalNode";
53319
53630
 
53320
53631
  // components/avl/molecules/AvlTransitionEdge.tsx
53321
53632
  init_types();
53633
+ init_useTranslate();
53322
53634
  var AvlTransitionEdge = ({
53323
53635
  id,
53324
53636
  sourceX,
@@ -53331,6 +53643,7 @@ var AvlTransitionEdge = ({
53331
53643
  markerEnd,
53332
53644
  style
53333
53645
  }) => {
53646
+ const { t } = useTranslate();
53334
53647
  const [path, labelX, labelY] = react.getBezierPath({
53335
53648
  sourceX,
53336
53649
  sourceY,
@@ -53362,9 +53675,9 @@ var AvlTransitionEdge = ({
53362
53675
  className: "absolute pointer-events-all nodrag nopan flex items-center gap-1",
53363
53676
  style: { transform: `translate(-50%, -50%) translate(${labelX}px, ${labelY}px)` },
53364
53677
  children: [
53365
- data?.hasGuard && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-3 h-3 rotate-45 border border-amber-500 bg-amber-500/10 shrink-0", title: "Guard" }),
53678
+ data?.hasGuard && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-3 h-3 rotate-45 border border-amber-500 bg-amber-500/10 shrink-0", title: t("avl.guard") }),
53366
53679
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-0.5 text-xs font-medium rounded-full bg-[var(--color-card)] border border-[var(--color-border)] text-[var(--color-foreground)] truncate max-w-[160px]", children: data?.event ?? "" }),
53367
- data?.hasEffects && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-2.5 h-2.5 rounded-full bg-violet-500/80 shrink-0", title: "Effects" })
53680
+ data?.hasEffects && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-2.5 h-2.5 rounded-full bg-violet-500/80 shrink-0", title: t("avl.effects") })
53368
53681
  ]
53369
53682
  }
53370
53683
  ) })
@@ -56685,6 +56998,7 @@ function BrowserPlayground({
56685
56998
 
56686
56999
  // components/avl/molecules/OrbPreviewNode.tsx
56687
57000
  init_useEventBus();
57001
+ init_useTranslate();
56688
57002
 
56689
57003
  // components/avl/molecules/useCanvasDnd.tsx
56690
57004
  init_useEventBus();
@@ -57172,6 +57486,7 @@ var OrbPreviewNodeInner = (props) => {
57172
57486
  const screenSize = React97.useContext(ScreenSizeContext);
57173
57487
  const preset = SCREEN_SIZE_PRESETS[screenSize];
57174
57488
  const { select } = React97.useContext(PatternSelectionContext);
57489
+ const { t } = useTranslate();
57175
57490
  const eventBus = useEventBus();
57176
57491
  const reactFlow = react.useReactFlow();
57177
57492
  const contentRef = React97.useRef(null);
@@ -57192,7 +57507,7 @@ var OrbPreviewNodeInner = (props) => {
57192
57507
  const isSuccess = status === "success";
57193
57508
  const isError = status === "error";
57194
57509
  const label = isImportedGroup ? data.behaviorAlias ?? "" : isExpanded ? `${data.transitionEvent ?? ""}` : data.orbitalName;
57195
- const sublabel = isImportedGroup ? `${data.behaviorName ?? ""}${typeof data.transitionCount === "number" && data.transitionCount > 1 ? ` \xB7 ${data.transitionCount} screens` : ""}` : isExpanded ? `${data.fromState ?? ""} \u2192 ${data.toState ?? ""}` : data.entityName ?? "";
57510
+ const sublabel = isImportedGroup ? `${data.behaviorName ?? ""}${typeof data.transitionCount === "number" && data.transitionCount > 1 ? ` \xB7 ${t("orbPreview.screensCount", { count: data.transitionCount })}` : ""}` : isExpanded ? `${data.fromState ?? ""} \u2192 ${data.toState ?? ""}` : data.entityName ?? "";
57196
57511
  const orbitalSchema = React97.useMemo(() => {
57197
57512
  const fullSchema = data._fullSchema;
57198
57513
  if (!fullSchema) return void 0;
@@ -57360,7 +57675,7 @@ var OrbPreviewNodeInner = (props) => {
57360
57675
  color: "var(--color-muted-foreground)",
57361
57676
  zIndex: 3
57362
57677
  },
57363
- children: "Preview"
57678
+ children: t("orbPreview.previewBadge")
57364
57679
  }
57365
57680
  ),
57366
57681
  hovered && !dragActive && !l1IsOver && /* @__PURE__ */ jsxRuntime.jsx(
@@ -57382,7 +57697,7 @@ var OrbPreviewNodeInner = (props) => {
57382
57697
  },
57383
57698
  children: [
57384
57699
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 12 }, children: "\u279E" }),
57385
- "Double-click to open"
57700
+ t("orbPreview.doubleClickToOpen")
57386
57701
  ]
57387
57702
  }
57388
57703
  )
@@ -57405,7 +57720,7 @@ var OrbPreviewNodeInner = (props) => {
57405
57720
  color: "var(--color-primary-foreground)",
57406
57721
  boxShadow: "var(--shadow-lg)"
57407
57722
  },
57408
- children: "Drop to add and open"
57723
+ children: t("orbPreview.dropToAddAndOpen")
57409
57724
  }
57410
57725
  )
57411
57726
  }
@@ -57439,7 +57754,7 @@ var OrbPreviewNodeInner = (props) => {
57439
57754
  borderTopColor: "transparent",
57440
57755
  zIndex: 2
57441
57756
  },
57442
- title: "Coordinator is dispatching to this orbital"
57757
+ title: t("orbPreview.dispatching")
57443
57758
  }
57444
57759
  )
57445
57760
  ] }),
@@ -57535,7 +57850,7 @@ var OrbPreviewNodeInner = (props) => {
57535
57850
  height: "auto"
57536
57851
  }
57537
57852
  ) })
57538
- ) : /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex items-center justify-center", style: { minHeight: preset.minHeight }, children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground", children: "No preview available" }) })
57853
+ ) : /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex items-center justify-center", style: { minHeight: preset.minHeight }, children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground", children: t("orbPreview.noPreview") }) })
57539
57854
  ]
57540
57855
  }
57541
57856
  ),
@@ -58126,7 +58441,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58126
58441
  const handleRemoveEffect = React97.useCallback((effectIndex) => {
58127
58442
  eventBus.emit("UI:REMOVE_EFFECT", { effectIndex });
58128
58443
  }, [eventBus]);
58129
- const headerTitle = selectedPattern ? selectedPattern.patternType : isExpanded ? transitionEvent || "Transition" : orbitalName;
58444
+ const headerTitle = selectedPattern ? selectedPattern.patternType : isExpanded ? transitionEvent || t("avl.transition") : orbitalName;
58130
58445
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-col bg-card border-l border-border h-full w-full sm:w-[340px]", children: [
58131
58446
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "shrink-0 border-b border-border", children: [
58132
58447
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center justify-between px-4 py-2", children: [
@@ -58143,7 +58458,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58143
58458
  {
58144
58459
  onClick: onClose,
58145
58460
  className: "text-muted-foreground hover:text-foreground text-sm cursor-pointer bg-transparent border-none p-1",
58146
- "aria-label": "Close",
58461
+ "aria-label": t("common.close"),
58147
58462
  children: "\xD7"
58148
58463
  }
58149
58464
  )
@@ -58153,7 +58468,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58153
58468
  {
58154
58469
  onClick: () => setActiveTab(tab),
58155
58470
  className: `pb-2 text-xs font-medium border-b-2 cursor-pointer bg-transparent border-x-0 border-t-0 px-0 capitalize ${activeTab === tab ? "border-[var(--color-primary)] text-foreground" : "border-transparent text-muted-foreground hover:text-foreground"}`,
58156
- children: tab
58471
+ children: t(`orbInspector.tab.${tab}`)
58157
58472
  },
58158
58473
  tab
58159
58474
  )) })
@@ -58199,7 +58514,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58199
58514
  /* ── Inspector Tab ── */
58200
58515
  /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
58201
58516
  selectedPattern && patternDef?.propsSchema && /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "px-4 py-3 border-b border-border/40", children: [
58202
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("Props") }),
58517
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("avl.props") }),
58203
58518
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex flex-col gap-1.5", children: Object.entries(patternDef.propsSchema).slice(0, 12).map(([propName, propSchema]) => {
58204
58519
  const ps = propSchema;
58205
58520
  const explicitValue = patternConfig ? patternConfig[propName] : void 0;
@@ -58233,7 +58548,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58233
58548
  }) })
58234
58549
  ] }),
58235
58550
  userType === "architect" && (selectedPattern && isEntityPattern || !selectedPattern && !isExpanded) && entity && /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "px-4 py-3 border-b border-border/40", children: [
58236
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("Entity") }),
58551
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("avl.entity") }),
58237
58552
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-2 mb-2", children: [
58238
58553
  /* @__PURE__ */ jsxRuntime.jsx("svg", { width: 14, height: 14, children: /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: 7, cy: 7, r: 5, fill: "var(--color-primary)" }) }),
58239
58554
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "font-semibold text-xs", children: entity.name }),
@@ -58276,7 +58591,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58276
58591
  ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
58277
58592
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-xs font-mono flex-1", children: f3.name }),
58278
58593
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs", children: f3.type }),
58279
- f3.required && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-primary text-[9px]", children: t("req") })
58594
+ f3.required && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-primary text-[9px]", children: t("orbInspector.required") })
58280
58595
  ] })
58281
58596
  ] }, f3.name)) }),
58282
58597
  editable && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -58288,13 +58603,13 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58288
58603
  className: "mt-2 text-xs w-full",
58289
58604
  children: [
58290
58605
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", size: "xs", className: "mr-1" }),
58291
- t("Add Field")
58606
+ t("orbInspector.addField")
58292
58607
  ]
58293
58608
  }
58294
58609
  )
58295
58610
  ] }),
58296
58611
  editable && !selectedPattern && !isExpanded && node.layer === "Services" && /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "px-4 py-3 border-b border-border/40", children: [
58297
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("Service Mode") }),
58612
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("orbInspector.serviceMode") }),
58298
58613
  /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", className: "items-center", children: [
58299
58614
  /* @__PURE__ */ jsxRuntime.jsxs(
58300
58615
  Button,
@@ -58307,7 +58622,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58307
58622
  },
58308
58623
  children: [
58309
58624
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "monitor", size: "xs", className: "mr-1" }),
58310
- t("Standalone")
58625
+ t("orbInspector.standalone")
58311
58626
  ]
58312
58627
  }
58313
58628
  ),
@@ -58322,25 +58637,22 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58322
58637
  },
58323
58638
  children: [
58324
58639
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "cpu", size: "xs", className: "mr-1" }),
58325
- t("Embedded")
58640
+ t("orbInspector.embedded")
58326
58641
  ]
58327
58642
  }
58328
58643
  )
58329
58644
  ] }),
58330
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs mt-1", children: hasRenderUi ? t("Renders its own UI") : t("Headless, wired to other behaviors") })
58645
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs mt-1", children: hasRenderUi ? t("orbInspector.rendersOwnUi") : t("orbInspector.headless") })
58331
58646
  ] }),
58332
58647
  !selectedPattern && !isExpanded && traits2.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "px-4 py-3 border-b border-border/40", children: [
58333
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: "Traits" }),
58334
- /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex flex-col gap-1", children: traits2.map((t2) => /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-2", children: [
58335
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-xs font-semibold", children: t2.name }),
58336
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-muted-foreground text-xs", children: [
58337
- t2.stateCount,
58338
- " states"
58339
- ] })
58340
- ] }, t2.name)) })
58648
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("avl.traits") }),
58649
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex flex-col gap-1", children: traits2.map((tr) => /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-2", children: [
58650
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-xs font-semibold", children: tr.name }),
58651
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs", children: t("orbInspector.statesCount", { count: tr.stateCount }) })
58652
+ ] }, tr.name)) })
58341
58653
  ] }),
58342
58654
  isExpanded && fromState && toState && /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "px-4 py-3 border-b border-border/40", children: [
58343
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: "Transition" }),
58655
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("avl.transition") }),
58344
58656
  /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "100%", height: 44, viewBox: "0 0 280 44", children: [
58345
58657
  /* @__PURE__ */ jsxRuntime.jsx(exports.AvlState, { x: 8, y: 8, name: fromState, role: getStateRole(fromState), width: 90, height: 26 }),
58346
58658
  /* @__PURE__ */ jsxRuntime.jsx("line", { x1: 104, y1: 21, x2: 158, y2: 21, stroke: "#1E293B", strokeWidth: 2, markerEnd: "url(#orb-arrow)" }),
@@ -58349,7 +58661,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58349
58661
  ] }),
58350
58662
  traitName && /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-muted-foreground text-xs", children: [
58351
58663
  traitName,
58352
- entityName ? ` on ${entityName}` : ""
58664
+ entityName ? t("orbInspector.onEntity", { entity: entityName }) : ""
58353
58665
  ] })
58354
58666
  ] }),
58355
58667
  isExpanded && transitionEvent && /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-4 py-2 border-b border-border/40", children: /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-2", children: [
@@ -58362,7 +58674,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58362
58674
  Input,
58363
58675
  {
58364
58676
  defaultValue: formatExpression(transition?.guard ?? guard),
58365
- placeholder: t("Guard expression"),
58677
+ placeholder: t("orbInspector.guardExpression"),
58366
58678
  className: "flex-1 text-xs font-mono h-6",
58367
58679
  onBlur: (e) => handleGuardChange(e.target.value)
58368
58680
  }
@@ -58370,7 +58682,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58370
58682
  ] }) }),
58371
58683
  userType === "architect" && (effectTypes.length > 0 || editable) && isExpanded && /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "px-4 py-3 border-b border-border/40", children: [
58372
58684
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: [
58373
- t("Effects"),
58685
+ t("avl.effects"),
58374
58686
  " (",
58375
58687
  effectTypes.length,
58376
58688
  ")"
@@ -58427,7 +58739,7 @@ function AddEffectButton({ onAdd }) {
58427
58739
  className: "text-xs w-full",
58428
58740
  children: [
58429
58741
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", size: "xs", className: "mr-1" }),
58430
- t("Add Effect")
58742
+ t("orbInspector.addEffect")
58431
58743
  ]
58432
58744
  }
58433
58745
  ),
@@ -58488,7 +58800,7 @@ var PHASE_2_TOKEN_FALLBACK = {
58488
58800
  function StylesTab({ patternType, patternDef, patternConfig, editable, onPropChange, themeManifest, isDesignSystem }) {
58489
58801
  const { t } = useTranslate();
58490
58802
  if (!patternType) {
58491
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "p-4", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs", children: t("Select a pattern to view its style tokens.") }) });
58803
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "p-4", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs", children: t("orbInspector.selectPatternForStyles") }) });
58492
58804
  }
58493
58805
  const tier = patternDef?.category ?? "Pattern";
58494
58806
  const tokens = PHASE_2_TOKEN_FALLBACK[patternType] ?? [];
@@ -58509,11 +58821,11 @@ function StylesTab({ patternType, patternDef, patternConfig, editable, onPropCha
58509
58821
  )
58510
58822
  ] }),
58511
58823
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { children: [
58512
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("Tokens") }),
58513
- tokens.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs italic", children: t("No token contract declared for this pattern.") }) : /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex flex-col gap-1", children: tokens.map((token) => /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex items-center gap-2", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "font-mono text-xs", children: token }) }, token)) })
58824
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("orbInspector.tokens") }),
58825
+ tokens.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs italic", children: t("orbInspector.noTokenContract") }) : /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex flex-col gap-1", children: tokens.map((token) => /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex items-center gap-2", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "font-mono text-xs", children: token }) }, token)) })
58514
58826
  ] }),
58515
58827
  variantEnum && variantEnum.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(Box, { children: [
58516
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("Variant") }),
58828
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("orbInspector.variant") }),
58517
58829
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex flex-wrap gap-1", children: variantEnum.map((variant) => {
58518
58830
  const isActive = variant === currentVariant || !currentVariant && variant === "default";
58519
58831
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -58533,7 +58845,7 @@ function StylesTab({ patternType, patternDef, patternConfig, editable, onPropCha
58533
58845
  }) })
58534
58846
  ] }),
58535
58847
  sizeEnum && sizeEnum.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(Box, { children: [
58536
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("Size") }),
58848
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("orbInspector.size") }),
58537
58849
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex flex-wrap gap-1", children: sizeEnum.map((size) => {
58538
58850
  const isActive = size === currentSize || !currentSize && size === "md";
58539
58851
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -58556,20 +58868,21 @@ function StylesTab({ patternType, patternDef, patternConfig, editable, onPropCha
58556
58868
  ] });
58557
58869
  }
58558
58870
  var TOKEN_GROUPS = [
58559
- { group: "colors", label: "Colors" },
58560
- { group: "radii", label: "Radii" },
58561
- { group: "spacing", label: "Spacing" },
58562
- { group: "shadows", label: "Shadows" }
58871
+ { group: "colors", labelKey: "orbInspector.tokenGroup.colors" },
58872
+ { group: "radii", labelKey: "orbInspector.tokenGroup.radii" },
58873
+ { group: "spacing", labelKey: "orbInspector.tokenGroup.spacing" },
58874
+ { group: "shadows", labelKey: "orbInspector.tokenGroup.shadows" }
58563
58875
  ];
58564
58876
  function TokenEditorSection({ themeManifest, onPropChange }) {
58877
+ const { t } = useTranslate();
58565
58878
  const tokens = themeManifest.tokens ?? {};
58566
58879
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-col gap-3 pt-2 border-t border-border/40", children: [
58567
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-xs uppercase tracking-wider text-muted-foreground", children: "Project theme tokens" }),
58568
- TOKEN_GROUPS.map(({ group, label }) => {
58880
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-xs uppercase tracking-wider text-muted-foreground", children: t("orbInspector.projectThemeTokens") }),
58881
+ TOKEN_GROUPS.map(({ group, labelKey }) => {
58569
58882
  const entries = Object.entries(tokens[group] ?? {});
58570
58883
  if (entries.length === 0) return null;
58571
58884
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-col gap-1.5", children: [
58572
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-xs font-mono text-muted-foreground", children: label }),
58885
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-xs font-mono text-muted-foreground", children: t(labelKey) }),
58573
58886
  entries.map(([key, value]) => /* @__PURE__ */ jsxRuntime.jsx(
58574
58887
  TokenRow,
58575
58888
  {
@@ -58617,6 +58930,7 @@ init_Typography();
58617
58930
  init_Badge();
58618
58931
 
58619
58932
  // components/avl/organisms/AvlTraitScene.tsx
58933
+ init_useTranslate();
58620
58934
  init_AvlState();
58621
58935
  init_AvlTransitionLane();
58622
58936
  init_AvlSwimLane();
@@ -58630,6 +58944,7 @@ var AvlTraitScene = ({
58630
58944
  color = "var(--color-primary)",
58631
58945
  onTransitionClick
58632
58946
  }) => {
58947
+ const { t } = useTranslate();
58633
58948
  const [layout, setLayout] = React97.useState(null);
58634
58949
  const dataKey = React97.useMemo(() => JSON.stringify(data), [data]);
58635
58950
  React97.useEffect(() => {
@@ -58638,7 +58953,7 @@ var AvlTraitScene = ({
58638
58953
  });
58639
58954
  }, [dataKey]);
58640
58955
  if (!layout) {
58641
- return /* @__PURE__ */ jsxRuntime.jsx("g", { children: /* @__PURE__ */ jsxRuntime.jsx("text", { x: 300, y: 200, textAnchor: "middle", fill: color, fontSize: 12, opacity: 0.5, children: "Computing layout..." }) });
58956
+ return /* @__PURE__ */ jsxRuntime.jsx("g", { children: /* @__PURE__ */ jsxRuntime.jsx("text", { x: 300, y: 200, textAnchor: "middle", fill: color, fontSize: 12, opacity: 0.5, children: t("avl.computingLayout") }) });
58642
58957
  }
58643
58958
  const hasExternal = data.listenedEvents.length > 0 || data.emittedEvents.length > 0;
58644
58959
  const machineOffsetX = hasExternal ? 0 : 30;
@@ -58653,10 +58968,7 @@ var AvlTraitScene = ({
58653
58968
  const machineHeight = scaledH + 100;
58654
58969
  const renderMachine = /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
58655
58970
  /* @__PURE__ */ jsxRuntime.jsx("text", { x: CENTER_W2 / 2, y: 20, textAnchor: "middle", fill: color, fontSize: 20, fontWeight: "700", fontFamily: "inherit", children: data.name }),
58656
- /* @__PURE__ */ jsxRuntime.jsxs("text", { x: CENTER_W2 / 2, y: 38, textAnchor: "middle", fill: color, fontSize: 11, opacity: 0.5, fontFamily: "inherit", children: [
58657
- "linked to ",
58658
- data.linkedEntity
58659
- ] }),
58971
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: CENTER_W2 / 2, y: 38, textAnchor: "middle", fill: color, fontSize: 11, opacity: 0.5, fontFamily: "inherit", children: t("avl.linkedTo", { entity: data.linkedEntity }) }),
58660
58972
  /* @__PURE__ */ jsxRuntime.jsxs("defs", { children: [
58661
58973
  /* @__PURE__ */ jsxRuntime.jsx("marker", { id: "traitArrowV2", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: exports.CONNECTION_COLORS.forward.color, opacity: 0.7 }) }),
58662
58974
  /* @__PURE__ */ jsxRuntime.jsx("marker", { id: "traitArrowBack", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: exports.CONNECTION_COLORS.backward.color, opacity: 0.5 }) })
@@ -58731,6 +59043,9 @@ var AvlTraitScene = ({
58731
59043
  );
58732
59044
  };
58733
59045
  AvlTraitScene.displayName = "AvlTraitScene";
59046
+
59047
+ // components/avl/molecules/TraitCardNode.tsx
59048
+ init_useTranslate();
58734
59049
  var TraitCardSelectionContext = React97.createContext({
58735
59050
  selectTransition: () => {
58736
59051
  }
@@ -58740,6 +59055,7 @@ var SCENE_WIDTH = 600;
58740
59055
  var SCENE_HEIGHT = 400;
58741
59056
  var TraitCardNodeInner = (props) => {
58742
59057
  const data = props.data;
59058
+ const { t } = useTranslate();
58743
59059
  const { selectTransition } = React97.useContext(TraitCardSelectionContext);
58744
59060
  const orbitalName = data.orbitalName;
58745
59061
  const traitName = data.traitName ?? "";
@@ -58765,7 +59081,7 @@ var TraitCardNodeInner = (props) => {
58765
59081
  position: react.Position.Left,
58766
59082
  id: `listen-${event}`,
58767
59083
  style: { top: `${(i + 1) / (listens.length + 1) * 100}%` },
58768
- "aria-label": `listens for ${event}`
59084
+ "aria-label": t("avl.listensFor", { event })
58769
59085
  },
58770
59086
  `listen-${event}`
58771
59087
  )),
@@ -58776,7 +59092,7 @@ var TraitCardNodeInner = (props) => {
58776
59092
  position: react.Position.Right,
58777
59093
  id: `emit-${event}`,
58778
59094
  style: { top: `${(i + 1) / (emits.length + 1) * 100}%` },
58779
- "aria-label": `emits ${event}`
59095
+ "aria-label": t("avl.emits", { event })
58780
59096
  },
58781
59097
  `emit-${event}`
58782
59098
  )),
@@ -58803,14 +59119,14 @@ var TraitCardNodeInner = (props) => {
58803
59119
  {
58804
59120
  data: traitLevelData,
58805
59121
  onTransitionClick: (idx) => {
58806
- const t = transitions[idx];
58807
- if (!t) return;
59122
+ const t2 = transitions[idx];
59123
+ if (!t2) return;
58808
59124
  selectTransition({
58809
59125
  orbitalName,
58810
59126
  traitName,
58811
- transitionEvent: t.event,
58812
- fromState: t.fromState,
58813
- toState: t.toState,
59127
+ transitionEvent: t2.event,
59128
+ fromState: t2.fromState,
59129
+ toState: t2.toState,
58814
59130
  index: idx
58815
59131
  });
58816
59132
  }
@@ -58818,7 +59134,7 @@ var TraitCardNodeInner = (props) => {
58818
59134
  )
58819
59135
  }
58820
59136
  )
58821
- ) : /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "muted", children: "No state machine" })
59137
+ ) : /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "muted", children: t("avl.noStateMachine") })
58822
59138
  ] })
58823
59139
  ]
58824
59140
  }
@@ -58829,6 +59145,7 @@ TraitCardNode.displayName = "TraitCardNode";
58829
59145
 
58830
59146
  // components/avl/organisms/FlowCanvas.tsx
58831
59147
  init_useEventBus();
59148
+ init_useTranslate();
58832
59149
  var flowCanvasLog = logger.createLogger("almadar:ui:flow-canvas");
58833
59150
  var NODE_TYPES = {
58834
59151
  preview: OrbPreviewNode,
@@ -58872,6 +59189,7 @@ function FlowCanvasInner({
58872
59189
  userType = "builder",
58873
59190
  themeManifest
58874
59191
  }) {
59192
+ const { t } = useTranslate();
58875
59193
  const NODE_TYPES2 = React97.useMemo(() => ({
58876
59194
  preview: OrbPreviewNode,
58877
59195
  behaviorCompose: BehaviorComposeNode,
@@ -58924,13 +59242,13 @@ function FlowCanvasInner({
58924
59242
  }), [selectedPattern]);
58925
59243
  const [atBehaviorLevel, setAtBehaviorLevel] = React97.useState(composeLevel === "behavior");
58926
59244
  const { composeNodes, composeEdges, overviewNodes, overviewEdges, expandedNodes, expandedEdges, behaviorExpandedNodes, behaviorExpandedEdges, traitExpandedNodes, traitExpandedEdges } = React97.useMemo(() => {
58927
- const t = perfStart("compose-graph");
59245
+ const t2 = perfStart("compose-graph");
58928
59246
  const compose = composeLevel === "behavior" && behaviorEntries?.length ? behaviorsToComposeGraph(behaviorEntries, behaviorWires ?? [], layoutHint) : { nodes: [], edges: [] };
58929
59247
  const overview = schemaToOverviewGraph(parsedSchema, mockData, behaviorMeta, layoutHint, orbitalStatus, screenSize);
58930
59248
  const expanded = expandedOrbital ? orbitalToExpandedGraph(parsedSchema, expandedOrbital, mockData, screenSize) : { nodes: [], edges: [] };
58931
59249
  const behaviorExpanded = expandedOrbital && expandedBehaviorAlias ? orbitalAliasToExpandedGraph(parsedSchema, expandedOrbital, expandedBehaviorAlias, mockData, screenSize) : { nodes: [], edges: [] };
58932
59250
  const traitExpanded = expandedOrbital ? orbitalToTraitGraph(parsedSchema, expandedOrbital) : { nodes: [], edges: [] };
58933
- perfEnd("compose-graph", t, {
59251
+ perfEnd("compose-graph", t2, {
58934
59252
  composeNodes: compose.nodes.length,
58935
59253
  overviewNodes: overview.nodes.length,
58936
59254
  expandedNodes: expanded.nodes.length,
@@ -59183,12 +59501,12 @@ function FlowCanvasInner({
59183
59501
  {
59184
59502
  onClick: handleGoBack,
59185
59503
  className: "text-muted-foreground hover:text-foreground text-sm cursor-pointer bg-transparent border-none p-0",
59186
- "aria-label": "Go back to overview",
59504
+ "aria-label": t("canvas.goBackToOverview"),
59187
59505
  children: "\u2190"
59188
59506
  }
59189
59507
  ),
59190
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "font-medium", children: level === "overview" ? "Overview" : expandedOrbital ?? "Expanded" }),
59191
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground", children: level === "overview" ? `${nodes.length} modules` : `${nodes.length} screens` })
59508
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "font-medium", children: level === "overview" ? t("canvas.overview") : expandedOrbital ?? t("canvas.expanded") }),
59509
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground", children: level === "overview" ? t("canvas.modulesCount", { count: nodes.length }) : t("canvas.screensCount", { count: nodes.length }) })
59192
59510
  ] }),
59193
59511
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex items-center gap-1 px-2 py-1 rounded-md bg-card/80 border border-border/40 backdrop-blur-sm", children: screenSizeKeys.map((size) => {
59194
59512
  const p2 = SCREEN_SIZE_PRESETS[size];
@@ -59204,7 +59522,7 @@ function FlowCanvasInner({
59204
59522
  },
59205
59523
  className: `px-2 py-1 text-xs font-medium rounded cursor-pointer border-none transition-colors ${active ? "bg-primary text-primary-foreground" : "bg-transparent text-muted-foreground hover:text-foreground hover:bg-muted/50"}`,
59206
59524
  title: `${p2.label} (${p2.width}px)`,
59207
- "aria-label": `Switch to ${p2.label} view`,
59525
+ "aria-label": t("canvas.switchToView", { label: p2.label }),
59208
59526
  children: p2.label
59209
59527
  },
59210
59528
  size
@@ -59586,6 +59904,7 @@ init_Stack();
59586
59904
  init_Typography();
59587
59905
  init_Button();
59588
59906
  init_Icon();
59907
+ init_useTranslate();
59589
59908
  var UNIT_DISPLAY_W = 240;
59590
59909
  var UNIT_DISPLAY_H = 160;
59591
59910
  function layoutOrbitals(count, containerW, containerH) {
@@ -59776,6 +60095,7 @@ var AvlOrbitalsCosmicZoom = ({
59776
60095
  minZoom = 0.4,
59777
60096
  maxZoom = 3
59778
60097
  }) => {
60098
+ const { t } = useTranslate();
59779
60099
  const parsedSchema = React97.useMemo(() => {
59780
60100
  if (typeof schemaProp === "string") return JSON.parse(schemaProp);
59781
60101
  return schemaProp;
@@ -59843,9 +60163,9 @@ var AvlOrbitalsCosmicZoom = ({
59843
60163
  (ctx) => {
59844
60164
  if (ctx.level !== "transition" || !ctx.trait || !ctx.transition) return;
59845
60165
  const orbital = parsedSchema.orbitals?.find((o) => o.name === ctx.orbital);
59846
- const traitRef = orbital?.traits?.find((t) => core.isInlineTrait(t) && t.name === ctx.trait);
60166
+ const traitRef = orbital?.traits?.find((t2) => core.isInlineTrait(t2) && t2.name === ctx.trait);
59847
60167
  if (!traitRef || !core.isInlineTrait(traitRef)) return;
59848
- const idx = traitRef.stateMachine?.transitions?.findIndex((t) => t.event === ctx.transition) ?? -1;
60168
+ const idx = traitRef.stateMachine?.transitions?.findIndex((t2) => t2.event === ctx.transition) ?? -1;
59849
60169
  if (idx < 0) return;
59850
60170
  dispatch({ type: "SELECT_TRAIT", trait: ctx.trait });
59851
60171
  dispatch({ type: "ZOOM_INTO_TRANSITION", transitionIndex: idx, targetPosition: { x: 0, y: 0 } });
@@ -60021,7 +60341,7 @@ var AvlOrbitalsCosmicZoom = ({
60021
60341
  borderRadius: 4,
60022
60342
  opacity: 0.8
60023
60343
  },
60024
- children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", style: { color }, children: "Press Esc to zoom out" })
60344
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", style: { color }, children: t("avl.pressEscToZoomOut") })
60025
60345
  }
60026
60346
  ),
60027
60347
  state.level === "application" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -60073,7 +60393,7 @@ var AvlOrbitalsCosmicZoom = ({
60073
60393
  onKeyDown: (e) => {
60074
60394
  if (e.key === "Enter" || e.key === " ") handleSelect(view.name);
60075
60395
  },
60076
- "aria-label": `Orbital: ${view.name}${isHighlighted ? " (highlighted)" : ""}`,
60396
+ "aria-label": isHighlighted ? t("avl.orbitalLabelHighlighted", { name: view.name }) : t("avl.orbitalLabel", { name: view.name }),
60077
60397
  position: "absolute",
60078
60398
  style: {
60079
60399
  left: view.cx - UNIT_DISPLAY_W / 2,
@@ -60121,9 +60441,9 @@ var AvlOrbitalsCosmicZoom = ({
60121
60441
  zIndex: 30
60122
60442
  },
60123
60443
  children: [
60124
- /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "secondary", size: "sm", onClick: zoomIn, title: "Zoom in", action: "COSMIC_ZOOM_IN", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", size: "sm" }) }),
60125
- /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "secondary", size: "sm", onClick: zoomOut, title: "Zoom out", action: "COSMIC_ZOOM_OUT", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "minus", size: "sm" }) }),
60126
- /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "secondary", size: "sm", onClick: resetZoom, title: "Reset", action: "COSMIC_ZOOM_RESET", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "maximize", size: "sm" }) })
60444
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "secondary", size: "sm", onClick: zoomIn, title: t("avl.zoomIn"), action: "COSMIC_ZOOM_IN", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", size: "sm" }) }),
60445
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "secondary", size: "sm", onClick: zoomOut, title: t("avl.zoomOut"), action: "COSMIC_ZOOM_OUT", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "minus", size: "sm" }) }),
60446
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "secondary", size: "sm", onClick: resetZoom, title: t("common.reset"), action: "COSMIC_ZOOM_RESET", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "maximize", size: "sm" }) })
60127
60447
  ]
60128
60448
  }
60129
60449
  )