@saasicat/ui-vue 0.4.0 → 0.6.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 (214) hide show
  1. package/README.md +64 -4
  2. package/dist/chunk-A3W2N26K.js +714 -0
  3. package/dist/chunk-QZOSDCNP.js +98 -0
  4. package/dist/chunk-X5SQ5HMB.js +3231 -0
  5. package/dist/client/index.cjs +3988 -0
  6. package/dist/client/index.d.cts +321 -0
  7. package/dist/client/index.d.ts +321 -0
  8. package/dist/client/index.js +70 -0
  9. package/dist/index.cjs +4446 -1249
  10. package/dist/index.d.cts +297 -888
  11. package/dist/index.d.ts +297 -888
  12. package/dist/index.js +609 -1348
  13. package/dist/messages-7b0P8W75.d.cts +1652 -0
  14. package/dist/messages-7b0P8W75.d.ts +1652 -0
  15. package/dist/quasar/index.cjs +3340 -0
  16. package/dist/quasar/index.d.cts +95 -0
  17. package/dist/quasar/index.d.ts +95 -0
  18. package/dist/quasar/index.js +96 -0
  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/use-super-admin-i18n-B3v3-SWZ.d.ts +210 -0
  22. package/dist/use-super-admin-i18n-DMktRVEt.d.cts +210 -0
  23. package/package.json +23 -3
  24. package/src/{action-registry.ts → client/action-registry.ts} +4 -4
  25. package/src/{batch-column-fetcher.ts → client/batch-column-fetcher.ts} +4 -4
  26. package/src/{boot-loader.ts → 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 +27 -0
  51. package/src/{manifest-loader.ts → client/manifest-loader.ts} +4 -4
  52. package/src/{nav-builder.ts → client/nav-builder.ts} +44 -51
  53. package/src/{plan-versions-catalog.ts → client/plan-versions-catalog.ts} +42 -30
  54. package/src/components/BundleVersionPublishDialog.vue +35 -24
  55. package/src/components/FeatureGate.vue +1 -1
  56. package/src/components/MarketingPromotionsTab.vue +112 -59
  57. package/src/components/MfaPromptDialog.vue +11 -11
  58. package/src/components/TenantActionConfirmDialog.vue +19 -17
  59. package/src/components/VersionDiffPreview.vue +72 -43
  60. package/src/components/bundle-editor/BundleCreatePanel.vue +76 -63
  61. package/src/components/bundle-editor/BundleFeaturesEditor.vue +13 -6
  62. package/src/components/bundle-editor/BundlePlanCompatPicker.vue +19 -14
  63. package/src/components/bundle-editor/BundleQuotasEditor.vue +7 -4
  64. package/src/components/bundle-editor/BundleStatusBanner.vue +36 -19
  65. package/src/components/bundle-editor/BundleVersionInlineEditor.vue +51 -35
  66. package/src/components/bundle-editor/BundleVersionStrip.vue +24 -12
  67. package/src/components/bundle-editor/bundle-version-status.ts +29 -29
  68. package/src/components/dialogs/PilotCreateDialog.vue +58 -63
  69. package/src/components/dialogs/PilotEditDialog.vue +40 -34
  70. package/src/components/dialogs/PromoCodeCreateDialog.vue +89 -63
  71. package/src/components/dialogs/PromoCodeEditDialog.vue +98 -66
  72. package/src/components/dialogs/types.ts +3 -13
  73. package/src/components/plan/PlanCycleToggle.vue +21 -10
  74. package/src/components/plan/PlanGrid.vue +2 -2
  75. package/src/components/plan/PriceSummary.vue +1 -1
  76. package/src/components/plan/PromoCodeInput.vue +1 -1
  77. package/src/components/plan/PublicBundleGrid.vue +1 -1
  78. package/src/components/plan-cockpit/PlanCockpit.vue +34 -15
  79. package/src/components/plan-cockpit/PlanCockpitAuditLog.vue +13 -6
  80. package/src/components/plan-cockpit/PlanCockpitDiffPanel.vue +18 -9
  81. package/src/components/plan-cockpit/PlanCockpitHeader.vue +9 -6
  82. package/src/components/plan-cockpit/PlanCockpitImpactPanel.vue +24 -11
  83. package/src/components/plan-cockpit/PlanCockpitKpis.vue +28 -17
  84. package/src/components/plan-cockpit/PlanCockpitVersions.vue +50 -25
  85. package/src/components/plan-create-dialog/PlanCreateDialog.vue +45 -35
  86. package/src/components/plan-detail/PlanAuditLog.vue +11 -6
  87. package/src/components/plan-detail/PlanDetail.vue +21 -23
  88. package/src/components/plan-detail/PlanDetailHeader.vue +20 -11
  89. package/src/components/plan-detail/PlanDetailKpis.vue +30 -17
  90. package/src/components/plan-detail/PlanTerminateDialog.vue +22 -9
  91. package/src/components/plan-detail/PlanVersionDiffPanel.vue +61 -27
  92. package/src/components/plan-detail/PlanVersionsPanel.vue +71 -36
  93. package/src/components/plan-list/PlanList.vue +99 -57
  94. package/src/components/plan-matrix/PlanMatrix.vue +85 -38
  95. package/src/components/plan-review/PlanReview.vue +105 -80
  96. package/src/components/plan-version-editor/PlanCatalogPreview.vue +43 -20
  97. package/src/components/plan-version-editor/PlanComponentPool.vue +15 -7
  98. package/src/components/plan-version-editor/PlanVersionBasket.vue +45 -24
  99. package/src/components/plan-version-editor/PlanVersionDiffDialog.vue +8 -7
  100. package/src/components/plan-version-editor/PlanVersionEditor.vue +74 -40
  101. package/src/components/plan-version-editor/PlanVersionEditorHeader.vue +24 -12
  102. package/src/index.ts +82 -79
  103. package/src/pages-standard/AdminLayout.vue +43 -18
  104. package/src/pages-standard/AdminManifestErrorPage.vue +10 -10
  105. package/src/pages-standard/AuditPage.vue +58 -19
  106. package/src/pages-standard/BundlesPage.vue +29 -18
  107. package/src/pages-standard/DashboardPage.vue +31 -17
  108. package/src/pages-standard/DiscoveryPage.vue +40 -28
  109. package/src/pages-standard/EmailHistoryPage.vue +98 -69
  110. package/src/pages-standard/MarketingCatalogPage.vue +40 -21
  111. package/src/pages-standard/PilotsPage.vue +64 -52
  112. package/src/pages-standard/PlanVersionsPage.vue +9 -5
  113. package/src/pages-standard/PlansPage.vue +91 -59
  114. package/src/pages-standard/PlatformEmailPage.vue +120 -53
  115. package/src/pages-standard/PromoCodeDetailPage.vue +66 -63
  116. package/src/pages-standard/PromoCodesPage.vue +51 -54
  117. package/src/pages-standard/SubscriptionsPage.vue +14 -9
  118. package/src/pages-standard/SuperAdminLoginPage.vue +19 -16
  119. package/src/pages-standard/SuperAdminSetupWizard.vue +53 -49
  120. package/src/pages-standard/TenantDetailPage.vue +54 -40
  121. package/src/pages-standard/TenantsPage.vue +57 -44
  122. package/src/pages-standard/UsersPage.vue +70 -52
  123. package/src/pages-standard/bundles-page/BundleAccordionList.vue +20 -8
  124. package/src/pages-standard/bundles-page/BundleDetailPanel.vue +28 -18
  125. package/src/pages-standard/bundles-page/BundlesFilterBar.vue +4 -1
  126. package/src/pages-standard/bundles-page/BundlesHeader.vue +9 -8
  127. package/src/pages-standard/bundles-page/BundlesKpis.vue +29 -11
  128. package/src/pages-standard/discovery-page/CatalogEntryTransPanel.vue +20 -8
  129. package/src/pages-standard/discovery-page/DiscoveryCapList.vue +5 -3
  130. package/src/pages-standard/discovery-page/DiscoveryFeatureCard.vue +43 -24
  131. package/src/pages-standard/discovery-page/DiscoveryHeader.vue +7 -4
  132. package/src/pages-standard/discovery-page/DiscoveryKpis.vue +28 -15
  133. package/src/pages-standard/discovery-page/DiscoveryQuotaCard.vue +20 -10
  134. package/src/pages-standard/discovery-page/DiscoveryStatusControl.vue +9 -6
  135. package/src/pages-standard/discovery-page/discovery-ui.ts +40 -52
  136. package/src/pages-standard/marketing-catalog/MarketingCatalogAdmin.vue +81 -49
  137. package/src/pages-standard/marketing-catalog/MarketingCatalogHeader.vue +13 -10
  138. package/src/pages-standard/marketing-catalog/MarketingCatalogPreview.vue +24 -20
  139. package/src/pages-standard/marketing-catalog/MarketingCatalogToolbar.vue +6 -3
  140. package/src/pages-standard/plan-versions/PlanDiffCard.vue +16 -6
  141. package/src/pages-standard/plan-versions/PlanVersionHeader.vue +42 -26
  142. package/src/pages-standard/plan-versions/PlanVersionsAudit.vue +46 -27
  143. package/src/pages-standard/plan-versions/PlanVersionsDiff.vue +8 -6
  144. package/src/pages-standard/plan-versions/PlanVersionsList.vue +40 -17
  145. package/src/pages-standard/plan-versions/PlanVersionsMatrix.vue +1 -1
  146. package/src/pages-standard/plan-versions/PlanVersionsTimeline.vue +25 -13
  147. package/src/pages-standard/plan-versions/format.ts +33 -17
  148. package/src/pages-standard/plans-page/PlanArchiveDialog.vue +12 -8
  149. package/src/pages-standard/plans-page/PlanBundleOverview.vue +15 -6
  150. package/src/pages-standard/plans-page/PlanDiscardDraftDialog.vue +18 -7
  151. package/src/pages-standard/plans-page/PlanPublishDialog.vue +23 -12
  152. package/src/pages-standard/tenants/format.ts +3 -2
  153. package/src/pages-tenant/MySubscriptionBundlesPage.vue +73 -38
  154. package/src/pages-tenant/OnboardingConfigurator.vue +3 -3
  155. package/src/pages-tenant/PackageSnapshotPanel.vue +1 -1
  156. package/src/pages-tenant/PlanChangeWizard.vue +10 -6
  157. package/src/pages-tenant/TenantPlanSection.vue +20 -16
  158. package/src/pages-tenant/default-i18n.ts +217 -1
  159. package/src/pages-tenant/tenant-plan-section/BundlePreviewDialog.vue +9 -7
  160. package/src/pages-tenant/tenant-plan-section/TenantBundleStore.vue +11 -12
  161. package/src/pages-tenant/tenant-plan-section/TenantFeatureMatrix.vue +4 -1
  162. package/src/pages-tenant/tenant-plan-section/TenantPlanCardHeader.vue +1 -1
  163. package/src/pages-tenant/tenant-plan-section/TenantUsageGrid.vue +1 -1
  164. package/src/quasar/create-super-admin-app.ts +192 -0
  165. package/src/quasar/index.ts +11 -0
  166. package/src/quasar/notify.ts +30 -0
  167. package/src/testing-e2e/admin-pages-suite.ts +14 -11
  168. package/src/{manifest-store-factory.ts → vue/manifest-store-factory.ts} +1 -1
  169. package/src/{platform-loaders.ts → vue/platform-loaders.ts} +4 -4
  170. package/src/{project-page-host.ts → vue/project-page-host.ts} +6 -4
  171. package/src/{create-super-admin-app.ts → vue/super-admin-context.ts} +20 -139
  172. package/src/vue/ui-notify.ts +30 -0
  173. package/src/{use-actions.ts → vue/use-actions.ts} +1 -1
  174. package/src/{use-api-list.ts → vue/use-api-list.ts} +1 -1
  175. package/src/{use-audit-entries.ts → vue/use-audit-entries.ts} +3 -3
  176. package/src/{use-batch-columns.ts → vue/use-batch-columns.ts} +1 -1
  177. package/src/{use-bulk-publish.ts → vue/use-bulk-publish.ts} +7 -5
  178. package/src/{use-bundle-versions-map.ts → vue/use-bundle-versions-map.ts} +7 -5
  179. package/src/{use-bundles.ts → vue/use-bundles.ts} +14 -14
  180. package/src/{use-catalog-entries.ts → vue/use-catalog-entries.ts} +14 -11
  181. package/src/{use-discovery.ts → vue/use-discovery.ts} +9 -6
  182. package/src/{use-entitlement.ts → vue/use-entitlement.ts} +4 -4
  183. package/src/{use-live-plan-versions.ts → vue/use-live-plan-versions.ts} +5 -5
  184. package/src/{use-manifest.ts → vue/use-manifest.ts} +1 -1
  185. package/src/{use-marketing-projections.ts → vue/use-marketing-projections.ts} +10 -7
  186. package/src/{use-nav.ts → vue/use-nav.ts} +9 -3
  187. package/src/{use-plan-editor.ts → vue/use-plan-editor.ts} +2 -2
  188. package/src/{use-plan-versions.ts → vue/use-plan-versions.ts} +3 -3
  189. package/src/{use-plans.ts → vue/use-plans.ts} +13 -13
  190. package/src/{use-platform-tenant-actions.ts → vue/use-platform-tenant-actions.ts} +9 -6
  191. package/src/{use-promotions.ts → vue/use-promotions.ts} +10 -11
  192. package/src/{use-public-boot.ts → vue/use-public-boot.ts} +1 -1
  193. package/src/{use-subscription-draft.ts → vue/use-subscription-draft.ts} +2 -3
  194. package/src/{use-super-admin-context.ts → vue/use-super-admin-context.ts} +5 -5
  195. package/src/vue/use-super-admin-i18n.ts +82 -0
  196. package/src/{use-tenant-action-flow.ts → vue/use-tenant-action-flow.ts} +12 -7
  197. package/src/{use-tenant-billing-catalog.ts → vue/use-tenant-billing-catalog.ts} +2 -2
  198. package/src/{use-tenant-billing.ts → vue/use-tenant-billing.ts} +2 -2
  199. package/src/{use-tenant-manifest.ts → vue/use-tenant-manifest.ts} +2 -4
  200. package/src/{use-tenant-subscription-bundles.ts → vue/use-tenant-subscription-bundles.ts} +5 -5
  201. package/src/{use-tenants.ts → vue/use-tenants.ts} +3 -3
  202. package/dist/testing-e2e/admin-pages-suite.d.cts +0 -37
  203. package/dist/testing-e2e/admin-pages-suite.d.ts +0 -37
  204. package/src/components/BusinessTypeVersionEditorDialog.vue +0 -417
  205. package/src/components/BusinessTypeVersionPublishDialog.vue +0 -258
  206. package/src/pages-standard/BusinessTypesPage.vue +0 -662
  207. package/src/pages-standard/plan-versions/VersionDiffPreview.vue +0 -167
  208. package/src/use-business-types.ts +0 -269
  209. /package/src/{http-json.ts → client/http-json.ts} +0 -0
  210. /package/src/{types.ts → client/types.ts} +0 -0
  211. /package/src/{version.ts → client/version.ts} +0 -0
  212. /package/src/{create-admin-routes.ts → vue/create-admin-routes.ts} +0 -0
  213. /package/src/{entitlement-provider.ts → vue/entitlement-provider.ts} +0 -0
  214. /package/src/{feature-router-guard.ts → vue/feature-router-guard.ts} +0 -0
@@ -0,0 +1,202 @@
1
+ import { defineMessages } from '../define.js';
2
+
3
+ export const promosMessages = defineMessages(
4
+ {
5
+ title: 'Promo-Codes',
6
+ createAction: 'Promo-Code anlegen',
7
+ apiErrorHttpStatus: 'Promotions-API antwortete mit HTTP {status}',
8
+ list: {
9
+ searchLabel: 'Suche (Code)',
10
+ tileScheduled: 'Geplant',
11
+ tilePaused: 'Pausiert',
12
+ hintRedeemable: 'einlösbar',
13
+ hintStartsLater: 'startet künftig',
14
+ columnCode: 'Code',
15
+ columnValue: 'Wert',
16
+ columnRedemptions: 'Einlösungen',
17
+ columnCampaign: 'Kampagne',
18
+ columnValidUntil: 'Gültig bis',
19
+ actionPause: 'Pausieren',
20
+ actionActivate: 'Aktivieren',
21
+ deleteTitle: 'Promo-Code "{code}" löschen',
22
+ deleteMessage: 'Soft-Delete via Status=EXPIRED. Bestehende Redemptions bleiben.',
23
+ deletedNotice: '{code} gelöscht.',
24
+ createdNotice: 'Promo-Code angelegt.',
25
+ updatedNotice: 'Promo-Code aktualisiert.',
26
+ actionFailed: 'Aktion fehlgeschlagen',
27
+ },
28
+ detail: {
29
+ promoCodeLabel: 'Promo-Code',
30
+ configLabel: 'Konfiguration',
31
+ statsLabel: 'Statistik',
32
+ redemptionsLabel: 'Einlösungen',
33
+ emptyLabel: 'Code nicht gefunden.',
34
+ loading: 'wird geladen…',
35
+ columnTenant: 'Tenant',
36
+ columnStart: 'Start',
37
+ columnEnd: 'Ende',
38
+ columnRedeemedAt: 'Eingelöst',
39
+ },
40
+ form: {
41
+ sectionCodeDiscount: 'Code & Rabatt',
42
+ sectionValidity: 'Gültigkeit & Laufzeit',
43
+ sectionCampaign: 'Kampagne & Notizen',
44
+ advancedToggle: 'Erweiterte Einschränkungen',
45
+ codeLabel: 'Code',
46
+ codePlaceholder: 'z. B. WELCOME10',
47
+ codeRandom: 'Zufall',
48
+ codeHint: 'Großbuchstaben, Zahlen, „-" und „_" · nach Anlage stabil',
49
+ codeStableHint: 'Nach Anlage stabil.',
50
+ valueTypeLabel: 'Rabatt-Typ',
51
+ valueTypePercent: 'Prozent',
52
+ valueTypePercentSub: '−x %',
53
+ valueTypeAbsolute: 'Fester €',
54
+ valueTypeAbsoluteSub: '−x €',
55
+ valuePercentLabel: 'Rabatt in %',
56
+ valueAbsoluteLabel: 'Rabatt in €',
57
+ plansLabel: 'Anwendbar auf Pläne',
58
+ plansHint: 'Leer = alle Pläne ({count} ausgewählt)',
59
+ durationLabel: 'Laufzeit des Rabatts',
60
+ durationOnce: 'Einmalig',
61
+ durationMonths: 'N Monate',
62
+ durationBillingCycles: 'N Perioden',
63
+ durationMonthsPlaceholder: 'Monate',
64
+ durationCyclesPlaceholder: 'Perioden',
65
+ maxRedemptionsLabel: 'Max. Einlösungen',
66
+ maxRedemptionsPlaceholder: 'leer = ∞',
67
+ maxRedemptionsHintCreate: 'Leerlassen für unbegrenzt',
68
+ maxRedemptionsHintEdit:
69
+ 'Nur erhöhbar, nicht senkbar (bestehende Einlösungen bleiben gültig).',
70
+ validFromLabel: 'Gültig ab',
71
+ validUntilLabel: 'Gültig bis',
72
+ statusPaused: 'Pausiert',
73
+ statusHint: 'Bestehende Redemptions bleiben unverändert.',
74
+ campaignLabel: 'Kampagne (optional)',
75
+ campaignPlaceholder: 'z. B. Frühjahrs-Aktion 2026',
76
+ campaignHint: 'Gruppiert mehrere Codes optisch',
77
+ noteLabel: 'Notiz (intern)',
78
+ notePlaceholder: 'Kontext, Quelle, Sales-Bezug — wird nicht an Kunden ausgespielt.',
79
+ billingCycleLabel: 'Nur für Abrechnungs-Zyklus',
80
+ minAmountLabel: 'Mindest-Plan-Betrag (€ brutto)',
81
+ minAmountPlaceholder: 'leer = keine Schwelle',
82
+ firstTimeOnly: 'Nur Neukunden',
83
+ allowZeroInvoice: '0-€-Rechnung zulassen',
84
+ revenueAccountLabel: 'Erlös-Minderungs-Konto (Buchhaltung)',
85
+ revenueAccountPlaceholder: 'z. B. 8736',
86
+ previewEyebrow: 'Vorschau im Catalog',
87
+ previewOnce: 'einmalig',
88
+ previewMonths: '{count} Monate',
89
+ previewCycles: '{count} Perioden',
90
+ previewAllPlans: 'alle Pläne',
91
+ previewNoPlanFilter: 'kein Plan-Filter',
92
+ previewMax: 'max. {count}',
93
+ },
94
+ createDialog: {
95
+ title: 'Neuer Promo-Code',
96
+ subtitle: 'Code, Rabatt-Logik, Laufzeit und Plan-Zuordnung festlegen.',
97
+ },
98
+ editDialog: {
99
+ title: 'Promo-Code bearbeiten',
100
+ redemptionsSoFar: '{count} Einlösungen bisher',
101
+ },
102
+ },
103
+ {
104
+ title: 'Promo codes',
105
+ createAction: 'Create promo code',
106
+ apiErrorHttpStatus: 'Promotions API responded with HTTP {status}',
107
+ list: {
108
+ searchLabel: 'Search (code)',
109
+ tileScheduled: 'Scheduled',
110
+ tilePaused: 'Paused',
111
+ hintRedeemable: 'redeemable',
112
+ hintStartsLater: 'starts later',
113
+ columnCode: 'Code',
114
+ columnValue: 'Value',
115
+ columnRedemptions: 'Redemptions',
116
+ columnCampaign: 'Campaign',
117
+ columnValidUntil: 'Valid until',
118
+ actionPause: 'Pause',
119
+ actionActivate: 'Activate',
120
+ deleteTitle: 'Delete promo code "{code}"',
121
+ deleteMessage: 'Soft delete via status=EXPIRED. Existing redemptions remain.',
122
+ deletedNotice: '{code} deleted.',
123
+ createdNotice: 'Promo code created.',
124
+ updatedNotice: 'Promo code updated.',
125
+ actionFailed: 'Action failed',
126
+ },
127
+ detail: {
128
+ promoCodeLabel: 'Promo code',
129
+ configLabel: 'Configuration',
130
+ statsLabel: 'Statistics',
131
+ redemptionsLabel: 'Redemptions',
132
+ emptyLabel: 'Code not found.',
133
+ loading: 'loading…',
134
+ columnTenant: 'Tenant',
135
+ columnStart: 'Start',
136
+ columnEnd: 'End',
137
+ columnRedeemedAt: 'Redeemed',
138
+ },
139
+ form: {
140
+ sectionCodeDiscount: 'Code & discount',
141
+ sectionValidity: 'Validity & duration',
142
+ sectionCampaign: 'Campaign & notes',
143
+ advancedToggle: 'Advanced restrictions',
144
+ codeLabel: 'Code',
145
+ codePlaceholder: 'e.g. WELCOME10',
146
+ codeRandom: 'Random',
147
+ codeHint: 'Uppercase letters, digits, "-" and "_" · stable after creation',
148
+ codeStableHint: 'Stable after creation.',
149
+ valueTypeLabel: 'Discount type',
150
+ valueTypePercent: 'Percent',
151
+ valueTypePercentSub: '−x %',
152
+ valueTypeAbsolute: 'Fixed €',
153
+ valueTypeAbsoluteSub: '−x €',
154
+ valuePercentLabel: 'Discount in %',
155
+ valueAbsoluteLabel: 'Discount in €',
156
+ plansLabel: 'Applies to plans',
157
+ plansHint: 'Empty = all plans ({count} selected)',
158
+ durationLabel: 'Discount duration',
159
+ durationOnce: 'Once',
160
+ durationMonths: 'N months',
161
+ durationBillingCycles: 'N billing cycles',
162
+ durationMonthsPlaceholder: 'Months',
163
+ durationCyclesPlaceholder: 'Billing cycles',
164
+ maxRedemptionsLabel: 'Max. redemptions',
165
+ maxRedemptionsPlaceholder: 'empty = ∞',
166
+ maxRedemptionsHintCreate: 'Leave empty for unlimited',
167
+ maxRedemptionsHintEdit:
168
+ 'Can only be raised, not lowered (existing redemptions stay valid).',
169
+ validFromLabel: 'Valid from',
170
+ validUntilLabel: 'Valid until',
171
+ statusPaused: 'Paused',
172
+ statusHint: 'Existing redemptions remain unchanged.',
173
+ campaignLabel: 'Campaign (optional)',
174
+ campaignPlaceholder: 'e.g. Spring campaign 2026',
175
+ campaignHint: 'Groups several codes visually',
176
+ noteLabel: 'Note (internal)',
177
+ notePlaceholder: 'Context, source, sales reference — not shown to customers.',
178
+ billingCycleLabel: 'Only for billing cycle',
179
+ minAmountLabel: 'Minimum plan amount (€ gross)',
180
+ minAmountPlaceholder: 'empty = no threshold',
181
+ firstTimeOnly: 'New customers only',
182
+ allowZeroInvoice: 'Allow €0 invoice',
183
+ revenueAccountLabel: 'Revenue deduction account (accounting)',
184
+ revenueAccountPlaceholder: 'e.g. 8736',
185
+ previewEyebrow: 'Preview in the catalog',
186
+ previewOnce: 'once',
187
+ previewMonths: '{count} months',
188
+ previewCycles: '{count} billing cycles',
189
+ previewAllPlans: 'all plans',
190
+ previewNoPlanFilter: 'no plan filter',
191
+ previewMax: 'max. {count}',
192
+ },
193
+ createDialog: {
194
+ title: 'New promo code',
195
+ subtitle: 'Define code, discount logic, duration and plan assignment.',
196
+ },
197
+ editDialog: {
198
+ title: 'Edit promo code',
199
+ redemptionsSoFar: '{count} redemptions so far',
200
+ },
201
+ },
202
+ );
@@ -0,0 +1,145 @@
1
+ import { defineMessages } from '../define.js';
2
+
3
+ export const shellMessages = defineMessages(
4
+ {
5
+ emailLabel: 'E-Mail',
6
+ passwordLabel: 'Passwort',
7
+ invalidEmail: 'Bitte gültige E-Mail',
8
+ header: {
9
+ productionWarning: 'Aktionen wirken sich sofort auf alle Mandanten aus.',
10
+ subtitle: 'SuperAdmin · Plattform-Verwaltung',
11
+ roleBadge: 'SUPER ADMIN',
12
+ logout: 'Abmelden',
13
+ },
14
+ drawer: {
15
+ docs: 'Doku öffnen',
16
+ },
17
+ manifestError: {
18
+ title: 'Admin-Manifest nicht erreichbar',
19
+ lead: 'Das Plattform-Manifest konnte nicht geladen werden. Ohne Manifest sind Sidebar, Capabilities und Action-Buttons nicht zuverlässig — die UI würde sonst falsche oder unerreichbare Buttons rendern. Der Router hat dich deshalb hierher geschickt (fail-closed).',
20
+ detailLabel: 'Detail:',
21
+ },
22
+ login: {
23
+ signIn: 'Anmelden',
24
+ passwordRequired: 'Passwort ist Pflicht',
25
+ devHintLabel: 'Test-Account:',
26
+ errorBadCredentials: 'E-Mail oder Passwort falsch.',
27
+ errorNotSuperAdmin:
28
+ 'Dieser Account hat keine SUPER_ADMIN-Rolle. Bitte Tenant-Frontend nutzen.',
29
+ errorFailed: 'Anmeldung fehlgeschlagen.',
30
+ },
31
+ setup: {
32
+ // U+00AD soft hyphen — allows the compound to break inside the card.
33
+ title: 'Erst­einrichtung',
34
+ subtitle: '{brand} · ersten SuperAdmin anlegen',
35
+ tokenHintBefore: 'Es existiert noch kein SuperAdmin. Gib das vom Betreiber gesetzte',
36
+ tokenHintAfter: 'ein und lege den ersten Account an.',
37
+ tokenLabel: 'Setup-Token',
38
+ tokenRequired: 'Setup-Token ist Pflicht',
39
+ passwordLabel: 'Passwort (leer = generieren)',
40
+ passwordHint: 'Mindestens 8 Zeichen, oder leer lassen für ein generiertes Passwort.',
41
+ passwordMinLength: 'Mindestens 8 Zeichen',
42
+ submit: 'SuperAdmin anlegen',
43
+ mfaIntroBefore: 'Account',
44
+ mfaIntroAfter: 'angelegt. Richte jetzt die Zwei-Faktor-Authentisierung (TOTP) ein.',
45
+ generatedPasswordLabel: 'Generiertes Passwort (einmalig sichern)',
46
+ qrAlt: 'MFA-QR-Code',
47
+ qrHint: 'Mit der Authenticator-App scannen',
48
+ manualSecretLabel: 'In Authenticator-App als „Schlüssel manuell eingeben"',
49
+ otpauthSummary: 'otpauth-URI (für QR-Generator)',
50
+ codeLabel: '6-stelliger Code aus der App',
51
+ codeInvalid: '6-stelliger Code',
52
+ confirmMfa: 'MFA bestätigen',
53
+ skip: 'Überspringen — Code beim ersten Login eingeben',
54
+ doneHint: 'Einrichtung abgeschlossen. Melde dich jetzt mit dem neuen SuperAdmin an.',
55
+ toLogin: 'Zum Login',
56
+ errorSetupDisabled: 'Setup ist serverseitig deaktiviert (SETUP_TOKEN nicht gesetzt).',
57
+ errorInvalidToken: 'Setup-Token ungültig.',
58
+ errorAlreadyDone: 'Es existiert bereits ein SuperAdmin — Setup ist abgeschlossen.',
59
+ errorInvalidEmail: 'Ungültige E-Mail-Adresse.',
60
+ errorEmailExists:
61
+ 'Diese E-Mail ist bereits vergeben. Wähle eine andere oder hebe den bestehenden User per CLI/DB zum SUPER_ADMIN an.',
62
+ errorHttp: 'Fehler (HTTP {status}).',
63
+ errorFailed: 'Setup fehlgeschlagen.',
64
+ errorCodeInvalid: 'Code ungültig — bitte erneut versuchen.',
65
+ errorConfirmFailed: 'Bestätigung fehlgeschlagen.',
66
+ },
67
+ mfa: {
68
+ title: 'Multi-Faktor-Bestätigung',
69
+ defaultDescription:
70
+ 'Diese Aktion ist sicherheitskritisch. Bitte 6-stelligen TOTP-Code aus Authenticator eingeben.',
71
+ codeLabel: 'TOTP-Code',
72
+ invalidCode: 'TOTP-Code ungültig oder MFA nicht eingerichtet.',
73
+ },
74
+ },
75
+ {
76
+ emailLabel: 'Email',
77
+ passwordLabel: 'Password',
78
+ invalidEmail: 'Please enter a valid email',
79
+ header: {
80
+ productionWarning: 'Actions take effect immediately for all tenants.',
81
+ subtitle: 'SuperAdmin · Platform administration',
82
+ roleBadge: 'SUPER ADMIN',
83
+ logout: 'Sign out',
84
+ },
85
+ drawer: {
86
+ docs: 'Open documentation',
87
+ },
88
+ manifestError: {
89
+ title: 'Admin manifest unavailable',
90
+ lead: 'The platform manifest could not be loaded. Without the manifest, sidebar, capabilities and action buttons are not reliable — the UI would render wrong or unreachable buttons. That is why the router sent you here (fail-closed).',
91
+ detailLabel: 'Detail:',
92
+ },
93
+ login: {
94
+ signIn: 'Sign in',
95
+ passwordRequired: 'Password is required',
96
+ devHintLabel: 'Test account:',
97
+ errorBadCredentials: 'Email or password is incorrect.',
98
+ errorNotSuperAdmin:
99
+ 'This account does not have the SUPER_ADMIN role. Please use the tenant frontend.',
100
+ errorFailed: 'Sign-in failed.',
101
+ },
102
+ setup: {
103
+ title: 'Initial setup',
104
+ subtitle: '{brand} · create the first SuperAdmin',
105
+ tokenHintBefore: 'No SuperAdmin exists yet. Enter the',
106
+ tokenHintAfter: 'set by the operator and create the first account.',
107
+ tokenLabel: 'Setup token',
108
+ tokenRequired: 'Setup token is required',
109
+ passwordLabel: 'Password (empty = generate)',
110
+ passwordHint: 'At least 8 characters, or leave empty for a generated password.',
111
+ passwordMinLength: 'At least 8 characters',
112
+ submit: 'Create SuperAdmin',
113
+ mfaIntroBefore: 'Account',
114
+ mfaIntroAfter: 'created. Now set up two-factor authentication (TOTP).',
115
+ generatedPasswordLabel: 'Generated password (store it now, shown only once)',
116
+ qrAlt: 'MFA QR code',
117
+ qrHint: 'Scan with your authenticator app',
118
+ manualSecretLabel: 'In your authenticator app via "Enter key manually"',
119
+ otpauthSummary: 'otpauth URI (for a QR generator)',
120
+ codeLabel: '6-digit code from the app',
121
+ codeInvalid: '6-digit code',
122
+ confirmMfa: 'Confirm MFA',
123
+ skip: 'Skip — enter the code at first sign-in',
124
+ doneHint: 'Setup complete. Sign in now with the new SuperAdmin.',
125
+ toLogin: 'Go to sign-in',
126
+ errorSetupDisabled: 'Setup is disabled on the server (SETUP_TOKEN not set).',
127
+ errorInvalidToken: 'Setup token invalid.',
128
+ errorAlreadyDone: 'A SuperAdmin already exists — setup is complete.',
129
+ errorInvalidEmail: 'Invalid email address.',
130
+ errorEmailExists:
131
+ 'This email is already taken. Choose another one or promote the existing user to SUPER_ADMIN via CLI/DB.',
132
+ errorHttp: 'Error (HTTP {status}).',
133
+ errorFailed: 'Setup failed.',
134
+ errorCodeInvalid: 'Code invalid — please try again.',
135
+ errorConfirmFailed: 'Confirmation failed.',
136
+ },
137
+ mfa: {
138
+ title: 'Multi-factor confirmation',
139
+ defaultDescription:
140
+ 'This action is security-critical. Please enter the 6-digit TOTP code from your authenticator.',
141
+ codeLabel: 'TOTP code',
142
+ invalidCode: 'TOTP code invalid or MFA not set up.',
143
+ },
144
+ },
145
+ );
@@ -0,0 +1,104 @@
1
+ import { defineMessages } from '../define.js';
2
+
3
+ export const tenantsMessages = defineMessages(
4
+ {
5
+ // Terms shared by the list, the detail page and the subscriptions table.
6
+ tenant: 'Mandant',
7
+ plan: 'Plan',
8
+ list: {
9
+ title: 'Mandanten',
10
+ searchPlaceholder: 'Slug oder Name …',
11
+ allStatuses: 'Alle Aktiv-Status',
12
+ allPlans: 'Alle Pläne',
13
+ columnUsage: 'Verbrauch',
14
+ columnCreatedAt: 'Angelegt',
15
+ suspended: 'Suspendiert',
16
+ empty: 'Keine Mandanten mit diesen Filtern.',
17
+ pagination: '{total} Mandanten · Seite {page} / {pages}',
18
+ },
19
+ detail: {
20
+ backToList: 'Mandanten-Liste',
21
+ slug: 'Slug',
22
+ masterData: 'Stammdaten',
23
+ pilot: 'Pilot',
24
+ trialEnd: 'Trial-Ende',
25
+ pilotEnd: 'Pilot-Ende',
26
+ vatId: 'USt-IdNr.',
27
+ usage: 'Verbrauch',
28
+ users: 'User',
29
+ userEmail: 'E-Mail',
30
+ userRole: 'Rolle',
31
+ userLastLogin: 'Letzter Login',
32
+ },
33
+ actions: {
34
+ confirmTitle: 'Aktion bestätigen',
35
+ leadAction: 'Aktion',
36
+ leadForTenant: 'für Tenant',
37
+ typedSlugHint: 'Bestätige durch Eintippen des Slugs',
38
+ slugMismatch: 'Muss exakt „{slug}“ sein',
39
+ extendUntilLabel: 'Verlängern bis (Datum)',
40
+ dateFutureError: 'Bitte ein Datum in der Zukunft wählen.',
41
+ reasonLabel: 'Grund (Pflicht für Audit-Log, mindestens 5 Zeichen)',
42
+ reasonError: 'Bitte einen Grund mit mindestens 5 Zeichen angeben.',
43
+ mfaDescription: '{action} — Tenant „{tenant}". TOTP-Code aus Authenticator eingeben.',
44
+ successNotify: '{action}: erfolgreich.',
45
+ },
46
+ subscriptions: {
47
+ title: 'Abonnements',
48
+ columnEndsAt: 'Endet',
49
+ },
50
+ draft: {
51
+ planModules: '{count} Basis-Module',
52
+ },
53
+ },
54
+ {
55
+ tenant: 'Tenant',
56
+ plan: 'Plan',
57
+ list: {
58
+ title: 'Tenants',
59
+ searchPlaceholder: 'Slug or name …',
60
+ allStatuses: 'All active states',
61
+ allPlans: 'All plans',
62
+ columnUsage: 'Usage',
63
+ columnCreatedAt: 'Created',
64
+ suspended: 'Suspended',
65
+ empty: 'No tenants match these filters.',
66
+ pagination: '{total} tenants · Page {page} / {pages}',
67
+ },
68
+ detail: {
69
+ backToList: 'Tenant list',
70
+ slug: 'Slug',
71
+ masterData: 'Master data',
72
+ pilot: 'Pilot',
73
+ trialEnd: 'Trial end',
74
+ pilotEnd: 'Pilot end',
75
+ vatId: 'VAT ID',
76
+ usage: 'Usage',
77
+ users: 'Users',
78
+ userEmail: 'Email',
79
+ userRole: 'Role',
80
+ userLastLogin: 'Last login',
81
+ },
82
+ actions: {
83
+ confirmTitle: 'Confirm action',
84
+ leadAction: 'Action',
85
+ leadForTenant: 'for tenant',
86
+ typedSlugHint: 'Confirm by typing the slug',
87
+ slugMismatch: 'Must be exactly “{slug}”',
88
+ extendUntilLabel: 'Extend until (date)',
89
+ dateFutureError: 'Please pick a date in the future.',
90
+ reasonLabel: 'Reason (required for the audit log, at least 5 characters)',
91
+ reasonError: 'Please enter a reason with at least 5 characters.',
92
+ mfaDescription:
93
+ '{action} — tenant “{tenant}”. Enter the TOTP code from your authenticator.',
94
+ successNotify: '{action}: succeeded.',
95
+ },
96
+ subscriptions: {
97
+ title: 'Subscriptions',
98
+ columnEndsAt: 'Ends',
99
+ },
100
+ draft: {
101
+ planModules: '{count} base modules',
102
+ },
103
+ },
104
+ );
@@ -0,0 +1,78 @@
1
+ import { defineMessages } from '../define.js';
2
+
3
+ export const usersMessages = defineMessages(
4
+ {
5
+ title: 'Benutzer',
6
+ filterQuery: 'E-Mail oder Name',
7
+ filterTenant: 'Tenant-Slug',
8
+ statusActive: 'aktiv',
9
+ statusDeactivated: 'deaktiviert',
10
+ badgePending: 'Pending',
11
+ tenantFallback: '— (SuperAdmin)',
12
+ reasonPrompt: 'Grund für Audit (Pflichtfeld):',
13
+ errorAction: 'Aktion fehlgeschlagen',
14
+ tiles: {
15
+ blocked: 'Gesperrt',
16
+ neverLoggedIn: 'Nie eingeloggt',
17
+ superAdmins: 'Super-Admins',
18
+ },
19
+ columns: {
20
+ email: 'E-Mail',
21
+ tenant: 'Tenant',
22
+ role: 'Rolle',
23
+ lastLogin: 'Letzter Login',
24
+ },
25
+ resetPassword: {
26
+ action: 'Passwort zurücksetzen',
27
+ dialogTitle: 'Passwort für "{email}" zurücksetzen',
28
+ mfaDescription: 'Passwort für "{email}" zurücksetzen — {reason}.',
29
+ otpTitle: 'Einmal-Passwort generiert',
30
+ otpMessage: 'Bitte sicher übermitteln: {password}',
31
+ otpAcknowledge: 'Verstanden',
32
+ success: 'Passwort-Reset ausgelöst.',
33
+ },
34
+ deactivate: {
35
+ action: 'Deaktivieren',
36
+ dialogTitle: 'User "{email}" deaktivieren',
37
+ mfaDescription: 'User "{email}" deaktivieren — {reason}.',
38
+ success: '{email} deaktiviert.',
39
+ },
40
+ },
41
+ {
42
+ title: 'Users',
43
+ filterQuery: 'Email or name',
44
+ filterTenant: 'Tenant slug',
45
+ statusActive: 'active',
46
+ statusDeactivated: 'deactivated',
47
+ badgePending: 'Pending',
48
+ tenantFallback: '— (SuperAdmin)',
49
+ reasonPrompt: 'Reason for the audit trail (required):',
50
+ errorAction: 'Action failed',
51
+ tiles: {
52
+ blocked: 'Blocked',
53
+ neverLoggedIn: 'Never logged in',
54
+ superAdmins: 'Super admins',
55
+ },
56
+ columns: {
57
+ email: 'Email',
58
+ tenant: 'Tenant',
59
+ role: 'Role',
60
+ lastLogin: 'Last login',
61
+ },
62
+ resetPassword: {
63
+ action: 'Reset password',
64
+ dialogTitle: 'Reset password for "{email}"',
65
+ mfaDescription: 'Reset password for "{email}" — {reason}.',
66
+ otpTitle: 'One-time password generated',
67
+ otpMessage: 'Please transmit securely: {password}',
68
+ otpAcknowledge: 'Understood',
69
+ success: 'Password reset triggered.',
70
+ },
71
+ deactivate: {
72
+ action: 'Deactivate',
73
+ dialogTitle: 'Deactivate user "{email}"',
74
+ mfaDescription: 'Deactivate user "{email}" — {reason}.',
75
+ success: '{email} deactivated.',
76
+ },
77
+ },
78
+ );
@@ -0,0 +1,84 @@
1
+ // Aggregated platform catalog. `SaMessages` derives from the German reference
2
+ // structure of every namespace; the English variants are shape-checked in the
3
+ // namespace files via `defineMessages`.
4
+
5
+ import { mergeMessages, type PartialMessages } from './define.js';
6
+ import type { SaLocale } from './locale.js';
7
+ import { auditMessages } from './messages/audit.js';
8
+ import { bundlesMessages } from './messages/bundles.js';
9
+ import { commonMessages } from './messages/common.js';
10
+ import { dashboardMessages } from './messages/dashboard.js';
11
+ import { discoveryMessages } from './messages/discovery.js';
12
+ import { emailMessages } from './messages/email.js';
13
+ import { marketingMessages } from './messages/marketing.js';
14
+ import { navMessages } from './messages/nav.js';
15
+ import { pilotsMessages } from './messages/pilots.js';
16
+ import { planDetailMessages } from './messages/plan-detail.js';
17
+ import { planEditorMessages } from './messages/plan-editor.js';
18
+ import { planVersionsMessages } from './messages/plan-versions.js';
19
+ import { plansMessages } from './messages/plans.js';
20
+ import { promosMessages } from './messages/promos.js';
21
+ import { shellMessages } from './messages/shell.js';
22
+ import { tenantsMessages } from './messages/tenants.js';
23
+ import { usersMessages } from './messages/users.js';
24
+
25
+ /** Complete platform catalog for one locale, keyed by namespace. */
26
+ export type SaMessages = {
27
+ readonly common: (typeof commonMessages)['de'];
28
+ readonly nav: (typeof navMessages)['de'];
29
+ readonly shell: (typeof shellMessages)['de'];
30
+ readonly dashboard: (typeof dashboardMessages)['de'];
31
+ readonly tenants: (typeof tenantsMessages)['de'];
32
+ readonly users: (typeof usersMessages)['de'];
33
+ readonly audit: (typeof auditMessages)['de'];
34
+ readonly plans: (typeof plansMessages)['de'];
35
+ readonly planDetail: (typeof planDetailMessages)['de'];
36
+ readonly planEditor: (typeof planEditorMessages)['de'];
37
+ readonly planVersions: (typeof planVersionsMessages)['de'];
38
+ readonly bundles: (typeof bundlesMessages)['de'];
39
+ readonly discovery: (typeof discoveryMessages)['de'];
40
+ readonly marketing: (typeof marketingMessages)['de'];
41
+ readonly promos: (typeof promosMessages)['de'];
42
+ readonly pilots: (typeof pilotsMessages)['de'];
43
+ readonly email: (typeof emailMessages)['de'];
44
+ };
45
+
46
+ /** Shape of app-side string overrides (deep partial of the catalog). */
47
+ export type SaMessagesOverrides = PartialMessages<SaMessages>;
48
+
49
+ function catalogFor(locale: SaLocale): SaMessages {
50
+ return {
51
+ common: commonMessages[locale],
52
+ nav: navMessages[locale],
53
+ shell: shellMessages[locale],
54
+ dashboard: dashboardMessages[locale],
55
+ tenants: tenantsMessages[locale],
56
+ users: usersMessages[locale],
57
+ audit: auditMessages[locale],
58
+ plans: plansMessages[locale],
59
+ planDetail: planDetailMessages[locale],
60
+ planEditor: planEditorMessages[locale],
61
+ planVersions: planVersionsMessages[locale],
62
+ bundles: bundlesMessages[locale],
63
+ discovery: discoveryMessages[locale],
64
+ marketing: marketingMessages[locale],
65
+ promos: promosMessages[locale],
66
+ pilots: pilotsMessages[locale],
67
+ email: emailMessages[locale],
68
+ };
69
+ }
70
+
71
+ /** Complete, immutable message catalogs per locale. */
72
+ export const SA_MESSAGES: Record<SaLocale, SaMessages> = {
73
+ de: catalogFor('de'),
74
+ en: catalogFor('en'),
75
+ };
76
+
77
+ /**
78
+ * Returns the platform catalog for `locale`, optionally overlaid with
79
+ * app-side overrides.
80
+ */
81
+ export function resolveMessages(locale: SaLocale, overrides?: SaMessagesOverrides): SaMessages {
82
+ if (!overrides) return SA_MESSAGES[locale];
83
+ return mergeMessages(SA_MESSAGES[locale], overrides);
84
+ }
@@ -0,0 +1,27 @@
1
+ // @saasicat/ui-vue/client — the framework-free core of the SuperAdmin UI
2
+ // package. No Vue, no Pinia, no Quasar: only `@saasicat/types` and the
3
+ // platform HTTP contract. Usable from any framework binding or plain
4
+ // TypeScript (Node scripts, other UI stacks).
5
+ //
6
+ // Contents:
7
+ // - types: HttpClient, KvStore, defaultHttpClient, defaultKvStore
8
+ // - http-json: JSON fetch helper over HttpClient
9
+ // - boot-loader: BootLoader + BootLoadError
10
+ // - manifest-loader: ManifestLoader with ETag cache + ManifestLoadError
11
+ // - nav-builder: buildRoutes, buildSidebar, resolveExtension
12
+ // - action-registry: ActionRegistry, MissingHandlerError, ActionDefNotInManifestError
13
+ // - batch-column-fetcher: BatchColumnFetcher + BatchColumnDriftError
14
+ // - plan-versions-catalog: plan-version list/diff helpers
15
+ // - i18n: SaLocale, typed DE/EN catalogs, formatMessage
16
+ // - version: ADMIN_UI_VERSION
17
+
18
+ export * from './version.js';
19
+ export * from './types.js';
20
+ export * from './http-json.js';
21
+ export * from './boot-loader.js';
22
+ export * from './manifest-loader.js';
23
+ export * from './nav-builder.js';
24
+ export * from './action-registry.js';
25
+ export * from './batch-column-fetcher.js';
26
+ export * from './plan-versions-catalog.js';
27
+ export * from './i18n/index.js';
@@ -65,9 +65,9 @@ export class ManifestLoader {
65
65
  constructor(options: ManifestLoaderOptions) {
66
66
  if (!options?.endpoint) {
67
67
  throw new Error(
68
- 'ManifestLoader: `endpoint` ist Pflicht (z. B. "/api/admin/manifest" ' +
69
- 'oder "/api/v1/admin/manifest"). Plattform hat keinen Default, ' +
70
- 'weil Apps unterschiedliche globalPrefix-Konventionen haben.',
68
+ 'ManifestLoader: `endpoint` is required (e.g. "/api/admin/manifest" ' +
69
+ 'or "/api/v1/admin/manifest"). The platform has no default ' +
70
+ 'because apps use different globalPrefix conventions.',
71
71
  );
72
72
  }
73
73
  this.endpoint = options.endpoint;
@@ -97,7 +97,7 @@ export class ManifestLoader {
97
97
  if (!cachedBody) {
98
98
  throw new ManifestLoadError(
99
99
  304,
100
- 'Server lieferte 304, aber Cache-Body fehltbitte clearCache() + reload',
100
+ 'Server returned 304 but the cache body is missing call clearCache() and reload',
101
101
  );
102
102
  }
103
103
  return cachedBody.body;