@almadar/ui 5.21.8 → 5.21.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
  )
@@ -18052,7 +18346,7 @@ var init_StateMachineView = __esm({
18052
18346
  const endX2 = fromState.x + Math.cos(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
18053
18347
  const endY2 = fromState.y + Math.sin(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
18054
18348
  const isSingle2 = bundle.labels.length === 1;
18055
- 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 });
18056
18350
  const bundleColor2 = isSingle2 ? config.colors.arrow : "var(--color-accent)";
18057
18351
  const labelWidth2 = labelText2.length * 9 + (isSingle2 ? 24 : 40);
18058
18352
  const cx = fromState.x;
@@ -18178,7 +18472,7 @@ var init_StateMachineView = __esm({
18178
18472
  const controlX = midX + perpX;
18179
18473
  const controlY = midY + perpY;
18180
18474
  const isSingle = bundle.labels.length === 1;
18181
- 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 });
18182
18476
  const labelWidth = labelText.length * 9 + (isSingle ? 24 : 40);
18183
18477
  const bundleColor = isSingle ? config.colors.arrow : "var(--color-accent)";
18184
18478
  const curveMidpoint = {
@@ -18333,7 +18627,7 @@ var init_StateMachineView = __esm({
18333
18627
  {
18334
18628
  className: "absolute -top-2 left-1/2 transform -translate-x-1/2 px-2 py-0.5 rounded-full",
18335
18629
  style: { backgroundColor: "var(--color-success)" },
18336
- 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") })
18337
18631
  }
18338
18632
  ),
18339
18633
  !isSingle && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -18355,10 +18649,7 @@ var init_StateMachineView = __esm({
18355
18649
  {
18356
18650
  className: "ml-2 px-2 py-0.5 rounded-full",
18357
18651
  style: { backgroundColor: "var(--color-accent)" },
18358
- children: /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: [
18359
- bundle.labels.length,
18360
- " events"
18361
- ] })
18652
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: t("stateMachine.eventCount", { count: bundle.labels.length }) })
18362
18653
  }
18363
18654
  )
18364
18655
  ]
@@ -18503,7 +18794,7 @@ var init_StateMachineView = __esm({
18503
18794
  align: "center",
18504
18795
  className: "mb-2",
18505
18796
  style: { color: "var(--color-warning)", fontSize: "13px" },
18506
- children: "External Effects"
18797
+ children: t("stateMachine.externalEffects")
18507
18798
  }
18508
18799
  ),
18509
18800
  outputs.outputs.map((output, idx) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -18523,10 +18814,10 @@ var init_StateMachineView = __esm({
18523
18814
  Legend = ({ config, y }) => {
18524
18815
  const { t } = useTranslate();
18525
18816
  const items = [
18526
- { label: "Initial", color: config.colors.initialNode },
18527
- { label: "Final", color: config.colors.finalNode },
18528
- { label: "State", color: config.colors.nodeBorder },
18529
- { 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 }
18530
18821
  ];
18531
18822
  return /* @__PURE__ */ jsxRuntime.jsx(
18532
18823
  HStack,
@@ -18541,8 +18832,8 @@ var init_StateMachineView = __esm({
18541
18832
  {
18542
18833
  className: "w-3 h-3 rounded-full",
18543
18834
  style: {
18544
- backgroundColor: item.label === "Multi-event" ? item.color : config.colors.node,
18545
- 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"
18546
18837
  }
18547
18838
  }
18548
18839
  ),
@@ -18554,7 +18845,7 @@ var init_StateMachineView = __esm({
18554
18845
  children: item.label
18555
18846
  }
18556
18847
  )
18557
- ] }, item.label))
18848
+ ] }, item.key))
18558
18849
  }
18559
18850
  );
18560
18851
  };
@@ -19348,13 +19639,13 @@ var init_JazariStateMachine = __esm({
19348
19639
  );
19349
19640
  }, [resolvedTrait, entityFields]);
19350
19641
  if (isLoading) {
19351
- return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: "Loading state machine\u2026" });
19642
+ return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: t("stateMachine.loading") });
19352
19643
  }
19353
19644
  if (error) {
19354
19645
  return /* @__PURE__ */ jsxRuntime.jsx(ErrorState, { message: error instanceof Error ? error.message : String(error) });
19355
19646
  }
19356
19647
  if (!resolvedTrait || !layoutData || layoutData.states.length === 0) {
19357
- 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") }) });
19358
19649
  }
19359
19650
  return /* @__PURE__ */ jsxRuntime.jsx(
19360
19651
  StateMachineView,
@@ -20398,13 +20689,13 @@ var init_LayoutPatterns = __esm({
20398
20689
  function generateRuleId() {
20399
20690
  return `rule-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
20400
20691
  }
20401
- function questionsToOptions(questions, includeEndOfSurvey) {
20692
+ function questionsToOptions(questions, endOfSurveyLabel) {
20402
20693
  const opts = questions.map((q) => ({
20403
20694
  value: q.id,
20404
20695
  label: q.label
20405
20696
  }));
20406
- if (includeEndOfSurvey) {
20407
- opts.push({ value: END_OF_SURVEY, label: "End of survey" });
20697
+ if (endOfSurveyLabel !== null) {
20698
+ opts.push({ value: END_OF_SURVEY, label: endOfSurveyLabel });
20408
20699
  }
20409
20700
  return opts;
20410
20701
  }
@@ -20413,7 +20704,7 @@ function isRuleBroken(rule, questions) {
20413
20704
  const targetExists = rule.targetQuestionId === END_OF_SURVEY || questions.some((q) => q.id === rule.targetQuestionId);
20414
20705
  return !sourceExists || !targetExists;
20415
20706
  }
20416
- 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;
20417
20708
  var init_BranchingLogicBuilder = __esm({
20418
20709
  "components/core/molecules/BranchingLogicBuilder.tsx"() {
20419
20710
  "use client";
@@ -20426,14 +20717,9 @@ var init_BranchingLogicBuilder = __esm({
20426
20717
  init_FilterPill();
20427
20718
  init_Box();
20428
20719
  init_useEventBus();
20720
+ init_useTranslate();
20429
20721
  init_cn();
20430
20722
  END_OF_SURVEY = "end-of-survey";
20431
- OPERATOR_OPTIONS = [
20432
- { value: "equals", label: "equals" },
20433
- { value: "not-equals", label: "does not equal" },
20434
- { value: "contains", label: "contains" },
20435
- { value: "in", label: "is one of" }
20436
- ];
20437
20723
  RuleRow = ({
20438
20724
  rule,
20439
20725
  questions,
@@ -20442,8 +20728,21 @@ var init_BranchingLogicBuilder = __esm({
20442
20728
  onChange,
20443
20729
  onDelete
20444
20730
  }) => {
20445
- const sourceOptions = React97.useMemo(() => questionsToOptions(questions, false), [questions]);
20446
- 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
+ );
20447
20746
  const sourceQuestion = questions.find((q) => q.id === rule.sourceQuestionId);
20448
20747
  const valueOptions = React97.useMemo(() => {
20449
20748
  if (!sourceQuestion?.optionValues) return [];
@@ -20488,22 +20787,22 @@ var init_BranchingLogicBuilder = __esm({
20488
20787
  ),
20489
20788
  children: [
20490
20789
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-wrap items-center gap-2", children: [
20491
- /* @__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") }),
20492
20791
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsxRuntime.jsx(
20493
20792
  Select,
20494
20793
  {
20495
20794
  options: sourceOptions,
20496
20795
  value: rule.sourceQuestionId,
20497
- placeholder: "Select question",
20796
+ placeholder: t("branchingLogic.selectQuestion"),
20498
20797
  onChange: handleSource,
20499
20798
  disabled: readOnly,
20500
- error: broken ? "Broken reference" : void 0
20799
+ error: broken ? t("branchingLogic.brokenReference") : void 0
20501
20800
  }
20502
20801
  ) }),
20503
20802
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[8rem] basis-32", children: /* @__PURE__ */ jsxRuntime.jsx(
20504
20803
  Select,
20505
20804
  {
20506
- options: OPERATOR_OPTIONS,
20805
+ options: operatorOptions,
20507
20806
  value: rule.operator,
20508
20807
  onChange: handleOperator,
20509
20808
  disabled: readOnly
@@ -20526,7 +20825,7 @@ var init_BranchingLogicBuilder = __esm({
20526
20825
  {
20527
20826
  options: valueOptions.filter((o) => !chips.includes(o.value)),
20528
20827
  value: "",
20529
- placeholder: "Add value",
20828
+ placeholder: t("branchingLogic.addValue"),
20530
20829
  onChange: handleAddChip,
20531
20830
  disabled: readOnly
20532
20831
  }
@@ -20534,7 +20833,7 @@ var init_BranchingLogicBuilder = __esm({
20534
20833
  Input,
20535
20834
  {
20536
20835
  inputType: "text",
20537
- placeholder: "Type value, press Enter",
20836
+ placeholder: t("branchingLogic.typeValuePressEnter"),
20538
20837
  value: "",
20539
20838
  onKeyDown: (e) => {
20540
20839
  if (e.key !== "Enter") return;
@@ -20552,7 +20851,7 @@ var init_BranchingLogicBuilder = __esm({
20552
20851
  {
20553
20852
  options: valueOptions,
20554
20853
  value: scalarValue,
20555
- placeholder: "Select value",
20854
+ placeholder: t("branchingLogic.selectValue"),
20556
20855
  onChange: (e) => onChange({ ...rule, value: e.target.value }),
20557
20856
  disabled: readOnly
20558
20857
  }
@@ -20560,7 +20859,7 @@ var init_BranchingLogicBuilder = __esm({
20560
20859
  Input,
20561
20860
  {
20562
20861
  inputType: "text",
20563
- placeholder: "Value",
20862
+ placeholder: t("branchingLogic.value"),
20564
20863
  value: scalarValue,
20565
20864
  onChange: handleScalarValue,
20566
20865
  disabled: readOnly
@@ -20568,17 +20867,17 @@ var init_BranchingLogicBuilder = __esm({
20568
20867
  ) }),
20569
20868
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "label", weight: "semibold", className: "shrink-0 inline-flex items-center gap-1", children: [
20570
20869
  /* @__PURE__ */ jsxRuntime.jsx(LucideIcons2.ArrowRight, { className: "h-4 w-4" }),
20571
- "go to"
20870
+ t("branchingLogic.goTo")
20572
20871
  ] }),
20573
20872
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsxRuntime.jsx(
20574
20873
  Select,
20575
20874
  {
20576
20875
  options: targetOptions,
20577
20876
  value: rule.targetQuestionId,
20578
- placeholder: "Select target",
20877
+ placeholder: t("branchingLogic.selectTarget"),
20579
20878
  onChange: handleTarget,
20580
20879
  disabled: readOnly,
20581
- error: broken && rule.targetQuestionId !== END_OF_SURVEY ? "Broken reference" : void 0
20880
+ error: broken && rule.targetQuestionId !== END_OF_SURVEY ? t("branchingLogic.brokenReference") : void 0
20582
20881
  }
20583
20882
  ) }),
20584
20883
  !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
@@ -20590,11 +20889,11 @@ var init_BranchingLogicBuilder = __esm({
20590
20889
  action: "DELETE_RULE",
20591
20890
  actionPayload: { ruleId: rule.id },
20592
20891
  onClick: onDelete,
20593
- "aria-label": "Delete rule"
20892
+ "aria-label": t("branchingLogic.deleteRule")
20594
20893
  }
20595
20894
  )
20596
20895
  ] }),
20597
- 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") })
20598
20897
  ]
20599
20898
  }
20600
20899
  );
@@ -20604,10 +20903,12 @@ var init_BranchingLogicBuilder = __esm({
20604
20903
  NODE_GAP_Y = 80;
20605
20904
  PADDING = 32;
20606
20905
  LogicGraph = ({ questions, rules }) => {
20906
+ const { t } = useTranslate();
20907
+ const endOfSurveyLabel = t("branchingLogic.endOfSurvey");
20607
20908
  const layout = React97.useMemo(() => {
20608
20909
  const items = [
20609
20910
  ...questions.map((q) => ({ id: q.id, label: q.label, isEnd: false })),
20610
- { id: END_OF_SURVEY, label: "End of survey", isEnd: true }
20911
+ { id: END_OF_SURVEY, label: endOfSurveyLabel, isEnd: true }
20611
20912
  ];
20612
20913
  const positions = {};
20613
20914
  items.forEach((item, i) => {
@@ -20619,14 +20920,14 @@ var init_BranchingLogicBuilder = __esm({
20619
20920
  const width = NODE_WIDTH + PADDING * 2 + 220;
20620
20921
  const height = PADDING * 2 + items.length * (NODE_HEIGHT + NODE_GAP_Y);
20621
20922
  return { items, positions, width, height };
20622
- }, [questions]);
20923
+ }, [questions, endOfSurveyLabel]);
20623
20924
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "overflow-auto rounded-container border border-border bg-card p-2", children: /* @__PURE__ */ jsxRuntime.jsxs(
20624
20925
  "svg",
20625
20926
  {
20626
20927
  width: layout.width,
20627
20928
  height: layout.height,
20628
20929
  role: "img",
20629
- "aria-label": "Branching logic graph",
20930
+ "aria-label": t("branchingLogic.graphAriaLabel"),
20630
20931
  style: { display: "block" },
20631
20932
  children: [
20632
20933
  /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -20734,6 +21035,7 @@ var init_BranchingLogicBuilder = __esm({
20734
21035
  readOnly = false,
20735
21036
  className
20736
21037
  }) => {
21038
+ const { t } = useTranslate();
20737
21039
  const eventBus = useEventBus();
20738
21040
  const questions = Array.isArray(questionsProp) ? questionsProp : [];
20739
21041
  const rulesInitial = Array.isArray(rulesProp) ? rulesProp : [];
@@ -20786,16 +21088,23 @@ var init_BranchingLogicBuilder = __esm({
20786
21088
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-wrap items-center justify-between gap-2", children: [
20787
21089
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-2", children: [
20788
21090
  /* @__PURE__ */ jsxRuntime.jsx(LucideIcons2.GitBranch, { className: "h-5 w-5 text-foreground" }),
20789
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "subheading", weight: "semibold", children: "Branching logic" }),
21091
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "subheading", weight: "semibold", children: t("branchingLogic.title") }),
20790
21092
  /* @__PURE__ */ jsxRuntime.jsx(
20791
21093
  Badge,
20792
21094
  {
20793
21095
  variant: "neutral",
20794
21096
  size: "sm",
20795
- 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 })
20796
21098
  }
20797
21099
  ),
20798
- 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
+ )
20799
21108
  ] }),
20800
21109
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-1 rounded-sm border border-border bg-card p-0.5", children: [
20801
21110
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -20806,7 +21115,7 @@ var init_BranchingLogicBuilder = __esm({
20806
21115
  leftIcon: LucideIcons2.Pencil,
20807
21116
  action: "VIEW_EDIT",
20808
21117
  onClick: () => setView("edit"),
20809
- children: "Rules"
21118
+ children: t("branchingLogic.rules")
20810
21119
  }
20811
21120
  ),
20812
21121
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -20817,13 +21126,13 @@ var init_BranchingLogicBuilder = __esm({
20817
21126
  leftIcon: LucideIcons2.Eye,
20818
21127
  action: "VIEW_GRAPH",
20819
21128
  onClick: () => setView("graph"),
20820
- children: "Logic graph"
21129
+ children: t("branchingLogic.logicGraph")
20821
21130
  }
20822
21131
  )
20823
21132
  ] })
20824
21133
  ] }),
20825
21134
  view === "edit" ? /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-col gap-2", children: [
20826
- 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(
20827
21136
  RuleRow,
20828
21137
  {
20829
21138
  rule,
@@ -20844,7 +21153,7 @@ var init_BranchingLogicBuilder = __esm({
20844
21153
  action: "ADD_RULE",
20845
21154
  onClick: handleAddRule,
20846
21155
  disabled: noQuestions,
20847
- children: "Add rule"
21156
+ children: t("branchingLogic.addRule")
20848
21157
  }
20849
21158
  ) })
20850
21159
  ] }) : /* @__PURE__ */ jsxRuntime.jsx(LogicGraph, { questions, rules })
@@ -21471,7 +21780,7 @@ function CalendarGrid({
21471
21780
  onClick: stepPrev,
21472
21781
  "aria-disabled": !canPrev || void 0,
21473
21782
  "aria-label": t("aria.previousDays"),
21474
- children: "Prev"
21783
+ children: t("nav.previous")
21475
21784
  }
21476
21785
  ),
21477
21786
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground", children: formatDateRange(visibleDays[0], visibleDays[visibleDays.length - 1]) }),
@@ -21484,7 +21793,7 @@ function CalendarGrid({
21484
21793
  onClick: stepNext,
21485
21794
  "aria-disabled": !canNext || void 0,
21486
21795
  "aria-label": t("aria.nextDays"),
21487
- children: "Next"
21796
+ children: t("nav.next")
21488
21797
  }
21489
21798
  )
21490
21799
  ] }),
@@ -23034,7 +23343,7 @@ var init_Pagination = __esm({
23034
23343
  type: "number",
23035
23344
  value: jumpToPage,
23036
23345
  onChange: (e) => setJumpToPage(e.target.value),
23037
- placeholder: "Page",
23346
+ placeholder: t("pagination.jumpPlaceholder"),
23038
23347
  className: "w-20",
23039
23348
  onKeyDown: (e) => {
23040
23349
  if (e.key === "Enter") {
@@ -23172,13 +23481,10 @@ var init_CardGrid = __esm({
23172
23481
  return children;
23173
23482
  }
23174
23483
  if (isLoading) {
23175
- 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") }) });
23176
23485
  }
23177
23486
  if (error) {
23178
- 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: [
23179
- "Error loading items: ",
23180
- error.message
23181
- ] }) });
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 }) }) });
23182
23488
  }
23183
23489
  if (normalizedData.length === 0) {
23184
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" }) });
@@ -27044,7 +27350,7 @@ function DataGrid({
27044
27350
  onChange: () => toggleSelection(id),
27045
27351
  onClick: (e) => e.stopPropagation(),
27046
27352
  className: "w-4 h-4 mt-1 flex-shrink-0 accent-primary",
27047
- "aria-label": `Select ${titleValue !== void 0 ? String(titleValue) : "item"}`
27353
+ "aria-label": t("card.selectItem", { item: titleValue !== void 0 ? String(titleValue) : t("card.itemFallback") })
27048
27354
  }
27049
27355
  ),
27050
27356
  /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "xs", className: "flex-1 min-w-0", children: [
@@ -27242,7 +27548,7 @@ function formatDate3(value) {
27242
27548
  if (isNaN(d.getTime())) return String(value);
27243
27549
  return d.toLocaleDateString(void 0, { year: "numeric", month: "short", day: "numeric" });
27244
27550
  }
27245
- function formatValue2(value, format) {
27551
+ function formatValue2(value, format, boolLabels) {
27246
27552
  if (value === void 0 || value === null) return "";
27247
27553
  switch (format) {
27248
27554
  case "date":
@@ -27254,7 +27560,7 @@ function formatValue2(value, format) {
27254
27560
  case "percent":
27255
27561
  return typeof value === "number" ? `${Math.round(value)}%` : String(value);
27256
27562
  case "boolean":
27257
- return value ? "Yes" : "No";
27563
+ return value ? boolLabels?.yes ?? "Yes" : boolLabels?.no ?? "No";
27258
27564
  default:
27259
27565
  return String(value);
27260
27566
  }
@@ -27550,7 +27856,7 @@ function DataList({
27550
27856
  field.label ?? fieldLabel3(field.name),
27551
27857
  ":"
27552
27858
  ] }),
27553
- /* @__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") }) })
27554
27860
  ] }, field.name);
27555
27861
  }) }),
27556
27862
  progressFields.map((field) => {
@@ -27680,6 +27986,7 @@ var init_FileTree = __esm({
27680
27986
  init_Box();
27681
27987
  init_Typography();
27682
27988
  init_Icon();
27989
+ init_useTranslate();
27683
27990
  TreeNodeItem = ({
27684
27991
  node,
27685
27992
  depth,
@@ -27765,8 +28072,9 @@ var init_FileTree = __esm({
27765
28072
  className,
27766
28073
  indent = 16
27767
28074
  }) => {
28075
+ const { t } = useTranslate();
27768
28076
  if (tree.length === 0) {
27769
- 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") }) });
27770
28078
  }
27771
28079
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `py-1 overflow-y-auto ${className ?? ""}`, role: "tree", children: tree.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
27772
28080
  TreeNodeItem,
@@ -27885,6 +28193,7 @@ var init_FilterGroup = __esm({
27885
28193
  init_Icon();
27886
28194
  init_useEventBus();
27887
28195
  init_useQuerySingleton();
28196
+ init_useTranslate();
27888
28197
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
27889
28198
  lookStyles6 = {
27890
28199
  toolbar: "",
@@ -27905,6 +28214,7 @@ var init_FilterGroup = __esm({
27905
28214
  isLoading,
27906
28215
  look = "toolbar"
27907
28216
  }) => {
28217
+ const { t } = useTranslate();
27908
28218
  const eventBus = useEventBus();
27909
28219
  const queryState = useQuerySingleton(query);
27910
28220
  const [selectedValues, setSelectedValues] = React97.useState(
@@ -27986,7 +28296,7 @@ var init_FilterGroup = __esm({
27986
28296
  "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
27987
28297
  !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
27988
28298
  ),
27989
- children: "All"
28299
+ children: t("filterGroup.all")
27990
28300
  }
27991
28301
  ),
27992
28302
  filter.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -28014,7 +28324,7 @@ var init_FilterGroup = __esm({
28014
28324
  size: "sm",
28015
28325
  onClick: handleClearAll,
28016
28326
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
28017
- children: "Clear"
28327
+ children: t("filterGroup.clear")
28018
28328
  }
28019
28329
  )
28020
28330
  ]
@@ -28025,7 +28335,7 @@ var init_FilterGroup = __esm({
28025
28335
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", lookStyles6[look], className), children: [
28026
28336
  showIcon && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
28027
28337
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4" }),
28028
- /* @__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") })
28029
28339
  ] }),
28030
28340
  filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
28031
28341
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-xs font-bold text-muted-foreground uppercase tracking-wide", children: filter.label }),
@@ -28048,7 +28358,7 @@ var init_FilterGroup = __esm({
28048
28358
  `${filter.field}_from`,
28049
28359
  e.target.value || null
28050
28360
  ),
28051
- placeholder: "From",
28361
+ placeholder: t("filterGroup.from"),
28052
28362
  clearable: true,
28053
28363
  onClear: () => handleFilterSelect(`${filter.field}_from`, null)
28054
28364
  }
@@ -28062,7 +28372,7 @@ var init_FilterGroup = __esm({
28062
28372
  `${filter.field}_to`,
28063
28373
  e.target.value || null
28064
28374
  ),
28065
- placeholder: "To",
28375
+ placeholder: t("filterGroup.to"),
28066
28376
  clearable: true,
28067
28377
  onClear: () => handleFilterSelect(`${filter.field}_to`, null)
28068
28378
  }
@@ -28082,7 +28392,7 @@ var init_FilterGroup = __esm({
28082
28392
  value: selectedValues[filter.field] || "all",
28083
28393
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
28084
28394
  options: [
28085
- { value: "all", label: "All" },
28395
+ { value: "all", label: t("filterGroup.all") },
28086
28396
  ...filter.options?.map((opt) => ({
28087
28397
  value: opt,
28088
28398
  label: opt
@@ -28099,7 +28409,7 @@ var init_FilterGroup = __esm({
28099
28409
  onClick: handleClearAll,
28100
28410
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
28101
28411
  className: "self-start",
28102
- children: "Clear all"
28412
+ children: t("filterGroup.clearAll")
28103
28413
  }
28104
28414
  )
28105
28415
  ] });
@@ -28165,7 +28475,7 @@ var init_FilterGroup = __esm({
28165
28475
  value: selectedValues[filter.field] || "all",
28166
28476
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
28167
28477
  options: [
28168
- { value: "all", label: `All ${filter.label}` },
28478
+ { value: "all", label: t("filterGroup.allOf", { label: filter.label }) },
28169
28479
  ...filter.options?.map((opt) => ({
28170
28480
  value: opt,
28171
28481
  label: opt
@@ -28194,7 +28504,7 @@ var init_FilterGroup = __esm({
28194
28504
  field
28195
28505
  );
28196
28506
  }),
28197
- /* @__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") })
28198
28508
  ] })
28199
28509
  ]
28200
28510
  }
@@ -28219,7 +28529,7 @@ var init_FilterGroup = __esm({
28219
28529
  className: "text-muted-foreground",
28220
28530
  children: [
28221
28531
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4" }),
28222
- /* @__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") })
28223
28533
  ]
28224
28534
  }
28225
28535
  ),
@@ -28245,7 +28555,7 @@ var init_FilterGroup = __esm({
28245
28555
  `${filter.field}_from`,
28246
28556
  e.target.value || null
28247
28557
  ),
28248
- placeholder: "From",
28558
+ placeholder: t("filterGroup.from"),
28249
28559
  clearable: true,
28250
28560
  onClear: () => handleFilterSelect(`${filter.field}_from`, null),
28251
28561
  className: "min-w-[130px]"
@@ -28261,7 +28571,7 @@ var init_FilterGroup = __esm({
28261
28571
  `${filter.field}_to`,
28262
28572
  e.target.value || null
28263
28573
  ),
28264
- placeholder: "To",
28574
+ placeholder: t("filterGroup.to"),
28265
28575
  clearable: true,
28266
28576
  onClear: () => handleFilterSelect(`${filter.field}_to`, null),
28267
28577
  className: "min-w-[130px]"
@@ -28283,7 +28593,7 @@ var init_FilterGroup = __esm({
28283
28593
  value: selectedValues[filter.field] || "all",
28284
28594
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
28285
28595
  options: [
28286
- { value: "all", label: "All" },
28596
+ { value: "all", label: t("filterGroup.all") },
28287
28597
  ...filter.options?.map((opt) => ({
28288
28598
  value: opt,
28289
28599
  label: opt
@@ -28294,10 +28604,7 @@ var init_FilterGroup = __esm({
28294
28604
  )
28295
28605
  ] }, filter.field)),
28296
28606
  activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: "ml-auto", children: [
28297
- /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "primary", size: "md", children: [
28298
- activeFilterCount,
28299
- " active"
28300
- ] }),
28607
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "md", children: t("filterGroup.activeCount", { count: activeFilterCount }) }),
28301
28608
  /* @__PURE__ */ jsxRuntime.jsx(
28302
28609
  Button,
28303
28610
  {
@@ -28305,7 +28612,7 @@ var init_FilterGroup = __esm({
28305
28612
  size: "sm",
28306
28613
  onClick: handleClearAll,
28307
28614
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
28308
- children: "Clear all"
28615
+ children: t("filterGroup.clearAll")
28309
28616
  }
28310
28617
  )
28311
28618
  ] })
@@ -29249,19 +29556,20 @@ var init_RepeatableFormSection = __esm({
29249
29556
  RepeatableFormSection.displayName = "RepeatableFormSection";
29250
29557
  }
29251
29558
  });
29252
- var actionTypeLabels, actionTypeIcons, ViolationAlert;
29559
+ var actionTypeLabelKeys, actionTypeIcons, ViolationAlert;
29253
29560
  var init_ViolationAlert = __esm({
29254
29561
  "components/core/molecules/ViolationAlert.tsx"() {
29255
29562
  init_cn();
29563
+ init_useTranslate();
29256
29564
  init_Box();
29257
29565
  init_Stack();
29258
29566
  init_Typography();
29259
29567
  init_Button();
29260
29568
  init_Icon();
29261
- actionTypeLabels = {
29262
- measure: "Corrective Measure",
29263
- admin: "Administrative Action",
29264
- penalty: "Penalty Proceedings"
29569
+ actionTypeLabelKeys = {
29570
+ measure: "violationAlert.actionType.measure",
29571
+ admin: "violationAlert.actionType.admin",
29572
+ penalty: "violationAlert.actionType.penalty"
29265
29573
  };
29266
29574
  actionTypeIcons = {
29267
29575
  measure: "alert-triangle",
@@ -29278,10 +29586,11 @@ var init_ViolationAlert = __esm({
29278
29586
  className,
29279
29587
  ...flatProps
29280
29588
  }) => {
29589
+ const { t } = useTranslate();
29281
29590
  const resolvedViolation = violation ?? {
29282
29591
  law: "",
29283
29592
  article: "",
29284
- message: flatProps.message ?? "Violation",
29593
+ message: flatProps.message ?? t("violationAlert.fallbackMessage"),
29285
29594
  actionType: "measure"
29286
29595
  };
29287
29596
  const effectiveSeverity = severity ?? (resolvedViolation.actionType === "measure" ? "warning" : "error");
@@ -29366,7 +29675,7 @@ var init_ViolationAlert = __esm({
29366
29675
  {
29367
29676
  variant: "caption",
29368
29677
  className: cn(textColor, "opacity-75"),
29369
- children: actionTypeLabels[resolvedViolation.actionType]
29678
+ children: t(actionTypeLabelKeys[resolvedViolation.actionType])
29370
29679
  }
29371
29680
  )
29372
29681
  ] })
@@ -29397,7 +29706,7 @@ var init_ViolationAlert = __esm({
29397
29706
  {
29398
29707
  variant: "caption",
29399
29708
  className: cn(textColor, "opacity-75"),
29400
- children: "Admin:"
29709
+ children: t("violationAlert.adminLabel")
29401
29710
  }
29402
29711
  ),
29403
29712
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -29416,7 +29725,7 @@ var init_ViolationAlert = __esm({
29416
29725
  {
29417
29726
  variant: "caption",
29418
29727
  className: cn(textColor, "opacity-75"),
29419
- children: "Penalty:"
29728
+ children: t("violationAlert.penaltyLabel")
29420
29729
  }
29421
29730
  ),
29422
29731
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -29441,7 +29750,7 @@ var init_ViolationAlert = __esm({
29441
29750
  className: cn(textColor, "self-start"),
29442
29751
  children: [
29443
29752
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "arrow-right", size: "sm", className: "mr-1" }),
29444
- "Go to field"
29753
+ t("violationAlert.goToField")
29445
29754
  ]
29446
29755
  }
29447
29756
  )
@@ -29757,6 +30066,7 @@ var init_LineChart = __esm({
29757
30066
  "use client";
29758
30067
  init_cn();
29759
30068
  init_atoms2();
30069
+ init_useTranslate();
29760
30070
  LineChart2 = ({
29761
30071
  data,
29762
30072
  width = 400,
@@ -29768,6 +30078,7 @@ var init_LineChart = __esm({
29768
30078
  areaColor = "var(--color-primary)",
29769
30079
  className
29770
30080
  }) => {
30081
+ const { t } = useTranslate();
29771
30082
  const gradientId = React97.useId();
29772
30083
  const safeData = data ?? [];
29773
30084
  const sortedData = React97.useMemo(() => {
@@ -29804,7 +30115,7 @@ var init_LineChart = __esm({
29804
30115
  return `${linePath} L ${last.x} ${bottom} L ${first.x} ${bottom} Z`;
29805
30116
  }, [linePath, points, height, showArea]);
29806
30117
  if (safeData.length === 0) {
29807
- 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") });
29808
30119
  }
29809
30120
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn(className), children: /* @__PURE__ */ jsxRuntime.jsxs(
29810
30121
  "svg",
@@ -31711,6 +32022,7 @@ var init_GraphView = __esm({
31711
32022
  "use client";
31712
32023
  init_cn();
31713
32024
  init_atoms2();
32025
+ init_useTranslate();
31714
32026
  GROUP_COLORS = [
31715
32027
  "#3b82f6",
31716
32028
  // blue-500
@@ -31743,6 +32055,7 @@ var init_GraphView = __esm({
31743
32055
  showLabels = true,
31744
32056
  zoomToFit = true
31745
32057
  }) => {
32058
+ const { t } = useTranslate();
31746
32059
  const containerRef = React97.useRef(null);
31747
32060
  const animRef = React97.useRef(0);
31748
32061
  const [simNodes, setSimNodes] = React97.useState([]);
@@ -31920,7 +32233,7 @@ var init_GraphView = __esm({
31920
32233
  [onNodeClick]
31921
32234
  );
31922
32235
  if (nodes.length === 0) {
31923
- 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") }) });
31924
32237
  }
31925
32238
  return /* @__PURE__ */ jsxRuntime.jsx(
31926
32239
  Box,
@@ -32376,11 +32689,12 @@ var init_UploadDropZone = __esm({
32376
32689
  init_Icon();
32377
32690
  init_Typography();
32378
32691
  init_useEventBus();
32692
+ init_useTranslate();
32379
32693
  UploadDropZone = ({
32380
32694
  accept,
32381
32695
  maxSize,
32382
32696
  maxFiles = 1,
32383
- label = "Drop files here or click to browse",
32697
+ label,
32384
32698
  description,
32385
32699
  disabled = false,
32386
32700
  action,
@@ -32388,22 +32702,24 @@ var init_UploadDropZone = __esm({
32388
32702
  onFiles,
32389
32703
  className
32390
32704
  }) => {
32705
+ const { t } = useTranslate();
32706
+ const resolvedLabel = label ?? t("upload.dropOrBrowse");
32391
32707
  const [isDragOver, setIsDragOver] = React97.useState(false);
32392
32708
  const [error, setError] = React97.useState(null);
32393
32709
  const inputRef = React97.useRef(null);
32394
32710
  const eventBus = useSafeEventBus7();
32395
32711
  const defaultDescription = [
32396
- accept ? `Accepted: ${accept}` : null,
32397
- maxSize ? `Max size: ${formatFileSize(maxSize)}` : null,
32398
- 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
32399
32715
  ].filter(Boolean).join(". ");
32400
32716
  const validateFiles = React97.useCallback(
32401
32717
  (files) => {
32402
32718
  if (files.length > maxFiles) {
32403
- return { valid: [], error: `Maximum ${maxFiles} file${maxFiles > 1 ? "s" : ""} allowed` };
32719
+ return { valid: [], error: t("upload.error.maxFiles", { count: maxFiles }) };
32404
32720
  }
32405
32721
  if (accept) {
32406
- const acceptedTypes = accept.split(",").map((t) => t.trim());
32722
+ const acceptedTypes = accept.split(",").map((s) => s.trim());
32407
32723
  const invalid = files.filter((file) => {
32408
32724
  return !acceptedTypes.some((type) => {
32409
32725
  if (type.endsWith("/*")) {
@@ -32413,7 +32729,7 @@ var init_UploadDropZone = __esm({
32413
32729
  });
32414
32730
  });
32415
32731
  if (invalid.length > 0) {
32416
- return { valid: [], error: `Invalid file type: ${invalid[0].name}` };
32732
+ return { valid: [], error: t("upload.error.invalidType", { name: invalid[0].name }) };
32417
32733
  }
32418
32734
  }
32419
32735
  if (maxSize) {
@@ -32421,13 +32737,13 @@ var init_UploadDropZone = __esm({
32421
32737
  if (tooLarge.length > 0) {
32422
32738
  return {
32423
32739
  valid: [],
32424
- error: `File too large: ${tooLarge[0].name} (max ${formatFileSize(maxSize)})`
32740
+ error: t("upload.error.tooLarge", { name: tooLarge[0].name, size: formatFileSize(maxSize) })
32425
32741
  };
32426
32742
  }
32427
32743
  }
32428
32744
  return { valid: files, error: null };
32429
32745
  },
32430
- [accept, maxSize, maxFiles]
32746
+ [accept, maxSize, maxFiles, t]
32431
32747
  );
32432
32748
  const handleFiles = React97.useCallback(
32433
32749
  (files) => {
@@ -32498,7 +32814,7 @@ var init_UploadDropZone = __esm({
32498
32814
  handleClick();
32499
32815
  }
32500
32816
  },
32501
- "aria-label": label,
32817
+ "aria-label": resolvedLabel,
32502
32818
  children: [
32503
32819
  /* @__PURE__ */ jsxRuntime.jsx(
32504
32820
  "input",
@@ -32514,7 +32830,7 @@ var init_UploadDropZone = __esm({
32514
32830
  }
32515
32831
  ),
32516
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" }),
32517
- /* @__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 }),
32518
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 })
32519
32835
  ]
32520
32836
  }
@@ -32936,7 +33252,7 @@ function TableView({
32936
33252
  {
32937
33253
  checked: selected.has(id),
32938
33254
  onChange: () => toggleRow(id),
32939
- "aria-label": `Select row ${id}`
33255
+ "aria-label": t("table.selectRow", { id })
32940
33256
  }
32941
33257
  ) }),
32942
33258
  hasRenderProp ? /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex-1 min-w-0", children: children(row, index) }) : colDefs.map((col) => {
@@ -35783,7 +36099,7 @@ var init_QrScanner = __esm({
35783
36099
  className: "inset-0 flex-col items-center justify-center gap-2 bg-black bg-opacity-80 text-center",
35784
36100
  children: [
35785
36101
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "camera", className: "h-8 w-8 text-white", "aria-hidden": "true" }),
35786
- /* @__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") }),
35787
36103
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", className: "text-white opacity-70", children: cameraError.message })
35788
36104
  ]
35789
36105
  }
@@ -35794,7 +36110,7 @@ var init_QrScanner = __esm({
35794
36110
  position: "absolute",
35795
36111
  display: "flex",
35796
36112
  className: "inset-0 items-center justify-center bg-black bg-opacity-60",
35797
- 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") })
35798
36114
  }
35799
36115
  ),
35800
36116
  showCameraControls && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -35813,7 +36129,7 @@ var init_QrScanner = __esm({
35813
36129
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
35814
36130
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
35815
36131
  ),
35816
- "aria-label": isPaused ? "Resume scanning" : "Pause scanning",
36132
+ "aria-label": isPaused ? t("qrScanner.resumeScanning") : t("qrScanner.pauseScanning"),
35817
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" })
35818
36134
  }
35819
36135
  ),
@@ -35826,7 +36142,7 @@ var init_QrScanner = __esm({
35826
36142
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
35827
36143
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
35828
36144
  ),
35829
- "aria-label": `Switch to ${currentFacing === "environment" ? "front" : "rear"} camera`,
36145
+ "aria-label": currentFacing === "environment" ? t("qrScanner.switchToFrontCamera") : t("qrScanner.switchToRearCamera"),
35830
36146
  children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "refresh-cw", className: "h-4 w-4" })
35831
36147
  }
35832
36148
  ),
@@ -35840,7 +36156,7 @@ var init_QrScanner = __esm({
35840
36156
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
35841
36157
  ),
35842
36158
  "aria-label": t("aria.mockScanDev"),
35843
- children: "Mock Scan"
36159
+ children: t("qrScanner.mockScan")
35844
36160
  }
35845
36161
  )
35846
36162
  ]
@@ -35858,6 +36174,7 @@ var init_OptionConstraintGroup = __esm({
35858
36174
  "components/core/molecules/OptionConstraintGroup.tsx"() {
35859
36175
  init_cn();
35860
36176
  init_useEventBus();
36177
+ init_useTranslate();
35861
36178
  init_Typography();
35862
36179
  init_Box();
35863
36180
  init_Label();
@@ -35867,36 +36184,36 @@ var init_OptionConstraintGroup = __esm({
35867
36184
  const sign = delta >= 0 ? "+" : "-";
35868
36185
  return `${sign}$${Math.abs(delta).toFixed(2)}`;
35869
36186
  };
35870
- constraintHint = (constraint) => {
36187
+ constraintHint = (constraint, t) => {
35871
36188
  if (constraint.type === "single") {
35872
- return constraint.required ? "Required, pick 1" : "Optional, pick up to 1";
36189
+ return constraint.required ? t("optionConstraint.requiredOne") : t("optionConstraint.optionalOne");
35873
36190
  }
35874
36191
  const { min, max } = constraint;
35875
36192
  if (min && max) {
35876
- return min === max ? `Pick exactly ${min}` : `Pick ${min}-${max}`;
36193
+ return min === max ? t("optionConstraint.pickExactly", { count: min }) : t("optionConstraint.pickRange", { min, max });
35877
36194
  }
35878
- if (min) return `Pick at least ${min}`;
35879
- if (max) return `Pick up to ${max}`;
35880
- 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");
35881
36198
  };
35882
- validateSelection = (selected, constraint) => {
36199
+ validateSelection = (selected, constraint, t) => {
35883
36200
  if (constraint.type === "single") {
35884
36201
  if (constraint.required && selected.length === 0) {
35885
- return "Pick 1 option";
36202
+ return t("optionConstraint.error.pickOne");
35886
36203
  }
35887
36204
  if (selected.length > 1) {
35888
- return "Pick only 1 option";
36205
+ return t("optionConstraint.error.pickOnlyOne");
35889
36206
  }
35890
36207
  return void 0;
35891
36208
  }
35892
36209
  const { min, max } = constraint;
35893
36210
  if (min !== void 0 && selected.length < min) {
35894
36211
  const remaining = min - selected.length;
35895
- return `Pick at least ${remaining} more`;
36212
+ return t("optionConstraint.error.pickMore", { count: remaining });
35896
36213
  }
35897
36214
  if (max !== void 0 && selected.length > max) {
35898
36215
  const excess = selected.length - max;
35899
- return `Remove ${excess} option${excess === 1 ? "" : "s"}`;
36216
+ return t("optionConstraint.error.removeOptions", { count: excess });
35900
36217
  }
35901
36218
  return void 0;
35902
36219
  };
@@ -35913,8 +36230,9 @@ var init_OptionConstraintGroup = __esm({
35913
36230
  className
35914
36231
  }) => {
35915
36232
  const eventBus = useEventBus();
35916
- const hint = constraintHint(constraint);
35917
- const error = validateSelection(selected, constraint);
36233
+ const { t } = useTranslate();
36234
+ const hint = constraintHint(constraint, t);
36235
+ const error = validateSelection(selected, constraint, t);
35918
36236
  const inputName = `option-${groupId}`;
35919
36237
  const labelTextSize = size === "sm" ? "text-sm" : "text-base";
35920
36238
  const optionGap = size === "sm" ? "gap-2" : "gap-2.5";
@@ -36014,7 +36332,7 @@ var init_OptionConstraintGroup = __esm({
36014
36332
  variant: "caption",
36015
36333
  color: "warning",
36016
36334
  className: "rounded border border-warning/40 px-1.5 py-0.5",
36017
- children: "Out of stock"
36335
+ children: t("optionConstraint.outOfStock")
36018
36336
  }
36019
36337
  )
36020
36338
  ]
@@ -36336,6 +36654,7 @@ function changeBlockType(block, type) {
36336
36654
  return { id: block.id, type, content: seed };
36337
36655
  }
36338
36656
  function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36657
+ const { t } = useTranslate();
36339
36658
  const [open, setOpen] = React97.useState(false);
36340
36659
  const ref = React97.useRef(null);
36341
36660
  React97.useEffect(() => {
@@ -36355,7 +36674,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36355
36674
  {
36356
36675
  type: "button",
36357
36676
  variant: "ghost",
36358
- "aria-label": "Block actions",
36677
+ "aria-label": t("richBlockEditor.blockActions"),
36359
36678
  className: cn(
36360
36679
  "inline-flex items-center justify-center",
36361
36680
  "h-6 w-6 rounded-sm p-0 gap-0",
@@ -36377,7 +36696,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36377
36696
  "py-1 text-sm"
36378
36697
  ),
36379
36698
  children: [
36380
- /* @__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]) }),
36381
36700
  /* @__PURE__ */ jsxRuntime.jsxs(
36382
36701
  Button,
36383
36702
  {
@@ -36391,7 +36710,8 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36391
36710
  },
36392
36711
  children: [
36393
36712
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", className: "w-3.5 h-3.5" }),
36394
- " Duplicate"
36713
+ " ",
36714
+ t("richBlockEditor.duplicate")
36395
36715
  ]
36396
36716
  }
36397
36717
  ),
@@ -36408,14 +36728,15 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36408
36728
  },
36409
36729
  children: [
36410
36730
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "trash", className: "w-3.5 h-3.5" }),
36411
- " Delete"
36731
+ " ",
36732
+ t("common.delete")
36412
36733
  ]
36413
36734
  }
36414
36735
  ),
36415
36736
  CHANGEABLE_TYPES.includes(block.type) && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
36416
36737
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "my-1 border-t border-border" }),
36417
- /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: "Turn into" }),
36418
- 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(
36419
36740
  Button,
36420
36741
  {
36421
36742
  type: "button",
@@ -36423,12 +36744,12 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36423
36744
  role: "menuitem",
36424
36745
  className: "flex w-full items-center gap-2 px-2 py-1.5 text-left justify-start rounded-none",
36425
36746
  onClick: () => {
36426
- onChangeType(t);
36747
+ onChangeType(bt);
36427
36748
  setOpen(false);
36428
36749
  },
36429
- children: BLOCK_TYPE_LABEL[t]
36750
+ children: t(BLOCK_TYPE_LABEL_KEY[bt])
36430
36751
  },
36431
- t
36752
+ bt
36432
36753
  ))
36433
36754
  ] })
36434
36755
  ]
@@ -36490,6 +36811,7 @@ function BlockRow({
36490
36811
  onInsertAfter,
36491
36812
  onChangeType
36492
36813
  }) {
36814
+ const { t } = useTranslate();
36493
36815
  const setContent = React97.useCallback(
36494
36816
  (next) => onUpdate((b) => ({ ...b, content: next })),
36495
36817
  [onUpdate]
@@ -36539,8 +36861,8 @@ function BlockRow({
36539
36861
  tag: "h1",
36540
36862
  value: block.content ?? "",
36541
36863
  readOnly,
36542
- placeholder: placeholder ?? "Heading 1",
36543
- ariaLabel: "Heading 1 block",
36864
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading1"),
36865
+ ariaLabel: t("richBlockEditor.aria.heading1Block"),
36544
36866
  className: "text-3xl font-bold leading-tight",
36545
36867
  onValueChange: setContent
36546
36868
  }
@@ -36552,8 +36874,8 @@ function BlockRow({
36552
36874
  tag: "h2",
36553
36875
  value: block.content ?? "",
36554
36876
  readOnly,
36555
- placeholder: placeholder ?? "Heading 2",
36556
- ariaLabel: "Heading 2 block",
36877
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading2"),
36878
+ ariaLabel: t("richBlockEditor.aria.heading2Block"),
36557
36879
  className: "text-2xl font-semibold leading-tight",
36558
36880
  onValueChange: setContent
36559
36881
  }
@@ -36565,8 +36887,8 @@ function BlockRow({
36565
36887
  tag: "h3",
36566
36888
  value: block.content ?? "",
36567
36889
  readOnly,
36568
- placeholder: placeholder ?? "Heading 3",
36569
- ariaLabel: "Heading 3 block",
36890
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading3"),
36891
+ ariaLabel: t("richBlockEditor.aria.heading3Block"),
36570
36892
  className: "text-xl font-semibold leading-tight",
36571
36893
  onValueChange: setContent
36572
36894
  }
@@ -36578,8 +36900,8 @@ function BlockRow({
36578
36900
  tag: "blockquote",
36579
36901
  value: block.content ?? "",
36580
36902
  readOnly,
36581
- placeholder: placeholder ?? "Quote",
36582
- ariaLabel: "Quote block",
36903
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.quote"),
36904
+ ariaLabel: t("richBlockEditor.aria.quoteBlock"),
36583
36905
  className: "border-l-4 border-primary/60 pl-4 italic text-muted-foreground",
36584
36906
  onValueChange: setContent
36585
36907
  }
@@ -36587,13 +36909,13 @@ function BlockRow({
36587
36909
  case "code":
36588
36910
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "rounded-md border border-border bg-muted/40", children: [
36589
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: [
36590
- /* @__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") }),
36591
36913
  !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
36592
36914
  Input,
36593
36915
  {
36594
36916
  inputType: "text",
36595
36917
  value: String(block.metadata?.language ?? "plaintext"),
36596
- "aria-label": "Code language",
36918
+ "aria-label": t("richBlockEditor.aria.codeLanguage"),
36597
36919
  className: cn(
36598
36920
  "h-6 w-32 rounded-sm border border-border bg-background",
36599
36921
  "px-2 text-xs outline-none focus:ring-1 focus:ring-ring"
@@ -36609,8 +36931,8 @@ function BlockRow({
36609
36931
  tag: "pre",
36610
36932
  value: block.content ?? "",
36611
36933
  readOnly,
36612
- placeholder: placeholder ?? "Enter code",
36613
- ariaLabel: "Code block",
36934
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.code"),
36935
+ ariaLabel: t("richBlockEditor.aria.codeBlock"),
36614
36936
  className: "block whitespace-pre-wrap p-3 font-mono text-sm leading-relaxed",
36615
36937
  onValueChange: setContent
36616
36938
  }
@@ -36623,7 +36945,7 @@ function BlockRow({
36623
36945
  const caption = String(block.metadata?.caption ?? "");
36624
36946
  const imgProps = {
36625
36947
  src: url,
36626
- alt: caption || "Embedded image",
36948
+ alt: caption || t("richBlockEditor.embeddedImage"),
36627
36949
  className: "max-h-96 w-full rounded-md border border-border object-contain"
36628
36950
  };
36629
36951
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "space-y-2", children: [
@@ -36637,7 +36959,8 @@ function BlockRow({
36637
36959
  ),
36638
36960
  children: [
36639
36961
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "image", className: "mr-2 w-4 h-4" }),
36640
- " No image URL set"
36962
+ " ",
36963
+ t("richBlockEditor.noImageUrl")
36641
36964
  ]
36642
36965
  }
36643
36966
  ),
@@ -36648,7 +36971,7 @@ function BlockRow({
36648
36971
  inputType: "url",
36649
36972
  value: url,
36650
36973
  placeholder: "https://example.com/image.png",
36651
- "aria-label": "Image URL",
36974
+ "aria-label": t("richBlockEditor.aria.imageUrl"),
36652
36975
  className: cn(
36653
36976
  "h-8 flex-1 rounded-sm border border-border bg-background",
36654
36977
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -36661,8 +36984,8 @@ function BlockRow({
36661
36984
  {
36662
36985
  inputType: "text",
36663
36986
  value: caption,
36664
- placeholder: "Caption (optional)",
36665
- "aria-label": "Image caption",
36987
+ placeholder: t("richBlockEditor.placeholder.caption"),
36988
+ "aria-label": t("richBlockEditor.aria.imageCaption"),
36666
36989
  className: cn(
36667
36990
  "h-8 flex-1 rounded-sm border border-border bg-background",
36668
36991
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -36693,8 +37016,8 @@ function BlockRow({
36693
37016
  tag: "span",
36694
37017
  value: child.content ?? "",
36695
37018
  readOnly,
36696
- placeholder: "List item",
36697
- ariaLabel: "List item",
37019
+ placeholder: t("richBlockEditor.placeholder.listItem"),
37020
+ ariaLabel: t("richBlockEditor.aria.listItem"),
36698
37021
  className: "inline-block min-w-[1ch] flex-1",
36699
37022
  onValueChange: (next) => setChildContent(child.id, next)
36700
37023
  }
@@ -36704,7 +37027,7 @@ function BlockRow({
36704
37027
  {
36705
37028
  type: "button",
36706
37029
  variant: "ghost",
36707
- "aria-label": "Remove list item",
37030
+ "aria-label": t("richBlockEditor.aria.removeListItem"),
36708
37031
  className: cn(
36709
37032
  "h-5 w-5 shrink-0 rounded-sm text-muted-foreground p-0 gap-0",
36710
37033
  "opacity-0 group-hover/item:opacity-100 hover:bg-muted hover:text-foreground"
@@ -36726,7 +37049,8 @@ function BlockRow({
36726
37049
  onClick: addListItem,
36727
37050
  children: [
36728
37051
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", className: "w-3 h-3" }),
36729
- " Add item"
37052
+ " ",
37053
+ t("richBlockEditor.addItem")
36730
37054
  ]
36731
37055
  }
36732
37056
  ) })
@@ -36742,8 +37066,8 @@ function BlockRow({
36742
37066
  tag: "p",
36743
37067
  value: block.content ?? "",
36744
37068
  readOnly,
36745
- placeholder: placeholder ?? "Start writing...",
36746
- ariaLabel: "Paragraph block",
37069
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.paragraph"),
37070
+ ariaLabel: t("richBlockEditor.aria.paragraphBlock"),
36747
37071
  className: "leading-7",
36748
37072
  onValueChange: setContent
36749
37073
  }
@@ -36766,7 +37090,7 @@ function BlockRow({
36766
37090
  {
36767
37091
  type: "button",
36768
37092
  variant: "ghost",
36769
- "aria-label": "Insert paragraph below",
37093
+ "aria-label": t("richBlockEditor.insertParagraphBelow"),
36770
37094
  className: cn(
36771
37095
  "inline-flex h-6 w-6 items-center justify-center rounded-sm p-0 gap-0",
36772
37096
  "text-muted-foreground hover:bg-muted hover:text-foreground",
@@ -36793,7 +37117,7 @@ function BlockRow({
36793
37117
  }
36794
37118
  );
36795
37119
  }
36796
- 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;
36797
37121
  var init_RichBlockEditor = __esm({
36798
37122
  "components/core/molecules/RichBlockEditor.tsx"() {
36799
37123
  "use client";
@@ -36806,29 +37130,30 @@ var init_RichBlockEditor = __esm({
36806
37130
  init_Input();
36807
37131
  init_Icon();
36808
37132
  init_useEventBus();
37133
+ init_useTranslate();
36809
37134
  TOOLBAR_ENTRIES = [
36810
- { type: "paragraph", label: "Text", icon: LucideIcons2.Type },
36811
- { type: "heading-1", label: "H1", icon: LucideIcons2.Heading1 },
36812
- { type: "heading-2", label: "H2", icon: LucideIcons2.Heading2 },
36813
- { type: "heading-3", label: "H3", icon: LucideIcons2.Heading3 },
36814
- { type: "bullet-list", label: "Bullet list", icon: LucideIcons2.List },
36815
- { type: "numbered-list", label: "Numbered", icon: LucideIcons2.ListOrdered },
36816
- { type: "quote", label: "Quote", icon: LucideIcons2.Quote },
36817
- { type: "code", label: "Code", icon: LucideIcons2.Code },
36818
- { type: "divider", label: "Divider", icon: LucideIcons2.Minus },
36819
- { 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 }
36820
37145
  ];
36821
- BLOCK_TYPE_LABEL = {
36822
- paragraph: "Text",
36823
- "heading-1": "Heading 1",
36824
- "heading-2": "Heading 2",
36825
- "heading-3": "Heading 3",
36826
- "bullet-list": "Bullet list",
36827
- "numbered-list": "Numbered list",
36828
- quote: "Quote",
36829
- code: "Code",
36830
- divider: "Divider",
36831
- 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"
36832
37157
  };
36833
37158
  CHANGEABLE_TYPES = [
36834
37159
  "paragraph",
@@ -36862,6 +37187,7 @@ var init_RichBlockEditor = __esm({
36862
37187
  showToolbar = true,
36863
37188
  className
36864
37189
  }) => {
37190
+ const { t } = useTranslate();
36865
37191
  const [blocks, setBlocks] = React97.useState(
36866
37192
  () => normalizeBlocks(initialBlocks)
36867
37193
  );
@@ -36933,25 +37259,26 @@ var init_RichBlockEditor = __esm({
36933
37259
  Box,
36934
37260
  {
36935
37261
  role: "toolbar",
36936
- "aria-label": "Block editor toolbar",
37262
+ "aria-label": t("richBlockEditor.editorToolbar"),
36937
37263
  className: cn(
36938
37264
  "flex flex-wrap items-center gap-1",
36939
37265
  "border-b border-border bg-muted/30 px-2 py-2"
36940
37266
  ),
36941
37267
  children: TOOLBAR_ENTRIES.map((entry) => {
36942
37268
  const Icon3 = entry.icon;
37269
+ const entryLabel = t(entry.labelKey);
36943
37270
  return /* @__PURE__ */ jsxRuntime.jsxs(
36944
37271
  Button,
36945
37272
  {
36946
37273
  type: "button",
36947
37274
  variant: "ghost",
36948
37275
  size: "sm",
36949
- "aria-label": `Insert ${entry.label}`,
36950
- title: entry.label,
37276
+ "aria-label": t("richBlockEditor.insertEntry", { label: entryLabel }),
37277
+ title: entryLabel,
36951
37278
  onClick: () => handleAppend(entry.type),
36952
37279
  children: [
36953
37280
  /* @__PURE__ */ jsxRuntime.jsx(Icon3, { size: 14 }),
36954
- /* @__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 })
36955
37282
  ]
36956
37283
  },
36957
37284
  entry.type
@@ -36994,6 +37321,7 @@ var init_ReplyTree = __esm({
36994
37321
  "use client";
36995
37322
  init_cn();
36996
37323
  init_useEventBus();
37324
+ init_useTranslate();
36997
37325
  init_atoms2();
36998
37326
  init_VoteStack();
36999
37327
  ReplyTreeNode = ({
@@ -37013,6 +37341,7 @@ var init_ReplyTree = __esm({
37013
37341
  showActions
37014
37342
  }) => {
37015
37343
  const eventBus = useEventBus();
37344
+ const { t } = useTranslate();
37016
37345
  const hasReplies = !!node.replies && node.replies.length > 0;
37017
37346
  const isCollapsed = collapsedSet.has(node.id);
37018
37347
  const atMaxDepth = depth >= maxDepth;
@@ -37059,7 +37388,7 @@ var init_ReplyTree = __esm({
37059
37388
  variant: "ghost",
37060
37389
  size: "sm",
37061
37390
  onClick: handleToggle,
37062
- "aria-label": isCollapsed ? "Expand replies" : "Collapse replies",
37391
+ "aria-label": isCollapsed ? t("replyTree.expandReplies") : t("replyTree.collapseReplies"),
37063
37392
  "aria-expanded": !isCollapsed,
37064
37393
  leftIcon: isCollapsed ? "chevron-right" : "chevron-down",
37065
37394
  className: cn(
@@ -37100,7 +37429,7 @@ var init_ReplyTree = __esm({
37100
37429
  onVote: handleVote,
37101
37430
  size: "sm",
37102
37431
  variant: "horizontal",
37103
- label: `Vote on reply by ${node.authorName}`
37432
+ label: t("replyTree.voteOnReplyBy", { author: node.authorName })
37104
37433
  }
37105
37434
  ),
37106
37435
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -37110,8 +37439,8 @@ var init_ReplyTree = __esm({
37110
37439
  size: "sm",
37111
37440
  leftIcon: "message-square",
37112
37441
  onClick: handleReply,
37113
- "aria-label": `Reply to ${node.authorName}`,
37114
- children: "Reply"
37442
+ "aria-label": t("replyTree.replyTo", { author: node.authorName }),
37443
+ children: t("replyTree.reply")
37115
37444
  }
37116
37445
  ),
37117
37446
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -37121,8 +37450,8 @@ var init_ReplyTree = __esm({
37121
37450
  size: "sm",
37122
37451
  leftIcon: "flag",
37123
37452
  onClick: handleFlag,
37124
- "aria-label": `Flag reply by ${node.authorName}`,
37125
- children: "Flag"
37453
+ "aria-label": t("replyTree.flagReplyBy", { author: node.authorName }),
37454
+ children: t("replyTree.flag")
37126
37455
  }
37127
37456
  )
37128
37457
  ] }),
@@ -37133,9 +37462,9 @@ var init_ReplyTree = __esm({
37133
37462
  inputType: "textarea",
37134
37463
  rows: 2,
37135
37464
  value: draft,
37136
- placeholder: `Reply to ${node.authorName}\u2026`,
37465
+ placeholder: t("replyTree.replyToPlaceholder", { author: node.authorName }),
37137
37466
  onChange: (e) => setDraft(e.target.value),
37138
- "aria-label": `Reply to ${node.authorName}`
37467
+ "aria-label": t("replyTree.replyTo", { author: node.authorName })
37139
37468
  }
37140
37469
  ),
37141
37470
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-row gap-2 items-center", children: [
@@ -37147,10 +37476,10 @@ var init_ReplyTree = __esm({
37147
37476
  leftIcon: "send",
37148
37477
  onClick: handleSubmitReply,
37149
37478
  disabled: !draft.trim(),
37150
- children: "Send"
37479
+ children: t("replyTree.send")
37151
37480
  }
37152
37481
  ),
37153
- /* @__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") })
37154
37483
  ] })
37155
37484
  ] }),
37156
37485
  hasReplies && !isCollapsed && (atMaxDepth ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -37164,7 +37493,7 @@ var init_ReplyTree = __esm({
37164
37493
  "self-start gap-1 px-0 h-auto",
37165
37494
  "text-sm text-primary hover:underline hover:bg-transparent"
37166
37495
  ),
37167
- children: "Continue thread"
37496
+ children: t("replyTree.continueThread")
37168
37497
  }
37169
37498
  ) : /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex flex-col gap-2 mt-1", children: node.replies.map((child) => /* @__PURE__ */ jsxRuntime.jsx(
37170
37499
  ReplyTreeNode,
@@ -37203,6 +37532,7 @@ var init_ReplyTree = __esm({
37203
37532
  showActions = true,
37204
37533
  className
37205
37534
  }) => {
37535
+ const { t } = useTranslate();
37206
37536
  const nodeList = Array.isArray(nodes) ? nodes : nodes ? [nodes] : [];
37207
37537
  const [collapsedSet, setCollapsedSet] = React97.useState(() => {
37208
37538
  const acc = /* @__PURE__ */ new Set();
@@ -37221,7 +37551,7 @@ var init_ReplyTree = __esm({
37221
37551
  });
37222
37552
  }, []);
37223
37553
  if (nodeList.length === 0) {
37224
- 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") });
37225
37555
  }
37226
37556
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex flex-col gap-2 min-w-0", className), children: nodeList.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
37227
37557
  ReplyTreeNode,
@@ -37299,6 +37629,7 @@ var init_VersionDiff = __esm({
37299
37629
  "use client";
37300
37630
  init_cn();
37301
37631
  init_useEventBus();
37632
+ init_useTranslate();
37302
37633
  init_atoms2();
37303
37634
  init_Stack();
37304
37635
  INLINE_STYLES = {
@@ -37321,6 +37652,7 @@ var init_VersionDiff = __esm({
37321
37652
  language,
37322
37653
  className
37323
37654
  }) => {
37655
+ const { t } = useTranslate();
37324
37656
  const eventBus = useEventBus();
37325
37657
  const revisions = Array.isArray(revisionsProp) ? revisionsProp : [];
37326
37658
  const fallbackBefore = revisions[0]?.id ?? "";
@@ -37402,24 +37734,24 @@ var init_VersionDiff = __esm({
37402
37734
  children: [
37403
37735
  /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: "flex-wrap", children: [
37404
37736
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "git-commit", size: "sm", className: "text-muted-foreground" }),
37405
- /* @__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") }),
37406
37738
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsxRuntime.jsx(
37407
37739
  Select,
37408
37740
  {
37409
37741
  options,
37410
37742
  value: activeBeforeId,
37411
37743
  onChange: handleBeforeChange,
37412
- "aria-label": "Before revision"
37744
+ "aria-label": t("versionDiff.beforeRevision")
37413
37745
  }
37414
37746
  ) }),
37415
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: "to" }),
37747
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: t("versionDiff.to") }),
37416
37748
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsxRuntime.jsx(
37417
37749
  Select,
37418
37750
  {
37419
37751
  options,
37420
37752
  value: activeAfterId,
37421
37753
  onChange: handleAfterChange,
37422
- "aria-label": "After revision"
37754
+ "aria-label": t("versionDiff.afterRevision")
37423
37755
  }
37424
37756
  ) }),
37425
37757
  language && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "default", children: language }),
@@ -37440,7 +37772,7 @@ var init_VersionDiff = __esm({
37440
37772
  size: "sm",
37441
37773
  icon: activeView === "side-by-side" ? "align-left" : "columns",
37442
37774
  onClick: handleViewToggle,
37443
- "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")
37444
37776
  }
37445
37777
  ),
37446
37778
  (onRevert || revertEvent) && /* @__PURE__ */ jsxRuntime.jsx(
@@ -37450,7 +37782,7 @@ var init_VersionDiff = __esm({
37450
37782
  size: "sm",
37451
37783
  icon: "rotate-ccw",
37452
37784
  onClick: handleRevert,
37453
- children: "Revert"
37785
+ children: t("versionDiff.revert")
37454
37786
  }
37455
37787
  )
37456
37788
  ] })
@@ -37467,12 +37799,12 @@ var init_VersionDiff = __esm({
37467
37799
  children: [
37468
37800
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
37469
37801
  beforeRev?.label,
37470
- beforeRev?.author ? ` by ${beforeRev.author}` : "",
37802
+ beforeRev?.author ? t("versionDiff.byAuthor", { author: beforeRev.author }) : "",
37471
37803
  beforeRev?.timestamp ? ` (${beforeRev.timestamp})` : ""
37472
37804
  ] }),
37473
37805
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
37474
37806
  afterRev?.label,
37475
- afterRev?.author ? ` by ${afterRev.author}` : "",
37807
+ afterRev?.author ? t("versionDiff.byAuthor", { author: afterRev.author }) : "",
37476
37808
  afterRev?.timestamp ? ` (${afterRev.timestamp})` : ""
37477
37809
  ] })
37478
37810
  ]
@@ -37865,10 +38197,12 @@ var init_DocPagination = __esm({
37865
38197
  }
37866
38198
  });
37867
38199
  function DocSearch({
37868
- placeholder = "Search documentation...",
38200
+ placeholder,
37869
38201
  onSearch,
37870
38202
  className
37871
38203
  }) {
38204
+ const { t } = useTranslate();
38205
+ const resolvedPlaceholder = placeholder ?? t("docSearch.placeholder");
37872
38206
  const [query, setQuery] = React97.useState("");
37873
38207
  const [results, setResults] = React97.useState([]);
37874
38208
  const [isOpen, setIsOpen] = React97.useState(false);
@@ -37975,7 +38309,7 @@ function DocSearch({
37975
38309
  Input,
37976
38310
  {
37977
38311
  inputType: "search",
37978
- placeholder,
38312
+ placeholder: resolvedPlaceholder,
37979
38313
  value: query,
37980
38314
  onChange: handleChange,
37981
38315
  onFocus: handleFocus,
@@ -38040,6 +38374,7 @@ var init_DocSearch = __esm({
38040
38374
  init_Typography();
38041
38375
  init_Icon();
38042
38376
  init_Input();
38377
+ init_useTranslate();
38043
38378
  }
38044
38379
  });
38045
38380
  var DocSidebarCategory, DocSidebar;
@@ -39635,8 +39970,8 @@ var init_SignaturePad = __esm({
39635
39970
  init_useEventBus();
39636
39971
  init_useTranslate();
39637
39972
  SignaturePad = ({
39638
- label = "Signature",
39639
- helperText = "Draw your signature above",
39973
+ label,
39974
+ helperText,
39640
39975
  strokeColor,
39641
39976
  strokeWidth = 2,
39642
39977
  height = 200,
@@ -39652,6 +39987,8 @@ var init_SignaturePad = __esm({
39652
39987
  }) => {
39653
39988
  const eventBus = useEventBus();
39654
39989
  const { t } = useTranslate();
39990
+ const resolvedLabel = label ?? t("signaturePad.label");
39991
+ const resolvedHelperText = helperText ?? t("signaturePad.helperText");
39655
39992
  const canvasRef = React97.useRef(null);
39656
39993
  const [isDrawing, setIsDrawing] = React97.useState(false);
39657
39994
  const [hasSignature, setHasSignature] = React97.useState(!!value);
@@ -39754,7 +40091,7 @@ var init_SignaturePad = __esm({
39754
40091
  );
39755
40092
  }
39756
40093
  return /* @__PURE__ */ jsxRuntime.jsx(Card, { className: cn("p-4", className), children: /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "sm", children: [
39757
- label && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "medium", children: label }),
40094
+ resolvedLabel && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "medium", children: resolvedLabel }),
39758
40095
  /* @__PURE__ */ jsxRuntime.jsx(
39759
40096
  Box,
39760
40097
  {
@@ -39783,7 +40120,7 @@ var init_SignaturePad = __esm({
39783
40120
  )
39784
40121
  }
39785
40122
  ),
39786
- helperText && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: helperText }),
40123
+ resolvedHelperText && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: resolvedHelperText }),
39787
40124
  !readOnly && /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", justify: "end", children: [
39788
40125
  /* @__PURE__ */ jsxRuntime.jsx(
39789
40126
  Button,
@@ -39793,7 +40130,7 @@ var init_SignaturePad = __esm({
39793
40130
  icon: LucideIcons2.Eraser,
39794
40131
  onClick: clearSignature,
39795
40132
  disabled: !hasSignature,
39796
- children: "Clear"
40133
+ children: t("signaturePad.clear")
39797
40134
  }
39798
40135
  ),
39799
40136
  signEvent && /* @__PURE__ */ jsxRuntime.jsx(
@@ -39804,7 +40141,7 @@ var init_SignaturePad = __esm({
39804
40141
  icon: LucideIcons2.Check,
39805
40142
  onClick: confirmSignature,
39806
40143
  disabled: !hasSignature,
39807
- children: "Confirm"
40144
+ children: t("signaturePad.confirm")
39808
40145
  }
39809
40146
  )
39810
40147
  ] })
@@ -44249,6 +44586,7 @@ function MasterDetail({
44249
44586
  className,
44250
44587
  ...rest
44251
44588
  }) {
44589
+ const { t } = useTranslate();
44252
44590
  const loading = externalLoading ?? false;
44253
44591
  const isLoading = externalIsLoading ?? false;
44254
44592
  const error = externalError ?? null;
@@ -44261,8 +44599,8 @@ function MasterDetail({
44261
44599
  isLoading: loading || isLoading,
44262
44600
  error,
44263
44601
  className,
44264
- emptyTitle: "No items found",
44265
- emptyDescription: "Create your first item to get started.",
44602
+ emptyTitle: t("table.empty.title"),
44603
+ emptyDescription: t("empty.createFirst"),
44266
44604
  ...rest
44267
44605
  }
44268
44606
  );
@@ -44271,6 +44609,7 @@ var init_MasterDetail = __esm({
44271
44609
  "components/core/organisms/MasterDetail.tsx"() {
44272
44610
  "use client";
44273
44611
  init_DataTable();
44612
+ init_useTranslate();
44274
44613
  MasterDetail.displayName = "MasterDetail";
44275
44614
  }
44276
44615
  });
@@ -44279,14 +44618,18 @@ var init_MasterDetailLayout = __esm({
44279
44618
  "components/core/organisms/layout/MasterDetailLayout.tsx"() {
44280
44619
  init_cn();
44281
44620
  init_Typography();
44282
- DefaultEmptyDetail = () => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsxRuntime.jsx(
44283
- Typography,
44284
- {
44285
- variant: "body2",
44286
- className: "text-muted-foreground",
44287
- children: "Select an item to view details"
44288
- }
44289
- ) });
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
+ };
44290
44633
  MasterDetailLayout = ({
44291
44634
  master,
44292
44635
  detail,
@@ -44413,7 +44756,7 @@ var init_MediaGallery = __esm({
44413
44756
  {
44414
44757
  icon: LucideIcons2.Image,
44415
44758
  title: t("display.noMedia"),
44416
- description: "No media items to display.",
44759
+ description: t("mediaGallery.noMediaDescription"),
44417
44760
  className
44418
44761
  }
44419
44762
  );
@@ -44430,7 +44773,7 @@ var init_MediaGallery = __esm({
44430
44773
  size: "sm",
44431
44774
  icon: LucideIcons2.Upload,
44432
44775
  action: "MEDIA_UPLOAD",
44433
- children: "Upload"
44776
+ children: t("mediaGallery.upload")
44434
44777
  }
44435
44778
  ),
44436
44779
  actions?.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -44444,10 +44787,7 @@ var init_MediaGallery = __esm({
44444
44787
  ))
44445
44788
  ] })
44446
44789
  ] }),
44447
- selectable && selectedItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(HStack, { gap: "sm", align: "center", children: /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "info", children: [
44448
- selectedItems.length,
44449
- " selected"
44450
- ] }) }),
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 }) }) }),
44451
44791
  /* @__PURE__ */ jsxRuntime.jsx(
44452
44792
  Box,
44453
44793
  {
@@ -45321,7 +45661,7 @@ function TraitsTab({ traits: traits2 }) {
45321
45661
  EmptyState,
45322
45662
  {
45323
45663
  title: t("debug.noActiveTraits"),
45324
- description: "Traits will appear when components using them are mounted",
45664
+ description: t("debug.traitsMountHint"),
45325
45665
  className: "py-8"
45326
45666
  }
45327
45667
  );
@@ -45331,14 +45671,11 @@ function TraitsTab({ traits: traits2 }) {
45331
45671
  header: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 w-full", children: [
45332
45672
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", weight: "semibold", className: "text-purple-600 dark:text-purple-400", children: trait.name }),
45333
45673
  /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "success", size: "sm", children: trait.currentState }),
45334
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: [
45335
- trait.transitionCount,
45336
- " transitions"
45337
- ] })
45674
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: t("debug.transitionsCount", { count: trait.transitionCount }) })
45338
45675
  ] }),
45339
45676
  content: /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "sm", children: [
45340
45677
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
45341
- /* @__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") }),
45342
45679
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: trait.states.map((state) => /* @__PURE__ */ jsxRuntime.jsx(
45343
45680
  Badge,
45344
45681
  {
@@ -45350,7 +45687,7 @@ function TraitsTab({ traits: traits2 }) {
45350
45687
  )) })
45351
45688
  ] }),
45352
45689
  trait.transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
45353
- /* @__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") }),
45354
45691
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: trait.transitions.map((t2, i) => /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "font-mono", children: [
45355
45692
  t2.from,
45356
45693
  " \u2192 ",
@@ -45369,7 +45706,7 @@ function TraitsTab({ traits: traits2 }) {
45369
45706
  ] }, i)) })
45370
45707
  ] }),
45371
45708
  trait.guards.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
45372
- /* @__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") }),
45373
45710
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: trait.guards.map((g, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
45374
45711
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: g.name }),
45375
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" })
@@ -45475,7 +45812,7 @@ function EntitiesTab({ snapshot }) {
45475
45812
  EmptyState,
45476
45813
  {
45477
45814
  title: t("debug.noEntityData"),
45478
- description: "Debug mode may not be enabled",
45815
+ description: t("debug.debugModeHint"),
45479
45816
  className: "py-8"
45480
45817
  }
45481
45818
  );
@@ -45488,7 +45825,7 @@ function EntitiesTab({ snapshot }) {
45488
45825
  EmptyState,
45489
45826
  {
45490
45827
  title: t("debug.noEntities"),
45491
- description: "Entities will appear when spawned",
45828
+ description: t("debug.entitiesSpawnHint"),
45492
45829
  className: "py-8"
45493
45830
  }
45494
45831
  );
@@ -45496,7 +45833,7 @@ function EntitiesTab({ snapshot }) {
45496
45833
  const singletonItems = singletonEntries.map(([name, data]) => ({
45497
45834
  id: `singleton-${name}`,
45498
45835
  header: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
45499
- /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "sm", children: "Singleton" }),
45836
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "sm", children: t("debug.singleton") }),
45500
45837
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", weight: "semibold", className: "text-sky-600 dark:text-sky-400", children: name })
45501
45838
  ] }),
45502
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) })
@@ -45514,31 +45851,19 @@ function EntitiesTab({ snapshot }) {
45514
45851
  }));
45515
45852
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--entities", children: [
45516
45853
  singletonItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4", children: [
45517
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
45518
- "Singletons (",
45519
- singletonItems.length,
45520
- ")"
45521
- ] }),
45854
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.singletonsCount", { count: singletonItems.length }) }),
45522
45855
  /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: singletonItems, multiple: true })
45523
45856
  ] }),
45524
45857
  runtimeItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4", children: [
45525
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
45526
- "Runtime (",
45527
- runtimeEntities.length,
45528
- ")"
45529
- ] }),
45858
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.runtimeCount", { count: runtimeEntities.length }) }),
45530
45859
  /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: runtimeItems, multiple: true }),
45531
- runtimeEntities.length > 20 && /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-400 text-center mt-2", children: [
45532
- "+",
45533
- runtimeEntities.length - 20,
45534
- " more entities"
45535
- ] })
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 }) })
45536
45861
  ] }),
45537
45862
  persistentEntries.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
45538
- /* @__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") }),
45539
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: [
45540
45865
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: type }),
45541
- /* @__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") })
45542
45867
  ] }, type)) })
45543
45868
  ] })
45544
45869
  ] });
@@ -45582,7 +45907,7 @@ function EventFlowTab({ events: events2 }) {
45582
45907
  EmptyState,
45583
45908
  {
45584
45909
  title: t("debug.noEventsYet"),
45585
- description: "Events will appear as traits, ticks, and other systems execute",
45910
+ description: t("debug.eventsExecuteHint"),
45586
45911
  className: "py-8"
45587
45912
  }
45588
45913
  );
@@ -45593,17 +45918,13 @@ function EventFlowTab({ events: events2 }) {
45593
45918
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--events", children: [
45594
45919
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 mb-3 flex-wrap", children: [
45595
45920
  /* @__PURE__ */ jsxRuntime.jsxs(ButtonGroup, { children: [
45596
- /* @__PURE__ */ jsxRuntime.jsxs(
45921
+ /* @__PURE__ */ jsxRuntime.jsx(
45597
45922
  Button,
45598
45923
  {
45599
45924
  size: "sm",
45600
45925
  variant: filter === "all" ? "primary" : "secondary",
45601
45926
  onClick: () => setFilter("all"),
45602
- children: [
45603
- "All (",
45604
- events2.length,
45605
- ")"
45606
- ]
45927
+ children: t("debug.allCount", { count: events2.length })
45607
45928
  }
45608
45929
  ),
45609
45930
  eventTypes.map((type) => {
@@ -45633,7 +45954,7 @@ function EventFlowTab({ events: events2 }) {
45633
45954
  onChange: (e) => setAutoScroll(e.target.checked)
45634
45955
  }
45635
45956
  ),
45636
- "Auto-scroll"
45957
+ t("debug.autoScroll")
45637
45958
  ] })
45638
45959
  ] }),
45639
45960
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -45691,7 +46012,7 @@ function GuardsPanel({ guards }) {
45691
46012
  EmptyState,
45692
46013
  {
45693
46014
  title: t("debug.noGuardEvaluations"),
45694
- description: "Guard evaluations will appear when transitions or ticks with guards execute",
46015
+ description: t("debug.guardEvaluationsHint"),
45695
46016
  className: "py-8"
45696
46017
  }
45697
46018
  );
@@ -45722,15 +46043,15 @@ function GuardsPanel({ guards }) {
45722
46043
  ] }),
45723
46044
  content: /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "sm", children: [
45724
46045
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
45725
- /* @__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") }),
45726
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 })
45727
46048
  ] }),
45728
46049
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
45729
- /* @__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") }),
45730
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) })
45731
46052
  ] }),
45732
46053
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
45733
- /* @__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") }),
45734
46055
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: guard.context.traitName })
45735
46056
  ] })
45736
46057
  ] })
@@ -45748,9 +46069,9 @@ function GuardsPanel({ guards }) {
45748
46069
  ] })
45749
46070
  ] }),
45750
46071
  /* @__PURE__ */ jsxRuntime.jsxs(ButtonGroup, { children: [
45751
- /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: "All" }),
45752
- /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: "Passed" }),
45753
- /* @__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") })
45754
46075
  ] })
45755
46076
  ] }),
45756
46077
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-80 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: accordionItems }) })
@@ -45876,7 +46197,7 @@ function TransitionTimeline({ transitions }) {
45876
46197
  EmptyState,
45877
46198
  {
45878
46199
  title: t("debug.noTransitionsRecorded"),
45879
- description: "Transitions will appear as the state machine processes events",
46200
+ description: t("debug.transitionsProcessHint"),
45880
46201
  className: "py-8"
45881
46202
  }
45882
46203
  );
@@ -45893,10 +46214,7 @@ function TransitionTimeline({ transitions }) {
45893
46214
  const sorted = [...transitions].reverse();
45894
46215
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--timeline", children: [
45895
46216
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-2", children: [
45896
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-500", children: [
45897
- transitions.length,
45898
- " transitions recorded"
45899
- ] }),
46217
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500", children: t("debug.transitionsRecorded", { count: transitions.length }) }),
45900
46218
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-1 text-xs text-gray-500 cursor-pointer", children: [
45901
46219
  /* @__PURE__ */ jsxRuntime.jsx(
45902
46220
  Checkbox,
@@ -45905,7 +46223,7 @@ function TransitionTimeline({ transitions }) {
45905
46223
  onChange: (e) => setAutoScroll(e.target.checked)
45906
46224
  }
45907
46225
  ),
45908
- "Auto-scroll"
46226
+ t("debug.autoScroll")
45909
46227
  ] })
45910
46228
  ] }),
45911
46229
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -45948,15 +46266,13 @@ function TransitionTimeline({ transitions }) {
45948
46266
  variant: trace.guardResult ? "success" : "danger",
45949
46267
  size: "sm",
45950
46268
  children: [
45951
- "guard: ",
46269
+ t("debug.guardLabel"),
46270
+ " ",
45952
46271
  trace.guardResult ? "\u2713" : "\u2717"
45953
46272
  ]
45954
46273
  }
45955
46274
  ),
45956
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: [
45957
- trace.effects.length,
45958
- " effects"
45959
- ] })
46275
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: t("debug.effectsCount", { count: trace.effects.length }) })
45960
46276
  ] }),
45961
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: [
45962
46278
  /* @__PURE__ */ jsxRuntime.jsx(EffectBadge, { effect }),
@@ -46005,13 +46321,13 @@ function ServerBridgeTab({ bridge }) {
46005
46321
  EmptyState,
46006
46322
  {
46007
46323
  title: t("debug.noBridgeData"),
46008
- description: "The ServerBridge has not been initialized. Bridge health will appear once the runtime connects to the server.",
46324
+ description: t("debug.bridgeInitHint"),
46009
46325
  className: "py-8"
46010
46326
  }
46011
46327
  );
46012
46328
  }
46013
46329
  const formatTime4 = (ts) => {
46014
- if (ts === 0) return "Never";
46330
+ if (ts === 0) return t("debug.never");
46015
46331
  const d = new Date(ts);
46016
46332
  return d.toLocaleTimeString("en-US", {
46017
46333
  hour12: false,
@@ -46024,14 +46340,14 @@ function ServerBridgeTab({ bridge }) {
46024
46340
  /* @__PURE__ */ jsxRuntime.jsxs(Card, { className: "p-3", children: [
46025
46341
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 mb-3", children: [
46026
46342
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: `w-3 h-3 rounded-full ${bridge.connected ? "bg-green-500 animate-pulse" : "bg-red-500"}` }),
46027
- /* @__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") })
46028
46344
  ] }),
46029
46345
  /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "xs", children: [
46030
46346
  /* @__PURE__ */ jsxRuntime.jsx(
46031
46347
  StatRow,
46032
46348
  {
46033
46349
  label: t("debug.status"),
46034
- value: bridge.connected ? "Connected" : "Disconnected",
46350
+ value: bridge.connected ? t("debug.connected") : t("debug.disconnected"),
46035
46351
  variant: bridge.connected ? "success" : "danger"
46036
46352
  }
46037
46353
  ),
@@ -46059,13 +46375,10 @@ function ServerBridgeTab({ bridge }) {
46059
46375
  ] })
46060
46376
  ] }),
46061
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: [
46062
- /* @__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") }),
46063
46379
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-red-500 font-mono break-all", children: bridge.lastError })
46064
46380
  ] }),
46065
- bridge.connected && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-2", children: /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-400", children: [
46066
- bridge.eventsForwarded + bridge.eventsReceived,
46067
- " total events processed"
46068
- ] }) })
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 }) }) })
46069
46382
  ] }) });
46070
46383
  }
46071
46384
  var init_ServerBridgeTab = __esm({
@@ -46175,7 +46488,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
46175
46488
  EmptyState,
46176
46489
  {
46177
46490
  title: t("debug.noActiveTraits"),
46178
- description: "Traits will appear when the state machine initializes",
46491
+ description: t("debug.traitsInitHint"),
46179
46492
  className: "py-8"
46180
46493
  }
46181
46494
  );
@@ -46192,7 +46505,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
46192
46505
  };
46193
46506
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--dispatch", children: [
46194
46507
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3", children: [
46195
- /* @__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") }),
46196
46509
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: traits2.map((trait) => /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "success", size: "sm", children: [
46197
46510
  trait.name,
46198
46511
  ": ",
@@ -46200,8 +46513,8 @@ function EventDispatcherTab({ traits: traits2, schema }) {
46200
46513
  ] }, trait.id)) })
46201
46514
  ] }),
46202
46515
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3", children: [
46203
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Available Events" }),
46204
- 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: [
46205
46518
  /* @__PURE__ */ jsxRuntime.jsx(
46206
46519
  Button,
46207
46520
  {
@@ -46213,15 +46526,15 @@ function EventDispatcherTab({ traits: traits2, schema }) {
46213
46526
  }
46214
46527
  ),
46215
46528
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500", children: transitions.map((t2) => `${t2.from} -> ${t2.to}`).join(", ") }),
46216
- 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") })
46217
46530
  ] }, event)) })
46218
46531
  ] }),
46219
46532
  unavailableEvents.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3", children: [
46220
- /* @__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") }),
46221
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)) })
46222
46535
  ] }),
46223
46536
  log16.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
46224
- /* @__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") }),
46225
46538
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: log16.map((entry, i) => /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "font-mono text-xs", children: [
46226
46539
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-400", children: entry.traitName }),
46227
46540
  " ",
@@ -46252,21 +46565,20 @@ var init_RuntimeDebugger = __esm({
46252
46565
  }
46253
46566
  });
46254
46567
  function ServerResponseRow({ sr }) {
46568
+ const { t } = useTranslate();
46255
46569
  const entityEntries = Object.entries(sr.dataEntities);
46256
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: [
46257
46571
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
46258
46572
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: sr.success ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400", children: [
46259
46573
  sr.success ? "\u2713" : "\u2717",
46260
- " server"
46574
+ " ",
46575
+ t("debug.server")
46261
46576
  ] }),
46262
46577
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-300", children: sr.orbitalName }),
46263
- sr.clientEffects > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "px-1 rounded bg-purple-500/15 text-purple-600 dark:text-purple-300", children: [
46264
- sr.clientEffects,
46265
- " clientEffect",
46266
- sr.clientEffects !== 1 ? "s" : ""
46267
- ] }),
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 }) }),
46268
46579
  sr.emittedEvents.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "px-1 rounded bg-blue-500/15 text-blue-300", children: [
46269
- "emit: ",
46580
+ t("debug.emitLabel"),
46581
+ " ",
46270
46582
  sr.emittedEvents.join(", ")
46271
46583
  ] }),
46272
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 })
@@ -46274,13 +46586,12 @@ function ServerResponseRow({ sr }) {
46274
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: [
46275
46587
  name,
46276
46588
  ": ",
46277
- count,
46278
- " row",
46279
- count !== 1 ? "s" : ""
46589
+ t("debug.rowsCount", { count })
46280
46590
  ] }, name)) })
46281
46591
  ] });
46282
46592
  }
46283
46593
  function TransitionRow({ trace }) {
46594
+ const { t } = useTranslate();
46284
46595
  const isServerEntry = !!trace.serverResponse && trace.traitName.startsWith("server:");
46285
46596
  const hasFailedEffects = trace.effects.some((e) => e.status === "failed");
46286
46597
  if (isServerEntry && trace.serverResponse) {
@@ -46288,7 +46599,7 @@ function TransitionRow({ trace }) {
46288
46599
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-2 text-xs font-mono", children: [
46289
46600
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-1.5 w-1.5 h-1.5 rounded-full flex-shrink-0 bg-purple-500" }),
46290
46601
  /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "warning", size: "sm", className: "flex-shrink-0", children: trace.event }),
46291
- /* @__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") })
46292
46603
  ] }),
46293
46604
  /* @__PURE__ */ jsxRuntime.jsx(ServerResponseRow, { sr: trace.serverResponse })
46294
46605
  ] });
@@ -46329,6 +46640,7 @@ function VerifyModePanel({
46329
46640
  serverCount,
46330
46641
  localCount
46331
46642
  }) {
46643
+ const { t } = useTranslate();
46332
46644
  const [expanded, setExpanded] = React97__namespace.useState(true);
46333
46645
  const scrollRef = React97__namespace.useRef(null);
46334
46646
  const prevCountRef = React97__namespace.useRef(0);
@@ -46359,30 +46671,20 @@ function VerifyModePanel({
46359
46671
  onClick: () => setExpanded((v) => !v),
46360
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",
46361
46673
  "aria-expanded": expanded,
46362
- "aria-label": expanded ? "Collapse verification timeline" : "Expand verification timeline",
46674
+ "aria-label": expanded ? t("debug.collapseVerificationTimeline") : t("debug.expandVerificationTimeline"),
46363
46675
  "data-testid": "debugger-verify-toggle",
46364
46676
  children: [
46365
46677
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground/50 w-3", "aria-hidden": true, children: expanded ? "\u25BE" : "\u25B8" }),
46366
- /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? `${failedChecks} fail` : "OK" }),
46367
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-foreground/70", children: [
46368
- localCount,
46369
- " local"
46370
- ] }),
46371
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-purple-600 dark:text-purple-400", children: [
46372
- serverCount,
46373
- " server"
46374
- ] }),
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 }) }),
46375
46681
  traitStates && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-cyan-600 dark:text-cyan-400 truncate max-w-[400px]", children: traitStates }),
46376
- !expanded && transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ml-auto text-foreground/50", children: [
46377
- transitions.length,
46378
- " transition",
46379
- transitions.length !== 1 ? "s" : ""
46380
- ] })
46682
+ !expanded && transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto text-foreground/50", children: t("debug.transitionsCount", { count: transitions.length }) })
46381
46683
  ]
46382
46684
  }
46383
46685
  ),
46384
46686
  expanded && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 flex overflow-hidden", children: [
46385
- /* @__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)) }) }) }),
46386
46688
  /* @__PURE__ */ jsxRuntime.jsx(WalkMinimap, {})
46387
46689
  ] })
46388
46690
  ]
@@ -46398,6 +46700,7 @@ function RuntimeDebugger({
46398
46700
  defaultTab,
46399
46701
  schema
46400
46702
  }) {
46703
+ const { t } = useTranslate();
46401
46704
  const [isCollapsed, setIsCollapsed] = React97__namespace.useState(mode === "verify" ? true : defaultCollapsed);
46402
46705
  const [isVisible, setIsVisible] = React97__namespace.useState(mode === "inline" || mode === "verify" || isDebugEnabled2());
46403
46706
  const debugData = useDebugData();
@@ -46436,55 +46739,55 @@ function RuntimeDebugger({
46436
46739
  const tabItems = [
46437
46740
  {
46438
46741
  id: "dispatch",
46439
- label: "Dispatch",
46742
+ label: t("debug.tabDispatch"),
46440
46743
  badge: debugData.traits.length || void 0,
46441
46744
  content: /* @__PURE__ */ jsxRuntime.jsx(EventDispatcherTab, { traits: debugData.traits, schema })
46442
46745
  },
46443
46746
  {
46444
46747
  id: "verify",
46445
- label: failedChecks > 0 ? "Verify (!)" : "Verify",
46748
+ label: failedChecks > 0 ? t("debug.tabVerifyAlert") : t("debug.tabVerify"),
46446
46749
  badge: verification.summary.totalChecks || void 0,
46447
46750
  content: /* @__PURE__ */ jsxRuntime.jsx(VerificationTab, { checks: verification.checks, summary: verification.summary })
46448
46751
  },
46449
46752
  {
46450
46753
  id: "timeline",
46451
- label: "Timeline",
46754
+ label: t("debug.tabTimeline"),
46452
46755
  badge: verification.transitions.length || void 0,
46453
46756
  content: /* @__PURE__ */ jsxRuntime.jsx(TransitionTimeline, { transitions: verification.transitions })
46454
46757
  },
46455
46758
  {
46456
46759
  id: "bridge",
46457
- label: "Bridge",
46760
+ label: t("debug.tabBridge"),
46458
46761
  badge: verification.bridge?.connected ? void 0 : 1,
46459
46762
  content: /* @__PURE__ */ jsxRuntime.jsx(ServerBridgeTab, { bridge: verification.bridge })
46460
46763
  },
46461
46764
  {
46462
46765
  id: "traits",
46463
- label: "Traits",
46766
+ label: t("debug.tabTraits"),
46464
46767
  badge: debugData.traits.length || void 0,
46465
46768
  content: /* @__PURE__ */ jsxRuntime.jsx(TraitsTab, { traits: debugData.traits })
46466
46769
  },
46467
46770
  {
46468
46771
  id: "ticks",
46469
- label: "Ticks",
46470
- 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,
46471
46774
  content: /* @__PURE__ */ jsxRuntime.jsx(TicksTab, { ticks: debugData.ticks })
46472
46775
  },
46473
46776
  {
46474
46777
  id: "entities",
46475
- label: "Entities",
46778
+ label: t("debug.tabEntities"),
46476
46779
  badge: debugData.entitySnapshot?.runtime.length || void 0,
46477
46780
  content: /* @__PURE__ */ jsxRuntime.jsx(EntitiesTab, { snapshot: debugData.entitySnapshot })
46478
46781
  },
46479
46782
  {
46480
46783
  id: "events",
46481
- label: "Events",
46784
+ label: t("debug.tabEvents"),
46482
46785
  badge: debugData.events.length > 0 ? debugData.events.length : void 0,
46483
46786
  content: /* @__PURE__ */ jsxRuntime.jsx(EventFlowTab, { events: debugData.events })
46484
46787
  },
46485
46788
  {
46486
46789
  id: "guards",
46487
- label: "Guards",
46790
+ label: t("debug.tabGuards"),
46488
46791
  badge: debugData.guards.filter((g) => !g.result).length || void 0,
46489
46792
  content: /* @__PURE__ */ jsxRuntime.jsx(GuardsPanel, { guards: debugData.guards })
46490
46793
  }
@@ -46512,15 +46815,10 @@ function RuntimeDebugger({
46512
46815
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
46513
46816
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "h6", style: { fontSize: "0.75rem" }, children: [
46514
46817
  isCollapsed ? "\u25B6" : "\u25BC",
46515
- " Debugger"
46818
+ " ",
46819
+ t("debug.debugger")
46516
46820
  ] }),
46517
- failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "danger", size: "sm", children: [
46518
- failedChecks,
46519
- " failed"
46520
- ] }) : debugData.traits.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "success", size: "sm", children: [
46521
- debugData.traits.length,
46522
- " traits"
46523
- ] }) : /* @__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") })
46524
46822
  ] })
46525
46823
  }
46526
46824
  ),
@@ -46538,9 +46836,9 @@ function RuntimeDebugger({
46538
46836
  );
46539
46837
  }
46540
46838
  if (mode === "verify") {
46541
- const traitStates = debugData.traits.map((t) => `${t.name}:${t.currentState}`).join(" | ");
46542
- const serverEntries = verification.transitions.filter((t) => t.serverResponse);
46543
- 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);
46544
46842
  return /* @__PURE__ */ jsxRuntime.jsx(
46545
46843
  VerifyModePanel,
46546
46844
  {
@@ -46572,7 +46870,7 @@ function RuntimeDebugger({
46572
46870
  variant: "secondary",
46573
46871
  size: "sm",
46574
46872
  className: "runtime-debugger__toggle",
46575
- title: "Open Debugger (`)",
46873
+ title: t("debug.openDebugger"),
46576
46874
  children: failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "relative", children: [
46577
46875
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: "V" }),
46578
46876
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute -top-1 -right-2 w-2 h-2 bg-red-500 rounded-full" })
@@ -46582,11 +46880,8 @@ function RuntimeDebugger({
46582
46880
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "runtime-debugger__header", children: [
46583
46881
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
46584
46882
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-lg", children: "V" }),
46585
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: "KFlow Verifier" }),
46586
- failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "danger", size: "sm", children: [
46587
- failedChecks,
46588
- " failed"
46589
- ] }) : 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") })
46590
46885
  ] }),
46591
46886
  /* @__PURE__ */ jsxRuntime.jsx(
46592
46887
  Button,
@@ -46594,7 +46889,7 @@ function RuntimeDebugger({
46594
46889
  onClick: () => setIsCollapsed(true),
46595
46890
  variant: "ghost",
46596
46891
  size: "sm",
46597
- title: "Close (`)",
46892
+ title: t("debug.close"),
46598
46893
  children: "x"
46599
46894
  }
46600
46895
  )
@@ -46608,7 +46903,7 @@ function RuntimeDebugger({
46608
46903
  className: "runtime-debugger__tabs"
46609
46904
  }
46610
46905
  ) }),
46611
- /* @__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") }) })
46612
46907
  ] })
46613
46908
  }
46614
46909
  );
@@ -46634,6 +46929,7 @@ var init_RuntimeDebugger2 = __esm({
46634
46929
  init_TransitionTimeline();
46635
46930
  init_ServerBridgeTab();
46636
46931
  init_EventDispatcherTab();
46932
+ init_useTranslate();
46637
46933
  init_RuntimeDebugger();
46638
46934
  RuntimeDebugger.displayName = "RuntimeDebugger";
46639
46935
  }
@@ -47922,7 +48218,7 @@ var init_StatCard = __esm({
47922
48218
  }
47923
48219
  );
47924
48220
  }
47925
- const label = schemaStats?.[0]?.label || labelToUse || "Stat";
48221
+ const label = schemaStats?.[0]?.label || labelToUse || t("statCard.defaultLabel");
47926
48222
  const normalizedPropValue = Array.isArray(propValue) ? propValue[0] ?? propValue.length : propValue;
47927
48223
  const value = schemaStats?.[0]?.value ?? normalizedPropValue ?? 0;
47928
48224
  const trendDirection = manualDirection || (calculatedTrend === void 0 || calculatedTrend === 0 ? "neutral" : calculatedTrend > 0 ? "up" : "down");
@@ -47965,7 +48261,7 @@ var init_StatCard = __esm({
47965
48261
  ]
47966
48262
  }
47967
48263
  ),
47968
- /* @__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") })
47969
48265
  ] }),
47970
48266
  subtitle && !calculatedTrend && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", children: subtitle })
47971
48267
  ] }),
@@ -52170,6 +52466,9 @@ var AvlEmitListen = ({
52170
52466
  ] });
52171
52467
  };
52172
52468
  AvlEmitListen.displayName = "AvlEmitListen";
52469
+
52470
+ // components/avl/molecules/AvlSlotMap.tsx
52471
+ init_useTranslate();
52173
52472
  var SLOT_PRESETS = {
52174
52473
  header: { x: 10, y: 5, width: 340, height: 35 },
52175
52474
  main: { x: 120, y: 50, width: 230, height: 195 },
@@ -52214,6 +52513,7 @@ var AvlSlotMap = ({
52214
52513
  color = "var(--color-primary)",
52215
52514
  animated = false
52216
52515
  }) => {
52516
+ const { t } = useTranslate();
52217
52517
  const ox = (600 - pageWidth) / 2;
52218
52518
  const oy = (400 - pageHeight) / 2;
52219
52519
  let unknownIdx = 0;
@@ -52264,7 +52564,7 @@ var AvlSlotMap = ({
52264
52564
  fontSize: 10,
52265
52565
  fontFamily: "inherit",
52266
52566
  fontWeight: "bold",
52267
- children: "Page Layout"
52567
+ children: t("avl.pageLayout")
52268
52568
  }
52269
52569
  ),
52270
52570
  resolvedSlots.map((slot) => {
@@ -52313,7 +52613,7 @@ var AvlSlotMap = ({
52313
52613
  opacity: 0.6,
52314
52614
  children: [
52315
52615
  slot.name,
52316
- isOverlay ? " (overlay)" : ""
52616
+ isOverlay ? ` ${t("avl.overlaySuffix")}` : ""
52317
52617
  ]
52318
52618
  }
52319
52619
  )
@@ -53245,23 +53545,25 @@ var SystemNode = ({ data }) => {
53245
53545
  SystemNode.displayName = "SystemNode";
53246
53546
 
53247
53547
  // components/avl/molecules/DetailView.tsx
53548
+ init_useTranslate();
53248
53549
  init_AvlState();
53249
53550
  init_AvlEffect();
53250
53551
  init_types();
53251
53552
  var DetailView = ({ data }) => {
53553
+ const { t } = useTranslate();
53252
53554
  const traitName = data.traits[0]?.name;
53253
53555
  const traitData = traitName ? data.traitDetails[traitName] : void 0;
53254
53556
  if (!traitData || traitData.transitions.length === 0) {
53255
- 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") });
53256
53558
  }
53257
53559
  const transition = traitData.transitions[0];
53258
53560
  const fromState = traitData.states.find((s) => s.name === transition.from);
53259
53561
  const toState = traitData.states.find((s) => s.name === transition.to);
53260
53562
  const transitionCounts = {};
53261
53563
  for (const s of traitData.states) transitionCounts[s.name] = 0;
53262
- for (const t of traitData.transitions) {
53263
- transitionCounts[t.from] = (transitionCounts[t.from] ?? 0) + 1;
53264
- 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;
53265
53567
  }
53266
53568
  const maxTC = Math.max(...Object.values(transitionCounts), 0);
53267
53569
  const fromRole = getStateRole(transition.from, fromState?.isInitial, fromState?.isTerminal, transitionCounts[transition.from] ?? 0, maxTC);
@@ -53278,21 +53580,21 @@ var DetailView = ({ data }) => {
53278
53580
  ] }) }),
53279
53581
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-4 py-3 space-y-3", children: [
53280
53582
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
53281
- /* @__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") }),
53282
53584
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5", children: [
53283
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 }) }),
53284
53586
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-semibold text-[var(--color-foreground)]", children: transition.event })
53285
53587
  ] })
53286
53588
  ] }),
53287
53589
  hasGuard && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
53288
- /* @__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") }),
53289
53591
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5", children: [
53290
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 }) }),
53291
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) })
53292
53594
  ] })
53293
53595
  ] }),
53294
53596
  transition.effects.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
53295
- /* @__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") }),
53296
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: [
53297
53599
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs text-[var(--color-muted-foreground)] w-3 text-right mt-0.5", children: [
53298
53600
  i + 1,
@@ -53328,6 +53630,7 @@ AvlOrbitalNode.displayName = "AvlOrbitalNode";
53328
53630
 
53329
53631
  // components/avl/molecules/AvlTransitionEdge.tsx
53330
53632
  init_types();
53633
+ init_useTranslate();
53331
53634
  var AvlTransitionEdge = ({
53332
53635
  id,
53333
53636
  sourceX,
@@ -53340,6 +53643,7 @@ var AvlTransitionEdge = ({
53340
53643
  markerEnd,
53341
53644
  style
53342
53645
  }) => {
53646
+ const { t } = useTranslate();
53343
53647
  const [path, labelX, labelY] = react.getBezierPath({
53344
53648
  sourceX,
53345
53649
  sourceY,
@@ -53371,9 +53675,9 @@ var AvlTransitionEdge = ({
53371
53675
  className: "absolute pointer-events-all nodrag nopan flex items-center gap-1",
53372
53676
  style: { transform: `translate(-50%, -50%) translate(${labelX}px, ${labelY}px)` },
53373
53677
  children: [
53374
- 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") }),
53375
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 ?? "" }),
53376
- 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") })
53377
53681
  ]
53378
53682
  }
53379
53683
  ) })
@@ -56694,6 +56998,7 @@ function BrowserPlayground({
56694
56998
 
56695
56999
  // components/avl/molecules/OrbPreviewNode.tsx
56696
57000
  init_useEventBus();
57001
+ init_useTranslate();
56697
57002
 
56698
57003
  // components/avl/molecules/useCanvasDnd.tsx
56699
57004
  init_useEventBus();
@@ -57181,6 +57486,7 @@ var OrbPreviewNodeInner = (props) => {
57181
57486
  const screenSize = React97.useContext(ScreenSizeContext);
57182
57487
  const preset = SCREEN_SIZE_PRESETS[screenSize];
57183
57488
  const { select } = React97.useContext(PatternSelectionContext);
57489
+ const { t } = useTranslate();
57184
57490
  const eventBus = useEventBus();
57185
57491
  const reactFlow = react.useReactFlow();
57186
57492
  const contentRef = React97.useRef(null);
@@ -57201,7 +57507,7 @@ var OrbPreviewNodeInner = (props) => {
57201
57507
  const isSuccess = status === "success";
57202
57508
  const isError = status === "error";
57203
57509
  const label = isImportedGroup ? data.behaviorAlias ?? "" : isExpanded ? `${data.transitionEvent ?? ""}` : data.orbitalName;
57204
- 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 ?? "";
57205
57511
  const orbitalSchema = React97.useMemo(() => {
57206
57512
  const fullSchema = data._fullSchema;
57207
57513
  if (!fullSchema) return void 0;
@@ -57369,7 +57675,7 @@ var OrbPreviewNodeInner = (props) => {
57369
57675
  color: "var(--color-muted-foreground)",
57370
57676
  zIndex: 3
57371
57677
  },
57372
- children: "Preview"
57678
+ children: t("orbPreview.previewBadge")
57373
57679
  }
57374
57680
  ),
57375
57681
  hovered && !dragActive && !l1IsOver && /* @__PURE__ */ jsxRuntime.jsx(
@@ -57391,7 +57697,7 @@ var OrbPreviewNodeInner = (props) => {
57391
57697
  },
57392
57698
  children: [
57393
57699
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 12 }, children: "\u279E" }),
57394
- "Double-click to open"
57700
+ t("orbPreview.doubleClickToOpen")
57395
57701
  ]
57396
57702
  }
57397
57703
  )
@@ -57414,7 +57720,7 @@ var OrbPreviewNodeInner = (props) => {
57414
57720
  color: "var(--color-primary-foreground)",
57415
57721
  boxShadow: "var(--shadow-lg)"
57416
57722
  },
57417
- children: "Drop to add and open"
57723
+ children: t("orbPreview.dropToAddAndOpen")
57418
57724
  }
57419
57725
  )
57420
57726
  }
@@ -57448,7 +57754,7 @@ var OrbPreviewNodeInner = (props) => {
57448
57754
  borderTopColor: "transparent",
57449
57755
  zIndex: 2
57450
57756
  },
57451
- title: "Coordinator is dispatching to this orbital"
57757
+ title: t("orbPreview.dispatching")
57452
57758
  }
57453
57759
  )
57454
57760
  ] }),
@@ -57544,7 +57850,7 @@ var OrbPreviewNodeInner = (props) => {
57544
57850
  height: "auto"
57545
57851
  }
57546
57852
  ) })
57547
- ) : /* @__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") }) })
57548
57854
  ]
57549
57855
  }
57550
57856
  ),
@@ -58135,7 +58441,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58135
58441
  const handleRemoveEffect = React97.useCallback((effectIndex) => {
58136
58442
  eventBus.emit("UI:REMOVE_EFFECT", { effectIndex });
58137
58443
  }, [eventBus]);
58138
- const headerTitle = selectedPattern ? selectedPattern.patternType : isExpanded ? transitionEvent || "Transition" : orbitalName;
58444
+ const headerTitle = selectedPattern ? selectedPattern.patternType : isExpanded ? transitionEvent || t("avl.transition") : orbitalName;
58139
58445
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-col bg-card border-l border-border h-full w-full sm:w-[340px]", children: [
58140
58446
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "shrink-0 border-b border-border", children: [
58141
58447
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center justify-between px-4 py-2", children: [
@@ -58152,7 +58458,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58152
58458
  {
58153
58459
  onClick: onClose,
58154
58460
  className: "text-muted-foreground hover:text-foreground text-sm cursor-pointer bg-transparent border-none p-1",
58155
- "aria-label": "Close",
58461
+ "aria-label": t("common.close"),
58156
58462
  children: "\xD7"
58157
58463
  }
58158
58464
  )
@@ -58162,7 +58468,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58162
58468
  {
58163
58469
  onClick: () => setActiveTab(tab),
58164
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"}`,
58165
- children: tab
58471
+ children: t(`orbInspector.tab.${tab}`)
58166
58472
  },
58167
58473
  tab
58168
58474
  )) })
@@ -58208,7 +58514,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58208
58514
  /* ── Inspector Tab ── */
58209
58515
  /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
58210
58516
  selectedPattern && patternDef?.propsSchema && /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "px-4 py-3 border-b border-border/40", children: [
58211
- /* @__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") }),
58212
58518
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex flex-col gap-1.5", children: Object.entries(patternDef.propsSchema).slice(0, 12).map(([propName, propSchema]) => {
58213
58519
  const ps = propSchema;
58214
58520
  const explicitValue = patternConfig ? patternConfig[propName] : void 0;
@@ -58242,7 +58548,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58242
58548
  }) })
58243
58549
  ] }),
58244
58550
  userType === "architect" && (selectedPattern && isEntityPattern || !selectedPattern && !isExpanded) && entity && /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "px-4 py-3 border-b border-border/40", children: [
58245
- /* @__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") }),
58246
58552
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-2 mb-2", children: [
58247
58553
  /* @__PURE__ */ jsxRuntime.jsx("svg", { width: 14, height: 14, children: /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: 7, cy: 7, r: 5, fill: "var(--color-primary)" }) }),
58248
58554
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "font-semibold text-xs", children: entity.name }),
@@ -58285,7 +58591,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58285
58591
  ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
58286
58592
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-xs font-mono flex-1", children: f3.name }),
58287
58593
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs", children: f3.type }),
58288
- 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") })
58289
58595
  ] })
58290
58596
  ] }, f3.name)) }),
58291
58597
  editable && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -58297,13 +58603,13 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58297
58603
  className: "mt-2 text-xs w-full",
58298
58604
  children: [
58299
58605
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", size: "xs", className: "mr-1" }),
58300
- t("Add Field")
58606
+ t("orbInspector.addField")
58301
58607
  ]
58302
58608
  }
58303
58609
  )
58304
58610
  ] }),
58305
58611
  editable && !selectedPattern && !isExpanded && node.layer === "Services" && /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "px-4 py-3 border-b border-border/40", children: [
58306
- /* @__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") }),
58307
58613
  /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", className: "items-center", children: [
58308
58614
  /* @__PURE__ */ jsxRuntime.jsxs(
58309
58615
  Button,
@@ -58316,7 +58622,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58316
58622
  },
58317
58623
  children: [
58318
58624
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "monitor", size: "xs", className: "mr-1" }),
58319
- t("Standalone")
58625
+ t("orbInspector.standalone")
58320
58626
  ]
58321
58627
  }
58322
58628
  ),
@@ -58331,25 +58637,22 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58331
58637
  },
58332
58638
  children: [
58333
58639
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "cpu", size: "xs", className: "mr-1" }),
58334
- t("Embedded")
58640
+ t("orbInspector.embedded")
58335
58641
  ]
58336
58642
  }
58337
58643
  )
58338
58644
  ] }),
58339
- /* @__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") })
58340
58646
  ] }),
58341
58647
  !selectedPattern && !isExpanded && traits2.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "px-4 py-3 border-b border-border/40", children: [
58342
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: "Traits" }),
58343
- /* @__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: [
58344
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-xs font-semibold", children: t2.name }),
58345
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-muted-foreground text-xs", children: [
58346
- t2.stateCount,
58347
- " states"
58348
- ] })
58349
- ] }, 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)) })
58350
58653
  ] }),
58351
58654
  isExpanded && fromState && toState && /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "px-4 py-3 border-b border-border/40", children: [
58352
- /* @__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") }),
58353
58656
  /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "100%", height: 44, viewBox: "0 0 280 44", children: [
58354
58657
  /* @__PURE__ */ jsxRuntime.jsx(exports.AvlState, { x: 8, y: 8, name: fromState, role: getStateRole(fromState), width: 90, height: 26 }),
58355
58658
  /* @__PURE__ */ jsxRuntime.jsx("line", { x1: 104, y1: 21, x2: 158, y2: 21, stroke: "#1E293B", strokeWidth: 2, markerEnd: "url(#orb-arrow)" }),
@@ -58358,7 +58661,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58358
58661
  ] }),
58359
58662
  traitName && /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-muted-foreground text-xs", children: [
58360
58663
  traitName,
58361
- entityName ? ` on ${entityName}` : ""
58664
+ entityName ? t("orbInspector.onEntity", { entity: entityName }) : ""
58362
58665
  ] })
58363
58666
  ] }),
58364
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: [
@@ -58371,7 +58674,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58371
58674
  Input,
58372
58675
  {
58373
58676
  defaultValue: formatExpression(transition?.guard ?? guard),
58374
- placeholder: t("Guard expression"),
58677
+ placeholder: t("orbInspector.guardExpression"),
58375
58678
  className: "flex-1 text-xs font-mono h-6",
58376
58679
  onBlur: (e) => handleGuardChange(e.target.value)
58377
58680
  }
@@ -58379,7 +58682,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58379
58682
  ] }) }),
58380
58683
  userType === "architect" && (effectTypes.length > 0 || editable) && isExpanded && /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "px-4 py-3 border-b border-border/40", children: [
58381
58684
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: [
58382
- t("Effects"),
58685
+ t("avl.effects"),
58383
58686
  " (",
58384
58687
  effectTypes.length,
58385
58688
  ")"
@@ -58436,7 +58739,7 @@ function AddEffectButton({ onAdd }) {
58436
58739
  className: "text-xs w-full",
58437
58740
  children: [
58438
58741
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", size: "xs", className: "mr-1" }),
58439
- t("Add Effect")
58742
+ t("orbInspector.addEffect")
58440
58743
  ]
58441
58744
  }
58442
58745
  ),
@@ -58497,7 +58800,7 @@ var PHASE_2_TOKEN_FALLBACK = {
58497
58800
  function StylesTab({ patternType, patternDef, patternConfig, editable, onPropChange, themeManifest, isDesignSystem }) {
58498
58801
  const { t } = useTranslate();
58499
58802
  if (!patternType) {
58500
- 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") }) });
58501
58804
  }
58502
58805
  const tier = patternDef?.category ?? "Pattern";
58503
58806
  const tokens = PHASE_2_TOKEN_FALLBACK[patternType] ?? [];
@@ -58518,11 +58821,11 @@ function StylesTab({ patternType, patternDef, patternConfig, editable, onPropCha
58518
58821
  )
58519
58822
  ] }),
58520
58823
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { children: [
58521
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("Tokens") }),
58522
- 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)) })
58523
58826
  ] }),
58524
58827
  variantEnum && variantEnum.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(Box, { children: [
58525
- /* @__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") }),
58526
58829
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex flex-wrap gap-1", children: variantEnum.map((variant) => {
58527
58830
  const isActive = variant === currentVariant || !currentVariant && variant === "default";
58528
58831
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -58542,7 +58845,7 @@ function StylesTab({ patternType, patternDef, patternConfig, editable, onPropCha
58542
58845
  }) })
58543
58846
  ] }),
58544
58847
  sizeEnum && sizeEnum.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(Box, { children: [
58545
- /* @__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") }),
58546
58849
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex flex-wrap gap-1", children: sizeEnum.map((size) => {
58547
58850
  const isActive = size === currentSize || !currentSize && size === "md";
58548
58851
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -58565,20 +58868,21 @@ function StylesTab({ patternType, patternDef, patternConfig, editable, onPropCha
58565
58868
  ] });
58566
58869
  }
58567
58870
  var TOKEN_GROUPS = [
58568
- { group: "colors", label: "Colors" },
58569
- { group: "radii", label: "Radii" },
58570
- { group: "spacing", label: "Spacing" },
58571
- { 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" }
58572
58875
  ];
58573
58876
  function TokenEditorSection({ themeManifest, onPropChange }) {
58877
+ const { t } = useTranslate();
58574
58878
  const tokens = themeManifest.tokens ?? {};
58575
58879
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-col gap-3 pt-2 border-t border-border/40", children: [
58576
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-xs uppercase tracking-wider text-muted-foreground", children: "Project theme tokens" }),
58577
- 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 }) => {
58578
58882
  const entries = Object.entries(tokens[group] ?? {});
58579
58883
  if (entries.length === 0) return null;
58580
58884
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-col gap-1.5", children: [
58581
- /* @__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) }),
58582
58886
  entries.map(([key, value]) => /* @__PURE__ */ jsxRuntime.jsx(
58583
58887
  TokenRow,
58584
58888
  {
@@ -58626,6 +58930,7 @@ init_Typography();
58626
58930
  init_Badge();
58627
58931
 
58628
58932
  // components/avl/organisms/AvlTraitScene.tsx
58933
+ init_useTranslate();
58629
58934
  init_AvlState();
58630
58935
  init_AvlTransitionLane();
58631
58936
  init_AvlSwimLane();
@@ -58639,6 +58944,7 @@ var AvlTraitScene = ({
58639
58944
  color = "var(--color-primary)",
58640
58945
  onTransitionClick
58641
58946
  }) => {
58947
+ const { t } = useTranslate();
58642
58948
  const [layout, setLayout] = React97.useState(null);
58643
58949
  const dataKey = React97.useMemo(() => JSON.stringify(data), [data]);
58644
58950
  React97.useEffect(() => {
@@ -58647,7 +58953,7 @@ var AvlTraitScene = ({
58647
58953
  });
58648
58954
  }, [dataKey]);
58649
58955
  if (!layout) {
58650
- 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") }) });
58651
58957
  }
58652
58958
  const hasExternal = data.listenedEvents.length > 0 || data.emittedEvents.length > 0;
58653
58959
  const machineOffsetX = hasExternal ? 0 : 30;
@@ -58662,10 +58968,7 @@ var AvlTraitScene = ({
58662
58968
  const machineHeight = scaledH + 100;
58663
58969
  const renderMachine = /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
58664
58970
  /* @__PURE__ */ jsxRuntime.jsx("text", { x: CENTER_W2 / 2, y: 20, textAnchor: "middle", fill: color, fontSize: 20, fontWeight: "700", fontFamily: "inherit", children: data.name }),
58665
- /* @__PURE__ */ jsxRuntime.jsxs("text", { x: CENTER_W2 / 2, y: 38, textAnchor: "middle", fill: color, fontSize: 11, opacity: 0.5, fontFamily: "inherit", children: [
58666
- "linked to ",
58667
- data.linkedEntity
58668
- ] }),
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 }) }),
58669
58972
  /* @__PURE__ */ jsxRuntime.jsxs("defs", { children: [
58670
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 }) }),
58671
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 }) })
@@ -58740,6 +59043,9 @@ var AvlTraitScene = ({
58740
59043
  );
58741
59044
  };
58742
59045
  AvlTraitScene.displayName = "AvlTraitScene";
59046
+
59047
+ // components/avl/molecules/TraitCardNode.tsx
59048
+ init_useTranslate();
58743
59049
  var TraitCardSelectionContext = React97.createContext({
58744
59050
  selectTransition: () => {
58745
59051
  }
@@ -58749,6 +59055,7 @@ var SCENE_WIDTH = 600;
58749
59055
  var SCENE_HEIGHT = 400;
58750
59056
  var TraitCardNodeInner = (props) => {
58751
59057
  const data = props.data;
59058
+ const { t } = useTranslate();
58752
59059
  const { selectTransition } = React97.useContext(TraitCardSelectionContext);
58753
59060
  const orbitalName = data.orbitalName;
58754
59061
  const traitName = data.traitName ?? "";
@@ -58774,7 +59081,7 @@ var TraitCardNodeInner = (props) => {
58774
59081
  position: react.Position.Left,
58775
59082
  id: `listen-${event}`,
58776
59083
  style: { top: `${(i + 1) / (listens.length + 1) * 100}%` },
58777
- "aria-label": `listens for ${event}`
59084
+ "aria-label": t("avl.listensFor", { event })
58778
59085
  },
58779
59086
  `listen-${event}`
58780
59087
  )),
@@ -58785,7 +59092,7 @@ var TraitCardNodeInner = (props) => {
58785
59092
  position: react.Position.Right,
58786
59093
  id: `emit-${event}`,
58787
59094
  style: { top: `${(i + 1) / (emits.length + 1) * 100}%` },
58788
- "aria-label": `emits ${event}`
59095
+ "aria-label": t("avl.emits", { event })
58789
59096
  },
58790
59097
  `emit-${event}`
58791
59098
  )),
@@ -58812,14 +59119,14 @@ var TraitCardNodeInner = (props) => {
58812
59119
  {
58813
59120
  data: traitLevelData,
58814
59121
  onTransitionClick: (idx) => {
58815
- const t = transitions[idx];
58816
- if (!t) return;
59122
+ const t2 = transitions[idx];
59123
+ if (!t2) return;
58817
59124
  selectTransition({
58818
59125
  orbitalName,
58819
59126
  traitName,
58820
- transitionEvent: t.event,
58821
- fromState: t.fromState,
58822
- toState: t.toState,
59127
+ transitionEvent: t2.event,
59128
+ fromState: t2.fromState,
59129
+ toState: t2.toState,
58823
59130
  index: idx
58824
59131
  });
58825
59132
  }
@@ -58827,7 +59134,7 @@ var TraitCardNodeInner = (props) => {
58827
59134
  )
58828
59135
  }
58829
59136
  )
58830
- ) : /* @__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") })
58831
59138
  ] })
58832
59139
  ]
58833
59140
  }
@@ -58838,6 +59145,7 @@ TraitCardNode.displayName = "TraitCardNode";
58838
59145
 
58839
59146
  // components/avl/organisms/FlowCanvas.tsx
58840
59147
  init_useEventBus();
59148
+ init_useTranslate();
58841
59149
  var flowCanvasLog = logger.createLogger("almadar:ui:flow-canvas");
58842
59150
  var NODE_TYPES = {
58843
59151
  preview: OrbPreviewNode,
@@ -58881,6 +59189,7 @@ function FlowCanvasInner({
58881
59189
  userType = "builder",
58882
59190
  themeManifest
58883
59191
  }) {
59192
+ const { t } = useTranslate();
58884
59193
  const NODE_TYPES2 = React97.useMemo(() => ({
58885
59194
  preview: OrbPreviewNode,
58886
59195
  behaviorCompose: BehaviorComposeNode,
@@ -58933,13 +59242,13 @@ function FlowCanvasInner({
58933
59242
  }), [selectedPattern]);
58934
59243
  const [atBehaviorLevel, setAtBehaviorLevel] = React97.useState(composeLevel === "behavior");
58935
59244
  const { composeNodes, composeEdges, overviewNodes, overviewEdges, expandedNodes, expandedEdges, behaviorExpandedNodes, behaviorExpandedEdges, traitExpandedNodes, traitExpandedEdges } = React97.useMemo(() => {
58936
- const t = perfStart("compose-graph");
59245
+ const t2 = perfStart("compose-graph");
58937
59246
  const compose = composeLevel === "behavior" && behaviorEntries?.length ? behaviorsToComposeGraph(behaviorEntries, behaviorWires ?? [], layoutHint) : { nodes: [], edges: [] };
58938
59247
  const overview = schemaToOverviewGraph(parsedSchema, mockData, behaviorMeta, layoutHint, orbitalStatus, screenSize);
58939
59248
  const expanded = expandedOrbital ? orbitalToExpandedGraph(parsedSchema, expandedOrbital, mockData, screenSize) : { nodes: [], edges: [] };
58940
59249
  const behaviorExpanded = expandedOrbital && expandedBehaviorAlias ? orbitalAliasToExpandedGraph(parsedSchema, expandedOrbital, expandedBehaviorAlias, mockData, screenSize) : { nodes: [], edges: [] };
58941
59250
  const traitExpanded = expandedOrbital ? orbitalToTraitGraph(parsedSchema, expandedOrbital) : { nodes: [], edges: [] };
58942
- perfEnd("compose-graph", t, {
59251
+ perfEnd("compose-graph", t2, {
58943
59252
  composeNodes: compose.nodes.length,
58944
59253
  overviewNodes: overview.nodes.length,
58945
59254
  expandedNodes: expanded.nodes.length,
@@ -59192,12 +59501,12 @@ function FlowCanvasInner({
59192
59501
  {
59193
59502
  onClick: handleGoBack,
59194
59503
  className: "text-muted-foreground hover:text-foreground text-sm cursor-pointer bg-transparent border-none p-0",
59195
- "aria-label": "Go back to overview",
59504
+ "aria-label": t("canvas.goBackToOverview"),
59196
59505
  children: "\u2190"
59197
59506
  }
59198
59507
  ),
59199
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "font-medium", children: level === "overview" ? "Overview" : expandedOrbital ?? "Expanded" }),
59200
- /* @__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 }) })
59201
59510
  ] }),
59202
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) => {
59203
59512
  const p2 = SCREEN_SIZE_PRESETS[size];
@@ -59213,7 +59522,7 @@ function FlowCanvasInner({
59213
59522
  },
59214
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"}`,
59215
59524
  title: `${p2.label} (${p2.width}px)`,
59216
- "aria-label": `Switch to ${p2.label} view`,
59525
+ "aria-label": t("canvas.switchToView", { label: p2.label }),
59217
59526
  children: p2.label
59218
59527
  },
59219
59528
  size
@@ -59595,6 +59904,7 @@ init_Stack();
59595
59904
  init_Typography();
59596
59905
  init_Button();
59597
59906
  init_Icon();
59907
+ init_useTranslate();
59598
59908
  var UNIT_DISPLAY_W = 240;
59599
59909
  var UNIT_DISPLAY_H = 160;
59600
59910
  function layoutOrbitals(count, containerW, containerH) {
@@ -59785,6 +60095,7 @@ var AvlOrbitalsCosmicZoom = ({
59785
60095
  minZoom = 0.4,
59786
60096
  maxZoom = 3
59787
60097
  }) => {
60098
+ const { t } = useTranslate();
59788
60099
  const parsedSchema = React97.useMemo(() => {
59789
60100
  if (typeof schemaProp === "string") return JSON.parse(schemaProp);
59790
60101
  return schemaProp;
@@ -59852,9 +60163,9 @@ var AvlOrbitalsCosmicZoom = ({
59852
60163
  (ctx) => {
59853
60164
  if (ctx.level !== "transition" || !ctx.trait || !ctx.transition) return;
59854
60165
  const orbital = parsedSchema.orbitals?.find((o) => o.name === ctx.orbital);
59855
- 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);
59856
60167
  if (!traitRef || !core.isInlineTrait(traitRef)) return;
59857
- 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;
59858
60169
  if (idx < 0) return;
59859
60170
  dispatch({ type: "SELECT_TRAIT", trait: ctx.trait });
59860
60171
  dispatch({ type: "ZOOM_INTO_TRANSITION", transitionIndex: idx, targetPosition: { x: 0, y: 0 } });
@@ -60030,7 +60341,7 @@ var AvlOrbitalsCosmicZoom = ({
60030
60341
  borderRadius: 4,
60031
60342
  opacity: 0.8
60032
60343
  },
60033
- 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") })
60034
60345
  }
60035
60346
  ),
60036
60347
  state.level === "application" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -60082,7 +60393,7 @@ var AvlOrbitalsCosmicZoom = ({
60082
60393
  onKeyDown: (e) => {
60083
60394
  if (e.key === "Enter" || e.key === " ") handleSelect(view.name);
60084
60395
  },
60085
- "aria-label": `Orbital: ${view.name}${isHighlighted ? " (highlighted)" : ""}`,
60396
+ "aria-label": isHighlighted ? t("avl.orbitalLabelHighlighted", { name: view.name }) : t("avl.orbitalLabel", { name: view.name }),
60086
60397
  position: "absolute",
60087
60398
  style: {
60088
60399
  left: view.cx - UNIT_DISPLAY_W / 2,
@@ -60130,9 +60441,9 @@ var AvlOrbitalsCosmicZoom = ({
60130
60441
  zIndex: 30
60131
60442
  },
60132
60443
  children: [
60133
- /* @__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" }) }),
60134
- /* @__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" }) }),
60135
- /* @__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" }) })
60136
60447
  ]
60137
60448
  }
60138
60449
  )