@crm-market/template-shared 1.0.7 → 1.0.8

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 (138) hide show
  1. package/assets/scss/_variables.scss +3 -3
  2. package/assets/scss/components/_header.scss +1 -1
  3. package/assets/scss/style.css +4 -4
  4. package/components/AboutUs/StaticContent.vue +32 -0
  5. package/components/Cart/CartEmpty.vue +42 -0
  6. package/components/Cart/CartItem.vue +145 -0
  7. package/components/Cart/CartSummary.vue +57 -0
  8. package/components/Cart/ProductQuantity.vue +23 -13
  9. package/components/Cart/index.vue +68 -150
  10. package/components/Categories/index.vue +88 -291
  11. package/components/Checkout/AddressFields.vue +74 -0
  12. package/components/Checkout/CheckoutForm.vue +75 -0
  13. package/components/Checkout/CityAutocomplete.vue +68 -0
  14. package/components/Checkout/DeliveryMethodCard.vue +66 -0
  15. package/components/Checkout/DeliveryOptions.vue +148 -0
  16. package/components/Checkout/OrderSummary.vue +116 -0
  17. package/components/Checkout/PaymentOptions.vue +76 -0
  18. package/components/Checkout/PickupPoints.vue +46 -0
  19. package/components/Checkout/PromoCode.vue +166 -0
  20. package/components/Checkout/index.vue +235 -173
  21. package/components/Checkout/types.ts +45 -0
  22. package/components/Common/PageBanner.vue +22 -20
  23. package/components/Common/ProductCard.vue +139 -115
  24. package/components/Common/Services.vue +4 -4
  25. package/components/Contact/ContactForm.vue +44 -74
  26. package/components/Contact/ContactInfo.vue +35 -61
  27. package/components/FAQ/index.vue +6 -119
  28. package/components/Layout/Copyright.vue +11 -9
  29. package/components/Layout/Footer.vue +49 -136
  30. package/components/Layout/HeaderBar.vue +174 -0
  31. package/components/Layout/HeaderLogo.vue +27 -0
  32. package/components/Layout/MiddleHeader.vue +1 -228
  33. package/components/Layout/MiddleHeaderThree.vue +1 -203
  34. package/components/Layout/MiddleHeaderTwo.vue +1 -239
  35. package/components/Layout/NavLinks.vue +23 -0
  36. package/components/Layout/Navbar.vue +38 -151
  37. package/components/Layout/NavbarStyleFour.vue +1 -332
  38. package/components/Layout/NavbarStyleThree.vue +1 -188
  39. package/components/Layout/NavbarStyleTwo.vue +1 -108
  40. package/components/Layout/Preloader.vue +5 -12
  41. package/components/Layout/ResponsiveNavbar.vue +32 -418
  42. package/components/Layout/SitewideBanner.vue +285 -0
  43. package/components/Layout/TopHeader.vue +17 -83
  44. package/components/Layout/layoutData.ts +83 -0
  45. package/components/PrivacyPolicy/index.vue +6 -110
  46. package/components/ProductDetails/ProductDetailsTab.vue +31 -321
  47. package/components/ProductDetails/ProductGallery.vue +45 -0
  48. package/components/ProductDetails/ProductQuantity.vue +8 -14
  49. package/components/ProductDetails/RecentlyViewed.vue +53 -289
  50. package/components/ProductDetails/RelatedProducts.vue +64 -0
  51. package/components/ProductDetails/index.vue +90 -230
  52. package/components/Products/index.vue +78 -16
  53. package/components/TermsConditions/index.vue +6 -110
  54. package/components/Wishlist/index.vue +62 -88
  55. package/composables/useCart.ts +133 -81
  56. package/composables/useCategories.ts +66 -29
  57. package/composables/useCategoryImages.ts +45 -0
  58. package/composables/useCheckout.ts +302 -95
  59. package/composables/useContactForm.ts +57 -0
  60. package/composables/useHomeContent.ts +220 -0
  61. package/composables/useI18n.ts +12 -24
  62. package/composables/useJsonLd.ts +162 -0
  63. package/composables/useProducts.ts +244 -81
  64. package/composables/useRecent.ts +30 -0
  65. package/composables/useSanitize.ts +76 -0
  66. package/composables/useSiteConfig.ts +51 -45
  67. package/composables/useStaticPages.ts +48 -0
  68. package/composables/useStoreOrigin.ts +32 -0
  69. package/composables/useTemplateSections.ts +51 -3
  70. package/composables/useThemeVars.ts +113 -0
  71. package/composables/useWishlist.ts +72 -0
  72. package/layouts/default.vue +80 -19
  73. package/locales/en.json +255 -86
  74. package/locales/uk.json +251 -82
  75. package/modules/template-schema.ts +35 -0
  76. package/nuxt.config.ts +8 -11
  77. package/package.json +1 -1
  78. package/pages/about-us.vue +9 -9
  79. package/pages/cart.vue +0 -1
  80. package/pages/categories.vue +0 -1
  81. package/pages/category/[slug].vue +84 -0
  82. package/pages/checkout.vue +0 -1
  83. package/pages/contact.vue +6 -6
  84. package/pages/delivery.vue +12 -0
  85. package/pages/faq.vue +6 -6
  86. package/pages/order-success.vue +113 -0
  87. package/pages/privacy-policy.vue +6 -6
  88. package/pages/product/[slug].vue +82 -0
  89. package/pages/product-details.vue +14 -6
  90. package/pages/products.vue +12 -1
  91. package/pages/returns.vue +12 -0
  92. package/pages/terms-conditions.vue +6 -6
  93. package/pages/wishlist.vue +2 -2
  94. package/utils/seo-urls.ts +70 -0
  95. package/utils/store-origin.ts +36 -0
  96. package/components/AboutUs/AboutUsTuan.vue +0 -25
  97. package/components/AboutUs/Statistics.vue +0 -42
  98. package/components/AboutUs/SubscribeToTheNewsletter.vue +0 -57
  99. package/components/AddAddress/index.vue +0 -68
  100. package/components/BestSellers/Products.vue +0 -1562
  101. package/components/BestSellers/RecentlyViewed.vue +0 -304
  102. package/components/ChangePassword/index.vue +0 -69
  103. package/components/Common/DashboardNavigation.vue +0 -35
  104. package/components/Dashboard/RecentOrder.vue +0 -173
  105. package/components/Dashboard/index.vue +0 -77
  106. package/components/EditAddress/index.vue +0 -117
  107. package/components/EditProfile/index.vue +0 -95
  108. package/components/FeaturedProduct/FeaturedProducts.vue +0 -304
  109. package/components/FeaturedProduct/Products.vue +0 -1562
  110. package/components/ForgotPassword/index.vue +0 -49
  111. package/components/Layout/FooterTwo.vue +0 -159
  112. package/components/Layout/LocationOption.vue +0 -178
  113. package/components/Layout/RTLSwitchBtn.vue +0 -40
  114. package/components/Login/index.vue +0 -89
  115. package/components/MyAccount/index.vue +0 -154
  116. package/components/NewArrivals/Products.vue +0 -1969
  117. package/components/NewArrivals/RecentlyViewed.vue +0 -304
  118. package/components/OrderDetails/index.vue +0 -75
  119. package/components/OrderHistory/index.vue +0 -195
  120. package/components/Products/RecentlyViewed.vue +0 -302
  121. package/components/Register/index.vue +0 -83
  122. package/components/TrendingProducts/FeaturedProducts.vue +0 -304
  123. package/components/TrendingProducts/Products.vue +0 -1564
  124. package/components/Wishlist/ProductQuantity.vue +0 -29
  125. package/layouts/inner.vue +0 -70
  126. package/locales/ar.json +0 -234
  127. package/locales/ru.json +0 -234
  128. package/pages/address.vue +0 -11
  129. package/pages/change-password.vue +0 -11
  130. package/pages/dashboard.vue +0 -11
  131. package/pages/edit-address.vue +0 -11
  132. package/pages/edit-profile.vue +0 -11
  133. package/pages/forgot-password.vue +0 -11
  134. package/pages/login.vue +0 -11
  135. package/pages/my-account.vue +0 -11
  136. package/pages/order-details.vue +0 -11
  137. package/pages/order-history.vue +0 -11
  138. package/pages/register.vue +0 -11
@@ -1,433 +1,47 @@
1
+ <script setup lang="ts">
2
+ // Мобільне меню (offcanvas): ті самі пункти, що й у десктопному меню
3
+ import stateStore from '~/utils/store';
4
+ import { NAV_ITEMS, useLayoutData } from './layoutData';
5
+
6
+ const { t } = useI18n();
7
+ const { phone, email, workingHours } = useLayoutData();
8
+ </script>
9
+
1
10
  <template>
2
- <div
3
- :class="[
4
- 'mobile-navbar offcanvas offcanvas-end border-0',
5
- { show: stateStoreInstance.show },
6
- ]"
7
- >
11
+ <div :class="['mobile-navbar offcanvas offcanvas-end border-0', { show: stateStore.show }]">
8
12
  <div class="offcanvas-header justify-space-between">
9
- <NuxtLink to="/" class="logo d-inline-block">
10
- <img src="~/assets/images/logo.png" alt="logo" />
13
+ <NuxtLink to="/" class="logo d-inline-block" @click="stateStore.onChangeShow">
14
+ <LayoutHeaderLogo />
11
15
  </NuxtLink>
12
-
13
16
  <button
14
17
  type="button"
15
18
  class="close-btn bg-transparent position-relative lh-1 p-0 border-0"
16
- @click="stateStoreInstance.onChangeShow"
19
+ :aria-label="t('layout.menu.close')"
20
+ @click="stateStore.onChangeShow"
17
21
  >
18
22
  <i class="ri-close-fill"></i>
19
23
  </button>
20
24
  </div>
21
25
 
22
26
  <div class="offcanvas-body">
23
- <v-expansion-panels variant="accordion" v-model="panel">
24
- <v-expansion-panel>
25
- <v-expansion-panel-title>{{ t('nav.home') }}</v-expansion-panel-title>
26
- <v-expansion-panel-text>
27
- <ul class="mobile-menu-items">
28
- <li>
29
- <NuxtLink
30
- class="dropdown-item"
31
- to="/"
32
- @click="stateStoreInstance.onChangeShow"
33
- >
34
- Electronics & Telemobile Online Shop
35
- </NuxtLink>
36
- </li>
37
- <li>
38
- <NuxtLink
39
- class="dropdown-item"
40
- to="/grocery-shop"
41
- @click="stateStoreInstance.onChangeShow"
42
- >
43
- Grocery Shop
44
- </NuxtLink>
45
- </li>
46
- <li>
47
- <NuxtLink
48
- class="dropdown-item"
49
- to="/healthy-diet-foods-shop"
50
- @click="stateStoreInstance.onChangeShow"
51
- >
52
- Healthy Diet Foods Shop
53
- </NuxtLink>
54
- </li>
55
- </ul>
56
- </v-expansion-panel-text>
57
- </v-expansion-panel>
58
- <v-expansion-panel>
59
- <v-expansion-panel-title>{{ t('nav.pages') }}</v-expansion-panel-title>
60
- <v-expansion-panel-text>
61
- <ul class="mobile-menu-items">
62
- <li>
63
- <NuxtLink
64
- class="dropdown-item"
65
- to="/about-us"
66
- @click="stateStoreInstance.onChangeShow"
67
- >
68
- {{ t('nav.aboutUs') }}
69
- </NuxtLink>
70
- </li>
71
- <li class="mobile-menu-list">
72
- <v-expansion-panels variant="accordion">
73
- <v-expansion-panel>
74
- <v-expansion-panel-title>
75
- {{ t('nav.authentication') }}
76
- </v-expansion-panel-title>
77
- <v-expansion-panel-text>
78
- <ul class="mobile-menu-items sub-dropdown">
79
- <li>
80
- <NuxtLink
81
- class="dropdown-item"
82
- to="/login"
83
- @click="stateStoreInstance.onChangeShow"
84
- >
85
- {{ t('auth.login') }}
86
- </NuxtLink>
87
- </li>
88
- <li>
89
- <NuxtLink
90
- class="dropdown-item"
91
- to="/register"
92
- @click="stateStoreInstance.onChangeShow"
93
- >
94
- {{ t('auth.register') }}
95
- </NuxtLink>
96
- </li>
97
- <li>
98
- <NuxtLink
99
- class="dropdown-item"
100
- to="/my-account"
101
- @click="stateStoreInstance.onChangeShow"
102
- >
103
- {{ t('account.myAccount') }}
104
- </NuxtLink>
105
- </li>
106
- <li>
107
- <NuxtLink
108
- class="dropdown-item"
109
- to="/change-password"
110
- @click="stateStoreInstance.onChangeShow"
111
- >
112
- {{ t('auth.changePassword') }}
113
- </NuxtLink>
114
- </li>
115
- <li>
116
- <NuxtLink
117
- class="dropdown-item"
118
- to="/forgot-password"
119
- @click="stateStoreInstance.onChangeShow"
120
- >
121
- {{ t('auth.forgotPassword') }}
122
- </NuxtLink>
123
- </li>
124
- </ul>
125
- </v-expansion-panel-text>
126
- </v-expansion-panel>
127
- </v-expansion-panels>
128
- </li>
129
- <li>
130
- <NuxtLink
131
- class="dropdown-item"
132
- to="/faq"
133
- @click="stateStoreInstance.onChangeShow"
134
- >
135
- {{ t('nav.faqs') }}
136
- </NuxtLink>
137
- </li>
138
- <li>
139
- <NuxtLink
140
- class="dropdown-item"
141
- to="/privacy-policy"
142
- @click="stateStoreInstance.onChangeShow"
143
- >
144
- {{ t('common.privacyPolicy') }}
145
- </NuxtLink>
146
- </li>
147
- <li>
148
- <NuxtLink
149
- class="dropdown-item"
150
- to="/terms-conditions"
151
- @click="stateStoreInstance.onChangeShow"
152
- >
153
- {{ t('common.termsConditions') }}
154
- </NuxtLink>
155
- </li>
156
- </ul>
157
- </v-expansion-panel-text>
158
- </v-expansion-panel>
159
- <v-expansion-panel>
160
- <v-expansion-panel-title>{{ t('nav.shop') }}</v-expansion-panel-title>
161
- <v-expansion-panel-text>
162
- <ul class="mobile-menu-items">
163
- <li class="mobile-menu-list">
164
- <v-expansion-panels variant="accordion">
165
- <v-expansion-panel>
166
- <v-expansion-panel-title>
167
- {{ t('nav.productLayouts') }}
168
- </v-expansion-panel-title>
169
- <v-expansion-panel-text>
170
- <ul class="mobile-menu-items sub-dropdown">
171
- <li>
172
- <NuxtLink
173
- class="dropdown-item"
174
- to="/best-sellers"
175
- @click="stateStoreInstance.onChangeShow"
176
- >
177
- {{ t('product.bestSellers') }}
178
- </NuxtLink>
179
- </li>
180
- <li>
181
- <NuxtLink
182
- class="dropdown-item"
183
- to="/featured-products"
184
- @click="stateStoreInstance.onChangeShow"
185
- >
186
- {{ t('product.featuredProducts') }}
187
- </NuxtLink>
188
- </li>
189
- <li>
190
- <NuxtLink
191
- class="dropdown-item"
192
- to="/trending-products"
193
- @click="stateStoreInstance.onChangeShow"
194
- >
195
- {{ t('product.trendingProducts') }}
196
- </NuxtLink>
197
- </li>
198
- <li>
199
- <NuxtLink
200
- class="dropdown-item"
201
- to="/new-arrivals"
202
- @click="stateStoreInstance.onChangeShow"
203
- >
204
- {{ t('product.newArrivals') }}
205
- </NuxtLink>
206
- </li>
207
- <li>
208
- <NuxtLink
209
- class="dropdown-item"
210
- to="/categories"
211
- @click="stateStoreInstance.onChangeShow"
212
- >
213
- {{ t('nav.categories') }}
214
- </NuxtLink>
215
- </li>
216
- </ul>
217
- </v-expansion-panel-text>
218
- </v-expansion-panel>
219
- </v-expansion-panels>
220
- </li>
221
- <li class="mobile-menu-list">
222
- <v-expansion-panels variant="accordion">
223
- <v-expansion-panel>
224
- <v-expansion-panel-title>
225
- {{ t('nav.productsStep') }}
226
- </v-expansion-panel-title>
227
- <v-expansion-panel-text>
228
- <ul class="mobile-menu-items sub-dropdown">
229
- <li>
230
- <NuxtLink
231
- class="dropdown-item"
232
- to="/products"
233
- @click="stateStoreInstance.onChangeShow"
234
- >
235
- {{ t('nav.products') }}
236
- </NuxtLink>
237
- </li>
238
- <li>
239
- <NuxtLink
240
- class="dropdown-item"
241
- to="/cart"
242
- @click="stateStoreInstance.onChangeShow"
243
- >
244
- {{ t('cart.cart') }}
245
- </NuxtLink>
246
- </li>
247
- <li>
248
- <NuxtLink
249
- class="dropdown-item"
250
- to="/wishlist"
251
- @click="stateStoreInstance.onChangeShow"
252
- >
253
- {{ t('product.wishlist') }}
254
- </NuxtLink>
255
- </li>
256
- <li>
257
- <NuxtLink
258
- class="dropdown-item"
259
- to="/checkout"
260
- @click="stateStoreInstance.onChangeShow"
261
- >
262
- {{ t('account.checkout') }}
263
- </NuxtLink>
264
- </li>
265
- <li>
266
- <NuxtLink
267
- class="dropdown-item"
268
- to="/product-details"
269
- @click="stateStoreInstance.onChangeShow"
270
- >
271
- {{ t('product.productDetails') }}
272
- </NuxtLink>
273
- </li>
274
- </ul>
275
- </v-expansion-panel-text>
276
- </v-expansion-panel>
277
- </v-expansion-panels>
278
- </li>
279
- <li class="mobile-menu-list">
280
- <v-expansion-panels variant="accordion">
281
- <v-expansion-panel>
282
- <v-expansion-panel-title>
283
- {{ t('nav.adminPage') }}
284
- </v-expansion-panel-title>
285
- <v-expansion-panel-text>
286
- <ul class="mobile-menu-items sub-dropdown mb-3">
287
- <li>
288
- <NuxtLink
289
- class="dropdown-item"
290
- to="/dashboard"
291
- @click="stateStoreInstance.onChangeShow"
292
- >
293
- {{ t('account.dashboard') }}
294
- </NuxtLink>
295
- </li>
296
- <li>
297
- <NuxtLink
298
- class="dropdown-item"
299
- to="/edit-profile"
300
- @click="stateStoreInstance.onChangeShow"
301
- >
302
- {{ t('account.editProfile') }}
303
- </NuxtLink>
304
- </li>
305
- <li>
306
- <NuxtLink
307
- class="dropdown-item"
308
- to="/order-history"
309
- @click="stateStoreInstance.onChangeShow"
310
- >
311
- {{ t('account.orderHistory') }}
312
- </NuxtLink>
313
- </li>
314
- <li>
315
- <NuxtLink
316
- class="dropdown-item"
317
- to="/order-details"
318
- @click="stateStoreInstance.onChangeShow"
319
- >
320
- {{ t('account.orderDetails') }}
321
- </NuxtLink>
322
- </li>
323
- <li>
324
- <NuxtLink
325
- class="dropdown-item"
326
- to="/change-password"
327
- @click="stateStoreInstance.onChangeShow"
328
- >
329
- {{ t('auth.changePassword') }}
330
- </NuxtLink>
331
- </li>
332
- </ul>
333
- </v-expansion-panel-text>
334
- </v-expansion-panel>
335
- </v-expansion-panels>
336
- </li>
337
- </ul>
338
- </v-expansion-panel-text>
339
- </v-expansion-panel>
340
- <v-expansion-panel>
341
- <v-expansion-panel-title>{{ t('nav.blog') }}</v-expansion-panel-title>
342
- <v-expansion-panel-text>
343
- <ul class="mobile-menu-items">
344
- <li>
345
- <NuxtLink
346
- class="dropdown-item"
347
- to="/our-blog"
348
- @click="stateStoreInstance.onChangeShow"
349
- >
350
- {{ t('nav.ourBlog') }}
351
- </NuxtLink>
352
- </li>
353
- <li>
354
- <NuxtLink
355
- class="dropdown-item"
356
- to="/blog-details"
357
- @click="stateStoreInstance.onChangeShow"
358
- >
359
- {{ t('nav.blogDetails') }}
360
- </NuxtLink>
361
- </li>
362
- <li>
363
- <NuxtLink
364
- class="dropdown-item"
365
- to="/tags"
366
- @click="stateStoreInstance.onChangeShow"
367
- >
368
- {{ t('nav.tags') }}
369
- </NuxtLink>
370
- </li>
371
- <li>
372
- <NuxtLink
373
- class="dropdown-item"
374
- to="/categories"
375
- @click="stateStoreInstance.onChangeShow"
376
- >
377
- {{ t('nav.categories') }}
378
- </NuxtLink>
379
- </li>
380
- <li>
381
- <NuxtLink
382
- class="dropdown-item"
383
- to="/author"
384
- @click="stateStoreInstance.onChangeShow"
385
- >
386
- {{ t('nav.author') }}
387
- </NuxtLink>
388
- </li>
389
- </ul>
390
- </v-expansion-panel-text>
391
- </v-expansion-panel>
392
- <v-expansion-panel>
393
- <v-expansion-panel-title class="without-icon">
394
- <NuxtLink to="/contact" @click="stateStoreInstance.onChangeShow">
395
- {{ t('nav.contact') }}
396
- </NuxtLink>
397
- </v-expansion-panel-title>
398
- </v-expansion-panel>
399
- </v-expansion-panels>
27
+ <ul class="list-unstyled mb-4">
28
+ <li v-for="item in NAV_ITEMS" :key="item.to" class="border-bottom">
29
+ <NuxtLink
30
+ class="d-block py-3 fw-medium text-dark text-decoration-none"
31
+ :to="item.to"
32
+ :active-class="item.to === '/' ? '' : 'text-success'"
33
+ exact-active-class="text-success"
34
+ @click="stateStore.onChangeShow"
35
+ >
36
+ {{ t(item.key) }}
37
+ </NuxtLink>
38
+ </li>
39
+ </ul>
40
+ <ul class="list-unstyled fs-14 text-muted">
41
+ <li v-if="phone"><a :href="`tel:${phone}`">{{ phone }}</a></li>
42
+ <li v-if="email"><a :href="`mailto:${email}`">{{ email }}</a></li>
43
+ <li v-if="workingHours">{{ workingHours }}</li>
44
+ </ul>
400
45
  </div>
401
46
  </div>
402
47
  </template>
403
-
404
- <script lang="ts">
405
- import { defineComponent, ref } from "vue";
406
- import stateStore from "~/utils/store";
407
-
408
- export default defineComponent({
409
- name: "ResponsiveNavbar",
410
- data: () => ({
411
- panel: [0],
412
- }),
413
- setup() {
414
- const { t } = useI18n();
415
- const show = ref(false);
416
- const stateStoreInstance = stateStore;
417
- const activeMobileMenu = ref<string | null>(null);
418
-
419
- const toggleMobileMenu = (mobileMenu: string) => {
420
- activeMobileMenu.value =
421
- activeMobileMenu.value === mobileMenu ? null : mobileMenu;
422
- };
423
-
424
- return {
425
- show,
426
- stateStoreInstance,
427
- toggleMobileMenu,
428
- activeMobileMenu,
429
- t,
430
- };
431
- },
432
- });
433
- </script>