@almadar/ui 5.21.8 → 5.21.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/avl/index.js CHANGED
@@ -3851,6 +3851,503 @@ var init_Stack = __esm({
3851
3851
  HStack = (props) => /* @__PURE__ */ jsx(Stack, { direction: "horizontal", ...props });
3852
3852
  }
3853
3853
  });
3854
+
3855
+ // locales/en.json
3856
+ var en_default;
3857
+ var init_en = __esm({
3858
+ "locales/en.json"() {
3859
+ en_default = {
3860
+ $meta: {
3861
+ locale: "en",
3862
+ direction: "ltr"
3863
+ },
3864
+ "common.save": "Save",
3865
+ "common.cancel": "Cancel",
3866
+ "common.delete": "Delete",
3867
+ "common.close": "Close",
3868
+ "common.confirm": "Are you sure?",
3869
+ "common.create": "Create",
3870
+ "common.edit": "Edit",
3871
+ "common.view": "View",
3872
+ "common.add": "Add",
3873
+ "common.remove": "Remove",
3874
+ "common.search": "Search...",
3875
+ "common.filter": "Filter",
3876
+ "common.actions": "Actions",
3877
+ "common.yes": "Yes",
3878
+ "common.no": "No",
3879
+ "common.selected": "selected",
3880
+ "common.ok": "OK",
3881
+ "common.done": "Done",
3882
+ "common.apply": "Apply",
3883
+ "common.reset": "Reset",
3884
+ "common.refresh": "Refresh",
3885
+ "common.export": "Export",
3886
+ "common.import": "Import",
3887
+ "common.copy": "Copy",
3888
+ "common.settings": "Settings",
3889
+ "nav.previous": "Previous",
3890
+ "nav.next": "Next",
3891
+ "nav.back": "Back",
3892
+ "nav.home": "Home",
3893
+ "form.submit": "Submit",
3894
+ "form.saving": "Saving...",
3895
+ "form.required": "This field is required",
3896
+ "form.invalidEmail": "Enter a valid email address",
3897
+ "form.selectPlaceholder": "Select {{label}}...",
3898
+ "form.searchPlaceholder": "Search {{entity}}...",
3899
+ "table.empty.title": "No items found",
3900
+ "table.empty.description": "No items to display.",
3901
+ "table.search.placeholder": "Search...",
3902
+ "table.pagination.showing": "Showing {{start}} to {{end}} of {{total}} results",
3903
+ "table.pagination.page": "Page {{page}} of {{totalPages}}",
3904
+ "table.bulk.selected": "{{count}} selected",
3905
+ "table.loading": "Loading...",
3906
+ "status.loading": "Loading...",
3907
+ "status.scheduled": "Scheduled",
3908
+ "status.inProgress": "In Progress",
3909
+ "status.completed": "Completed",
3910
+ "status.cancelled": "Cancelled",
3911
+ "status.pending": "Pending",
3912
+ "status.active": "Active",
3913
+ "status.inactive": "Inactive",
3914
+ "status.draft": "Draft",
3915
+ "status.archived": "Archived",
3916
+ "error.generic": "Something went wrong",
3917
+ "error.retry": "Try again",
3918
+ "error.notFound": "Not found",
3919
+ "error.loadFailed": "Failed to load: {{message}}",
3920
+ "error.configMissing": "Configuration not found for: {{id}}",
3921
+ "common.loading": "Loading...",
3922
+ "common.showMore": "Show More",
3923
+ "common.showLess": "Show Less",
3924
+ "common.noResults": "No results found",
3925
+ "common.saveChanges": "Save Changes",
3926
+ "common.retry": "Retry",
3927
+ "common.open": "Open",
3928
+ "common.back": "Back",
3929
+ "empty.noItems": "No items",
3930
+ "empty.noData": "No data available",
3931
+ "empty.noItemsYet": "No items yet",
3932
+ "empty.noItemsAdded": "No items added yet",
3933
+ "empty.noOptionsFound": "No options found",
3934
+ "list.addItemPlaceholder": "Add new item...",
3935
+ "error.occurred": "An error occurred",
3936
+ "error.failedToLoad": "Failed to load data",
3937
+ "wizard.back": "Back",
3938
+ "wizard.next": "Next",
3939
+ "wizard.complete": "Complete",
3940
+ "wizard.stepOf": "Step {{current}} of {{total}}",
3941
+ "pagination.previous": "Previous",
3942
+ "pagination.next": "Next",
3943
+ "pagination.total": "Total:",
3944
+ "pagination.show": "Show:",
3945
+ "pagination.goTo": "Go to:",
3946
+ "pagination.go": "Go",
3947
+ "auth.signIn": "Sign in",
3948
+ "auth.signOut": "Sign out",
3949
+ "dialog.confirm": "Confirm",
3950
+ "dialog.cancel": "Cancel",
3951
+ "dialog.loading": "Loading...",
3952
+ "dialog.delete.title": "Delete {{item}}?",
3953
+ "dialog.delete.message": "This action cannot be undone.",
3954
+ "trait.availableActions": "Available Actions",
3955
+ "trait.transitions": "Transitions",
3956
+ "trait.availableNow": "Available now",
3957
+ "book.startReading": "Start Reading",
3958
+ "book.tableOfContents": "Table of Contents",
3959
+ "book.partNumber": "Part {{number}}",
3960
+ "book.print": "Print",
3961
+ "book.previousPage": "Previous page",
3962
+ "book.nextPage": "Next page",
3963
+ "quiz.showAnswer": "Show answer",
3964
+ "quiz.hideAnswer": "Hide answer",
3965
+ "aria.closeModal": "Close modal",
3966
+ "aria.closeToast": "Dismiss toast",
3967
+ "aria.closeAlert": "Dismiss alert",
3968
+ "aria.removeFilter": "Remove filter",
3969
+ "aria.closeDrawer": "Close drawer",
3970
+ "aria.closePanel": "Close panel",
3971
+ "aria.previousImage": "Previous image",
3972
+ "aria.nextImage": "Next image",
3973
+ "aria.dismiss": "Dismiss",
3974
+ "aria.previousSlide": "Previous slide",
3975
+ "aria.nextSlide": "Next slide",
3976
+ "aria.previousDays": "Previous days",
3977
+ "aria.nextDays": "Next days",
3978
+ "aria.decrease": "Decrease",
3979
+ "aria.increase": "Increase",
3980
+ "aria.breadcrumb": "Breadcrumb",
3981
+ "aria.tableOfContents": "Table of contents",
3982
+ "aria.docsSidebar": "Documentation sidebar",
3983
+ "aria.selectAllRows": "Select all rows",
3984
+ "aria.selectAll": "Select all",
3985
+ "aria.upvote": "Upvote",
3986
+ "aria.downvote": "Downvote",
3987
+ "aria.qrScanner": "QR scanner",
3988
+ "aria.mockScanDev": "Mock scan (dev)",
3989
+ "aria.openMenu": "Open menu",
3990
+ "aria.closeMenu": "Close menu",
3991
+ "aria.openSidebar": "Open sidebar",
3992
+ "sidebar.expand": "Expand sidebar",
3993
+ "sidebar.collapse": "Collapse sidebar",
3994
+ "sidebar.close": "Close sidebar",
3995
+ "loading.items": "Loading items...",
3996
+ "card.imageAlt": "Image",
3997
+ "canvas.emptyMessage": "No content",
3998
+ "canvas.errorTitle": "Canvas error",
3999
+ "book.noData": "No data",
4000
+ "common.notifications": "Notifications",
4001
+ "common.remaining": "{{count}} remaining",
4002
+ "error.somethingWentWrong": "Something went wrong",
4003
+ "error.loadingItems": "Loading items...",
4004
+ "error.noItemsFound": "No items found",
4005
+ "debug.noEntityData": "No entity data",
4006
+ "debug.noEntities": "No entities",
4007
+ "debug.noTicks": "No ticks registered",
4008
+ "debug.noActiveTraits": "No active traits",
4009
+ "debug.noGuardEvaluations": "No guard evaluations",
4010
+ "debug.noBridgeData": "No bridge data",
4011
+ "debug.status": "Status",
4012
+ "debug.eventsForwarded": "Events Forwarded (Client \u2192 Server)",
4013
+ "debug.eventsReceived": "Events Received (Server \u2192 Client)",
4014
+ "debug.lastHeartbeat": "Last Heartbeat",
4015
+ "debug.noEventsYet": "No events yet",
4016
+ "debug.noTransitionsRecorded": "No transitions recorded",
4017
+ "debug.noVerificationChecks": "No verification checks yet",
4018
+ "display.chartError": "Chart error",
4019
+ "display.codeViewerError": "Code viewer error",
4020
+ "display.noCode": "No code",
4021
+ "display.documentError": "Document error",
4022
+ "display.noDocument": "No document",
4023
+ "display.graphError": "Graph error",
4024
+ "display.noGraphData": "No graph data",
4025
+ "display.galleryError": "Gallery error",
4026
+ "display.noMedia": "No media",
4027
+ "display.meterError": "Meter error",
4028
+ "display.signaturePadError": "Signature pad error",
4029
+ "display.timelineError": "Timeline error",
4030
+ "display.noEvents": "No events",
4031
+ "template.features": "Features",
4032
+ "template.howItWorks": "How It Works",
4033
+ "template.showcase": "Showcase",
4034
+ "template.faq": "Frequently Asked Questions",
4035
+ "template.ourTeam": "Our Team",
4036
+ "template.caseStudies": "Case Studies",
4037
+ "richBlockEditor.toolbar.text": "Text",
4038
+ "richBlockEditor.toolbar.h1": "H1",
4039
+ "richBlockEditor.toolbar.h2": "H2",
4040
+ "richBlockEditor.toolbar.h3": "H3",
4041
+ "richBlockEditor.toolbar.bulletList": "Bullet list",
4042
+ "richBlockEditor.toolbar.numbered": "Numbered",
4043
+ "richBlockEditor.toolbar.quote": "Quote",
4044
+ "richBlockEditor.toolbar.code": "Code",
4045
+ "richBlockEditor.toolbar.divider": "Divider",
4046
+ "richBlockEditor.toolbar.image": "Image",
4047
+ "richBlockEditor.blockType.paragraph": "Text",
4048
+ "richBlockEditor.blockType.heading1": "Heading 1",
4049
+ "richBlockEditor.blockType.heading2": "Heading 2",
4050
+ "richBlockEditor.blockType.heading3": "Heading 3",
4051
+ "richBlockEditor.blockType.bulletList": "Bullet list",
4052
+ "richBlockEditor.blockType.numberedList": "Numbered list",
4053
+ "richBlockEditor.blockType.quote": "Quote",
4054
+ "richBlockEditor.blockType.code": "Code",
4055
+ "richBlockEditor.blockType.divider": "Divider",
4056
+ "richBlockEditor.blockType.image": "Image",
4057
+ "richBlockEditor.blockActions": "Block actions",
4058
+ "richBlockEditor.duplicate": "Duplicate",
4059
+ "richBlockEditor.turnInto": "Turn into",
4060
+ "richBlockEditor.placeholder.heading1": "Heading 1",
4061
+ "richBlockEditor.placeholder.heading2": "Heading 2",
4062
+ "richBlockEditor.placeholder.heading3": "Heading 3",
4063
+ "richBlockEditor.placeholder.quote": "Quote",
4064
+ "richBlockEditor.placeholder.code": "Enter code",
4065
+ "richBlockEditor.placeholder.paragraph": "Start writing...",
4066
+ "richBlockEditor.placeholder.listItem": "List item",
4067
+ "richBlockEditor.placeholder.caption": "Caption (optional)",
4068
+ "richBlockEditor.aria.heading1Block": "Heading 1 block",
4069
+ "richBlockEditor.aria.heading2Block": "Heading 2 block",
4070
+ "richBlockEditor.aria.heading3Block": "Heading 3 block",
4071
+ "richBlockEditor.aria.quoteBlock": "Quote block",
4072
+ "richBlockEditor.aria.codeBlock": "Code block",
4073
+ "richBlockEditor.aria.codeLanguage": "Code language",
4074
+ "richBlockEditor.aria.imageUrl": "Image URL",
4075
+ "richBlockEditor.aria.imageCaption": "Image caption",
4076
+ "richBlockEditor.aria.listItem": "List item",
4077
+ "richBlockEditor.aria.removeListItem": "Remove list item",
4078
+ "richBlockEditor.aria.paragraphBlock": "Paragraph block",
4079
+ "richBlockEditor.embeddedImage": "Embedded image",
4080
+ "richBlockEditor.noImageUrl": "No image URL set",
4081
+ "richBlockEditor.addItem": "Add item",
4082
+ "richBlockEditor.insertParagraphBelow": "Insert paragraph below",
4083
+ "richBlockEditor.editorToolbar": "Block editor toolbar",
4084
+ "richBlockEditor.insertEntry": "Insert {{label}}",
4085
+ "versionDiff.compare": "Compare",
4086
+ "versionDiff.to": "to",
4087
+ "versionDiff.beforeRevision": "Before revision",
4088
+ "versionDiff.afterRevision": "After revision",
4089
+ "versionDiff.switchToInline": "Switch to inline view",
4090
+ "versionDiff.switchToSideBySide": "Switch to side-by-side view",
4091
+ "versionDiff.revert": "Revert",
4092
+ "versionDiff.byAuthor": " by {{author}}",
4093
+ "violationAlert.actionType.measure": "Corrective Measure",
4094
+ "violationAlert.actionType.admin": "Administrative Action",
4095
+ "violationAlert.actionType.penalty": "Penalty Proceedings",
4096
+ "violationAlert.fallbackMessage": "Violation",
4097
+ "violationAlert.adminLabel": "Admin:",
4098
+ "violationAlert.penaltyLabel": "Penalty:",
4099
+ "violationAlert.goToField": "Go to field",
4100
+ "branchingLogic.title": "Branching logic",
4101
+ "branchingLogic.if": "If",
4102
+ "branchingLogic.goTo": "go to",
4103
+ "branchingLogic.rules": "Rules",
4104
+ "branchingLogic.logicGraph": "Logic graph",
4105
+ "branchingLogic.addRule": "Add rule",
4106
+ "branchingLogic.deleteRule": "Delete rule",
4107
+ "branchingLogic.endOfSurvey": "End of survey",
4108
+ "branchingLogic.brokenReference": "Broken reference",
4109
+ "branchingLogic.selectQuestion": "Select question",
4110
+ "branchingLogic.selectTarget": "Select target",
4111
+ "branchingLogic.selectValue": "Select value",
4112
+ "branchingLogic.addValue": "Add value",
4113
+ "branchingLogic.value": "Value",
4114
+ "branchingLogic.typeValuePressEnter": "Type value, press Enter",
4115
+ "branchingLogic.operatorEquals": "equals",
4116
+ "branchingLogic.operatorNotEquals": "does not equal",
4117
+ "branchingLogic.operatorContains": "contains",
4118
+ "branchingLogic.operatorIn": "is one of",
4119
+ "branchingLogic.graphAriaLabel": "Branching logic graph",
4120
+ "branchingLogic.ruleCountOne": "{{count}} rule",
4121
+ "branchingLogic.ruleCountOther": "{{count}} rules",
4122
+ "branchingLogic.brokenCount": "{{count}} broken",
4123
+ "branchingLogic.emptyNoQuestions": "Add questions before building branching rules.",
4124
+ "branchingLogic.emptyNoRules": "No rules yet. Add a rule to define branching logic.",
4125
+ "filterGroup.filters": "Filters",
4126
+ "filterGroup.all": "All",
4127
+ "filterGroup.clear": "Clear",
4128
+ "filterGroup.clearAll": "Clear all",
4129
+ "filterGroup.from": "From",
4130
+ "filterGroup.to": "To",
4131
+ "filterGroup.allOf": "All {{label}}",
4132
+ "filterGroup.activeCount": "{{count}} active",
4133
+ "debug.guardEvaluationsHint": "Guard evaluations will appear when transitions or ticks with guards execute",
4134
+ "debug.expression": "Expression",
4135
+ "debug.inputs": "Inputs",
4136
+ "debug.trait": "Trait",
4137
+ "debug.filterAll": "All",
4138
+ "debug.filterPassed": "Passed",
4139
+ "debug.filterFailed": "Failed",
4140
+ "debug.traitsInitHint": "Traits will appear when the state machine initializes",
4141
+ "debug.traitsMountHint": "Traits will appear when components using them are mounted",
4142
+ "debug.activeStates": "Active States",
4143
+ "debug.availableEvents": "Available Events",
4144
+ "debug.noTransitionsFromState": "No transitions from current state",
4145
+ "debug.guarded": "guarded",
4146
+ "debug.otherEvents": "Other Events (not available from current state)",
4147
+ "debug.recentTransitions": "Recent Transitions",
4148
+ "debug.transitionsCount": "{{count}} transitions",
4149
+ "debug.states": "States",
4150
+ "debug.transitions": "Transitions",
4151
+ "debug.guards": "Guards",
4152
+ "debug.debugModeHint": "Debug mode may not be enabled",
4153
+ "debug.entitiesSpawnHint": "Entities will appear when spawned",
4154
+ "debug.singleton": "Singleton",
4155
+ "debug.singletonsCount": "Singletons ({{count}})",
4156
+ "debug.runtimeCount": "Runtime ({{count}})",
4157
+ "debug.moreEntities": "+{{count}} more entities",
4158
+ "debug.persistent": "Persistent",
4159
+ "debug.loadedCount": "{{count}} loaded",
4160
+ "debug.notLoaded": "not loaded",
4161
+ "debug.eventsExecuteHint": "Events will appear as traits, ticks, and other systems execute",
4162
+ "debug.allCount": "All ({{count}})",
4163
+ "debug.autoScroll": "Auto-scroll",
4164
+ "debug.transitionsProcessHint": "Transitions will appear as the state machine processes events",
4165
+ "debug.transitionsRecorded": "{{count}} transitions recorded",
4166
+ "debug.guardLabel": "guard:",
4167
+ "debug.effectsCount": "{{count}} effects",
4168
+ "debug.bridgeInitHint": "The ServerBridge has not been initialized. Bridge health will appear once the runtime connects to the server.",
4169
+ "debug.never": "Never",
4170
+ "debug.connected": "Connected",
4171
+ "debug.disconnected": "Disconnected",
4172
+ "debug.lastError": "Last Error",
4173
+ "debug.totalEventsProcessed": "{{count}} total events processed",
4174
+ "debug.server": "server",
4175
+ "debug.clientEffectsCount": "{{count}} clientEffects",
4176
+ "debug.emitLabel": "emit:",
4177
+ "debug.rowsCount": "{{count}} rows",
4178
+ "debug.serverResponse": "server response",
4179
+ "debug.collapseVerificationTimeline": "Collapse verification timeline",
4180
+ "debug.expandVerificationTimeline": "Expand verification timeline",
4181
+ "debug.failCount": "{{count}} fail",
4182
+ "debug.ok": "OK",
4183
+ "debug.localCount": "{{count}} local",
4184
+ "debug.serverCount": "{{count}} server",
4185
+ "debug.waitingForTransitions": "Waiting for transitions...",
4186
+ "debug.tabDispatch": "Dispatch",
4187
+ "debug.tabVerify": "Verify",
4188
+ "debug.tabVerifyAlert": "Verify (!)",
4189
+ "debug.tabTimeline": "Timeline",
4190
+ "debug.tabBridge": "Bridge",
4191
+ "debug.tabTraits": "Traits",
4192
+ "debug.tabTicks": "Ticks",
4193
+ "debug.tabEntities": "Entities",
4194
+ "debug.tabEvents": "Events",
4195
+ "debug.tabGuards": "Guards",
4196
+ "debug.debugger": "Debugger",
4197
+ "debug.failedCount": "{{count}} failed",
4198
+ "debug.traitsCount": "{{count}} traits",
4199
+ "debug.idle": "Idle",
4200
+ "debug.openDebugger": "Open Debugger (`)",
4201
+ "debug.kflowVerifier": "KFlow Verifier",
4202
+ "debug.allPassing": "All passing",
4203
+ "debug.runtime": "Runtime",
4204
+ "debug.close": "Close (`)",
4205
+ "debug.toggleHint": "Press ` to toggle | window.__orbitalVerification for automation",
4206
+ "replyTree.expandReplies": "Expand replies",
4207
+ "replyTree.collapseReplies": "Collapse replies",
4208
+ "replyTree.voteOnReplyBy": "Vote on reply by {{author}}",
4209
+ "replyTree.replyTo": "Reply to {{author}}",
4210
+ "replyTree.replyToPlaceholder": "Reply to {{author}}\u2026",
4211
+ "replyTree.reply": "Reply",
4212
+ "replyTree.flagReplyBy": "Flag reply by {{author}}",
4213
+ "replyTree.flag": "Flag",
4214
+ "replyTree.send": "Send",
4215
+ "replyTree.continueThread": "Continue thread",
4216
+ "replyTree.noRepliesYet": "No replies yet.",
4217
+ "signaturePad.label": "Signature",
4218
+ "signaturePad.helperText": "Draw your signature above",
4219
+ "signaturePad.clear": "Clear",
4220
+ "signaturePad.confirm": "Confirm",
4221
+ "qrScanner.cameraUnavailable": "Camera unavailable",
4222
+ "qrScanner.paused": "Paused",
4223
+ "qrScanner.resumeScanning": "Resume scanning",
4224
+ "qrScanner.pauseScanning": "Pause scanning",
4225
+ "qrScanner.switchToFrontCamera": "Switch to front camera",
4226
+ "qrScanner.switchToRearCamera": "Switch to rear camera",
4227
+ "qrScanner.mockScan": "Mock Scan",
4228
+ "docSearch.placeholder": "Search documentation...",
4229
+ "stateMachine.loading": "Loading state machine\u2026",
4230
+ "stateMachine.noStateMachine": "No state machine to visualize",
4231
+ "avl.trigger": "Trigger",
4232
+ "avl.guard": "Guard",
4233
+ "avl.effects": "Effects",
4234
+ "avl.props": "Props",
4235
+ "avl.entity": "Entity",
4236
+ "avl.traits": "Traits",
4237
+ "avl.transition": "Transition",
4238
+ "avl.onEntity": "on {{entity}}",
4239
+ "avl.linkedTo": "linked to {{entity}}",
4240
+ "avl.pressEscToZoomOut": "Press Esc to zoom out",
4241
+ "avl.zoomIn": "Zoom in",
4242
+ "avl.zoomOut": "Zoom out",
4243
+ "avl.orbitalLabel": "Orbital: {{name}}",
4244
+ "avl.orbitalLabelHighlighted": "Orbital: {{name}} (highlighted)",
4245
+ "avl.noTraitData": "No trait data",
4246
+ "avl.computingLayout": "Computing layout...",
4247
+ "avl.noStateMachine": "No state machine",
4248
+ "avl.listensFor": "listens for {{event}}",
4249
+ "avl.emits": "emits {{event}}",
4250
+ "avl.pageLayout": "Page Layout",
4251
+ "avl.overlaySuffix": "(overlay)",
4252
+ "orbPreview.previewBadge": "Preview",
4253
+ "orbPreview.doubleClickToOpen": "Double-click to open",
4254
+ "orbPreview.dropToAddAndOpen": "Drop to add and open",
4255
+ "orbPreview.dispatching": "Coordinator is dispatching to this orbital",
4256
+ "orbPreview.noPreview": "No preview available",
4257
+ "orbPreview.screensCount": "{{count}} screens",
4258
+ "detailView.noTransitionData": "No transition data",
4259
+ "orbInspector.required": "req",
4260
+ "orbInspector.addField": "Add Field",
4261
+ "orbInspector.serviceMode": "Service Mode",
4262
+ "orbInspector.standalone": "Standalone",
4263
+ "orbInspector.embedded": "Embedded",
4264
+ "orbInspector.rendersOwnUi": "Renders its own UI",
4265
+ "orbInspector.headless": "Headless, wired to other behaviors",
4266
+ "orbInspector.addEffect": "Add Effect",
4267
+ "orbInspector.guardExpression": "Guard expression",
4268
+ "orbInspector.selectPatternForStyles": "Select a pattern to view its style tokens.",
4269
+ "orbInspector.tokens": "Tokens",
4270
+ "orbInspector.noTokenContract": "No token contract declared for this pattern.",
4271
+ "orbInspector.variant": "Variant",
4272
+ "orbInspector.size": "Size",
4273
+ "orbInspector.statesCount": "{{count}} states",
4274
+ "orbInspector.onEntity": " on {{entity}}",
4275
+ "orbInspector.projectThemeTokens": "Project theme tokens",
4276
+ "orbInspector.tokenGroup.colors": "Colors",
4277
+ "orbInspector.tokenGroup.radii": "Radii",
4278
+ "orbInspector.tokenGroup.spacing": "Spacing",
4279
+ "orbInspector.tokenGroup.shadows": "Shadows",
4280
+ "orbInspector.tab.inspector": "Inspector",
4281
+ "orbInspector.tab.styles": "Styles",
4282
+ "orbInspector.tab.code": "Code",
4283
+ "canvas.goBackToOverview": "Go back to overview",
4284
+ "canvas.overview": "Overview",
4285
+ "canvas.expanded": "Expanded",
4286
+ "canvas.modulesCount": "{{count}} modules",
4287
+ "canvas.screensCount": "{{count}} screens",
4288
+ "canvas.switchToView": "Switch to {{label}} view",
4289
+ "lawReference.viewFullText": "View full law text",
4290
+ "statCard.defaultLabel": "Stat",
4291
+ "statCard.vsLastPeriod": "vs last period",
4292
+ "mediaGallery.upload": "Upload",
4293
+ "mediaGallery.noMediaDescription": "No media items to display.",
4294
+ "pagination.jumpPlaceholder": "Page",
4295
+ "table.selectRow": "Select row {{id}}",
4296
+ "card.selectItem": "Select {{item}}",
4297
+ "card.itemFallback": "item",
4298
+ "fileTree.noFiles": "No files",
4299
+ "masterDetail.selectItem": "Select an item to view details",
4300
+ "empty.createFirst": "Create your first item to get started.",
4301
+ "upload.dropOrBrowse": "Drop files here or click to browse",
4302
+ "upload.dropFilesHere": "Drop files here",
4303
+ "upload.accepted": "Accepted: {{accept}}",
4304
+ "upload.maxSize": "Max size: {{size}}",
4305
+ "upload.maxFiles": "Up to {{count}} files",
4306
+ "upload.error.maxFiles": "Maximum {{count}} files allowed",
4307
+ "upload.error.invalidType": "Invalid file type: {{name}}",
4308
+ "upload.error.tooLarge": "File too large: {{name}} (max {{size}})",
4309
+ "optionConstraint.requiredOne": "Required, pick 1",
4310
+ "optionConstraint.optionalOne": "Optional, pick up to 1",
4311
+ "optionConstraint.pickExactly": "Pick exactly {{count}}",
4312
+ "optionConstraint.pickRange": "Pick {{min}}-{{max}}",
4313
+ "optionConstraint.pickAtLeast": "Pick at least {{count}}",
4314
+ "optionConstraint.pickUpTo": "Pick up to {{count}}",
4315
+ "optionConstraint.optional": "Optional",
4316
+ "optionConstraint.outOfStock": "Out of stock",
4317
+ "optionConstraint.error.pickOne": "Pick 1 option",
4318
+ "optionConstraint.error.pickOnlyOne": "Pick only 1 option",
4319
+ "optionConstraint.error.pickMore": "Pick at least {{count}} more",
4320
+ "optionConstraint.error.removeOptions": "Remove {{count}} options",
4321
+ "stateMachine.pinned": "Pinned",
4322
+ "stateMachine.eventCount": "{{count}} events",
4323
+ "stateMachine.externalEffects": "External Effects",
4324
+ "stateMachine.legend.initial": "Initial",
4325
+ "stateMachine.legend.final": "Final",
4326
+ "stateMachine.legend.state": "State",
4327
+ "stateMachine.legend.multiEvent": "Multi-event"
4328
+ };
4329
+ }
4330
+ });
4331
+ function useTranslate() {
4332
+ return useContext(I18nContext);
4333
+ }
4334
+ var _meta, coreMessages, coreLocale, I18nContext;
4335
+ var init_useTranslate = __esm({
4336
+ "hooks/useTranslate.ts"() {
4337
+ "use client";
4338
+ init_en();
4339
+ ({ $meta: _meta, ...coreMessages } = en_default);
4340
+ coreLocale = coreMessages;
4341
+ I18nContext = createContext({
4342
+ locale: "en",
4343
+ direction: "ltr",
4344
+ t: (key) => coreLocale[key] ?? key
4345
+ // core locale fallback
4346
+ });
4347
+ I18nContext.displayName = "I18nContext";
4348
+ I18nContext.Provider;
4349
+ }
4350
+ });
3854
4351
  var MAX_VISIBLE_EFFECTS, AvlTransitionLane;
3855
4352
  var init_AvlTransitionLane = __esm({
3856
4353
  "components/avl/molecules/AvlTransitionLane.tsx"() {
@@ -4480,6 +4977,7 @@ var log2, SWIM_GUTTER, CENTER_W, BehaviorView;
4480
4977
  var init_BehaviorView = __esm({
4481
4978
  "components/avl/molecules/BehaviorView.tsx"() {
4482
4979
  "use client";
4980
+ init_useTranslate();
4483
4981
  init_AvlState();
4484
4982
  init_AvlTransitionLane();
4485
4983
  init_AvlSwimLane();
@@ -4489,6 +4987,7 @@ var init_BehaviorView = __esm({
4489
4987
  SWIM_GUTTER = 120;
4490
4988
  CENTER_W = 360;
4491
4989
  BehaviorView = ({ data }) => {
4990
+ const { t } = useTranslate();
4492
4991
  const [layout, setLayout] = useState(null);
4493
4992
  const traitName = data.traits[0]?.name;
4494
4993
  const traitData = traitName ? data.traitDetails[traitName] : void 0;
@@ -4498,10 +4997,10 @@ var init_BehaviorView = __esm({
4498
4997
  computeTraitLayout(traitData).then(setLayout).catch((err) => log2.error("compute-trait-layout-failed", { error: err instanceof Error ? err : String(err) }));
4499
4998
  }, [dataKey]);
4500
4999
  if (!traitData) {
4501
- return /* @__PURE__ */ jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: "No trait data" });
5000
+ return /* @__PURE__ */ jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: t("avl.noTraitData") });
4502
5001
  }
4503
5002
  if (!layout) {
4504
- return /* @__PURE__ */ jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: "Computing layout..." });
5003
+ return /* @__PURE__ */ jsx("div", { className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-4 text-center text-[var(--color-muted-foreground)] text-sm", children: t("avl.computingLayout") });
4505
5004
  }
4506
5005
  const hasExternal = traitData.listenedEvents.length > 0 || traitData.emittedEvents.length > 0;
4507
5006
  const viewW = hasExternal ? SWIM_GUTTER + CENTER_W + SWIM_GUTTER : CENTER_W + 60;
@@ -4517,10 +5016,7 @@ var init_BehaviorView = __esm({
4517
5016
  const machineHeight = scaledH + 100;
4518
5017
  const renderMachine = /* @__PURE__ */ jsxs("g", { children: [
4519
5018
  /* @__PURE__ */ jsx("text", { x: CENTER_W / 2, y: 20, textAnchor: "middle", fill: "var(--color-foreground)", fontSize: 18, fontWeight: "700", fontFamily: "inherit", children: traitData.name }),
4520
- /* @__PURE__ */ jsxs("text", { x: CENTER_W / 2, y: 36, textAnchor: "middle", fill: "var(--color-muted-foreground)", fontSize: 11, opacity: 0.5, fontFamily: "inherit", children: [
4521
- "on ",
4522
- traitData.linkedEntity
4523
- ] }),
5019
+ /* @__PURE__ */ jsx("text", { x: CENTER_W / 2, y: 36, textAnchor: "middle", fill: "var(--color-muted-foreground)", fontSize: 11, opacity: 0.5, fontFamily: "inherit", children: t("avl.onEntity", { entity: traitData.linkedEntity }) }),
4524
5020
  /* @__PURE__ */ jsxs("defs", { children: [
4525
5021
  /* @__PURE__ */ jsx("marker", { id: "bvArrow", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: CONNECTION_COLORS.forward.color, opacity: 0.7 }) }),
4526
5022
  /* @__PURE__ */ jsx("marker", { id: "bvArrowBack", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: CONNECTION_COLORS.backward.color, opacity: 0.5 }) })
@@ -6322,210 +6818,6 @@ var init_Overlay = __esm({
6322
6818
  };
6323
6819
  }
6324
6820
  });
6325
-
6326
- // locales/en.json
6327
- var en_default;
6328
- var init_en = __esm({
6329
- "locales/en.json"() {
6330
- en_default = {
6331
- $meta: { locale: "en", direction: "ltr" },
6332
- "common.save": "Save",
6333
- "common.cancel": "Cancel",
6334
- "common.delete": "Delete",
6335
- "common.close": "Close",
6336
- "common.confirm": "Are you sure?",
6337
- "common.create": "Create",
6338
- "common.edit": "Edit",
6339
- "common.view": "View",
6340
- "common.add": "Add",
6341
- "common.remove": "Remove",
6342
- "common.search": "Search...",
6343
- "common.filter": "Filter",
6344
- "common.actions": "Actions",
6345
- "common.yes": "Yes",
6346
- "common.no": "No",
6347
- "common.selected": "selected",
6348
- "common.ok": "OK",
6349
- "common.done": "Done",
6350
- "common.apply": "Apply",
6351
- "common.reset": "Reset",
6352
- "common.refresh": "Refresh",
6353
- "common.export": "Export",
6354
- "common.import": "Import",
6355
- "common.copy": "Copy",
6356
- "common.settings": "Settings",
6357
- "nav.previous": "Previous",
6358
- "nav.next": "Next",
6359
- "nav.back": "Back",
6360
- "nav.home": "Home",
6361
- "form.submit": "Submit",
6362
- "form.saving": "Saving...",
6363
- "form.required": "This field is required",
6364
- "form.invalidEmail": "Enter a valid email address",
6365
- "form.selectPlaceholder": "Select {{label}}...",
6366
- "form.searchPlaceholder": "Search {{entity}}...",
6367
- "table.empty.title": "No items found",
6368
- "table.empty.description": "No items to display.",
6369
- "table.search.placeholder": "Search...",
6370
- "table.pagination.showing": "Showing {{start}} to {{end}} of {{total}} results",
6371
- "table.pagination.page": "Page {{page}} of {{totalPages}}",
6372
- "table.bulk.selected": "{{count}} selected",
6373
- "table.loading": "Loading...",
6374
- "status.loading": "Loading...",
6375
- "status.scheduled": "Scheduled",
6376
- "status.inProgress": "In Progress",
6377
- "status.completed": "Completed",
6378
- "status.cancelled": "Cancelled",
6379
- "status.pending": "Pending",
6380
- "status.active": "Active",
6381
- "status.inactive": "Inactive",
6382
- "status.draft": "Draft",
6383
- "status.archived": "Archived",
6384
- "error.generic": "Something went wrong",
6385
- "error.retry": "Try again",
6386
- "error.notFound": "Not found",
6387
- "error.loadFailed": "Failed to load: {{message}}",
6388
- "error.configMissing": "Configuration not found for: {{id}}",
6389
- "common.loading": "Loading...",
6390
- "common.showMore": "Show More",
6391
- "common.showLess": "Show Less",
6392
- "common.noResults": "No results found",
6393
- "common.saveChanges": "Save Changes",
6394
- "common.retry": "Retry",
6395
- "common.open": "Open",
6396
- "common.back": "Back",
6397
- "empty.noItems": "No items",
6398
- "empty.noData": "No data available",
6399
- "empty.noItemsYet": "No items yet",
6400
- "empty.noItemsAdded": "No items added yet",
6401
- "empty.noOptionsFound": "No options found",
6402
- "list.addItemPlaceholder": "Add new item...",
6403
- "error.occurred": "An error occurred",
6404
- "error.failedToLoad": "Failed to load data",
6405
- "wizard.back": "Back",
6406
- "wizard.next": "Next",
6407
- "wizard.complete": "Complete",
6408
- "wizard.stepOf": "Step {{current}} of {{total}}",
6409
- "pagination.previous": "Previous",
6410
- "pagination.next": "Next",
6411
- "pagination.total": "Total:",
6412
- "pagination.show": "Show:",
6413
- "pagination.goTo": "Go to:",
6414
- "pagination.go": "Go",
6415
- "auth.signIn": "Sign in",
6416
- "auth.signOut": "Sign out",
6417
- "dialog.confirm": "Confirm",
6418
- "dialog.cancel": "Cancel",
6419
- "dialog.loading": "Loading...",
6420
- "dialog.delete.title": "Delete {{item}}?",
6421
- "dialog.delete.message": "This action cannot be undone.",
6422
- "trait.availableActions": "Available Actions",
6423
- "trait.transitions": "Transitions",
6424
- "trait.availableNow": "Available now",
6425
- "book.startReading": "Start Reading",
6426
- "book.tableOfContents": "Table of Contents",
6427
- "book.partNumber": "Part {{number}}",
6428
- "book.print": "Print",
6429
- "book.previousPage": "Previous page",
6430
- "book.nextPage": "Next page",
6431
- "quiz.showAnswer": "Show answer",
6432
- "quiz.hideAnswer": "Hide answer",
6433
- "aria.closeModal": "Close modal",
6434
- "aria.closeToast": "Dismiss toast",
6435
- "aria.closeAlert": "Dismiss alert",
6436
- "aria.removeFilter": "Remove filter",
6437
- "aria.closeDrawer": "Close drawer",
6438
- "aria.closePanel": "Close panel",
6439
- "aria.previousImage": "Previous image",
6440
- "aria.nextImage": "Next image",
6441
- "aria.dismiss": "Dismiss",
6442
- "aria.previousSlide": "Previous slide",
6443
- "aria.nextSlide": "Next slide",
6444
- "aria.previousDays": "Previous days",
6445
- "aria.nextDays": "Next days",
6446
- "aria.decrease": "Decrease",
6447
- "aria.increase": "Increase",
6448
- "aria.breadcrumb": "Breadcrumb",
6449
- "aria.tableOfContents": "Table of contents",
6450
- "aria.docsSidebar": "Documentation sidebar",
6451
- "aria.selectAllRows": "Select all rows",
6452
- "aria.selectAll": "Select all",
6453
- "aria.upvote": "Upvote",
6454
- "aria.downvote": "Downvote",
6455
- "aria.qrScanner": "QR scanner",
6456
- "aria.mockScanDev": "Mock scan (dev)",
6457
- "aria.openMenu": "Open menu",
6458
- "aria.closeMenu": "Close menu",
6459
- "aria.openSidebar": "Open sidebar",
6460
- "sidebar.expand": "Expand sidebar",
6461
- "sidebar.collapse": "Collapse sidebar",
6462
- "sidebar.close": "Close sidebar",
6463
- "loading.items": "Loading items...",
6464
- "card.imageAlt": "Image",
6465
- "canvas.emptyMessage": "No content",
6466
- "canvas.errorTitle": "Canvas error",
6467
- "book.noData": "No data",
6468
- "common.notifications": "Notifications",
6469
- "common.remaining": "{{count}} remaining",
6470
- "error.somethingWentWrong": "Something went wrong",
6471
- "error.loadingItems": "Loading items...",
6472
- "error.noItemsFound": "No items found",
6473
- "error.notFound": "Not found",
6474
- "debug.noEntityData": "No entity data",
6475
- "debug.noEntities": "No entities",
6476
- "debug.noTicks": "No ticks registered",
6477
- "debug.noActiveTraits": "No active traits",
6478
- "debug.noGuardEvaluations": "No guard evaluations",
6479
- "debug.noBridgeData": "No bridge data",
6480
- "debug.status": "Status",
6481
- "debug.eventsForwarded": "Events Forwarded (Client \u2192 Server)",
6482
- "debug.eventsReceived": "Events Received (Server \u2192 Client)",
6483
- "debug.lastHeartbeat": "Last Heartbeat",
6484
- "debug.noEventsYet": "No events yet",
6485
- "debug.noTransitionsRecorded": "No transitions recorded",
6486
- "debug.noVerificationChecks": "No verification checks yet",
6487
- "display.chartError": "Chart error",
6488
- "display.codeViewerError": "Code viewer error",
6489
- "display.noCode": "No code",
6490
- "display.documentError": "Document error",
6491
- "display.noDocument": "No document",
6492
- "display.graphError": "Graph error",
6493
- "display.noGraphData": "No graph data",
6494
- "display.galleryError": "Gallery error",
6495
- "display.noMedia": "No media",
6496
- "display.meterError": "Meter error",
6497
- "display.signaturePadError": "Signature pad error",
6498
- "display.timelineError": "Timeline error",
6499
- "display.noEvents": "No events",
6500
- "template.features": "Features",
6501
- "template.howItWorks": "How It Works",
6502
- "template.showcase": "Showcase",
6503
- "template.faq": "Frequently Asked Questions",
6504
- "template.ourTeam": "Our Team",
6505
- "template.caseStudies": "Case Studies"
6506
- };
6507
- }
6508
- });
6509
- function useTranslate() {
6510
- return useContext(I18nContext);
6511
- }
6512
- var _meta, coreMessages, coreLocale, I18nContext;
6513
- var init_useTranslate = __esm({
6514
- "hooks/useTranslate.ts"() {
6515
- "use client";
6516
- init_en();
6517
- ({ $meta: _meta, ...coreMessages } = en_default);
6518
- coreLocale = coreMessages;
6519
- I18nContext = createContext({
6520
- locale: "en",
6521
- direction: "ltr",
6522
- t: (key) => coreLocale[key] ?? key
6523
- // core locale fallback
6524
- });
6525
- I18nContext.displayName = "I18nContext";
6526
- I18nContext.Provider;
6527
- }
6528
- });
6529
6821
  var sizeClasses2, minWidthClasses, lookStyles, Modal;
6530
6822
  var init_Modal = __esm({
6531
6823
  "components/core/molecules/Modal.tsx"() {
@@ -9504,6 +9796,7 @@ var init_LawReferenceTooltip = __esm({
9504
9796
  init_Typography();
9505
9797
  init_Divider();
9506
9798
  init_cn();
9799
+ init_useTranslate();
9507
9800
  positionStyles2 = {
9508
9801
  top: "bottom-full left-1/2 -translate-x-1/2 mb-2",
9509
9802
  bottom: "top-full left-1/2 -translate-x-1/2 mt-2",
@@ -9522,6 +9815,7 @@ var init_LawReferenceTooltip = __esm({
9522
9815
  position = "top",
9523
9816
  className
9524
9817
  }) => {
9818
+ const { t } = useTranslate();
9525
9819
  const [isVisible, setIsVisible] = React97__default.useState(false);
9526
9820
  const timeoutRef = React97__default.useRef(null);
9527
9821
  const handleMouseEnter = () => {
@@ -9605,7 +9899,7 @@ var init_LawReferenceTooltip = __esm({
9605
9899
  target: "_blank",
9606
9900
  rel: "noopener noreferrer",
9607
9901
  onClick: (e) => e.stopPropagation(),
9608
- children: "View full law text"
9902
+ children: t("lawReference.viewFullText")
9609
9903
  }
9610
9904
  )
9611
9905
  ] }),
@@ -17093,7 +17387,7 @@ var init_CodeBlock = __esm({
17093
17387
  const isLolo = language === "lolo";
17094
17388
  const activeStyle = isOrb ? orbStyle : isLolo ? loloStyle : dark;
17095
17389
  const eventBus = useEventBus();
17096
- const { t: _t } = useTranslate();
17390
+ const { t } = useTranslate();
17097
17391
  const scrollRef = useRef(null);
17098
17392
  const codeRef = useRef(null);
17099
17393
  const savedScrollLeftRef = useRef(0);
@@ -17348,7 +17642,7 @@ var init_CodeBlock = __esm({
17348
17642
  size: "sm",
17349
17643
  onClick: handleCopy,
17350
17644
  className: "opacity-0 group-hover:opacity-100 focus:opacity-100 transition-opacity text-muted-foreground hover:text-white",
17351
- "aria-label": "Copy code",
17645
+ "aria-label": t("common.copy"),
17352
17646
  children: copied ? /* @__PURE__ */ jsx(Icon, { name: "check", className: "w-4 h-4 text-green-400" }) : /* @__PURE__ */ jsx(Icon, { name: "copy", className: "w-4 h-4" })
17353
17647
  }
17354
17648
  )
@@ -18003,7 +18297,7 @@ var init_StateMachineView = __esm({
18003
18297
  const endX2 = fromState.x + Math.cos(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
18004
18298
  const endY2 = fromState.y + Math.sin(Math.PI / 2 * loopDirection + endAngle) * fromState.radius;
18005
18299
  const isSingle2 = bundle.labels.length === 1;
18006
- const labelText2 = isSingle2 ? bundle.labels[0].event : `${bundle.labels.length} events`;
18300
+ const labelText2 = isSingle2 ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
18007
18301
  const bundleColor2 = isSingle2 ? config.colors.arrow : "var(--color-accent)";
18008
18302
  const labelWidth2 = labelText2.length * 9 + (isSingle2 ? 24 : 40);
18009
18303
  const cx = fromState.x;
@@ -18129,7 +18423,7 @@ var init_StateMachineView = __esm({
18129
18423
  const controlX = midX + perpX;
18130
18424
  const controlY = midY + perpY;
18131
18425
  const isSingle = bundle.labels.length === 1;
18132
- const labelText = isSingle ? bundle.labels[0].event : `${bundle.labels.length} events`;
18426
+ const labelText = isSingle ? bundle.labels[0].event : t("stateMachine.eventCount", { count: bundle.labels.length });
18133
18427
  const labelWidth = labelText.length * 9 + (isSingle ? 24 : 40);
18134
18428
  const bundleColor = isSingle ? config.colors.arrow : "var(--color-accent)";
18135
18429
  const curveMidpoint = {
@@ -18284,7 +18578,7 @@ var init_StateMachineView = __esm({
18284
18578
  {
18285
18579
  className: "absolute -top-2 left-1/2 transform -translate-x-1/2 px-2 py-0.5 rounded-full",
18286
18580
  style: { backgroundColor: "var(--color-success)" },
18287
- children: /* @__PURE__ */ jsx(Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: "Pinned" })
18581
+ children: /* @__PURE__ */ jsx(Typography, { variant: "caption", weight: "semibold", style: { color: "var(--color-success-foreground)" }, children: t("stateMachine.pinned") })
18288
18582
  }
18289
18583
  ),
18290
18584
  !isSingle && /* @__PURE__ */ jsxs(
@@ -18306,10 +18600,7 @@ var init_StateMachineView = __esm({
18306
18600
  {
18307
18601
  className: "ml-2 px-2 py-0.5 rounded-full",
18308
18602
  style: { backgroundColor: "var(--color-accent)" },
18309
- children: /* @__PURE__ */ jsxs(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: [
18310
- bundle.labels.length,
18311
- " events"
18312
- ] })
18603
+ children: /* @__PURE__ */ jsx(Typography, { variant: "caption", style: { color: "var(--color-accent-foreground)" }, children: t("stateMachine.eventCount", { count: bundle.labels.length }) })
18313
18604
  }
18314
18605
  )
18315
18606
  ]
@@ -18454,7 +18745,7 @@ var init_StateMachineView = __esm({
18454
18745
  align: "center",
18455
18746
  className: "mb-2",
18456
18747
  style: { color: "var(--color-warning)", fontSize: "13px" },
18457
- children: "External Effects"
18748
+ children: t("stateMachine.externalEffects")
18458
18749
  }
18459
18750
  ),
18460
18751
  outputs.outputs.map((output, idx) => /* @__PURE__ */ jsx(
@@ -18474,10 +18765,10 @@ var init_StateMachineView = __esm({
18474
18765
  Legend = ({ config, y }) => {
18475
18766
  const { t } = useTranslate();
18476
18767
  const items = [
18477
- { label: "Initial", color: config.colors.initialNode },
18478
- { label: "Final", color: config.colors.finalNode },
18479
- { label: "State", color: config.colors.nodeBorder },
18480
- { label: "Multi-event", color: "var(--color-accent)" }
18768
+ { key: "initial", label: t("stateMachine.legend.initial"), color: config.colors.initialNode, isMultiEvent: false },
18769
+ { key: "final", label: t("stateMachine.legend.final"), color: config.colors.finalNode, isMultiEvent: false },
18770
+ { key: "state", label: t("stateMachine.legend.state"), color: config.colors.nodeBorder, isMultiEvent: false },
18771
+ { key: "multiEvent", label: t("stateMachine.legend.multiEvent"), color: "var(--color-accent)", isMultiEvent: true }
18481
18772
  ];
18482
18773
  return /* @__PURE__ */ jsx(
18483
18774
  HStack,
@@ -18492,8 +18783,8 @@ var init_StateMachineView = __esm({
18492
18783
  {
18493
18784
  className: "w-3 h-3 rounded-full",
18494
18785
  style: {
18495
- backgroundColor: item.label === "Multi-event" ? item.color : config.colors.node,
18496
- border: item.label !== "Multi-event" ? `2px solid ${item.color}` : "none"
18786
+ backgroundColor: item.isMultiEvent ? item.color : config.colors.node,
18787
+ border: !item.isMultiEvent ? `2px solid ${item.color}` : "none"
18497
18788
  }
18498
18789
  }
18499
18790
  ),
@@ -18505,7 +18796,7 @@ var init_StateMachineView = __esm({
18505
18796
  children: item.label
18506
18797
  }
18507
18798
  )
18508
- ] }, item.label))
18799
+ ] }, item.key))
18509
18800
  }
18510
18801
  );
18511
18802
  };
@@ -19299,13 +19590,13 @@ var init_JazariStateMachine = __esm({
19299
19590
  );
19300
19591
  }, [resolvedTrait, entityFields]);
19301
19592
  if (isLoading) {
19302
- return /* @__PURE__ */ jsx(LoadingState, { message: "Loading state machine\u2026" });
19593
+ return /* @__PURE__ */ jsx(LoadingState, { message: t("stateMachine.loading") });
19303
19594
  }
19304
19595
  if (error) {
19305
19596
  return /* @__PURE__ */ jsx(ErrorState, { message: error instanceof Error ? error.message : String(error) });
19306
19597
  }
19307
19598
  if (!resolvedTrait || !layoutData || layoutData.states.length === 0) {
19308
- return /* @__PURE__ */ jsx(Box, { padding: "lg", className: cn("text-center", className), children: /* @__PURE__ */ jsx(Typography, { variant: "body", className: "opacity-60", children: "No state machine to visualize" }) });
19599
+ return /* @__PURE__ */ jsx(Box, { padding: "lg", className: cn("text-center", className), children: /* @__PURE__ */ jsx(Typography, { variant: "body", className: "opacity-60", children: t("stateMachine.noStateMachine") }) });
19309
19600
  }
19310
19601
  return /* @__PURE__ */ jsx(
19311
19602
  StateMachineView,
@@ -20349,13 +20640,13 @@ var init_LayoutPatterns = __esm({
20349
20640
  function generateRuleId() {
20350
20641
  return `rule-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
20351
20642
  }
20352
- function questionsToOptions(questions, includeEndOfSurvey) {
20643
+ function questionsToOptions(questions, endOfSurveyLabel) {
20353
20644
  const opts = questions.map((q) => ({
20354
20645
  value: q.id,
20355
20646
  label: q.label
20356
20647
  }));
20357
- if (includeEndOfSurvey) {
20358
- opts.push({ value: END_OF_SURVEY, label: "End of survey" });
20648
+ if (endOfSurveyLabel !== null) {
20649
+ opts.push({ value: END_OF_SURVEY, label: endOfSurveyLabel });
20359
20650
  }
20360
20651
  return opts;
20361
20652
  }
@@ -20364,7 +20655,7 @@ function isRuleBroken(rule, questions) {
20364
20655
  const targetExists = rule.targetQuestionId === END_OF_SURVEY || questions.some((q) => q.id === rule.targetQuestionId);
20365
20656
  return !sourceExists || !targetExists;
20366
20657
  }
20367
- var END_OF_SURVEY, OPERATOR_OPTIONS, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph, BranchingLogicBuilder;
20658
+ var END_OF_SURVEY, RuleRow, NODE_WIDTH, NODE_HEIGHT, NODE_GAP_Y, PADDING, LogicGraph, BranchingLogicBuilder;
20368
20659
  var init_BranchingLogicBuilder = __esm({
20369
20660
  "components/core/molecules/BranchingLogicBuilder.tsx"() {
20370
20661
  "use client";
@@ -20377,14 +20668,9 @@ var init_BranchingLogicBuilder = __esm({
20377
20668
  init_FilterPill();
20378
20669
  init_Box();
20379
20670
  init_useEventBus();
20671
+ init_useTranslate();
20380
20672
  init_cn();
20381
20673
  END_OF_SURVEY = "end-of-survey";
20382
- OPERATOR_OPTIONS = [
20383
- { value: "equals", label: "equals" },
20384
- { value: "not-equals", label: "does not equal" },
20385
- { value: "contains", label: "contains" },
20386
- { value: "in", label: "is one of" }
20387
- ];
20388
20674
  RuleRow = ({
20389
20675
  rule,
20390
20676
  questions,
@@ -20393,8 +20679,21 @@ var init_BranchingLogicBuilder = __esm({
20393
20679
  onChange,
20394
20680
  onDelete
20395
20681
  }) => {
20396
- const sourceOptions = useMemo(() => questionsToOptions(questions, false), [questions]);
20397
- const targetOptions = useMemo(() => questionsToOptions(questions, true), [questions]);
20682
+ const { t } = useTranslate();
20683
+ const operatorOptions = useMemo(
20684
+ () => [
20685
+ { value: "equals", label: t("branchingLogic.operatorEquals") },
20686
+ { value: "not-equals", label: t("branchingLogic.operatorNotEquals") },
20687
+ { value: "contains", label: t("branchingLogic.operatorContains") },
20688
+ { value: "in", label: t("branchingLogic.operatorIn") }
20689
+ ],
20690
+ [t]
20691
+ );
20692
+ const sourceOptions = useMemo(() => questionsToOptions(questions, null), [questions]);
20693
+ const targetOptions = useMemo(
20694
+ () => questionsToOptions(questions, t("branchingLogic.endOfSurvey")),
20695
+ [questions, t]
20696
+ );
20398
20697
  const sourceQuestion = questions.find((q) => q.id === rule.sourceQuestionId);
20399
20698
  const valueOptions = useMemo(() => {
20400
20699
  if (!sourceQuestion?.optionValues) return [];
@@ -20439,22 +20738,22 @@ var init_BranchingLogicBuilder = __esm({
20439
20738
  ),
20440
20739
  children: [
20441
20740
  /* @__PURE__ */ jsxs(Box, { className: "flex flex-wrap items-center gap-2", children: [
20442
- /* @__PURE__ */ jsx(Typography, { variant: "label", weight: "semibold", className: "shrink-0", children: "If" }),
20741
+ /* @__PURE__ */ jsx(Typography, { variant: "label", weight: "semibold", className: "shrink-0", children: t("branchingLogic.if") }),
20443
20742
  /* @__PURE__ */ jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsx(
20444
20743
  Select,
20445
20744
  {
20446
20745
  options: sourceOptions,
20447
20746
  value: rule.sourceQuestionId,
20448
- placeholder: "Select question",
20747
+ placeholder: t("branchingLogic.selectQuestion"),
20449
20748
  onChange: handleSource,
20450
20749
  disabled: readOnly,
20451
- error: broken ? "Broken reference" : void 0
20750
+ error: broken ? t("branchingLogic.brokenReference") : void 0
20452
20751
  }
20453
20752
  ) }),
20454
20753
  /* @__PURE__ */ jsx(Box, { className: "min-w-[8rem] basis-32", children: /* @__PURE__ */ jsx(
20455
20754
  Select,
20456
20755
  {
20457
- options: OPERATOR_OPTIONS,
20756
+ options: operatorOptions,
20458
20757
  value: rule.operator,
20459
20758
  onChange: handleOperator,
20460
20759
  disabled: readOnly
@@ -20477,7 +20776,7 @@ var init_BranchingLogicBuilder = __esm({
20477
20776
  {
20478
20777
  options: valueOptions.filter((o) => !chips.includes(o.value)),
20479
20778
  value: "",
20480
- placeholder: "Add value",
20779
+ placeholder: t("branchingLogic.addValue"),
20481
20780
  onChange: handleAddChip,
20482
20781
  disabled: readOnly
20483
20782
  }
@@ -20485,7 +20784,7 @@ var init_BranchingLogicBuilder = __esm({
20485
20784
  Input,
20486
20785
  {
20487
20786
  inputType: "text",
20488
- placeholder: "Type value, press Enter",
20787
+ placeholder: t("branchingLogic.typeValuePressEnter"),
20489
20788
  value: "",
20490
20789
  onKeyDown: (e) => {
20491
20790
  if (e.key !== "Enter") return;
@@ -20503,7 +20802,7 @@ var init_BranchingLogicBuilder = __esm({
20503
20802
  {
20504
20803
  options: valueOptions,
20505
20804
  value: scalarValue,
20506
- placeholder: "Select value",
20805
+ placeholder: t("branchingLogic.selectValue"),
20507
20806
  onChange: (e) => onChange({ ...rule, value: e.target.value }),
20508
20807
  disabled: readOnly
20509
20808
  }
@@ -20511,7 +20810,7 @@ var init_BranchingLogicBuilder = __esm({
20511
20810
  Input,
20512
20811
  {
20513
20812
  inputType: "text",
20514
- placeholder: "Value",
20813
+ placeholder: t("branchingLogic.value"),
20515
20814
  value: scalarValue,
20516
20815
  onChange: handleScalarValue,
20517
20816
  disabled: readOnly
@@ -20519,17 +20818,17 @@ var init_BranchingLogicBuilder = __esm({
20519
20818
  ) }),
20520
20819
  /* @__PURE__ */ jsxs(Typography, { variant: "label", weight: "semibold", className: "shrink-0 inline-flex items-center gap-1", children: [
20521
20820
  /* @__PURE__ */ jsx(ArrowRight, { className: "h-4 w-4" }),
20522
- "go to"
20821
+ t("branchingLogic.goTo")
20523
20822
  ] }),
20524
20823
  /* @__PURE__ */ jsx(Box, { className: "min-w-[10rem] grow basis-40", children: /* @__PURE__ */ jsx(
20525
20824
  Select,
20526
20825
  {
20527
20826
  options: targetOptions,
20528
20827
  value: rule.targetQuestionId,
20529
- placeholder: "Select target",
20828
+ placeholder: t("branchingLogic.selectTarget"),
20530
20829
  onChange: handleTarget,
20531
20830
  disabled: readOnly,
20532
- error: broken && rule.targetQuestionId !== END_OF_SURVEY ? "Broken reference" : void 0
20831
+ error: broken && rule.targetQuestionId !== END_OF_SURVEY ? t("branchingLogic.brokenReference") : void 0
20533
20832
  }
20534
20833
  ) }),
20535
20834
  !readOnly && /* @__PURE__ */ jsx(
@@ -20541,11 +20840,11 @@ var init_BranchingLogicBuilder = __esm({
20541
20840
  action: "DELETE_RULE",
20542
20841
  actionPayload: { ruleId: rule.id },
20543
20842
  onClick: onDelete,
20544
- "aria-label": "Delete rule"
20843
+ "aria-label": t("branchingLogic.deleteRule")
20545
20844
  }
20546
20845
  )
20547
20846
  ] }),
20548
- broken && /* @__PURE__ */ jsx(Badge, { variant: "error", size: "sm", label: "Broken reference" })
20847
+ broken && /* @__PURE__ */ jsx(Badge, { variant: "error", size: "sm", label: t("branchingLogic.brokenReference") })
20549
20848
  ]
20550
20849
  }
20551
20850
  );
@@ -20555,10 +20854,12 @@ var init_BranchingLogicBuilder = __esm({
20555
20854
  NODE_GAP_Y = 80;
20556
20855
  PADDING = 32;
20557
20856
  LogicGraph = ({ questions, rules }) => {
20857
+ const { t } = useTranslate();
20858
+ const endOfSurveyLabel = t("branchingLogic.endOfSurvey");
20558
20859
  const layout = useMemo(() => {
20559
20860
  const items = [
20560
20861
  ...questions.map((q) => ({ id: q.id, label: q.label, isEnd: false })),
20561
- { id: END_OF_SURVEY, label: "End of survey", isEnd: true }
20862
+ { id: END_OF_SURVEY, label: endOfSurveyLabel, isEnd: true }
20562
20863
  ];
20563
20864
  const positions = {};
20564
20865
  items.forEach((item, i) => {
@@ -20570,14 +20871,14 @@ var init_BranchingLogicBuilder = __esm({
20570
20871
  const width = NODE_WIDTH + PADDING * 2 + 220;
20571
20872
  const height = PADDING * 2 + items.length * (NODE_HEIGHT + NODE_GAP_Y);
20572
20873
  return { items, positions, width, height };
20573
- }, [questions]);
20874
+ }, [questions, endOfSurveyLabel]);
20574
20875
  return /* @__PURE__ */ jsx(Box, { className: "overflow-auto rounded-container border border-border bg-card p-2", children: /* @__PURE__ */ jsxs(
20575
20876
  "svg",
20576
20877
  {
20577
20878
  width: layout.width,
20578
20879
  height: layout.height,
20579
20880
  role: "img",
20580
- "aria-label": "Branching logic graph",
20881
+ "aria-label": t("branchingLogic.graphAriaLabel"),
20581
20882
  style: { display: "block" },
20582
20883
  children: [
20583
20884
  /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx(
@@ -20685,6 +20986,7 @@ var init_BranchingLogicBuilder = __esm({
20685
20986
  readOnly = false,
20686
20987
  className
20687
20988
  }) => {
20989
+ const { t } = useTranslate();
20688
20990
  const eventBus = useEventBus();
20689
20991
  const questions = Array.isArray(questionsProp) ? questionsProp : [];
20690
20992
  const rulesInitial = Array.isArray(rulesProp) ? rulesProp : [];
@@ -20737,16 +21039,23 @@ var init_BranchingLogicBuilder = __esm({
20737
21039
  /* @__PURE__ */ jsxs(Box, { className: "flex flex-wrap items-center justify-between gap-2", children: [
20738
21040
  /* @__PURE__ */ jsxs(Box, { className: "flex items-center gap-2", children: [
20739
21041
  /* @__PURE__ */ jsx(GitBranch, { className: "h-5 w-5 text-foreground" }),
20740
- /* @__PURE__ */ jsx(Typography, { variant: "subheading", weight: "semibold", children: "Branching logic" }),
21042
+ /* @__PURE__ */ jsx(Typography, { variant: "subheading", weight: "semibold", children: t("branchingLogic.title") }),
20741
21043
  /* @__PURE__ */ jsx(
20742
21044
  Badge,
20743
21045
  {
20744
21046
  variant: "neutral",
20745
21047
  size: "sm",
20746
- label: `${rules.length} rule${rules.length === 1 ? "" : "s"}`
21048
+ label: rules.length === 1 ? t("branchingLogic.ruleCountOne", { count: rules.length }) : t("branchingLogic.ruleCountOther", { count: rules.length })
20747
21049
  }
20748
21050
  ),
20749
- brokenCount > 0 && /* @__PURE__ */ jsx(Badge, { variant: "error", size: "sm", label: `${brokenCount} broken` })
21051
+ brokenCount > 0 && /* @__PURE__ */ jsx(
21052
+ Badge,
21053
+ {
21054
+ variant: "error",
21055
+ size: "sm",
21056
+ label: t("branchingLogic.brokenCount", { count: brokenCount })
21057
+ }
21058
+ )
20750
21059
  ] }),
20751
21060
  /* @__PURE__ */ jsxs(Box, { className: "flex items-center gap-1 rounded-sm border border-border bg-card p-0.5", children: [
20752
21061
  /* @__PURE__ */ jsx(
@@ -20757,7 +21066,7 @@ var init_BranchingLogicBuilder = __esm({
20757
21066
  leftIcon: Pencil,
20758
21067
  action: "VIEW_EDIT",
20759
21068
  onClick: () => setView("edit"),
20760
- children: "Rules"
21069
+ children: t("branchingLogic.rules")
20761
21070
  }
20762
21071
  ),
20763
21072
  /* @__PURE__ */ jsx(
@@ -20768,13 +21077,13 @@ var init_BranchingLogicBuilder = __esm({
20768
21077
  leftIcon: Eye,
20769
21078
  action: "VIEW_GRAPH",
20770
21079
  onClick: () => setView("graph"),
20771
- children: "Logic graph"
21080
+ children: t("branchingLogic.logicGraph")
20772
21081
  }
20773
21082
  )
20774
21083
  ] })
20775
21084
  ] }),
20776
21085
  view === "edit" ? /* @__PURE__ */ jsxs(Box, { className: "flex flex-col gap-2", children: [
20777
- rules.length === 0 ? /* @__PURE__ */ jsx(Card, { variant: "bordered", padding: "lg", className: "text-center", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "muted", children: noQuestions ? "Add questions before building branching rules." : "No rules yet. Add a rule to define branching logic." }) }) : rules.map((rule) => /* @__PURE__ */ jsx(
21086
+ rules.length === 0 ? /* @__PURE__ */ jsx(Card, { variant: "bordered", padding: "lg", className: "text-center", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "muted", children: noQuestions ? t("branchingLogic.emptyNoQuestions") : t("branchingLogic.emptyNoRules") }) }) : rules.map((rule) => /* @__PURE__ */ jsx(
20778
21087
  RuleRow,
20779
21088
  {
20780
21089
  rule,
@@ -20795,7 +21104,7 @@ var init_BranchingLogicBuilder = __esm({
20795
21104
  action: "ADD_RULE",
20796
21105
  onClick: handleAddRule,
20797
21106
  disabled: noQuestions,
20798
- children: "Add rule"
21107
+ children: t("branchingLogic.addRule")
20799
21108
  }
20800
21109
  ) })
20801
21110
  ] }) : /* @__PURE__ */ jsx(LogicGraph, { questions, rules })
@@ -21422,7 +21731,7 @@ function CalendarGrid({
21422
21731
  onClick: stepPrev,
21423
21732
  "aria-disabled": !canPrev || void 0,
21424
21733
  "aria-label": t("aria.previousDays"),
21425
- children: "Prev"
21734
+ children: t("nav.previous")
21426
21735
  }
21427
21736
  ),
21428
21737
  /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground", children: formatDateRange(visibleDays[0], visibleDays[visibleDays.length - 1]) }),
@@ -21435,7 +21744,7 @@ function CalendarGrid({
21435
21744
  onClick: stepNext,
21436
21745
  "aria-disabled": !canNext || void 0,
21437
21746
  "aria-label": t("aria.nextDays"),
21438
- children: "Next"
21747
+ children: t("nav.next")
21439
21748
  }
21440
21749
  )
21441
21750
  ] }),
@@ -22985,7 +23294,7 @@ var init_Pagination = __esm({
22985
23294
  type: "number",
22986
23295
  value: jumpToPage,
22987
23296
  onChange: (e) => setJumpToPage(e.target.value),
22988
- placeholder: "Page",
23297
+ placeholder: t("pagination.jumpPlaceholder"),
22989
23298
  className: "w-20",
22990
23299
  onKeyDown: (e) => {
22991
23300
  if (e.key === "Enter") {
@@ -23123,13 +23432,10 @@ var init_CardGrid = __esm({
23123
23432
  return children;
23124
23433
  }
23125
23434
  if (isLoading) {
23126
- return /* @__PURE__ */ jsx(Box, { className: "col-span-full text-center py-8 text-muted-foreground", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "secondary", children: "Loading items..." }) });
23435
+ return /* @__PURE__ */ jsx(Box, { className: "col-span-full text-center py-8 text-muted-foreground", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "secondary", children: t("loading.items") }) });
23127
23436
  }
23128
23437
  if (error) {
23129
- return /* @__PURE__ */ jsx(Box, { className: "col-span-full text-center py-8 text-error", children: /* @__PURE__ */ jsxs(Typography, { variant: "body", color: "error", children: [
23130
- "Error loading items: ",
23131
- error.message
23132
- ] }) });
23438
+ return /* @__PURE__ */ jsx(Box, { className: "col-span-full text-center py-8 text-error", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "error", children: t("error.loadFailed", { message: error.message }) }) });
23133
23439
  }
23134
23440
  if (normalizedData.length === 0) {
23135
23441
  return /* @__PURE__ */ jsx(Box, { className: "col-span-full text-center py-12 text-muted-foreground", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "secondary", children: t("empty.noItems") || "No items found" }) });
@@ -26995,7 +27301,7 @@ function DataGrid({
26995
27301
  onChange: () => toggleSelection(id),
26996
27302
  onClick: (e) => e.stopPropagation(),
26997
27303
  className: "w-4 h-4 mt-1 flex-shrink-0 accent-primary",
26998
- "aria-label": `Select ${titleValue !== void 0 ? String(titleValue) : "item"}`
27304
+ "aria-label": t("card.selectItem", { item: titleValue !== void 0 ? String(titleValue) : t("card.itemFallback") })
26999
27305
  }
27000
27306
  ),
27001
27307
  /* @__PURE__ */ jsxs(VStack, { gap: "xs", className: "flex-1 min-w-0", children: [
@@ -27193,7 +27499,7 @@ function formatDate3(value) {
27193
27499
  if (isNaN(d.getTime())) return String(value);
27194
27500
  return d.toLocaleDateString(void 0, { year: "numeric", month: "short", day: "numeric" });
27195
27501
  }
27196
- function formatValue2(value, format) {
27502
+ function formatValue2(value, format, boolLabels) {
27197
27503
  if (value === void 0 || value === null) return "";
27198
27504
  switch (format) {
27199
27505
  case "date":
@@ -27205,7 +27511,7 @@ function formatValue2(value, format) {
27205
27511
  case "percent":
27206
27512
  return typeof value === "number" ? `${Math.round(value)}%` : String(value);
27207
27513
  case "boolean":
27208
- return value ? "Yes" : "No";
27514
+ return value ? boolLabels?.yes ?? "Yes" : boolLabels?.no ?? "No";
27209
27515
  default:
27210
27516
  return String(value);
27211
27517
  }
@@ -27501,7 +27807,7 @@ function DataList({
27501
27807
  field.label ?? fieldLabel3(field.name),
27502
27808
  ":"
27503
27809
  ] }),
27504
- /* @__PURE__ */ jsx(Typography, { variant: "small", children: formatValue2(value, field.format) })
27810
+ /* @__PURE__ */ jsx(Typography, { variant: "small", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
27505
27811
  ] }, field.name);
27506
27812
  }) }),
27507
27813
  progressFields.map((field) => {
@@ -27631,6 +27937,7 @@ var init_FileTree = __esm({
27631
27937
  init_Box();
27632
27938
  init_Typography();
27633
27939
  init_Icon();
27940
+ init_useTranslate();
27634
27941
  TreeNodeItem = ({
27635
27942
  node,
27636
27943
  depth,
@@ -27716,8 +28023,9 @@ var init_FileTree = __esm({
27716
28023
  className,
27717
28024
  indent = 16
27718
28025
  }) => {
28026
+ const { t } = useTranslate();
27719
28027
  if (tree.length === 0) {
27720
- return /* @__PURE__ */ jsx(Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: "No files" }) });
28028
+ return /* @__PURE__ */ jsx(Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: t("fileTree.noFiles") }) });
27721
28029
  }
27722
28030
  return /* @__PURE__ */ jsx(Box, { className: `py-1 overflow-y-auto ${className ?? ""}`, role: "tree", children: tree.map((node) => /* @__PURE__ */ jsx(
27723
28031
  TreeNodeItem,
@@ -27836,6 +28144,7 @@ var init_FilterGroup = __esm({
27836
28144
  init_Icon();
27837
28145
  init_useEventBus();
27838
28146
  init_useQuerySingleton();
28147
+ init_useTranslate();
27839
28148
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
27840
28149
  lookStyles6 = {
27841
28150
  toolbar: "",
@@ -27856,6 +28165,7 @@ var init_FilterGroup = __esm({
27856
28165
  isLoading,
27857
28166
  look = "toolbar"
27858
28167
  }) => {
28168
+ const { t } = useTranslate();
27859
28169
  const eventBus = useEventBus();
27860
28170
  const queryState = useQuerySingleton(query);
27861
28171
  const [selectedValues, setSelectedValues] = useState(
@@ -27937,7 +28247,7 @@ var init_FilterGroup = __esm({
27937
28247
  "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
27938
28248
  !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
27939
28249
  ),
27940
- children: "All"
28250
+ children: t("filterGroup.all")
27941
28251
  }
27942
28252
  ),
27943
28253
  filter.options?.map((option) => /* @__PURE__ */ jsx(
@@ -27965,7 +28275,7 @@ var init_FilterGroup = __esm({
27965
28275
  size: "sm",
27966
28276
  onClick: handleClearAll,
27967
28277
  leftIcon: /* @__PURE__ */ jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
27968
- children: "Clear"
28278
+ children: t("filterGroup.clear")
27969
28279
  }
27970
28280
  )
27971
28281
  ]
@@ -27976,7 +28286,7 @@ var init_FilterGroup = __esm({
27976
28286
  return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-4", lookStyles6[look], className), children: [
27977
28287
  showIcon && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
27978
28288
  /* @__PURE__ */ jsx(Icon, { name: "filter", className: "h-4 w-4" }),
27979
- /* @__PURE__ */ jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
28289
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
27980
28290
  ] }),
27981
28291
  filters.map((filter) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
27982
28292
  /* @__PURE__ */ jsx("label", { className: "text-xs font-bold text-muted-foreground uppercase tracking-wide", children: filter.label }),
@@ -27999,7 +28309,7 @@ var init_FilterGroup = __esm({
27999
28309
  `${filter.field}_from`,
28000
28310
  e.target.value || null
28001
28311
  ),
28002
- placeholder: "From",
28312
+ placeholder: t("filterGroup.from"),
28003
28313
  clearable: true,
28004
28314
  onClear: () => handleFilterSelect(`${filter.field}_from`, null)
28005
28315
  }
@@ -28013,7 +28323,7 @@ var init_FilterGroup = __esm({
28013
28323
  `${filter.field}_to`,
28014
28324
  e.target.value || null
28015
28325
  ),
28016
- placeholder: "To",
28326
+ placeholder: t("filterGroup.to"),
28017
28327
  clearable: true,
28018
28328
  onClear: () => handleFilterSelect(`${filter.field}_to`, null)
28019
28329
  }
@@ -28033,7 +28343,7 @@ var init_FilterGroup = __esm({
28033
28343
  value: selectedValues[filter.field] || "all",
28034
28344
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
28035
28345
  options: [
28036
- { value: "all", label: "All" },
28346
+ { value: "all", label: t("filterGroup.all") },
28037
28347
  ...filter.options?.map((opt) => ({
28038
28348
  value: opt,
28039
28349
  label: opt
@@ -28050,7 +28360,7 @@ var init_FilterGroup = __esm({
28050
28360
  onClick: handleClearAll,
28051
28361
  leftIcon: /* @__PURE__ */ jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
28052
28362
  className: "self-start",
28053
- children: "Clear all"
28363
+ children: t("filterGroup.clearAll")
28054
28364
  }
28055
28365
  )
28056
28366
  ] });
@@ -28116,7 +28426,7 @@ var init_FilterGroup = __esm({
28116
28426
  value: selectedValues[filter.field] || "all",
28117
28427
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
28118
28428
  options: [
28119
- { value: "all", label: `All ${filter.label}` },
28429
+ { value: "all", label: t("filterGroup.allOf", { label: filter.label }) },
28120
28430
  ...filter.options?.map((opt) => ({
28121
28431
  value: opt,
28122
28432
  label: opt
@@ -28145,7 +28455,7 @@ var init_FilterGroup = __esm({
28145
28455
  field
28146
28456
  );
28147
28457
  }),
28148
- /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
28458
+ /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: t("filterGroup.clearAll") })
28149
28459
  ] })
28150
28460
  ]
28151
28461
  }
@@ -28170,7 +28480,7 @@ var init_FilterGroup = __esm({
28170
28480
  className: "text-muted-foreground",
28171
28481
  children: [
28172
28482
  /* @__PURE__ */ jsx(Icon, { name: "filter", className: "h-4 w-4" }),
28173
- /* @__PURE__ */ jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
28483
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
28174
28484
  ]
28175
28485
  }
28176
28486
  ),
@@ -28196,7 +28506,7 @@ var init_FilterGroup = __esm({
28196
28506
  `${filter.field}_from`,
28197
28507
  e.target.value || null
28198
28508
  ),
28199
- placeholder: "From",
28509
+ placeholder: t("filterGroup.from"),
28200
28510
  clearable: true,
28201
28511
  onClear: () => handleFilterSelect(`${filter.field}_from`, null),
28202
28512
  className: "min-w-[130px]"
@@ -28212,7 +28522,7 @@ var init_FilterGroup = __esm({
28212
28522
  `${filter.field}_to`,
28213
28523
  e.target.value || null
28214
28524
  ),
28215
- placeholder: "To",
28525
+ placeholder: t("filterGroup.to"),
28216
28526
  clearable: true,
28217
28527
  onClear: () => handleFilterSelect(`${filter.field}_to`, null),
28218
28528
  className: "min-w-[130px]"
@@ -28234,7 +28544,7 @@ var init_FilterGroup = __esm({
28234
28544
  value: selectedValues[filter.field] || "all",
28235
28545
  onChange: (e) => handleFilterSelect(filter.field, e.target.value),
28236
28546
  options: [
28237
- { value: "all", label: "All" },
28547
+ { value: "all", label: t("filterGroup.all") },
28238
28548
  ...filter.options?.map((opt) => ({
28239
28549
  value: opt,
28240
28550
  label: opt
@@ -28245,10 +28555,7 @@ var init_FilterGroup = __esm({
28245
28555
  )
28246
28556
  ] }, filter.field)),
28247
28557
  activeFilterCount > 0 && /* @__PURE__ */ jsxs(HStack, { gap: "sm", align: "center", className: "ml-auto", children: [
28248
- /* @__PURE__ */ jsxs(Badge, { variant: "primary", size: "md", children: [
28249
- activeFilterCount,
28250
- " active"
28251
- ] }),
28558
+ /* @__PURE__ */ jsx(Badge, { variant: "primary", size: "md", children: t("filterGroup.activeCount", { count: activeFilterCount }) }),
28252
28559
  /* @__PURE__ */ jsx(
28253
28560
  Button,
28254
28561
  {
@@ -28256,7 +28563,7 @@ var init_FilterGroup = __esm({
28256
28563
  size: "sm",
28257
28564
  onClick: handleClearAll,
28258
28565
  leftIcon: /* @__PURE__ */ jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
28259
- children: "Clear all"
28566
+ children: t("filterGroup.clearAll")
28260
28567
  }
28261
28568
  )
28262
28569
  ] })
@@ -29200,19 +29507,20 @@ var init_RepeatableFormSection = __esm({
29200
29507
  RepeatableFormSection.displayName = "RepeatableFormSection";
29201
29508
  }
29202
29509
  });
29203
- var actionTypeLabels, actionTypeIcons, ViolationAlert;
29510
+ var actionTypeLabelKeys, actionTypeIcons, ViolationAlert;
29204
29511
  var init_ViolationAlert = __esm({
29205
29512
  "components/core/molecules/ViolationAlert.tsx"() {
29206
29513
  init_cn();
29514
+ init_useTranslate();
29207
29515
  init_Box();
29208
29516
  init_Stack();
29209
29517
  init_Typography();
29210
29518
  init_Button();
29211
29519
  init_Icon();
29212
- actionTypeLabels = {
29213
- measure: "Corrective Measure",
29214
- admin: "Administrative Action",
29215
- penalty: "Penalty Proceedings"
29520
+ actionTypeLabelKeys = {
29521
+ measure: "violationAlert.actionType.measure",
29522
+ admin: "violationAlert.actionType.admin",
29523
+ penalty: "violationAlert.actionType.penalty"
29216
29524
  };
29217
29525
  actionTypeIcons = {
29218
29526
  measure: "alert-triangle",
@@ -29229,10 +29537,11 @@ var init_ViolationAlert = __esm({
29229
29537
  className,
29230
29538
  ...flatProps
29231
29539
  }) => {
29540
+ const { t } = useTranslate();
29232
29541
  const resolvedViolation = violation ?? {
29233
29542
  law: "",
29234
29543
  article: "",
29235
- message: flatProps.message ?? "Violation",
29544
+ message: flatProps.message ?? t("violationAlert.fallbackMessage"),
29236
29545
  actionType: "measure"
29237
29546
  };
29238
29547
  const effectiveSeverity = severity ?? (resolvedViolation.actionType === "measure" ? "warning" : "error");
@@ -29317,7 +29626,7 @@ var init_ViolationAlert = __esm({
29317
29626
  {
29318
29627
  variant: "caption",
29319
29628
  className: cn(textColor, "opacity-75"),
29320
- children: actionTypeLabels[resolvedViolation.actionType]
29629
+ children: t(actionTypeLabelKeys[resolvedViolation.actionType])
29321
29630
  }
29322
29631
  )
29323
29632
  ] })
@@ -29348,7 +29657,7 @@ var init_ViolationAlert = __esm({
29348
29657
  {
29349
29658
  variant: "caption",
29350
29659
  className: cn(textColor, "opacity-75"),
29351
- children: "Admin:"
29660
+ children: t("violationAlert.adminLabel")
29352
29661
  }
29353
29662
  ),
29354
29663
  /* @__PURE__ */ jsx(
@@ -29367,7 +29676,7 @@ var init_ViolationAlert = __esm({
29367
29676
  {
29368
29677
  variant: "caption",
29369
29678
  className: cn(textColor, "opacity-75"),
29370
- children: "Penalty:"
29679
+ children: t("violationAlert.penaltyLabel")
29371
29680
  }
29372
29681
  ),
29373
29682
  /* @__PURE__ */ jsx(
@@ -29392,7 +29701,7 @@ var init_ViolationAlert = __esm({
29392
29701
  className: cn(textColor, "self-start"),
29393
29702
  children: [
29394
29703
  /* @__PURE__ */ jsx(Icon, { name: "arrow-right", size: "sm", className: "mr-1" }),
29395
- "Go to field"
29704
+ t("violationAlert.goToField")
29396
29705
  ]
29397
29706
  }
29398
29707
  )
@@ -29708,6 +30017,7 @@ var init_LineChart = __esm({
29708
30017
  "use client";
29709
30018
  init_cn();
29710
30019
  init_atoms2();
30020
+ init_useTranslate();
29711
30021
  LineChart2 = ({
29712
30022
  data,
29713
30023
  width = 400,
@@ -29719,6 +30029,7 @@ var init_LineChart = __esm({
29719
30029
  areaColor = "var(--color-primary)",
29720
30030
  className
29721
30031
  }) => {
30032
+ const { t } = useTranslate();
29722
30033
  const gradientId = useId();
29723
30034
  const safeData = data ?? [];
29724
30035
  const sortedData = useMemo(() => {
@@ -29755,7 +30066,7 @@ var init_LineChart = __esm({
29755
30066
  return `${linePath} L ${last.x} ${bottom} L ${first.x} ${bottom} Z`;
29756
30067
  }, [linePath, points, height, showArea]);
29757
30068
  if (safeData.length === 0) {
29758
- return /* @__PURE__ */ jsx(Box, { className: cn("flex items-center justify-center text-muted-foreground", className), style: { width, height }, children: "No data" });
30069
+ return /* @__PURE__ */ jsx(Box, { className: cn("flex items-center justify-center text-muted-foreground", className), style: { width, height }, children: t("empty.noData") });
29759
30070
  }
29760
30071
  return /* @__PURE__ */ jsx(Box, { className: cn(className), children: /* @__PURE__ */ jsxs(
29761
30072
  "svg",
@@ -31662,6 +31973,7 @@ var init_GraphView = __esm({
31662
31973
  "use client";
31663
31974
  init_cn();
31664
31975
  init_atoms2();
31976
+ init_useTranslate();
31665
31977
  GROUP_COLORS = [
31666
31978
  "#3b82f6",
31667
31979
  // blue-500
@@ -31694,6 +32006,7 @@ var init_GraphView = __esm({
31694
32006
  showLabels = true,
31695
32007
  zoomToFit = true
31696
32008
  }) => {
32009
+ const { t } = useTranslate();
31697
32010
  const containerRef = useRef(null);
31698
32011
  const animRef = useRef(0);
31699
32012
  const [simNodes, setSimNodes] = useState([]);
@@ -31871,7 +32184,7 @@ var init_GraphView = __esm({
31871
32184
  [onNodeClick]
31872
32185
  );
31873
32186
  if (nodes.length === 0) {
31874
- return /* @__PURE__ */ jsx(Box, { className: cn("flex items-center justify-center", className), style: { width: w, height: h }, children: /* @__PURE__ */ jsx(Box, { className: "text-muted-foreground text-sm", children: "No graph data" }) });
32187
+ return /* @__PURE__ */ jsx(Box, { className: cn("flex items-center justify-center", className), style: { width: w, height: h }, children: /* @__PURE__ */ jsx(Box, { className: "text-muted-foreground text-sm", children: t("display.noGraphData") }) });
31875
32188
  }
31876
32189
  return /* @__PURE__ */ jsx(
31877
32190
  Box,
@@ -32327,11 +32640,12 @@ var init_UploadDropZone = __esm({
32327
32640
  init_Icon();
32328
32641
  init_Typography();
32329
32642
  init_useEventBus();
32643
+ init_useTranslate();
32330
32644
  UploadDropZone = ({
32331
32645
  accept,
32332
32646
  maxSize,
32333
32647
  maxFiles = 1,
32334
- label = "Drop files here or click to browse",
32648
+ label,
32335
32649
  description,
32336
32650
  disabled = false,
32337
32651
  action,
@@ -32339,22 +32653,24 @@ var init_UploadDropZone = __esm({
32339
32653
  onFiles,
32340
32654
  className
32341
32655
  }) => {
32656
+ const { t } = useTranslate();
32657
+ const resolvedLabel = label ?? t("upload.dropOrBrowse");
32342
32658
  const [isDragOver, setIsDragOver] = useState(false);
32343
32659
  const [error, setError] = useState(null);
32344
32660
  const inputRef = useRef(null);
32345
32661
  const eventBus = useSafeEventBus7();
32346
32662
  const defaultDescription = [
32347
- accept ? `Accepted: ${accept}` : null,
32348
- maxSize ? `Max size: ${formatFileSize(maxSize)}` : null,
32349
- maxFiles > 1 ? `Up to ${maxFiles} files` : null
32663
+ accept ? t("upload.accepted", { accept }) : null,
32664
+ maxSize ? t("upload.maxSize", { size: formatFileSize(maxSize) }) : null,
32665
+ maxFiles > 1 ? t("upload.maxFiles", { count: maxFiles }) : null
32350
32666
  ].filter(Boolean).join(". ");
32351
32667
  const validateFiles = useCallback(
32352
32668
  (files) => {
32353
32669
  if (files.length > maxFiles) {
32354
- return { valid: [], error: `Maximum ${maxFiles} file${maxFiles > 1 ? "s" : ""} allowed` };
32670
+ return { valid: [], error: t("upload.error.maxFiles", { count: maxFiles }) };
32355
32671
  }
32356
32672
  if (accept) {
32357
- const acceptedTypes = accept.split(",").map((t) => t.trim());
32673
+ const acceptedTypes = accept.split(",").map((s) => s.trim());
32358
32674
  const invalid = files.filter((file) => {
32359
32675
  return !acceptedTypes.some((type) => {
32360
32676
  if (type.endsWith("/*")) {
@@ -32364,7 +32680,7 @@ var init_UploadDropZone = __esm({
32364
32680
  });
32365
32681
  });
32366
32682
  if (invalid.length > 0) {
32367
- return { valid: [], error: `Invalid file type: ${invalid[0].name}` };
32683
+ return { valid: [], error: t("upload.error.invalidType", { name: invalid[0].name }) };
32368
32684
  }
32369
32685
  }
32370
32686
  if (maxSize) {
@@ -32372,13 +32688,13 @@ var init_UploadDropZone = __esm({
32372
32688
  if (tooLarge.length > 0) {
32373
32689
  return {
32374
32690
  valid: [],
32375
- error: `File too large: ${tooLarge[0].name} (max ${formatFileSize(maxSize)})`
32691
+ error: t("upload.error.tooLarge", { name: tooLarge[0].name, size: formatFileSize(maxSize) })
32376
32692
  };
32377
32693
  }
32378
32694
  }
32379
32695
  return { valid: files, error: null };
32380
32696
  },
32381
- [accept, maxSize, maxFiles]
32697
+ [accept, maxSize, maxFiles, t]
32382
32698
  );
32383
32699
  const handleFiles = useCallback(
32384
32700
  (files) => {
@@ -32449,7 +32765,7 @@ var init_UploadDropZone = __esm({
32449
32765
  handleClick();
32450
32766
  }
32451
32767
  },
32452
- "aria-label": label,
32768
+ "aria-label": resolvedLabel,
32453
32769
  children: [
32454
32770
  /* @__PURE__ */ jsx(
32455
32771
  "input",
@@ -32465,7 +32781,7 @@ var init_UploadDropZone = __esm({
32465
32781
  }
32466
32782
  ),
32467
32783
  error ? /* @__PURE__ */ jsx(Icon, { name: "file-warning", size: "lg", className: "text-error mb-2" }) : /* @__PURE__ */ jsx(Icon, { name: "upload", size: "lg", className: "text-muted-foreground mb-2" }),
32468
- /* @__PURE__ */ jsx(Typography, { variant: "body1", className: "text-center font-medium mb-1", children: isDragOver ? "Drop files here" : label }),
32784
+ /* @__PURE__ */ jsx(Typography, { variant: "body1", className: "text-center font-medium mb-1", children: isDragOver ? t("upload.dropFilesHere") : resolvedLabel }),
32469
32785
  error ? /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "error", className: "text-center", children: error }) : /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "text-center", children: description ?? defaultDescription })
32470
32786
  ]
32471
32787
  }
@@ -32887,7 +33203,7 @@ function TableView({
32887
33203
  {
32888
33204
  checked: selected.has(id),
32889
33205
  onChange: () => toggleRow(id),
32890
- "aria-label": `Select row ${id}`
33206
+ "aria-label": t("table.selectRow", { id })
32891
33207
  }
32892
33208
  ) }),
32893
33209
  hasRenderProp ? /* @__PURE__ */ jsx(Box, { className: "flex-1 min-w-0", children: children(row, index) }) : colDefs.map((col) => {
@@ -35734,7 +36050,7 @@ var init_QrScanner = __esm({
35734
36050
  className: "inset-0 flex-col items-center justify-center gap-2 bg-black bg-opacity-80 text-center",
35735
36051
  children: [
35736
36052
  /* @__PURE__ */ jsx(Icon, { name: "camera", className: "h-8 w-8 text-white", "aria-hidden": "true" }),
35737
- /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "text-white", children: "Camera unavailable" }),
36053
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "text-white", children: t("qrScanner.cameraUnavailable") }),
35738
36054
  /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-white opacity-70", children: cameraError.message })
35739
36055
  ]
35740
36056
  }
@@ -35745,7 +36061,7 @@ var init_QrScanner = __esm({
35745
36061
  position: "absolute",
35746
36062
  display: "flex",
35747
36063
  className: "inset-0 items-center justify-center bg-black bg-opacity-60",
35748
- children: /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "text-white", children: "Paused" })
36064
+ children: /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "text-white", children: t("qrScanner.paused") })
35749
36065
  }
35750
36066
  ),
35751
36067
  showCameraControls && /* @__PURE__ */ jsxs(
@@ -35764,7 +36080,7 @@ var init_QrScanner = __esm({
35764
36080
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
35765
36081
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
35766
36082
  ),
35767
- "aria-label": isPaused ? "Resume scanning" : "Pause scanning",
36083
+ "aria-label": isPaused ? t("qrScanner.resumeScanning") : t("qrScanner.pauseScanning"),
35768
36084
  children: isPaused ? /* @__PURE__ */ jsx(Icon, { name: "play", className: "h-4 w-4" }) : /* @__PURE__ */ jsx(Icon, { name: "pause", className: "h-4 w-4" })
35769
36085
  }
35770
36086
  ),
@@ -35777,7 +36093,7 @@ var init_QrScanner = __esm({
35777
36093
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
35778
36094
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
35779
36095
  ),
35780
- "aria-label": `Switch to ${currentFacing === "environment" ? "front" : "rear"} camera`,
36096
+ "aria-label": currentFacing === "environment" ? t("qrScanner.switchToFrontCamera") : t("qrScanner.switchToRearCamera"),
35781
36097
  children: /* @__PURE__ */ jsx(Icon, { name: "refresh-cw", className: "h-4 w-4" })
35782
36098
  }
35783
36099
  ),
@@ -35791,7 +36107,7 @@ var init_QrScanner = __esm({
35791
36107
  "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
35792
36108
  ),
35793
36109
  "aria-label": t("aria.mockScanDev"),
35794
- children: "Mock Scan"
36110
+ children: t("qrScanner.mockScan")
35795
36111
  }
35796
36112
  )
35797
36113
  ]
@@ -35809,6 +36125,7 @@ var init_OptionConstraintGroup = __esm({
35809
36125
  "components/core/molecules/OptionConstraintGroup.tsx"() {
35810
36126
  init_cn();
35811
36127
  init_useEventBus();
36128
+ init_useTranslate();
35812
36129
  init_Typography();
35813
36130
  init_Box();
35814
36131
  init_Label();
@@ -35818,36 +36135,36 @@ var init_OptionConstraintGroup = __esm({
35818
36135
  const sign = delta >= 0 ? "+" : "-";
35819
36136
  return `${sign}$${Math.abs(delta).toFixed(2)}`;
35820
36137
  };
35821
- constraintHint = (constraint) => {
36138
+ constraintHint = (constraint, t) => {
35822
36139
  if (constraint.type === "single") {
35823
- return constraint.required ? "Required, pick 1" : "Optional, pick up to 1";
36140
+ return constraint.required ? t("optionConstraint.requiredOne") : t("optionConstraint.optionalOne");
35824
36141
  }
35825
36142
  const { min, max } = constraint;
35826
36143
  if (min && max) {
35827
- return min === max ? `Pick exactly ${min}` : `Pick ${min}-${max}`;
36144
+ return min === max ? t("optionConstraint.pickExactly", { count: min }) : t("optionConstraint.pickRange", { min, max });
35828
36145
  }
35829
- if (min) return `Pick at least ${min}`;
35830
- if (max) return `Pick up to ${max}`;
35831
- return "Optional";
36146
+ if (min) return t("optionConstraint.pickAtLeast", { count: min });
36147
+ if (max) return t("optionConstraint.pickUpTo", { count: max });
36148
+ return t("optionConstraint.optional");
35832
36149
  };
35833
- validateSelection = (selected, constraint) => {
36150
+ validateSelection = (selected, constraint, t) => {
35834
36151
  if (constraint.type === "single") {
35835
36152
  if (constraint.required && selected.length === 0) {
35836
- return "Pick 1 option";
36153
+ return t("optionConstraint.error.pickOne");
35837
36154
  }
35838
36155
  if (selected.length > 1) {
35839
- return "Pick only 1 option";
36156
+ return t("optionConstraint.error.pickOnlyOne");
35840
36157
  }
35841
36158
  return void 0;
35842
36159
  }
35843
36160
  const { min, max } = constraint;
35844
36161
  if (min !== void 0 && selected.length < min) {
35845
36162
  const remaining = min - selected.length;
35846
- return `Pick at least ${remaining} more`;
36163
+ return t("optionConstraint.error.pickMore", { count: remaining });
35847
36164
  }
35848
36165
  if (max !== void 0 && selected.length > max) {
35849
36166
  const excess = selected.length - max;
35850
- return `Remove ${excess} option${excess === 1 ? "" : "s"}`;
36167
+ return t("optionConstraint.error.removeOptions", { count: excess });
35851
36168
  }
35852
36169
  return void 0;
35853
36170
  };
@@ -35864,8 +36181,9 @@ var init_OptionConstraintGroup = __esm({
35864
36181
  className
35865
36182
  }) => {
35866
36183
  const eventBus = useEventBus();
35867
- const hint = constraintHint(constraint);
35868
- const error = validateSelection(selected, constraint);
36184
+ const { t } = useTranslate();
36185
+ const hint = constraintHint(constraint, t);
36186
+ const error = validateSelection(selected, constraint, t);
35869
36187
  const inputName = `option-${groupId}`;
35870
36188
  const labelTextSize = size === "sm" ? "text-sm" : "text-base";
35871
36189
  const optionGap = size === "sm" ? "gap-2" : "gap-2.5";
@@ -35965,7 +36283,7 @@ var init_OptionConstraintGroup = __esm({
35965
36283
  variant: "caption",
35966
36284
  color: "warning",
35967
36285
  className: "rounded border border-warning/40 px-1.5 py-0.5",
35968
- children: "Out of stock"
36286
+ children: t("optionConstraint.outOfStock")
35969
36287
  }
35970
36288
  )
35971
36289
  ]
@@ -36287,6 +36605,7 @@ function changeBlockType(block, type) {
36287
36605
  return { id: block.id, type, content: seed };
36288
36606
  }
36289
36607
  function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36608
+ const { t } = useTranslate();
36290
36609
  const [open, setOpen] = useState(false);
36291
36610
  const ref = useRef(null);
36292
36611
  useEffect(() => {
@@ -36306,7 +36625,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36306
36625
  {
36307
36626
  type: "button",
36308
36627
  variant: "ghost",
36309
- "aria-label": "Block actions",
36628
+ "aria-label": t("richBlockEditor.blockActions"),
36310
36629
  className: cn(
36311
36630
  "inline-flex items-center justify-center",
36312
36631
  "h-6 w-6 rounded-sm p-0 gap-0",
@@ -36328,7 +36647,7 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36328
36647
  "py-1 text-sm"
36329
36648
  ),
36330
36649
  children: [
36331
- /* @__PURE__ */ jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: BLOCK_TYPE_LABEL[block.type] }),
36650
+ /* @__PURE__ */ jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: t(BLOCK_TYPE_LABEL_KEY[block.type]) }),
36332
36651
  /* @__PURE__ */ jsxs(
36333
36652
  Button,
36334
36653
  {
@@ -36342,7 +36661,8 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36342
36661
  },
36343
36662
  children: [
36344
36663
  /* @__PURE__ */ jsx(Icon, { name: "plus", className: "w-3.5 h-3.5" }),
36345
- " Duplicate"
36664
+ " ",
36665
+ t("richBlockEditor.duplicate")
36346
36666
  ]
36347
36667
  }
36348
36668
  ),
@@ -36359,14 +36679,15 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36359
36679
  },
36360
36680
  children: [
36361
36681
  /* @__PURE__ */ jsx(Icon, { name: "trash", className: "w-3.5 h-3.5" }),
36362
- " Delete"
36682
+ " ",
36683
+ t("common.delete")
36363
36684
  ]
36364
36685
  }
36365
36686
  ),
36366
36687
  CHANGEABLE_TYPES.includes(block.type) && /* @__PURE__ */ jsxs(Fragment, { children: [
36367
36688
  /* @__PURE__ */ jsx(Box, { className: "my-1 border-t border-border" }),
36368
- /* @__PURE__ */ jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: "Turn into" }),
36369
- CHANGEABLE_TYPES.filter((t) => t !== block.type).map((t) => /* @__PURE__ */ jsx(
36689
+ /* @__PURE__ */ jsx(Box, { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: t("richBlockEditor.turnInto") }),
36690
+ CHANGEABLE_TYPES.filter((bt) => bt !== block.type).map((bt) => /* @__PURE__ */ jsx(
36370
36691
  Button,
36371
36692
  {
36372
36693
  type: "button",
@@ -36374,12 +36695,12 @@ function BlockMenu({ block, readOnly, onDelete, onDuplicate, onChangeType }) {
36374
36695
  role: "menuitem",
36375
36696
  className: "flex w-full items-center gap-2 px-2 py-1.5 text-left justify-start rounded-none",
36376
36697
  onClick: () => {
36377
- onChangeType(t);
36698
+ onChangeType(bt);
36378
36699
  setOpen(false);
36379
36700
  },
36380
- children: BLOCK_TYPE_LABEL[t]
36701
+ children: t(BLOCK_TYPE_LABEL_KEY[bt])
36381
36702
  },
36382
- t
36703
+ bt
36383
36704
  ))
36384
36705
  ] })
36385
36706
  ]
@@ -36441,6 +36762,7 @@ function BlockRow({
36441
36762
  onInsertAfter,
36442
36763
  onChangeType
36443
36764
  }) {
36765
+ const { t } = useTranslate();
36444
36766
  const setContent = useCallback(
36445
36767
  (next) => onUpdate((b) => ({ ...b, content: next })),
36446
36768
  [onUpdate]
@@ -36490,8 +36812,8 @@ function BlockRow({
36490
36812
  tag: "h1",
36491
36813
  value: block.content ?? "",
36492
36814
  readOnly,
36493
- placeholder: placeholder ?? "Heading 1",
36494
- ariaLabel: "Heading 1 block",
36815
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading1"),
36816
+ ariaLabel: t("richBlockEditor.aria.heading1Block"),
36495
36817
  className: "text-3xl font-bold leading-tight",
36496
36818
  onValueChange: setContent
36497
36819
  }
@@ -36503,8 +36825,8 @@ function BlockRow({
36503
36825
  tag: "h2",
36504
36826
  value: block.content ?? "",
36505
36827
  readOnly,
36506
- placeholder: placeholder ?? "Heading 2",
36507
- ariaLabel: "Heading 2 block",
36828
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading2"),
36829
+ ariaLabel: t("richBlockEditor.aria.heading2Block"),
36508
36830
  className: "text-2xl font-semibold leading-tight",
36509
36831
  onValueChange: setContent
36510
36832
  }
@@ -36516,8 +36838,8 @@ function BlockRow({
36516
36838
  tag: "h3",
36517
36839
  value: block.content ?? "",
36518
36840
  readOnly,
36519
- placeholder: placeholder ?? "Heading 3",
36520
- ariaLabel: "Heading 3 block",
36841
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.heading3"),
36842
+ ariaLabel: t("richBlockEditor.aria.heading3Block"),
36521
36843
  className: "text-xl font-semibold leading-tight",
36522
36844
  onValueChange: setContent
36523
36845
  }
@@ -36529,8 +36851,8 @@ function BlockRow({
36529
36851
  tag: "blockquote",
36530
36852
  value: block.content ?? "",
36531
36853
  readOnly,
36532
- placeholder: placeholder ?? "Quote",
36533
- ariaLabel: "Quote block",
36854
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.quote"),
36855
+ ariaLabel: t("richBlockEditor.aria.quoteBlock"),
36534
36856
  className: "border-l-4 border-primary/60 pl-4 italic text-muted-foreground",
36535
36857
  onValueChange: setContent
36536
36858
  }
@@ -36538,13 +36860,13 @@ function BlockRow({
36538
36860
  case "code":
36539
36861
  return /* @__PURE__ */ jsxs(Box, { className: "rounded-md border border-border bg-muted/40", children: [
36540
36862
  /* @__PURE__ */ jsxs(Box, { className: "flex items-center justify-between border-b border-border px-3 py-1 text-xs text-muted-foreground", children: [
36541
- /* @__PURE__ */ jsx(Typography, { as: "span", variant: "caption", className: "uppercase tracking-wide", children: "Code" }),
36863
+ /* @__PURE__ */ jsx(Typography, { as: "span", variant: "caption", className: "uppercase tracking-wide", children: t("richBlockEditor.blockType.code") }),
36542
36864
  !readOnly && /* @__PURE__ */ jsx(
36543
36865
  Input,
36544
36866
  {
36545
36867
  inputType: "text",
36546
36868
  value: String(block.metadata?.language ?? "plaintext"),
36547
- "aria-label": "Code language",
36869
+ "aria-label": t("richBlockEditor.aria.codeLanguage"),
36548
36870
  className: cn(
36549
36871
  "h-6 w-32 rounded-sm border border-border bg-background",
36550
36872
  "px-2 text-xs outline-none focus:ring-1 focus:ring-ring"
@@ -36560,8 +36882,8 @@ function BlockRow({
36560
36882
  tag: "pre",
36561
36883
  value: block.content ?? "",
36562
36884
  readOnly,
36563
- placeholder: placeholder ?? "Enter code",
36564
- ariaLabel: "Code block",
36885
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.code"),
36886
+ ariaLabel: t("richBlockEditor.aria.codeBlock"),
36565
36887
  className: "block whitespace-pre-wrap p-3 font-mono text-sm leading-relaxed",
36566
36888
  onValueChange: setContent
36567
36889
  }
@@ -36574,7 +36896,7 @@ function BlockRow({
36574
36896
  const caption = String(block.metadata?.caption ?? "");
36575
36897
  const imgProps = {
36576
36898
  src: url,
36577
- alt: caption || "Embedded image",
36899
+ alt: caption || t("richBlockEditor.embeddedImage"),
36578
36900
  className: "max-h-96 w-full rounded-md border border-border object-contain"
36579
36901
  };
36580
36902
  return /* @__PURE__ */ jsxs(Box, { className: "space-y-2", children: [
@@ -36588,7 +36910,8 @@ function BlockRow({
36588
36910
  ),
36589
36911
  children: [
36590
36912
  /* @__PURE__ */ jsx(Icon, { name: "image", className: "mr-2 w-4 h-4" }),
36591
- " No image URL set"
36913
+ " ",
36914
+ t("richBlockEditor.noImageUrl")
36592
36915
  ]
36593
36916
  }
36594
36917
  ),
@@ -36599,7 +36922,7 @@ function BlockRow({
36599
36922
  inputType: "url",
36600
36923
  value: url,
36601
36924
  placeholder: "https://example.com/image.png",
36602
- "aria-label": "Image URL",
36925
+ "aria-label": t("richBlockEditor.aria.imageUrl"),
36603
36926
  className: cn(
36604
36927
  "h-8 flex-1 rounded-sm border border-border bg-background",
36605
36928
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -36612,8 +36935,8 @@ function BlockRow({
36612
36935
  {
36613
36936
  inputType: "text",
36614
36937
  value: caption,
36615
- placeholder: "Caption (optional)",
36616
- "aria-label": "Image caption",
36938
+ placeholder: t("richBlockEditor.placeholder.caption"),
36939
+ "aria-label": t("richBlockEditor.aria.imageCaption"),
36617
36940
  className: cn(
36618
36941
  "h-8 flex-1 rounded-sm border border-border bg-background",
36619
36942
  "px-2 text-sm outline-none focus:ring-1 focus:ring-ring"
@@ -36644,8 +36967,8 @@ function BlockRow({
36644
36967
  tag: "span",
36645
36968
  value: child.content ?? "",
36646
36969
  readOnly,
36647
- placeholder: "List item",
36648
- ariaLabel: "List item",
36970
+ placeholder: t("richBlockEditor.placeholder.listItem"),
36971
+ ariaLabel: t("richBlockEditor.aria.listItem"),
36649
36972
  className: "inline-block min-w-[1ch] flex-1",
36650
36973
  onValueChange: (next) => setChildContent(child.id, next)
36651
36974
  }
@@ -36655,7 +36978,7 @@ function BlockRow({
36655
36978
  {
36656
36979
  type: "button",
36657
36980
  variant: "ghost",
36658
- "aria-label": "Remove list item",
36981
+ "aria-label": t("richBlockEditor.aria.removeListItem"),
36659
36982
  className: cn(
36660
36983
  "h-5 w-5 shrink-0 rounded-sm text-muted-foreground p-0 gap-0",
36661
36984
  "opacity-0 group-hover/item:opacity-100 hover:bg-muted hover:text-foreground"
@@ -36677,7 +37000,8 @@ function BlockRow({
36677
37000
  onClick: addListItem,
36678
37001
  children: [
36679
37002
  /* @__PURE__ */ jsx(Icon, { name: "plus", className: "w-3 h-3" }),
36680
- " Add item"
37003
+ " ",
37004
+ t("richBlockEditor.addItem")
36681
37005
  ]
36682
37006
  }
36683
37007
  ) })
@@ -36693,8 +37017,8 @@ function BlockRow({
36693
37017
  tag: "p",
36694
37018
  value: block.content ?? "",
36695
37019
  readOnly,
36696
- placeholder: placeholder ?? "Start writing...",
36697
- ariaLabel: "Paragraph block",
37020
+ placeholder: placeholder ?? t("richBlockEditor.placeholder.paragraph"),
37021
+ ariaLabel: t("richBlockEditor.aria.paragraphBlock"),
36698
37022
  className: "leading-7",
36699
37023
  onValueChange: setContent
36700
37024
  }
@@ -36717,7 +37041,7 @@ function BlockRow({
36717
37041
  {
36718
37042
  type: "button",
36719
37043
  variant: "ghost",
36720
- "aria-label": "Insert paragraph below",
37044
+ "aria-label": t("richBlockEditor.insertParagraphBelow"),
36721
37045
  className: cn(
36722
37046
  "inline-flex h-6 w-6 items-center justify-center rounded-sm p-0 gap-0",
36723
37047
  "text-muted-foreground hover:bg-muted hover:text-foreground",
@@ -36744,7 +37068,7 @@ function BlockRow({
36744
37068
  }
36745
37069
  );
36746
37070
  }
36747
- var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES, RichBlockEditor;
37071
+ var TOOLBAR_ENTRIES, BLOCK_TYPE_LABEL_KEY, CHANGEABLE_TYPES, _idSeq, BLOCK_TYPES, RichBlockEditor;
36748
37072
  var init_RichBlockEditor = __esm({
36749
37073
  "components/core/molecules/RichBlockEditor.tsx"() {
36750
37074
  "use client";
@@ -36757,29 +37081,30 @@ var init_RichBlockEditor = __esm({
36757
37081
  init_Input();
36758
37082
  init_Icon();
36759
37083
  init_useEventBus();
37084
+ init_useTranslate();
36760
37085
  TOOLBAR_ENTRIES = [
36761
- { type: "paragraph", label: "Text", icon: Type },
36762
- { type: "heading-1", label: "H1", icon: Heading1 },
36763
- { type: "heading-2", label: "H2", icon: Heading2 },
36764
- { type: "heading-3", label: "H3", icon: Heading3 },
36765
- { type: "bullet-list", label: "Bullet list", icon: List },
36766
- { type: "numbered-list", label: "Numbered", icon: ListOrdered },
36767
- { type: "quote", label: "Quote", icon: Quote },
36768
- { type: "code", label: "Code", icon: Code },
36769
- { type: "divider", label: "Divider", icon: Minus },
36770
- { type: "image", label: "Image", icon: Image$1 }
37086
+ { type: "paragraph", labelKey: "richBlockEditor.toolbar.text", icon: Type },
37087
+ { type: "heading-1", labelKey: "richBlockEditor.toolbar.h1", icon: Heading1 },
37088
+ { type: "heading-2", labelKey: "richBlockEditor.toolbar.h2", icon: Heading2 },
37089
+ { type: "heading-3", labelKey: "richBlockEditor.toolbar.h3", icon: Heading3 },
37090
+ { type: "bullet-list", labelKey: "richBlockEditor.toolbar.bulletList", icon: List },
37091
+ { type: "numbered-list", labelKey: "richBlockEditor.toolbar.numbered", icon: ListOrdered },
37092
+ { type: "quote", labelKey: "richBlockEditor.toolbar.quote", icon: Quote },
37093
+ { type: "code", labelKey: "richBlockEditor.toolbar.code", icon: Code },
37094
+ { type: "divider", labelKey: "richBlockEditor.toolbar.divider", icon: Minus },
37095
+ { type: "image", labelKey: "richBlockEditor.toolbar.image", icon: Image$1 }
36771
37096
  ];
36772
- BLOCK_TYPE_LABEL = {
36773
- paragraph: "Text",
36774
- "heading-1": "Heading 1",
36775
- "heading-2": "Heading 2",
36776
- "heading-3": "Heading 3",
36777
- "bullet-list": "Bullet list",
36778
- "numbered-list": "Numbered list",
36779
- quote: "Quote",
36780
- code: "Code",
36781
- divider: "Divider",
36782
- image: "Image"
37097
+ BLOCK_TYPE_LABEL_KEY = {
37098
+ paragraph: "richBlockEditor.blockType.paragraph",
37099
+ "heading-1": "richBlockEditor.blockType.heading1",
37100
+ "heading-2": "richBlockEditor.blockType.heading2",
37101
+ "heading-3": "richBlockEditor.blockType.heading3",
37102
+ "bullet-list": "richBlockEditor.blockType.bulletList",
37103
+ "numbered-list": "richBlockEditor.blockType.numberedList",
37104
+ quote: "richBlockEditor.blockType.quote",
37105
+ code: "richBlockEditor.blockType.code",
37106
+ divider: "richBlockEditor.blockType.divider",
37107
+ image: "richBlockEditor.blockType.image"
36783
37108
  };
36784
37109
  CHANGEABLE_TYPES = [
36785
37110
  "paragraph",
@@ -36813,6 +37138,7 @@ var init_RichBlockEditor = __esm({
36813
37138
  showToolbar = true,
36814
37139
  className
36815
37140
  }) => {
37141
+ const { t } = useTranslate();
36816
37142
  const [blocks, setBlocks] = useState(
36817
37143
  () => normalizeBlocks(initialBlocks)
36818
37144
  );
@@ -36884,25 +37210,26 @@ var init_RichBlockEditor = __esm({
36884
37210
  Box,
36885
37211
  {
36886
37212
  role: "toolbar",
36887
- "aria-label": "Block editor toolbar",
37213
+ "aria-label": t("richBlockEditor.editorToolbar"),
36888
37214
  className: cn(
36889
37215
  "flex flex-wrap items-center gap-1",
36890
37216
  "border-b border-border bg-muted/30 px-2 py-2"
36891
37217
  ),
36892
37218
  children: TOOLBAR_ENTRIES.map((entry) => {
36893
37219
  const Icon3 = entry.icon;
37220
+ const entryLabel = t(entry.labelKey);
36894
37221
  return /* @__PURE__ */ jsxs(
36895
37222
  Button,
36896
37223
  {
36897
37224
  type: "button",
36898
37225
  variant: "ghost",
36899
37226
  size: "sm",
36900
- "aria-label": `Insert ${entry.label}`,
36901
- title: entry.label,
37227
+ "aria-label": t("richBlockEditor.insertEntry", { label: entryLabel }),
37228
+ title: entryLabel,
36902
37229
  onClick: () => handleAppend(entry.type),
36903
37230
  children: [
36904
37231
  /* @__PURE__ */ jsx(Icon3, { size: 14 }),
36905
- /* @__PURE__ */ jsx(Typography, { as: "span", variant: "caption", className: "ml-1 hidden text-xs sm:inline", children: entry.label })
37232
+ /* @__PURE__ */ jsx(Typography, { as: "span", variant: "caption", className: "ml-1 hidden text-xs sm:inline", children: entryLabel })
36906
37233
  ]
36907
37234
  },
36908
37235
  entry.type
@@ -36945,6 +37272,7 @@ var init_ReplyTree = __esm({
36945
37272
  "use client";
36946
37273
  init_cn();
36947
37274
  init_useEventBus();
37275
+ init_useTranslate();
36948
37276
  init_atoms2();
36949
37277
  init_VoteStack();
36950
37278
  ReplyTreeNode = ({
@@ -36964,6 +37292,7 @@ var init_ReplyTree = __esm({
36964
37292
  showActions
36965
37293
  }) => {
36966
37294
  const eventBus = useEventBus();
37295
+ const { t } = useTranslate();
36967
37296
  const hasReplies = !!node.replies && node.replies.length > 0;
36968
37297
  const isCollapsed = collapsedSet.has(node.id);
36969
37298
  const atMaxDepth = depth >= maxDepth;
@@ -37010,7 +37339,7 @@ var init_ReplyTree = __esm({
37010
37339
  variant: "ghost",
37011
37340
  size: "sm",
37012
37341
  onClick: handleToggle,
37013
- "aria-label": isCollapsed ? "Expand replies" : "Collapse replies",
37342
+ "aria-label": isCollapsed ? t("replyTree.expandReplies") : t("replyTree.collapseReplies"),
37014
37343
  "aria-expanded": !isCollapsed,
37015
37344
  leftIcon: isCollapsed ? "chevron-right" : "chevron-down",
37016
37345
  className: cn(
@@ -37051,7 +37380,7 @@ var init_ReplyTree = __esm({
37051
37380
  onVote: handleVote,
37052
37381
  size: "sm",
37053
37382
  variant: "horizontal",
37054
- label: `Vote on reply by ${node.authorName}`
37383
+ label: t("replyTree.voteOnReplyBy", { author: node.authorName })
37055
37384
  }
37056
37385
  ),
37057
37386
  /* @__PURE__ */ jsx(
@@ -37061,8 +37390,8 @@ var init_ReplyTree = __esm({
37061
37390
  size: "sm",
37062
37391
  leftIcon: "message-square",
37063
37392
  onClick: handleReply,
37064
- "aria-label": `Reply to ${node.authorName}`,
37065
- children: "Reply"
37393
+ "aria-label": t("replyTree.replyTo", { author: node.authorName }),
37394
+ children: t("replyTree.reply")
37066
37395
  }
37067
37396
  ),
37068
37397
  /* @__PURE__ */ jsx(
@@ -37072,8 +37401,8 @@ var init_ReplyTree = __esm({
37072
37401
  size: "sm",
37073
37402
  leftIcon: "flag",
37074
37403
  onClick: handleFlag,
37075
- "aria-label": `Flag reply by ${node.authorName}`,
37076
- children: "Flag"
37404
+ "aria-label": t("replyTree.flagReplyBy", { author: node.authorName }),
37405
+ children: t("replyTree.flag")
37077
37406
  }
37078
37407
  )
37079
37408
  ] }),
@@ -37084,9 +37413,9 @@ var init_ReplyTree = __esm({
37084
37413
  inputType: "textarea",
37085
37414
  rows: 2,
37086
37415
  value: draft,
37087
- placeholder: `Reply to ${node.authorName}\u2026`,
37416
+ placeholder: t("replyTree.replyToPlaceholder", { author: node.authorName }),
37088
37417
  onChange: (e) => setDraft(e.target.value),
37089
- "aria-label": `Reply to ${node.authorName}`
37418
+ "aria-label": t("replyTree.replyTo", { author: node.authorName })
37090
37419
  }
37091
37420
  ),
37092
37421
  /* @__PURE__ */ jsxs(Box, { className: "flex flex-row gap-2 items-center", children: [
@@ -37098,10 +37427,10 @@ var init_ReplyTree = __esm({
37098
37427
  leftIcon: "send",
37099
37428
  onClick: handleSubmitReply,
37100
37429
  disabled: !draft.trim(),
37101
- children: "Send"
37430
+ children: t("replyTree.send")
37102
37431
  }
37103
37432
  ),
37104
- /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: "Cancel" })
37433
+ /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: handleCancelReply, children: t("common.cancel") })
37105
37434
  ] })
37106
37435
  ] }),
37107
37436
  hasReplies && !isCollapsed && (atMaxDepth ? /* @__PURE__ */ jsx(
@@ -37115,7 +37444,7 @@ var init_ReplyTree = __esm({
37115
37444
  "self-start gap-1 px-0 h-auto",
37116
37445
  "text-sm text-primary hover:underline hover:bg-transparent"
37117
37446
  ),
37118
- children: "Continue thread"
37447
+ children: t("replyTree.continueThread")
37119
37448
  }
37120
37449
  ) : /* @__PURE__ */ jsx(Box, { className: "flex flex-col gap-2 mt-1", children: node.replies.map((child) => /* @__PURE__ */ jsx(
37121
37450
  ReplyTreeNode,
@@ -37154,6 +37483,7 @@ var init_ReplyTree = __esm({
37154
37483
  showActions = true,
37155
37484
  className
37156
37485
  }) => {
37486
+ const { t } = useTranslate();
37157
37487
  const nodeList = Array.isArray(nodes) ? nodes : nodes ? [nodes] : [];
37158
37488
  const [collapsedSet, setCollapsedSet] = useState(() => {
37159
37489
  const acc = /* @__PURE__ */ new Set();
@@ -37172,7 +37502,7 @@ var init_ReplyTree = __esm({
37172
37502
  });
37173
37503
  }, []);
37174
37504
  if (nodeList.length === 0) {
37175
- return /* @__PURE__ */ jsx(Box, { className: cn("text-sm text-muted-foreground", className), children: "No replies yet." });
37505
+ return /* @__PURE__ */ jsx(Box, { className: cn("text-sm text-muted-foreground", className), children: t("replyTree.noRepliesYet") });
37176
37506
  }
37177
37507
  return /* @__PURE__ */ jsx(Box, { className: cn("flex flex-col gap-2 min-w-0", className), children: nodeList.map((node) => /* @__PURE__ */ jsx(
37178
37508
  ReplyTreeNode,
@@ -37250,6 +37580,7 @@ var init_VersionDiff = __esm({
37250
37580
  "use client";
37251
37581
  init_cn();
37252
37582
  init_useEventBus();
37583
+ init_useTranslate();
37253
37584
  init_atoms2();
37254
37585
  init_Stack();
37255
37586
  INLINE_STYLES = {
@@ -37272,6 +37603,7 @@ var init_VersionDiff = __esm({
37272
37603
  language,
37273
37604
  className
37274
37605
  }) => {
37606
+ const { t } = useTranslate();
37275
37607
  const eventBus = useEventBus();
37276
37608
  const revisions = Array.isArray(revisionsProp) ? revisionsProp : [];
37277
37609
  const fallbackBefore = revisions[0]?.id ?? "";
@@ -37353,24 +37685,24 @@ var init_VersionDiff = __esm({
37353
37685
  children: [
37354
37686
  /* @__PURE__ */ jsxs(HStack, { gap: "sm", align: "center", className: "flex-wrap", children: [
37355
37687
  /* @__PURE__ */ jsx(Icon, { name: "git-commit", size: "sm", className: "text-muted-foreground" }),
37356
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "whitespace-nowrap", children: "Compare" }),
37688
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "whitespace-nowrap", children: t("versionDiff.compare") }),
37357
37689
  /* @__PURE__ */ jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsx(
37358
37690
  Select,
37359
37691
  {
37360
37692
  options,
37361
37693
  value: activeBeforeId,
37362
37694
  onChange: handleBeforeChange,
37363
- "aria-label": "Before revision"
37695
+ "aria-label": t("versionDiff.beforeRevision")
37364
37696
  }
37365
37697
  ) }),
37366
- /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: "to" }),
37698
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: t("versionDiff.to") }),
37367
37699
  /* @__PURE__ */ jsx(Box, { className: "min-w-0 md:min-w-[160px]", children: /* @__PURE__ */ jsx(
37368
37700
  Select,
37369
37701
  {
37370
37702
  options,
37371
37703
  value: activeAfterId,
37372
37704
  onChange: handleAfterChange,
37373
- "aria-label": "After revision"
37705
+ "aria-label": t("versionDiff.afterRevision")
37374
37706
  }
37375
37707
  ) }),
37376
37708
  language && /* @__PURE__ */ jsx(Badge, { variant: "default", children: language }),
@@ -37391,7 +37723,7 @@ var init_VersionDiff = __esm({
37391
37723
  size: "sm",
37392
37724
  icon: activeView === "side-by-side" ? "align-left" : "columns",
37393
37725
  onClick: handleViewToggle,
37394
- "aria-label": activeView === "side-by-side" ? "Switch to inline view" : "Switch to side-by-side view"
37726
+ "aria-label": activeView === "side-by-side" ? t("versionDiff.switchToInline") : t("versionDiff.switchToSideBySide")
37395
37727
  }
37396
37728
  ),
37397
37729
  (onRevert || revertEvent) && /* @__PURE__ */ jsx(
@@ -37401,7 +37733,7 @@ var init_VersionDiff = __esm({
37401
37733
  size: "sm",
37402
37734
  icon: "rotate-ccw",
37403
37735
  onClick: handleRevert,
37404
- children: "Revert"
37736
+ children: t("versionDiff.revert")
37405
37737
  }
37406
37738
  )
37407
37739
  ] })
@@ -37418,12 +37750,12 @@ var init_VersionDiff = __esm({
37418
37750
  children: [
37419
37751
  /* @__PURE__ */ jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
37420
37752
  beforeRev?.label,
37421
- beforeRev?.author ? ` by ${beforeRev.author}` : "",
37753
+ beforeRev?.author ? t("versionDiff.byAuthor", { author: beforeRev.author }) : "",
37422
37754
  beforeRev?.timestamp ? ` (${beforeRev.timestamp})` : ""
37423
37755
  ] }),
37424
37756
  /* @__PURE__ */ jsxs(Typography, { variant: "caption", color: "secondary", className: "truncate", children: [
37425
37757
  afterRev?.label,
37426
- afterRev?.author ? ` by ${afterRev.author}` : "",
37758
+ afterRev?.author ? t("versionDiff.byAuthor", { author: afterRev.author }) : "",
37427
37759
  afterRev?.timestamp ? ` (${afterRev.timestamp})` : ""
37428
37760
  ] })
37429
37761
  ]
@@ -37816,10 +38148,12 @@ var init_DocPagination = __esm({
37816
38148
  }
37817
38149
  });
37818
38150
  function DocSearch({
37819
- placeholder = "Search documentation...",
38151
+ placeholder,
37820
38152
  onSearch,
37821
38153
  className
37822
38154
  }) {
38155
+ const { t } = useTranslate();
38156
+ const resolvedPlaceholder = placeholder ?? t("docSearch.placeholder");
37823
38157
  const [query, setQuery] = useState("");
37824
38158
  const [results, setResults] = useState([]);
37825
38159
  const [isOpen, setIsOpen] = useState(false);
@@ -37926,7 +38260,7 @@ function DocSearch({
37926
38260
  Input,
37927
38261
  {
37928
38262
  inputType: "search",
37929
- placeholder,
38263
+ placeholder: resolvedPlaceholder,
37930
38264
  value: query,
37931
38265
  onChange: handleChange,
37932
38266
  onFocus: handleFocus,
@@ -37991,6 +38325,7 @@ var init_DocSearch = __esm({
37991
38325
  init_Typography();
37992
38326
  init_Icon();
37993
38327
  init_Input();
38328
+ init_useTranslate();
37994
38329
  }
37995
38330
  });
37996
38331
  var DocSidebarCategory, DocSidebar;
@@ -39586,8 +39921,8 @@ var init_SignaturePad = __esm({
39586
39921
  init_useEventBus();
39587
39922
  init_useTranslate();
39588
39923
  SignaturePad = ({
39589
- label = "Signature",
39590
- helperText = "Draw your signature above",
39924
+ label,
39925
+ helperText,
39591
39926
  strokeColor,
39592
39927
  strokeWidth = 2,
39593
39928
  height = 200,
@@ -39603,6 +39938,8 @@ var init_SignaturePad = __esm({
39603
39938
  }) => {
39604
39939
  const eventBus = useEventBus();
39605
39940
  const { t } = useTranslate();
39941
+ const resolvedLabel = label ?? t("signaturePad.label");
39942
+ const resolvedHelperText = helperText ?? t("signaturePad.helperText");
39606
39943
  const canvasRef = useRef(null);
39607
39944
  const [isDrawing, setIsDrawing] = useState(false);
39608
39945
  const [hasSignature, setHasSignature] = useState(!!value);
@@ -39705,7 +40042,7 @@ var init_SignaturePad = __esm({
39705
40042
  );
39706
40043
  }
39707
40044
  return /* @__PURE__ */ jsx(Card, { className: cn("p-4", className), children: /* @__PURE__ */ jsxs(VStack, { gap: "sm", children: [
39708
- label && /* @__PURE__ */ jsx(Typography, { variant: "label", weight: "medium", children: label }),
40045
+ resolvedLabel && /* @__PURE__ */ jsx(Typography, { variant: "label", weight: "medium", children: resolvedLabel }),
39709
40046
  /* @__PURE__ */ jsx(
39710
40047
  Box,
39711
40048
  {
@@ -39734,7 +40071,7 @@ var init_SignaturePad = __esm({
39734
40071
  )
39735
40072
  }
39736
40073
  ),
39737
- helperText && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: helperText }),
40074
+ resolvedHelperText && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: resolvedHelperText }),
39738
40075
  !readOnly && /* @__PURE__ */ jsxs(HStack, { gap: "sm", justify: "end", children: [
39739
40076
  /* @__PURE__ */ jsx(
39740
40077
  Button,
@@ -39744,7 +40081,7 @@ var init_SignaturePad = __esm({
39744
40081
  icon: Eraser,
39745
40082
  onClick: clearSignature,
39746
40083
  disabled: !hasSignature,
39747
- children: "Clear"
40084
+ children: t("signaturePad.clear")
39748
40085
  }
39749
40086
  ),
39750
40087
  signEvent && /* @__PURE__ */ jsx(
@@ -39755,7 +40092,7 @@ var init_SignaturePad = __esm({
39755
40092
  icon: Check,
39756
40093
  onClick: confirmSignature,
39757
40094
  disabled: !hasSignature,
39758
- children: "Confirm"
40095
+ children: t("signaturePad.confirm")
39759
40096
  }
39760
40097
  )
39761
40098
  ] })
@@ -44200,6 +44537,7 @@ function MasterDetail({
44200
44537
  className,
44201
44538
  ...rest
44202
44539
  }) {
44540
+ const { t } = useTranslate();
44203
44541
  const loading = externalLoading ?? false;
44204
44542
  const isLoading = externalIsLoading ?? false;
44205
44543
  const error = externalError ?? null;
@@ -44212,8 +44550,8 @@ function MasterDetail({
44212
44550
  isLoading: loading || isLoading,
44213
44551
  error,
44214
44552
  className,
44215
- emptyTitle: "No items found",
44216
- emptyDescription: "Create your first item to get started.",
44553
+ emptyTitle: t("table.empty.title"),
44554
+ emptyDescription: t("empty.createFirst"),
44217
44555
  ...rest
44218
44556
  }
44219
44557
  );
@@ -44222,6 +44560,7 @@ var init_MasterDetail = __esm({
44222
44560
  "components/core/organisms/MasterDetail.tsx"() {
44223
44561
  "use client";
44224
44562
  init_DataTable();
44563
+ init_useTranslate();
44225
44564
  MasterDetail.displayName = "MasterDetail";
44226
44565
  }
44227
44566
  });
@@ -44230,14 +44569,18 @@ var init_MasterDetailLayout = __esm({
44230
44569
  "components/core/organisms/layout/MasterDetailLayout.tsx"() {
44231
44570
  init_cn();
44232
44571
  init_Typography();
44233
- DefaultEmptyDetail = () => /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsx(
44234
- Typography,
44235
- {
44236
- variant: "body2",
44237
- className: "text-muted-foreground",
44238
- children: "Select an item to view details"
44239
- }
44240
- ) });
44572
+ init_useTranslate();
44573
+ DefaultEmptyDetail = () => {
44574
+ const { t } = useTranslate();
44575
+ return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full border-2 border-dashed border-border", children: /* @__PURE__ */ jsx(
44576
+ Typography,
44577
+ {
44578
+ variant: "body2",
44579
+ className: "text-muted-foreground",
44580
+ children: t("masterDetail.selectItem")
44581
+ }
44582
+ ) });
44583
+ };
44241
44584
  MasterDetailLayout = ({
44242
44585
  master,
44243
44586
  detail,
@@ -44364,7 +44707,7 @@ var init_MediaGallery = __esm({
44364
44707
  {
44365
44708
  icon: Image$1,
44366
44709
  title: t("display.noMedia"),
44367
- description: "No media items to display.",
44710
+ description: t("mediaGallery.noMediaDescription"),
44368
44711
  className
44369
44712
  }
44370
44713
  );
@@ -44381,7 +44724,7 @@ var init_MediaGallery = __esm({
44381
44724
  size: "sm",
44382
44725
  icon: Upload,
44383
44726
  action: "MEDIA_UPLOAD",
44384
- children: "Upload"
44727
+ children: t("mediaGallery.upload")
44385
44728
  }
44386
44729
  ),
44387
44730
  actions?.map((action, idx) => /* @__PURE__ */ jsx(
@@ -44395,10 +44738,7 @@ var init_MediaGallery = __esm({
44395
44738
  ))
44396
44739
  ] })
44397
44740
  ] }),
44398
- selectable && selectedItems.length > 0 && /* @__PURE__ */ jsx(HStack, { gap: "sm", align: "center", children: /* @__PURE__ */ jsxs(Badge, { variant: "info", children: [
44399
- selectedItems.length,
44400
- " selected"
44401
- ] }) }),
44741
+ selectable && selectedItems.length > 0 && /* @__PURE__ */ jsx(HStack, { gap: "sm", align: "center", children: /* @__PURE__ */ jsx(Badge, { variant: "info", children: t("table.bulk.selected", { count: selectedItems.length }) }) }),
44402
44742
  /* @__PURE__ */ jsx(
44403
44743
  Box,
44404
44744
  {
@@ -45272,7 +45612,7 @@ function TraitsTab({ traits: traits2 }) {
45272
45612
  EmptyState,
45273
45613
  {
45274
45614
  title: t("debug.noActiveTraits"),
45275
- description: "Traits will appear when components using them are mounted",
45615
+ description: t("debug.traitsMountHint"),
45276
45616
  className: "py-8"
45277
45617
  }
45278
45618
  );
@@ -45282,14 +45622,11 @@ function TraitsTab({ traits: traits2 }) {
45282
45622
  header: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 w-full", children: [
45283
45623
  /* @__PURE__ */ jsx(Typography, { variant: "body", weight: "semibold", className: "text-purple-600 dark:text-purple-400", children: trait.name }),
45284
45624
  /* @__PURE__ */ jsx(Badge, { variant: "success", size: "sm", children: trait.currentState }),
45285
- /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: [
45286
- trait.transitionCount,
45287
- " transitions"
45288
- ] })
45625
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-500 ml-auto", children: t("debug.transitionsCount", { count: trait.transitionCount }) })
45289
45626
  ] }),
45290
45627
  content: /* @__PURE__ */ jsxs(Stack, { gap: "sm", children: [
45291
45628
  /* @__PURE__ */ jsxs("div", { children: [
45292
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "States" }),
45629
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.states") }),
45293
45630
  /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: trait.states.map((state) => /* @__PURE__ */ jsx(
45294
45631
  Badge,
45295
45632
  {
@@ -45301,7 +45638,7 @@ function TraitsTab({ traits: traits2 }) {
45301
45638
  )) })
45302
45639
  ] }),
45303
45640
  trait.transitions.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
45304
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Transitions" }),
45641
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.transitions") }),
45305
45642
  /* @__PURE__ */ jsx(Stack, { gap: "xs", children: trait.transitions.map((t2, i) => /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "font-mono", children: [
45306
45643
  t2.from,
45307
45644
  " \u2192 ",
@@ -45320,7 +45657,7 @@ function TraitsTab({ traits: traits2 }) {
45320
45657
  ] }, i)) })
45321
45658
  ] }),
45322
45659
  trait.guards.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
45323
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Guards" }),
45660
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.guards") }),
45324
45661
  /* @__PURE__ */ jsx(Stack, { gap: "xs", children: trait.guards.map((g, i) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
45325
45662
  /* @__PURE__ */ jsx(Typography, { variant: "small", children: g.name }),
45326
45663
  /* @__PURE__ */ jsx(Badge, { variant: g.lastResult === true ? "success" : g.lastResult === false ? "danger" : "default", size: "sm", children: g.lastResult === void 0 ? "?" : g.lastResult ? "\u2713" : "\u2717" })
@@ -45426,7 +45763,7 @@ function EntitiesTab({ snapshot }) {
45426
45763
  EmptyState,
45427
45764
  {
45428
45765
  title: t("debug.noEntityData"),
45429
- description: "Debug mode may not be enabled",
45766
+ description: t("debug.debugModeHint"),
45430
45767
  className: "py-8"
45431
45768
  }
45432
45769
  );
@@ -45439,7 +45776,7 @@ function EntitiesTab({ snapshot }) {
45439
45776
  EmptyState,
45440
45777
  {
45441
45778
  title: t("debug.noEntities"),
45442
- description: "Entities will appear when spawned",
45779
+ description: t("debug.entitiesSpawnHint"),
45443
45780
  className: "py-8"
45444
45781
  }
45445
45782
  );
@@ -45447,7 +45784,7 @@ function EntitiesTab({ snapshot }) {
45447
45784
  const singletonItems = singletonEntries.map(([name, data]) => ({
45448
45785
  id: `singleton-${name}`,
45449
45786
  header: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
45450
- /* @__PURE__ */ jsx(Badge, { variant: "primary", size: "sm", children: "Singleton" }),
45787
+ /* @__PURE__ */ jsx(Badge, { variant: "primary", size: "sm", children: t("debug.singleton") }),
45451
45788
  /* @__PURE__ */ jsx(Typography, { variant: "body", weight: "semibold", className: "text-sky-600 dark:text-sky-400", children: name })
45452
45789
  ] }),
45453
45790
  content: /* @__PURE__ */ jsx("pre", { className: "text-xs text-gray-600 dark:text-gray-400 bg-gray-50 dark:bg-gray-800 p-2 rounded overflow-auto max-h-40", children: JSON.stringify(data, null, 2) })
@@ -45465,31 +45802,19 @@ function EntitiesTab({ snapshot }) {
45465
45802
  }));
45466
45803
  return /* @__PURE__ */ jsxs("div", { className: "debug-tab debug-tab--entities", children: [
45467
45804
  singletonItems.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
45468
- /* @__PURE__ */ jsxs(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
45469
- "Singletons (",
45470
- singletonItems.length,
45471
- ")"
45472
- ] }),
45805
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.singletonsCount", { count: singletonItems.length }) }),
45473
45806
  /* @__PURE__ */ jsx(Accordion, { items: singletonItems, multiple: true })
45474
45807
  ] }),
45475
45808
  runtimeItems.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
45476
- /* @__PURE__ */ jsxs(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: [
45477
- "Runtime (",
45478
- runtimeEntities.length,
45479
- ")"
45480
- ] }),
45809
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.runtimeCount", { count: runtimeEntities.length }) }),
45481
45810
  /* @__PURE__ */ jsx(Accordion, { items: runtimeItems, multiple: true }),
45482
- runtimeEntities.length > 20 && /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-gray-400 text-center mt-2", children: [
45483
- "+",
45484
- runtimeEntities.length - 20,
45485
- " more entities"
45486
- ] })
45811
+ runtimeEntities.length > 20 && /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-400 text-center mt-2", children: t("debug.moreEntities", { count: runtimeEntities.length - 20 }) })
45487
45812
  ] }),
45488
45813
  persistentEntries.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
45489
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: "Persistent" }),
45814
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-2", children: t("debug.persistent") }),
45490
45815
  /* @__PURE__ */ jsx(Stack, { gap: "xs", children: persistentEntries.map(([type, info]) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between py-1", children: [
45491
45816
  /* @__PURE__ */ jsx(Typography, { variant: "small", children: type }),
45492
- /* @__PURE__ */ jsx(Badge, { variant: info.loaded ? "success" : "default", size: "sm", children: info.loaded ? `${info.count} loaded` : "not loaded" })
45817
+ /* @__PURE__ */ jsx(Badge, { variant: info.loaded ? "success" : "default", size: "sm", children: info.loaded ? t("debug.loadedCount", { count: info.count }) : t("debug.notLoaded") })
45493
45818
  ] }, type)) })
45494
45819
  ] })
45495
45820
  ] });
@@ -45533,7 +45858,7 @@ function EventFlowTab({ events: events2 }) {
45533
45858
  EmptyState,
45534
45859
  {
45535
45860
  title: t("debug.noEventsYet"),
45536
- description: "Events will appear as traits, ticks, and other systems execute",
45861
+ description: t("debug.eventsExecuteHint"),
45537
45862
  className: "py-8"
45538
45863
  }
45539
45864
  );
@@ -45544,17 +45869,13 @@ function EventFlowTab({ events: events2 }) {
45544
45869
  return /* @__PURE__ */ jsxs("div", { className: "debug-tab debug-tab--events", children: [
45545
45870
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mb-3 flex-wrap", children: [
45546
45871
  /* @__PURE__ */ jsxs(ButtonGroup, { children: [
45547
- /* @__PURE__ */ jsxs(
45872
+ /* @__PURE__ */ jsx(
45548
45873
  Button,
45549
45874
  {
45550
45875
  size: "sm",
45551
45876
  variant: filter === "all" ? "primary" : "secondary",
45552
45877
  onClick: () => setFilter("all"),
45553
- children: [
45554
- "All (",
45555
- events2.length,
45556
- ")"
45557
- ]
45878
+ children: t("debug.allCount", { count: events2.length })
45558
45879
  }
45559
45880
  ),
45560
45881
  eventTypes.map((type) => {
@@ -45584,7 +45905,7 @@ function EventFlowTab({ events: events2 }) {
45584
45905
  onChange: (e) => setAutoScroll(e.target.checked)
45585
45906
  }
45586
45907
  ),
45587
- "Auto-scroll"
45908
+ t("debug.autoScroll")
45588
45909
  ] })
45589
45910
  ] }),
45590
45911
  /* @__PURE__ */ jsx(
@@ -45642,7 +45963,7 @@ function GuardsPanel({ guards }) {
45642
45963
  EmptyState,
45643
45964
  {
45644
45965
  title: t("debug.noGuardEvaluations"),
45645
- description: "Guard evaluations will appear when transitions or ticks with guards execute",
45966
+ description: t("debug.guardEvaluationsHint"),
45646
45967
  className: "py-8"
45647
45968
  }
45648
45969
  );
@@ -45673,15 +45994,15 @@ function GuardsPanel({ guards }) {
45673
45994
  ] }),
45674
45995
  content: /* @__PURE__ */ jsxs(Stack, { gap: "sm", children: [
45675
45996
  /* @__PURE__ */ jsxs("div", { children: [
45676
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Expression" }),
45997
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.expression") }),
45677
45998
  /* @__PURE__ */ jsx("code", { className: "block mt-1 text-xs text-amber-600 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20 px-2 py-1 rounded", children: guard.expression })
45678
45999
  ] }),
45679
46000
  /* @__PURE__ */ jsxs("div", { children: [
45680
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Inputs" }),
46001
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.inputs") }),
45681
46002
  /* @__PURE__ */ jsx("pre", { className: "mt-1 text-xs text-gray-600 dark:text-gray-400 bg-gray-50 dark:bg-gray-800 p-2 rounded overflow-auto max-h-24", children: JSON.stringify(guard.inputs, null, 2) })
45682
46003
  ] }),
45683
46004
  /* @__PURE__ */ jsxs("div", { children: [
45684
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: "Trait" }),
46005
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500", children: t("debug.trait") }),
45685
46006
  /* @__PURE__ */ jsx(Typography, { variant: "small", children: guard.context.traitName })
45686
46007
  ] })
45687
46008
  ] })
@@ -45699,9 +46020,9 @@ function GuardsPanel({ guards }) {
45699
46020
  ] })
45700
46021
  ] }),
45701
46022
  /* @__PURE__ */ jsxs(ButtonGroup, { children: [
45702
- /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: "All" }),
45703
- /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: "Passed" }),
45704
- /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "failed" ? "primary" : "secondary", onClick: () => setFilter("failed"), children: "Failed" })
46023
+ /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "all" ? "primary" : "secondary", onClick: () => setFilter("all"), children: t("debug.filterAll") }),
46024
+ /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "passed" ? "primary" : "secondary", onClick: () => setFilter("passed"), children: t("debug.filterPassed") }),
46025
+ /* @__PURE__ */ jsx(Button, { size: "sm", variant: filter === "failed" ? "primary" : "secondary", onClick: () => setFilter("failed"), children: t("debug.filterFailed") })
45705
46026
  ] })
45706
46027
  ] }),
45707
46028
  /* @__PURE__ */ jsx("div", { className: "max-h-80 overflow-y-auto", children: /* @__PURE__ */ jsx(Accordion, { items: accordionItems }) })
@@ -45827,7 +46148,7 @@ function TransitionTimeline({ transitions }) {
45827
46148
  EmptyState,
45828
46149
  {
45829
46150
  title: t("debug.noTransitionsRecorded"),
45830
- description: "Transitions will appear as the state machine processes events",
46151
+ description: t("debug.transitionsProcessHint"),
45831
46152
  className: "py-8"
45832
46153
  }
45833
46154
  );
@@ -45844,10 +46165,7 @@ function TransitionTimeline({ transitions }) {
45844
46165
  const sorted = [...transitions].reverse();
45845
46166
  return /* @__PURE__ */ jsxs("div", { className: "debug-tab debug-tab--timeline", children: [
45846
46167
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-2", children: [
45847
- /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-gray-500", children: [
45848
- transitions.length,
45849
- " transitions recorded"
45850
- ] }),
46168
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-500", children: t("debug.transitionsRecorded", { count: transitions.length }) }),
45851
46169
  /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-1 text-xs text-gray-500 cursor-pointer", children: [
45852
46170
  /* @__PURE__ */ jsx(
45853
46171
  Checkbox,
@@ -45856,7 +46174,7 @@ function TransitionTimeline({ transitions }) {
45856
46174
  onChange: (e) => setAutoScroll(e.target.checked)
45857
46175
  }
45858
46176
  ),
45859
- "Auto-scroll"
46177
+ t("debug.autoScroll")
45860
46178
  ] })
45861
46179
  ] }),
45862
46180
  /* @__PURE__ */ jsx(
@@ -45899,15 +46217,13 @@ function TransitionTimeline({ transitions }) {
45899
46217
  variant: trace.guardResult ? "success" : "danger",
45900
46218
  size: "sm",
45901
46219
  children: [
45902
- "guard: ",
46220
+ t("debug.guardLabel"),
46221
+ " ",
45903
46222
  trace.guardResult ? "\u2713" : "\u2717"
45904
46223
  ]
45905
46224
  }
45906
46225
  ),
45907
- /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: [
45908
- trace.effects.length,
45909
- " effects"
45910
- ] })
46226
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-400 ml-auto", children: t("debug.effectsCount", { count: trace.effects.length }) })
45911
46227
  ] }),
45912
46228
  isExpanded && trace.effects.length > 0 && /* @__PURE__ */ jsx("div", { className: "ml-2 mt-1 mb-2 pl-2 border-l border-gray-200 dark:border-gray-700 space-y-1", children: trace.effects.map((effect, eIdx) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
45913
46229
  /* @__PURE__ */ jsx(EffectBadge, { effect }),
@@ -45956,13 +46272,13 @@ function ServerBridgeTab({ bridge }) {
45956
46272
  EmptyState,
45957
46273
  {
45958
46274
  title: t("debug.noBridgeData"),
45959
- description: "The ServerBridge has not been initialized. Bridge health will appear once the runtime connects to the server.",
46275
+ description: t("debug.bridgeInitHint"),
45960
46276
  className: "py-8"
45961
46277
  }
45962
46278
  );
45963
46279
  }
45964
46280
  const formatTime4 = (ts) => {
45965
- if (ts === 0) return "Never";
46281
+ if (ts === 0) return t("debug.never");
45966
46282
  const d = new Date(ts);
45967
46283
  return d.toLocaleTimeString("en-US", {
45968
46284
  hour12: false,
@@ -45975,14 +46291,14 @@ function ServerBridgeTab({ bridge }) {
45975
46291
  /* @__PURE__ */ jsxs(Card, { className: "p-3", children: [
45976
46292
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 mb-3", children: [
45977
46293
  /* @__PURE__ */ jsx("div", { className: `w-3 h-3 rounded-full ${bridge.connected ? "bg-green-500 animate-pulse" : "bg-red-500"}` }),
45978
- /* @__PURE__ */ jsx(Typography, { variant: "h6", children: bridge.connected ? "Connected" : "Disconnected" })
46294
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", children: bridge.connected ? t("debug.connected") : t("debug.disconnected") })
45979
46295
  ] }),
45980
46296
  /* @__PURE__ */ jsxs(Stack, { gap: "xs", children: [
45981
46297
  /* @__PURE__ */ jsx(
45982
46298
  StatRow,
45983
46299
  {
45984
46300
  label: t("debug.status"),
45985
- value: bridge.connected ? "Connected" : "Disconnected",
46301
+ value: bridge.connected ? t("debug.connected") : t("debug.disconnected"),
45986
46302
  variant: bridge.connected ? "success" : "danger"
45987
46303
  }
45988
46304
  ),
@@ -46010,13 +46326,10 @@ function ServerBridgeTab({ bridge }) {
46010
46326
  ] })
46011
46327
  ] }),
46012
46328
  bridge.lastError && /* @__PURE__ */ jsxs(Card, { className: "p-3 border-red-200 dark:border-red-800 bg-red-50 dark:bg-red-950", children: [
46013
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "semibold", className: "text-red-600 dark:text-red-400 mb-1", children: "Last Error" }),
46329
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "semibold", className: "text-red-600 dark:text-red-400 mb-1", children: t("debug.lastError") }),
46014
46330
  /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-red-500 font-mono break-all", children: bridge.lastError })
46015
46331
  ] }),
46016
- bridge.connected && /* @__PURE__ */ jsx("div", { className: "text-center py-2", children: /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-gray-400", children: [
46017
- bridge.eventsForwarded + bridge.eventsReceived,
46018
- " total events processed"
46019
- ] }) })
46332
+ bridge.connected && /* @__PURE__ */ jsx("div", { className: "text-center py-2", children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-400", children: t("debug.totalEventsProcessed", { count: bridge.eventsForwarded + bridge.eventsReceived }) }) })
46020
46333
  ] }) });
46021
46334
  }
46022
46335
  var init_ServerBridgeTab = __esm({
@@ -46126,7 +46439,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
46126
46439
  EmptyState,
46127
46440
  {
46128
46441
  title: t("debug.noActiveTraits"),
46129
- description: "Traits will appear when the state machine initializes",
46442
+ description: t("debug.traitsInitHint"),
46130
46443
  className: "py-8"
46131
46444
  }
46132
46445
  );
@@ -46143,7 +46456,7 @@ function EventDispatcherTab({ traits: traits2, schema }) {
46143
46456
  };
46144
46457
  return /* @__PURE__ */ jsxs("div", { className: "debug-tab debug-tab--dispatch", children: [
46145
46458
  /* @__PURE__ */ jsxs("div", { className: "mb-3", children: [
46146
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Active States" }),
46459
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.activeStates") }),
46147
46460
  /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: traits2.map((trait) => /* @__PURE__ */ jsxs(Badge, { variant: "success", size: "sm", children: [
46148
46461
  trait.name,
46149
46462
  ": ",
@@ -46151,8 +46464,8 @@ function EventDispatcherTab({ traits: traits2, schema }) {
46151
46464
  ] }, trait.id)) })
46152
46465
  ] }),
46153
46466
  /* @__PURE__ */ jsxs("div", { className: "mb-3", children: [
46154
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Available Events" }),
46155
- availableEvents.length === 0 ? /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-400 italic", children: "No transitions from current state" }) : /* @__PURE__ */ jsx(Stack, { gap: "xs", children: availableEvents.map(({ event, transitions }) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
46467
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.availableEvents") }),
46468
+ availableEvents.length === 0 ? /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-400 italic", children: t("debug.noTransitionsFromState") }) : /* @__PURE__ */ jsx(Stack, { gap: "xs", children: availableEvents.map(({ event, transitions }) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
46156
46469
  /* @__PURE__ */ jsx(
46157
46470
  Button,
46158
46471
  {
@@ -46164,15 +46477,15 @@ function EventDispatcherTab({ traits: traits2, schema }) {
46164
46477
  }
46165
46478
  ),
46166
46479
  /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-gray-500", children: transitions.map((t2) => `${t2.from} -> ${t2.to}`).join(", ") }),
46167
- transitions.some((t2) => t2.guard) && /* @__PURE__ */ jsx(Badge, { variant: "warning", size: "sm", children: "guarded" })
46480
+ transitions.some((tr) => tr.guard) && /* @__PURE__ */ jsx(Badge, { variant: "warning", size: "sm", children: t("debug.guarded") })
46168
46481
  ] }, event)) })
46169
46482
  ] }),
46170
46483
  unavailableEvents.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mb-3", children: [
46171
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Other Events (not available from current state)" }),
46484
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.otherEvents") }),
46172
46485
  /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: unavailableEvents.map((event) => /* @__PURE__ */ jsx(Badge, { variant: "default", size: "sm", className: "opacity-50", children: event }, event)) })
46173
46486
  ] }),
46174
46487
  log16.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
46175
- /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Recent Transitions" }),
46488
+ /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: t("debug.recentTransitions") }),
46176
46489
  /* @__PURE__ */ jsx(Stack, { gap: "xs", children: log16.map((entry, i) => /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "font-mono text-xs", children: [
46177
46490
  /* @__PURE__ */ jsx("span", { className: "text-purple-400", children: entry.traitName }),
46178
46491
  " ",
@@ -46203,21 +46516,20 @@ var init_RuntimeDebugger = __esm({
46203
46516
  }
46204
46517
  });
46205
46518
  function ServerResponseRow({ sr }) {
46519
+ const { t } = useTranslate();
46206
46520
  const entityEntries = Object.entries(sr.dataEntities);
46207
46521
  return /* @__PURE__ */ jsxs("div", { className: "ml-4 pl-2 border-l border-purple-500/30 py-0.5 text-xs font-mono", children: [
46208
46522
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
46209
46523
  /* @__PURE__ */ jsxs("span", { className: sr.success ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400", children: [
46210
46524
  sr.success ? "\u2713" : "\u2717",
46211
- " server"
46525
+ " ",
46526
+ t("debug.server")
46212
46527
  ] }),
46213
46528
  /* @__PURE__ */ jsx("span", { className: "text-purple-600 dark:text-purple-300", children: sr.orbitalName }),
46214
- sr.clientEffects > 0 && /* @__PURE__ */ jsxs("span", { className: "px-1 rounded bg-purple-500/15 text-purple-600 dark:text-purple-300", children: [
46215
- sr.clientEffects,
46216
- " clientEffect",
46217
- sr.clientEffects !== 1 ? "s" : ""
46218
- ] }),
46529
+ sr.clientEffects > 0 && /* @__PURE__ */ jsx("span", { className: "px-1 rounded bg-purple-500/15 text-purple-600 dark:text-purple-300", children: t("debug.clientEffectsCount", { count: sr.clientEffects }) }),
46219
46530
  sr.emittedEvents.length > 0 && /* @__PURE__ */ jsxs("span", { className: "px-1 rounded bg-blue-500/15 text-blue-300", children: [
46220
- "emit: ",
46531
+ t("debug.emitLabel"),
46532
+ " ",
46221
46533
  sr.emittedEvents.join(", ")
46222
46534
  ] }),
46223
46535
  sr.error && /* @__PURE__ */ jsx("span", { className: "px-1 rounded bg-red-500/15 text-red-600 dark:text-red-400 truncate max-w-[300px]", children: sr.error })
@@ -46225,13 +46537,12 @@ function ServerResponseRow({ sr }) {
46225
46537
  entityEntries.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1 mt-0.5", children: entityEntries.map(([name, count]) => /* @__PURE__ */ jsxs("span", { className: "px-1 rounded bg-[var(--color-card)] text-foreground", children: [
46226
46538
  name,
46227
46539
  ": ",
46228
- count,
46229
- " row",
46230
- count !== 1 ? "s" : ""
46540
+ t("debug.rowsCount", { count })
46231
46541
  ] }, name)) })
46232
46542
  ] });
46233
46543
  }
46234
46544
  function TransitionRow({ trace }) {
46545
+ const { t } = useTranslate();
46235
46546
  const isServerEntry = !!trace.serverResponse && trace.traitName.startsWith("server:");
46236
46547
  const hasFailedEffects = trace.effects.some((e) => e.status === "failed");
46237
46548
  if (isServerEntry && trace.serverResponse) {
@@ -46239,7 +46550,7 @@ function TransitionRow({ trace }) {
46239
46550
  /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2 text-xs font-mono", children: [
46240
46551
  /* @__PURE__ */ jsx("span", { className: "mt-1.5 w-1.5 h-1.5 rounded-full flex-shrink-0 bg-purple-500" }),
46241
46552
  /* @__PURE__ */ jsx(Badge, { variant: "warning", size: "sm", className: "flex-shrink-0", children: trace.event }),
46242
- /* @__PURE__ */ jsx("span", { className: "text-purple-600 dark:text-purple-400 flex-shrink-0", children: "server response" })
46553
+ /* @__PURE__ */ jsx("span", { className: "text-purple-600 dark:text-purple-400 flex-shrink-0", children: t("debug.serverResponse") })
46243
46554
  ] }),
46244
46555
  /* @__PURE__ */ jsx(ServerResponseRow, { sr: trace.serverResponse })
46245
46556
  ] });
@@ -46280,6 +46591,7 @@ function VerifyModePanel({
46280
46591
  serverCount,
46281
46592
  localCount
46282
46593
  }) {
46594
+ const { t } = useTranslate();
46283
46595
  const [expanded, setExpanded] = React97.useState(true);
46284
46596
  const scrollRef = React97.useRef(null);
46285
46597
  const prevCountRef = React97.useRef(0);
@@ -46310,30 +46622,20 @@ function VerifyModePanel({
46310
46622
  onClick: () => setExpanded((v) => !v),
46311
46623
  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",
46312
46624
  "aria-expanded": expanded,
46313
- "aria-label": expanded ? "Collapse verification timeline" : "Expand verification timeline",
46625
+ "aria-label": expanded ? t("debug.collapseVerificationTimeline") : t("debug.expandVerificationTimeline"),
46314
46626
  "data-testid": "debugger-verify-toggle",
46315
46627
  children: [
46316
46628
  /* @__PURE__ */ jsx("span", { className: "text-foreground/50 w-3", "aria-hidden": true, children: expanded ? "\u25BE" : "\u25B8" }),
46317
- /* @__PURE__ */ jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? `${failedChecks} fail` : "OK" }),
46318
- /* @__PURE__ */ jsxs("span", { className: "text-foreground/70", children: [
46319
- localCount,
46320
- " local"
46321
- ] }),
46322
- /* @__PURE__ */ jsxs("span", { className: "text-purple-600 dark:text-purple-400", children: [
46323
- serverCount,
46324
- " server"
46325
- ] }),
46629
+ /* @__PURE__ */ jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? t("debug.failCount", { count: failedChecks }) : t("debug.ok") }),
46630
+ /* @__PURE__ */ jsx("span", { className: "text-foreground/70", children: t("debug.localCount", { count: localCount }) }),
46631
+ /* @__PURE__ */ jsx("span", { className: "text-purple-600 dark:text-purple-400", children: t("debug.serverCount", { count: serverCount }) }),
46326
46632
  traitStates && /* @__PURE__ */ jsx("span", { className: "text-cyan-600 dark:text-cyan-400 truncate max-w-[400px]", children: traitStates }),
46327
- !expanded && transitions.length > 0 && /* @__PURE__ */ jsxs("span", { className: "ml-auto text-foreground/50", children: [
46328
- transitions.length,
46329
- " transition",
46330
- transitions.length !== 1 ? "s" : ""
46331
- ] })
46633
+ !expanded && transitions.length > 0 && /* @__PURE__ */ jsx("span", { className: "ml-auto text-foreground/50", children: t("debug.transitionsCount", { count: transitions.length }) })
46332
46634
  ]
46333
46635
  }
46334
46636
  ),
46335
46637
  expanded && /* @__PURE__ */ jsxs("div", { className: "flex-1 flex overflow-hidden", children: [
46336
- /* @__PURE__ */ jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsx("div", { className: "px-2 py-1", children: transitions.length === 0 ? /* @__PURE__ */ jsx("div", { className: "text-foreground/50 text-xs font-mono py-2 text-center", children: "Waiting for transitions..." }) : /* @__PURE__ */ jsx("div", { className: "space-y-0.5", children: transitions.map((trace) => /* @__PURE__ */ jsx(TransitionRow, { trace }, trace.id)) }) }) }),
46638
+ /* @__PURE__ */ jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsx("div", { className: "px-2 py-1", children: transitions.length === 0 ? /* @__PURE__ */ jsx("div", { className: "text-foreground/50 text-xs font-mono py-2 text-center", children: t("debug.waitingForTransitions") }) : /* @__PURE__ */ jsx("div", { className: "space-y-0.5", children: transitions.map((trace) => /* @__PURE__ */ jsx(TransitionRow, { trace }, trace.id)) }) }) }),
46337
46639
  /* @__PURE__ */ jsx(WalkMinimap, {})
46338
46640
  ] })
46339
46641
  ]
@@ -46349,6 +46651,7 @@ function RuntimeDebugger({
46349
46651
  defaultTab,
46350
46652
  schema
46351
46653
  }) {
46654
+ const { t } = useTranslate();
46352
46655
  const [isCollapsed, setIsCollapsed] = React97.useState(mode === "verify" ? true : defaultCollapsed);
46353
46656
  const [isVisible, setIsVisible] = React97.useState(mode === "inline" || mode === "verify" || isDebugEnabled2());
46354
46657
  const debugData = useDebugData();
@@ -46387,55 +46690,55 @@ function RuntimeDebugger({
46387
46690
  const tabItems = [
46388
46691
  {
46389
46692
  id: "dispatch",
46390
- label: "Dispatch",
46693
+ label: t("debug.tabDispatch"),
46391
46694
  badge: debugData.traits.length || void 0,
46392
46695
  content: /* @__PURE__ */ jsx(EventDispatcherTab, { traits: debugData.traits, schema })
46393
46696
  },
46394
46697
  {
46395
46698
  id: "verify",
46396
- label: failedChecks > 0 ? "Verify (!)" : "Verify",
46699
+ label: failedChecks > 0 ? t("debug.tabVerifyAlert") : t("debug.tabVerify"),
46397
46700
  badge: verification.summary.totalChecks || void 0,
46398
46701
  content: /* @__PURE__ */ jsx(VerificationTab, { checks: verification.checks, summary: verification.summary })
46399
46702
  },
46400
46703
  {
46401
46704
  id: "timeline",
46402
- label: "Timeline",
46705
+ label: t("debug.tabTimeline"),
46403
46706
  badge: verification.transitions.length || void 0,
46404
46707
  content: /* @__PURE__ */ jsx(TransitionTimeline, { transitions: verification.transitions })
46405
46708
  },
46406
46709
  {
46407
46710
  id: "bridge",
46408
- label: "Bridge",
46711
+ label: t("debug.tabBridge"),
46409
46712
  badge: verification.bridge?.connected ? void 0 : 1,
46410
46713
  content: /* @__PURE__ */ jsx(ServerBridgeTab, { bridge: verification.bridge })
46411
46714
  },
46412
46715
  {
46413
46716
  id: "traits",
46414
- label: "Traits",
46717
+ label: t("debug.tabTraits"),
46415
46718
  badge: debugData.traits.length || void 0,
46416
46719
  content: /* @__PURE__ */ jsx(TraitsTab, { traits: debugData.traits })
46417
46720
  },
46418
46721
  {
46419
46722
  id: "ticks",
46420
- label: "Ticks",
46421
- badge: debugData.ticks.filter((t) => t.active).length || void 0,
46723
+ label: t("debug.tabTicks"),
46724
+ badge: debugData.ticks.filter((tick) => tick.active).length || void 0,
46422
46725
  content: /* @__PURE__ */ jsx(TicksTab, { ticks: debugData.ticks })
46423
46726
  },
46424
46727
  {
46425
46728
  id: "entities",
46426
- label: "Entities",
46729
+ label: t("debug.tabEntities"),
46427
46730
  badge: debugData.entitySnapshot?.runtime.length || void 0,
46428
46731
  content: /* @__PURE__ */ jsx(EntitiesTab, { snapshot: debugData.entitySnapshot })
46429
46732
  },
46430
46733
  {
46431
46734
  id: "events",
46432
- label: "Events",
46735
+ label: t("debug.tabEvents"),
46433
46736
  badge: debugData.events.length > 0 ? debugData.events.length : void 0,
46434
46737
  content: /* @__PURE__ */ jsx(EventFlowTab, { events: debugData.events })
46435
46738
  },
46436
46739
  {
46437
46740
  id: "guards",
46438
- label: "Guards",
46741
+ label: t("debug.tabGuards"),
46439
46742
  badge: debugData.guards.filter((g) => !g.result).length || void 0,
46440
46743
  content: /* @__PURE__ */ jsx(GuardsPanel, { guards: debugData.guards })
46441
46744
  }
@@ -46463,15 +46766,10 @@ function RuntimeDebugger({
46463
46766
  children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
46464
46767
  /* @__PURE__ */ jsxs(Typography, { variant: "h6", style: { fontSize: "0.75rem" }, children: [
46465
46768
  isCollapsed ? "\u25B6" : "\u25BC",
46466
- " Debugger"
46769
+ " ",
46770
+ t("debug.debugger")
46467
46771
  ] }),
46468
- failedChecks > 0 ? /* @__PURE__ */ jsxs(Badge, { variant: "danger", size: "sm", children: [
46469
- failedChecks,
46470
- " failed"
46471
- ] }) : debugData.traits.length > 0 ? /* @__PURE__ */ jsxs(Badge, { variant: "success", size: "sm", children: [
46472
- debugData.traits.length,
46473
- " traits"
46474
- ] }) : /* @__PURE__ */ jsx(Badge, { variant: "info", size: "sm", children: "Idle" })
46772
+ failedChecks > 0 ? /* @__PURE__ */ jsx(Badge, { variant: "danger", size: "sm", children: t("debug.failedCount", { count: failedChecks }) }) : debugData.traits.length > 0 ? /* @__PURE__ */ jsx(Badge, { variant: "success", size: "sm", children: t("debug.traitsCount", { count: debugData.traits.length }) }) : /* @__PURE__ */ jsx(Badge, { variant: "info", size: "sm", children: t("debug.idle") })
46475
46773
  ] })
46476
46774
  }
46477
46775
  ),
@@ -46489,9 +46787,9 @@ function RuntimeDebugger({
46489
46787
  );
46490
46788
  }
46491
46789
  if (mode === "verify") {
46492
- const traitStates = debugData.traits.map((t) => `${t.name}:${t.currentState}`).join(" | ");
46493
- const serverEntries = verification.transitions.filter((t) => t.serverResponse);
46494
- const localEntries = verification.transitions.filter((t) => !t.serverResponse);
46790
+ const traitStates = debugData.traits.map((t2) => `${t2.name}:${t2.currentState}`).join(" | ");
46791
+ const serverEntries = verification.transitions.filter((t2) => t2.serverResponse);
46792
+ const localEntries = verification.transitions.filter((t2) => !t2.serverResponse);
46495
46793
  return /* @__PURE__ */ jsx(
46496
46794
  VerifyModePanel,
46497
46795
  {
@@ -46523,7 +46821,7 @@ function RuntimeDebugger({
46523
46821
  variant: "secondary",
46524
46822
  size: "sm",
46525
46823
  className: "runtime-debugger__toggle",
46526
- title: "Open Debugger (`)",
46824
+ title: t("debug.openDebugger"),
46527
46825
  children: failedChecks > 0 ? /* @__PURE__ */ jsxs("span", { className: "relative", children: [
46528
46826
  /* @__PURE__ */ jsx("span", { children: "V" }),
46529
46827
  /* @__PURE__ */ jsx("span", { className: "absolute -top-1 -right-2 w-2 h-2 bg-red-500 rounded-full" })
@@ -46533,11 +46831,8 @@ function RuntimeDebugger({
46533
46831
  /* @__PURE__ */ jsxs("div", { className: "runtime-debugger__header", children: [
46534
46832
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
46535
46833
  /* @__PURE__ */ jsx("span", { className: "text-lg", children: "V" }),
46536
- /* @__PURE__ */ jsx(Typography, { variant: "h6", children: "KFlow Verifier" }),
46537
- failedChecks > 0 ? /* @__PURE__ */ jsxs(Badge, { variant: "danger", size: "sm", children: [
46538
- failedChecks,
46539
- " failed"
46540
- ] }) : verification.summary.totalChecks > 0 ? /* @__PURE__ */ jsx(Badge, { variant: "success", size: "sm", children: "All passing" }) : /* @__PURE__ */ jsx(Badge, { variant: "info", size: "sm", children: "Runtime" })
46834
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", children: t("debug.kflowVerifier") }),
46835
+ failedChecks > 0 ? /* @__PURE__ */ jsx(Badge, { variant: "danger", size: "sm", children: t("debug.failedCount", { count: failedChecks }) }) : verification.summary.totalChecks > 0 ? /* @__PURE__ */ jsx(Badge, { variant: "success", size: "sm", children: t("debug.allPassing") }) : /* @__PURE__ */ jsx(Badge, { variant: "info", size: "sm", children: t("debug.runtime") })
46541
46836
  ] }),
46542
46837
  /* @__PURE__ */ jsx(
46543
46838
  Button,
@@ -46545,7 +46840,7 @@ function RuntimeDebugger({
46545
46840
  onClick: () => setIsCollapsed(true),
46546
46841
  variant: "ghost",
46547
46842
  size: "sm",
46548
- title: "Close (`)",
46843
+ title: t("debug.close"),
46549
46844
  children: "x"
46550
46845
  }
46551
46846
  )
@@ -46559,7 +46854,7 @@ function RuntimeDebugger({
46559
46854
  className: "runtime-debugger__tabs"
46560
46855
  }
46561
46856
  ) }),
46562
- /* @__PURE__ */ jsx("div", { className: "runtime-debugger__footer", children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-foreground/50", children: "Press ` to toggle | window.__orbitalVerification for automation" }) })
46857
+ /* @__PURE__ */ jsx("div", { className: "runtime-debugger__footer", children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-foreground/50", children: t("debug.toggleHint") }) })
46563
46858
  ] })
46564
46859
  }
46565
46860
  );
@@ -46585,6 +46880,7 @@ var init_RuntimeDebugger2 = __esm({
46585
46880
  init_TransitionTimeline();
46586
46881
  init_ServerBridgeTab();
46587
46882
  init_EventDispatcherTab();
46883
+ init_useTranslate();
46588
46884
  init_RuntimeDebugger();
46589
46885
  RuntimeDebugger.displayName = "RuntimeDebugger";
46590
46886
  }
@@ -47873,7 +48169,7 @@ var init_StatCard = __esm({
47873
48169
  }
47874
48170
  );
47875
48171
  }
47876
- const label = schemaStats?.[0]?.label || labelToUse || "Stat";
48172
+ const label = schemaStats?.[0]?.label || labelToUse || t("statCard.defaultLabel");
47877
48173
  const normalizedPropValue = Array.isArray(propValue) ? propValue[0] ?? propValue.length : propValue;
47878
48174
  const value = schemaStats?.[0]?.value ?? normalizedPropValue ?? 0;
47879
48175
  const trendDirection = manualDirection || (calculatedTrend === void 0 || calculatedTrend === 0 ? "neutral" : calculatedTrend > 0 ? "up" : "down");
@@ -47916,7 +48212,7 @@ var init_StatCard = __esm({
47916
48212
  ]
47917
48213
  }
47918
48214
  ),
47919
- /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", as: "span", children: "vs last period" })
48215
+ /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", as: "span", children: t("statCard.vsLastPeriod") })
47920
48216
  ] }),
47921
48217
  subtitle && !calculatedTrend && /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", children: subtitle })
47922
48218
  ] }),
@@ -52121,6 +52417,9 @@ var AvlEmitListen = ({
52121
52417
  ] });
52122
52418
  };
52123
52419
  AvlEmitListen.displayName = "AvlEmitListen";
52420
+
52421
+ // components/avl/molecules/AvlSlotMap.tsx
52422
+ init_useTranslate();
52124
52423
  var SLOT_PRESETS = {
52125
52424
  header: { x: 10, y: 5, width: 340, height: 35 },
52126
52425
  main: { x: 120, y: 50, width: 230, height: 195 },
@@ -52165,6 +52464,7 @@ var AvlSlotMap = ({
52165
52464
  color = "var(--color-primary)",
52166
52465
  animated = false
52167
52466
  }) => {
52467
+ const { t } = useTranslate();
52168
52468
  const ox = (600 - pageWidth) / 2;
52169
52469
  const oy = (400 - pageHeight) / 2;
52170
52470
  let unknownIdx = 0;
@@ -52215,7 +52515,7 @@ var AvlSlotMap = ({
52215
52515
  fontSize: 10,
52216
52516
  fontFamily: "inherit",
52217
52517
  fontWeight: "bold",
52218
- children: "Page Layout"
52518
+ children: t("avl.pageLayout")
52219
52519
  }
52220
52520
  ),
52221
52521
  resolvedSlots.map((slot) => {
@@ -52264,7 +52564,7 @@ var AvlSlotMap = ({
52264
52564
  opacity: 0.6,
52265
52565
  children: [
52266
52566
  slot.name,
52267
- isOverlay ? " (overlay)" : ""
52567
+ isOverlay ? ` ${t("avl.overlaySuffix")}` : ""
52268
52568
  ]
52269
52569
  }
52270
52570
  )
@@ -53196,23 +53496,25 @@ var SystemNode = ({ data }) => {
53196
53496
  SystemNode.displayName = "SystemNode";
53197
53497
 
53198
53498
  // components/avl/molecules/DetailView.tsx
53499
+ init_useTranslate();
53199
53500
  init_AvlState();
53200
53501
  init_AvlEffect();
53201
53502
  init_types();
53202
53503
  var DetailView = ({ data }) => {
53504
+ const { t } = useTranslate();
53203
53505
  const traitName = data.traits[0]?.name;
53204
53506
  const traitData = traitName ? data.traitDetails[traitName] : void 0;
53205
53507
  if (!traitData || traitData.transitions.length === 0) {
53206
- return /* @__PURE__ */ 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" });
53508
+ return /* @__PURE__ */ 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") });
53207
53509
  }
53208
53510
  const transition = traitData.transitions[0];
53209
53511
  const fromState = traitData.states.find((s) => s.name === transition.from);
53210
53512
  const toState = traitData.states.find((s) => s.name === transition.to);
53211
53513
  const transitionCounts = {};
53212
53514
  for (const s of traitData.states) transitionCounts[s.name] = 0;
53213
- for (const t of traitData.transitions) {
53214
- transitionCounts[t.from] = (transitionCounts[t.from] ?? 0) + 1;
53215
- transitionCounts[t.to] = (transitionCounts[t.to] ?? 0) + 1;
53515
+ for (const t2 of traitData.transitions) {
53516
+ transitionCounts[t2.from] = (transitionCounts[t2.from] ?? 0) + 1;
53517
+ transitionCounts[t2.to] = (transitionCounts[t2.to] ?? 0) + 1;
53216
53518
  }
53217
53519
  const maxTC = Math.max(...Object.values(transitionCounts), 0);
53218
53520
  const fromRole = getStateRole(transition.from, fromState?.isInitial, fromState?.isTerminal, transitionCounts[transition.from] ?? 0, maxTC);
@@ -53229,21 +53531,21 @@ var DetailView = ({ data }) => {
53229
53531
  ] }) }),
53230
53532
  /* @__PURE__ */ jsxs("div", { className: "px-4 py-3 space-y-3", children: [
53231
53533
  /* @__PURE__ */ jsxs("div", { children: [
53232
- /* @__PURE__ */ jsx("div", { className: "text-xs uppercase tracking-wider text-[var(--color-muted-foreground)] mb-1", children: "Trigger" }),
53534
+ /* @__PURE__ */ jsx("div", { className: "text-xs uppercase tracking-wider text-[var(--color-muted-foreground)] mb-1", children: t("avl.trigger") }),
53233
53535
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
53234
53536
  /* @__PURE__ */ jsx("svg", { width: 16, height: 16, viewBox: "0 0 16 16", children: /* @__PURE__ */ jsx(AvlEvent, { x: 8, y: 8, size: 7 }) }),
53235
53537
  /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold text-[var(--color-foreground)]", children: transition.event })
53236
53538
  ] })
53237
53539
  ] }),
53238
53540
  hasGuard && /* @__PURE__ */ jsxs("div", { children: [
53239
- /* @__PURE__ */ jsx("div", { className: "text-xs uppercase tracking-wider text-[var(--color-muted-foreground)] mb-1", children: "Guard" }),
53541
+ /* @__PURE__ */ jsx("div", { className: "text-xs uppercase tracking-wider text-[var(--color-muted-foreground)] mb-1", children: t("avl.guard") }),
53240
53542
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
53241
53543
  /* @__PURE__ */ jsx("svg", { width: 14, height: 14, viewBox: "0 0 14 14", children: /* @__PURE__ */ jsx(AvlGuard, { x: 7, y: 7, size: 6 }) }),
53242
53544
  /* @__PURE__ */ 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) })
53243
53545
  ] })
53244
53546
  ] }),
53245
53547
  transition.effects.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
53246
- /* @__PURE__ */ jsx("div", { className: "text-xs uppercase tracking-wider text-[var(--color-muted-foreground)] mb-1", children: "Effects" }),
53548
+ /* @__PURE__ */ jsx("div", { className: "text-xs uppercase tracking-wider text-[var(--color-muted-foreground)] mb-1", children: t("avl.effects") }),
53247
53549
  /* @__PURE__ */ jsx("div", { className: "space-y-1.5", children: transition.effects.map((effect, i) => /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-1.5", children: [
53248
53550
  /* @__PURE__ */ jsxs("span", { className: "text-xs text-[var(--color-muted-foreground)] w-3 text-right mt-0.5", children: [
53249
53551
  i + 1,
@@ -53279,6 +53581,7 @@ AvlOrbitalNode.displayName = "AvlOrbitalNode";
53279
53581
 
53280
53582
  // components/avl/molecules/AvlTransitionEdge.tsx
53281
53583
  init_types();
53584
+ init_useTranslate();
53282
53585
  var AvlTransitionEdge = ({
53283
53586
  id,
53284
53587
  sourceX,
@@ -53291,6 +53594,7 @@ var AvlTransitionEdge = ({
53291
53594
  markerEnd,
53292
53595
  style
53293
53596
  }) => {
53597
+ const { t } = useTranslate();
53294
53598
  const [path, labelX, labelY] = getBezierPath({
53295
53599
  sourceX,
53296
53600
  sourceY,
@@ -53322,9 +53626,9 @@ var AvlTransitionEdge = ({
53322
53626
  className: "absolute pointer-events-all nodrag nopan flex items-center gap-1",
53323
53627
  style: { transform: `translate(-50%, -50%) translate(${labelX}px, ${labelY}px)` },
53324
53628
  children: [
53325
- data?.hasGuard && /* @__PURE__ */ jsx("div", { className: "w-3 h-3 rotate-45 border border-amber-500 bg-amber-500/10 shrink-0", title: "Guard" }),
53629
+ data?.hasGuard && /* @__PURE__ */ jsx("div", { className: "w-3 h-3 rotate-45 border border-amber-500 bg-amber-500/10 shrink-0", title: t("avl.guard") }),
53326
53630
  /* @__PURE__ */ 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 ?? "" }),
53327
- data?.hasEffects && /* @__PURE__ */ jsx("div", { className: "w-2.5 h-2.5 rounded-full bg-violet-500/80 shrink-0", title: "Effects" })
53631
+ data?.hasEffects && /* @__PURE__ */ jsx("div", { className: "w-2.5 h-2.5 rounded-full bg-violet-500/80 shrink-0", title: t("avl.effects") })
53328
53632
  ]
53329
53633
  }
53330
53634
  ) })
@@ -56645,6 +56949,7 @@ function BrowserPlayground({
56645
56949
 
56646
56950
  // components/avl/molecules/OrbPreviewNode.tsx
56647
56951
  init_useEventBus();
56952
+ init_useTranslate();
56648
56953
 
56649
56954
  // components/avl/molecules/useCanvasDnd.tsx
56650
56955
  init_useEventBus();
@@ -57132,6 +57437,7 @@ var OrbPreviewNodeInner = (props) => {
57132
57437
  const screenSize = useContext(ScreenSizeContext);
57133
57438
  const preset = SCREEN_SIZE_PRESETS[screenSize];
57134
57439
  const { select } = useContext(PatternSelectionContext);
57440
+ const { t } = useTranslate();
57135
57441
  const eventBus = useEventBus();
57136
57442
  const reactFlow = useReactFlow();
57137
57443
  const contentRef = useRef(null);
@@ -57152,7 +57458,7 @@ var OrbPreviewNodeInner = (props) => {
57152
57458
  const isSuccess = status === "success";
57153
57459
  const isError = status === "error";
57154
57460
  const label = isImportedGroup ? data.behaviorAlias ?? "" : isExpanded ? `${data.transitionEvent ?? ""}` : data.orbitalName;
57155
- const sublabel = isImportedGroup ? `${data.behaviorName ?? ""}${typeof data.transitionCount === "number" && data.transitionCount > 1 ? ` \xB7 ${data.transitionCount} screens` : ""}` : isExpanded ? `${data.fromState ?? ""} \u2192 ${data.toState ?? ""}` : data.entityName ?? "";
57461
+ 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 ?? "";
57156
57462
  const orbitalSchema = useMemo(() => {
57157
57463
  const fullSchema = data._fullSchema;
57158
57464
  if (!fullSchema) return void 0;
@@ -57320,7 +57626,7 @@ var OrbPreviewNodeInner = (props) => {
57320
57626
  color: "var(--color-muted-foreground)",
57321
57627
  zIndex: 3
57322
57628
  },
57323
- children: "Preview"
57629
+ children: t("orbPreview.previewBadge")
57324
57630
  }
57325
57631
  ),
57326
57632
  hovered && !dragActive && !l1IsOver && /* @__PURE__ */ jsx(
@@ -57342,7 +57648,7 @@ var OrbPreviewNodeInner = (props) => {
57342
57648
  },
57343
57649
  children: [
57344
57650
  /* @__PURE__ */ jsx("span", { style: { fontSize: 12 }, children: "\u279E" }),
57345
- "Double-click to open"
57651
+ t("orbPreview.doubleClickToOpen")
57346
57652
  ]
57347
57653
  }
57348
57654
  )
@@ -57365,7 +57671,7 @@ var OrbPreviewNodeInner = (props) => {
57365
57671
  color: "var(--color-primary-foreground)",
57366
57672
  boxShadow: "var(--shadow-lg)"
57367
57673
  },
57368
- children: "Drop to add and open"
57674
+ children: t("orbPreview.dropToAddAndOpen")
57369
57675
  }
57370
57676
  )
57371
57677
  }
@@ -57399,7 +57705,7 @@ var OrbPreviewNodeInner = (props) => {
57399
57705
  borderTopColor: "transparent",
57400
57706
  zIndex: 2
57401
57707
  },
57402
- title: "Coordinator is dispatching to this orbital"
57708
+ title: t("orbPreview.dispatching")
57403
57709
  }
57404
57710
  )
57405
57711
  ] }),
@@ -57495,7 +57801,7 @@ var OrbPreviewNodeInner = (props) => {
57495
57801
  height: "auto"
57496
57802
  }
57497
57803
  ) })
57498
- ) : /* @__PURE__ */ jsx(Box, { className: "flex items-center justify-center", style: { minHeight: preset.minHeight }, children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground", children: "No preview available" }) })
57804
+ ) : /* @__PURE__ */ jsx(Box, { className: "flex items-center justify-center", style: { minHeight: preset.minHeight }, children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground", children: t("orbPreview.noPreview") }) })
57499
57805
  ]
57500
57806
  }
57501
57807
  ),
@@ -58086,7 +58392,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58086
58392
  const handleRemoveEffect = useCallback((effectIndex) => {
58087
58393
  eventBus.emit("UI:REMOVE_EFFECT", { effectIndex });
58088
58394
  }, [eventBus]);
58089
- const headerTitle = selectedPattern ? selectedPattern.patternType : isExpanded ? transitionEvent || "Transition" : orbitalName;
58395
+ const headerTitle = selectedPattern ? selectedPattern.patternType : isExpanded ? transitionEvent || t("avl.transition") : orbitalName;
58090
58396
  return /* @__PURE__ */ jsxs(Box, { className: "flex flex-col bg-card border-l border-border h-full w-full sm:w-[340px]", children: [
58091
58397
  /* @__PURE__ */ jsxs(Box, { className: "shrink-0 border-b border-border", children: [
58092
58398
  /* @__PURE__ */ jsxs(Box, { className: "flex items-center justify-between px-4 py-2", children: [
@@ -58103,7 +58409,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58103
58409
  {
58104
58410
  onClick: onClose,
58105
58411
  className: "text-muted-foreground hover:text-foreground text-sm cursor-pointer bg-transparent border-none p-1",
58106
- "aria-label": "Close",
58412
+ "aria-label": t("common.close"),
58107
58413
  children: "\xD7"
58108
58414
  }
58109
58415
  )
@@ -58113,7 +58419,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58113
58419
  {
58114
58420
  onClick: () => setActiveTab(tab),
58115
58421
  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"}`,
58116
- children: tab
58422
+ children: t(`orbInspector.tab.${tab}`)
58117
58423
  },
58118
58424
  tab
58119
58425
  )) })
@@ -58159,7 +58465,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58159
58465
  /* ── Inspector Tab ── */
58160
58466
  /* @__PURE__ */ jsxs(Fragment, { children: [
58161
58467
  selectedPattern && patternDef?.propsSchema && /* @__PURE__ */ jsxs(Box, { className: "px-4 py-3 border-b border-border/40", children: [
58162
- /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("Props") }),
58468
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("avl.props") }),
58163
58469
  /* @__PURE__ */ jsx(Box, { className: "flex flex-col gap-1.5", children: Object.entries(patternDef.propsSchema).slice(0, 12).map(([propName, propSchema]) => {
58164
58470
  const ps = propSchema;
58165
58471
  const explicitValue = patternConfig ? patternConfig[propName] : void 0;
@@ -58193,7 +58499,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58193
58499
  }) })
58194
58500
  ] }),
58195
58501
  userType === "architect" && (selectedPattern && isEntityPattern || !selectedPattern && !isExpanded) && entity && /* @__PURE__ */ jsxs(Box, { className: "px-4 py-3 border-b border-border/40", children: [
58196
- /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("Entity") }),
58502
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("avl.entity") }),
58197
58503
  /* @__PURE__ */ jsxs(Box, { className: "flex items-center gap-2 mb-2", children: [
58198
58504
  /* @__PURE__ */ jsx("svg", { width: 14, height: 14, children: /* @__PURE__ */ jsx("circle", { cx: 7, cy: 7, r: 5, fill: "var(--color-primary)" }) }),
58199
58505
  /* @__PURE__ */ jsx(Typography, { variant: "small", className: "font-semibold text-xs", children: entity.name }),
@@ -58236,7 +58542,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58236
58542
  ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
58237
58543
  /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-xs font-mono flex-1", children: f3.name }),
58238
58544
  /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs", children: f3.type }),
58239
- f3.required && /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-primary text-[9px]", children: t("req") })
58545
+ f3.required && /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-primary text-[9px]", children: t("orbInspector.required") })
58240
58546
  ] })
58241
58547
  ] }, f3.name)) }),
58242
58548
  editable && /* @__PURE__ */ jsxs(
@@ -58248,13 +58554,13 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58248
58554
  className: "mt-2 text-xs w-full",
58249
58555
  children: [
58250
58556
  /* @__PURE__ */ jsx(Icon, { name: "plus", size: "xs", className: "mr-1" }),
58251
- t("Add Field")
58557
+ t("orbInspector.addField")
58252
58558
  ]
58253
58559
  }
58254
58560
  )
58255
58561
  ] }),
58256
58562
  editable && !selectedPattern && !isExpanded && node.layer === "Services" && /* @__PURE__ */ jsxs(Box, { className: "px-4 py-3 border-b border-border/40", children: [
58257
- /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("Service Mode") }),
58563
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("orbInspector.serviceMode") }),
58258
58564
  /* @__PURE__ */ jsxs(HStack, { gap: "sm", className: "items-center", children: [
58259
58565
  /* @__PURE__ */ jsxs(
58260
58566
  Button,
@@ -58267,7 +58573,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58267
58573
  },
58268
58574
  children: [
58269
58575
  /* @__PURE__ */ jsx(Icon, { name: "monitor", size: "xs", className: "mr-1" }),
58270
- t("Standalone")
58576
+ t("orbInspector.standalone")
58271
58577
  ]
58272
58578
  }
58273
58579
  ),
@@ -58282,25 +58588,22 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58282
58588
  },
58283
58589
  children: [
58284
58590
  /* @__PURE__ */ jsx(Icon, { name: "cpu", size: "xs", className: "mr-1" }),
58285
- t("Embedded")
58591
+ t("orbInspector.embedded")
58286
58592
  ]
58287
58593
  }
58288
58594
  )
58289
58595
  ] }),
58290
- /* @__PURE__ */ 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") })
58596
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs mt-1", children: hasRenderUi ? t("orbInspector.rendersOwnUi") : t("orbInspector.headless") })
58291
58597
  ] }),
58292
58598
  !selectedPattern && !isExpanded && traits2.length > 0 && /* @__PURE__ */ jsxs(Box, { className: "px-4 py-3 border-b border-border/40", children: [
58293
- /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: "Traits" }),
58294
- /* @__PURE__ */ jsx(Box, { className: "flex flex-col gap-1", children: traits2.map((t2) => /* @__PURE__ */ jsxs(Box, { className: "flex items-center gap-2", children: [
58295
- /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-xs font-semibold", children: t2.name }),
58296
- /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-muted-foreground text-xs", children: [
58297
- t2.stateCount,
58298
- " states"
58299
- ] })
58300
- ] }, t2.name)) })
58599
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("avl.traits") }),
58600
+ /* @__PURE__ */ jsx(Box, { className: "flex flex-col gap-1", children: traits2.map((tr) => /* @__PURE__ */ jsxs(Box, { className: "flex items-center gap-2", children: [
58601
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-xs font-semibold", children: tr.name }),
58602
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs", children: t("orbInspector.statesCount", { count: tr.stateCount }) })
58603
+ ] }, tr.name)) })
58301
58604
  ] }),
58302
58605
  isExpanded && fromState && toState && /* @__PURE__ */ jsxs(Box, { className: "px-4 py-3 border-b border-border/40", children: [
58303
- /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: "Transition" }),
58606
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("avl.transition") }),
58304
58607
  /* @__PURE__ */ jsxs("svg", { width: "100%", height: 44, viewBox: "0 0 280 44", children: [
58305
58608
  /* @__PURE__ */ jsx(AvlState, { x: 8, y: 8, name: fromState, role: getStateRole(fromState), width: 90, height: 26 }),
58306
58609
  /* @__PURE__ */ jsx("line", { x1: 104, y1: 21, x2: 158, y2: 21, stroke: "#1E293B", strokeWidth: 2, markerEnd: "url(#orb-arrow)" }),
@@ -58309,7 +58612,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58309
58612
  ] }),
58310
58613
  traitName && /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-muted-foreground text-xs", children: [
58311
58614
  traitName,
58312
- entityName ? ` on ${entityName}` : ""
58615
+ entityName ? t("orbInspector.onEntity", { entity: entityName }) : ""
58313
58616
  ] })
58314
58617
  ] }),
58315
58618
  isExpanded && transitionEvent && /* @__PURE__ */ jsx(Box, { className: "px-4 py-2 border-b border-border/40", children: /* @__PURE__ */ jsxs(Box, { className: "flex items-center gap-2", children: [
@@ -58322,7 +58625,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58322
58625
  Input,
58323
58626
  {
58324
58627
  defaultValue: formatExpression(transition?.guard ?? guard),
58325
- placeholder: t("Guard expression"),
58628
+ placeholder: t("orbInspector.guardExpression"),
58326
58629
  className: "flex-1 text-xs font-mono h-6",
58327
58630
  onBlur: (e) => handleGuardChange(e.target.value)
58328
58631
  }
@@ -58330,7 +58633,7 @@ function OrbInspector({ node, schema, editable = false, userType = "builder", th
58330
58633
  ] }) }),
58331
58634
  userType === "architect" && (effectTypes.length > 0 || editable) && isExpanded && /* @__PURE__ */ jsxs(Box, { className: "px-4 py-3 border-b border-border/40", children: [
58332
58635
  /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: [
58333
- t("Effects"),
58636
+ t("avl.effects"),
58334
58637
  " (",
58335
58638
  effectTypes.length,
58336
58639
  ")"
@@ -58387,7 +58690,7 @@ function AddEffectButton({ onAdd }) {
58387
58690
  className: "text-xs w-full",
58388
58691
  children: [
58389
58692
  /* @__PURE__ */ jsx(Icon, { name: "plus", size: "xs", className: "mr-1" }),
58390
- t("Add Effect")
58693
+ t("orbInspector.addEffect")
58391
58694
  ]
58392
58695
  }
58393
58696
  ),
@@ -58448,7 +58751,7 @@ var PHASE_2_TOKEN_FALLBACK = {
58448
58751
  function StylesTab({ patternType, patternDef, patternConfig, editable, onPropChange, themeManifest, isDesignSystem }) {
58449
58752
  const { t } = useTranslate();
58450
58753
  if (!patternType) {
58451
- return /* @__PURE__ */ jsx(Box, { className: "p-4", children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs", children: t("Select a pattern to view its style tokens.") }) });
58754
+ return /* @__PURE__ */ jsx(Box, { className: "p-4", children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs", children: t("orbInspector.selectPatternForStyles") }) });
58452
58755
  }
58453
58756
  const tier = patternDef?.category ?? "Pattern";
58454
58757
  const tokens = PHASE_2_TOKEN_FALLBACK[patternType] ?? [];
@@ -58469,11 +58772,11 @@ function StylesTab({ patternType, patternDef, patternConfig, editable, onPropCha
58469
58772
  )
58470
58773
  ] }),
58471
58774
  /* @__PURE__ */ jsxs(Box, { children: [
58472
- /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("Tokens") }),
58473
- tokens.length === 0 ? /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs italic", children: t("No token contract declared for this pattern.") }) : /* @__PURE__ */ jsx(Box, { className: "flex flex-col gap-1", children: tokens.map((token) => /* @__PURE__ */ jsx(Box, { className: "flex items-center gap-2", children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "font-mono text-xs", children: token }) }, token)) })
58775
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("orbInspector.tokens") }),
58776
+ tokens.length === 0 ? /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs italic", children: t("orbInspector.noTokenContract") }) : /* @__PURE__ */ jsx(Box, { className: "flex flex-col gap-1", children: tokens.map((token) => /* @__PURE__ */ jsx(Box, { className: "flex items-center gap-2", children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "font-mono text-xs", children: token }) }, token)) })
58474
58777
  ] }),
58475
58778
  variantEnum && variantEnum.length > 0 && /* @__PURE__ */ jsxs(Box, { children: [
58476
- /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("Variant") }),
58779
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("orbInspector.variant") }),
58477
58780
  /* @__PURE__ */ jsx(Box, { className: "flex flex-wrap gap-1", children: variantEnum.map((variant) => {
58478
58781
  const isActive = variant === currentVariant || !currentVariant && variant === "default";
58479
58782
  return /* @__PURE__ */ jsx(
@@ -58493,7 +58796,7 @@ function StylesTab({ patternType, patternDef, patternConfig, editable, onPropCha
58493
58796
  }) })
58494
58797
  ] }),
58495
58798
  sizeEnum && sizeEnum.length > 0 && /* @__PURE__ */ jsxs(Box, { children: [
58496
- /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("Size") }),
58799
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground text-xs uppercase tracking-wider mb-2", children: t("orbInspector.size") }),
58497
58800
  /* @__PURE__ */ jsx(Box, { className: "flex flex-wrap gap-1", children: sizeEnum.map((size) => {
58498
58801
  const isActive = size === currentSize || !currentSize && size === "md";
58499
58802
  return /* @__PURE__ */ jsx(
@@ -58516,20 +58819,21 @@ function StylesTab({ patternType, patternDef, patternConfig, editable, onPropCha
58516
58819
  ] });
58517
58820
  }
58518
58821
  var TOKEN_GROUPS = [
58519
- { group: "colors", label: "Colors" },
58520
- { group: "radii", label: "Radii" },
58521
- { group: "spacing", label: "Spacing" },
58522
- { group: "shadows", label: "Shadows" }
58822
+ { group: "colors", labelKey: "orbInspector.tokenGroup.colors" },
58823
+ { group: "radii", labelKey: "orbInspector.tokenGroup.radii" },
58824
+ { group: "spacing", labelKey: "orbInspector.tokenGroup.spacing" },
58825
+ { group: "shadows", labelKey: "orbInspector.tokenGroup.shadows" }
58523
58826
  ];
58524
58827
  function TokenEditorSection({ themeManifest, onPropChange }) {
58828
+ const { t } = useTranslate();
58525
58829
  const tokens = themeManifest.tokens ?? {};
58526
58830
  return /* @__PURE__ */ jsxs(Box, { className: "flex flex-col gap-3 pt-2 border-t border-border/40", children: [
58527
- /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-xs uppercase tracking-wider text-muted-foreground", children: "Project theme tokens" }),
58528
- TOKEN_GROUPS.map(({ group, label }) => {
58831
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-xs uppercase tracking-wider text-muted-foreground", children: t("orbInspector.projectThemeTokens") }),
58832
+ TOKEN_GROUPS.map(({ group, labelKey }) => {
58529
58833
  const entries = Object.entries(tokens[group] ?? {});
58530
58834
  if (entries.length === 0) return null;
58531
58835
  return /* @__PURE__ */ jsxs(Box, { className: "flex flex-col gap-1.5", children: [
58532
- /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-xs font-mono text-muted-foreground", children: label }),
58836
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-xs font-mono text-muted-foreground", children: t(labelKey) }),
58533
58837
  entries.map(([key, value]) => /* @__PURE__ */ jsx(
58534
58838
  TokenRow,
58535
58839
  {
@@ -58577,6 +58881,7 @@ init_Typography();
58577
58881
  init_Badge();
58578
58882
 
58579
58883
  // components/avl/organisms/AvlTraitScene.tsx
58884
+ init_useTranslate();
58580
58885
  init_AvlState();
58581
58886
  init_AvlTransitionLane();
58582
58887
  init_AvlSwimLane();
@@ -58590,6 +58895,7 @@ var AvlTraitScene = ({
58590
58895
  color = "var(--color-primary)",
58591
58896
  onTransitionClick
58592
58897
  }) => {
58898
+ const { t } = useTranslate();
58593
58899
  const [layout, setLayout] = useState(null);
58594
58900
  const dataKey = useMemo(() => JSON.stringify(data), [data]);
58595
58901
  useEffect(() => {
@@ -58598,7 +58904,7 @@ var AvlTraitScene = ({
58598
58904
  });
58599
58905
  }, [dataKey]);
58600
58906
  if (!layout) {
58601
- return /* @__PURE__ */ jsx("g", { children: /* @__PURE__ */ jsx("text", { x: 300, y: 200, textAnchor: "middle", fill: color, fontSize: 12, opacity: 0.5, children: "Computing layout..." }) });
58907
+ return /* @__PURE__ */ jsx("g", { children: /* @__PURE__ */ jsx("text", { x: 300, y: 200, textAnchor: "middle", fill: color, fontSize: 12, opacity: 0.5, children: t("avl.computingLayout") }) });
58602
58908
  }
58603
58909
  const hasExternal = data.listenedEvents.length > 0 || data.emittedEvents.length > 0;
58604
58910
  const machineOffsetX = hasExternal ? 0 : 30;
@@ -58613,10 +58919,7 @@ var AvlTraitScene = ({
58613
58919
  const machineHeight = scaledH + 100;
58614
58920
  const renderMachine = /* @__PURE__ */ jsxs("g", { children: [
58615
58921
  /* @__PURE__ */ jsx("text", { x: CENTER_W2 / 2, y: 20, textAnchor: "middle", fill: color, fontSize: 20, fontWeight: "700", fontFamily: "inherit", children: data.name }),
58616
- /* @__PURE__ */ jsxs("text", { x: CENTER_W2 / 2, y: 38, textAnchor: "middle", fill: color, fontSize: 11, opacity: 0.5, fontFamily: "inherit", children: [
58617
- "linked to ",
58618
- data.linkedEntity
58619
- ] }),
58922
+ /* @__PURE__ */ 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 }) }),
58620
58923
  /* @__PURE__ */ jsxs("defs", { children: [
58621
58924
  /* @__PURE__ */ jsx("marker", { id: "traitArrowV2", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: CONNECTION_COLORS.forward.color, opacity: 0.7 }) }),
58622
58925
  /* @__PURE__ */ jsx("marker", { id: "traitArrowBack", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: CONNECTION_COLORS.backward.color, opacity: 0.5 }) })
@@ -58691,6 +58994,9 @@ var AvlTraitScene = ({
58691
58994
  );
58692
58995
  };
58693
58996
  AvlTraitScene.displayName = "AvlTraitScene";
58997
+
58998
+ // components/avl/molecules/TraitCardNode.tsx
58999
+ init_useTranslate();
58694
59000
  var TraitCardSelectionContext = createContext({
58695
59001
  selectTransition: () => {
58696
59002
  }
@@ -58700,6 +59006,7 @@ var SCENE_WIDTH = 600;
58700
59006
  var SCENE_HEIGHT = 400;
58701
59007
  var TraitCardNodeInner = (props) => {
58702
59008
  const data = props.data;
59009
+ const { t } = useTranslate();
58703
59010
  const { selectTransition } = useContext(TraitCardSelectionContext);
58704
59011
  const orbitalName = data.orbitalName;
58705
59012
  const traitName = data.traitName ?? "";
@@ -58725,7 +59032,7 @@ var TraitCardNodeInner = (props) => {
58725
59032
  position: Position.Left,
58726
59033
  id: `listen-${event}`,
58727
59034
  style: { top: `${(i + 1) / (listens.length + 1) * 100}%` },
58728
- "aria-label": `listens for ${event}`
59035
+ "aria-label": t("avl.listensFor", { event })
58729
59036
  },
58730
59037
  `listen-${event}`
58731
59038
  )),
@@ -58736,7 +59043,7 @@ var TraitCardNodeInner = (props) => {
58736
59043
  position: Position.Right,
58737
59044
  id: `emit-${event}`,
58738
59045
  style: { top: `${(i + 1) / (emits.length + 1) * 100}%` },
58739
- "aria-label": `emits ${event}`
59046
+ "aria-label": t("avl.emits", { event })
58740
59047
  },
58741
59048
  `emit-${event}`
58742
59049
  )),
@@ -58763,14 +59070,14 @@ var TraitCardNodeInner = (props) => {
58763
59070
  {
58764
59071
  data: traitLevelData,
58765
59072
  onTransitionClick: (idx) => {
58766
- const t = transitions[idx];
58767
- if (!t) return;
59073
+ const t2 = transitions[idx];
59074
+ if (!t2) return;
58768
59075
  selectTransition({
58769
59076
  orbitalName,
58770
59077
  traitName,
58771
- transitionEvent: t.event,
58772
- fromState: t.fromState,
58773
- toState: t.toState,
59078
+ transitionEvent: t2.event,
59079
+ fromState: t2.fromState,
59080
+ toState: t2.toState,
58774
59081
  index: idx
58775
59082
  });
58776
59083
  }
@@ -58778,7 +59085,7 @@ var TraitCardNodeInner = (props) => {
58778
59085
  )
58779
59086
  }
58780
59087
  )
58781
- ) : /* @__PURE__ */ jsx(Typography, { variant: "small", color: "muted", children: "No state machine" })
59088
+ ) : /* @__PURE__ */ jsx(Typography, { variant: "small", color: "muted", children: t("avl.noStateMachine") })
58782
59089
  ] })
58783
59090
  ]
58784
59091
  }
@@ -58789,6 +59096,7 @@ TraitCardNode.displayName = "TraitCardNode";
58789
59096
 
58790
59097
  // components/avl/organisms/FlowCanvas.tsx
58791
59098
  init_useEventBus();
59099
+ init_useTranslate();
58792
59100
  var flowCanvasLog = createLogger("almadar:ui:flow-canvas");
58793
59101
  var NODE_TYPES = {
58794
59102
  preview: OrbPreviewNode,
@@ -58832,6 +59140,7 @@ function FlowCanvasInner({
58832
59140
  userType = "builder",
58833
59141
  themeManifest
58834
59142
  }) {
59143
+ const { t } = useTranslate();
58835
59144
  const NODE_TYPES2 = useMemo(() => ({
58836
59145
  preview: OrbPreviewNode,
58837
59146
  behaviorCompose: BehaviorComposeNode,
@@ -58884,13 +59193,13 @@ function FlowCanvasInner({
58884
59193
  }), [selectedPattern]);
58885
59194
  const [atBehaviorLevel, setAtBehaviorLevel] = useState(composeLevel === "behavior");
58886
59195
  const { composeNodes, composeEdges, overviewNodes, overviewEdges, expandedNodes, expandedEdges, behaviorExpandedNodes, behaviorExpandedEdges, traitExpandedNodes, traitExpandedEdges } = useMemo(() => {
58887
- const t = perfStart("compose-graph");
59196
+ const t2 = perfStart("compose-graph");
58888
59197
  const compose = composeLevel === "behavior" && behaviorEntries?.length ? behaviorsToComposeGraph(behaviorEntries, behaviorWires ?? [], layoutHint) : { nodes: [], edges: [] };
58889
59198
  const overview = schemaToOverviewGraph(parsedSchema, mockData, behaviorMeta, layoutHint, orbitalStatus, screenSize);
58890
59199
  const expanded = expandedOrbital ? orbitalToExpandedGraph(parsedSchema, expandedOrbital, mockData, screenSize) : { nodes: [], edges: [] };
58891
59200
  const behaviorExpanded = expandedOrbital && expandedBehaviorAlias ? orbitalAliasToExpandedGraph(parsedSchema, expandedOrbital, expandedBehaviorAlias, mockData, screenSize) : { nodes: [], edges: [] };
58892
59201
  const traitExpanded = expandedOrbital ? orbitalToTraitGraph(parsedSchema, expandedOrbital) : { nodes: [], edges: [] };
58893
- perfEnd("compose-graph", t, {
59202
+ perfEnd("compose-graph", t2, {
58894
59203
  composeNodes: compose.nodes.length,
58895
59204
  overviewNodes: overview.nodes.length,
58896
59205
  expandedNodes: expanded.nodes.length,
@@ -59143,12 +59452,12 @@ function FlowCanvasInner({
59143
59452
  {
59144
59453
  onClick: handleGoBack,
59145
59454
  className: "text-muted-foreground hover:text-foreground text-sm cursor-pointer bg-transparent border-none p-0",
59146
- "aria-label": "Go back to overview",
59455
+ "aria-label": t("canvas.goBackToOverview"),
59147
59456
  children: "\u2190"
59148
59457
  }
59149
59458
  ),
59150
- /* @__PURE__ */ jsx(Typography, { variant: "small", className: "font-medium", children: level === "overview" ? "Overview" : expandedOrbital ?? "Expanded" }),
59151
- /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground", children: level === "overview" ? `${nodes.length} modules` : `${nodes.length} screens` })
59459
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "font-medium", children: level === "overview" ? t("canvas.overview") : expandedOrbital ?? t("canvas.expanded") }),
59460
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground", children: level === "overview" ? t("canvas.modulesCount", { count: nodes.length }) : t("canvas.screensCount", { count: nodes.length }) })
59152
59461
  ] }),
59153
59462
  /* @__PURE__ */ 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) => {
59154
59463
  const p2 = SCREEN_SIZE_PRESETS[size];
@@ -59164,7 +59473,7 @@ function FlowCanvasInner({
59164
59473
  },
59165
59474
  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"}`,
59166
59475
  title: `${p2.label} (${p2.width}px)`,
59167
- "aria-label": `Switch to ${p2.label} view`,
59476
+ "aria-label": t("canvas.switchToView", { label: p2.label }),
59168
59477
  children: p2.label
59169
59478
  },
59170
59479
  size
@@ -59546,6 +59855,7 @@ init_Stack();
59546
59855
  init_Typography();
59547
59856
  init_Button();
59548
59857
  init_Icon();
59858
+ init_useTranslate();
59549
59859
  var UNIT_DISPLAY_W = 240;
59550
59860
  var UNIT_DISPLAY_H = 160;
59551
59861
  function layoutOrbitals(count, containerW, containerH) {
@@ -59736,6 +60046,7 @@ var AvlOrbitalsCosmicZoom = ({
59736
60046
  minZoom = 0.4,
59737
60047
  maxZoom = 3
59738
60048
  }) => {
60049
+ const { t } = useTranslate();
59739
60050
  const parsedSchema = useMemo(() => {
59740
60051
  if (typeof schemaProp === "string") return JSON.parse(schemaProp);
59741
60052
  return schemaProp;
@@ -59803,9 +60114,9 @@ var AvlOrbitalsCosmicZoom = ({
59803
60114
  (ctx) => {
59804
60115
  if (ctx.level !== "transition" || !ctx.trait || !ctx.transition) return;
59805
60116
  const orbital = parsedSchema.orbitals?.find((o) => o.name === ctx.orbital);
59806
- const traitRef = orbital?.traits?.find((t) => isInlineTrait(t) && t.name === ctx.trait);
60117
+ const traitRef = orbital?.traits?.find((t2) => isInlineTrait(t2) && t2.name === ctx.trait);
59807
60118
  if (!traitRef || !isInlineTrait(traitRef)) return;
59808
- const idx = traitRef.stateMachine?.transitions?.findIndex((t) => t.event === ctx.transition) ?? -1;
60119
+ const idx = traitRef.stateMachine?.transitions?.findIndex((t2) => t2.event === ctx.transition) ?? -1;
59809
60120
  if (idx < 0) return;
59810
60121
  dispatch({ type: "SELECT_TRAIT", trait: ctx.trait });
59811
60122
  dispatch({ type: "ZOOM_INTO_TRANSITION", transitionIndex: idx, targetPosition: { x: 0, y: 0 } });
@@ -59981,7 +60292,7 @@ var AvlOrbitalsCosmicZoom = ({
59981
60292
  borderRadius: 4,
59982
60293
  opacity: 0.8
59983
60294
  },
59984
- children: /* @__PURE__ */ jsx(Typography, { variant: "small", style: { color }, children: "Press Esc to zoom out" })
60295
+ children: /* @__PURE__ */ jsx(Typography, { variant: "small", style: { color }, children: t("avl.pressEscToZoomOut") })
59985
60296
  }
59986
60297
  ),
59987
60298
  state.level === "application" && /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -60033,7 +60344,7 @@ var AvlOrbitalsCosmicZoom = ({
60033
60344
  onKeyDown: (e) => {
60034
60345
  if (e.key === "Enter" || e.key === " ") handleSelect(view.name);
60035
60346
  },
60036
- "aria-label": `Orbital: ${view.name}${isHighlighted ? " (highlighted)" : ""}`,
60347
+ "aria-label": isHighlighted ? t("avl.orbitalLabelHighlighted", { name: view.name }) : t("avl.orbitalLabel", { name: view.name }),
60037
60348
  position: "absolute",
60038
60349
  style: {
60039
60350
  left: view.cx - UNIT_DISPLAY_W / 2,
@@ -60081,9 +60392,9 @@ var AvlOrbitalsCosmicZoom = ({
60081
60392
  zIndex: 30
60082
60393
  },
60083
60394
  children: [
60084
- /* @__PURE__ */ jsx(Button, { variant: "secondary", size: "sm", onClick: zoomIn, title: "Zoom in", action: "COSMIC_ZOOM_IN", children: /* @__PURE__ */ jsx(Icon, { name: "plus", size: "sm" }) }),
60085
- /* @__PURE__ */ jsx(Button, { variant: "secondary", size: "sm", onClick: zoomOut, title: "Zoom out", action: "COSMIC_ZOOM_OUT", children: /* @__PURE__ */ jsx(Icon, { name: "minus", size: "sm" }) }),
60086
- /* @__PURE__ */ jsx(Button, { variant: "secondary", size: "sm", onClick: resetZoom, title: "Reset", action: "COSMIC_ZOOM_RESET", children: /* @__PURE__ */ jsx(Icon, { name: "maximize", size: "sm" }) })
60395
+ /* @__PURE__ */ jsx(Button, { variant: "secondary", size: "sm", onClick: zoomIn, title: t("avl.zoomIn"), action: "COSMIC_ZOOM_IN", children: /* @__PURE__ */ jsx(Icon, { name: "plus", size: "sm" }) }),
60396
+ /* @__PURE__ */ jsx(Button, { variant: "secondary", size: "sm", onClick: zoomOut, title: t("avl.zoomOut"), action: "COSMIC_ZOOM_OUT", children: /* @__PURE__ */ jsx(Icon, { name: "minus", size: "sm" }) }),
60397
+ /* @__PURE__ */ jsx(Button, { variant: "secondary", size: "sm", onClick: resetZoom, title: t("common.reset"), action: "COSMIC_ZOOM_RESET", children: /* @__PURE__ */ jsx(Icon, { name: "maximize", size: "sm" }) })
60087
60398
  ]
60088
60399
  }
60089
60400
  )