From 129ad1a6fa80fb00d714e3bb21afe2cd1f95d599 Mon Sep 17 00:00:00 2001 From: Alexandr SaVBaD Waltz Date: Fri, 27 Jun 2025 00:10:35 +0300 Subject: [PATCH] Features: 1) Build standalone pages for search, contact, catalog, category, brand, product, and home with localized metadata and scoped styles; 2) Add extensive TypeScript definitions for API and app-level structures, including products, orders, brands, and categories; 3) Implement i18n configuration with dynamic browser language detection and fallback system; Fixes: None; Extra: 1) Create Pinia stores for app, user, category, and company management; 2) Add utility functions for error handling and category slug lookups; 3) Include German locale file and robots.txt for improved SEO and accessibility; 4) Add SVG assets and improve general folder structure for better maintainability. --- storefront/README.md | 75 +++++ storefront/app.vue | 124 +++++++ storefront/assets/styles/ui/collapse.scss | 41 +++ storefront/components/base/footer/index.vue | 104 ++++++ storefront/components/base/header/catalog.vue | 272 ++++++++++++++++ storefront/components/base/header/index.vue | 127 ++++++++ storefront/components/cards/brand.vue | 67 ++++ storefront/components/cards/category.vue | 67 ++++ storefront/components/cards/product.vue | 308 ++++++++++++++++++ storefront/components/forms/contact.vue | 85 +++++ storefront/components/home/brands.vue | 64 ++++ .../components/home/category-tags/block.vue | 34 ++ .../components/home/category-tags/index.vue | 21 ++ .../components/skeletons/cards/product.vue | 159 +++++++++ storefront/components/store/filter.vue | 228 +++++++++++++ storefront/components/store/index.vue | 146 +++++++++ storefront/components/store/top.vue | 184 +++++++++++ storefront/components/ui/breadcrumbs.vue | 49 +++ storefront/components/ui/loader.vue | 59 ++++ storefront/components/ui/textarea.vue | 89 +++++ storefront/components/ui/title.vue | 28 ++ storefront/composables/auth/index.ts | 6 + storefront/composables/auth/useLogin.ts | 92 ++++++ storefront/composables/auth/useLogout.ts | 36 ++ storefront/composables/auth/useNewPassword.ts | 59 ++++ .../composables/auth/usePasswordReset.ts | 48 +++ storefront/composables/auth/useRefresh.ts | 76 +++++ storefront/composables/auth/useRegister.ts | 82 +++++ storefront/composables/brands/index.ts | 2 + .../composables/brands/useBrandByUuid.ts | 21 ++ storefront/composables/brands/useBrands.ts | 20 ++ storefront/composables/breadcrumbs/index.ts | 1 + .../composables/breadcrumbs/useBreadcrumbs.ts | 76 +++++ storefront/composables/categories/index.ts | 3 + .../composables/categories/useCategories.ts | 37 +++ .../categories/useCategoryBySlug.ts | 27 ++ .../composables/categories/useCategoryTags.ts | 20 ++ .../composables/company/useCompanyInfo.ts | 25 ++ storefront/composables/config/index.ts | 1 + storefront/composables/config/useAppConfig.ts | 15 + storefront/composables/contact/index.ts | 1 + .../composables/contact/useContactUs.ts | 53 +++ storefront/composables/languages/index.ts | 3 + .../composables/languages/useLanguage.ts | 51 +++ .../languages/useLanguageSwitch.ts | 54 +++ .../languages/useLocaleRedirect.ts | 37 +++ storefront/composables/orders/index.ts | 1 + .../composables/orders/usePendingOrder.ts | 28 ++ .../composables/products/useProductBySlug.ts | 26 ++ .../composables/products/useProductTags.ts | 20 ++ .../composables/products/useProducts.ts | 29 ++ storefront/composables/rules/index.ts | 1 + .../composables/rules/useFormValidation.ts | 44 +++ storefront/composables/search/useSearch.ts | 52 +++ .../composables/search/useSearchCombined.ts | 31 ++ storefront/composables/store/index.ts | 2 + storefront/composables/store/useFilters.ts | 91 ++++++ storefront/composables/store/useStore.ts | 69 ++++ storefront/composables/user/index.ts | 1 + .../composables/user/useUserActivation.ts | 44 +++ storefront/composables/utils/index.ts | 2 + storefront/composables/utils/useMailClient.ts | 40 +++ storefront/composables/utils/usePageTitle.ts | 12 + storefront/composables/wishlist/index.ts | 1 + .../composables/wishlist/useWishlist.ts | 24 ++ storefront/config/i18n.ts | 14 + .../graphql/queries/combined/searchPage.ts | 23 ++ .../graphql/queries/combined/storePage.ts | 24 ++ .../graphql/queries/standalone/categories.ts | 85 +++++ storefront/i18n/locales/de-de.json | 5 + storefront/nuxt.config.ts | 99 ++++++ storefront/pages/brand/[uuid].vue | 36 ++ storefront/pages/catalog/[slug].vue | 54 +++ storefront/pages/catalog/index.vue | 38 +++ storefront/pages/contact.vue | 28 ++ storefront/pages/index.vue | 44 +++ storefront/pages/product/[slug].vue | 38 +++ storefront/pages/search.vue | 100 ++++++ storefront/plugins/apollo.ts | 9 + .../public/images/evibes-big-simple-white.png | 0 storefront/public/images/evibes.svg | 25 ++ storefront/public/robots.txt | 2 + storefront/server/tsconfig.json | 3 + storefront/stores/app.ts | 34 ++ storefront/stores/category.ts | 17 + storefront/stores/company.ts | 13 + storefront/stores/language.ts | 41 +++ storefront/stores/user.ts | 26 ++ storefront/tsconfig.json | 7 + storefront/types/api/auth.ts | 35 ++ storefront/types/api/brands.ts | 9 + storefront/types/api/categories.ts | 40 +++ storefront/types/api/company.ts | 5 + storefront/types/api/contact.ts | 6 + storefront/types/api/languages.ts | 5 + storefront/types/api/orders.ts | 9 + storefront/types/api/products.ts | 22 ++ storefront/types/api/search.ts | 12 + storefront/types/api/store.ts | 6 + storefront/types/api/user.ts | 13 + storefront/types/api/wishlist.ts | 9 + storefront/types/app/brand.ts | 9 + storefront/types/app/category.ts | 19 ++ storefront/types/app/company.ts | 10 + storefront/types/app/languages.ts | 15 + storefront/types/app/orders.ts | 21 ++ storefront/types/app/products.ts | 62 ++++ storefront/types/app/search.ts | 26 ++ storefront/types/app/store.ts | 4 + storefront/types/app/user.ts | 13 + storefront/types/app/wishlist.ts | 10 + storefront/types/index.ts | 29 ++ storefront/utils/error.ts | 7 + 113 files changed, 4856 insertions(+) create mode 100644 storefront/README.md create mode 100644 storefront/app.vue create mode 100644 storefront/assets/styles/ui/collapse.scss create mode 100644 storefront/components/base/footer/index.vue create mode 100644 storefront/components/base/header/catalog.vue create mode 100644 storefront/components/base/header/index.vue create mode 100644 storefront/components/cards/brand.vue create mode 100644 storefront/components/cards/category.vue create mode 100644 storefront/components/cards/product.vue create mode 100644 storefront/components/forms/contact.vue create mode 100644 storefront/components/home/brands.vue create mode 100644 storefront/components/home/category-tags/block.vue create mode 100644 storefront/components/home/category-tags/index.vue create mode 100644 storefront/components/skeletons/cards/product.vue create mode 100644 storefront/components/store/filter.vue create mode 100644 storefront/components/store/index.vue create mode 100644 storefront/components/store/top.vue create mode 100644 storefront/components/ui/breadcrumbs.vue create mode 100644 storefront/components/ui/loader.vue create mode 100644 storefront/components/ui/textarea.vue create mode 100644 storefront/components/ui/title.vue create mode 100644 storefront/composables/auth/index.ts create mode 100644 storefront/composables/auth/useLogin.ts create mode 100644 storefront/composables/auth/useLogout.ts create mode 100644 storefront/composables/auth/useNewPassword.ts create mode 100644 storefront/composables/auth/usePasswordReset.ts create mode 100644 storefront/composables/auth/useRefresh.ts create mode 100644 storefront/composables/auth/useRegister.ts create mode 100644 storefront/composables/brands/index.ts create mode 100644 storefront/composables/brands/useBrandByUuid.ts create mode 100644 storefront/composables/brands/useBrands.ts create mode 100644 storefront/composables/breadcrumbs/index.ts create mode 100644 storefront/composables/breadcrumbs/useBreadcrumbs.ts create mode 100644 storefront/composables/categories/index.ts create mode 100644 storefront/composables/categories/useCategories.ts create mode 100644 storefront/composables/categories/useCategoryBySlug.ts create mode 100644 storefront/composables/categories/useCategoryTags.ts create mode 100644 storefront/composables/company/useCompanyInfo.ts create mode 100644 storefront/composables/config/index.ts create mode 100644 storefront/composables/config/useAppConfig.ts create mode 100644 storefront/composables/contact/index.ts create mode 100644 storefront/composables/contact/useContactUs.ts create mode 100644 storefront/composables/languages/index.ts create mode 100644 storefront/composables/languages/useLanguage.ts create mode 100644 storefront/composables/languages/useLanguageSwitch.ts create mode 100644 storefront/composables/languages/useLocaleRedirect.ts create mode 100644 storefront/composables/orders/index.ts create mode 100644 storefront/composables/orders/usePendingOrder.ts create mode 100644 storefront/composables/products/useProductBySlug.ts create mode 100644 storefront/composables/products/useProductTags.ts create mode 100644 storefront/composables/products/useProducts.ts create mode 100644 storefront/composables/rules/index.ts create mode 100644 storefront/composables/rules/useFormValidation.ts create mode 100644 storefront/composables/search/useSearch.ts create mode 100644 storefront/composables/search/useSearchCombined.ts create mode 100644 storefront/composables/store/index.ts create mode 100644 storefront/composables/store/useFilters.ts create mode 100644 storefront/composables/store/useStore.ts create mode 100644 storefront/composables/user/index.ts create mode 100644 storefront/composables/user/useUserActivation.ts create mode 100644 storefront/composables/utils/index.ts create mode 100644 storefront/composables/utils/useMailClient.ts create mode 100644 storefront/composables/utils/usePageTitle.ts create mode 100644 storefront/composables/wishlist/index.ts create mode 100644 storefront/composables/wishlist/useWishlist.ts create mode 100644 storefront/config/i18n.ts create mode 100644 storefront/graphql/queries/combined/searchPage.ts create mode 100644 storefront/graphql/queries/combined/storePage.ts create mode 100644 storefront/graphql/queries/standalone/categories.ts create mode 100644 storefront/i18n/locales/de-de.json create mode 100644 storefront/nuxt.config.ts create mode 100644 storefront/pages/brand/[uuid].vue create mode 100644 storefront/pages/catalog/[slug].vue create mode 100644 storefront/pages/catalog/index.vue create mode 100644 storefront/pages/contact.vue create mode 100644 storefront/pages/index.vue create mode 100644 storefront/pages/product/[slug].vue create mode 100644 storefront/pages/search.vue create mode 100644 storefront/plugins/apollo.ts create mode 100644 storefront/public/images/evibes-big-simple-white.png create mode 100644 storefront/public/images/evibes.svg create mode 100644 storefront/public/robots.txt create mode 100644 storefront/server/tsconfig.json create mode 100644 storefront/stores/app.ts create mode 100644 storefront/stores/category.ts create mode 100644 storefront/stores/company.ts create mode 100644 storefront/stores/language.ts create mode 100644 storefront/stores/user.ts create mode 100644 storefront/tsconfig.json create mode 100644 storefront/types/api/auth.ts create mode 100644 storefront/types/api/brands.ts create mode 100644 storefront/types/api/categories.ts create mode 100644 storefront/types/api/company.ts create mode 100644 storefront/types/api/contact.ts create mode 100644 storefront/types/api/languages.ts create mode 100644 storefront/types/api/orders.ts create mode 100644 storefront/types/api/products.ts create mode 100644 storefront/types/api/search.ts create mode 100644 storefront/types/api/store.ts create mode 100644 storefront/types/api/user.ts create mode 100644 storefront/types/api/wishlist.ts create mode 100644 storefront/types/app/brand.ts create mode 100644 storefront/types/app/category.ts create mode 100644 storefront/types/app/company.ts create mode 100644 storefront/types/app/languages.ts create mode 100644 storefront/types/app/orders.ts create mode 100644 storefront/types/app/products.ts create mode 100644 storefront/types/app/search.ts create mode 100644 storefront/types/app/store.ts create mode 100644 storefront/types/app/user.ts create mode 100644 storefront/types/app/wishlist.ts create mode 100644 storefront/types/index.ts create mode 100644 storefront/utils/error.ts diff --git a/storefront/README.md b/storefront/README.md new file mode 100644 index 00000000..25b58212 --- /dev/null +++ b/storefront/README.md @@ -0,0 +1,75 @@ +# Nuxt Minimal Starter + +Look at the [Nuxt documentation](https://nuxt.com/docs/getting-started/introduction) to learn more. + +## Setup + +Make sure to install dependencies: + +```bash +# npm +npm install + +# pnpm +pnpm install + +# yarn +yarn install + +# bun +bun install +``` + +## Development Server + +Start the development server on `http://localhost:3000`: + +```bash +# npm +npm run dev + +# pnpm +pnpm dev + +# yarn +yarn dev + +# bun +bun run dev +``` + +## Production + +Build the application for production: + +```bash +# npm +npm run build + +# pnpm +pnpm build + +# yarn +yarn build + +# bun +bun run build +``` + +Locally preview production build: + +```bash +# npm +npm run preview + +# pnpm +pnpm preview + +# yarn +yarn preview + +# bun +bun run preview +``` + +Check out the [deployment documentation](https://nuxt.com/docs/getting-started/deployment) for more information. diff --git a/storefront/app.vue b/storefront/app.vue new file mode 100644 index 00000000..6b3a5ff7 --- /dev/null +++ b/storefront/app.vue @@ -0,0 +1,124 @@ + + + + + \ No newline at end of file diff --git a/storefront/assets/styles/ui/collapse.scss b/storefront/assets/styles/ui/collapse.scss new file mode 100644 index 00000000..ce7072a4 --- /dev/null +++ b/storefront/assets/styles/ui/collapse.scss @@ -0,0 +1,41 @@ +@use "../global/variables" as *; + +.el-collapse { + border: none !important; + display: flex; + flex-direction: column; + gap: 20px; + padding-block: 20px +} +.el-collapse-item { + border-radius: $default_border_radius; + border: 1px solid $accentDark; + background-color: rgba($accent, 0.2); + box-shadow: 0 0 10px 1px rgba(0, 0, 0, 0.3); +} +.el-collapse-item__header { + background-color: transparent !important; + border-bottom: none !important; + line-height: 100% !important; + font-size: 14px !important; + font-weight: 600 !important; + padding-inline: 8px !important; + color: $accentDark !important; +} +.el-collapse-item__header.focusing:focus:not(:hover) { + color: $accentDark !important; +} +.el-collapse-item__wrap { + border-top: 2px solid $accentDark; + border-bottom: none !important; + background-color: transparent !important; +} +.el-collapse-item__content { + padding: 10px !important; + display: flex; + flex-direction: column; + gap: 5px; +} +.el-icon { + display: none !important; +} \ No newline at end of file diff --git a/storefront/components/base/footer/index.vue b/storefront/components/base/footer/index.vue new file mode 100644 index 00000000..340fbbe6 --- /dev/null +++ b/storefront/components/base/footer/index.vue @@ -0,0 +1,104 @@ + + + + + \ No newline at end of file diff --git a/storefront/components/base/header/catalog.vue b/storefront/components/base/header/catalog.vue new file mode 100644 index 00000000..44e8187d --- /dev/null +++ b/storefront/components/base/header/catalog.vue @@ -0,0 +1,272 @@ + + + + + \ No newline at end of file diff --git a/storefront/components/base/header/index.vue b/storefront/components/base/header/index.vue new file mode 100644 index 00000000..4d740d68 --- /dev/null +++ b/storefront/components/base/header/index.vue @@ -0,0 +1,127 @@ + + + + + \ No newline at end of file diff --git a/storefront/components/cards/brand.vue b/storefront/components/cards/brand.vue new file mode 100644 index 00000000..8570d1a9 --- /dev/null +++ b/storefront/components/cards/brand.vue @@ -0,0 +1,67 @@ + + + + + \ No newline at end of file diff --git a/storefront/components/cards/category.vue b/storefront/components/cards/category.vue new file mode 100644 index 00000000..6a08563c --- /dev/null +++ b/storefront/components/cards/category.vue @@ -0,0 +1,67 @@ + + + + + \ No newline at end of file diff --git a/storefront/components/cards/product.vue b/storefront/components/cards/product.vue new file mode 100644 index 00000000..ceee15d6 --- /dev/null +++ b/storefront/components/cards/product.vue @@ -0,0 +1,308 @@ + + + + + \ No newline at end of file diff --git a/storefront/components/forms/contact.vue b/storefront/components/forms/contact.vue new file mode 100644 index 00000000..52d06941 --- /dev/null +++ b/storefront/components/forms/contact.vue @@ -0,0 +1,85 @@ + + + + + \ No newline at end of file diff --git a/storefront/components/home/brands.vue b/storefront/components/home/brands.vue new file mode 100644 index 00000000..ceaee0bf --- /dev/null +++ b/storefront/components/home/brands.vue @@ -0,0 +1,64 @@ + + + + + \ No newline at end of file diff --git a/storefront/components/home/category-tags/block.vue b/storefront/components/home/category-tags/block.vue new file mode 100644 index 00000000..667a819c --- /dev/null +++ b/storefront/components/home/category-tags/block.vue @@ -0,0 +1,34 @@ + + + + + \ No newline at end of file diff --git a/storefront/components/home/category-tags/index.vue b/storefront/components/home/category-tags/index.vue new file mode 100644 index 00000000..7fc7ebc2 --- /dev/null +++ b/storefront/components/home/category-tags/index.vue @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/storefront/components/skeletons/cards/product.vue b/storefront/components/skeletons/cards/product.vue new file mode 100644 index 00000000..f9666495 --- /dev/null +++ b/storefront/components/skeletons/cards/product.vue @@ -0,0 +1,159 @@ + + + + + \ No newline at end of file diff --git a/storefront/components/store/filter.vue b/storefront/components/store/filter.vue new file mode 100644 index 00000000..cd7a78a1 --- /dev/null +++ b/storefront/components/store/filter.vue @@ -0,0 +1,228 @@ + + + + + \ No newline at end of file diff --git a/storefront/components/store/index.vue b/storefront/components/store/index.vue new file mode 100644 index 00000000..e23d04df --- /dev/null +++ b/storefront/components/store/index.vue @@ -0,0 +1,146 @@ + + + + + \ No newline at end of file diff --git a/storefront/components/store/top.vue b/storefront/components/store/top.vue new file mode 100644 index 00000000..440c7b92 --- /dev/null +++ b/storefront/components/store/top.vue @@ -0,0 +1,184 @@ + + + + + \ No newline at end of file diff --git a/storefront/components/ui/breadcrumbs.vue b/storefront/components/ui/breadcrumbs.vue new file mode 100644 index 00000000..b89700b5 --- /dev/null +++ b/storefront/components/ui/breadcrumbs.vue @@ -0,0 +1,49 @@ + + + + + \ No newline at end of file diff --git a/storefront/components/ui/loader.vue b/storefront/components/ui/loader.vue new file mode 100644 index 00000000..d7571037 --- /dev/null +++ b/storefront/components/ui/loader.vue @@ -0,0 +1,59 @@ + + + + + \ No newline at end of file diff --git a/storefront/components/ui/textarea.vue b/storefront/components/ui/textarea.vue new file mode 100644 index 00000000..bf60a8b1 --- /dev/null +++ b/storefront/components/ui/textarea.vue @@ -0,0 +1,89 @@ +