@almadar/ui 5.21.8 → 5.21.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3900,6 +3900,504 @@ 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
+ "relationSelect.selectPlaceholder": "Select..."
4378
+ };
4379
+ }
4380
+ });
4381
+ function useTranslate() {
4382
+ return React97.useContext(I18nContext);
4383
+ }
4384
+ var _meta, coreMessages, coreLocale, I18nContext;
4385
+ var init_useTranslate = __esm({
4386
+ "hooks/useTranslate.ts"() {
4387
+ "use client";
4388
+ init_en();
4389
+ ({ $meta: _meta, ...coreMessages } = en_default);
4390
+ coreLocale = coreMessages;
4391
+ I18nContext = React97.createContext({
4392
+ locale: "en",
4393
+ direction: "ltr",
4394
+ t: (key) => coreLocale[key] ?? key
4395
+ // core locale fallback
4396
+ });
4397
+ I18nContext.displayName = "I18nContext";
4398
+ I18nContext.Provider;
4399
+ }
4400
+ });
3903
4401
  var MAX_VISIBLE_EFFECTS; exports.AvlTransitionLane = void 0;
3904
4402
  var init_AvlTransitionLane = __esm({
3905
4403
  "components/avl/molecules/AvlTransitionLane.tsx"() {
@@ -4529,6 +5027,7 @@ var log2, SWIM_GUTTER, CENTER_W; exports.BehaviorView = void 0;
4529
5027
  var init_BehaviorView = __esm({
4530
5028
  "components/avl/molecules/BehaviorView.tsx"() {
4531
5029
  "use client";
5030
+ init_useTranslate();
4532
5031
  init_AvlState();
4533
5032
  init_AvlTransitionLane();
4534
5033
  init_AvlSwimLane();
@@ -4538,6 +5037,7 @@ var init_BehaviorView = __esm({
4538
5037
  SWIM_GUTTER = 120;
4539
5038
  CENTER_W = 360;
4540
5039
  exports.BehaviorView = ({ data }) => {
5040
+ const { t } = useTranslate();
4541
5041
  const [layout, setLayout] = React97.useState(null);
4542
5042
  const traitName = data.traits[0]?.name;
4543
5043
  const traitData = traitName ? data.traitDetails[traitName] : void 0;
@@ -4547,10 +5047,10 @@ var init_BehaviorView = __esm({
4547
5047
  computeTraitLayout(traitData).then(setLayout).catch((err) => log2.error("compute-trait-layout-failed", { error: err instanceof Error ? err : String(err) }));
4548
5048
  }, [dataKey]);
4549
5049
  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" });
5050
+ 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
5051
  }
4552
5052
  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..." });
5053
+ 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
5054
  }
4555
5055
  const hasExternal = traitData.listenedEvents.length > 0 || traitData.emittedEvents.length > 0;
4556
5056
  const viewW = hasExternal ? SWIM_GUTTER + CENTER_W + SWIM_GUTTER : CENTER_W + 60;
@@ -4566,10 +5066,7 @@ var init_BehaviorView = __esm({
4566
5066
  const machineHeight = scaledH + 100;
4567
5067
  const renderMachine = /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
4568
5068
  /* @__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
- ] }),
5069
+ /* @__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
5070
  /* @__PURE__ */ jsxRuntime.jsxs("defs", { children: [
4574
5071
  /* @__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
5072
  /* @__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 +6868,6 @@ var init_Overlay = __esm({
6371
6868
  };
6372
6869
  }
6373
6870
  });
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
6871
  var sizeClasses2, minWidthClasses, lookStyles, Modal;
6579
6872
  var init_Modal = __esm({
6580
6873
  "components/core/molecules/Modal.tsx"() {
@@ -9553,6 +9846,7 @@ var init_LawReferenceTooltip = __esm({
9553
9846
  init_Typography();
9554
9847
  init_Divider();
9555
9848
  init_cn();
9849
+ init_useTranslate();
9556
9850
  positionStyles2 = {
9557
9851
  top: "bottom-full left-1/2 -translate-x-1/2 mb-2",
9558
9852
  bottom: "top-full left-1/2 -translate-x-1/2 mt-2",
@@ -9571,6 +9865,7 @@ var init_LawReferenceTooltip = __esm({
9571
9865
  position = "top",
9572
9866
  className
9573
9867
  }) => {
9868
+ const { t } = useTranslate();
9574
9869
  const [isVisible, setIsVisible] = React97__namespace.default.useState(false);
9575
9870
  const timeoutRef = React97__namespace.default.useRef(null);
9576
9871
  const handleMouseEnter = () => {
@@ -9654,7 +9949,7 @@ var init_LawReferenceTooltip = __esm({
9654
9949
  target: "_blank",
9655
9950
  rel: "noopener noreferrer",
9656
9951
  onClick: (e) => e.stopPropagation(),
9657
- children: "View full law text"
9952
+ children: t("lawReference.viewFullText")
9658
9953
  }
9659
9954
  )
9660
9955
  ] }),
@@ -17142,7 +17437,7 @@ var init_CodeBlock = __esm({
17142
17437
  const isLolo = language === "lolo";
17143
17438
  const activeStyle = isOrb ? orbStyle : isLolo ? loloStyle : dark__default.default;
17144
17439
  const eventBus = useEventBus();
17145
- const { t: _t } = useTranslate();
17440
+ const { t } = useTranslate();
17146
17441
  const scrollRef = React97.useRef(null);
17147
17442
  const codeRef = React97.useRef(null);
17148
17443
  const savedScrollLeftRef = React97.useRef(0);
@@ -17397,7 +17692,7 @@ var init_CodeBlock = __esm({
17397
17692
  size: "sm",
17398
17693
  onClick: handleCopy,
17399
17694
  className: "opacity-0 group-hover:opacity-100 focus:opacity-100 transition-opacity text-muted-foreground hover:text-white",
17400
- "aria-label": "Copy code",
17695
+ "aria-label": t("common.copy"),
17401
17696
  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
17697
  }
17403
17698
  )
@@ -18052,7 +18347,7 @@ var init_StateMachineView = __esm({
18052
18347
  const endX2 = fromState.x + Math.cos(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
18053
18348
  const endY2 = fromState.y + Math.sin(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
18054
18349
  const isSingle2 = bundle.labels.length === 1;
18055
- const labelText2 = isSingle2 ? bundle.labels[0].event : `${bundle.labels.length} events`;
18350
+ const labelText2 = isSingle2 ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
18056
18351
  const bundleColor2 = isSingle2 ? config.colors.arrow : "var(--color-accent)";
18057
18352
  const labelWidth2 = labelText2.length * 9 + (isSingle2 ? 24 : 40);
18058
18353
  const cx = fromState.x;
@@ -18178,7 +18473,7 @@ var init_StateMachineView = __esm({
18178
18473
  const controlX = midX + perpX;
18179
18474
  const controlY = midY + perpY;
18180
18475
  const isSingle = bundle.labels.length === 1;
18181
- const labelText = isSingle ? bundle.labels[0].event : `${bundle.labels.length} events`;
18476
+ const labelText = isSingle ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
18182
18477
  const labelWidth = labelText.length * 9 + (isSingle ? 24 : 40);
18183
18478
  const bundleColor = isSingle ? config.colors.arrow : "var(--color-accent)";
18184
18479
  const curveMidpoint = {
@@ -18333,7 +18628,7 @@ var init_StateMachineView = __esm({
18333
18628
  {
18334
18629
  className: "absolute -top-2 left-1/2 transform -translate-x-1/2 px-2 py-0.5 rounded-full",
18335
18630
  style: { backgroundColor: "var(--color-success)" },
18336
- children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: "Pinned" })
18631
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: t("stateMachine.pinned") })
18337
18632
  }
18338
18633
  ),
18339
18634
  !isSingle && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -18355,10 +18650,7 @@ var init_StateMachineView = __esm({
18355
18650
  {
18356
18651
  className: "ml-2 px-2 py-0.5 rounded-full",
18357
18652
  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
- ] })
18653
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: t("stateMachine.eventCount", { count: bundle.labels.length }) })
18362
18654
  }
18363
18655
  )
18364
18656
  ]
@@ -18503,7 +18795,7 @@ var init_StateMachineView = __esm({
18503
18795
  align: "center",
18504
18796
  className: "mb-2",
18505
18797
  style: { color: "var(--color-warning)", fontSize: "13px" },
18506
- children: "External Effects"
18798
+ children: t("stateMachine.externalEffects")
18507
18799
  }
18508
18800
  ),
18509
18801
  outputs.outputs.map((output, idx) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -18523,10 +18815,10 @@ var init_StateMachineView = __esm({
18523
18815
  Legend = ({ config, y }) => {
18524
18816
  const { t } = useTranslate();
18525
18817
  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)" }
18818
+ { key: "initial", label: t("stateMachine.legend.initial"), color: config.colors.initialNode, isMultiEvent: false },
18819
+ { key: "final", label: t("stateMachine.legend.final"), color: config.colors.finalNode, isMultiEvent: false },
18820
+ { key: "state", label: t("stateMachine.legend.state"), color: config.colors.nodeBorder, isMultiEvent: false },
18821
+ { key: "multiEvent", label: t("stateMachine.legend.multiEvent"), color: "var(--color-accent)", isMultiEvent: true }
18530
18822
  ];
18531
18823
  return /* @__PURE__ */ jsxRuntime.jsx(
18532
18824
  HStack,
@@ -18541,8 +18833,8 @@ var init_StateMachineView = __esm({
18541
18833
  {
18542
18834
  className: "w-3 h-3 rounded-full",
18543
18835
  style: {
18544
- backgroundColor: item.label === "Multi-event" ? item.color : config.colors.node,
18545
- border: item.label !== "Multi-event" ? `2px solid ${item.color}` : "none"
18836
+ backgroundColor: item.isMultiEvent ? item.color : config.colors.node,
18837
+ border: !item.isMultiEvent ? `2px solid ${item.color}` : "none"
18546
18838
  }
18547
18839
  }
18548
18840
  ),
@@ -18554,7 +18846,7 @@ var init_StateMachineView = __esm({
18554
18846
  children: item.label
18555
18847
  }
18556
18848
  )
18557
- ] }, item.label))
18849
+ ] }, item.key))
18558
18850
  }
18559
18851
  );
18560
18852
  };
@@ -19348,13 +19640,13 @@ var init_JazariStateMachine = __esm({
19348
19640
  );
19349
19641
  }, [resolvedTrait, entityFields]);
19350
19642
  if (isLoading) {
19351
- return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: "Loading state machine\u2026" });
19643
+ return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: t("stateMachine.loading") });
19352
19644
  }
19353
19645
  if (error) {
19354
19646
  return /* @__PURE__ */ jsxRuntime.jsx(ErrorState, { message: error instanceof Error ? error.message : String(error) });
19355
19647
  }
19356
19648
  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" }) });
19649
+ 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
19650
  }
19359
19651
  return /* @__PURE__ */ jsxRuntime.jsx(
19360
19652
  StateMachineView,
@@ -20398,13 +20690,13 @@ var init_LayoutPatterns = __esm({
20398
20690
  function generateRuleId() {
20399
20691
  return `rule-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
20400
20692
  }
20401
- function questionsToOptions(questions, includeEndOfSurvey) {
20693
+ function questionsToOptions(questions, endOfSurveyLabel) {
20402
20694
  const opts = questions.map((q) => ({
20403
20695
  value: q.id,
20404
20696
  label: q.label
20405
20697
  }));
20406
- if (includeEndOfSurvey) {
20407
- opts.push({ value: END_OF_SURVEY, label: "End of survey" });
20698
+ if (endOfSurveyLabel !== null) {
20699
+ opts.push({ value: END_OF_SURVEY, label: endOfSurveyLabel });
20408
20700
  }
20409
20701
  return opts;
20410
20702
  }
@@ -20413,7 +20705,7 @@ function isRuleBroken(rule, questions) {
20413
20705
  const targetExists = rule.targetQuestionId === END_OF_SURVEY || questions.some((q) => q.id === rule.targetQuestionId);
20414
20706
  return !sourceExists || !targetExists;
20415
20707
  }
20416
- var END_OF_SURVEY, OPERATOR_OPTIONS, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph, BranchingLogicBuilder;
20708
+ var END_OF_SURVEY, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph, BranchingLogicBuilder;
20417
20709
  var init_BranchingLogicBuilder = __esm({
20418
20710
  "components/core/molecules/BranchingLogicBuilder.tsx"() {
20419
20711
  "use client";
@@ -20426,14 +20718,9 @@ var init_BranchingLogicBuilder = __esm({
20426
20718
  init_FilterPill();
20427
20719
  init_Box();
20428
20720
  init_useEventBus();
20721
+ init_useTranslate();
20429
20722
  init_cn();
20430
20723
  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
20724
  RuleRow = ({
20438
20725
  rule,
20439
20726
  questions,
@@ -20442,8 +20729,21 @@ var init_BranchingLogicBuilder = __esm({
20442
20729
  onChange,
20443
20730
  onDelete
20444
20731
  }) => {
20445
- const sourceOptions = React97.useMemo(() => questionsToOptions(questions, false), [questions]);
20446
- const targetOptions = React97.useMemo(() => questionsToOptions(questions, true), [questions]);
20732
+ const { t } = useTranslate();
20733
+ const operatorOptions = React97.useMemo(
20734
+ () => [
20735
+ { value: "equals", label: t("branchingLogic.operatorEquals") },
20736
+ { value: "not-equals", label: t("branchingLogic.operatorNotEquals") },
20737
+ { value: "contains", label: t("branchingLogic.operatorContains") },
20738
+ { value: "in", label: t("branchingLogic.operatorIn") }
20739
+ ],
20740
+ [t]
20741
+ );
20742
+ const sourceOptions = React97.useMemo(() => questionsToOptions(questions, null), [questions]);
20743
+ const targetOptions = React97.useMemo(
20744
+ () => questionsToOptions(questions, t("branchingLogic.endOfSurvey")),
20745
+ [questions, t]
20746
+ );
20447
20747
  const sourceQuestion = questions.find((q) => q.id === rule.sourceQuestionId);
20448
20748
  const valueOptions = React97.useMemo(() => {
20449
20749
  if (!sourceQuestion?.optionValues) return [];
@@ -20488,22 +20788,22 @@ var init_BranchingLogicBuilder = __esm({
20488
20788
  ),
20489
20789
  children: [
20490
20790
  /* @__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" }),
20791
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "semibold", className: "shrink-0", children: t("branchingLogic.if") }),
20492
20792
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsxRuntime.jsx(
20493
20793
  Select,
20494
20794
  {
20495
20795
  options: sourceOptions,
20496
20796
  value: rule.sourceQuestionId,
20497
- placeholder: "Select question",
20797
+ placeholder: t("branchingLogic.selectQuestion"),
20498
20798
  onChange: handleSource,
20499
20799
  disabled: readOnly,
20500
- error: broken ? "Broken reference" : void 0
20800
+ error: broken ? t("branchingLogic.brokenReference") : void 0
20501
20801
  }
20502
20802
  ) }),
20503
20803
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[8rem] basis-32", children: /* @__PURE__ */ jsxRuntime.jsx(
20504
20804
  Select,
20505
20805
  {
20506
- options: OPERATOR_OPTIONS,
20806
+ options: operatorOptions,
20507
20807
  value: rule.operator,
20508
20808
  onChange: handleOperator,
20509
20809
  disabled: readOnly
@@ -20526,7 +20826,7 @@ var init_BranchingLogicBuilder = __esm({
20526
20826
  {
20527
20827
  options: valueOptions.filter((o) => !chips.includes(o.value)),
20528
20828
  value: "",
20529
- placeholder: "Add value",
20829
+ placeholder: t("branchingLogic.addValue"),
20530
20830
  onChange: handleAddChip,
20531
20831
  disabled: readOnly
20532
20832
  }
@@ -20534,7 +20834,7 @@ var init_BranchingLogicBuilder = __esm({
20534
20834
  Input,
20535
20835
  {
20536
20836
  inputType: "text",
20537
- placeholder: "Type value, press Enter",
20837
+ placeholder: t("branchingLogic.typeValuePressEnter"),
20538
20838
  value: "",
20539
20839
  onKeyDown: (e) => {
20540
20840
  if (e.key !== "Enter") return;
@@ -20552,7 +20852,7 @@ var init_BranchingLogicBuilder = __esm({
20552
20852
  {
20553
20853
  options: valueOptions,
20554
20854
  value: scalarValue,
20555
- placeholder: "Select value",
20855
+ placeholder: t("branchingLogic.selectValue"),
20556
20856
  onChange: (e) => onChange({ ...rule, value: e.target.value }),
20557
20857
  disabled: readOnly
20558
20858
  }
@@ -20560,7 +20860,7 @@ var init_BranchingLogicBuilder = __esm({
20560
20860
  Input,
20561
20861
  {
20562
20862
  inputType: "text",
20563
- placeholder: "Value",
20863
+ placeholder: t("branchingLogic.value"),
20564
20864
  value: scalarValue,
20565
20865
  onChange: handleScalarValue,
20566
20866
  disabled: readOnly
@@ -20568,17 +20868,17 @@ var init_BranchingLogicBuilder = __esm({
20568
20868
  ) }),
20569
20869
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "label", weight: "semibold", className: "shrink-0 inline-flex items-center gap-1", children: [
20570
20870
  /* @__PURE__ */ jsxRuntime.jsx(LucideIcons2.ArrowRight, { className: "h-4 w-4" }),
20571
- "go to"
20871
+ t("branchingLogic.goTo")
20572
20872
  ] }),
20573
20873
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsxRuntime.jsx(
20574
20874
  Select,
20575
20875
  {
20576
20876
  options: targetOptions,
20577
20877
  value: rule.targetQuestionId,
20578
- placeholder: "Select target",
20878
+ placeholder: t("branchingLogic.selectTarget"),
20579
20879
  onChange: handleTarget,
20580
20880
  disabled: readOnly,
20581
- error: broken && rule.targetQuestionId !== END_OF_SURVEY ? "Broken reference" : void 0
20881
+ error: broken && rule.targetQuestionId !== END_OF_SURVEY ? t("branchingLogic.brokenReference") : void 0
20582
20882
  }
20583
20883
  ) }),
20584
20884
  !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
@@ -20590,11 +20890,11 @@ var init_BranchingLogicBuilder = __esm({
20590
20890
  action: "DELETE_RULE",
20591
20891
  actionPayload: { ruleId: rule.id },
20592
20892
  onClick: onDelete,
20593
- "aria-label": "Delete rule"
20893
+ "aria-label": t("branchingLogic.deleteRule")
20594
20894
  }
20595
20895
  )
20596
20896
  ] }),
20597
- broken && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "error", size: "sm", label: "Broken reference" })
20897
+ broken && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "error", size: "sm", label: t("branchingLogic.brokenReference") })
20598
20898
  ]
20599
20899
  }
20600
20900
  );
@@ -20604,10 +20904,12 @@ var init_BranchingLogicBuilder = __esm({
20604
20904
  NODE_GAP_Y = 80;
20605
20905
  PADDING = 32;
20606
20906
  LogicGraph = ({ questions, rules }) => {
20907
+ const { t } = useTranslate();
20908
+ const endOfSurveyLabel = t("branchingLogic.endOfSurvey");
20607
20909
  const layout = React97.useMemo(() => {
20608
20910
  const items = [
20609
20911
  ...questions.map((q) => ({ id: q.id, label: q.label, isEnd: false })),
20610
- { id: END_OF_SURVEY, label: "End of survey", isEnd: true }
20912
+ { id: END_OF_SURVEY, label: endOfSurveyLabel, isEnd: true }
20611
20913
  ];
20612
20914
  const positions = {};
20613
20915
  items.forEach((item, i) => {
@@ -20619,14 +20921,14 @@ var init_BranchingLogicBuilder = __esm({
20619
20921
  const width = NODE_WIDTH + PADDING * 2 + 220;
20620
20922
  const height = PADDING * 2 + items.length * (NODE_HEIGHT + NODE_GAP_Y);
20621
20923
  return { items, positions, width, height };
20622
- }, [questions]);
20924
+ }, [questions, endOfSurveyLabel]);
20623
20925
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "overflow-auto rounded-container border border-border bg-card p-2", children: /* @__PURE__ */ jsxRuntime.jsxs(
20624
20926
  "svg",
20625
20927
  {
20626
20928
  width: layout.width,
20627
20929
  height: layout.height,
20628
20930
  role: "img",
20629
- "aria-label": "Branching logic graph",
20931
+ "aria-label": t("branchingLogic.graphAriaLabel"),
20630
20932
  style: { display: "block" },
20631
20933
  children: [
20632
20934
  /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -20734,6 +21036,7 @@ var init_BranchingLogicBuilder = __esm({
20734
21036
  readOnly = false,
20735
21037
  className
20736
21038
  }) => {
21039
+ const { t } = useTranslate();
20737
21040
  const eventBus = useEventBus();
20738
21041
  const questions = Array.isArray(questionsProp) ? questionsProp : [];
20739
21042
  const rulesInitial = Array.isArray(rulesProp) ? rulesProp : [];
@@ -20786,16 +21089,23 @@ var init_BranchingLogicBuilder = __esm({
20786
21089
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-wrap items-center justify-between gap-2", children: [
20787
21090
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-2", children: [
20788
21091
  /* @__PURE__ */ jsxRuntime.jsx(LucideIcons2.GitBranch, { className: "h-5 w-5 text-foreground" }),
20789
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "subheading", weight: "semibold", children: "Branching logic" }),
21092
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "subheading", weight: "semibold", children: t("branchingLogic.title") }),
20790
21093
  /* @__PURE__ */ jsxRuntime.jsx(
20791
21094
  Badge,
20792
21095
  {
20793
21096
  variant: "neutral",
20794
21097
  size: "sm",
20795
- label: `${rules.length} rule${rules.length === 1 ? "" : "s"}`
21098
+ label: rules.length === 1 ? t("branchingLogic.ruleCountOne", { count: rules.length }) : t("branchingLogic.ruleCountOther", { count: rules.length })
20796
21099
  }
20797
21100
  ),
20798
- brokenCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "error", size: "sm", label: `${brokenCount} broken` })
21101
+ brokenCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
21102
+ Badge,
21103
+ {
21104
+ variant: "error",
21105
+ size: "sm",
21106
+ label: t("branchingLogic.brokenCount", { count: brokenCount })
21107
+ }
21108
+ )
20799
21109
  ] }),
20800
21110
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-1 rounded-sm border border-border bg-card p-0.5", children: [
20801
21111
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -20806,7 +21116,7 @@ var init_BranchingLogicBuilder = __esm({
20806
21116
  leftIcon: LucideIcons2.Pencil,
20807
21117
  action: "VIEW_EDIT",
20808
21118
  onClick: () => setView("edit"),
20809
- children: "Rules"
21119
+ children: t("branchingLogic.rules")
20810
21120
  }
20811
21121
  ),
20812
21122
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -20817,13 +21127,13 @@ var init_BranchingLogicBuilder = __esm({
20817
21127
  leftIcon: LucideIcons2.Eye,
20818
21128
  action: "VIEW_GRAPH",
20819
21129
  onClick: () => setView("graph"),
20820
- children: "Logic graph"
21130
+ children: t("branchingLogic.logicGraph")
20821
21131
  }
20822
21132
  )
20823
21133
  ] })
20824
21134
  ] }),
20825
21135
  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(
21136
+ 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
21137
  RuleRow,
20828
21138
  {
20829
21139
  rule,
@@ -20844,7 +21154,7 @@ var init_BranchingLogicBuilder = __esm({
20844
21154
  action: "ADD_RULE",
20845
21155
  onClick: handleAddRule,
20846
21156
  disabled: noQuestions,
20847
- children: "Add rule"
21157
+ children: t("branchingLogic.addRule")
20848
21158
  }
20849
21159
  ) })
20850
21160
  ] }) : /* @__PURE__ */ jsxRuntime.jsx(LogicGraph, { questions, rules })
@@ -21471,7 +21781,7 @@ function CalendarGrid({
21471
21781
  onClick: stepPrev,
21472
21782
  "aria-disabled": !canPrev || void 0,
21473
21783
  "aria-label": t("aria.previousDays"),
21474
- children: "Prev"
21784
+ children: t("nav.previous")
21475
21785
  }
21476
21786
  ),
21477
21787
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground", children: formatDateRange(visibleDays[0], visibleDays[visibleDays.length - 1]) }),
@@ -21484,7 +21794,7 @@ function CalendarGrid({
21484
21794
  onClick: stepNext,
21485
21795
  "aria-disabled": !canNext || void 0,
21486
21796
  "aria-label": t("aria.nextDays"),
21487
- children: "Next"
21797
+ children: t("nav.next")
21488
21798
  }
21489
21799
  )
21490
21800
  ] }),
@@ -23034,7 +23344,7 @@ var init_Pagination = __esm({
23034
23344
  type: "number",
23035
23345
  value: jumpToPage,
23036
23346
  onChange: (e) => setJumpToPage(e.target.value),
23037
- placeholder: "Page",
23347
+ placeholder: t("pagination.jumpPlaceholder"),
23038
23348
  className: "w-20",
23039
23349
  onKeyDown: (e) => {
23040
23350
  if (e.key === "Enter") {
@@ -23172,13 +23482,10 @@ var init_CardGrid = __esm({
23172
23482
  return children;
23173
23483
  }
23174
23484
  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..." }) });
23485
+ 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
23486
  }
23177
23487
  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
- ] }) });
23488
+ 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
23489
  }
23183
23490
  if (normalizedData.length === 0) {
23184
23491
  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 +27351,7 @@ function DataGrid({
27044
27351
  onChange: () => toggleSelection(id),
27045
27352
  onClick: (e) => e.stopPropagation(),
27046
27353
  className: "w-4 h-4 mt-1 flex-shrink-0 accent-primary",
27047
- "aria-label": `Select ${titleValue !== void 0 ? String(titleValue) : "item"}`
27354
+ "aria-label": t("card.selectItem", { item: titleValue !== void 0 ? String(titleValue) : t("card.itemFallback") })
27048
27355
  }
27049
27356
  ),
27050
27357
  /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "xs", className: "flex-1 min-w-0", children: [
@@ -27242,7 +27549,7 @@ function formatDate3(value) {
27242
27549
  if (isNaN(d.getTime())) return String(value);
27243
27550
  return d.toLocaleDateString(void 0, { year: "numeric", month: "short", day: "numeric" });
27244
27551
  }
27245
- function formatValue2(value, format) {
27552
+ function formatValue2(value, format, boolLabels) {
27246
27553
  if (value === void 0 || value === null) return "";
27247
27554
  switch (format) {
27248
27555
  case "date":
@@ -27254,7 +27561,7 @@ function formatValue2(value, format) {
27254
27561
  case "percent":
27255
27562
  return typeof value === "number" ? `${Math.round(value)}%` : String(value);
27256
27563
  case "boolean":
27257
- return value ? "Yes" : "No";
27564
+ return value ? boolLabels?.yes ?? "Yes" : boolLabels?.no ?? "No";
27258
27565
  default:
27259
27566
  return String(value);
27260
27567
  }
@@ -27550,7 +27857,7 @@ function DataList({
27550
27857
  field.label ?? fieldLabel3(field.name),
27551
27858
  ":"
27552
27859
  ] }),
27553
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: formatValue2(value, field.format) })
27860
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
27554
27861
  ] }, field.name);
27555
27862
  }) }),
27556
27863
  progressFields.map((field) => {
@@ -27680,6 +27987,7 @@ var init_FileTree = __esm({
27680
27987
  init_Box();
27681
27988
  init_Typography();
27682
27989
  init_Icon();
27990
+ init_useTranslate();
27683
27991
  TreeNodeItem = ({
27684
27992
  node,
27685
27993
  depth,
@@ -27765,8 +28073,9 @@ var init_FileTree = __esm({
27765
28073
  className,
27766
28074
  indent = 16
27767
28075
  }) => {
28076
+ const { t } = useTranslate();
27768
28077
  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" }) });
28078
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "muted", children: t("fileTree.noFiles") }) });
27770
28079
  }
27771
28080
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `py-1 overflow-y-auto ${className ?? ""}`, role: "tree", children: tree.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
27772
28081
  TreeNodeItem,
@@ -27885,6 +28194,7 @@ var init_FilterGroup = __esm({
27885
28194
  init_Icon();
27886
28195
  init_useEventBus();
27887
28196
  init_useQuerySingleton();
28197
+ init_useTranslate();
27888
28198
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
27889
28199
  lookStyles6 = {
27890
28200
  toolbar: "",
@@ -27905,6 +28215,7 @@ var init_FilterGroup = __esm({
27905
28215
  isLoading,
27906
28216
  look = "toolbar"
27907
28217
  }) => {
28218
+ const { t } = useTranslate();
27908
28219
  const eventBus = useEventBus();
27909
28220
  const queryState = useQuerySingleton(query);
27910
28221
  const [selectedValues, setSelectedValues] = React97.useState(
@@ -27986,7 +28297,7 @@ var init_FilterGroup = __esm({
27986
28297
  "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
27987
28298
  !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
27988
28299
  ),
27989
- children: "All"
28300
+ children: t("filterGroup.all")
27990
28301
  }
27991
28302
  ),
27992
28303
  filter.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -28014,7 +28325,7 @@ var init_FilterGroup = __esm({
28014
28325
  size: "sm",
28015
28326
  onClick: handleClearAll,
28016
28327
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
28017
- children: "Clear"
28328
+ children: t("filterGroup.clear")
28018
28329
  }
28019
28330
  )
28020
28331
  ]
@@ -28025,7 +28336,7 @@ var init_FilterGroup = __esm({
28025
28336
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", lookStyles6[look], className), children: [
28026
28337
  showIcon && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
28027
28338
  /* @__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" })
28339
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
28029
28340
  ] }),
28030
28341
  filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
28031
28342
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-xs font-bold text-muted-foreground uppercase tracking-wide", children: filter.label }),
@@ -28048,7 +28359,7 @@ var init_FilterGroup = __esm({
28048
28359
  `${filter.field}_from`,
28049
28360
  e.target.value || null
28050
28361
  ),
28051
- placeholder: "From",
28362
+ placeholder: t("filterGroup.from"),
28052
28363
  clearable: true,
28053
28364
  onClear: () => handleFilterSelect(`${filter.field}_from`, null)
28054
28365
  }
@@ -28062,7 +28373,7 @@ var init_FilterGroup = __esm({
28062
28373
  `${filter.field}_to`,
28063
28374
  e.target.value || null
28064
28375
  ),
28065
- placeholder: "To",
28376
+ placeholder: t("filterGroup.to"),
28066
28377
  clearable: true,
28067
28378
  onClear: () => handleFilterSelect(`${filter.field}_to`, null)
28068
28379
  }
@@ -28082,7 +28393,7 @@ var init_FilterGroup = __esm({
28082
28393
  value: selectedValues[filter.field] || "all",
28083
28394
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
28084
28395
  options: [
28085
- { value: "all", label: "All" },
28396
+ { value: "all", label: t("filterGroup.all") },
28086
28397
  ...filter.options?.map((opt) => ({
28087
28398
  value: opt,
28088
28399
  label: opt
@@ -28099,7 +28410,7 @@ var init_FilterGroup = __esm({
28099
28410
  onClick: handleClearAll,
28100
28411
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
28101
28412
  className: "self-start",
28102
- children: "Clear all"
28413
+ children: t("filterGroup.clearAll")
28103
28414
  }
28104
28415
  )
28105
28416
  ] });
@@ -28165,7 +28476,7 @@ var init_FilterGroup = __esm({
28165
28476
  value: selectedValues[filter.field] || "all",
28166
28477
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
28167
28478
  options: [
28168
- { value: "all", label: `All ${filter.label}` },
28479
+ { value: "all", label: t("filterGroup.allOf", { label: filter.label }) },
28169
28480
  ...filter.options?.map((opt) => ({
28170
28481
  value: opt,
28171
28482
  label: opt
@@ -28194,7 +28505,7 @@ var init_FilterGroup = __esm({
28194
28505
  field
28195
28506
  );
28196
28507
  }),
28197
- /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
28508
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: t("filterGroup.clearAll") })
28198
28509
  ] })
28199
28510
  ]
28200
28511
  }
@@ -28219,7 +28530,7 @@ var init_FilterGroup = __esm({
28219
28530
  className: "text-muted-foreground",
28220
28531
  children: [
28221
28532
  /* @__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" })
28533
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
28223
28534
  ]
28224
28535
  }
28225
28536
  ),
@@ -28245,7 +28556,7 @@ var init_FilterGroup = __esm({
28245
28556
  `${filter.field}_from`,
28246
28557
  e.target.value || null
28247
28558
  ),
28248
- placeholder: "From",
28559
+ placeholder: t("filterGroup.from"),
28249
28560
  clearable: true,
28250
28561
  onClear: () => handleFilterSelect(`${filter.field}_from`, null),
28251
28562
  className: "min-w-[130px]"
@@ -28261,7 +28572,7 @@ var init_FilterGroup = __esm({
28261
28572
  `${filter.field}_to`,
28262
28573
  e.target.value || null
28263
28574
  ),
28264
- placeholder: "To",
28575
+ placeholder: t("filterGroup.to"),
28265
28576
  clearable: true,
28266
28577
  onClear: () => handleFilterSelect(`${filter.field}_to`, null),
28267
28578
  className: "min-w-[130px]"
@@ -28283,7 +28594,7 @@ var init_FilterGroup = __esm({
28283
28594
  value: selectedValues[filter.field] || "all",
28284
28595
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
28285
28596
  options: [
28286
- { value: "all", label: "All" },
28597
+ { value: "all", label: t("filterGroup.all") },
28287
28598
  ...filter.options?.map((opt) => ({
28288
28599
  value: opt,
28289
28600
  label: opt
@@ -28294,10 +28605,7 @@ var init_FilterGroup = __esm({
28294
28605
  )
28295
28606
  ] }, filter.field)),
28296
28607
  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
- ] }),
28608
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "md", children: t("filterGroup.activeCount", { count: activeFilterCount }) }),
28301
28609
  /* @__PURE__ */ jsxRuntime.jsx(
28302
28610
  Button,
28303
28611
  {
@@ -28305,7 +28613,7 @@ var init_FilterGroup = __esm({
28305
28613
  size: "sm",
28306
28614
  onClick: handleClearAll,
28307
28615
  leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
28308
- children: "Clear all"
28616
+ children: t("filterGroup.clearAll")
28309
28617
  }
28310
28618
  )
28311
28619
  ] })
@@ -28534,7 +28842,7 @@ var init_RelationSelect = __esm({
28534
28842
  value,
28535
28843
  onChange,
28536
28844
  options = [],
28537
- placeholder = "Select...",
28845
+ placeholder,
28538
28846
  required = false,
28539
28847
  disabled = false,
28540
28848
  isLoading = false,
@@ -28546,6 +28854,7 @@ var init_RelationSelect = __esm({
28546
28854
  emptyMessage
28547
28855
  }) => {
28548
28856
  const { t } = useTranslate();
28857
+ const resolvedPlaceholder = placeholder ?? t("relationSelect.selectPlaceholder");
28549
28858
  const resolvedSearchPlaceholder = searchPlaceholder ?? t("common.search");
28550
28859
  const resolvedEmptyMessage = emptyMessage ?? t("empty.noOptionsFound");
28551
28860
  const [isOpen, setIsOpen] = React97.useState(false);
@@ -28655,7 +28964,7 @@ var init_RelationSelect = __esm({
28655
28964
  children: isLoading ? /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
28656
28965
  /* @__PURE__ */ jsxRuntime.jsx(Spinner, { size: "sm" }),
28657
28966
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", children: t("common.loading") })
28658
- ] }) : selectedOption ? selectedOption.label : placeholder
28967
+ ] }) : selectedOption ? selectedOption.label : resolvedPlaceholder
28659
28968
  }
28660
28969
  ),
28661
28970
  /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
@@ -29249,19 +29558,20 @@ var init_RepeatableFormSection = __esm({
29249
29558
  RepeatableFormSection.displayName = "RepeatableFormSection";
29250
29559
  }
29251
29560
  });
29252
- var actionTypeLabels, actionTypeIcons, ViolationAlert;
29561
+ var actionTypeLabelKeys, actionTypeIcons, ViolationAlert;
29253
29562
  var init_ViolationAlert = __esm({
29254
29563
  "components/core/molecules/ViolationAlert.tsx"() {
29255
29564
  init_cn();
29565
+ init_useTranslate();
29256
29566
  init_Box();
29257
29567
  init_Stack();
29258
29568
  init_Typography();
29259
29569
  init_Button();
29260
29570
  init_Icon();
29261
- actionTypeLabels = {
29262
- measure: "Corrective Measure",
29263
- admin: "Administrative Action",
29264
- penalty: "Penalty Proceedings"
29571
+ actionTypeLabelKeys = {
29572
+ measure: "violationAlert.actionType.measure",
29573
+ admin: "violationAlert.actionType.admin",
29574
+ penalty: "violationAlert.actionType.penalty"
29265
29575
  };
29266
29576
  actionTypeIcons = {
29267
29577
  measure: "alert-triangle",
@@ -29278,10 +29588,11 @@ var init_ViolationAlert = __esm({
29278
29588
  className,
29279
29589
  ...flatProps
29280
29590
  }) => {
29591
+ const { t } = useTranslate();
29281
29592
  const resolvedViolation = violation ?? {
29282
29593
  law: "",
29283
29594
  article: "",
29284
- message: flatProps.message ?? "Violation",
29595
+ message: flatProps.message ?? t("violationAlert.fallbackMessage"),
29285
29596
  actionType: "measure"
29286
29597
  };
29287
29598
  const effectiveSeverity = severity ?? (resolvedViolation.actionType === "measure" ? "warning" : "error");
@@ -29366,7 +29677,7 @@ var init_ViolationAlert = __esm({
29366
29677
  {
29367
29678
  variant: "caption",
29368
29679
  className: cn(textColor, "opacity-75"),
29369
- children: actionTypeLabels[resolvedViolation.actionType]
29680
+ children: t(actionTypeLabelKeys[resolvedViolation.actionType])
29370
29681
  }
29371
29682
  )
29372
29683
  ] })
@@ -29397,7 +29708,7 @@ var init_ViolationAlert = __esm({
29397
29708
  {
29398
29709
  variant: "caption",
29399
29710
  className: cn(textColor, "opacity-75"),
29400
- children: "Admin:"
29711
+ children: t("violationAlert.adminLabel")
29401
29712
  }
29402
29713
  ),
29403
29714
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -29416,7 +29727,7 @@ var init_ViolationAlert = __esm({
29416
29727
  {
29417
29728
  variant: "caption",
29418
29729
  className: cn(textColor, "opacity-75"),
29419
- children: "Penalty:"
29730
+ children: t("violationAlert.penaltyLabel")
29420
29731
  }
29421
29732
  ),
29422
29733
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -29441,7 +29752,7 @@ var init_ViolationAlert = __esm({
29441
29752
  className: cn(textColor, "self-start"),
29442
29753
  children: [
29443
29754
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "arrow-right", size: "sm", className: "mr-1" }),
29444
- "Go to field"
29755
+ t("violationAlert.goToField")
29445
29756
  ]
29446
29757
  }
29447
29758
  )
@@ -29757,6 +30068,7 @@ var init_LineChart = __esm({
29757
30068
  "use client";
29758
30069
  init_cn();
29759
30070
  init_atoms2();
30071
+ init_useTranslate();
29760
30072
  LineChart2 = ({
29761
30073
  data,
29762
30074
  width = 400,
@@ -29768,6 +30080,7 @@ var init_LineChart = __esm({
29768
30080
  areaColor = "var(--color-primary)",
29769
30081
  className
29770
30082
  }) => {
30083
+ const { t } = useTranslate();
29771
30084
  const gradientId = React97.useId();
29772
30085
  const safeData = data ?? [];
29773
30086
  const sortedData = React97.useMemo(() => {
@@ -29804,7 +30117,7 @@ var init_LineChart = __esm({
29804
30117
  return `${linePath} L ${last.x} ${bottom} L ${first.x} ${bottom} Z`;
29805
30118
  }, [linePath, points, height, showArea]);
29806
30119
  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" });
30120
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex items-center justify-center text-muted-foreground", className), style: { width, height }, children: t("empty.noData") });
29808
30121
  }
29809
30122
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn(className), children: /* @__PURE__ */ jsxRuntime.jsxs(
29810
30123
  "svg",
@@ -31711,6 +32024,7 @@ var init_GraphView = __esm({
31711
32024
  "use client";
31712
32025
  init_cn();
31713
32026
  init_atoms2();
32027
+ init_useTranslate();
31714
32028
  GROUP_COLORS = [
31715
32029
  "#3b82f6",
31716
32030
  // blue-500
@@ -31743,6 +32057,7 @@ var init_GraphView = __esm({
31743
32057
  showLabels = true,
31744
32058
  zoomToFit = true
31745
32059
  }) => {
32060
+ const { t } = useTranslate();
31746
32061
  const containerRef = React97.useRef(null);
31747
32062
  const animRef = React97.useRef(0);
31748
32063
  const [simNodes, setSimNodes] = React97.useState([]);
@@ -31920,7 +32235,7 @@ var init_GraphView = __esm({
31920
32235
  [onNodeClick]
31921
32236
  );
31922
32237
  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" }) });
32238
+ 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
32239
  }
31925
32240
  return /* @__PURE__ */ jsxRuntime.jsx(
31926
32241
  Box,
@@ -32376,11 +32691,12 @@ var init_UploadDropZone = __esm({
32376
32691
  init_Icon();
32377
32692
  init_Typography();
32378
32693
  init_useEventBus();
32694
+ init_useTranslate();
32379
32695
  UploadDropZone = ({
32380
32696
  accept,
32381
32697
  maxSize,
32382
32698
  maxFiles = 1,
32383
- label = "Drop files here or click to browse",
32699
+ label,
32384
32700
  description,
32385
32701
  disabled = false,
32386
32702
  action,
@@ -32388,22 +32704,24 @@ var init_UploadDropZone = __esm({
32388
32704
  onFiles,
32389
32705
  className
32390
32706
  }) => {
32707
+ const { t } = useTranslate();
32708
+ const resolvedLabel = label ?? t("upload.dropOrBrowse");
32391
32709
  const [isDragOver, setIsDragOver] = React97.useState(false);
32392
32710
  const [error, setError] = React97.useState(null);
32393
32711
  const inputRef = React97.useRef(null);
32394
32712
  const eventBus = useSafeEventBus7();
32395
32713
  const defaultDescription = [
32396
- accept ? `Accepted: ${accept}` : null,
32397
- maxSize ? `Max size: ${formatFileSize(maxSize)}` : null,
32398
- maxFiles > 1 ? `Up to ${maxFiles} files` : null
32714
+ accept ? t("upload.accepted", { accept }) : null,
32715
+ maxSize ? t("upload.maxSize", { size: formatFileSize(maxSize) }) : null,
32716
+ maxFiles > 1 ? t("upload.maxFiles", { count: maxFiles }) : null
32399
32717
  ].filter(Boolean).join(". ");
32400
32718
  const validateFiles = React97.useCallback(
32401
32719
  (files) => {
32402
32720
  if (files.length > maxFiles) {
32403
- return { valid: [], error: `Maximum ${maxFiles} file${maxFiles > 1 ? "s" : ""} allowed` };
32721
+ return { valid: [], error: t("upload.error.maxFiles", { count: maxFiles }) };
32404
32722
  }
32405
32723
  if (accept) {
32406
- const acceptedTypes = accept.split(",").map((t) => t.trim());
32724
+ const acceptedTypes = accept.split(",").map((s) => s.trim());
32407
32725
  const invalid = files.filter((file) => {
32408
32726
  return !acceptedTypes.some((type) => {
32409
32727
  if (type.endsWith("/*")) {
@@ -32413,7 +32731,7 @@ var init_UploadDropZone = __esm({
32413
32731
  });
32414
32732
  });
32415
32733
  if (invalid.length > 0) {
32416
- return { valid: [], error: `Invalid file type: ${invalid[0].name}` };
32734
+ return { valid: [], error: t("upload.error.invalidType", { name: invalid[0].name }) };
32417
32735
  }
32418
32736
  }
32419
32737
  if (maxSize) {
@@ -32421,13 +32739,13 @@ var init_UploadDropZone = __esm({
32421
32739
  if (tooLarge.length > 0) {
32422
32740
  return {
32423
32741
  valid: [],
32424
- error: `File too large: ${tooLarge[0].name} (max ${formatFileSize(maxSize)})`
32742
+ error: t("upload.error.tooLarge", { name: tooLarge[0].name, size: formatFileSize(maxSize) })
32425
32743
  };
32426
32744
  }
32427
32745
  }
32428
32746
  return { valid: files, error: null };
32429
32747
  },
32430
- [accept, maxSize, maxFiles]
32748
+ [accept, maxSize, maxFiles, t]
32431
32749
  );
32432
32750
  const handleFiles = React97.useCallback(
32433
32751
  (files) => {
@@ -32498,7 +32816,7 @@ var init_UploadDropZone = __esm({
32498
32816
  handleClick();
32499
32817
  }
32500
32818
  },
32501
- "aria-label": label,
32819
+ "aria-label": resolvedLabel,
32502
32820
  children: [
32503
32821
  /* @__PURE__ */ jsxRuntime.jsx(
32504
32822
  "input",
@@ -32514,7 +32832,7 @@ var init_UploadDropZone = __esm({
32514
32832
  }
32515
32833
  ),
32516
32834
  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 }),
32835
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body1", className: "text-center font-medium mb-1", children: isDragOver ? t("upload.dropFilesHere") : resolvedLabel }),
32518
32836
  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
32837
  ]
32520
32838
  }
@@ -32936,7 +33254,7 @@ function TableView({
32936
33254
  {
32937
33255
  checked: selected.has(id),
32938
33256
  onChange: () => toggleRow(id),
32939
- "aria-label": `Select row ${id}`
33257
+ "aria-label": t("table.selectRow", { id })
32940
33258
  }
32941
33259
  ) }),
32942
33260
  hasRenderProp ? /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex-1 min-w-0", children: children(row, index) }) : colDefs.map((col) => {
@@ -35783,7 +36101,7 @@ var init_QrScanner = __esm({
35783
36101
  className: "inset-0 flex-col items-center justify-center gap-2 bg-black bg-opacity-80 text-center",
35784
36102
  children: [
35785
36103
  /* @__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" }),
36104
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body2", className: "text-white", children: t("qrScanner.cameraUnavailable") }),
35787
36105
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", className: "text-white opacity-70", children: cameraError.message })
35788
36106
  ]
35789
36107
  }
@@ -35794,7 +36112,7 @@ var init_QrScanner = __esm({
35794
36112
  position: "absolute",
35795
36113
  display: "flex",
35796
36114
  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" })
36115
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body2", className: "text-white", children: t("qrScanner.paused") })
35798
36116
  }
35799
36117
  ),
35800
36118
  showCameraControls && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -35813,7 +36131,7 @@ var init_QrScanner = __esm({
35813
36131
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
35814
36132
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
35815
36133
  ),
35816
- "aria-label": isPaused ? "Resume scanning" : "Pause scanning",
36134
+ "aria-label": isPaused ? t("qrScanner.resumeScanning") : t("qrScanner.pauseScanning"),
35817
36135
  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
36136
  }
35819
36137
  ),
@@ -35826,7 +36144,7 @@ var init_QrScanner = __esm({
35826
36144
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
35827
36145
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
35828
36146
  ),
35829
- "aria-label": `Switch to ${currentFacing === "environment" ? "front" : "rear"} camera`,
36147
+ "aria-label": currentFacing === "environment" ? t("qrScanner.switchToFrontCamera") : t("qrScanner.switchToRearCamera"),
35830
36148
  children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "refresh-cw", className: "h-4 w-4" })
35831
36149
  }
35832
36150
  ),
@@ -35840,7 +36158,7 @@ var init_QrScanner = __esm({
35840
36158
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
35841
36159
  ),
35842
36160
  "aria-label": t("aria.mockScanDev"),
35843
- children: "Mock Scan"
36161
+ children: t("qrScanner.mockScan")
35844
36162
  }
35845
36163
  )
35846
36164
  ]
@@ -35858,6 +36176,7 @@ var init_OptionConstraintGroup = __esm({
35858
36176
  "components/core/molecules/OptionConstraintGroup.tsx"() {
35859
36177
  init_cn();
35860
36178
  init_useEventBus();
36179
+ init_useTranslate();
35861
36180
  init_Typography();
35862
36181
  init_Box();
35863
36182
  init_Label();
@@ -35867,36 +36186,36 @@ var init_OptionConstraintGroup = __esm({
35867
36186
  const sign = delta >= 0 ? "+" : "-";
35868
36187
  return `${sign}$${Math.abs(delta).toFixed(2)}`;
35869
36188
  };
35870
- constraintHint = (constraint) => {
36189
+ constraintHint = (constraint, t) => {
35871
36190
  if (constraint.type === "single") {
35872
- return constraint.required ? "Required, pick 1" : "Optional, pick up to 1";
36191
+ return constraint.required ? t("optionConstraint.requiredOne") : t("optionConstraint.optionalOne");
35873
36192
  }
35874
36193
  const { min, max } = constraint;
35875
36194
  if (min && max) {
35876
- return min === max ? `Pick exactly ${min}` : `Pick ${min}-${max}`;
36195
+ return min === max ? t("optionConstraint.pickExactly", { count: min }) : t("optionConstraint.pickRange", { min, max });
35877
36196
  }
35878
- if (min) return `Pick at least ${min}`;
35879
- if (max) return `Pick up to ${max}`;
35880
- return "Optional";
36197
+ if (min) return t("optionConstraint.pickAtLeast", { count: min });
36198
+ if (max) return t("optionConstraint.pickUpTo", { count: max });
36199
+ return t("optionConstraint.optional");
35881
36200
  };
35882
- validateSelection = (selected, constraint) => {
36201
+ validateSelection = (selected, constraint, t) => {
35883
36202
  if (constraint.type === "single") {
35884
36203
  if (constraint.required && selected.length === 0) {
35885
- return "Pick 1 option";
36204
+ return t("optionConstraint.error.pickOne");
35886
36205
  }
35887
36206
  if (selected.length > 1) {
35888
- return "Pick only 1 option";
36207
+ return t("optionConstraint.error.pickOnlyOne");
35889
36208
  }
35890
36209
  return void 0;
35891
36210
  }
35892
36211
  const { min, max } = constraint;
35893
36212
  if (min !== void 0 && selected.length < min) {
35894
36213
  const remaining = min - selected.length;
35895
- return `Pick at least ${remaining} more`;
36214
+ return t("optionConstraint.error.pickMore", { count: remaining });
35896
36215
  }
35897
36216
  if (max !== void 0 && selected.length > max) {
35898
36217
  const excess = selected.length - max;
35899
- return `Remove ${excess} option${excess === 1 ? "" : "s"}`;
36218
+ return t("optionConstraint.error.removeOptions", { count: excess });
35900
36219
  }
35901
36220
  return void 0;
35902
36221
  };
@@ -35913,8 +36232,9 @@ var init_OptionConstraintGroup = __esm({
35913
36232
  className
35914
36233
  }) => {
35915
36234
  const eventBus = useEventBus();
35916
- const hint = constraintHint(constraint);
35917
- const error = validateSelection(selected, constraint);
36235
+ const { t } = useTranslate();
36236
+ const hint = constraintHint(constraint, t);
36237
+ const error = validateSelection(selected, constraint, t);
35918
36238
  const inputName = `option-${groupId}`;
35919
36239
  const labelTextSize = size === "sm" ? "text-sm" : "text-base";
35920
36240
  const optionGap = size === "sm" ? "gap-2" : "gap-2.5";
@@ -36014,7 +36334,7 @@ var init_OptionConstraintGroup = __esm({
36014
36334
  variant: "caption",
36015
36335
  color: "warning",
36016
36336
  className: "rounded border border-warning/40 px-1.5 py-0.5",
36017
- children: "Out of stock"
36337
+ children: t("optionConstraint.outOfStock")
36018
36338
  }
36019
36339
  )
36020
36340
  ]
@@ -36336,6 +36656,7 @@ function changeBlockType(block, type) {
36336
36656
  return { id: block.id, type, content: seed };
36337
36657
  }
36338
36658
  function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36659
+ const { t } = useTranslate();
36339
36660
  const [open, setOpen] = React97.useState(false);
36340
36661
  const ref = React97.useRef(null);
36341
36662
  React97.useEffect(() => {
@@ -36355,7 +36676,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36355
36676
  {
36356
36677
  type: "button",
36357
36678
  variant: "ghost",
36358
- "aria-label": "Block actions",
36679
+ "aria-label": t("richBlockEditor.blockActions"),
36359
36680
  className: cn(
36360
36681
  "inline-flex items-center justify-center",
36361
36682
  "h-6 w-6 rounded-sm p-0 gap-0",
@@ -36377,7 +36698,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36377
36698
  "py-1 text-sm"
36378
36699
  ),
36379
36700
  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] }),
36701
+ /* @__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
36702
  /* @__PURE__ */ jsxRuntime.jsxs(
36382
36703
  Button,
36383
36704
  {
@@ -36391,7 +36712,8 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36391
36712
  },
36392
36713
  children: [
36393
36714
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", className: "w-3.5 h-3.5" }),
36394
- " Duplicate"
36715
+ " ",
36716
+ t("richBlockEditor.duplicate")
36395
36717
  ]
36396
36718
  }
36397
36719
  ),
@@ -36408,14 +36730,15 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36408
36730
  },
36409
36731
  children: [
36410
36732
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "trash", className: "w-3.5 h-3.5" }),
36411
- " Delete"
36733
+ " ",
36734
+ t("common.delete")
36412
36735
  ]
36413
36736
  }
36414
36737
  ),
36415
36738
  CHANGEABLE_TYPES.includes(block.type) && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
36416
36739
  /* @__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(
36740
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: t("richBlockEditor.turnInto") }),
36741
+ CHANGEABLE_TYPES.filter((bt) => bt !== block.type).map((bt) => /* @__PURE__ */ jsxRuntime.jsx(
36419
36742
  Button,
36420
36743
  {
36421
36744
  type: "button",
@@ -36423,12 +36746,12 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36423
36746
  role: "menuitem",
36424
36747
  className: "flex w-full items-center gap-2 px-2 py-1.5 text-left justify-start rounded-none",
36425
36748
  onClick: () => {
36426
- onChangeType(t);
36749
+ onChangeType(bt);
36427
36750
  setOpen(false);
36428
36751
  },
36429
- children: BLOCK_TYPE_LABEL[t]
36752
+ children: t(BLOCK_TYPE_LABEL_KEY[bt])
36430
36753
  },
36431
- t
36754
+ bt
36432
36755
  ))
36433
36756
  ] })
36434
36757
  ]
@@ -36490,6 +36813,7 @@ function BlockRow({
36490
36813
  onInsertAfter,
36491
36814
  onChangeType
36492
36815
  }) {
36816
+ const { t } = useTranslate();
36493
36817
  const setContent = React97.useCallback(
36494
36818
  (next) => onUpdate((b) => ({ ...b, content: next })),
36495
36819
  [onUpdate]
@@ -36539,8 +36863,8 @@ function BlockRow({
36539
36863
  tag: "h1",
36540
36864
  value: block.content ?? "",
36541
36865
  readOnly,
36542
- placeholder: placeholder ?? "Heading 1",
36543
- ariaLabel: "Heading 1 block",
36866
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading1"),
36867
+ ariaLabel: t("richBlockEditor.aria.heading1Block"),
36544
36868
  className: "text-3xl font-bold leading-tight",
36545
36869
  onValueChange: setContent
36546
36870
  }
@@ -36552,8 +36876,8 @@ function BlockRow({
36552
36876
  tag: "h2",
36553
36877
  value: block.content ?? "",
36554
36878
  readOnly,
36555
- placeholder: placeholder ?? "Heading 2",
36556
- ariaLabel: "Heading 2 block",
36879
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading2"),
36880
+ ariaLabel: t("richBlockEditor.aria.heading2Block"),
36557
36881
  className: "text-2xl font-semibold leading-tight",
36558
36882
  onValueChange: setContent
36559
36883
  }
@@ -36565,8 +36889,8 @@ function BlockRow({
36565
36889
  tag: "h3",
36566
36890
  value: block.content ?? "",
36567
36891
  readOnly,
36568
- placeholder: placeholder ?? "Heading 3",
36569
- ariaLabel: "Heading 3 block",
36892
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading3"),
36893
+ ariaLabel: t("richBlockEditor.aria.heading3Block"),
36570
36894
  className: "text-xl font-semibold leading-tight",
36571
36895
  onValueChange: setContent
36572
36896
  }
@@ -36578,8 +36902,8 @@ function BlockRow({
36578
36902
  tag: "blockquote",
36579
36903
  value: block.content ?? "",
36580
36904
  readOnly,
36581
- placeholder: placeholder ?? "Quote",
36582
- ariaLabel: "Quote block",
36905
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.quote"),
36906
+ ariaLabel: t("richBlockEditor.aria.quoteBlock"),
36583
36907
  className: "border-l-4 border-primary/60 pl-4 italic text-muted-foreground",
36584
36908
  onValueChange: setContent
36585
36909
  }
@@ -36587,13 +36911,13 @@ function BlockRow({
36587
36911
  case "code":
36588
36912
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "rounded-md border border-border bg-muted/40", children: [
36589
36913
  /* @__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" }),
36914
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", variant: "caption", className: "uppercase tracking-wide", children: t("richBlockEditor.blockType.code") }),
36591
36915
  !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
36592
36916
  Input,
36593
36917
  {
36594
36918
  inputType: "text",
36595
36919
  value: String(block.metadata?.language ?? "plaintext"),
36596
- "aria-label": "Code language",
36920
+ "aria-label": t("richBlockEditor.aria.codeLanguage"),
36597
36921
  className: cn(
36598
36922
  "h-6 w-32 rounded-sm border border-border bg-background",
36599
36923
  "px-2 text-xs outline-none focus:ring-1 focus:ring-ring"
@@ -36609,8 +36933,8 @@ function BlockRow({
36609
36933
  tag: "pre",
36610
36934
  value: block.content ?? "",
36611
36935
  readOnly,
36612
- placeholder: placeholder ?? "Enter code",
36613
- ariaLabel: "Code block",
36936
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.code"),
36937
+ ariaLabel: t("richBlockEditor.aria.codeBlock"),
36614
36938
  className: "block whitespace-pre-wrap p-3 font-mono text-sm leading-relaxed",
36615
36939
  onValueChange: setContent
36616
36940
  }
@@ -36623,7 +36947,7 @@ function BlockRow({
36623
36947
  const caption = String(block.metadata?.caption ?? "");
36624
36948
  const imgProps = {
36625
36949
  src: url,
36626
- alt: caption || "Embedded image",
36950
+ alt: caption || t("richBlockEditor.embeddedImage"),
36627
36951
  className: "max-h-96 w-full rounded-md border border-border object-contain"
36628
36952
  };
36629
36953
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "space-y-2", children: [
@@ -36637,7 +36961,8 @@ function BlockRow({
36637
36961
  ),
36638
36962
  children: [
36639
36963
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "image", className: "mr-2 w-4 h-4" }),
36640
- " No image URL set"
36964
+ " ",
36965
+ t("richBlockEditor.noImageUrl")
36641
36966
  ]
36642
36967
  }
36643
36968
  ),
@@ -36648,7 +36973,7 @@ function BlockRow({
36648
36973
  inputType: "url",
36649
36974
  value: url,
36650
36975
  placeholder: "https://example.com/image.png",
36651
- "aria-label": "Image URL",
36976
+ "aria-label": t("richBlockEditor.aria.imageUrl"),
36652
36977
  className: cn(
36653
36978
  "h-8 flex-1 rounded-sm border border-border bg-background",
36654
36979
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -36661,8 +36986,8 @@ function BlockRow({
36661
36986
  {
36662
36987
  inputType: "text",
36663
36988
  value: caption,
36664
- placeholder: "Caption (optional)",
36665
- "aria-label": "Image caption",
36989
+ placeholder: t("richBlockEditor.placeholder.caption"),
36990
+ "aria-label": t("richBlockEditor.aria.imageCaption"),
36666
36991
  className: cn(
36667
36992
  "h-8 flex-1 rounded-sm border border-border bg-background",
36668
36993
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -36693,8 +37018,8 @@ function BlockRow({
36693
37018
  tag: "span",
36694
37019
  value: child.content ?? "",
36695
37020
  readOnly,
36696
- placeholder: "List item",
36697
- ariaLabel: "List item",
37021
+ placeholder: t("richBlockEditor.placeholder.listItem"),
37022
+ ariaLabel: t("richBlockEditor.aria.listItem"),
36698
37023
  className: "inline-block min-w-[1ch] flex-1",
36699
37024
  onValueChange: (next) => setChildContent(child.id, next)
36700
37025
  }
@@ -36704,7 +37029,7 @@ function BlockRow({
36704
37029
  {
36705
37030
  type: "button",
36706
37031
  variant: "ghost",
36707
- "aria-label": "Remove list item",
37032
+ "aria-label": t("richBlockEditor.aria.removeListItem"),
36708
37033
  className: cn(
36709
37034
  "h-5 w-5 shrink-0 rounded-sm text-muted-foreground p-0 gap-0",
36710
37035
  "opacity-0 group-hover/item:opacity-100 hover:bg-muted hover:text-foreground"
@@ -36726,7 +37051,8 @@ function BlockRow({
36726
37051
  onClick: addListItem,
36727
37052
  children: [
36728
37053
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", className: "w-3 h-3" }),
36729
- " Add item"
37054
+ " ",
37055
+ t("richBlockEditor.addItem")
36730
37056
  ]
36731
37057
  }
36732
37058
  ) })
@@ -36742,8 +37068,8 @@ function BlockRow({
36742
37068
  tag: "p",
36743
37069
  value: block.content ?? "",
36744
37070
  readOnly,
36745
- placeholder: placeholder ?? "Start writing...",
36746
- ariaLabel: "Paragraph block",
37071
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.paragraph"),
37072
+ ariaLabel: t("richBlockEditor.aria.paragraphBlock"),
36747
37073
  className: "leading-7",
36748
37074
  onValueChange: setContent
36749
37075
  }
@@ -36766,7 +37092,7 @@ function BlockRow({
36766
37092
  {
36767
37093
  type: "button",
36768
37094
  variant: "ghost",
36769
- "aria-label": "Insert paragraph below",
37095
+ "aria-label": t("richBlockEditor.insertParagraphBelow"),
36770
37096
  className: cn(
36771
37097
  "inline-flex h-6 w-6 items-center justify-center rounded-sm p-0 gap-0",
36772
37098
  "text-muted-foreground hover:bg-muted hover:text-foreground",
@@ -36793,7 +37119,7 @@ function BlockRow({
36793
37119
  }
36794
37120
  );
36795
37121
  }
36796
- var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES, RichBlockEditor;
37122
+ var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL_KEY, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES, RichBlockEditor;
36797
37123
  var init_RichBlockEditor = __esm({
36798
37124
  "components/core/molecules/RichBlockEditor.tsx"() {
36799
37125
  "use client";
@@ -36806,29 +37132,30 @@ var init_RichBlockEditor = __esm({
36806
37132
  init_Input();
36807
37133
  init_Icon();
36808
37134
  init_useEventBus();
37135
+ init_useTranslate();
36809
37136
  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 }
37137
+ { type: "paragraph", labelKey: "richBlockEditor.toolbar.text", icon: LucideIcons2.Type },
37138
+ { type: "heading-1", labelKey: "richBlockEditor.toolbar.h1", icon: LucideIcons2.Heading1 },
37139
+ { type: "heading-2", labelKey: "richBlockEditor.toolbar.h2", icon: LucideIcons2.Heading2 },
37140
+ { type: "heading-3", labelKey: "richBlockEditor.toolbar.h3", icon: LucideIcons2.Heading3 },
37141
+ { type: "bullet-list", labelKey: "richBlockEditor.toolbar.bulletList", icon: LucideIcons2.List },
37142
+ { type: "numbered-list", labelKey: "richBlockEditor.toolbar.numbered", icon: LucideIcons2.ListOrdered },
37143
+ { type: "quote", labelKey: "richBlockEditor.toolbar.quote", icon: LucideIcons2.Quote },
37144
+ { type: "code", labelKey: "richBlockEditor.toolbar.code", icon: LucideIcons2.Code },
37145
+ { type: "divider", labelKey: "richBlockEditor.toolbar.divider", icon: LucideIcons2.Minus },
37146
+ { type: "image", labelKey: "richBlockEditor.toolbar.image", icon: LucideIcons2.Image }
36820
37147
  ];
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"
37148
+ BLOCK_TYPE_LABEL_KEY = {
37149
+ paragraph: "richBlockEditor.blockType.paragraph",
37150
+ "heading-1": "richBlockEditor.blockType.heading1",
37151
+ "heading-2": "richBlockEditor.blockType.heading2",
37152
+ "heading-3": "richBlockEditor.blockType.heading3",
37153
+ "bullet-list": "richBlockEditor.blockType.bulletList",
37154
+ "numbered-list": "richBlockEditor.blockType.numberedList",
37155
+ quote: "richBlockEditor.blockType.quote",
37156
+ code: "richBlockEditor.blockType.code",
37157
+ divider: "richBlockEditor.blockType.divider",
37158
+ image: "richBlockEditor.blockType.image"
36832
37159
  };
36833
37160
  CHANGEABLE_TYPES = [
36834
37161
  "paragraph",
@@ -36862,6 +37189,7 @@ var init_RichBlockEditor = __esm({
36862
37189
  showToolbar = true,
36863
37190
  className
36864
37191
  }) => {
37192
+ const { t } = useTranslate();
36865
37193
  const [blocks, setBlocks] = React97.useState(
36866
37194
  () => normalizeBlocks(initialBlocks)
36867
37195
  );
@@ -36933,25 +37261,26 @@ var init_RichBlockEditor = __esm({
36933
37261
  Box,
36934
37262
  {
36935
37263
  role: "toolbar",
36936
- "aria-label": "Block editor toolbar",
37264
+ "aria-label": t("richBlockEditor.editorToolbar"),
36937
37265
  className: cn(
36938
37266
  "flex flex-wrap items-center gap-1",
36939
37267
  "border-b border-border bg-muted/30 px-2 py-2"
36940
37268
  ),
36941
37269
  children: TOOLBAR_ENTRIES.map((entry) => {
36942
37270
  const Icon3 = entry.icon;
37271
+ const entryLabel = t(entry.labelKey);
36943
37272
  return /* @__PURE__ */ jsxRuntime.jsxs(
36944
37273
  Button,
36945
37274
  {
36946
37275
  type: "button",
36947
37276
  variant: "ghost",
36948
37277
  size: "sm",
36949
- "aria-label": `Insert ${entry.label}`,
36950
- title: entry.label,
37278
+ "aria-label": t("richBlockEditor.insertEntry", { label: entryLabel }),
37279
+ title: entryLabel,
36951
37280
  onClick: () => handleAppend(entry.type),
36952
37281
  children: [
36953
37282
  /* @__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 })
37283
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { as: "span", variant: "caption", className: "ml-1 hidden text-xs sm:inline", children: entryLabel })
36955
37284
  ]
36956
37285
  },
36957
37286
  entry.type
@@ -36994,6 +37323,7 @@ var init_ReplyTree = __esm({
36994
37323
  "use client";
36995
37324
  init_cn();
36996
37325
  init_useEventBus();
37326
+ init_useTranslate();
36997
37327
  init_atoms2();
36998
37328
  init_VoteStack();
36999
37329
  ReplyTreeNode = ({
@@ -37013,6 +37343,7 @@ var init_ReplyTree = __esm({
37013
37343
  showActions
37014
37344
  }) => {
37015
37345
  const eventBus = useEventBus();
37346
+ const { t } = useTranslate();
37016
37347
  const hasReplies = !!node.replies && node.replies.length > 0;
37017
37348
  const isCollapsed = collapsedSet.has(node.id);
37018
37349
  const atMaxDepth = depth >= maxDepth;
@@ -37059,7 +37390,7 @@ var init_ReplyTree = __esm({
37059
37390
  variant: "ghost",
37060
37391
  size: "sm",
37061
37392
  onClick: handleToggle,
37062
- "aria-label": isCollapsed ? "Expand replies" : "Collapse replies",
37393
+ "aria-label": isCollapsed ? t("replyTree.expandReplies") : t("replyTree.collapseReplies"),
37063
37394
  "aria-expanded": !isCollapsed,
37064
37395
  leftIcon: isCollapsed ? "chevron-right" : "chevron-down",
37065
37396
  className: cn(
@@ -37100,7 +37431,7 @@ var init_ReplyTree = __esm({
37100
37431
  onVote: handleVote,
37101
37432
  size: "sm",
37102
37433
  variant: "horizontal",
37103
- label: `Vote on reply by ${node.authorName}`
37434
+ label: t("replyTree.voteOnReplyBy", { author: node.authorName })
37104
37435
  }
37105
37436
  ),
37106
37437
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -37110,8 +37441,8 @@ var init_ReplyTree = __esm({
37110
37441
  size: "sm",
37111
37442
  leftIcon: "message-square",
37112
37443
  onClick: handleReply,
37113
- "aria-label": `Reply to ${node.authorName}`,
37114
- children: "Reply"
37444
+ "aria-label": t("replyTree.replyTo", { author: node.authorName }),
37445
+ children: t("replyTree.reply")
37115
37446
  }
37116
37447
  ),
37117
37448
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -37121,8 +37452,8 @@ var init_ReplyTree = __esm({
37121
37452
  size: "sm",
37122
37453
  leftIcon: "flag",
37123
37454
  onClick: handleFlag,
37124
- "aria-label": `Flag reply by ${node.authorName}`,
37125
- children: "Flag"
37455
+ "aria-label": t("replyTree.flagReplyBy", { author: node.authorName }),
37456
+ children: t("replyTree.flag")
37126
37457
  }
37127
37458
  )
37128
37459
  ] }),
@@ -37133,9 +37464,9 @@ var init_ReplyTree = __esm({
37133
37464
  inputType: "textarea",
37134
37465
  rows: 2,
37135
37466
  value: draft,
37136
- placeholder: `Reply to ${node.authorName}\u2026`,
37467
+ placeholder: t("replyTree.replyToPlaceholder", { author: node.authorName }),
37137
37468
  onChange: (e) => setDraft(e.target.value),
37138
- "aria-label": `Reply to ${node.authorName}`
37469
+ "aria-label": t("replyTree.replyTo", { author: node.authorName })
37139
37470
  }
37140
37471
  ),
37141
37472
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-row gap-2 items-center", children: [
@@ -37147,10 +37478,10 @@ var init_ReplyTree = __esm({
37147
37478
  leftIcon: "send",
37148
37479
  onClick: handleSubmitReply,
37149
37480
  disabled: !draft.trim(),
37150
- children: "Send"
37481
+ children: t("replyTree.send")
37151
37482
  }
37152
37483
  ),
37153
- /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: "Cancel" })
37484
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: t("common.cancel") })
37154
37485
  ] })
37155
37486
  ] }),
37156
37487
  hasReplies && !isCollapsed && (atMaxDepth ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -37164,7 +37495,7 @@ var init_ReplyTree = __esm({
37164
37495
  "self-start gap-1 px-0 h-auto",
37165
37496
  "text-sm text-primary hover:underline hover:bg-transparent"
37166
37497
  ),
37167
- children: "Continue thread"
37498
+ children: t("replyTree.continueThread")
37168
37499
  }
37169
37500
  ) : /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex flex-col gap-2 mt-1", children: node.replies.map((child) => /* @__PURE__ */ jsxRuntime.jsx(
37170
37501
  ReplyTreeNode,
@@ -37203,6 +37534,7 @@ var init_ReplyTree = __esm({
37203
37534
  showActions = true,
37204
37535
  className
37205
37536
  }) => {
37537
+ const { t } = useTranslate();
37206
37538
  const nodeList = Array.isArray(nodes) ? nodes : nodes ? [nodes] : [];
37207
37539
  const [collapsedSet, setCollapsedSet] = React97.useState(() => {
37208
37540
  const acc = /* @__PURE__ */ new Set();
@@ -37221,7 +37553,7 @@ var init_ReplyTree = __esm({
37221
37553
  });
37222
37554
  }, []);
37223
37555
  if (nodeList.length === 0) {
37224
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("text-sm text-muted-foreground", className), children: "No replies yet." });
37556
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("text-sm text-muted-foreground", className), children: t("replyTree.noRepliesYet") });
37225
37557
  }
37226
37558
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("flex flex-col gap-2 min-w-0", className), children: nodeList.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
37227
37559
  ReplyTreeNode,
@@ -37299,6 +37631,7 @@ var init_VersionDiff = __esm({
37299
37631
  "use client";
37300
37632
  init_cn();
37301
37633
  init_useEventBus();
37634
+ init_useTranslate();
37302
37635
  init_atoms2();
37303
37636
  init_Stack();
37304
37637
  INLINE_STYLES = {
@@ -37321,6 +37654,7 @@ var init_VersionDiff = __esm({
37321
37654
  language,
37322
37655
  className
37323
37656
  }) => {
37657
+ const { t } = useTranslate();
37324
37658
  const eventBus = useEventBus();
37325
37659
  const revisions = Array.isArray(revisionsProp) ? revisionsProp : [];
37326
37660
  const fallbackBefore = revisions[0]?.id ?? "";
@@ -37402,24 +37736,24 @@ var init_VersionDiff = __esm({
37402
37736
  children: [
37403
37737
  /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: "flex-wrap", children: [
37404
37738
  /* @__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" }),
37739
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "whitespace-nowrap", children: t("versionDiff.compare") }),
37406
37740
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsxRuntime.jsx(
37407
37741
  Select,
37408
37742
  {
37409
37743
  options,
37410
37744
  value: activeBeforeId,
37411
37745
  onChange: handleBeforeChange,
37412
- "aria-label": "Before revision"
37746
+ "aria-label": t("versionDiff.beforeRevision")
37413
37747
  }
37414
37748
  ) }),
37415
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: "to" }),
37749
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: t("versionDiff.to") }),
37416
37750
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsxRuntime.jsx(
37417
37751
  Select,
37418
37752
  {
37419
37753
  options,
37420
37754
  value: activeAfterId,
37421
37755
  onChange: handleAfterChange,
37422
- "aria-label": "After revision"
37756
+ "aria-label": t("versionDiff.afterRevision")
37423
37757
  }
37424
37758
  ) }),
37425
37759
  language && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "default", children: language }),
@@ -37440,7 +37774,7 @@ var init_VersionDiff = __esm({
37440
37774
  size: "sm",
37441
37775
  icon: activeView === "side-by-side" ? "align-left" : "columns",
37442
37776
  onClick: handleViewToggle,
37443
- "aria-label": activeView === "side-by-side" ? "Switch to inline view" : "Switch to side-by-side view"
37777
+ "aria-label": activeView === "side-by-side" ? t("versionDiff.switchToInline") : t("versionDiff.switchToSideBySide")
37444
37778
  }
37445
37779
  ),
37446
37780
  (onRevert || revertEvent) && /* @__PURE__ */ jsxRuntime.jsx(
@@ -37450,7 +37784,7 @@ var init_VersionDiff = __esm({
37450
37784
  size: "sm",
37451
37785
  icon: "rotate-ccw",
37452
37786
  onClick: handleRevert,
37453
- children: "Revert"
37787
+ children: t("versionDiff.revert")
37454
37788
  }
37455
37789
  )
37456
37790
  ] })
@@ -37467,12 +37801,12 @@ var init_VersionDiff = __esm({
37467
37801
  children: [
37468
37802
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
37469
37803
  beforeRev?.label,
37470
- beforeRev?.author ? ` by ${beforeRev.author}` : "",
37804
+ beforeRev?.author ? t("versionDiff.byAuthor", { author: beforeRev.author }) : "",
37471
37805
  beforeRev?.timestamp ? ` (${beforeRev.timestamp})` : ""
37472
37806
  ] }),
37473
37807
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
37474
37808
  afterRev?.label,
37475
- afterRev?.author ? ` by ${afterRev.author}` : "",
37809
+ afterRev?.author ? t("versionDiff.byAuthor", { author: afterRev.author }) : "",
37476
37810
  afterRev?.timestamp ? ` (${afterRev.timestamp})` : ""
37477
37811
  ] })
37478
37812
  ]
@@ -37865,10 +38199,12 @@ var init_DocPagination = __esm({
37865
38199
  }
37866
38200
  });
37867
38201
  function DocSearch({
37868
- placeholder = "Search documentation...",
38202
+ placeholder,
37869
38203
  onSearch,
37870
38204
  className
37871
38205
  }) {
38206
+ const { t } = useTranslate();
38207
+ const resolvedPlaceholder = placeholder ?? t("docSearch.placeholder");
37872
38208
  const [query, setQuery] = React97.useState("");
37873
38209
  const [results, setResults] = React97.useState([]);
37874
38210
  const [isOpen, setIsOpen] = React97.useState(false);
@@ -37975,7 +38311,7 @@ function DocSearch({
37975
38311
  Input,
37976
38312
  {
37977
38313
  inputType: "search",
37978
- placeholder,
38314
+ placeholder: resolvedPlaceholder,
37979
38315
  value: query,
37980
38316
  onChange: handleChange,
37981
38317
  onFocus: handleFocus,
@@ -38040,6 +38376,7 @@ var init_DocSearch = __esm({
38040
38376
  init_Typography();
38041
38377
  init_Icon();
38042
38378
  init_Input();
38379
+ init_useTranslate();
38043
38380
  }
38044
38381
  });
38045
38382
  var DocSidebarCategory, DocSidebar;
@@ -39635,8 +39972,8 @@ var init_SignaturePad = __esm({
39635
39972
  init_useEventBus();
39636
39973
  init_useTranslate();
39637
39974
  SignaturePad = ({
39638
- label = "Signature",
39639
- helperText = "Draw your signature above",
39975
+ label,
39976
+ helperText,
39640
39977
  strokeColor,
39641
39978
  strokeWidth = 2,
39642
39979
  height = 200,
@@ -39652,6 +39989,8 @@ var init_SignaturePad = __esm({
39652
39989
  }) => {
39653
39990
  const eventBus = useEventBus();
39654
39991
  const { t } = useTranslate();
39992
+ const resolvedLabel = label ?? t("signaturePad.label");
39993
+ const resolvedHelperText = helperText ?? t("signaturePad.helperText");
39655
39994
  const canvasRef = React97.useRef(null);
39656
39995
  const [isDrawing, setIsDrawing] = React97.useState(false);
39657
39996
  const [hasSignature, setHasSignature] = React97.useState(!!value);
@@ -39754,7 +40093,7 @@ var init_SignaturePad = __esm({
39754
40093
  );
39755
40094
  }
39756
40095
  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 }),
40096
+ resolvedLabel && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "label", weight: "medium", children: resolvedLabel }),
39758
40097
  /* @__PURE__ */ jsxRuntime.jsx(
39759
40098
  Box,
39760
40099
  {
@@ -39783,7 +40122,7 @@ var init_SignaturePad = __esm({
39783
40122
  )
39784
40123
  }
39785
40124
  ),
39786
- helperText && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: helperText }),
40125
+ resolvedHelperText && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: resolvedHelperText }),
39787
40126
  !readOnly && /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", justify: "end", children: [
39788
40127
  /* @__PURE__ */ jsxRuntime.jsx(
39789
40128
  Button,
@@ -39793,7 +40132,7 @@ var init_SignaturePad = __esm({
39793
40132
  icon: LucideIcons2.Eraser,
39794
40133
  onClick: clearSignature,
39795
40134
  disabled: !hasSignature,
39796
- children: "Clear"
40135
+ children: t("signaturePad.clear")
39797
40136
  }
39798
40137
  ),
39799
40138
  signEvent && /* @__PURE__ */ jsxRuntime.jsx(
@@ -39804,7 +40143,7 @@ var init_SignaturePad = __esm({
39804
40143
  icon: LucideIcons2.Check,
39805
40144
  onClick: confirmSignature,
39806
40145
  disabled: !hasSignature,
39807
- children: "Confirm"
40146
+ children: t("signaturePad.confirm")
39808
40147
  }
39809
40148
  )
39810
40149
  ] })
@@ -44249,6 +44588,7 @@ function MasterDetail({
44249
44588
  className,
44250
44589
  ...rest
44251
44590
  }) {
44591
+ const { t } = useTranslate();
44252
44592
  const loading = externalLoading ?? false;
44253
44593
  const isLoading = externalIsLoading ?? false;
44254
44594
  const error = externalError ?? null;
@@ -44261,8 +44601,8 @@ function MasterDetail({
44261
44601
  isLoading: loading || isLoading,
44262
44602
  error,
44263
44603
  className,
44264
- emptyTitle: "No items found",
44265
- emptyDescription: "Create your first item to get started.",
44604
+ emptyTitle: t("table.empty.title"),
44605
+ emptyDescription: t("empty.createFirst"),
44266
44606
  ...rest
44267
44607
  }
44268
44608
  );
@@ -44271,6 +44611,7 @@ var init_MasterDetail = __esm({
44271
44611
  "components/core/organisms/MasterDetail.tsx"() {
44272
44612
  "use client";
44273
44613
  init_DataTable();
44614
+ init_useTranslate();
44274
44615
  MasterDetail.displayName = "MasterDetail";
44275
44616
  }
44276
44617
  });
@@ -44279,14 +44620,18 @@ var init_MasterDetailLayout = __esm({
44279
44620
  "components/core/organisms/layout/MasterDetailLayout.tsx"() {
44280
44621
  init_cn();
44281
44622
  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
- ) });
44623
+ init_useTranslate();
44624
+ DefaultEmptyDetail = () => {
44625
+ const { t } = useTranslate();
44626
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsxRuntime.jsx(
44627
+ Typography,
44628
+ {
44629
+ variant: "body2",
44630
+ className: "text-muted-foreground",
44631
+ children: t("masterDetail.selectItem")
44632
+ }
44633
+ ) });
44634
+ };
44290
44635
  MasterDetailLayout = ({
44291
44636
  master,
44292
44637
  detail,
@@ -44413,7 +44758,7 @@ var init_MediaGallery = __esm({
44413
44758
  {
44414
44759
  icon: LucideIcons2.Image,
44415
44760
  title: t("display.noMedia"),
44416
- description: "No media items to display.",
44761
+ description: t("mediaGallery.noMediaDescription"),
44417
44762
  className
44418
44763
  }
44419
44764
  );
@@ -44430,7 +44775,7 @@ var init_MediaGallery = __esm({
44430
44775
  size: "sm",
44431
44776
  icon: LucideIcons2.Upload,
44432
44777
  action: "MEDIA_UPLOAD",
44433
- children: "Upload"
44778
+ children: t("mediaGallery.upload")
44434
44779
  }
44435
44780
  ),
44436
44781
  actions?.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -44444,10 +44789,7 @@ var init_MediaGallery = __esm({
44444
44789
  ))
44445
44790
  ] })
44446
44791
  ] }),
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
- ] }) }),
44792
+ 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
44793
  /* @__PURE__ */ jsxRuntime.jsx(
44452
44794
  Box,
44453
44795
  {
@@ -45321,7 +45663,7 @@ function TraitsTab({ traits: traits2 }) {
45321
45663
  EmptyState,
45322
45664
  {
45323
45665
  title: t("debug.noActiveTraits"),
45324
- description: "Traits will appear when components using them are mounted",
45666
+ description: t("debug.traitsMountHint"),
45325
45667
  className: "py-8"
45326
45668
  }
45327
45669
  );
@@ -45331,14 +45673,11 @@ function TraitsTab({ traits: traits2 }) {
45331
45673
  header: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 w-full", children: [
45332
45674
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", weight: "semibold", className: "text-purple-600 dark:text-purple-400", children: trait.name }),
45333
45675
  /* @__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
- ] })
45676
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: t("debug.transitionsCount", { count: trait.transitionCount }) })
45338
45677
  ] }),
45339
45678
  content: /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "sm", children: [
45340
45679
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
45341
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "States" }),
45680
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.states") }),
45342
45681
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: trait.states.map((state) => /* @__PURE__ */ jsxRuntime.jsx(
45343
45682
  Badge,
45344
45683
  {
@@ -45350,7 +45689,7 @@ function TraitsTab({ traits: traits2 }) {
45350
45689
  )) })
45351
45690
  ] }),
45352
45691
  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" }),
45692
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.transitions") }),
45354
45693
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: trait.transitions.map((t2, i) => /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "font-mono", children: [
45355
45694
  t2.from,
45356
45695
  " \u2192 ",
@@ -45369,7 +45708,7 @@ function TraitsTab({ traits: traits2 }) {
45369
45708
  ] }, i)) })
45370
45709
  ] }),
45371
45710
  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" }),
45711
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.guards") }),
45373
45712
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: trait.guards.map((g, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
45374
45713
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: g.name }),
45375
45714
  /* @__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 +45814,7 @@ function EntitiesTab({ snapshot }) {
45475
45814
  EmptyState,
45476
45815
  {
45477
45816
  title: t("debug.noEntityData"),
45478
- description: "Debug mode may not be enabled",
45817
+ description: t("debug.debugModeHint"),
45479
45818
  className: "py-8"
45480
45819
  }
45481
45820
  );
@@ -45488,7 +45827,7 @@ function EntitiesTab({ snapshot }) {
45488
45827
  EmptyState,
45489
45828
  {
45490
45829
  title: t("debug.noEntities"),
45491
- description: "Entities will appear when spawned",
45830
+ description: t("debug.entitiesSpawnHint"),
45492
45831
  className: "py-8"
45493
45832
  }
45494
45833
  );
@@ -45496,7 +45835,7 @@ function EntitiesTab({ snapshot }) {
45496
45835
  const singletonItems = singletonEntries.map(([name, data]) => ({
45497
45836
  id: `singleton-${name}`,
45498
45837
  header: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
45499
- /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "sm", children: "Singleton" }),
45838
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "sm", children: t("debug.singleton") }),
45500
45839
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", weight: "semibold", className: "text-sky-600 dark:text-sky-400", children: name })
45501
45840
  ] }),
45502
45841
  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 +45853,19 @@ function EntitiesTab({ snapshot }) {
45514
45853
  }));
45515
45854
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--entities", children: [
45516
45855
  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
- ] }),
45856
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.singletonsCount", { count: singletonItems.length }) }),
45522
45857
  /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: singletonItems, multiple: true })
45523
45858
  ] }),
45524
45859
  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
- ] }),
45860
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.runtimeCount", { count: runtimeEntities.length }) }),
45530
45861
  /* @__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
- ] })
45862
+ 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
45863
  ] }),
45537
45864
  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" }),
45865
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.persistent") }),
45539
45866
  /* @__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
45867
  /* @__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" })
45868
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: info.loaded ? "success" : "default", size: "sm", children: info.loaded ? t("debug.loadedCount", { count: info.count }) : t("debug.notLoaded") })
45542
45869
  ] }, type)) })
45543
45870
  ] })
45544
45871
  ] });
@@ -45582,7 +45909,7 @@ function EventFlowTab({ events: events2 }) {
45582
45909
  EmptyState,
45583
45910
  {
45584
45911
  title: t("debug.noEventsYet"),
45585
- description: "Events will appear as traits, ticks, and other systems execute",
45912
+ description: t("debug.eventsExecuteHint"),
45586
45913
  className: "py-8"
45587
45914
  }
45588
45915
  );
@@ -45593,17 +45920,13 @@ function EventFlowTab({ events: events2 }) {
45593
45920
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--events", children: [
45594
45921
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 mb-3 flex-wrap", children: [
45595
45922
  /* @__PURE__ */ jsxRuntime.jsxs(ButtonGroup, { children: [
45596
- /* @__PURE__ */ jsxRuntime.jsxs(
45923
+ /* @__PURE__ */ jsxRuntime.jsx(
45597
45924
  Button,
45598
45925
  {
45599
45926
  size: "sm",
45600
45927
  variant: filter === "all" ? "primary" : "secondary",
45601
45928
  onClick: () => setFilter("all"),
45602
- children: [
45603
- "All (",
45604
- events2.length,
45605
- ")"
45606
- ]
45929
+ children: t("debug.allCount", { count: events2.length })
45607
45930
  }
45608
45931
  ),
45609
45932
  eventTypes.map((type) => {
@@ -45633,7 +45956,7 @@ function EventFlowTab({ events: events2 }) {
45633
45956
  onChange: (e) => setAutoScroll(e.target.checked)
45634
45957
  }
45635
45958
  ),
45636
- "Auto-scroll"
45959
+ t("debug.autoScroll")
45637
45960
  ] })
45638
45961
  ] }),
45639
45962
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -45691,7 +46014,7 @@ function GuardsPanel({ guards }) {
45691
46014
  EmptyState,
45692
46015
  {
45693
46016
  title: t("debug.noGuardEvaluations"),
45694
- description: "Guard evaluations will appear when transitions or ticks with guards execute",
46017
+ description: t("debug.guardEvaluationsHint"),
45695
46018
  className: "py-8"
45696
46019
  }
45697
46020
  );
@@ -45722,15 +46045,15 @@ function GuardsPanel({ guards }) {
45722
46045
  ] }),
45723
46046
  content: /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "sm", children: [
45724
46047
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
45725
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Expression" }),
46048
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.expression") }),
45726
46049
  /* @__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
46050
  ] }),
45728
46051
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
45729
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Inputs" }),
46052
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.inputs") }),
45730
46053
  /* @__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
46054
  ] }),
45732
46055
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
45733
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Trait" }),
46056
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.trait") }),
45734
46057
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: guard.context.traitName })
45735
46058
  ] })
45736
46059
  ] })
@@ -45748,9 +46071,9 @@ function GuardsPanel({ guards }) {
45748
46071
  ] })
45749
46072
  ] }),
45750
46073
  /* @__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" })
46074
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: t("debug.filterAll") }),
46075
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: t("debug.filterPassed") }),
46076
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", variant: filter === "failed" ? "primary" : "secondary", onClick: () => setFilter("failed"), children: t("debug.filterFailed") })
45754
46077
  ] })
45755
46078
  ] }),
45756
46079
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-80 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx(Accordion, { items: accordionItems }) })
@@ -45876,7 +46199,7 @@ function TransitionTimeline({ transitions }) {
45876
46199
  EmptyState,
45877
46200
  {
45878
46201
  title: t("debug.noTransitionsRecorded"),
45879
- description: "Transitions will appear as the state machine processes events",
46202
+ description: t("debug.transitionsProcessHint"),
45880
46203
  className: "py-8"
45881
46204
  }
45882
46205
  );
@@ -45893,10 +46216,7 @@ function TransitionTimeline({ transitions }) {
45893
46216
  const sorted = [...transitions].reverse();
45894
46217
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--timeline", children: [
45895
46218
  /* @__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
- ] }),
46219
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-500", children: t("debug.transitionsRecorded", { count: transitions.length }) }),
45900
46220
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-1 text-xs text-gray-500 cursor-pointer", children: [
45901
46221
  /* @__PURE__ */ jsxRuntime.jsx(
45902
46222
  Checkbox,
@@ -45905,7 +46225,7 @@ function TransitionTimeline({ transitions }) {
45905
46225
  onChange: (e) => setAutoScroll(e.target.checked)
45906
46226
  }
45907
46227
  ),
45908
- "Auto-scroll"
46228
+ t("debug.autoScroll")
45909
46229
  ] })
45910
46230
  ] }),
45911
46231
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -45948,15 +46268,13 @@ function TransitionTimeline({ transitions }) {
45948
46268
  variant: trace.guardResult ? "success" : "danger",
45949
46269
  size: "sm",
45950
46270
  children: [
45951
- "guard: ",
46271
+ t("debug.guardLabel"),
46272
+ " ",
45952
46273
  trace.guardResult ? "\u2713" : "\u2717"
45953
46274
  ]
45954
46275
  }
45955
46276
  ),
45956
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: [
45957
- trace.effects.length,
45958
- " effects"
45959
- ] })
46277
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: t("debug.effectsCount", { count: trace.effects.length }) })
45960
46278
  ] }),
45961
46279
  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
46280
  /* @__PURE__ */ jsxRuntime.jsx(EffectBadge, { effect }),
@@ -46005,13 +46323,13 @@ function ServerBridgeTab({ bridge }) {
46005
46323
  EmptyState,
46006
46324
  {
46007
46325
  title: t("debug.noBridgeData"),
46008
- description: "The ServerBridge has not been initialized. Bridge health will appear once the runtime connects to the server.",
46326
+ description: t("debug.bridgeInitHint"),
46009
46327
  className: "py-8"
46010
46328
  }
46011
46329
  );
46012
46330
  }
46013
46331
  const formatTime4 = (ts) => {
46014
- if (ts === 0) return "Never";
46332
+ if (ts === 0) return t("debug.never");
46015
46333
  const d = new Date(ts);
46016
46334
  return d.toLocaleTimeString("en-US", {
46017
46335
  hour12: false,
@@ -46024,14 +46342,14 @@ function ServerBridgeTab({ bridge }) {
46024
46342
  /* @__PURE__ */ jsxRuntime.jsxs(Card, { className: "p-3", children: [
46025
46343
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 mb-3", children: [
46026
46344
  /* @__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" })
46345
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: bridge.connected ? t("debug.connected") : t("debug.disconnected") })
46028
46346
  ] }),
46029
46347
  /* @__PURE__ */ jsxRuntime.jsxs(Stack, { gap: "xs", children: [
46030
46348
  /* @__PURE__ */ jsxRuntime.jsx(
46031
46349
  StatRow,
46032
46350
  {
46033
46351
  label: t("debug.status"),
46034
- value: bridge.connected ? "Connected" : "Disconnected",
46352
+ value: bridge.connected ? t("debug.connected") : t("debug.disconnected"),
46035
46353
  variant: bridge.connected ? "success" : "danger"
46036
46354
  }
46037
46355
  ),
@@ -46059,13 +46377,10 @@ function ServerBridgeTab({ bridge }) {
46059
46377
  ] })
46060
46378
  ] }),
46061
46379
  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" }),
46380
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "semibold", className: "text-red-600 dark:text-red-400 mb-1", children: t("debug.lastError") }),
46063
46381
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-red-500 font-mono break-all", children: bridge.lastError })
46064
46382
  ] }),
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
- ] }) })
46383
+ 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
46384
  ] }) });
46070
46385
  }
46071
46386
  var init_ServerBridgeTab = __esm({
@@ -46175,7 +46490,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
46175
46490
  EmptyState,
46176
46491
  {
46177
46492
  title: t("debug.noActiveTraits"),
46178
- description: "Traits will appear when the state machine initializes",
46493
+ description: t("debug.traitsInitHint"),
46179
46494
  className: "py-8"
46180
46495
  }
46181
46496
  );
@@ -46192,7 +46507,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
46192
46507
  };
46193
46508
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "debug-tab debug-tab--dispatch", children: [
46194
46509
  /* @__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" }),
46510
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.activeStates") }),
46196
46511
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: traits2.map((trait) => /* @__PURE__ */ jsxRuntime.jsxs(Badge, { variant: "success", size: "sm", children: [
46197
46512
  trait.name,
46198
46513
  ": ",
@@ -46200,8 +46515,8 @@ function EventDispatcherTab({ traits: traits2, schema }) {
46200
46515
  ] }, trait.id)) })
46201
46516
  ] }),
46202
46517
  /* @__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: [
46518
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.availableEvents") }),
46519
+ 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
46520
  /* @__PURE__ */ jsxRuntime.jsx(
46206
46521
  Button,
46207
46522
  {
@@ -46213,15 +46528,15 @@ function EventDispatcherTab({ traits: traits2, schema }) {
46213
46528
  }
46214
46529
  ),
46215
46530
  /* @__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" })
46531
+ transitions.some((tr) => tr.guard) && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "warning", size: "sm", children: t("debug.guarded") })
46217
46532
  ] }, event)) })
46218
46533
  ] }),
46219
46534
  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)" }),
46535
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.otherEvents") }),
46221
46536
  /* @__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
46537
  ] }),
46223
46538
  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" }),
46539
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.recentTransitions") }),
46225
46540
  /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: log16.map((entry, i) => /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "font-mono text-xs", children: [
46226
46541
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-400", children: entry.traitName }),
46227
46542
  " ",
@@ -46252,21 +46567,20 @@ var init_RuntimeDebugger = __esm({
46252
46567
  }
46253
46568
  });
46254
46569
  function ServerResponseRow({ sr }) {
46570
+ const { t } = useTranslate();
46255
46571
  const entityEntries = Object.entries(sr.dataEntities);
46256
46572
  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
46573
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
46258
46574
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: sr.success ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400", children: [
46259
46575
  sr.success ? "\u2713" : "\u2717",
46260
- " server"
46576
+ " ",
46577
+ t("debug.server")
46261
46578
  ] }),
46262
46579
  /* @__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
- ] }),
46580
+ 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
46581
  sr.emittedEvents.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "px-1 rounded bg-blue-500/15 text-blue-300", children: [
46269
- "emit: ",
46582
+ t("debug.emitLabel"),
46583
+ " ",
46270
46584
  sr.emittedEvents.join(", ")
46271
46585
  ] }),
46272
46586
  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 +46588,12 @@ function ServerResponseRow({ sr }) {
46274
46588
  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
46589
  name,
46276
46590
  ": ",
46277
- count,
46278
- " row",
46279
- count !== 1 ? "s" : ""
46591
+ t("debug.rowsCount", { count })
46280
46592
  ] }, name)) })
46281
46593
  ] });
46282
46594
  }
46283
46595
  function TransitionRow({ trace }) {
46596
+ const { t } = useTranslate();
46284
46597
  const isServerEntry = !!trace.serverResponse && trace.traitName.startsWith("server:");
46285
46598
  const hasFailedEffects = trace.effects.some((e) => e.status === "failed");
46286
46599
  if (isServerEntry && trace.serverResponse) {
@@ -46288,7 +46601,7 @@ function TransitionRow({ trace }) {
46288
46601
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-2 text-xs font-mono", children: [
46289
46602
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-1.5 w-1.5 h-1.5 rounded-full flex-shrink-0 bg-purple-500" }),
46290
46603
  /* @__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" })
46604
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-400 flex-shrink-0", children: t("debug.serverResponse") })
46292
46605
  ] }),
46293
46606
  /* @__PURE__ */ jsxRuntime.jsx(ServerResponseRow, { sr: trace.serverResponse })
46294
46607
  ] });
@@ -46329,6 +46642,7 @@ function VerifyModePanel({
46329
46642
  serverCount,
46330
46643
  localCount
46331
46644
  }) {
46645
+ const { t } = useTranslate();
46332
46646
  const [expanded, setExpanded] = React97__namespace.useState(true);
46333
46647
  const scrollRef = React97__namespace.useRef(null);
46334
46648
  const prevCountRef = React97__namespace.useRef(0);
@@ -46359,30 +46673,20 @@ function VerifyModePanel({
46359
46673
  onClick: () => setExpanded((v) => !v),
46360
46674
  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
46675
  "aria-expanded": expanded,
46362
- "aria-label": expanded ? "Collapse verification timeline" : "Expand verification timeline",
46676
+ "aria-label": expanded ? t("debug.collapseVerificationTimeline") : t("debug.expandVerificationTimeline"),
46363
46677
  "data-testid": "debugger-verify-toggle",
46364
46678
  children: [
46365
46679
  /* @__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
- ] }),
46680
+ /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? t("debug.failCount", { count: failedChecks }) : t("debug.ok") }),
46681
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground/70", children: t("debug.localCount", { count: localCount }) }),
46682
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-600 dark:text-purple-400", children: t("debug.serverCount", { count: serverCount }) }),
46375
46683
  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
- ] })
46684
+ !expanded && transitions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto text-foreground/50", children: t("debug.transitionsCount", { count: transitions.length }) })
46381
46685
  ]
46382
46686
  }
46383
46687
  ),
46384
46688
  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)) }) }) }),
46689
+ /* @__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
46690
  /* @__PURE__ */ jsxRuntime.jsx(WalkMinimap, {})
46387
46691
  ] })
46388
46692
  ]
@@ -46398,6 +46702,7 @@ function RuntimeDebugger({
46398
46702
  defaultTab,
46399
46703
  schema
46400
46704
  }) {
46705
+ const { t } = useTranslate();
46401
46706
  const [isCollapsed, setIsCollapsed] = React97__namespace.useState(mode === "verify" ? true : defaultCollapsed);
46402
46707
  const [isVisible, setIsVisible] = React97__namespace.useState(mode === "inline" || mode === "verify" || isDebugEnabled2());
46403
46708
  const debugData = useDebugData();
@@ -46436,55 +46741,55 @@ function RuntimeDebugger({
46436
46741
  const tabItems = [
46437
46742
  {
46438
46743
  id: "dispatch",
46439
- label: "Dispatch",
46744
+ label: t("debug.tabDispatch"),
46440
46745
  badge: debugData.traits.length || void 0,
46441
46746
  content: /* @__PURE__ */ jsxRuntime.jsx(EventDispatcherTab, { traits: debugData.traits, schema })
46442
46747
  },
46443
46748
  {
46444
46749
  id: "verify",
46445
- label: failedChecks > 0 ? "Verify (!)" : "Verify",
46750
+ label: failedChecks > 0 ? t("debug.tabVerifyAlert") : t("debug.tabVerify"),
46446
46751
  badge: verification.summary.totalChecks || void 0,
46447
46752
  content: /* @__PURE__ */ jsxRuntime.jsx(VerificationTab, { checks: verification.checks, summary: verification.summary })
46448
46753
  },
46449
46754
  {
46450
46755
  id: "timeline",
46451
- label: "Timeline",
46756
+ label: t("debug.tabTimeline"),
46452
46757
  badge: verification.transitions.length || void 0,
46453
46758
  content: /* @__PURE__ */ jsxRuntime.jsx(TransitionTimeline, { transitions: verification.transitions })
46454
46759
  },
46455
46760
  {
46456
46761
  id: "bridge",
46457
- label: "Bridge",
46762
+ label: t("debug.tabBridge"),
46458
46763
  badge: verification.bridge?.connected ? void 0 : 1,
46459
46764
  content: /* @__PURE__ */ jsxRuntime.jsx(ServerBridgeTab, { bridge: verification.bridge })
46460
46765
  },
46461
46766
  {
46462
46767
  id: "traits",
46463
- label: "Traits",
46768
+ label: t("debug.tabTraits"),
46464
46769
  badge: debugData.traits.length || void 0,
46465
46770
  content: /* @__PURE__ */ jsxRuntime.jsx(TraitsTab, { traits: debugData.traits })
46466
46771
  },
46467
46772
  {
46468
46773
  id: "ticks",
46469
- label: "Ticks",
46470
- badge: debugData.ticks.filter((t) => t.active).length || void 0,
46774
+ label: t("debug.tabTicks"),
46775
+ badge: debugData.ticks.filter((tick) => tick.active).length || void 0,
46471
46776
  content: /* @__PURE__ */ jsxRuntime.jsx(TicksTab, { ticks: debugData.ticks })
46472
46777
  },
46473
46778
  {
46474
46779
  id: "entities",
46475
- label: "Entities",
46780
+ label: t("debug.tabEntities"),
46476
46781
  badge: debugData.entitySnapshot?.runtime.length || void 0,
46477
46782
  content: /* @__PURE__ */ jsxRuntime.jsx(EntitiesTab, { snapshot: debugData.entitySnapshot })
46478
46783
  },
46479
46784
  {
46480
46785
  id: "events",
46481
- label: "Events",
46786
+ label: t("debug.tabEvents"),
46482
46787
  badge: debugData.events.length > 0 ? debugData.events.length : void 0,
46483
46788
  content: /* @__PURE__ */ jsxRuntime.jsx(EventFlowTab, { events: debugData.events })
46484
46789
  },
46485
46790
  {
46486
46791
  id: "guards",
46487
- label: "Guards",
46792
+ label: t("debug.tabGuards"),
46488
46793
  badge: debugData.guards.filter((g) => !g.result).length || void 0,
46489
46794
  content: /* @__PURE__ */ jsxRuntime.jsx(GuardsPanel, { guards: debugData.guards })
46490
46795
  }
@@ -46512,15 +46817,10 @@ function RuntimeDebugger({
46512
46817
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
46513
46818
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "h6", style: { fontSize: "0.75rem" }, children: [
46514
46819
  isCollapsed ? "\u25B6" : "\u25BC",
46515
- " Debugger"
46820
+ " ",
46821
+ t("debug.debugger")
46516
46822
  ] }),
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" })
46823
+ 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
46824
  ] })
46525
46825
  }
46526
46826
  ),
@@ -46538,9 +46838,9 @@ function RuntimeDebugger({
46538
46838
  );
46539
46839
  }
46540
46840
  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);
46841
+ const traitStates = debugData.traits.map((t2) => `${t2.name}:${t2.currentState}`).join(" | ");
46842
+ const serverEntries = verification.transitions.filter((t2) => t2.serverResponse);
46843
+ const localEntries = verification.transitions.filter((t2) => !t2.serverResponse);
46544
46844
  return /* @__PURE__ */ jsxRuntime.jsx(
46545
46845
  VerifyModePanel,
46546
46846
  {
@@ -46572,7 +46872,7 @@ function RuntimeDebugger({
46572
46872
  variant: "secondary",
46573
46873
  size: "sm",
46574
46874
  className: "runtime-debugger__toggle",
46575
- title: "Open Debugger (`)",
46875
+ title: t("debug.openDebugger"),
46576
46876
  children: failedChecks > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "relative", children: [
46577
46877
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: "V" }),
46578
46878
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute -top-1 -right-2 w-2 h-2 bg-red-500 rounded-full" })
@@ -46582,11 +46882,8 @@ function RuntimeDebugger({
46582
46882
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "runtime-debugger__header", children: [
46583
46883
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
46584
46884
  /* @__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" })
46885
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h6", children: t("debug.kflowVerifier") }),
46886
+ 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
46887
  ] }),
46591
46888
  /* @__PURE__ */ jsxRuntime.jsx(
46592
46889
  Button,
@@ -46594,7 +46891,7 @@ function RuntimeDebugger({
46594
46891
  onClick: () => setIsCollapsed(true),
46595
46892
  variant: "ghost",
46596
46893
  size: "sm",
46597
- title: "Close (`)",
46894
+ title: t("debug.close"),
46598
46895
  children: "x"
46599
46896
  }
46600
46897
  )
@@ -46608,7 +46905,7 @@ function RuntimeDebugger({
46608
46905
  className: "runtime-debugger__tabs"
46609
46906
  }
46610
46907
  ) }),
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" }) })
46908
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "runtime-debugger__footer", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-foreground/50", children: t("debug.toggleHint") }) })
46612
46909
  ] })
46613
46910
  }
46614
46911
  );
@@ -46634,6 +46931,7 @@ var init_RuntimeDebugger2 = __esm({
46634
46931
  init_TransitionTimeline();
46635
46932
  init_ServerBridgeTab();
46636
46933
  init_EventDispatcherTab();
46934
+ init_useTranslate();
46637
46935
  init_RuntimeDebugger();
46638
46936
  RuntimeDebugger.displayName = "RuntimeDebugger";
46639
46937
  }
@@ -47922,7 +48220,7 @@ var init_StatCard = __esm({
47922
48220
  }
47923
48221
  );
47924
48222
  }
47925
- const label = schemaStats?.[0]?.label || labelToUse || "Stat";
48223
+ const label = schemaStats?.[0]?.label || labelToUse || t("statCard.defaultLabel");
47926
48224
  const normalizedPropValue = Array.isArray(propValue) ? propValue[0] ?? propValue.length : propValue;
47927
48225
  const value = schemaStats?.[0]?.value ?? normalizedPropValue ?? 0;
47928
48226
  const trendDirection = manualDirection || (calculatedTrend === void 0 || calculatedTrend === 0 ? "neutral" : calculatedTrend > 0 ? "up" : "down");
@@ -47965,7 +48263,7 @@ var init_StatCard = __esm({
47965
48263
  ]
47966
48264
  }
47967
48265
  ),
47968
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", as: "span", children: "vs last period" })
48266
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", as: "span", children: t("statCard.vsLastPeriod") })
47969
48267
  ] }),
47970
48268
  subtitle && !calculatedTrend && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", children: subtitle })
47971
48269
  ] }),
@@ -52170,6 +52468,9 @@ var AvlEmitListen = ({
52170
52468
  ] });
52171
52469
  };
52172
52470
  AvlEmitListen.displayName = "AvlEmitListen";
52471
+
52472
+ // components/avl/molecules/AvlSlotMap.tsx
52473
+ init_useTranslate();
52173
52474
  var SLOT_PRESETS = {
52174
52475
  header: { x: 10, y: 5, width: 340, height: 35 },
52175
52476
  main: { x: 120, y: 50, width: 230, height: 195 },
@@ -52214,6 +52515,7 @@ var AvlSlotMap = ({
52214
52515
  color = "var(--color-primary)",
52215
52516
  animated = false
52216
52517
  }) => {
52518
+ const { t } = useTranslate();
52217
52519
  const ox = (600 - pageWidth) / 2;
52218
52520
  const oy = (400 - pageHeight) / 2;
52219
52521
  let unknownIdx = 0;
@@ -52264,7 +52566,7 @@ var AvlSlotMap = ({
52264
52566
  fontSize: 10,
52265
52567
  fontFamily: "inherit",
52266
52568
  fontWeight: "bold",
52267
- children: "Page Layout"
52569
+ children: t("avl.pageLayout")
52268
52570
  }
52269
52571
  ),
52270
52572
  resolvedSlots.map((slot) => {
@@ -52313,7 +52615,7 @@ var AvlSlotMap = ({
52313
52615
  opacity: 0.6,
52314
52616
  children: [
52315
52617
  slot.name,
52316
- isOverlay ? " (overlay)" : ""
52618
+ isOverlay ? ` ${t("avl.overlaySuffix")}` : ""
52317
52619
  ]
52318
52620
  }
52319
52621
  )
@@ -53245,23 +53547,25 @@ var SystemNode = ({ data }) => {
53245
53547
  SystemNode.displayName = "SystemNode";
53246
53548
 
53247
53549
  // components/avl/molecules/DetailView.tsx
53550
+ init_useTranslate();
53248
53551
  init_AvlState();
53249
53552
  init_AvlEffect();
53250
53553
  init_types();
53251
53554
  var DetailView = ({ data }) => {
53555
+ const { t } = useTranslate();
53252
53556
  const traitName = data.traits[0]?.name;
53253
53557
  const traitData = traitName ? data.traitDetails[traitName] : void 0;
53254
53558
  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" });
53559
+ 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
53560
  }
53257
53561
  const transition = traitData.transitions[0];
53258
53562
  const fromState = traitData.states.find((s) => s.name === transition.from);
53259
53563
  const toState = traitData.states.find((s) => s.name === transition.to);
53260
53564
  const transitionCounts = {};
53261
53565
  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;
53566
+ for (const t2 of traitData.transitions) {
53567
+ transitionCounts[t2.from] = (transitionCounts[t2.from] ?? 0) + 1;
53568
+ transitionCounts[t2.to] = (transitionCounts[t2.to] ?? 0) + 1;
53265
53569
  }
53266
53570
  const maxTC = Math.max(...Object.values(transitionCounts), 0);
53267
53571
  const fromRole = getStateRole(transition.from, fromState?.isInitial, fromState?.isTerminal, transitionCounts[transition.from] ?? 0, maxTC);
@@ -53278,21 +53582,21 @@ var DetailView = ({ data }) => {
53278
53582
  ] }) }),
53279
53583
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-4 py-3 space-y-3", children: [
53280
53584
  /* @__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" }),
53585
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs uppercase tracking-wider text-[var(--color-muted-foreground)] mb-1", children: t("avl.trigger") }),
53282
53586
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5", children: [
53283
53587
  /* @__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
53588
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-semibold text-[var(--color-foreground)]", children: transition.event })
53285
53589
  ] })
53286
53590
  ] }),
53287
53591
  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" }),
53592
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs uppercase tracking-wider text-[var(--color-muted-foreground)] mb-1", children: t("avl.guard") }),
53289
53593
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5", children: [
53290
53594
  /* @__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
53595
  /* @__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
53596
  ] })
53293
53597
  ] }),
53294
53598
  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" }),
53599
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs uppercase tracking-wider text-[var(--color-muted-foreground)] mb-1", children: t("avl.effects") }),
53296
53600
  /* @__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
53601
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs text-[var(--color-muted-foreground)] w-3 text-right mt-0.5", children: [
53298
53602
  i + 1,
@@ -53328,6 +53632,7 @@ AvlOrbitalNode.displayName = "AvlOrbitalNode";
53328
53632
 
53329
53633
  // components/avl/molecules/AvlTransitionEdge.tsx
53330
53634
  init_types();
53635
+ init_useTranslate();
53331
53636
  var AvlTransitionEdge = ({
53332
53637
  id,
53333
53638
  sourceX,
@@ -53340,6 +53645,7 @@ var AvlTransitionEdge = ({
53340
53645
  markerEnd,
53341
53646
  style
53342
53647
  }) => {
53648
+ const { t } = useTranslate();
53343
53649
  const [path, labelX, labelY] = react.getBezierPath({
53344
53650
  sourceX,
53345
53651
  sourceY,
@@ -53371,9 +53677,9 @@ var AvlTransitionEdge = ({
53371
53677
  className: "absolute pointer-events-all nodrag nopan flex items-center gap-1",
53372
53678
  style: { transform: `translate(-50%, -50%) translate(${labelX}px, ${labelY}px)` },
53373
53679
  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" }),
53680
+ 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
53681
  /* @__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" })
53682
+ 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
53683
  ]
53378
53684
  }
53379
53685
  ) })
@@ -56694,6 +57000,7 @@ function BrowserPlayground({
56694
57000
 
56695
57001
  // components/avl/molecules/OrbPreviewNode.tsx
56696
57002
  init_useEventBus();
57003
+ init_useTranslate();
56697
57004
 
56698
57005
  // components/avl/molecules/useCanvasDnd.tsx
56699
57006
  init_useEventBus();
@@ -57181,6 +57488,7 @@ var OrbPreviewNodeInner = (props) => {
57181
57488
  const screenSize = React97.useContext(ScreenSizeContext);
57182
57489
  const preset = SCREEN_SIZE_PRESETS[screenSize];
57183
57490
  const { select } = React97.useContext(PatternSelectionContext);
57491
+ const { t } = useTranslate();
57184
57492
  const eventBus = useEventBus();
57185
57493
  const reactFlow = react.useReactFlow();
57186
57494
  const contentRef = React97.useRef(null);
@@ -57201,7 +57509,7 @@ var OrbPreviewNodeInner = (props) => {
57201
57509
  const isSuccess = status === "success";
57202
57510
  const isError = status === "error";
57203
57511
  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 ?? "";
57512
+ 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
57513
  const orbitalSchema = React97.useMemo(() => {
57206
57514
  const fullSchema = data._fullSchema;
57207
57515
  if (!fullSchema) return void 0;
@@ -57369,7 +57677,7 @@ var OrbPreviewNodeInner = (props) => {
57369
57677
  color: "var(--color-muted-foreground)",
57370
57678
  zIndex: 3
57371
57679
  },
57372
- children: "Preview"
57680
+ children: t("orbPreview.previewBadge")
57373
57681
  }
57374
57682
  ),
57375
57683
  hovered && !dragActive && !l1IsOver && /* @__PURE__ */ jsxRuntime.jsx(
@@ -57391,7 +57699,7 @@ var OrbPreviewNodeInner = (props) => {
57391
57699
  },
57392
57700
  children: [
57393
57701
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 12 }, children: "\u279E" }),
57394
- "Double-click to open"
57702
+ t("orbPreview.doubleClickToOpen")
57395
57703
  ]
57396
57704
  }
57397
57705
  )
@@ -57414,7 +57722,7 @@ var OrbPreviewNodeInner = (props) => {
57414
57722
  color: "var(--color-primary-foreground)",
57415
57723
  boxShadow: "var(--shadow-lg)"
57416
57724
  },
57417
- children: "Drop to add and open"
57725
+ children: t("orbPreview.dropToAddAndOpen")
57418
57726
  }
57419
57727
  )
57420
57728
  }
@@ -57448,7 +57756,7 @@ var OrbPreviewNodeInner = (props) => {
57448
57756
  borderTopColor: "transparent",
57449
57757
  zIndex: 2
57450
57758
  },
57451
- title: "Coordinator is dispatching to this orbital"
57759
+ title: t("orbPreview.dispatching")
57452
57760
  }
57453
57761
  )
57454
57762
  ] }),
@@ -57544,7 +57852,7 @@ var OrbPreviewNodeInner = (props) => {
57544
57852
  height: "auto"
57545
57853
  }
57546
57854
  ) })
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" }) })
57855
+ ) : /* @__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
57856
  ]
57549
57857
  }
57550
57858
  ),
@@ -58135,7 +58443,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58135
58443
  const handleRemoveEffect = React97.useCallback((effectIndex) => {
58136
58444
  eventBus.emit("UI:REMOVE_EFFECT", { effectIndex });
58137
58445
  }, [eventBus]);
58138
- const headerTitle = selectedPattern ? selectedPattern.patternType : isExpanded ? transitionEvent || "Transition" : orbitalName;
58446
+ const headerTitle = selectedPattern ? selectedPattern.patternType : isExpanded ? transitionEvent || t("avl.transition") : orbitalName;
58139
58447
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex flex-col bg-card border-l border-border h-full w-full sm:w-[340px]", children: [
58140
58448
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "shrink-0 border-b border-border", children: [
58141
58449
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center justify-between px-4 py-2", children: [
@@ -58152,7 +58460,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58152
58460
  {
58153
58461
  onClick: onClose,
58154
58462
  className: "text-muted-foreground hover:text-foreground text-sm cursor-pointer bg-transparent border-none p-1",
58155
- "aria-label": "Close",
58463
+ "aria-label": t("common.close"),
58156
58464
  children: "\xD7"
58157
58465
  }
58158
58466
  )
@@ -58162,7 +58470,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58162
58470
  {
58163
58471
  onClick: () => setActiveTab(tab),
58164
58472
  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
58473
+ children: t(`orbInspector.tab.${tab}`)
58166
58474
  },
58167
58475
  tab
58168
58476
  )) })
@@ -58208,7 +58516,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58208
58516
  /* ── Inspector Tab ── */
58209
58517
  /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
58210
58518
  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") }),
58519
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("avl.props") }),
58212
58520
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex flex-col gap-1.5", children: Object.entries(patternDef.propsSchema).slice(0, 12).map(([propName, propSchema]) => {
58213
58521
  const ps = propSchema;
58214
58522
  const explicitValue = patternConfig ? patternConfig[propName] : void 0;
@@ -58242,7 +58550,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58242
58550
  }) })
58243
58551
  ] }),
58244
58552
  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") }),
58553
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("avl.entity") }),
58246
58554
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "flex items-center gap-2 mb-2", children: [
58247
58555
  /* @__PURE__ */ jsxRuntime.jsx("svg", { width: 14, height: 14, children: /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: 7, cy: 7, r: 5, fill: "var(--color-primary)" }) }),
58248
58556
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "font-semibold text-xs", children: entity.name }),
@@ -58285,7 +58593,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58285
58593
  ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
58286
58594
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-xs font-mono flex-1", children: f3.name }),
58287
58595
  /* @__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") })
58596
+ f3.required && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-primary text-[9px]", children: t("orbInspector.required") })
58289
58597
  ] })
58290
58598
  ] }, f3.name)) }),
58291
58599
  editable && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -58297,13 +58605,13 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58297
58605
  className: "mt-2 text-xs w-full",
58298
58606
  children: [
58299
58607
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", size: "xs", className: "mr-1" }),
58300
- t("Add Field")
58608
+ t("orbInspector.addField")
58301
58609
  ]
58302
58610
  }
58303
58611
  )
58304
58612
  ] }),
58305
58613
  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") }),
58614
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("orbInspector.serviceMode") }),
58307
58615
  /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", className: "items-center", children: [
58308
58616
  /* @__PURE__ */ jsxRuntime.jsxs(
58309
58617
  Button,
@@ -58316,7 +58624,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58316
58624
  },
58317
58625
  children: [
58318
58626
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "monitor", size: "xs", className: "mr-1" }),
58319
- t("Standalone")
58627
+ t("orbInspector.standalone")
58320
58628
  ]
58321
58629
  }
58322
58630
  ),
@@ -58331,25 +58639,22 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58331
58639
  },
58332
58640
  children: [
58333
58641
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "cpu", size: "xs", className: "mr-1" }),
58334
- t("Embedded")
58642
+ t("orbInspector.embedded")
58335
58643
  ]
58336
58644
  }
58337
58645
  )
58338
58646
  ] }),
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") })
58647
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs mt-1", children: hasRenderUi ? t("orbInspector.rendersOwnUi") : t("orbInspector.headless") })
58340
58648
  ] }),
58341
58649
  !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)) })
58650
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("avl.traits") }),
58651
+ /* @__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: [
58652
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-xs font-semibold", children: tr.name }),
58653
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs", children: t("orbInspector.statesCount", { count: tr.stateCount }) })
58654
+ ] }, tr.name)) })
58350
58655
  ] }),
58351
58656
  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" }),
58657
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("avl.transition") }),
58353
58658
  /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "100%", height: 44, viewBox: "0 0 280 44", children: [
58354
58659
  /* @__PURE__ */ jsxRuntime.jsx(exports.AvlState, { x: 8, y: 8, name: fromState, role: getStateRole(fromState), width: 90, height: 26 }),
58355
58660
  /* @__PURE__ */ jsxRuntime.jsx("line", { x1: 104, y1: 21, x2: 158, y2: 21, stroke: "#1E293B", strokeWidth: 2, markerEnd: "url(#orb-arrow)" }),
@@ -58358,7 +58663,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58358
58663
  ] }),
58359
58664
  traitName && /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-muted-foreground text-xs", children: [
58360
58665
  traitName,
58361
- entityName ? ` on ${entityName}` : ""
58666
+ entityName ? t("orbInspector.onEntity", { entity: entityName }) : ""
58362
58667
  ] })
58363
58668
  ] }),
58364
58669
  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 +58676,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58371
58676
  Input,
58372
58677
  {
58373
58678
  defaultValue: formatExpression(transition?.guard ?? guard),
58374
- placeholder: t("Guard expression"),
58679
+ placeholder: t("orbInspector.guardExpression"),
58375
58680
  className: "flex-1 text-xs font-mono h-6",
58376
58681
  onBlur: (e) => handleGuardChange(e.target.value)
58377
58682
  }
@@ -58379,7 +58684,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58379
58684
  ] }) }),
58380
58685
  userType === "architect" && (effectTypes.length > 0 || editable) && isExpanded && /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "px-4 py-3 border-b border-border/40", children: [
58381
58686
  /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: [
58382
- t("Effects"),
58687
+ t("avl.effects"),
58383
58688
  " (",
58384
58689
  effectTypes.length,
58385
58690
  ")"
@@ -58436,7 +58741,7 @@ function AddEffectButton({ onAdd }) {
58436
58741
  className: "text-xs w-full",
58437
58742
  children: [
58438
58743
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "plus", size: "xs", className: "mr-1" }),
58439
- t("Add Effect")
58744
+ t("orbInspector.addEffect")
58440
58745
  ]
58441
58746
  }
58442
58747
  ),
@@ -58497,7 +58802,7 @@ var PHASE_2_TOKEN_FALLBACK = {
58497
58802
  function StylesTab({ patternType, patternDef, patternConfig, editable, onPropChange, themeManifest, isDesignSystem }) {
58498
58803
  const { t } = useTranslate();
58499
58804
  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.") }) });
58805
+ 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
58806
  }
58502
58807
  const tier = patternDef?.category ?? "Pattern";
58503
58808
  const tokens = PHASE_2_TOKEN_FALLBACK[patternType] ?? [];
@@ -58518,11 +58823,11 @@ function StylesTab({ patternType, patternDef, patternConfig, editable, onPropCha
58518
58823
  )
58519
58824
  ] }),
58520
58825
  /* @__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)) })
58826
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("orbInspector.tokens") }),
58827
+ 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
58828
  ] }),
58524
58829
  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") }),
58830
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("orbInspector.variant") }),
58526
58831
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex flex-wrap gap-1", children: variantEnum.map((variant) => {
58527
58832
  const isActive = variant === currentVariant || !currentVariant && variant === "default";
58528
58833
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -58542,7 +58847,7 @@ function StylesTab({ patternType, patternDef, patternConfig, editable, onPropCha
58542
58847
  }) })
58543
58848
  ] }),
58544
58849
  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") }),
58850
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("orbInspector.size") }),
58546
58851
  /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex flex-wrap gap-1", children: sizeEnum.map((size) => {
58547
58852
  const isActive = size === currentSize || !currentSize && size === "md";
58548
58853
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -58565,20 +58870,21 @@ function StylesTab({ patternType, patternDef, patternConfig, editable, onPropCha
58565
58870
  ] });
58566
58871
  }
58567
58872
  var TOKEN_GROUPS = [
58568
- { group: "colors", label: "Colors" },
58569
- { group: "radii", label: "Radii" },
58570
- { group: "spacing", label: "Spacing" },
58571
- { group: "shadows", label: "Shadows" }
58873
+ { group: "colors", labelKey: "orbInspector.tokenGroup.colors" },
58874
+ { group: "radii", labelKey: "orbInspector.tokenGroup.radii" },
58875
+ { group: "spacing", labelKey: "orbInspector.tokenGroup.spacing" },
58876
+ { group: "shadows", labelKey: "orbInspector.tokenGroup.shadows" }
58572
58877
  ];
58573
58878
  function TokenEditorSection({ themeManifest, onPropChange }) {
58879
+ const { t } = useTranslate();
58574
58880
  const tokens = themeManifest.tokens ?? {};
58575
58881
  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 }) => {
58882
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-xs uppercase tracking-wider text-muted-foreground", children: t("orbInspector.projectThemeTokens") }),
58883
+ TOKEN_GROUPS.map(({ group, labelKey }) => {
58578
58884
  const entries = Object.entries(tokens[group] ?? {});
58579
58885
  if (entries.length === 0) return null;
58580
58886
  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 }),
58887
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-xs font-mono text-muted-foreground", children: t(labelKey) }),
58582
58888
  entries.map(([key, value]) => /* @__PURE__ */ jsxRuntime.jsx(
58583
58889
  TokenRow,
58584
58890
  {
@@ -58626,6 +58932,7 @@ init_Typography();
58626
58932
  init_Badge();
58627
58933
 
58628
58934
  // components/avl/organisms/AvlTraitScene.tsx
58935
+ init_useTranslate();
58629
58936
  init_AvlState();
58630
58937
  init_AvlTransitionLane();
58631
58938
  init_AvlSwimLane();
@@ -58639,6 +58946,7 @@ var AvlTraitScene = ({
58639
58946
  color = "var(--color-primary)",
58640
58947
  onTransitionClick
58641
58948
  }) => {
58949
+ const { t } = useTranslate();
58642
58950
  const [layout, setLayout] = React97.useState(null);
58643
58951
  const dataKey = React97.useMemo(() => JSON.stringify(data), [data]);
58644
58952
  React97.useEffect(() => {
@@ -58647,7 +58955,7 @@ var AvlTraitScene = ({
58647
58955
  });
58648
58956
  }, [dataKey]);
58649
58957
  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..." }) });
58958
+ 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
58959
  }
58652
58960
  const hasExternal = data.listenedEvents.length > 0 || data.emittedEvents.length > 0;
58653
58961
  const machineOffsetX = hasExternal ? 0 : 30;
@@ -58662,10 +58970,7 @@ var AvlTraitScene = ({
58662
58970
  const machineHeight = scaledH + 100;
58663
58971
  const renderMachine = /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
58664
58972
  /* @__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
- ] }),
58973
+ /* @__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
58974
  /* @__PURE__ */ jsxRuntime.jsxs("defs", { children: [
58670
58975
  /* @__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
58976
  /* @__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 +59045,9 @@ var AvlTraitScene = ({
58740
59045
  );
58741
59046
  };
58742
59047
  AvlTraitScene.displayName = "AvlTraitScene";
59048
+
59049
+ // components/avl/molecules/TraitCardNode.tsx
59050
+ init_useTranslate();
58743
59051
  var TraitCardSelectionContext = React97.createContext({
58744
59052
  selectTransition: () => {
58745
59053
  }
@@ -58749,6 +59057,7 @@ var SCENE_WIDTH = 600;
58749
59057
  var SCENE_HEIGHT = 400;
58750
59058
  var TraitCardNodeInner = (props) => {
58751
59059
  const data = props.data;
59060
+ const { t } = useTranslate();
58752
59061
  const { selectTransition } = React97.useContext(TraitCardSelectionContext);
58753
59062
  const orbitalName = data.orbitalName;
58754
59063
  const traitName = data.traitName ?? "";
@@ -58774,7 +59083,7 @@ var TraitCardNodeInner = (props) => {
58774
59083
  position: react.Position.Left,
58775
59084
  id: `listen-${event}`,
58776
59085
  style: { top: `${(i + 1) / (listens.length + 1) * 100}%` },
58777
- "aria-label": `listens for ${event}`
59086
+ "aria-label": t("avl.listensFor", { event })
58778
59087
  },
58779
59088
  `listen-${event}`
58780
59089
  )),
@@ -58785,7 +59094,7 @@ var TraitCardNodeInner = (props) => {
58785
59094
  position: react.Position.Right,
58786
59095
  id: `emit-${event}`,
58787
59096
  style: { top: `${(i + 1) / (emits.length + 1) * 100}%` },
58788
- "aria-label": `emits ${event}`
59097
+ "aria-label": t("avl.emits", { event })
58789
59098
  },
58790
59099
  `emit-${event}`
58791
59100
  )),
@@ -58812,14 +59121,14 @@ var TraitCardNodeInner = (props) => {
58812
59121
  {
58813
59122
  data: traitLevelData,
58814
59123
  onTransitionClick: (idx) => {
58815
- const t = transitions[idx];
58816
- if (!t) return;
59124
+ const t2 = transitions[idx];
59125
+ if (!t2) return;
58817
59126
  selectTransition({
58818
59127
  orbitalName,
58819
59128
  traitName,
58820
- transitionEvent: t.event,
58821
- fromState: t.fromState,
58822
- toState: t.toState,
59129
+ transitionEvent: t2.event,
59130
+ fromState: t2.fromState,
59131
+ toState: t2.toState,
58823
59132
  index: idx
58824
59133
  });
58825
59134
  }
@@ -58827,7 +59136,7 @@ var TraitCardNodeInner = (props) => {
58827
59136
  )
58828
59137
  }
58829
59138
  )
58830
- ) : /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "muted", children: "No state machine" })
59139
+ ) : /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "muted", children: t("avl.noStateMachine") })
58831
59140
  ] })
58832
59141
  ]
58833
59142
  }
@@ -58838,6 +59147,7 @@ TraitCardNode.displayName = "TraitCardNode";
58838
59147
 
58839
59148
  // components/avl/organisms/FlowCanvas.tsx
58840
59149
  init_useEventBus();
59150
+ init_useTranslate();
58841
59151
  var flowCanvasLog = logger.createLogger("almadar:ui:flow-canvas");
58842
59152
  var NODE_TYPES = {
58843
59153
  preview: OrbPreviewNode,
@@ -58881,6 +59191,7 @@ function FlowCanvasInner({
58881
59191
  userType = "builder",
58882
59192
  themeManifest
58883
59193
  }) {
59194
+ const { t } = useTranslate();
58884
59195
  const NODE_TYPES2 = React97.useMemo(() => ({
58885
59196
  preview: OrbPreviewNode,
58886
59197
  behaviorCompose: BehaviorComposeNode,
@@ -58933,13 +59244,13 @@ function FlowCanvasInner({
58933
59244
  }), [selectedPattern]);
58934
59245
  const [atBehaviorLevel, setAtBehaviorLevel] = React97.useState(composeLevel === "behavior");
58935
59246
  const { composeNodes, composeEdges, overviewNodes, overviewEdges, expandedNodes, expandedEdges, behaviorExpandedNodes, behaviorExpandedEdges, traitExpandedNodes, traitExpandedEdges } = React97.useMemo(() => {
58936
- const t = perfStart("compose-graph");
59247
+ const t2 = perfStart("compose-graph");
58937
59248
  const compose = composeLevel === "behavior" && behaviorEntries?.length ? behaviorsToComposeGraph(behaviorEntries, behaviorWires ?? [], layoutHint) : { nodes: [], edges: [] };
58938
59249
  const overview = schemaToOverviewGraph(parsedSchema, mockData, behaviorMeta, layoutHint, orbitalStatus, screenSize);
58939
59250
  const expanded = expandedOrbital ? orbitalToExpandedGraph(parsedSchema, expandedOrbital, mockData, screenSize) : { nodes: [], edges: [] };
58940
59251
  const behaviorExpanded = expandedOrbital && expandedBehaviorAlias ? orbitalAliasToExpandedGraph(parsedSchema, expandedOrbital, expandedBehaviorAlias, mockData, screenSize) : { nodes: [], edges: [] };
58941
59252
  const traitExpanded = expandedOrbital ? orbitalToTraitGraph(parsedSchema, expandedOrbital) : { nodes: [], edges: [] };
58942
- perfEnd("compose-graph", t, {
59253
+ perfEnd("compose-graph", t2, {
58943
59254
  composeNodes: compose.nodes.length,
58944
59255
  overviewNodes: overview.nodes.length,
58945
59256
  expandedNodes: expanded.nodes.length,
@@ -59192,12 +59503,12 @@ function FlowCanvasInner({
59192
59503
  {
59193
59504
  onClick: handleGoBack,
59194
59505
  className: "text-muted-foreground hover:text-foreground text-sm cursor-pointer bg-transparent border-none p-0",
59195
- "aria-label": "Go back to overview",
59506
+ "aria-label": t("canvas.goBackToOverview"),
59196
59507
  children: "\u2190"
59197
59508
  }
59198
59509
  ),
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` })
59510
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "font-medium", children: level === "overview" ? t("canvas.overview") : expandedOrbital ?? t("canvas.expanded") }),
59511
+ /* @__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
59512
  ] }),
59202
59513
  /* @__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
59514
  const p2 = SCREEN_SIZE_PRESETS[size];
@@ -59213,7 +59524,7 @@ function FlowCanvasInner({
59213
59524
  },
59214
59525
  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
59526
  title: `${p2.label} (${p2.width}px)`,
59216
- "aria-label": `Switch to ${p2.label} view`,
59527
+ "aria-label": t("canvas.switchToView", { label: p2.label }),
59217
59528
  children: p2.label
59218
59529
  },
59219
59530
  size
@@ -59595,6 +59906,7 @@ init_Stack();
59595
59906
  init_Typography();
59596
59907
  init_Button();
59597
59908
  init_Icon();
59909
+ init_useTranslate();
59598
59910
  var UNIT_DISPLAY_W = 240;
59599
59911
  var UNIT_DISPLAY_H = 160;
59600
59912
  function layoutOrbitals(count, containerW, containerH) {
@@ -59785,6 +60097,7 @@ var AvlOrbitalsCosmicZoom = ({
59785
60097
  minZoom = 0.4,
59786
60098
  maxZoom = 3
59787
60099
  }) => {
60100
+ const { t } = useTranslate();
59788
60101
  const parsedSchema = React97.useMemo(() => {
59789
60102
  if (typeof schemaProp === "string") return JSON.parse(schemaProp);
59790
60103
  return schemaProp;
@@ -59852,9 +60165,9 @@ var AvlOrbitalsCosmicZoom = ({
59852
60165
  (ctx) => {
59853
60166
  if (ctx.level !== "transition" || !ctx.trait || !ctx.transition) return;
59854
60167
  const orbital = parsedSchema.orbitals?.find((o) => o.name === ctx.orbital);
59855
- const traitRef = orbital?.traits?.find((t) => core.isInlineTrait(t) && t.name === ctx.trait);
60168
+ const traitRef = orbital?.traits?.find((t2) => core.isInlineTrait(t2) && t2.name === ctx.trait);
59856
60169
  if (!traitRef || !core.isInlineTrait(traitRef)) return;
59857
- const idx = traitRef.stateMachine?.transitions?.findIndex((t) => t.event === ctx.transition) ?? -1;
60170
+ const idx = traitRef.stateMachine?.transitions?.findIndex((t2) => t2.event === ctx.transition) ?? -1;
59858
60171
  if (idx < 0) return;
59859
60172
  dispatch({ type: "SELECT_TRAIT", trait: ctx.trait });
59860
60173
  dispatch({ type: "ZOOM_INTO_TRANSITION", transitionIndex: idx, targetPosition: { x: 0, y: 0 } });
@@ -60030,7 +60343,7 @@ var AvlOrbitalsCosmicZoom = ({
60030
60343
  borderRadius: 4,
60031
60344
  opacity: 0.8
60032
60345
  },
60033
- children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", style: { color }, children: "Press Esc to zoom out" })
60346
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", style: { color }, children: t("avl.pressEscToZoomOut") })
60034
60347
  }
60035
60348
  ),
60036
60349
  state.level === "application" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -60082,7 +60395,7 @@ var AvlOrbitalsCosmicZoom = ({
60082
60395
  onKeyDown: (e) => {
60083
60396
  if (e.key === "Enter" || e.key === " ") handleSelect(view.name);
60084
60397
  },
60085
- "aria-label": `Orbital: ${view.name}${isHighlighted ? " (highlighted)" : ""}`,
60398
+ "aria-label": isHighlighted ? t("avl.orbitalLabelHighlighted", { name: view.name }) : t("avl.orbitalLabel", { name: view.name }),
60086
60399
  position: "absolute",
60087
60400
  style: {
60088
60401
  left: view.cx - UNIT_DISPLAY_W / 2,
@@ -60130,9 +60443,9 @@ var AvlOrbitalsCosmicZoom = ({
60130
60443
  zIndex: 30
60131
60444
  },
60132
60445
  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" }) })
60446
+ /* @__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" }) }),
60447
+ /* @__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" }) }),
60448
+ /* @__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
60449
  ]
60137
60450
  }
60138
60451
  )