@revenexx/cover 0.1.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 (408) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +39 -0
  3. package/app/api/account.ts +8 -0
  4. package/app/api/categories.ts +3 -0
  5. package/app/api/checkout.ts +6 -0
  6. package/app/api/images.ts +4 -0
  7. package/app/api/markets.ts +3 -0
  8. package/app/api/product.ts +3 -0
  9. package/app/api/products.ts +4 -0
  10. package/app/api/search.ts +4 -0
  11. package/app/app.config.ts +29 -0
  12. package/app/assets/css/cover.css +25 -0
  13. package/app/components/account/AccountMenu.vue +30 -0
  14. package/app/components/account/AccountShell.vue +18 -0
  15. package/app/components/account/AccountSidebar.vue +90 -0
  16. package/app/components/account/address/AccountAddressCard.vue +287 -0
  17. package/app/components/account/carts/AccountCartsTable.vue +284 -0
  18. package/app/components/account/dashboard/AccountDashboard.vue +351 -0
  19. package/app/components/account/directorder/AccountDirectOrder.vue +512 -0
  20. package/app/components/account/governance/AccountApprovalLimitsTable.vue +221 -0
  21. package/app/components/account/governance/AccountCostCenterDetail.vue +276 -0
  22. package/app/components/account/governance/AccountCostCentersTable.vue +252 -0
  23. package/app/components/account/governance/AccountRequisitionDetail.vue +295 -0
  24. package/app/components/account/governance/AccountRequisitionsTable.vue +255 -0
  25. package/app/components/account/governance/AccountWorkflowDetail.vue +215 -0
  26. package/app/components/account/governance/AccountWorkflowsTable.vue +168 -0
  27. package/app/components/account/governance/GovernanceApprovalLimitModal.vue +183 -0
  28. package/app/components/account/governance/GovernanceCostCenterModal.vue +188 -0
  29. package/app/components/account/governance/GovernanceWorkflowModal.vue +191 -0
  30. package/app/components/account/orderlists/AccountOrderListDetail.vue +349 -0
  31. package/app/components/account/orderlists/AccountOrderListsTable.vue +352 -0
  32. package/app/components/account/orders/AccountOrderDetail.vue +376 -0
  33. package/app/components/account/orders/AccountOrdersTable.vue +281 -0
  34. package/app/components/account/preferences/AccountPreferences.vue +50 -0
  35. package/app/components/auth/AuthForgotPasswordPanel.vue +88 -0
  36. package/app/components/auth/AuthLoginPanel.vue +103 -0
  37. package/app/components/auth/AuthLoginTeaser.vue +24 -0
  38. package/app/components/auth/AuthPageHeader.vue +21 -0
  39. package/app/components/auth/AuthRegisterPanel.vue +431 -0
  40. package/app/components/auth/AuthRegisterTeaser.vue +24 -0
  41. package/app/components/auth/AuthResetPasswordPanel.vue +115 -0
  42. package/app/components/cart/CartButton.vue +42 -0
  43. package/app/components/cart/actions/CartCostCenterModal.vue +110 -0
  44. package/app/components/cart/actions/CartExportModal.vue +82 -0
  45. package/app/components/cart/actions/CartPositionTextsModal.vue +92 -0
  46. package/app/components/cart/actions/CartSaveToListModal.vue +177 -0
  47. package/app/components/cart/actions/CartWorkflowPickerModal.vue +64 -0
  48. package/app/components/cart/drawer/CartDrawer.vue +49 -0
  49. package/app/components/cart/item/CartItem.vue +318 -0
  50. package/app/components/cart/manage/CartNameModal.vue +68 -0
  51. package/app/components/cart/position/CartPosition.vue +369 -0
  52. package/app/components/cart/quickadd/CartQuickAdd.vue +145 -0
  53. package/app/components/cart/recommend/CartCrossSell.vue +102 -0
  54. package/app/components/cart/recommend/CartRecommendCard.vue +59 -0
  55. package/app/components/cart/recommend/CartReorderStrip.vue +108 -0
  56. package/app/components/cart/requisition/CartRequisitionGroup.vue +74 -0
  57. package/app/components/cart/skeleton/CartSkeleton.vue +18 -0
  58. package/app/components/cart/summary/CartSummary.vue +25 -0
  59. package/app/components/cart/summary/CartSummaryBreakdown.vue +35 -0
  60. package/app/components/cart/switcher/CartSwitcher.vue +147 -0
  61. package/app/components/cart/target/CartTargetModal.vue +129 -0
  62. package/app/components/cart/view/CartApprovalsPanel.vue +89 -0
  63. package/app/components/cart/view/CartListHeader.vue +86 -0
  64. package/app/components/cart/view/CartPositionList.vue +94 -0
  65. package/app/components/cart/view/CartSummaryPanel.vue +254 -0
  66. package/app/components/cart/view/CartView.vue +310 -0
  67. package/app/components/category/info/CategoryPrice.vue +47 -0
  68. package/app/components/category/info/CategorySku.vue +15 -0
  69. package/app/components/category/info/CategoryStock.vue +25 -0
  70. package/app/components/category/list/CategoryItemCount.vue +27 -0
  71. package/app/components/category/list/CategoryListPagination.vue +81 -0
  72. package/app/components/category/skeleton/CategoryDetailSkeleton.vue +12 -0
  73. package/app/components/category/skeleton/CategoryListSkeleton.vue +65 -0
  74. package/app/components/category/view/CategoryViewToggle.vue +33 -0
  75. package/app/components/category/view/GridView.vue +78 -0
  76. package/app/components/category/view/ListView.vue +80 -0
  77. package/app/components/checkout/confirmation/CheckoutConfirmationView.vue +289 -0
  78. package/app/components/checkout/form/CheckoutSchemaForm.vue +72 -0
  79. package/app/components/checkout/onepage/CheckoutAddressPickerModal.vue +260 -0
  80. package/app/components/checkout/onepage/CheckoutAddressSection.vue +186 -0
  81. package/app/components/checkout/onepage/CheckoutDeliverySection.vue +158 -0
  82. package/app/components/checkout/onepage/CheckoutGate.vue +67 -0
  83. package/app/components/checkout/onepage/CheckoutGuestDetailsSection.vue +154 -0
  84. package/app/components/checkout/onepage/CheckoutNotesSection.vue +62 -0
  85. package/app/components/checkout/onepage/CheckoutOnePageView.vue +77 -0
  86. package/app/components/checkout/onepage/CheckoutPaymentSection.vue +181 -0
  87. package/app/components/checkout/onepage/CheckoutSectionTitle.vue +18 -0
  88. package/app/components/checkout/onepage/CheckoutSummarySection.vue +211 -0
  89. package/app/components/checkout/onepage/CheckoutWorkflowPanel.vue +38 -0
  90. package/app/components/layout/AppLogo.vue +21 -0
  91. package/app/components/layout/footer/Footer.vue +148 -0
  92. package/app/components/layout/header/AppBar.vue +75 -0
  93. package/app/components/layout/header/CategoryNav.vue +93 -0
  94. package/app/components/layout/header/HeaderActionItem.vue +81 -0
  95. package/app/components/layout/header/LocaleSwitcher.vue +123 -0
  96. package/app/components/layout/header/MainNav.vue +61 -0
  97. package/app/components/layout/header/MobileMenu.vue +81 -0
  98. package/app/components/layout/header/TopBar.vue +63 -0
  99. package/app/components/listing/ListingView.vue +227 -0
  100. package/app/components/product/detail/ProductDetailAddToCart.vue +188 -0
  101. package/app/components/product/detail/ProductDetailDescription.vue +20 -0
  102. package/app/components/product/detail/ProductDetailImageGallery.vue +58 -0
  103. package/app/components/product/detail/ProductDetailPricing.vue +108 -0
  104. package/app/components/product/detail/ProductDetailSaveToList.vue +291 -0
  105. package/app/components/product/detail/ProductDetailSpecifications.vue +33 -0
  106. package/app/components/product/detail/ProductDetailStock.vue +36 -0
  107. package/app/components/search/filter/SearchFacets.vue +256 -0
  108. package/app/components/search/filter/SearchFacetsDrawer.vue +58 -0
  109. package/app/components/ui/AppShell.vue +7 -0
  110. package/app/components/ui/debug/PiniaStateCard.vue +106 -0
  111. package/app/components/ui/feedback/EmptyState.vue +30 -0
  112. package/app/components/ui/feedback/ErrorBoundary.vue +44 -0
  113. package/app/components/ui/feedback/NotFound.vue +34 -0
  114. package/app/components/ui/forms/CountrySelection.vue +14 -0
  115. package/app/components/ui/forms/FormKitDatePicker.vue +124 -0
  116. package/app/components/ui/forms/PasswordInput.vue +136 -0
  117. package/app/components/ui/forms/SearchInput.vue +213 -0
  118. package/app/components/ui/table/TableSortButton.vue +51 -0
  119. package/app/components/ui/table/TableToolbar.vue +66 -0
  120. package/app/composables/useAccount.ts +27 -0
  121. package/app/composables/useAccountAddresses.ts +116 -0
  122. package/app/composables/useAccountOrders.ts +18 -0
  123. package/app/composables/useAppUrl.ts +38 -0
  124. package/app/composables/useAuthStore.ts +202 -0
  125. package/app/composables/useB2BContext.ts +23 -0
  126. package/app/composables/useCartActions.ts +25 -0
  127. package/app/composables/useCartCalculation.ts +90 -0
  128. package/app/composables/useCartSelection.ts +46 -0
  129. package/app/composables/useCartStore.ts +837 -0
  130. package/app/composables/useCartSummaryFormatting.ts +28 -0
  131. package/app/composables/useCategories.ts +29 -0
  132. package/app/composables/useCheckoutOnePage.ts +438 -0
  133. package/app/composables/useCheckoutProfileSource.ts +8 -0
  134. package/app/composables/useCheckoutSchema.ts +28 -0
  135. package/app/composables/useDataTable.ts +14 -0
  136. package/app/composables/useFormValidation.ts +29 -0
  137. package/app/composables/useIcons.ts +17 -0
  138. package/app/composables/useLocalePreferences.ts +45 -0
  139. package/app/composables/useMarkets.ts +15 -0
  140. package/app/composables/useProduct.ts +89 -0
  141. package/app/composables/useProductCard.ts +8 -0
  142. package/app/composables/useProductCardActions.ts +106 -0
  143. package/app/composables/useProductImage.ts +12 -0
  144. package/app/composables/useProductListing.ts +210 -0
  145. package/app/composables/useProductUrl.ts +17 -0
  146. package/app/composables/useProducts.ts +130 -0
  147. package/app/composables/useSearch.ts +12 -0
  148. package/app/composables/useThemeStore.ts +81 -0
  149. package/app/composables/useViewMode.ts +18 -0
  150. package/app/config/countries.ts +74 -0
  151. package/app/config/icons.ts +283 -0
  152. package/app/config/navigation.ts +191 -0
  153. package/app/config/palette.ts +13 -0
  154. package/app/config/themes.ts +20 -0
  155. package/app/formkit.config.ts +50 -0
  156. package/app/interfaces/account/address-list.ts +34 -0
  157. package/app/interfaces/account/order-list.ts +47 -0
  158. package/app/interfaces/account/order-lists.ts +35 -0
  159. package/app/interfaces/account/profile.ts +17 -0
  160. package/app/interfaces/account.ts +3 -0
  161. package/app/interfaces/address.ts +9 -0
  162. package/app/interfaces/auth.ts +104 -0
  163. package/app/interfaces/b2b.ts +234 -0
  164. package/app/interfaces/cart-calculation.ts +131 -0
  165. package/app/interfaces/cart-item.ts +45 -0
  166. package/app/interfaces/checkout-draft.ts +4 -0
  167. package/app/interfaces/checkout.ts +43 -0
  168. package/app/interfaces/delivery.ts +13 -0
  169. package/app/interfaces/market.ts +24 -0
  170. package/app/interfaces/payment.ts +19 -0
  171. package/app/interfaces/persisted-cart.ts +10 -0
  172. package/app/interfaces/product-detail.ts +54 -0
  173. package/app/interfaces/product-list.ts +33 -0
  174. package/app/interfaces/search-facets.ts +14 -0
  175. package/app/interfaces/validation.ts +14 -0
  176. package/app/layouts/default.vue +78 -0
  177. package/app/layouts/focus.vue +80 -0
  178. package/app/plugins/formkit-locale.client.ts +23 -0
  179. package/app/shared/constants.ts +1 -0
  180. package/app/validations/companyName.ts +18 -0
  181. package/app/validations/emailFormat.ts +10 -0
  182. package/app/validations/formValidationConfig.ts +50 -0
  183. package/app/validations/maxLength.ts +12 -0
  184. package/app/validations/minLength.ts +9 -0
  185. package/app/validations/optionalCompanyName.ts +23 -0
  186. package/app/validations/passwordsMatch.ts +5 -0
  187. package/app/validations/phoneNumber.ts +19 -0
  188. package/app/validations/required.ts +11 -0
  189. package/app/validations/termsRequired.ts +4 -0
  190. package/app/validations/types.ts +10 -0
  191. package/app/validations/zipCode.ts +15 -0
  192. package/i18n/locales/de/account.json +458 -0
  193. package/i18n/locales/de/auth.json +155 -0
  194. package/i18n/locales/de/cart.json +263 -0
  195. package/i18n/locales/de/checkout.json +217 -0
  196. package/i18n/locales/de/common.json +80 -0
  197. package/i18n/locales/de/cover.json +33 -0
  198. package/i18n/locales/de/order.json +1 -0
  199. package/i18n/locales/de/product.json +71 -0
  200. package/i18n/locales/de/search.json +54 -0
  201. package/i18n/locales/de/validation.json +12 -0
  202. package/i18n/locales/en/account.json +458 -0
  203. package/i18n/locales/en/auth.json +155 -0
  204. package/i18n/locales/en/cart.json +263 -0
  205. package/i18n/locales/en/checkout.json +217 -0
  206. package/i18n/locales/en/common.json +80 -0
  207. package/i18n/locales/en/cover.json +33 -0
  208. package/i18n/locales/en/order.json +1 -0
  209. package/i18n/locales/en/product.json +71 -0
  210. package/i18n/locales/en/search.json +54 -0
  211. package/i18n/locales/en/validation.json +12 -0
  212. package/nuxt.config.ts +109 -0
  213. package/package.json +65 -0
  214. package/public/img/product-placeholder.svg +8 -0
  215. package/public/templates/direct-order-template.csv +3 -0
  216. package/public/templates/direct-order-template.xlsx +0 -0
  217. package/server/api/account/address/[id].delete.ts +51 -0
  218. package/server/api/account/address/[id].put.ts +83 -0
  219. package/server/api/account/address/index.post.ts +60 -0
  220. package/server/api/account/addresses.get.ts +25 -0
  221. package/server/api/account/context.get.ts +16 -0
  222. package/server/api/account/governance/[domain]/[id].put.ts +57 -0
  223. package/server/api/account/governance/[domain].post.ts +111 -0
  224. package/server/api/account/order-lists/[id].delete.ts +22 -0
  225. package/server/api/account/order-lists/[id].get.ts +17 -0
  226. package/server/api/account/order-lists/[id].put.ts +46 -0
  227. package/server/api/account/order-lists/index.get.ts +14 -0
  228. package/server/api/account/order-lists/index.post.ts +38 -0
  229. package/server/api/account/orders/[id].get.ts +35 -0
  230. package/server/api/account/orders.get.ts +35 -0
  231. package/server/api/account/profile.get.ts +56 -0
  232. package/server/api/account/profile.put.ts +128 -0
  233. package/server/api/account/requisitions/[id].get.ts +15 -0
  234. package/server/api/account/requisitions.get.ts +23 -0
  235. package/server/api/auth/login.post.ts +37 -0
  236. package/server/api/auth/logout.post.ts +4 -0
  237. package/server/api/auth/me.get.ts +3 -0
  238. package/server/api/auth/personas.get.ts +7 -0
  239. package/server/api/auth/recovery.post.ts +32 -0
  240. package/server/api/auth/recovery.put.ts +37 -0
  241. package/server/api/auth/register.post.ts +126 -0
  242. package/server/api/cart/calculate.post.ts +25 -0
  243. package/server/api/cart/export.post.ts +81 -0
  244. package/server/api/cart/index.delete.ts +10 -0
  245. package/server/api/cart/index.get.ts +10 -0
  246. package/server/api/cart/sync.post.ts +14 -0
  247. package/server/api/carts/[id]/activate.post.ts +18 -0
  248. package/server/api/carts/[id]/index.delete.ts +18 -0
  249. package/server/api/carts/[id]/index.put.ts +19 -0
  250. package/server/api/carts/[id]/items.post.ts +21 -0
  251. package/server/api/carts/index.get.ts +14 -0
  252. package/server/api/carts/index.post.ts +14 -0
  253. package/server/api/categories/[slug].get.ts +22 -0
  254. package/server/api/categories/index.get.ts +11 -0
  255. package/server/api/checkout/profile.get.ts +21 -0
  256. package/server/api/checkout/schema/[key].get.ts +19 -0
  257. package/server/api/checkout/session.post.ts +8 -0
  258. package/server/api/images/detail/[filename].get.ts +18 -0
  259. package/server/api/images/list/[filename].get.ts +17 -0
  260. package/server/api/markets.get.ts +9 -0
  261. package/server/api/orders/index.post.ts +376 -0
  262. package/server/api/payment/methods.post.ts +65 -0
  263. package/server/api/product/[id].get.ts +29 -0
  264. package/server/api/products/[id].get.ts +30 -0
  265. package/server/api/products/index.get.ts +21 -0
  266. package/server/api/requisitions/index.post.ts +67 -0
  267. package/server/api/shipping/rates.post.ts +70 -0
  268. package/server/api/themes/index.get.ts +9 -0
  269. package/server/api/typesense/drop.get.ts +22 -0
  270. package/server/api/typesense/health.get.ts +9 -0
  271. package/server/api/typesense/search.post.ts +199 -0
  272. package/server/api/typesense/seed.get.ts +112 -0
  273. package/server/api/typesense/suggest.post.ts +69 -0
  274. package/server/config/account/organization.json +146 -0
  275. package/server/config/account/personas.json +169 -0
  276. package/server/config/account/user.json +8 -0
  277. package/server/config/account/workflows.json +19 -0
  278. package/server/data/account/address-list.json +103 -0
  279. package/server/data/account/order-list.json +491 -0
  280. package/server/data/account/order-lists.json +149 -0
  281. package/server/data/account/profile.json +9 -0
  282. package/server/data/account/registration-requests.json +3 -0
  283. package/server/data/account/requisitions.json +686 -0
  284. package/server/data/categories.json +186 -0
  285. package/server/data/forms/checkout/add-address.json +24 -0
  286. package/server/data/list/5137-1.png +0 -0
  287. package/server/data/list/5498-1.png +0 -0
  288. package/server/data/list/5498-2.png +0 -0
  289. package/server/data/list/5498-3.png +0 -0
  290. package/server/data/list/5498-4.png +0 -0
  291. package/server/data/list/5498-5.png +0 -0
  292. package/server/data/list/5498-6.png +0 -0
  293. package/server/data/list/5519-1.png +0 -0
  294. package/server/data/list/5713-1.png +0 -0
  295. package/server/data/list/5789-1.png +0 -0
  296. package/server/data/list/5930-1.png +0 -0
  297. package/server/data/list/6127-1.png +0 -0
  298. package/server/data/list/6234-1.png +0 -0
  299. package/server/data/list/6238-1.png +0 -0
  300. package/server/data/list/6246-1.png +0 -0
  301. package/server/data/list/6270-1.png +0 -0
  302. package/server/data/list/6330-1.png +0 -0
  303. package/server/data/list/6336-1.png +0 -0
  304. package/server/data/list/6360-1.png +0 -0
  305. package/server/data/list/6363-1.png +0 -0
  306. package/server/data/list/6375-1.png +0 -0
  307. package/server/data/list/6385-1.png +0 -0
  308. package/server/data/list/6413-1.png +0 -0
  309. package/server/data/list/6418-1.png +0 -0
  310. package/server/data/list/6465-1.png +0 -0
  311. package/server/data/list/6477-1.png +0 -0
  312. package/server/data/list/6509-1.png +0 -0
  313. package/server/data/list/6545-1.png +0 -0
  314. package/server/data/list/6548-1.png +0 -0
  315. package/server/data/list/6566-1.png +0 -0
  316. package/server/data/list/6581-1.png +0 -0
  317. package/server/data/list/6609-1.png +0 -0
  318. package/server/data/list/6611-1.png +0 -0
  319. package/server/data/list/6641-1.png +0 -0
  320. package/server/data/list/6659-1.png +0 -0
  321. package/server/data/list/6662-1.png +0 -0
  322. package/server/data/list/6689-1.png +0 -0
  323. package/server/data/list/6698-1.png +0 -0
  324. package/server/data/list/6701-1.png +0 -0
  325. package/server/data/list/6752-1.png +0 -0
  326. package/server/data/list/6755-1.png +0 -0
  327. package/server/data/list/6837-1.png +0 -0
  328. package/server/data/list/6841-1.png +0 -0
  329. package/server/data/list/6844-1.png +0 -0
  330. package/server/data/list/6846-1.png +0 -0
  331. package/server/data/list/6886-1.png +0 -0
  332. package/server/data/list/6895-1.png +0 -0
  333. package/server/data/list/6897-1.png +0 -0
  334. package/server/data/list/6919-1.png +0 -0
  335. package/server/data/list/6977-1.png +0 -0
  336. package/server/data/list/6983-1.png +0 -0
  337. package/server/data/list/6984-1.png +0 -0
  338. package/server/data/list/6985-1.png +0 -0
  339. package/server/data/list/6986-1.png +0 -0
  340. package/server/data/list/6989-1.png +0 -0
  341. package/server/data/list/6995-1.png +0 -0
  342. package/server/data/list/6998-1.png +0 -0
  343. package/server/data/markets.json +24 -0
  344. package/server/data/product-detail.json +2450 -0
  345. package/server/data/product-list.json +2450 -0
  346. package/server/data/themes.json +8 -0
  347. package/server/interfaces/account.ts +20 -0
  348. package/server/interfaces/auth.ts +32 -0
  349. package/server/interfaces/b2bContext.ts +23 -0
  350. package/server/interfaces/cart.ts +46 -0
  351. package/server/interfaces/cartCalculation.ts +17 -0
  352. package/server/interfaces/category.ts +12 -0
  353. package/server/interfaces/checkoutProfile.ts +5 -0
  354. package/server/interfaces/log.ts +3 -0
  355. package/server/interfaces/market.ts +10 -0
  356. package/server/interfaces/product.ts +21 -0
  357. package/server/interfaces/schema.ts +20 -0
  358. package/server/interfaces/theme.ts +10 -0
  359. package/server/services/ApiAuthService.ts +138 -0
  360. package/server/services/ApiCartService.ts +254 -0
  361. package/server/services/ApiCategoryService.ts +25 -0
  362. package/server/services/ApiMarketService.ts +71 -0
  363. package/server/services/ApiProductService.ts +53 -0
  364. package/server/services/LocalFileCategoryService.ts +23 -0
  365. package/server/services/LocalFileCheckoutProfileService.ts +117 -0
  366. package/server/services/LocalFileProductService.ts +128 -0
  367. package/server/services/LocalFileSchemaService.ts +70 -0
  368. package/server/services/LocalFileThemeService.ts +18 -0
  369. package/server/services/LogService.ts +28 -0
  370. package/server/services/MockAccountService.ts +58 -0
  371. package/server/services/MockAuthService.ts +105 -0
  372. package/server/services/MockB2BContextService.ts +149 -0
  373. package/server/services/MockCartCalculationService.ts +395 -0
  374. package/server/services/MockMarketService.ts +18 -0
  375. package/server/services/SdkAccountService.ts +56 -0
  376. package/server/services/SdkAuthService.ts +83 -0
  377. package/server/services/SessionCartService.ts +31 -0
  378. package/server/utils/accountService.ts +30 -0
  379. package/server/utils/authCookie.ts +13 -0
  380. package/server/utils/authService.ts +43 -0
  381. package/server/utils/b2bService.ts +49 -0
  382. package/server/utils/cartService.ts +59 -0
  383. package/server/utils/categoryService.ts +19 -0
  384. package/server/utils/checkoutProfileService.ts +9 -0
  385. package/server/utils/checkoutSession.ts +38 -0
  386. package/server/utils/coverData.ts +84 -0
  387. package/server/utils/governanceStore.ts +38 -0
  388. package/server/utils/i18n.ts +76 -0
  389. package/server/utils/inventoryService.ts +14 -0
  390. package/server/utils/liveCatalog.ts +234 -0
  391. package/server/utils/liveInventories.ts +76 -0
  392. package/server/utils/liveOrders.ts +139 -0
  393. package/server/utils/livePrices.ts +93 -0
  394. package/server/utils/locale.ts +39 -0
  395. package/server/utils/logService.ts +19 -0
  396. package/server/utils/marketService.ts +24 -0
  397. package/server/utils/orderService.ts +14 -0
  398. package/server/utils/paymentService.ts +14 -0
  399. package/server/utils/priceService.ts +14 -0
  400. package/server/utils/productService.ts +28 -0
  401. package/server/utils/productsSchema.ts +30 -0
  402. package/server/utils/revenexxApi.ts +136 -0
  403. package/server/utils/schemaService.ts +25 -0
  404. package/server/utils/serviceMode.ts +70 -0
  405. package/server/utils/shippingService.ts +14 -0
  406. package/server/utils/shopSdk.ts +88 -0
  407. package/server/utils/themeService.ts +16 -0
  408. package/server/utils/typesense.ts +27 -0
@@ -0,0 +1,54 @@
1
+ {
2
+ "search": {
3
+ "input": {
4
+ "placeholder": "Produkte, SKUs suchen...",
5
+ "scan": "Code scannen",
6
+ "scanTitle": "Barcode / QR-Code scannen",
7
+ "scanHint": "Richten Sie die Kamera auf einen Barcode oder QR-Code — das Ergebnis wird als Suchbegriff übernommen."
8
+ },
9
+ "results": {
10
+ "title": "Suchergebnisse für \"{query}\"",
11
+ "count": "{count} Ergebnis | {count} Ergebnisse",
12
+ "error": "Die Suche ist fehlgeschlagen",
13
+ "emptyTitle": "Keine Treffer",
14
+ "emptyDescription": "Passen Sie Suchbegriff oder Filter an — oder stöbern Sie im Katalog.",
15
+ "initialTitle": "Katalog durchsuchen",
16
+ "initialDescription": "Geben Sie oben einen Produktnamen, eine Artikelnummer oder einen Begriff ein."
17
+ },
18
+ "sort": {
19
+ "label": "Sortierung",
20
+ "relevance": "Relevanz",
21
+ "priceAsc": "Preis aufsteigend",
22
+ "priceDesc": "Preis absteigend",
23
+ "nameAsc": "Name A–Z",
24
+ "nameDesc": "Name Z–A"
25
+ },
26
+ "filters": {
27
+ "title": "Filter",
28
+ "clearAll": "Alle löschen",
29
+ "noFilters": "Keine Filter verfügbar.",
30
+ "openDrawer": "Filter",
31
+ "facets": {
32
+ "category": "Kategorie",
33
+ "subcategory": "Unterkategorie",
34
+ "available": "Verfügbarkeit",
35
+ "manufacturer": "Hersteller"
36
+ },
37
+ "values": {
38
+ "inStock": "Auf Lager",
39
+ "outOfStock": "Nicht verfügbar"
40
+ },
41
+ "price": {
42
+ "label": "Preis (€)",
43
+ "min": "Von",
44
+ "max": "Bis"
45
+ },
46
+ "removeFilter": "Filter {value} entfernen",
47
+ "showResults": "{count} Ergebnis anzeigen | {count} Ergebnisse anzeigen"
48
+ },
49
+ "category": {
50
+ "searchPlaceholder": "In dieser Kategorie suchen…",
51
+ "allProducts": "Alle Produkte"
52
+ }
53
+ }
54
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "required": "Dieses Feld ist ein Pflichtfeld",
3
+ "maxLength": "Der Wert darf maximal {max} Zeichen enthalten",
4
+ "minLength": "Der Wert muss mindestens {min} Zeichen enthalten",
5
+ "pattern": "Der Wert entspricht nicht dem erforderlichen Format",
6
+ "postalCodeFormat": "Ungültiges Postleitzahlen-Format",
7
+ "ibanFormat": "Ungültiges IBAN-Format",
8
+ "termsRequired": "Bitte akzeptieren Sie die AGB",
9
+ "invalidPhoneNumber": "Ihre Telefonnummer enthält ungültige Zeichen",
10
+ "invalidCompanyName": "Der Firmenname enthält ungültige Zeichen",
11
+ "invalidZipCode": "Ungültige Postleitzahl (nur Ziffern, 3–5 Stellen)"
12
+ }
@@ -0,0 +1,458 @@
1
+ {
2
+ "addresses": {
3
+ "title": "Your addresses",
4
+ "description": "Manage your saved shipping and billing addresses.",
5
+ "errorTitle": "Addresses could not be loaded",
6
+ "errorDescription": "Please try again later.",
7
+ "defaultAriaLabel": "Default address",
8
+ "defaultTooltip": "Default address",
9
+ "empty": {
10
+ "title": "No addresses yet",
11
+ "description": "Your addresses will show up here once you add one."
12
+ },
13
+ "type": {
14
+ "billing": "Billing address",
15
+ "shipping": "Shipping address"
16
+ },
17
+ "fields": {
18
+ "label": "Label",
19
+ "company": "Company",
20
+ "firstName": "First name",
21
+ "lastName": "Last name",
22
+ "street": "Street",
23
+ "streetNumber": "Street number",
24
+ "city": "City",
25
+ "zip": "ZIP / Postal code",
26
+ "country": "Country",
27
+ "type": "Address type",
28
+ "isDefault": "Set as default",
29
+ "isDefaultSet": "Default address"
30
+ },
31
+ "actions": {
32
+ "add": "Add address",
33
+ "save": "Save address",
34
+ "delete": "Delete address"
35
+ },
36
+ "add": {
37
+ "title": "Add address",
38
+ "submit": "Add"
39
+ },
40
+ "validation": {
41
+ "required": "This field is required",
42
+ "minLength": "At least {min} characters required"
43
+ },
44
+ "delete": {
45
+ "title": "Delete address?",
46
+ "confirm": "Are you sure you want to delete the address \"{label}\"?",
47
+ "cancel": "Cancel",
48
+ "submit": "Delete"
49
+ },
50
+ "success": {
51
+ "created": "Address added successfully",
52
+ "updated": "Address updated successfully",
53
+ "deleted": "Address deleted successfully"
54
+ }
55
+ },
56
+ "orders": {
57
+ "title": "Your orders",
58
+ "description": "View and track all your past orders.",
59
+ "errorTitle": "Orders could not be loaded",
60
+ "errorDescription": "Please try again later.",
61
+ "empty": {
62
+ "title": "No orders yet",
63
+ "description": "Your orders will show up here once you place one."
64
+ },
65
+ "card": {
66
+ "orderNumber": "Order",
67
+ "date": "Date",
68
+ "shippingStatus": "Shipping status",
69
+ "paymentStatus": "Payment status",
70
+ "total": "Total (net)",
71
+ "yourOrderNumber": "Your order number"
72
+ },
73
+ "status": {
74
+ "processing": "Processing",
75
+ "approval-pending": "Approval pending",
76
+ "shipped": "Shipped",
77
+ "delivered": "Delivered",
78
+ "cancelled": "Cancelled"
79
+ },
80
+ "payment": {
81
+ "open": "Payment open",
82
+ "paid": "Paid",
83
+ "refunded": "Refunded"
84
+ },
85
+ "details": "Details",
86
+ "orderAgain": "Order again",
87
+ "orderAgainSuccess": "{count} position added to the cart | {count} positions added to the cart",
88
+ "morePositions": "+ {count} more position | + {count} more positions",
89
+ "awaitingApproval": "Awaiting approval by {names}",
90
+ "positionsTitle": "Positions",
91
+ "deliveryAddress": "Delivery address",
92
+ "refresh": "Refresh",
93
+ "notFound": "Order not found",
94
+ "searchPlaceholder": "Search by order number or item…",
95
+ "detail": {
96
+ "progressTitle": "Order progress",
97
+ "steps": {
98
+ "ordered": "Ordered",
99
+ "processing": "Processing",
100
+ "shipped": "Shipped",
101
+ "delivered": "Delivered"
102
+ },
103
+ "infoTitle": "Delivery & payment",
104
+ "billingAddress": "Billing address",
105
+ "paymentMethodLabel": "Payment method",
106
+ "trackingTitle": "Shipment tracking",
107
+ "trackingVia": "Shipped with {carrier}",
108
+ "copyTracking": "Copy tracking number",
109
+ "copied": "Copied",
110
+ "noTracking": "No shipment data available yet."
111
+ },
112
+ "columns": {
113
+ "id": "Order",
114
+ "date": "Date",
115
+ "positions": "Items",
116
+ "total": "Total (net)",
117
+ "status": "Status",
118
+ "payment": "Payment"
119
+ }
120
+ },
121
+ "profile": {
122
+ "title": "Your profile",
123
+ "description": "Manage your personal details and login credentials.",
124
+ "form": {
125
+ "title": "Edit master data",
126
+ "description": "Here you can edit your master data"
127
+ },
128
+ "success": {
129
+ "updated": "Your data was updated successfully"
130
+ },
131
+ "fields": {
132
+ "name": "Name",
133
+ "email": "Email",
134
+ "phone": "Phone",
135
+ "company": "Company",
136
+ "empty": "Not available"
137
+ },
138
+ "actions": {
139
+ "updateData": "Update data",
140
+ "changePassword": "Change password"
141
+ }
142
+ },
143
+ "menu": {
144
+ "profile": "Profile",
145
+ "addresses": "Addresses",
146
+ "settings": "Settings",
147
+ "orders": "Orders",
148
+ "logout": "Logout",
149
+ "accountAriaLabel": "Go to your account"
150
+ },
151
+ "account": {
152
+ "nav": {
153
+ "groups": {
154
+ "account": "Account",
155
+ "orders": "Orders",
156
+ "orderProcess": "Order process",
157
+ "integrations": "Integrations",
158
+ "settings": "Settings"
159
+ },
160
+ "dashboard": "Dashboard",
161
+ "carts": "Carts",
162
+ "orderTemplates": "Order templates",
163
+ "projects": "Projects",
164
+ "devices": "Devices",
165
+ "points": "Points",
166
+ "configurations": "Configurations",
167
+ "inquiries": "Inquiries",
168
+ "quotes": "Quotes",
169
+ "orders": "Orders",
170
+ "deliveries": "Deliveries",
171
+ "subscriptions": "Subscriptions",
172
+ "downloads": "Downloads",
173
+ "statistics": "Statistics",
174
+ "approvals": "Approvals",
175
+ "costCenters": "Cost centers",
176
+ "collectiveOrders": "Collective orders",
177
+ "assortmentRestrictions": "Assortment restrictions",
178
+ "inquiriesAndQuotes": "Inquiries and quotes",
179
+ "punchouts": "Punchouts",
180
+ "orderingDevices": "Ordering devices",
181
+ "mobileScanners": "Mobile scanners",
182
+ "iotDevices": "IoT devices",
183
+ "catalogs": "Catalogs",
184
+ "accountSettings": "Master data",
185
+ "addresses": "Addresses",
186
+ "users": "Users",
187
+ "roles": "Roles",
188
+ "customArticleNumbers": "Custom article numbers",
189
+ "orderLists": "Order lists",
190
+ "requisitions": "Requisitions",
191
+ "workflows": "Workflows",
192
+ "orderSettings": "Ordering settings"
193
+ },
194
+ "dashboard": {
195
+ "title": "Welcome to your account",
196
+ "greeting": "Welcome back, {name}",
197
+ "description": "Your orders, approvals and budgets at a glance.",
198
+ "quickAccess": "Quick access",
199
+ "panelTitle": "Your contact",
200
+ "panelText": "Your personal service team is available on working days from 8 am to 5 pm.",
201
+ "stats": {
202
+ "openOrders": "Open orders",
203
+ "awaitingApproval": "Awaiting approval",
204
+ "spend30": "Spend (30 days)",
205
+ "budgetUsed": "Budget utilization"
206
+ },
207
+ "recentOrders": "Recent orders",
208
+ "openRequisitions": "Open requisitions",
209
+ "budgets": "Cost center budgets",
210
+ "viewAll": "View all",
211
+ "budgetAvailable": "{available} of {total} available",
212
+ "noOrders": "No orders yet.",
213
+ "noRequisitions": "No open requisitions.",
214
+ "noBudgets": "No budgets configured."
215
+ },
216
+ "comingSoon": {
217
+ "title": "In development",
218
+ "description": "This area is part of the product roadmap and will be built here.",
219
+ "back": "Back to dashboard"
220
+ }
221
+ },
222
+ "governance": {
223
+ "approvalRequired": "Approval required",
224
+ "approvals": {
225
+ "title": "Approval limits",
226
+ "description": "Your approval rules: budgets and thresholds above which an approval is required.",
227
+ "columns": {
228
+ "label": "Name",
229
+ "type": "Type",
230
+ "threshold": "Limit / budget",
231
+ "approval": "Approver",
232
+ "deputy": "Deputy"
233
+ },
234
+ "types": {
235
+ "budget": "Budget",
236
+ "order-value": "Order value",
237
+ "unit-price": "Unit price",
238
+ "non-catalog": "Non-catalog"
239
+ },
240
+ "budgetOf": "{available} of {total} available",
241
+ "timeFrame": "time frame {hours} h",
242
+ "infoOnly": "Informational only",
243
+ "add": "Add limit",
244
+ "addTitle": "New approval limit",
245
+ "forUser": "Applies to",
246
+ "saved": "Approval limit saved",
247
+ "searchPlaceholder": "Search by label or approver…",
248
+ "empty": {
249
+ "title": "No approval limits",
250
+ "description": "There are currently no limits configured for your account."
251
+ }
252
+ },
253
+ "costCenters": {
254
+ "title": "Cost centers",
255
+ "description": "Your organization's cost centers with budgets and approval rules.",
256
+ "columns": {
257
+ "code": "Code",
258
+ "label": "Name",
259
+ "budget": "Budget",
260
+ "available": "Available",
261
+ "approver": "Approver"
262
+ },
263
+ "add": "Add cost center",
264
+ "addTitle": "New cost center",
265
+ "editTitle": "Edit cost center",
266
+ "withBudget": "With budget limit",
267
+ "saved": "Cost center saved",
268
+ "notFound": "Cost center not found",
269
+ "utilization": "{percent} % of the budget used",
270
+ "noBudget": "No budget limit is configured for this cost center.",
271
+ "searchPlaceholder": "Search by code, label or approver…",
272
+ "empty": {
273
+ "title": "No cost centers",
274
+ "description": "Create the first cost center via “Add”."
275
+ },
276
+ "ruleTitle": "Approval rule",
277
+ "requisitionsTitle": "Requisitions charged to this cost center",
278
+ "noRequisitions": "No requisitions charged to this cost center yet."
279
+ },
280
+ "requisitions": {
281
+ "title": "Requisitions",
282
+ "description": "All requisitions of your workflows — including the complete approval history.",
283
+ "columns": {
284
+ "id": "Number",
285
+ "workflow": "Workflow",
286
+ "requestedBy": "Requested by",
287
+ "requestedAt": "Requested at",
288
+ "positions": "Positions",
289
+ "totalValue": "Value",
290
+ "status": "Status"
291
+ },
292
+ "status": {
293
+ "open": "Open",
294
+ "ordered": "Ordered",
295
+ "cancelled": "Rejected"
296
+ },
297
+ "details": "Details",
298
+ "positionsTitle": "Positions",
299
+ "historyTitle": "Approval history",
300
+ "step": "Step {step}",
301
+ "actions": {
302
+ "submitted": "Submitted",
303
+ "forwarded": "Forwarded",
304
+ "approved": "Approved",
305
+ "escalated": "Escalated",
306
+ "rejected": "Rejected",
307
+ "ordered": "Ordered",
308
+ "cancelled": "Cancelled"
309
+ },
310
+ "notFound": "Requisition not found",
311
+ "searchPlaceholder": "Search by number, workflow or requester…",
312
+ "empty": {
313
+ "title": "No requisitions",
314
+ "description": "As soon as a workflow creates a requisition, it shows up here."
315
+ },
316
+ "requestedAtShort": "Requested",
317
+ "loadHint": "As an orderer you can load this requisition into the cart and place it."
318
+ },
319
+ "save": "Save",
320
+ "edit": "Edit",
321
+ "saveError": "Saving failed.",
322
+ "selectApprover": "Select approver",
323
+ "selectUser": "Select user",
324
+ "workflows": {
325
+ "title": "Workflows",
326
+ "description": "Your organization's approval flows — from requisition to order.",
327
+ "add": "Add workflow",
328
+ "addTitle": "New workflow",
329
+ "editTitle": "Edit workflow",
330
+ "name": "Name",
331
+ "namePlaceholder": "e.g. Standard purchasing",
332
+ "columns": {
333
+ "name": "Name",
334
+ "steps": "Steps",
335
+ "requesters": "Requesters",
336
+ "orderers": "Orderers"
337
+ },
338
+ "stepTypes": {
339
+ "request": "Request",
340
+ "order": "Order"
341
+ },
342
+ "addStep": "Add request step",
343
+ "removeStep": "Remove step",
344
+ "usersPlaceholder": "Select participants",
345
+ "saved": "Workflow saved",
346
+ "notFound": "Workflow not found",
347
+ "searchPlaceholder": "Search by workflow or participant…",
348
+ "empty": {
349
+ "title": "No workflows",
350
+ "description": "Create the first approval workflow via “Add”."
351
+ },
352
+ "participants": "Participants",
353
+ "requisitionsTitle": "Requisitions in this workflow",
354
+ "noRequisitions": "No requisitions in this workflow yet."
355
+ }
356
+ },
357
+ "orderLists": {
358
+ "title": "Order lists",
359
+ "description": "Shopping and label lists — saved positions that flow straight back into the cart.",
360
+ "add": "Add list",
361
+ "addTitle": "New list",
362
+ "editTitle": "Edit list",
363
+ "namePlaceholder": "e.g. Onboarding kit",
364
+ "columns": {
365
+ "name": "Name",
366
+ "kind": "Type",
367
+ "positions": "Positions",
368
+ "value": "Value",
369
+ "visibility": "Visibility",
370
+ "updatedAt": "Updated"
371
+ },
372
+ "kinds": {
373
+ "shopping": "Shopping list",
374
+ "label": "Label list"
375
+ },
376
+ "public": "Organization",
377
+ "shareWithOrg": "Share with the organization",
378
+ "shareHint": "Shared lists are visible to every user in your organization.",
379
+ "details": "Details",
380
+ "delete": "Delete",
381
+ "saved": "List saved",
382
+ "deleted": "List deleted",
383
+ "error": "Action failed.",
384
+ "addedToCart": "{count} position added to the cart | {count} positions added to the cart",
385
+ "notFound": "List not found",
386
+ "searchPlaceholder": "Search by name or owner…",
387
+ "empty": {
388
+ "title": "No order lists",
389
+ "description": "Create your first order list via “Add”."
390
+ },
391
+ "saveTo": {
392
+ "button": "Add to order list",
393
+ "onLists": "On {count} list | On {count} lists",
394
+ "title": "Add to order list",
395
+ "lastUsed": "Last used",
396
+ "added": "Added to “{list}”",
397
+ "removed": "Removed from “{list}”",
398
+ "createAndAdd": "Create & add",
399
+ "sharedReadOnly": "Shared list — only the owner can change it",
400
+ "error": "The list could not be updated",
401
+ "empty": "No order lists yet — create the first one below."
402
+ }
403
+ },
404
+ "directOrder": {
405
+ "title": "Direct order",
406
+ "description": "Use our convenient tools to capture products into the cart quickly: via quick entry, file upload or bulk capture from the clipboard.",
407
+ "tabs": {
408
+ "entry": "Direct order",
409
+ "upload": "Upload orders",
410
+ "paste": "Bulk capture"
411
+ },
412
+ "columns": {
413
+ "sku": "Article number",
414
+ "customSku": "Customer article number",
415
+ "quantity": "Quantity",
416
+ "name": "Name"
417
+ },
418
+ "skuPlaceholder": "Article number",
419
+ "customSkuPlaceholder": "Customer article number",
420
+ "unknownSku": "Article not found",
421
+ "removeRow": "Remove row",
422
+ "addRow": "Add another row",
423
+ "submitRows": "Add products to cart",
424
+ "added": "{count} item added | {count} items added",
425
+ "upload": {
426
+ "intro1": "Load your entire order into the cart at once.",
427
+ "intro2": "Simply pick the file format from the drop-down and click “Upload order”.",
428
+ "intro3": "You can also pick our template in the desired format and download it via “Download template”.",
429
+ "format": "File format",
430
+ "formats": {
431
+ "xlsx": "Microsoft Excel (*.xlsx)",
432
+ "csv": "Comma-separated values (*.csv)"
433
+ },
434
+ "template": "Download template",
435
+ "submit": "Upload order",
436
+ "xlsxDemoHint": "The demo processes CSV files — Excel parsing comes with the platform connection."
437
+ },
438
+ "paste": {
439
+ "intro1": "Copy your order from any program and paste article numbers, customer article numbers and quantities into the field below — separated by comma or semicolon.",
440
+ "intro2": "Add the article information first, then click “Upload order”.",
441
+ "separator": "Separator",
442
+ "separators": {
443
+ "comma": "Comma",
444
+ "semicolon": "Semicolon"
445
+ },
446
+ "submit": "Upload order"
447
+ },
448
+ "parseSummary": "{found} of {total} lines recognized"
449
+ },
450
+ "preferences": {
451
+ "title": "Ordering settings",
452
+ "description": "Personal preferences for ordering.",
453
+ "cartSection": "Cart",
454
+ "alwaysActive": "Always add to the active cart",
455
+ "alwaysActiveHint": "Adding articles no longer asks which cart the item should go to.",
456
+ "saved": "Setting saved"
457
+ }
458
+ }
@@ -0,0 +1,155 @@
1
+ {
2
+ "auth": {
3
+ "errors": {
4
+ "serviceUnavailable": "A technical problem occurred. Please try again later or contact your administrator."
5
+ },
6
+ "register": {
7
+ "title": "Create your account",
8
+ "description": "Register to access wholesale pricing, manage your orders, and track deliveries — all from a single business account.",
9
+ "fields": {
10
+ "email": "Email",
11
+ "emailPlaceholder": "Email",
12
+ "password": "Password",
13
+ "passwordPlaceholder": "At least 8 characters",
14
+ "passwordConfirm": "Confirm password",
15
+ "passwordConfirmPlaceholder": "Repeat your password",
16
+ "firstName": "First name",
17
+ "lastName": "Last name",
18
+ "company": "Company",
19
+ "companyHint": "Optional — your business or organization",
20
+ "acceptTerms": "I accept the Terms & Conditions",
21
+ "acceptTermsDescription": "By creating an account you agree to our Terms of Service and Privacy Policy. (Demo notice — no actual contract is concluded.)"
22
+ },
23
+ "submit": "Create account",
24
+ "success": {
25
+ "title": "Welcome aboard!",
26
+ "description": "Your account has been created and you are now logged in."
27
+ },
28
+ "errors": {
29
+ "emailFormat": "Please enter a valid email address",
30
+ "passwordsMismatch": "Passwords do not match",
31
+ "unknown": "Something went wrong. Please try again."
32
+ },
33
+ "loginTeaserText": "Already have a business account with us? Sign in to access your orders, order lists and negotiated pricing.",
34
+ "modes": {
35
+ "title": "How would you like to register?",
36
+ "new": {
37
+ "title": "New customer",
38
+ "description": "You don't have an account with us yet — register your company with its master data."
39
+ },
40
+ "existing": {
41
+ "title": "Existing customer",
42
+ "description": "You already order from us — link your online access via your customer number."
43
+ }
44
+ },
45
+ "sections": {
46
+ "company": "Company",
47
+ "address": "Billing address",
48
+ "contact": "Contact person",
49
+ "account": "Account credentials"
50
+ },
51
+ "fields2": {
52
+ "vatId": "VAT ID",
53
+ "vatIdHint": "Optional – for intra-community deliveries",
54
+ "customerNumber": "Customer number",
55
+ "customerNumberHint": "You find your customer number on every invoice",
56
+ "street": "Street",
57
+ "streetNumber": "No.",
58
+ "zip": "ZIP",
59
+ "city": "City",
60
+ "country": "Country",
61
+ "salutation": "Salutation",
62
+ "salutations": {
63
+ "mr": "Mr",
64
+ "ms": "Ms",
65
+ "none": "Not specified"
66
+ },
67
+ "jobTitle": "Job title",
68
+ "jobTitleHint": "Optional – e.g. purchasing, workshop management",
69
+ "phone": "Phone",
70
+ "phoneHint": "Optional – for questions about your orders"
71
+ },
72
+ "companyRequiredHint": "Required – we deliver to business customers only",
73
+ "vettingNotice": "Your registration is reviewed by our sales team. Wholesale prices and ordering are activated after approval."
74
+ },
75
+ "login": {
76
+ "title": "Sign in to your account",
77
+ "description": "Access your orders, invoices, and wholesale pricing.",
78
+ "fields": {
79
+ "email": "Email",
80
+ "emailPlaceholder": "Your email address",
81
+ "password": "Password",
82
+ "passwordPlaceholder": "Your password"
83
+ },
84
+ "submit": "Sign in",
85
+ "forgotPassword": "Forgot your password?",
86
+ "errors": {
87
+ "invalidCredentials": "Email or password is incorrect.",
88
+ "accountBlocked": "This account has been locked. Please contact support.",
89
+ "rateLimited": "Too many attempts. Please try again in a few minutes.",
90
+ "network": "Could not reach the server. Check your connection and try again.",
91
+ "sessionExists": "You are already logged in.",
92
+ "unknown": "Something went wrong. Please try again."
93
+ },
94
+ "heroTitle": "Customer portal + shop + digital services =",
95
+ "heroHighlight": "One account.",
96
+ "heroLine1": "We unite every function under one central customer account.",
97
+ "heroLine2": "Sign in now or register for your personal access.",
98
+ "existingCustomer": "I already have an account",
99
+ "newCustomer": "I am a new customer",
100
+ "newCustomerText": "Register for personal access to prices, orders and digital services.",
101
+ "registerCta": "Become a customer"
102
+ },
103
+ "currentPassword": {
104
+ "fields": {
105
+ "currentPassword": "Your current password",
106
+ "currentPasswordPlaceholder": "Your current password"
107
+ }
108
+ },
109
+ "forgotPassword": {
110
+ "title": "Forgot your password?",
111
+ "description": "Enter the email address associated with your account and we'll send you a link to reset your password.",
112
+ "fields": {
113
+ "email": "Email",
114
+ "emailPlaceholder": "Your email address"
115
+ },
116
+ "submit": "Send reset link",
117
+ "backToLogin": "Back to sign in",
118
+ "success": {
119
+ "title": "Check your inbox",
120
+ "description": "If an account exists for that email, we've sent a password reset link."
121
+ }
122
+ },
123
+ "resetPassword": {
124
+ "title": "Set a new password",
125
+ "description": "Here you can set a new password for your account. Please choose a secure password that you haven't used recently.",
126
+ "fields": {
127
+ "password": "New password",
128
+ "passwordPlaceholder": "At least 8 characters",
129
+ "passwordConfirm": "Confirm new password",
130
+ "passwordConfirmPlaceholder": "Repeat your new password"
131
+ },
132
+ "submit": "Reset password",
133
+ "success": {
134
+ "title": "Password updated",
135
+ "description": "Your password has been reset. You can now sign in."
136
+ },
137
+ "errors": {
138
+ "invalidLink": "This reset link is invalid or has expired. Please request a new one."
139
+ }
140
+ },
141
+ "recovery": {
142
+ "errors": {
143
+ "userNotFound": "No account found for that email address.",
144
+ "rateLimited": "Too many attempts. Please try again in a few minutes.",
145
+ "invalidToken": "This reset link is invalid or has expired. Please request a new one.",
146
+ "passwordRecentlyUsed": "Please choose a password you haven't used recently.",
147
+ "unknown": "Something went wrong. Please try again.",
148
+ "network": "Could not reach the server. Check your connection and try again."
149
+ }
150
+ },
151
+ "logout": {
152
+ "success": "You have been logged out"
153
+ }
154
+ }
155
+ }