@saasicat/ui-vue 0.5.0 → 0.7.0

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.
Files changed (186) hide show
  1. package/README.md +17 -0
  2. package/dist/{chunk-EH7TOD4H.js → chunk-A3W2N26K.js} +73 -77
  3. package/dist/{chunk-3YP2ZAOD.js → chunk-QZOSDCNP.js} +36 -1
  4. package/dist/chunk-X5SQ5HMB.js +3231 -0
  5. package/dist/client/index.cjs +3279 -76
  6. package/dist/client/index.d.cts +31 -5
  7. package/dist/client/index.d.ts +31 -5
  8. package/dist/client/index.js +23 -5
  9. package/dist/index.cjs +3709 -465
  10. package/dist/index.d.cts +37 -54
  11. package/dist/index.d.ts +37 -54
  12. package/dist/index.js +347 -311
  13. package/dist/messages-7b0P8W75.d.cts +1652 -0
  14. package/dist/messages-7b0P8W75.d.ts +1652 -0
  15. package/dist/quasar/index.cjs +3185 -4
  16. package/dist/quasar/index.d.cts +11 -2
  17. package/dist/quasar/index.d.ts +11 -2
  18. package/dist/quasar/index.js +8 -3
  19. package/dist/testing-e2e/admin-pages-suite.cjs +14 -11
  20. package/dist/testing-e2e/admin-pages-suite.js +14 -11
  21. package/dist/{ui-notify-COUzXEQ4.d.ts → use-super-admin-i18n-B3v3-SWZ.d.ts} +35 -3
  22. package/dist/{ui-notify-D_eAAwRh.d.cts → use-super-admin-i18n-DMktRVEt.d.cts} +35 -3
  23. package/package.json +2 -2
  24. package/src/client/action-registry.ts +4 -4
  25. package/src/client/batch-column-fetcher.ts +4 -4
  26. package/src/client/boot-loader.ts +3 -3
  27. package/src/client/i18n/currency.ts +42 -0
  28. package/src/client/i18n/define.ts +59 -0
  29. package/src/client/i18n/format.ts +12 -0
  30. package/src/client/i18n/index.ts +14 -0
  31. package/src/client/i18n/locale.ts +15 -0
  32. package/src/client/i18n/messages/audit.ts +42 -0
  33. package/src/client/i18n/messages/bundles.ts +459 -0
  34. package/src/client/i18n/messages/common.ts +147 -0
  35. package/src/client/i18n/messages/dashboard.ts +16 -0
  36. package/src/client/i18n/messages/discovery.ts +229 -0
  37. package/src/client/i18n/messages/email.ts +125 -0
  38. package/src/client/i18n/messages/marketing.ts +270 -0
  39. package/src/client/i18n/messages/nav.ts +72 -0
  40. package/src/client/i18n/messages/pilots.ts +192 -0
  41. package/src/client/i18n/messages/plan-detail.ts +266 -0
  42. package/src/client/i18n/messages/plan-editor.ts +177 -0
  43. package/src/client/i18n/messages/plan-versions.ts +251 -0
  44. package/src/client/i18n/messages/plans.ts +503 -0
  45. package/src/client/i18n/messages/promos.ts +202 -0
  46. package/src/client/i18n/messages/shell.ts +145 -0
  47. package/src/client/i18n/messages/tenants.ts +104 -0
  48. package/src/client/i18n/messages/users.ts +78 -0
  49. package/src/client/i18n/messages.ts +84 -0
  50. package/src/client/index.ts +2 -0
  51. package/src/client/manifest-loader.ts +4 -4
  52. package/src/client/nav-builder.ts +44 -51
  53. package/src/client/plan-versions-catalog.ts +42 -30
  54. package/src/components/BundleVersionPublishDialog.vue +35 -24
  55. package/src/components/MarketingPromotionsTab.vue +112 -59
  56. package/src/components/MfaPromptDialog.vue +11 -11
  57. package/src/components/TenantActionConfirmDialog.vue +19 -17
  58. package/src/components/VersionDiffPreview.vue +72 -43
  59. package/src/components/bundle-editor/BundleCreatePanel.vue +76 -63
  60. package/src/components/bundle-editor/BundleFeaturesEditor.vue +13 -6
  61. package/src/components/bundle-editor/BundlePlanCompatPicker.vue +19 -14
  62. package/src/components/bundle-editor/BundleQuotasEditor.vue +7 -4
  63. package/src/components/bundle-editor/BundleStatusBanner.vue +36 -19
  64. package/src/components/bundle-editor/BundleVersionInlineEditor.vue +51 -35
  65. package/src/components/bundle-editor/BundleVersionStrip.vue +24 -12
  66. package/src/components/bundle-editor/bundle-version-status.ts +29 -29
  67. package/src/components/dialogs/PilotCreateDialog.vue +58 -63
  68. package/src/components/dialogs/PilotEditDialog.vue +40 -34
  69. package/src/components/dialogs/PromoCodeCreateDialog.vue +89 -63
  70. package/src/components/dialogs/PromoCodeEditDialog.vue +98 -66
  71. package/src/components/dialogs/types.ts +3 -13
  72. package/src/components/plan/PlanCycleToggle.vue +20 -9
  73. package/src/components/plan-cockpit/PlanCockpit.vue +34 -15
  74. package/src/components/plan-cockpit/PlanCockpitAuditLog.vue +13 -6
  75. package/src/components/plan-cockpit/PlanCockpitDiffPanel.vue +18 -9
  76. package/src/components/plan-cockpit/PlanCockpitHeader.vue +9 -6
  77. package/src/components/plan-cockpit/PlanCockpitImpactPanel.vue +24 -11
  78. package/src/components/plan-cockpit/PlanCockpitKpis.vue +28 -17
  79. package/src/components/plan-cockpit/PlanCockpitVersions.vue +50 -25
  80. package/src/components/plan-create-dialog/PlanCreateDialog.vue +45 -35
  81. package/src/components/plan-detail/PlanAuditLog.vue +11 -6
  82. package/src/components/plan-detail/PlanDetail.vue +21 -23
  83. package/src/components/plan-detail/PlanDetailHeader.vue +20 -11
  84. package/src/components/plan-detail/PlanDetailKpis.vue +30 -17
  85. package/src/components/plan-detail/PlanTerminateDialog.vue +22 -9
  86. package/src/components/plan-detail/PlanVersionDiffPanel.vue +61 -27
  87. package/src/components/plan-detail/PlanVersionsPanel.vue +71 -36
  88. package/src/components/plan-list/PlanList.vue +99 -57
  89. package/src/components/plan-matrix/PlanMatrix.vue +85 -38
  90. package/src/components/plan-review/PlanReview.vue +105 -80
  91. package/src/components/plan-version-editor/PlanCatalogPreview.vue +43 -20
  92. package/src/components/plan-version-editor/PlanComponentPool.vue +15 -7
  93. package/src/components/plan-version-editor/PlanVersionBasket.vue +45 -24
  94. package/src/components/plan-version-editor/PlanVersionDiffDialog.vue +8 -7
  95. package/src/components/plan-version-editor/PlanVersionEditor.vue +74 -40
  96. package/src/components/plan-version-editor/PlanVersionEditorHeader.vue +24 -12
  97. package/src/index.ts +1 -1
  98. package/src/pages-standard/AdminLayout.vue +42 -17
  99. package/src/pages-standard/AdminManifestErrorPage.vue +10 -10
  100. package/src/pages-standard/AuditPage.vue +58 -19
  101. package/src/pages-standard/BundlesPage.vue +29 -18
  102. package/src/pages-standard/DashboardPage.vue +29 -15
  103. package/src/pages-standard/DiscoveryPage.vue +40 -28
  104. package/src/pages-standard/EmailHistoryPage.vue +92 -59
  105. package/src/pages-standard/MarketingCatalogPage.vue +35 -16
  106. package/src/pages-standard/PilotsPage.vue +57 -41
  107. package/src/pages-standard/PlanVersionsPage.vue +7 -3
  108. package/src/pages-standard/PlansPage.vue +89 -57
  109. package/src/pages-standard/PlatformEmailPage.vue +115 -50
  110. package/src/pages-standard/PromoCodeDetailPage.vue +66 -63
  111. package/src/pages-standard/PromoCodesPage.vue +46 -35
  112. package/src/pages-standard/SubscriptionsPage.vue +14 -9
  113. package/src/pages-standard/SuperAdminLoginPage.vue +16 -13
  114. package/src/pages-standard/SuperAdminSetupWizard.vue +51 -47
  115. package/src/pages-standard/TenantDetailPage.vue +50 -36
  116. package/src/pages-standard/TenantsPage.vue +54 -41
  117. package/src/pages-standard/UsersPage.vue +66 -42
  118. package/src/pages-standard/bundles-page/BundleAccordionList.vue +20 -8
  119. package/src/pages-standard/bundles-page/BundleDetailPanel.vue +28 -18
  120. package/src/pages-standard/bundles-page/BundlesFilterBar.vue +4 -1
  121. package/src/pages-standard/bundles-page/BundlesHeader.vue +9 -8
  122. package/src/pages-standard/bundles-page/BundlesKpis.vue +29 -11
  123. package/src/pages-standard/discovery-page/CatalogEntryTransPanel.vue +20 -8
  124. package/src/pages-standard/discovery-page/DiscoveryCapList.vue +5 -3
  125. package/src/pages-standard/discovery-page/DiscoveryFeatureCard.vue +43 -24
  126. package/src/pages-standard/discovery-page/DiscoveryHeader.vue +7 -4
  127. package/src/pages-standard/discovery-page/DiscoveryKpis.vue +28 -15
  128. package/src/pages-standard/discovery-page/DiscoveryQuotaCard.vue +20 -10
  129. package/src/pages-standard/discovery-page/DiscoveryStatusControl.vue +9 -6
  130. package/src/pages-standard/discovery-page/discovery-ui.ts +40 -52
  131. package/src/pages-standard/marketing-catalog/MarketingCatalogAdmin.vue +81 -49
  132. package/src/pages-standard/marketing-catalog/MarketingCatalogHeader.vue +13 -10
  133. package/src/pages-standard/marketing-catalog/MarketingCatalogPreview.vue +24 -20
  134. package/src/pages-standard/marketing-catalog/MarketingCatalogToolbar.vue +6 -3
  135. package/src/pages-standard/plan-versions/PlanDiffCard.vue +16 -6
  136. package/src/pages-standard/plan-versions/PlanVersionHeader.vue +41 -25
  137. package/src/pages-standard/plan-versions/PlanVersionsAudit.vue +45 -26
  138. package/src/pages-standard/plan-versions/PlanVersionsDiff.vue +7 -5
  139. package/src/pages-standard/plan-versions/PlanVersionsList.vue +39 -16
  140. package/src/pages-standard/plan-versions/PlanVersionsTimeline.vue +24 -12
  141. package/src/pages-standard/plan-versions/format.ts +33 -17
  142. package/src/pages-standard/plans-page/PlanArchiveDialog.vue +12 -8
  143. package/src/pages-standard/plans-page/PlanBundleOverview.vue +15 -6
  144. package/src/pages-standard/plans-page/PlanDiscardDraftDialog.vue +18 -7
  145. package/src/pages-standard/plans-page/PlanPublishDialog.vue +23 -12
  146. package/src/pages-standard/tenants/format.ts +3 -2
  147. package/src/pages-tenant/MySubscriptionBundlesPage.vue +72 -37
  148. package/src/pages-tenant/PlanChangeWizard.vue +8 -4
  149. package/src/pages-tenant/TenantPlanSection.vue +17 -13
  150. package/src/pages-tenant/default-i18n.ts +217 -1
  151. package/src/pages-tenant/tenant-plan-section/BundlePreviewDialog.vue +8 -6
  152. package/src/pages-tenant/tenant-plan-section/TenantBundleStore.vue +9 -10
  153. package/src/pages-tenant/tenant-plan-section/TenantFeatureMatrix.vue +4 -1
  154. package/src/quasar/create-super-admin-app.ts +19 -0
  155. package/src/testing-e2e/admin-pages-suite.ts +14 -11
  156. package/src/vue/project-page-host.ts +5 -3
  157. package/src/vue/use-audit-entries.ts +3 -3
  158. package/src/vue/use-bulk-publish.ts +6 -4
  159. package/src/vue/use-bundle-versions-map.ts +6 -4
  160. package/src/vue/use-bundles.ts +13 -13
  161. package/src/vue/use-catalog-entries.ts +13 -10
  162. package/src/vue/use-discovery.ts +8 -5
  163. package/src/vue/use-entitlement.ts +3 -3
  164. package/src/vue/use-live-plan-versions.ts +4 -4
  165. package/src/vue/use-marketing-projections.ts +9 -6
  166. package/src/vue/use-nav.ts +8 -2
  167. package/src/vue/use-plan-editor.ts +2 -2
  168. package/src/vue/use-plan-versions.ts +3 -3
  169. package/src/vue/use-plans.ts +12 -12
  170. package/src/vue/use-platform-tenant-actions.ts +9 -6
  171. package/src/vue/use-promotions.ts +9 -10
  172. package/src/vue/use-subscription-draft.ts +2 -3
  173. package/src/vue/use-super-admin-context.ts +3 -3
  174. package/src/vue/use-super-admin-i18n.ts +82 -0
  175. package/src/vue/use-tenant-action-flow.ts +11 -6
  176. package/src/vue/use-tenant-manifest.ts +1 -3
  177. package/src/vue/use-tenant-subscription-bundles.ts +4 -4
  178. package/src/vue/use-tenants.ts +3 -3
  179. package/dist/action-registry-CQ2wL3R-.d.cts +0 -85
  180. package/dist/action-registry-CQ2wL3R-.d.ts +0 -85
  181. package/dist/chunk-LVGUSD3T.js +0 -26
  182. package/src/components/BusinessTypeVersionEditorDialog.vue +0 -417
  183. package/src/components/BusinessTypeVersionPublishDialog.vue +0 -258
  184. package/src/pages-standard/BusinessTypesPage.vue +0 -662
  185. package/src/pages-standard/plan-versions/VersionDiffPreview.vue +0 -167
  186. package/src/vue/use-business-types.ts +0 -269
@@ -0,0 +1,1652 @@
1
+ import { AdminManifest, TenantActionDef, StandardPageKey } from '@saasicat/types';
2
+
3
+ /**
4
+ * Minimal abstraction over `fetch`. Consumers may pass their own
5
+ * implementation (e.g. an axios wrapper that already injects auth headers
6
+ * and tenant headers).
7
+ */
8
+ type HttpClient = (url: string, init?: {
9
+ method?: string;
10
+ headers?: Record<string, string>;
11
+ body?: string;
12
+ }) => Promise<HttpResponse>;
13
+ interface HttpResponse {
14
+ status: number;
15
+ headers: {
16
+ get(name: string): string | null;
17
+ };
18
+ json(): Promise<unknown>;
19
+ text(): Promise<string>;
20
+ }
21
+ /** Simple persistence adapter; default is `localStorage`. */
22
+ interface KvStore {
23
+ get(key: string): string | null;
24
+ set(key: string, value: string): void;
25
+ remove(key: string): void;
26
+ }
27
+ /**
28
+ * Returns a `KvStore` wrapper around `localStorage` (or `null` under SSR).
29
+ * Tests may pass an in-memory stub.
30
+ */
31
+ declare function defaultKvStore(): KvStore;
32
+ /**
33
+ * Default `HttpClient` over `fetch`. Consumers pass their own variant
34
+ * through when they need auth headers / tenant headers / retry logic.
35
+ */
36
+ declare function defaultHttpClient(): HttpClient;
37
+
38
+ type SaLocale = 'de' | 'en';
39
+ declare const SA_LOCALES: readonly SaLocale[];
40
+ declare const DEFAULT_SA_LOCALE: SaLocale;
41
+ /** BCP-47 tags used for `Intl`/`toLocaleString` formatting per UI locale. */
42
+ declare const SA_INTL_LOCALES: Record<SaLocale, string>;
43
+
44
+ /** Consumer implementation; receives the action inputs as a generic object. */
45
+ type ActionHandler<TInput = unknown, TResult = unknown> = (input: TInput) => Promise<TResult>;
46
+ interface ResolvedAction<TInput = unknown, TResult = unknown> {
47
+ def: TenantActionDef;
48
+ handler: ActionHandler<TInput, TResult>;
49
+ }
50
+ declare class MissingHandlerError extends Error {
51
+ constructor(actionKey: string);
52
+ }
53
+ declare class ActionDefNotInManifestError extends Error {
54
+ constructor(actionKey: string);
55
+ }
56
+ declare class ActionRegistry {
57
+ private readonly defs;
58
+ private readonly handlers;
59
+ constructor(manifest: AdminManifest, handlers?: Record<string, ActionHandler>);
60
+ /**
61
+ * Registers a handler after the fact (e.g. when consumer code loads
62
+ * lazily). Throws `ActionDefNotInManifestError` if the `actionKey` is not
63
+ * declared in the manifest — prevents dead registrations.
64
+ */
65
+ register<TInput, TResult>(actionKey: string, handler: ActionHandler<TInput, TResult>): void;
66
+ /**
67
+ * Returns the `{def, handler}` pair. Throws if the key is missing from
68
+ * the manifest or no handler is registered. The shell's UI layer calls
69
+ * the method, checks `def.requiresMfa` / `def.confirmType` for the
70
+ * pre-flow, and then calls `handler(input)`.
71
+ */
72
+ get<TInput = unknown, TResult = unknown>(actionKey: string): ResolvedAction<TInput, TResult>;
73
+ /**
74
+ * Convenience: `get(key).handler(input)`. UI convenience for actions
75
+ * that need neither MFA nor confirm.
76
+ */
77
+ dispatch<TInput, TResult>(actionKey: string, input: TInput): Promise<TResult>;
78
+ /**
79
+ * List of actionKeys that are declared in the manifest but have no
80
+ * handler. Consumers use this in a doctor check to detect drift between
81
+ * the manifest and the shell build.
82
+ */
83
+ listOrphanedDefs(): string[];
84
+ /**
85
+ * List of registered handlers that are missing from the manifest. Drift
86
+ * in the other direction.
87
+ */
88
+ listOrphanedHandlers(): string[];
89
+ }
90
+
91
+ /** Nested string map — the shape of every message namespace. */
92
+ interface MessageTree {
93
+ readonly [key: string]: string | MessageTree;
94
+ }
95
+ /** Maps a reference namespace to "same keys, any string values". */
96
+ type TranslationOf<T> = {
97
+ readonly [K in keyof T]: T[K] extends string ? string : TranslationOf<T[K]>;
98
+ };
99
+ /** Deep partial of a namespace — the shape consumers pass as overrides. */
100
+ type PartialMessages<T> = {
101
+ readonly [K in keyof T]?: T[K] extends string ? string : PartialMessages<T[K]>;
102
+ };
103
+ /**
104
+ * Couples the German reference catalog with its English translation. Missing
105
+ * or extra keys in the English object are compile errors.
106
+ */
107
+ declare function defineMessages<T extends MessageTree>(de: T, en: TranslationOf<T>): Record<SaLocale, T>;
108
+ /**
109
+ * Recursively overlays `overrides` onto `base` without mutating either side.
110
+ * Only string leaves are replaced; keys not present in `base` are ignored —
111
+ * the catalog structure is fixed by the platform.
112
+ */
113
+ declare function mergeMessages<T extends MessageTree>(base: T, overrides: PartialMessages<T> | undefined): T;
114
+
115
+ declare const auditMessages: Record<SaLocale, {
116
+ title: string;
117
+ subtitle: string;
118
+ filterButton: string;
119
+ detailActorPrefix: string;
120
+ filters: {
121
+ actor: string;
122
+ action: string;
123
+ entity: string;
124
+ since: string;
125
+ };
126
+ columns: {
127
+ time: string;
128
+ actor: string;
129
+ action: string;
130
+ entity: string;
131
+ id: string;
132
+ };
133
+ }>;
134
+
135
+ declare const bundlesMessages: Record<SaLocale, {
136
+ fields: {
137
+ masterData: string;
138
+ label: string;
139
+ quotas: string;
140
+ monthlyPrice: string;
141
+ yearlyPrice: string;
142
+ perMonthUnit: string;
143
+ perYearUnit: string;
144
+ validFrom: string;
145
+ validUntil: string;
146
+ validUntilOpen: string;
147
+ planCompat: string;
148
+ };
149
+ validation: {
150
+ validFromRequired: string;
151
+ validUntilAfterValidFrom: string;
152
+ monthlyPriceFormat: string;
153
+ yearlyPriceFormat: string;
154
+ };
155
+ page: {
156
+ loadError: string;
157
+ emptyBefore: string;
158
+ emptyAfter: string;
159
+ strictWarnings: string;
160
+ confirmSoftDelete: string;
161
+ confirmDiscardVersion: string;
162
+ };
163
+ header: {
164
+ title: string;
165
+ subtitle: string;
166
+ displayLocale: string;
167
+ newBundle: string;
168
+ reload: string;
169
+ };
170
+ filter: {
171
+ all: string;
172
+ live: string;
173
+ scheduled: string;
174
+ draft: string;
175
+ superseded: string;
176
+ retired: string;
177
+ };
178
+ kpis: {
179
+ total: string;
180
+ totalSub: string;
181
+ scheduled: string;
182
+ scheduledSub: string;
183
+ drafts: string;
184
+ draftsSub: string;
185
+ translated: string;
186
+ translatedSub: string;
187
+ };
188
+ list: {
189
+ translationCount: string;
190
+ emptyNoMatch: string;
191
+ };
192
+ status: {
193
+ draft: {
194
+ label: string;
195
+ tooltip: string;
196
+ };
197
+ live: {
198
+ label: string;
199
+ tooltip: string;
200
+ };
201
+ scheduled: {
202
+ label: string;
203
+ tooltip: string;
204
+ };
205
+ superseded: {
206
+ label: string;
207
+ tooltip: string;
208
+ };
209
+ retired: {
210
+ label: string;
211
+ tooltip: string;
212
+ };
213
+ };
214
+ detail: {
215
+ translations: string;
216
+ languageCount: string;
217
+ noTranslatableLocales: string;
218
+ fallbackFromDe: string;
219
+ labelPlaceholder: string;
220
+ descriptionPlaceholder: string;
221
+ save: string;
222
+ noVersion: string;
223
+ publishVersion: string;
224
+ softDelete: string;
225
+ };
226
+ create: {
227
+ title: string;
228
+ subtitle: string;
229
+ masterDataHint: string;
230
+ labelPlaceholder: string;
231
+ bundleKey: string;
232
+ bundleKeyHint: string;
233
+ errorKeyFormat: string;
234
+ errorKeyExists: string;
235
+ descriptionPlaceholder: string;
236
+ sectionPricing: string;
237
+ pricingHint: string;
238
+ validFromImmediate: string;
239
+ validFromScheduled: string;
240
+ validFromHint: string;
241
+ planCompatHint: string;
242
+ sectionFeatures: string;
243
+ selectedOfTotal: string;
244
+ quotasOptional: string;
245
+ quotasHint: string;
246
+ overlapWarningOne: string;
247
+ overlapWarningMany: string;
248
+ summaryFeatureOne: string;
249
+ summaryFeatureMany: string;
250
+ summaryQuotaOne: string;
251
+ summaryQuotaMany: string;
252
+ summaryPlanCompat: string;
253
+ submitting: string;
254
+ submit: string;
255
+ };
256
+ versionStrip: {
257
+ label: string;
258
+ perMonth: string;
259
+ addVersion: string;
260
+ addTooltip: string;
261
+ addDisabledTooltip: string;
262
+ };
263
+ statusBanner: {
264
+ is: string;
265
+ live: string;
266
+ liveTail: string;
267
+ liveWarning: string;
268
+ scheduled: string;
269
+ scheduledTail: string;
270
+ scheduledOk: string;
271
+ superseded: string;
272
+ supersededTail: string;
273
+ draft: string;
274
+ draftTail: string;
275
+ discardTooltip: string;
276
+ };
277
+ editor: {
278
+ overlapOne: string;
279
+ overlapMany: string;
280
+ sectionFeatures: string;
281
+ sectionPricing: string;
282
+ pricingHint: string;
283
+ yearlyEquivalent: string;
284
+ savings: string;
285
+ validityHint: string;
286
+ validUntilHint: string;
287
+ sectionMarketing: string;
288
+ marketed: string;
289
+ sectionChangeNote: string;
290
+ changeNoteRequired: string;
291
+ changeNotePlaceholder: string;
292
+ selectedCount: string;
293
+ saveTooltip: string;
294
+ saveDisabledTooltip: string;
295
+ };
296
+ featuresEditor: {
297
+ empty: string;
298
+ overlapTooltip: string;
299
+ removeTooltip: string;
300
+ addTooltip: string;
301
+ };
302
+ quotasEditor: {
303
+ empty: string;
304
+ removeTooltip: string;
305
+ addTooltip: string;
306
+ };
307
+ filterBar: {
308
+ searchPlaceholder: string;
309
+ };
310
+ compatPicker: {
311
+ hint: string;
312
+ lockedTooltip: string;
313
+ removeTooltip: string;
314
+ addTooltip: string;
315
+ overlapHead: string;
316
+ overlapFeatures: string;
317
+ overlapQuotas: string;
318
+ empty: string;
319
+ summaryOne: string;
320
+ summaryMany: string;
321
+ };
322
+ publishDialog: {
323
+ title: string;
324
+ bundleLabel: string;
325
+ loadingDiff: string;
326
+ strictWarnings: string;
327
+ allowZeroPrice: string;
328
+ allowZeroPriceHint: string;
329
+ changesVs: string;
330
+ noPrevious: string;
331
+ noChanges: string;
332
+ regressionTitle: string;
333
+ regressionBody: string;
334
+ regressionBodySuffix: string;
335
+ forceRegressive: string;
336
+ confirm: string;
337
+ confirmRegressive: string;
338
+ };
339
+ }>;
340
+
341
+ declare const commonMessages: Record<SaLocale, {
342
+ save: string;
343
+ cancel: string;
344
+ close: string;
345
+ delete: string;
346
+ edit: string;
347
+ create: string;
348
+ back: string;
349
+ next: string;
350
+ confirm: string;
351
+ apply: string;
352
+ retry: string;
353
+ reload: string;
354
+ search: string;
355
+ reset: string;
356
+ copy: string;
357
+ copied: string;
358
+ show: string;
359
+ hide: string;
360
+ open: string;
361
+ loading: string;
362
+ saving: string;
363
+ loadingData: string;
364
+ error: string;
365
+ errorLoadFailed: string;
366
+ errorSaveFailed: string;
367
+ yes: string;
368
+ no: string;
369
+ none: string;
370
+ all: string;
371
+ total: string;
372
+ unknown: string;
373
+ active: string;
374
+ inactive: string;
375
+ archived: string;
376
+ draft: string;
377
+ published: string;
378
+ name: string;
379
+ description: string;
380
+ status: string;
381
+ actions: string;
382
+ details: string;
383
+ date: string;
384
+ from: string;
385
+ to: string;
386
+ createdAt: string;
387
+ updatedAt: string;
388
+ required: string;
389
+ optional: string;
390
+ note: string;
391
+ notes: string;
392
+ warning: string;
393
+ warnings: string;
394
+ perMonth: string;
395
+ perYear: string;
396
+ monthly: string;
397
+ yearly: string;
398
+ discard: string;
399
+ remove: string;
400
+ type: string;
401
+ icon: string;
402
+ validity: string;
403
+ general: string;
404
+ sortOrder: string;
405
+ expired: string;
406
+ unlimited: string;
407
+ both: string;
408
+ createFailed: string;
409
+ noChanges: string;
410
+ }>;
411
+
412
+ declare const dashboardMessages: Record<SaLocale, {
413
+ title: string;
414
+ emptyKpiCards: string;
415
+ shortcutsTitle: string;
416
+ deltaVsPreviousPeriod: string;
417
+ }>;
418
+
419
+ declare const discoveryMessages: Record<SaLocale, {
420
+ title: string;
421
+ subtitleLead: string;
422
+ subtitleEmphasis: string;
423
+ subtitleTail: string;
424
+ runDiscovery: string;
425
+ lastScan: string;
426
+ notScannedYet: string;
427
+ tabFeatures: string;
428
+ tabQuotas: string;
429
+ searchPlaceholder: string;
430
+ statusFilterAll: string;
431
+ noFeaturesMatchFilters: string;
432
+ noQuotasDeclared: string;
433
+ orphansTitle: string;
434
+ noOwner: string;
435
+ owner: string;
436
+ unit: string;
437
+ replacedBy: string;
438
+ replaces: string;
439
+ reapproveEmphasis: string;
440
+ errorDiscoveryHttp: string;
441
+ errorRescanHttp: string;
442
+ errorCatalogHttp: string;
443
+ capList: {
444
+ orphanFeature: string;
445
+ removedFromCode: string;
446
+ };
447
+ kpi: {
448
+ featuresTotal: string;
449
+ featuresTotalSub: string;
450
+ approved: string;
451
+ approvedSub: string;
452
+ pending: string;
453
+ pendingSub: string;
454
+ outdated: string;
455
+ outdatedSub: string;
456
+ orphans: string;
457
+ };
458
+ orphanHint: {
459
+ before: string;
460
+ middle: string;
461
+ after: string;
462
+ };
463
+ statusLabels: {
464
+ pending: string;
465
+ approved: string;
466
+ outdated: string;
467
+ obsolete: string;
468
+ };
469
+ statusHints: {
470
+ pending: string;
471
+ approved: string;
472
+ outdated: string;
473
+ obsolete: string;
474
+ };
475
+ reviewActions: {
476
+ approve: string;
477
+ revoke: string;
478
+ reapprove: string;
479
+ reactivate: string;
480
+ markOutdated: string;
481
+ markObsolete: string;
482
+ };
483
+ feature: {
484
+ newCaps: string;
485
+ deprecatedCaps: string;
486
+ capabilityOne: string;
487
+ capabilityMany: string;
488
+ outdatedBanner: string;
489
+ obsoleteBanner: string;
490
+ tabBaseData: string;
491
+ tabTranslations: string;
492
+ settings: string;
493
+ iconLabel: string;
494
+ iconPlaceholder: string;
495
+ tierLabel: string;
496
+ codeCapabilities: string;
497
+ codeCapabilitiesCount: string;
498
+ };
499
+ quota: {
500
+ usageProvider: string;
501
+ usageProviderMissing: string;
502
+ noUsageProviderWarning: string;
503
+ outdatedBanner: string;
504
+ };
505
+ caps: {
506
+ emptyHint: string;
507
+ flagNew: string;
508
+ flagExperimental: string;
509
+ flagDeprecated: string;
510
+ flagRemoved: string;
511
+ implementedAt: string;
512
+ };
513
+ trans: {
514
+ sourceBadge: string;
515
+ fieldLabel: string;
516
+ unitFromCode: string;
517
+ copyFromDefault: string;
518
+ copyFromDefaultHint: string;
519
+ fallbackPlaceholder: string;
520
+ noOtherLocales: string;
521
+ };
522
+ }>;
523
+
524
+ declare const emailMessages: Record<SaLocale, {
525
+ sender: string;
526
+ recipient: string;
527
+ errorAction: string;
528
+ provider: {
529
+ title: string;
530
+ subtitle: string;
531
+ sendTestMail: string;
532
+ dialogCreateTitle: string;
533
+ dialogEditTitle: string;
534
+ fieldSmtpHost: string;
535
+ fieldSmtpPort: string;
536
+ fieldSmtpUser: string;
537
+ fieldSmtpPassword: string;
538
+ fieldSmtpPasswordEdit: string;
539
+ fieldEncryption: string;
540
+ fieldFromEmail: string;
541
+ fieldFromName: string;
542
+ fieldSubject: string;
543
+ send: string;
544
+ statusActive: string;
545
+ statusInactive: string;
546
+ columnHost: string;
547
+ columnEncryption: string;
548
+ deleteDialogTitle: string;
549
+ deleteDialogMessage: string;
550
+ mfaCreate: string;
551
+ mfaSave: string;
552
+ mfaDelete: string;
553
+ saved: string;
554
+ deleted: string;
555
+ };
556
+ history: {
557
+ title: string;
558
+ subtitle: string;
559
+ searchLabel: string;
560
+ statusSent: string;
561
+ statusFailed: string;
562
+ statusPending: string;
563
+ statusBounced: string;
564
+ resend: string;
565
+ removeFromHistory: string;
566
+ empty: string;
567
+ columnSubject: string;
568
+ columnCreatedAt: string;
569
+ columnSentAt: string;
570
+ detailFromTo: string;
571
+ detailTimestamps: string;
572
+ noContent: string;
573
+ smtpResponse: string;
574
+ confirmRemoveTitle: string;
575
+ confirmRemoveMessage: string;
576
+ mfaResend: string;
577
+ mfaRemove: string;
578
+ sendFailed: string;
579
+ resendSuccess: string;
580
+ removeSuccess: string;
581
+ };
582
+ }>;
583
+
584
+ declare const marketingMessages: Record<SaLocale, {
585
+ topFeatures: string;
586
+ tabs: {
587
+ preview: string;
588
+ admin: string;
589
+ promos: string;
590
+ };
591
+ header: {
592
+ title: string;
593
+ subtitle: string;
594
+ localesLabel: string;
595
+ defaultLocale: string;
596
+ deactivateLocale: string;
597
+ addLocale: string;
598
+ refresh: string;
599
+ };
600
+ page: {
601
+ loading: string;
602
+ emptyPlansBefore: string;
603
+ emptyPlansLink: string;
604
+ emptyPlansAfter: string;
605
+ };
606
+ cta: {
607
+ contact: string;
608
+ trial: string;
609
+ choosePlan: string;
610
+ };
611
+ preview: {
612
+ eyebrow: string;
613
+ hero: string;
614
+ sub: string;
615
+ emptyBefore: string;
616
+ emptyAfter: string;
617
+ priceOnRequest: string;
618
+ perMonth: string;
619
+ regularPrice: string;
620
+ orYearly: string;
621
+ trialNote: string;
622
+ promoBadgeFallback: string;
623
+ noTopFeatures: string;
624
+ };
625
+ admin: {
626
+ subtitle: string;
627
+ colPlan: string;
628
+ colVisible: string;
629
+ colBadge: string;
630
+ colPriority: string;
631
+ colHighlight: string;
632
+ versionTabsLabel: string;
633
+ versionTitle: string;
634
+ versionValidFromUnknown: string;
635
+ noLiveVersion: string;
636
+ hidden: string;
637
+ featured: string;
638
+ live: string;
639
+ expandTitle: string;
640
+ planNameLabel: string;
641
+ planNameLocked: string;
642
+ planNameSourceValue: string;
643
+ planNameFallbackHint: string;
644
+ teaserLabel: string;
645
+ teaserPlaceholder: string;
646
+ teaserHint: string;
647
+ trialLabel: string;
648
+ trialOn: string;
649
+ trialOff: string;
650
+ trialDaysUnit: string;
651
+ ctaAutoHint: string;
652
+ ctaOverrideLabel: string;
653
+ ctaOverrideHint: string;
654
+ topFeatureCount: string;
655
+ featureLabelPlaceholder: string;
656
+ featureStrongPlaceholder: string;
657
+ moveUp: string;
658
+ moveDown: string;
659
+ topFeaturesEmpty: string;
660
+ addCustomFeature: string;
661
+ suggestionsLabel: string;
662
+ addSuggestionTitle: string;
663
+ };
664
+ promotionsTab: {
665
+ title: string;
666
+ subtitle: string;
667
+ add: string;
668
+ timelineHead: string;
669
+ today: string;
670
+ emptyBefore: string;
671
+ emptyAfter: string;
672
+ statusActive: string;
673
+ statusScheduled: string;
674
+ statusExpired: string;
675
+ noPlans: string;
676
+ cycleMonthlyShort: string;
677
+ cycleYearlyShort: string;
678
+ cycleBothShort: string;
679
+ onlyPrefix: string;
680
+ chipIntro: string;
681
+ chipFreeMonths: string;
682
+ newPromotionLabel: string;
683
+ internalLabelLabel: string;
684
+ typePercent: string;
685
+ typeAmount: string;
686
+ typeIntro: string;
687
+ typeFreeMonths: string;
688
+ valueLabel: string;
689
+ percentUnit: string;
690
+ amountUnit: string;
691
+ introForPrefix: string;
692
+ introMonthsUnit: string;
693
+ introPriceUnit: string;
694
+ freeMonthsPrefix: string;
695
+ freeMonthsUnit: string;
696
+ billingCycleLabel: string;
697
+ priorityLabel: string;
698
+ appliesToLabel: string;
699
+ localeRestrictionLabel: string;
700
+ allLocales: string;
701
+ translationsLabel: string;
702
+ badgePlaceholder: string;
703
+ fineprintPlaceholder: string;
704
+ colorLabel: string;
705
+ delete: string;
706
+ deleteConfirm: string;
707
+ };
708
+ errors: {
709
+ projectionsApi: string;
710
+ };
711
+ }>;
712
+
713
+ type NavNamespace = {
714
+ readonly pages: Record<StandardPageKey, string>;
715
+ readonly sections: {
716
+ readonly overview: string;
717
+ readonly catalog: string;
718
+ readonly customers: string;
719
+ readonly system: string;
720
+ };
721
+ };
722
+ declare const navMessages: Record<SaLocale, NavNamespace>;
723
+
724
+ declare const pilotsMessages: Record<SaLocale, {
725
+ title: string;
726
+ subtitleCount: string;
727
+ createAction: string;
728
+ list: {
729
+ tileExpiring: string;
730
+ tileExpiringHint: string;
731
+ reviewSoonBanner: string;
732
+ columnSlug: string;
733
+ columnPlan: string;
734
+ columnNote: string;
735
+ columnGrantedBy: string;
736
+ columnEndsAt: string;
737
+ actionExtend: string;
738
+ actionRevoke: string;
739
+ actionFailed: string;
740
+ createdNotice: string;
741
+ createdPasswordCaption: string;
742
+ updatedNotice: string;
743
+ updatedChangedCaption: string;
744
+ extendTitle: string;
745
+ extendMessage: string;
746
+ extendMfaDescription: string;
747
+ extendSuccess: string;
748
+ revokeTitle: string;
749
+ revokeMessage: string;
750
+ revokeMfaDescription: string;
751
+ revokeSuccess: string;
752
+ };
753
+ copyDefaults: {
754
+ tenantSubtitle: string;
755
+ tenantNameLabel: string;
756
+ tenantNamePlaceholder: string;
757
+ slugPlaceholder: string;
758
+ adminEmailPlaceholder: string;
759
+ notePlaceholder: string;
760
+ };
761
+ form: {
762
+ slugLabel: string;
763
+ slugHint: string;
764
+ slugConflict: string;
765
+ planLabel: string;
766
+ endsAtLabel: string;
767
+ endsAtClearTitle: string;
768
+ preset30Days: string;
769
+ preset90Days: string;
770
+ preset6Months: string;
771
+ preset1Year: string;
772
+ noteLabel: string;
773
+ noteHint: string;
774
+ };
775
+ createDialog: {
776
+ title: string;
777
+ subtitle: string;
778
+ sectionTenant: string;
779
+ legalFormLabel: string;
780
+ legalFormPlaceholder: string;
781
+ vatIdLabel: string;
782
+ vatIdHint: string;
783
+ vatIdPlaceholder: string;
784
+ sectionAdmin: string;
785
+ sectionAdminSub: string;
786
+ emailLabel: string;
787
+ emailInvalid: string;
788
+ firstNameLabel: string;
789
+ firstNamePlaceholder: string;
790
+ lastNameLabel: string;
791
+ lastNamePlaceholder: string;
792
+ initialPasswordLabel: string;
793
+ initialPasswordHint: string;
794
+ initialPasswordPlaceholder: string;
795
+ sectionPilot: string;
796
+ sectionPilotSub: string;
797
+ invitationHint: string;
798
+ mfaDescription: string;
799
+ };
800
+ editDialog: {
801
+ title: string;
802
+ sectionPlanSub: string;
803
+ planNotInCatalog: string;
804
+ sectionEndDate: string;
805
+ sectionEndDateSub: string;
806
+ clearDateTitle: string;
807
+ sectionNote: string;
808
+ sectionNoteSub: string;
809
+ mfaDescription: string;
810
+ };
811
+ mfa: {
812
+ invalidCode: string;
813
+ invalidOrNotSetUp: string;
814
+ notSetUp: string;
815
+ };
816
+ }>;
817
+
818
+ declare const planDetailMessages: Record<SaLocale, {
819
+ header: {
820
+ noDescription: string;
821
+ nameEditHint: string;
822
+ editNameTitle: string;
823
+ editNameAria: string;
824
+ deletePlan: string;
825
+ deletePlanTitle: string;
826
+ clonePlan: string;
827
+ newDraftVersion: string;
828
+ publishDraft: string;
829
+ backToList: string;
830
+ viewInCatalog: string;
831
+ draftAlreadyOpen: string;
832
+ };
833
+ kpis: {
834
+ activeVersion: string;
835
+ activeSince: string;
836
+ noPublishedVersion: string;
837
+ tenantImpact: string;
838
+ tenantsOnPlan: string;
839
+ versions: string;
840
+ versionsSummary: string;
841
+ versionsSummaryWithDrafts: string;
842
+ openDraft: string;
843
+ noDraft: string;
844
+ readyToEdit: string;
845
+ noOpenDraft: string;
846
+ createNewDraft: string;
847
+ };
848
+ versions: {
849
+ title: string;
850
+ subtitle: string;
851
+ newDraftButton: string;
852
+ timelineHint: string;
853
+ timelineSelectTitle: string;
854
+ timelineDraftSuffix: string;
855
+ timelineNow: string;
856
+ colVersion: string;
857
+ colValidity: string;
858
+ colPrice: string;
859
+ colPricing: string;
860
+ colEffect: string;
861
+ colImpact: string;
862
+ colChangeNote: string;
863
+ colChangeNoteShort: string;
864
+ validityPlanned: string;
865
+ validityActive: string;
866
+ validityHistoric: string;
867
+ perMonthUnit: string;
868
+ perYearUnit: string;
869
+ tenants: string;
870
+ preActiveChip: string;
871
+ preActiveTitle: string;
872
+ publishDraftTitle: string;
873
+ editFutureVersionTitle: string;
874
+ editDraftTitle: string;
875
+ endsAtTitle: string;
876
+ endsAtBadge: string;
877
+ changeEndDateAction: string;
878
+ terminateAction: string;
879
+ empty: string;
880
+ publish: string;
881
+ viewDiff: string;
882
+ updatedToday: string;
883
+ updatedDaysAgo: string;
884
+ updatedMonthsAgo: string;
885
+ updatedYearsAgo: string;
886
+ };
887
+ diff: {
888
+ title: string;
889
+ titleCompare: string;
890
+ titleComponents: string;
891
+ subOnPublish: string;
892
+ subChanges: string;
893
+ subInitialVersion: string;
894
+ noComparison: string;
895
+ kindAdded: string;
896
+ kindRemoved: string;
897
+ kindChanged: string;
898
+ tagNew: string;
899
+ tagRemoved: string;
900
+ tagChanged: string;
901
+ emptyText: string;
902
+ noChangesDetected: string;
903
+ noComponentsTitle: string;
904
+ noComponentsText: string;
905
+ sectionFeatures: string;
906
+ sectionQuotas: string;
907
+ sectionBundles: string;
908
+ sectionLabelFeatures: string;
909
+ sectionLabelQuotas: string;
910
+ sectionLabelPrice: string;
911
+ priceLabel: string;
912
+ priceYearMonthLabel: string;
913
+ pricePair: string;
914
+ };
915
+ impact: {
916
+ subtitle: string;
917
+ autoMigrate: string;
918
+ needReview: string;
919
+ conflict: string;
920
+ stateAuto: string;
921
+ stateReview: string;
922
+ stateConflict: string;
923
+ };
924
+ auditLog: {
925
+ title: string;
926
+ subtitle: string;
927
+ loading: string;
928
+ today: string;
929
+ };
930
+ terminateDialog: {
931
+ titleChangeEndDate: string;
932
+ titleTerminate: string;
933
+ bodyPlanPrefix: string;
934
+ bodyExpiry: string;
935
+ bodyWithout: string;
936
+ bodySuffix: string;
937
+ dateLabel: string;
938
+ submit: string;
939
+ errorDateNotFuture: string;
940
+ errorVersionNotLive: string;
941
+ errorNotImplemented: string;
942
+ errorFailed: string;
943
+ };
944
+ }>;
945
+
946
+ declare const planEditorMessages: Record<SaLocale, {
947
+ perMonthShort: string;
948
+ perYearShort: string;
949
+ sections: {
950
+ features: string;
951
+ quotas: string;
952
+ bundles: string;
953
+ price: string;
954
+ };
955
+ editor: {
956
+ yearlySavings: string;
957
+ validFromError: string;
958
+ validUntilHintFallback: string;
959
+ checklistPrices: string;
960
+ checklistChangeNote: string;
961
+ checklistValidity: string;
962
+ checklistValidFromOrder: string;
963
+ checklistMinFeature: string;
964
+ checklistTenantImpact: string;
965
+ diffPriceLabel: string;
966
+ diffTagAdded: string;
967
+ diffTagRemoved: string;
968
+ diffTagChanged: string;
969
+ };
970
+ header: {
971
+ planKicker: string;
972
+ editDraft: string;
973
+ newVersion: string;
974
+ draftChip: string;
975
+ supersedeNoteBefore: string;
976
+ supersedeNoteAfter: string;
977
+ noPredecessorHint: string;
978
+ diffButton: string;
979
+ saveButton: string;
980
+ };
981
+ componentPool: {
982
+ title: string;
983
+ subtitle: string;
984
+ searchPlaceholder: string;
985
+ featureCount: string;
986
+ emptyFeatures: string;
987
+ emptyQuotas: string;
988
+ emptyBundles: string;
989
+ };
990
+ basket: {
991
+ title: string;
992
+ subtitle: string;
993
+ changeCount: string;
994
+ validFrom: string;
995
+ until: string;
996
+ inPublicCatalog: string;
997
+ changeNotePlaceholder: string;
998
+ assignedCount: string;
999
+ bundleFeatureCount: string;
1000
+ removeQuota: string;
1001
+ removeFeature: string;
1002
+ removeBundle: string;
1003
+ emptyQuotas: string;
1004
+ emptyFeatures: string;
1005
+ emptyBundles: string;
1006
+ };
1007
+ catalogPreview: {
1008
+ title: string;
1009
+ subtitle: string;
1010
+ desktop: string;
1011
+ mobile: string;
1012
+ eyebrow: string;
1013
+ descriptionFallback: string;
1014
+ perMonth: string;
1015
+ yearlyAlternative: string;
1016
+ cta: string;
1017
+ included: string;
1018
+ emptyContents: string;
1019
+ footerLabel: string;
1020
+ footerChangeNote: string;
1021
+ checklistTitle: string;
1022
+ checklistCount: string;
1023
+ };
1024
+ diffDialog: {
1025
+ title: string;
1026
+ subtitle: string;
1027
+ empty: string;
1028
+ };
1029
+ }>;
1030
+
1031
+ declare const planVersionsMessages: Record<SaLocale, {
1032
+ compareEnd: string;
1033
+ page: {
1034
+ loadingCatalog: string;
1035
+ noAuditLoader: string;
1036
+ };
1037
+ header: {
1038
+ modeList: string;
1039
+ modeMatrix: string;
1040
+ modeAudit: string;
1041
+ publishedOn: string;
1042
+ openDrafts: string;
1043
+ regressionOne: string;
1044
+ regressionMany: string;
1045
+ startPublishFlow: string;
1046
+ compareModeHint: string;
1047
+ };
1048
+ status: {
1049
+ draft: string;
1050
+ active: string;
1051
+ archived: string;
1052
+ };
1053
+ timeline: {
1054
+ title: string;
1055
+ snapshotCount: string;
1056
+ noOpenDrafts: string;
1057
+ openCount: string;
1058
+ unknown: string;
1059
+ compareHint: string;
1060
+ };
1061
+ list: {
1062
+ kpiPlans: string;
1063
+ kpiSelfService: string;
1064
+ kpiOfTotal: string;
1065
+ kpiFeaturesTotal: string;
1066
+ missingPlansLabel: string;
1067
+ missingPlansHint: string;
1068
+ createDraftFor: string;
1069
+ colPlan: string;
1070
+ colPriceNet: string;
1071
+ colFeatures: string;
1072
+ draftHintLabel: string;
1073
+ draftHintBefore: string;
1074
+ draftHintEditButton: string;
1075
+ draftHintMiddle: string;
1076
+ draftHintPublishFlow: string;
1077
+ draftHintAfter: string;
1078
+ };
1079
+ matrix: {
1080
+ colFeature: string;
1081
+ perMonthShort: string;
1082
+ fallbackGroup: string;
1083
+ };
1084
+ diff: {
1085
+ legend: string;
1086
+ plansChanged: string;
1087
+ regressions: string;
1088
+ sectionPlans: string;
1089
+ changeCountOne: string;
1090
+ changeCountMany: string;
1091
+ };
1092
+ diffPreview: {
1093
+ empty: string;
1094
+ improvement: string;
1095
+ regression: string;
1096
+ neutral: string;
1097
+ };
1098
+ diffFields: {
1099
+ featuresAdded: string;
1100
+ featuresRemoved: string;
1101
+ maxUsers: string;
1102
+ maxStorageGb: string;
1103
+ monthlyNet: string;
1104
+ yearlyNet: string;
1105
+ unitSize: string;
1106
+ };
1107
+ audit: {
1108
+ title: string;
1109
+ eventCount: string;
1110
+ loading: string;
1111
+ empty: string;
1112
+ actionPlanPublished: string;
1113
+ actionPlanDraftCreated: string;
1114
+ actionPlanDraftUpdated: string;
1115
+ actionPlanDraftDeleted: string;
1116
+ actionCatalogPublished: string;
1117
+ detailRegression: string;
1118
+ detailFieldsChanged: string;
1119
+ };
1120
+ bulkPublish: {
1121
+ changeNoteRequired: string;
1122
+ };
1123
+ format: {
1124
+ priceIndividual: string;
1125
+ today: string;
1126
+ yesterday: string;
1127
+ daysAgo: string;
1128
+ weeksAgoOne: string;
1129
+ weeksAgoMany: string;
1130
+ monthsAgo: string;
1131
+ yearsAgoOne: string;
1132
+ yearsAgoMany: string;
1133
+ };
1134
+ catalog: {
1135
+ draftsLabel: string;
1136
+ draftsTitleEmpty: string;
1137
+ draftsTitleOne: string;
1138
+ draftsTitleMany: string;
1139
+ draftsDescriptionEmpty: string;
1140
+ draftsDescription: string;
1141
+ activeLabel: string;
1142
+ activeTitle: string;
1143
+ activeDescription: string;
1144
+ publishEvent: string;
1145
+ publishEventSingle: string;
1146
+ publishEventMultiple: string;
1147
+ reconstructedSnapshot: string;
1148
+ };
1149
+ }>;
1150
+
1151
+ declare const plansMessages: Record<SaLocale, {
1152
+ page: {
1153
+ loading: string;
1154
+ toastPlanCreated: string;
1155
+ toastDraftSaved: string;
1156
+ toastPlanPublished: string;
1157
+ toastPlanDeleted: string;
1158
+ toastDraftDiscarded: string;
1159
+ toastVersionTerminated: string;
1160
+ errorSessionExpiredSave: string;
1161
+ errorStrictMode: string;
1162
+ errorStrictModeFallback: string;
1163
+ errorDraftRegression: string;
1164
+ errorSaveFailedHttp: string;
1165
+ errorSaveFailedDetail: string;
1166
+ errorSaveFailedConsole: string;
1167
+ errorPlanHasPublishedVersions: string;
1168
+ errorPlanHasDrafts: string;
1169
+ errorHardDeleteNotImplemented: string;
1170
+ errorPlanAlreadyRemoved: string;
1171
+ errorOperationFailedHttp: string;
1172
+ errorOperationFailedDetail: string;
1173
+ errorVersionAlreadyPublished: string;
1174
+ errorDiscardNotImplemented: string;
1175
+ errorDraftAlreadyRemoved: string;
1176
+ errorDiscardFailedHttp: string;
1177
+ errorDiscardFailedDetail: string;
1178
+ errorSessionExpiredPublish: string;
1179
+ errorPublishRegression: string;
1180
+ errorValidFromRequired: string;
1181
+ errorValidFromNotAfterPrevious: string;
1182
+ errorZeroPrice: string;
1183
+ errorPublishFailedHttp: string;
1184
+ };
1185
+ regressionFields: {
1186
+ monthlyNet: string;
1187
+ yearlyNet: string;
1188
+ featuresRemoved: string;
1189
+ featuresAdded: string;
1190
+ quotasLowered: string;
1191
+ quotasRaised: string;
1192
+ bundlesRemoved: string;
1193
+ bundlesAdded: string;
1194
+ };
1195
+ list: {
1196
+ title: string;
1197
+ summary: string;
1198
+ matrixView: string;
1199
+ newPlan: string;
1200
+ searchPlaceholder: string;
1201
+ sortedBy: string;
1202
+ columnPlan: string;
1203
+ columnVersion: string;
1204
+ columnPrice: string;
1205
+ columnTenants: string;
1206
+ emptyNoPlans: string;
1207
+ emptyNoMatch: string;
1208
+ badgeNew: string;
1209
+ chipLive: string;
1210
+ chipPrivate: string;
1211
+ chipNoLive: string;
1212
+ chipScheduled: string;
1213
+ chipDraft: string;
1214
+ validFrom: string;
1215
+ since: string;
1216
+ from: string;
1217
+ until: string;
1218
+ priceFree: string;
1219
+ perMonthShort: string;
1220
+ perYearShort: string;
1221
+ tenantCount: string;
1222
+ noChangeNote: string;
1223
+ actionDeleteBlocked: string;
1224
+ actionDeletePlan: string;
1225
+ actionClonePlan: string;
1226
+ actionNewVersion: string;
1227
+ actionOpenPlan: string;
1228
+ actionDiscardDraft: string;
1229
+ actionEditDraft: string;
1230
+ actionOpenInCockpit: string;
1231
+ };
1232
+ matrix: {
1233
+ title: string;
1234
+ summary: string;
1235
+ catalogPreview: string;
1236
+ createPlan: string;
1237
+ createPlanSub: string;
1238
+ componentColumn: string;
1239
+ chipLiveVersion: string;
1240
+ chipNoLive: string;
1241
+ chipDraftVersion: string;
1242
+ priceFree: string;
1243
+ perMonthShort: string;
1244
+ perYearShort: string;
1245
+ priceDraftMarker: string;
1246
+ noPrices: string;
1247
+ tenantCount: string;
1248
+ validFrom: string;
1249
+ inCatalog: string;
1250
+ private: string;
1251
+ clonePlan: string;
1252
+ groupQuotas: string;
1253
+ groupFeatures: string;
1254
+ groupBundles: string;
1255
+ baseBadge: string;
1256
+ legendIncluded: string;
1257
+ legendNotIncluded: string;
1258
+ legendLoading: string;
1259
+ };
1260
+ review: {
1261
+ title: string;
1262
+ subtitleLead: string;
1263
+ subtitleTail: string;
1264
+ saving: string;
1265
+ saveAsDraft: string;
1266
+ publishBlocked: string;
1267
+ publishing: string;
1268
+ publishVersion: string;
1269
+ cardMasterData: string;
1270
+ labelPlanKey: string;
1271
+ labelDisplayName: string;
1272
+ missing: string;
1273
+ cardPricing: string;
1274
+ labelValidFrom: string;
1275
+ labelValidUntil: string;
1276
+ missingRequiredOnPublish: string;
1277
+ unlimited: string;
1278
+ labelMonthlyPrice: string;
1279
+ labelYearlyPrice: string;
1280
+ labelPublicCatalog: string;
1281
+ visibleInCatalog: string;
1282
+ hiddenFromCatalog: string;
1283
+ priceFree: string;
1284
+ cardComponents: string;
1285
+ componentQuotas: string;
1286
+ componentFeatures: string;
1287
+ componentBundles: string;
1288
+ componentEmpty: string;
1289
+ cardChangeNote: string;
1290
+ changeNoteHint: string;
1291
+ changeNoteMissing: string;
1292
+ cardChecklist: string;
1293
+ checkPlanKey: string;
1294
+ checkDisplayName: string;
1295
+ checkQuota: string;
1296
+ checkFeature: string;
1297
+ checkValidFrom: string;
1298
+ checkValidFromAfterPredecessor: string;
1299
+ checkValidFromAfterPrevious: string;
1300
+ checkChangeNote: string;
1301
+ cardRegression: string;
1302
+ regressionHint: string;
1303
+ forceRegressive: string;
1304
+ cardZeroPrice: string;
1305
+ zeroPriceHint: string;
1306
+ allowZeroPrice: string;
1307
+ cardTenantImpact: string;
1308
+ impactNone: string;
1309
+ impactSome: string;
1310
+ };
1311
+ createDialog: {
1312
+ title: string;
1313
+ subtitle: string;
1314
+ labelPlanKey: string;
1315
+ placeholderPlanKey: string;
1316
+ hintPlanKey: string;
1317
+ labelDisplayName: string;
1318
+ placeholderDisplayName: string;
1319
+ hintDisplayName: string;
1320
+ placeholderDescription: string;
1321
+ labelBasis: string;
1322
+ emptyPlan: string;
1323
+ emptyPlanHint: string;
1324
+ cloneOf: string;
1325
+ counts: string;
1326
+ errorKeyFormat: string;
1327
+ errorKeyExists: string;
1328
+ submitting: string;
1329
+ submit: string;
1330
+ };
1331
+ publishDialog: {
1332
+ title: string;
1333
+ bodyLead: string;
1334
+ bodyTail: string;
1335
+ supersededNoteLead: string;
1336
+ supersededNoteTail: string;
1337
+ forceRegressive: string;
1338
+ allowZeroPrice: string;
1339
+ regressiveChanges: string;
1340
+ confirm: string;
1341
+ };
1342
+ archiveDialog: {
1343
+ title: string;
1344
+ bodyLead: string;
1345
+ bodyVerb: string;
1346
+ bodyEmphasis: string;
1347
+ bodyTail: string;
1348
+ contractProtectionNote: string;
1349
+ };
1350
+ discardDialog: {
1351
+ title: string;
1352
+ bodyLead: string;
1353
+ bodyTail: string;
1354
+ };
1355
+ bundleOverview: {
1356
+ title: string;
1357
+ empty: string;
1358
+ contains: string;
1359
+ compatibleWith: string;
1360
+ allPlans: string;
1361
+ };
1362
+ cycle: {
1363
+ ariaLabel: string;
1364
+ };
1365
+ }>;
1366
+
1367
+ declare const promosMessages: Record<SaLocale, {
1368
+ title: string;
1369
+ createAction: string;
1370
+ apiErrorHttpStatus: string;
1371
+ list: {
1372
+ searchLabel: string;
1373
+ tileScheduled: string;
1374
+ tilePaused: string;
1375
+ hintRedeemable: string;
1376
+ hintStartsLater: string;
1377
+ columnCode: string;
1378
+ columnValue: string;
1379
+ columnRedemptions: string;
1380
+ columnCampaign: string;
1381
+ columnValidUntil: string;
1382
+ actionPause: string;
1383
+ actionActivate: string;
1384
+ deleteTitle: string;
1385
+ deleteMessage: string;
1386
+ deletedNotice: string;
1387
+ createdNotice: string;
1388
+ updatedNotice: string;
1389
+ actionFailed: string;
1390
+ };
1391
+ detail: {
1392
+ promoCodeLabel: string;
1393
+ configLabel: string;
1394
+ statsLabel: string;
1395
+ redemptionsLabel: string;
1396
+ emptyLabel: string;
1397
+ loading: string;
1398
+ columnTenant: string;
1399
+ columnStart: string;
1400
+ columnEnd: string;
1401
+ columnRedeemedAt: string;
1402
+ };
1403
+ form: {
1404
+ sectionCodeDiscount: string;
1405
+ sectionValidity: string;
1406
+ sectionCampaign: string;
1407
+ advancedToggle: string;
1408
+ codeLabel: string;
1409
+ codePlaceholder: string;
1410
+ codeRandom: string;
1411
+ codeHint: string;
1412
+ codeStableHint: string;
1413
+ valueTypeLabel: string;
1414
+ valueTypePercent: string;
1415
+ valueTypePercentSub: string;
1416
+ valueTypeAbsolute: string;
1417
+ valueTypeAbsoluteSub: string;
1418
+ valuePercentLabel: string;
1419
+ valueAbsoluteLabel: string;
1420
+ plansLabel: string;
1421
+ plansHint: string;
1422
+ durationLabel: string;
1423
+ durationOnce: string;
1424
+ durationMonths: string;
1425
+ durationBillingCycles: string;
1426
+ durationMonthsPlaceholder: string;
1427
+ durationCyclesPlaceholder: string;
1428
+ maxRedemptionsLabel: string;
1429
+ maxRedemptionsPlaceholder: string;
1430
+ maxRedemptionsHintCreate: string;
1431
+ maxRedemptionsHintEdit: string;
1432
+ validFromLabel: string;
1433
+ validUntilLabel: string;
1434
+ statusPaused: string;
1435
+ statusHint: string;
1436
+ campaignLabel: string;
1437
+ campaignPlaceholder: string;
1438
+ campaignHint: string;
1439
+ noteLabel: string;
1440
+ notePlaceholder: string;
1441
+ billingCycleLabel: string;
1442
+ minAmountLabel: string;
1443
+ minAmountPlaceholder: string;
1444
+ firstTimeOnly: string;
1445
+ allowZeroInvoice: string;
1446
+ revenueAccountLabel: string;
1447
+ revenueAccountPlaceholder: string;
1448
+ previewEyebrow: string;
1449
+ previewOnce: string;
1450
+ previewMonths: string;
1451
+ previewCycles: string;
1452
+ previewAllPlans: string;
1453
+ previewNoPlanFilter: string;
1454
+ previewMax: string;
1455
+ };
1456
+ createDialog: {
1457
+ title: string;
1458
+ subtitle: string;
1459
+ };
1460
+ editDialog: {
1461
+ title: string;
1462
+ redemptionsSoFar: string;
1463
+ };
1464
+ }>;
1465
+
1466
+ declare const shellMessages: Record<SaLocale, {
1467
+ emailLabel: string;
1468
+ passwordLabel: string;
1469
+ invalidEmail: string;
1470
+ header: {
1471
+ productionWarning: string;
1472
+ subtitle: string;
1473
+ roleBadge: string;
1474
+ logout: string;
1475
+ };
1476
+ drawer: {
1477
+ docs: string;
1478
+ };
1479
+ manifestError: {
1480
+ title: string;
1481
+ lead: string;
1482
+ detailLabel: string;
1483
+ };
1484
+ login: {
1485
+ signIn: string;
1486
+ passwordRequired: string;
1487
+ devHintLabel: string;
1488
+ errorBadCredentials: string;
1489
+ errorNotSuperAdmin: string;
1490
+ errorFailed: string;
1491
+ };
1492
+ setup: {
1493
+ title: string;
1494
+ subtitle: string;
1495
+ tokenHintBefore: string;
1496
+ tokenHintAfter: string;
1497
+ tokenLabel: string;
1498
+ tokenRequired: string;
1499
+ passwordLabel: string;
1500
+ passwordHint: string;
1501
+ passwordMinLength: string;
1502
+ submit: string;
1503
+ mfaIntroBefore: string;
1504
+ mfaIntroAfter: string;
1505
+ generatedPasswordLabel: string;
1506
+ qrAlt: string;
1507
+ qrHint: string;
1508
+ manualSecretLabel: string;
1509
+ otpauthSummary: string;
1510
+ codeLabel: string;
1511
+ codeInvalid: string;
1512
+ confirmMfa: string;
1513
+ skip: string;
1514
+ doneHint: string;
1515
+ toLogin: string;
1516
+ errorSetupDisabled: string;
1517
+ errorInvalidToken: string;
1518
+ errorAlreadyDone: string;
1519
+ errorInvalidEmail: string;
1520
+ errorEmailExists: string;
1521
+ errorHttp: string;
1522
+ errorFailed: string;
1523
+ errorCodeInvalid: string;
1524
+ errorConfirmFailed: string;
1525
+ };
1526
+ mfa: {
1527
+ title: string;
1528
+ defaultDescription: string;
1529
+ codeLabel: string;
1530
+ invalidCode: string;
1531
+ };
1532
+ }>;
1533
+
1534
+ declare const tenantsMessages: Record<SaLocale, {
1535
+ tenant: string;
1536
+ plan: string;
1537
+ list: {
1538
+ title: string;
1539
+ searchPlaceholder: string;
1540
+ allStatuses: string;
1541
+ allPlans: string;
1542
+ columnUsage: string;
1543
+ columnCreatedAt: string;
1544
+ suspended: string;
1545
+ empty: string;
1546
+ pagination: string;
1547
+ };
1548
+ detail: {
1549
+ backToList: string;
1550
+ slug: string;
1551
+ masterData: string;
1552
+ pilot: string;
1553
+ trialEnd: string;
1554
+ pilotEnd: string;
1555
+ vatId: string;
1556
+ usage: string;
1557
+ users: string;
1558
+ userEmail: string;
1559
+ userRole: string;
1560
+ userLastLogin: string;
1561
+ };
1562
+ actions: {
1563
+ confirmTitle: string;
1564
+ leadAction: string;
1565
+ leadForTenant: string;
1566
+ typedSlugHint: string;
1567
+ slugMismatch: string;
1568
+ extendUntilLabel: string;
1569
+ dateFutureError: string;
1570
+ reasonLabel: string;
1571
+ reasonError: string;
1572
+ mfaDescription: string;
1573
+ successNotify: string;
1574
+ };
1575
+ subscriptions: {
1576
+ title: string;
1577
+ columnEndsAt: string;
1578
+ };
1579
+ draft: {
1580
+ planModules: string;
1581
+ };
1582
+ }>;
1583
+
1584
+ declare const usersMessages: Record<SaLocale, {
1585
+ title: string;
1586
+ filterQuery: string;
1587
+ filterTenant: string;
1588
+ statusActive: string;
1589
+ statusDeactivated: string;
1590
+ badgePending: string;
1591
+ tenantFallback: string;
1592
+ reasonPrompt: string;
1593
+ errorAction: string;
1594
+ tiles: {
1595
+ blocked: string;
1596
+ neverLoggedIn: string;
1597
+ superAdmins: string;
1598
+ };
1599
+ columns: {
1600
+ email: string;
1601
+ tenant: string;
1602
+ role: string;
1603
+ lastLogin: string;
1604
+ };
1605
+ resetPassword: {
1606
+ action: string;
1607
+ dialogTitle: string;
1608
+ mfaDescription: string;
1609
+ otpTitle: string;
1610
+ otpMessage: string;
1611
+ otpAcknowledge: string;
1612
+ success: string;
1613
+ };
1614
+ deactivate: {
1615
+ action: string;
1616
+ dialogTitle: string;
1617
+ mfaDescription: string;
1618
+ success: string;
1619
+ };
1620
+ }>;
1621
+
1622
+ /** Complete platform catalog for one locale, keyed by namespace. */
1623
+ type SaMessages = {
1624
+ readonly common: (typeof commonMessages)['de'];
1625
+ readonly nav: (typeof navMessages)['de'];
1626
+ readonly shell: (typeof shellMessages)['de'];
1627
+ readonly dashboard: (typeof dashboardMessages)['de'];
1628
+ readonly tenants: (typeof tenantsMessages)['de'];
1629
+ readonly users: (typeof usersMessages)['de'];
1630
+ readonly audit: (typeof auditMessages)['de'];
1631
+ readonly plans: (typeof plansMessages)['de'];
1632
+ readonly planDetail: (typeof planDetailMessages)['de'];
1633
+ readonly planEditor: (typeof planEditorMessages)['de'];
1634
+ readonly planVersions: (typeof planVersionsMessages)['de'];
1635
+ readonly bundles: (typeof bundlesMessages)['de'];
1636
+ readonly discovery: (typeof discoveryMessages)['de'];
1637
+ readonly marketing: (typeof marketingMessages)['de'];
1638
+ readonly promos: (typeof promosMessages)['de'];
1639
+ readonly pilots: (typeof pilotsMessages)['de'];
1640
+ readonly email: (typeof emailMessages)['de'];
1641
+ };
1642
+ /** Shape of app-side string overrides (deep partial of the catalog). */
1643
+ type SaMessagesOverrides = PartialMessages<SaMessages>;
1644
+ /** Complete, immutable message catalogs per locale. */
1645
+ declare const SA_MESSAGES: Record<SaLocale, SaMessages>;
1646
+ /**
1647
+ * Returns the platform catalog for `locale`, optionally overlaid with
1648
+ * app-side overrides.
1649
+ */
1650
+ declare function resolveMessages(locale: SaLocale, overrides?: SaMessagesOverrides): SaMessages;
1651
+
1652
+ export { type ActionHandler as A, DEFAULT_SA_LOCALE as D, type HttpClient as H, type KvStore as K, type MessageTree as M, type PartialMessages as P, type ResolvedAction as R, type SaLocale as S, type TranslationOf as T, type SaMessages as a, type SaMessagesOverrides as b, ActionRegistry as c, ActionDefNotInManifestError as d, type HttpResponse as e, MissingHandlerError as f, SA_INTL_LOCALES as g, SA_LOCALES as h, SA_MESSAGES as i, defaultHttpClient as j, defaultKvStore as k, defineMessages as l, mergeMessages as m, resolveMessages as r };