@ozdao/martyrs 0.2.568 → 0.2.569

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 (149) hide show
  1. package/dist/martyrs/src/components/Button/{Button.vue2.js → Button.vue.js} +3 -3
  2. package/dist/martyrs/src/components/Button/Button.vue.js.map +1 -0
  3. package/dist/martyrs/src/components/EditImages/{EditImages.vue.js → EditImages.vue2.js} +2 -2
  4. package/dist/martyrs/src/components/EditImages/EditImages.vue2.js.map +1 -0
  5. package/dist/martyrs/src/components/Feed/Carousel.vue.js +1 -1
  6. package/dist/martyrs/src/components/Feed/Feed.vue.js +2 -2
  7. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +1 -1
  8. package/dist/martyrs/src/components/Loader/{Loader.vue.js → Loader.vue2.js} +2 -2
  9. package/dist/martyrs/src/components/Loader/Loader.vue2.js.map +1 -0
  10. package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue.js +1 -1
  11. package/dist/martyrs/src/components/Media/Media.vue.js +1 -1
  12. package/dist/martyrs/src/components/Select/{Select.vue.js → Select.vue2.js} +2 -2
  13. package/dist/martyrs/src/components/Select/Select.vue2.js.map +1 -0
  14. package/dist/martyrs/src/components/UploadImage/UploadImage.vue.js +1 -1
  15. package/dist/martyrs/src/components/UploadImageMultiple/UploadImageMultiple.vue.js +1 -1
  16. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +1 -1
  17. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
  18. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +1 -1
  19. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.js +1 -1
  20. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js +1 -1
  21. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +1 -1
  22. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +1 -1
  23. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +1 -1
  24. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +1 -1
  25. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +1 -1
  26. package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js +1 -1
  27. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +2 -2
  28. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +1 -1
  29. package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js +1 -1
  30. package/dist/martyrs/src/modules/core/views/components/blocks/PopupAuth.vue.js +1 -1
  31. package/dist/martyrs/src/modules/core/views/components/blocks/PopupDateSelector.vue.js +2 -2
  32. package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js +2 -2
  33. package/dist/martyrs/src/modules/core/views/components/partials/Header.vue.js +2 -2
  34. package/dist/martyrs/src/modules/core/views/components/partials/NavigationBar.vue.js +1 -1
  35. package/dist/martyrs/src/modules/core/views/components/sections/{Filters.vue.js → Filters.vue2.js} +2 -2
  36. package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue2.js.map +1 -0
  37. package/dist/martyrs/src/modules/events/components/elements/ButtonCheck.vue.js +1 -1
  38. package/dist/martyrs/src/modules/events/components/elements/ButtonJoin.vue.js +1 -1
  39. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +3 -3
  40. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +1 -1
  41. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +2 -2
  42. package/dist/martyrs/src/modules/events/components/sections/EditTickets.vue.js +1 -1
  43. package/dist/martyrs/src/modules/events/components/sections/Feed.vue.js +1 -1
  44. package/dist/martyrs/src/modules/events/components/sections/List.vue.js +1 -1
  45. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +3 -3
  46. package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +2 -2
  47. package/dist/martyrs/src/modules/inventory/components/forms/ColumnSettingsMenu.vue.js +1 -1
  48. package/dist/martyrs/src/modules/inventory/components/forms/HistoryView.vue.js +1 -1
  49. package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +2 -2
  50. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +2 -2
  51. package/dist/martyrs/src/modules/marketplace/views/components/pages/Marketplace.vue.js +1 -1
  52. package/dist/martyrs/src/modules/marketplace/views/components/sections/SectionMenu.vue.js +1 -1
  53. package/dist/martyrs/src/modules/music/components/blocks/ActionButtons.vue.js +1 -1
  54. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +1 -1
  55. package/dist/martyrs/src/modules/music/components/cards/ArtistCardSmall.vue.js +1 -1
  56. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +1 -1
  57. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +1 -1
  58. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +2 -2
  59. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +3 -3
  60. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +1 -1
  61. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +1 -1
  62. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +2 -2
  63. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +2 -2
  64. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +2 -2
  65. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +1 -1
  66. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +2 -2
  67. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +2 -2
  68. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +2 -2
  69. package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js +1 -1
  70. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +1 -1
  71. package/dist/martyrs/src/modules/music/components/player/PlayerControls.vue.js +1 -1
  72. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js +1 -1
  73. package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.js +2 -2
  74. package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js +2 -2
  75. package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js +2 -2
  76. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +2 -2
  77. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +1 -1
  78. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
  79. package/dist/martyrs/src/modules/orders/components/sections/ApplicationDetails.vue.js +1 -1
  80. package/dist/martyrs/src/modules/orders/components/sections/CustomerDetails.vue.js +1 -1
  81. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +2 -2
  82. package/dist/martyrs/src/modules/orders/components/sections/FormPayment.vue.js +1 -1
  83. package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js +1 -1
  84. package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.js +1 -1
  85. package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js +1 -1
  86. package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js +1 -1
  87. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +2 -2
  88. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +2 -2
  89. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +2 -2
  90. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +2 -2
  91. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
  92. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +1 -1
  93. package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js +1 -1
  94. package/dist/martyrs/src/modules/products/components/elements/Image360.vue.js +1 -1
  95. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +1 -1
  96. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +4 -4
  97. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +1 -1
  98. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +3 -3
  99. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +1 -1
  100. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +1 -1
  101. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +2 -2
  102. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +3 -3
  103. package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.js +1 -1
  104. package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.js +1 -1
  105. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +25 -38
  106. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js.map +1 -1
  107. package/dist/martyrs/src/modules/products/products.client.js +15 -21
  108. package/dist/martyrs/src/modules/products/products.client.js.map +1 -1
  109. package/dist/martyrs/src/modules/products/router/products.router.js +0 -34
  110. package/dist/martyrs/src/modules/products/router/products.router.js.map +1 -1
  111. package/dist/martyrs/src/modules/products/store/products.js +0 -15
  112. package/dist/martyrs/src/modules/products/store/products.js.map +1 -1
  113. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +1 -1
  114. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +1 -1
  115. package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +2 -2
  116. package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +1 -1
  117. package/dist/martyrs/src/modules/spots/components/pages/Map.vue.js +1 -1
  118. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +2 -2
  119. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +2 -2
  120. package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +1 -1
  121. package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js +2 -2
  122. package/dist/products.server.js +1 -130
  123. package/dist/style.css +0 -23
  124. package/package.json +1 -1
  125. package/src/modules/products/components/sections/SectionProduct.vue +2 -9
  126. package/src/modules/products/controllers/products.controller.js +0 -51
  127. package/src/modules/products/experiments/product-recommendation/README.md +156 -0
  128. package/src/modules/products/experiments/product-recommendation/controllers/recommendation.controller.js +59 -0
  129. package/src/modules/products/experiments/product-recommendation/router/recommendation.router.js +43 -0
  130. package/src/modules/products/experiments/product-recommendation/routes/recommendation.routes.js +10 -0
  131. package/src/modules/products/experiments/product-recommendation/store/recommendation.store.js +38 -0
  132. package/src/modules/products/products.client.js +0 -6
  133. package/src/modules/products/products.router.js +0 -29
  134. package/src/modules/products/router/products.router.js +0 -28
  135. package/src/modules/products/routes/products.routes.js +0 -2
  136. package/src/modules/products/store/products.js +0 -16
  137. package/dist/martyrs/src/components/Button/Button.vue2.js.map +0 -1
  138. package/dist/martyrs/src/components/EditImages/EditImages.vue.js.map +0 -1
  139. package/dist/martyrs/src/components/Loader/Loader.vue.js.map +0 -1
  140. package/dist/martyrs/src/components/Select/Select.vue.js.map +0 -1
  141. package/dist/martyrs/src/components/Shader/Shader.vue.js +0 -2
  142. package/dist/martyrs/src/components/Shader/Shader.vue.js.map +0 -1
  143. package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue.js.map +0 -1
  144. package/dist/martyrs/src/modules/products/components/pages/ProductRecommmendation.vue.js +0 -106
  145. package/dist/martyrs/src/modules/products/components/pages/ProductRecommmendation.vue.js.map +0 -1
  146. package/dist/martyrs/src/modules/products/components/sections/HeroRecommendation.vue.js +0 -120
  147. package/dist/martyrs/src/modules/products/components/sections/HeroRecommendation.vue.js.map +0 -1
  148. /package/src/modules/products/{components/sections → experiments/product-recommendation/components}/HeroRecommendation.vue +0 -0
  149. /package/src/modules/products/{components/pages → experiments/product-recommendation/components}/ProductRecommmendation.vue +0 -0
@@ -0,0 +1,43 @@
1
+ // Product Recommendation Routes
2
+ // These routes can be added to products router if needed
3
+
4
+ export const recommendationRoutes = {
5
+ // Home context routes
6
+ homeRoutes: [
7
+ {
8
+ path: 'recommendation',
9
+ name: 'ProductRecommmendation',
10
+ meta: {
11
+ title: {
12
+ en: 'Product Recommmendation',
13
+ ru: 'Рекомендации продукта',
14
+ },
15
+ header_theme: 'dark',
16
+ footer_theme: 'dark',
17
+ },
18
+ component: () => import(/* webpackChunkName: 'products-recommendation' */ '../components/ProductRecommmendation.vue'),
19
+ props: route => ({ mood: route.query.mood }),
20
+ },
21
+ ],
22
+
23
+ // Organization context routes
24
+ organizationRoutes: [
25
+ {
26
+ path: 'recommendation',
27
+ name: 'Organization_ProductRecommmendation',
28
+ meta: {
29
+ title: {
30
+ en: 'Product Recommmendation',
31
+ ru: 'Рекомендации продукта',
32
+ },
33
+ header_theme: 'dark',
34
+ footer_theme: 'dark',
35
+ context: 'organization',
36
+ },
37
+ component: () => import(/* webpackChunkName: 'products-recommendation' */ '../components/ProductRecommmendation.vue'),
38
+ props: route => ({ mood: route.query.mood }),
39
+ },
40
+ ],
41
+ };
42
+
43
+ export default recommendationRoutes;
@@ -0,0 +1,10 @@
1
+ import controllerFactory from '../controllers/recommendation.controller.js';
2
+
3
+ const routesFactory = (app, db) => {
4
+ const controller = controllerFactory(db);
5
+
6
+ // Product recommendation endpoint
7
+ app.post('/api/product/recommended', controller.getProductRecommendation);
8
+ };
9
+
10
+ export default routesFactory;
@@ -0,0 +1,38 @@
1
+ import { reactive } from 'vue';
2
+ import $axios from '@martyrs/src/modules/core/plugins/axios.js';
3
+
4
+ const state = reactive({
5
+ current: {
6
+ recommendation: false,
7
+ },
8
+ });
9
+
10
+ const actions = {
11
+ async submitMood(presetMood = null) {
12
+ return $axios.post('/api/product/recommended', { mood: presetMood }).then(
13
+ response => {
14
+ state.current = response.data.product;
15
+ state.current.recommendation = response.data.recommendationText;
16
+ return Promise.resolve(response.data);
17
+ },
18
+ error => {
19
+ console.error('Recommendation error:', error);
20
+ return Promise.reject(error);
21
+ }
22
+ );
23
+ },
24
+ };
25
+
26
+ const mutations = {
27
+ resetRecommendation() {
28
+ state.current = {
29
+ recommendation: false,
30
+ };
31
+ },
32
+ };
33
+
34
+ export default {
35
+ state,
36
+ actions,
37
+ mutations,
38
+ };
@@ -19,7 +19,6 @@ import ProductImages from './components/blocks/ProductImages.vue';
19
19
  // Sections
20
20
  import EditVariants from './components/sections/EditVariants.vue';
21
21
  import FilterProducts from './components/sections/FilterProducts.vue';
22
- import HeroRecommendation from './components/sections/HeroRecommendation.vue';
23
22
  import ProductsPopular from './components/sections/ProductsPopular.vue';
24
23
  import SectionProduct from './components/sections/SectionProduct.vue';
25
24
 
@@ -28,7 +27,6 @@ import Price from './components/elements/Price.vue';
28
27
  // Pages
29
28
  import Product from './components/pages/Product.vue';
30
29
  import ProductEdit from './components/pages/ProductEdit.vue';
31
- import ProductRecommendation from './components/pages/ProductRecommmendation.vue';
32
30
  import Products from './components/pages/Products.vue';
33
31
 
34
32
  // Пример функции инициализации для модуля продуктов
@@ -69,14 +67,12 @@ const ModuleProducts = {
69
67
  CardPosition,
70
68
  // Sections
71
69
  SectionProduct,
72
- HeroRecommendation,
73
70
  FilterProducts,
74
71
  EditVariants,
75
72
  ProductsPopular,
76
73
  // Pages
77
74
  Product,
78
75
  ProductEdit,
79
- ProductRecommendation,
80
76
  Products,
81
77
  // Layouts
82
78
  },
@@ -89,7 +85,6 @@ export {
89
85
  CardProduct,
90
86
  EditVariants,
91
87
  FilterProducts,
92
- HeroRecommendation,
93
88
  Image360,
94
89
  // Blocks
95
90
  ProductImages,
@@ -99,7 +94,6 @@ export {
99
94
  // Pages
100
95
  Product,
101
96
  ProductEdit,
102
- ProductRecommendation,
103
97
  Products,
104
98
  // Sections
105
99
  SectionProduct,
@@ -74,20 +74,6 @@ export function getRoutes(options = {}) {
74
74
  ],
75
75
  component: () => import(/* webpackChunkName: "products-edit" */ './components/pages/ProductEdit.vue'),
76
76
  },
77
- {
78
- path: 'recommendation',
79
- name: 'ProductRecommmendation',
80
- meta: {
81
- title: {
82
- en: 'Product Recommmendation',
83
- ru: 'Рекомендации продукта',
84
- },
85
- header_theme: 'dark',
86
- footer_theme: 'dark',
87
- },
88
- component: () => import(/* webpackChunkName: 'products-recommendation' */ './components/pages/ProductRecommmendation.vue'),
89
- props: route => ({ mood: route.query.mood }),
90
- },
91
77
  ],
92
78
  }
93
79
  });
@@ -162,21 +148,6 @@ export function getRoutes(options = {}) {
162
148
  ],
163
149
  component: () => import(/* webpackChunkName: "products-edit" */ './components/pages/ProductEdit.vue'),
164
150
  },
165
- {
166
- path: 'recommendation',
167
- name: 'Organization_ProductRecommmendation',
168
- meta: {
169
- title: {
170
- en: 'Product Recommmendation',
171
- ru: 'Рекомендации продукта',
172
- },
173
- header_theme: 'dark',
174
- footer_theme: 'dark',
175
- context: 'organization',
176
- },
177
- component: () => import(/* webpackChunkName: 'products-recommendation' */ './components/pages/ProductRecommmendation.vue'),
178
- props: route => ({ mood: route.query.mood }),
179
- },
180
151
  ],
181
152
  }
182
153
  });
@@ -81,20 +81,6 @@ export function getRoutes(options = {}) {
81
81
  beforeEnter: [validationAuth.requiresAuth],
82
82
  component: () => import(/* webpackChunkName: "products-edit" */ '../components/pages/ProductEdit.vue'),
83
83
  },
84
- {
85
- path: 'recommendation',
86
- name: 'ProductRecommmendation',
87
- meta: {
88
- title: {
89
- en: 'Product Recommmendation',
90
- ru: 'Рекомендации продукта',
91
- },
92
- header_theme: 'dark',
93
- footer_theme: 'dark',
94
- },
95
- component: () => import(/* webpackChunkName: 'products-recommendation' */ '../components/pages/ProductRecommmendation.vue'),
96
- props: route => ({ mood: route.query.mood }),
97
- },
98
84
  ],
99
85
  },
100
86
  });
@@ -275,20 +261,6 @@ export function getRoutes(options = {}) {
275
261
  ],
276
262
  component: () => import(/* webpackChunkName: "products-edit" */ '../components/pages/ProductEdit.vue'),
277
263
  },
278
- {
279
- path: 'recommendation',
280
- name: 'ProductRecommmendation',
281
- meta: {
282
- title: {
283
- en: 'Product Recommmendation',
284
- ru: 'Рекомендации продукта',
285
- },
286
- header_theme: 'dark',
287
- footer_theme: 'dark',
288
- },
289
- component: () => import(/* webpackChunkName: 'products-recommendation' */ '../components/pages/ProductRecommmendation.vue'),
290
- props: route => ({ mood: route.query.mood }),
291
- },
292
264
  ],
293
265
  },
294
266
  });
@@ -9,6 +9,4 @@ export default (function (app, db, allowedOrigins) {
9
9
  app.post('/api/products/:_id', controller.Update);
10
10
  // (D) Delete product
11
11
  app.delete('/api/products/:_id', controller.Delete);
12
-
13
- app.post('/api/product/recommended', controller.getProductRecommendation);
14
12
  });
@@ -12,7 +12,6 @@ import $axios from '@martyrs/src/modules/core/views/utils/axios-instance.js';
12
12
  const state = reactive({
13
13
  all: [],
14
14
  current: {
15
- recommendation: false,
16
15
  category: [],
17
16
  status: 'draft',
18
17
  listing: 'sale',
@@ -132,20 +131,6 @@ const actions = {
132
131
  );
133
132
  },
134
133
 
135
- async submitMood(presetMood = null) {
136
- return $axios.post('/api/product/recommended', { mood: presetMood }).then(
137
- response => {
138
- state.current = response.data.product;
139
- state.current.recommendation = response.data.recommendationText;
140
- return Promise.resolve(response.data);
141
- },
142
- error => {
143
- setError(error);
144
- return Promise.reject(error);
145
- }
146
- );
147
- },
148
-
149
134
  async fetchProducts() {
150
135
  return await $axios.get(`/api/products/read`).then(
151
136
  products => {
@@ -214,7 +199,6 @@ const mutations = {
214
199
  resetProduct(product) {
215
200
  state.current = {
216
201
  included: null,
217
- recommendation: false,
218
202
  category: [],
219
203
  status: 'draft',
220
204
  attributes: [],
@@ -1 +0,0 @@
1
- {"version":3,"file":"Button.vue2.js","sources":["../../../../../src/components/Button/Button.vue"],"sourcesContent":["<script setup>\nimport { ref } from 'vue'\n\nimport Loader from '@martyrs/src/components/Loader/Loader.vue'\n\nimport IconCheckmark from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue';\n\nconst props = defineProps({\n submit: {\n type: Function,\n default: async () => { console.log('Button click.') }\n },\n text: {\n type: Object,\n default: () => ({\n success: null,\n error: null\n })\n },\n counter: {\n type: Object\n },\n callback: {\n type: Function,\n default: async () => { console.log('Button callback.') }\n },\n callbackDelay: {\n type: Number,\n default: 750\n },\n showSucces: {\n type: Boolean,\n default: true\n },\n showLoader: {\n type: Boolean,\n default: true\n },\n validation: {\n type: Boolean,\n default: false\n },\n})\n\nconst emits = defineEmits(['error'])\n\nconst button = ref(null)\nconst error = ref(null)\nconst loading = ref(false)\nconst finished = ref(false)\n\nasync function Submit() {\n console.log('click')\n \n button.value.style['pointer-events'] = 'none'\n error.value = null\n loading.value = true\n\n // Функция для сброса состояния кнопки\n const resetButton = () => {\n if (button.value) {\n button.value.style.pointerEvents = 'auto'\n loading.value = false\n finished.value = false\n error.value = null\n }\n }\n\n try {\n await props.submit()\n\n button.value.classList.replace('bg-main', 'bg-second')\n loading.value = false\n\n // Используем функцию сброса состояния кнопки здесь\n if (props.showSucces) { \n finished.value = true\n setTimeout(() => {\n resetButton()\n button.value.classList.replace('bg-second', 'bg-main')\n }, 500)\n } else {\n resetButton()\n button.value.classList.replace('bg-second', 'bg-main')\n }\n\n // Если есть callback, мы также установим таймер для его вызова\n if (props.callback) setTimeout(() => props.callback(), props.callbackDelay)\n\n } catch (err) {\n console.error('=== BUTTON ERROR ===', err)\n emits('error', err)\n // Если возникла ошибка, мы изменяем стили и устанавливаем сообщение об ошибке\n button.value.classList.replace('bg-main', 'bg-fourth-nano')\n loading.value = false\n error.value = true\n \n // После задержки снова сбрасываем состояние кнопки\n setTimeout(() => {\n resetButton()\n // Так как класс кнопки был изменен, вернем его в исходное состояние\n button.value.classList.replace('bg-fourth-nano', 'bg-main')\n }, 1330)\n }\n}\n</script>\n\n<template>\n <button \n @click.stop=\"Submit\"\n :disabled=\"validation\"\n ref=\"button\"\n\t\tclass=\"button\"\n :class=\"{ 'button--disabled': loading || validation }\"\n >\n <span class=\"button-content\" :class=\"{ 'hidden': loading || error || finished }\">\n <slot></slot>\n </span>\n\n <span class=\"button-loader\" :class=\"{ 'active': loading && showLoader }\">\n <Loader class=\"\"/>\n </span>\n\n <span class=\"button-success\" :class=\"{ 'active': finished && showSucces }\">\n <template v-if=\"text.success\">{{ text.success }}</template>\n <IconCheckmark v-else class=\"i-regular\" />\n </span>\n\n <span class=\"button-error\" :class=\"{ 'active': error }\">\n <template v-if=\"text.error\">{{ text.error }}</template>\n <IconCross v-else class=\"i-regular\" />\n </span>\n \n <!-- Counter -->\n <div v-if=\"counter\" class=\"button-counter font-second flex flex-center\">\n <span>{{ counter }}</span>\n </div>\n </button>\n</template>\n\n<style lang=\"scss\">\nbutton[disabled] {\n opacity: 0.75 !important;\n pointer-events: none !important;\n cursor: default !important;\n color: rgba(var(--dark), 0.33) !important;\n background: rgba(var(--light), 1) !important;\n}\n\na.button {\n text-box: trim-both cap alphabetic;\n}\n\n.button {\n position: relative;\n display: flex;\n padding: var(--small);\n border-radius: var(--small);\n text-box: trim-both cap alphabetic;\n transform: scale(1);\n opacity: 1;\n align-items: center;\n justify-content: center;\n color: black;\n text-align: center;\n font-size: 1rem;\n letter-spacing: 5%;\n transition: all 0.33s ease;\n\n &:hover {\n cursor: pointer;\n opacity: 0.9;\n }\n\n &:active {\n transform: scale(0.95);\n }\n\n &-small {\n padding: 0.75rem;\n border-radius: 0.5rem;\n height: fit-content;\n }\n\n .button-counter {\n position: absolute;\n right: -8px;\n bottom: -8px;\n background: yellow;\n height: 16px;\n border-radius: 16px;\n width: 16px;\n font-weight: 500;\n text-align: center;\n line-height: 16px;\n font-size: 10px;\n }\n}\n\n.button-content {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n transition: opacity 0.3s ease;\n}\n\n\n.button-loader {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.3s ease;\n pointer-events: none;\n}\n\n.button-success {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.3s ease;\n pointer-events: none;\n}\n\n.button-error {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.3s ease;\n pointer-events: none;\n}\n\n.active {\n opacity: 1;\n}\n\n.hidden {\n opacity: 0;\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,UAAM,QAAQ;AAqCd,UAAM,QAAQ;AAEd,UAAM,SAAS,IAAI,IAAI;AACvB,UAAM,QAAQ,IAAI,IAAI;AACtB,UAAM,UAAU,IAAI,KAAK;AACzB,UAAM,WAAW,IAAI,KAAK;AAE1B,mBAAe,SAAS;AACtB,cAAQ,IAAI,OAAO;AAEnB,aAAO,MAAM,MAAM,gBAAgB,IAAI;AACvC,YAAM,QAAQ;AACd,cAAQ,QAAQ;AAGhB,YAAM,cAAc,MAAM;AACxB,YAAI,OAAO,OAAO;AAChB,iBAAO,MAAM,MAAM,gBAAgB;AACnC,kBAAQ,QAAQ;AAChB,mBAAS,QAAQ;AACjB,gBAAM,QAAQ;AAAA,QAChB;AAAA,MACF;AAEA,UAAI;AACF,cAAM,MAAM,OAAM;AAElB,eAAO,MAAM,UAAU,QAAQ,WAAW,WAAW;AACrD,gBAAQ,QAAQ;AAGhB,YAAI,MAAM,YAAY;AACpB,mBAAS,QAAQ;AACjB,qBAAW,MAAM;AACf,wBAAW;AACX,mBAAO,MAAM,UAAU,QAAQ,aAAa,SAAS;AAAA,UACvD,GAAG,GAAG;AAAA,QACR,OAAO;AACL,sBAAW;AACX,iBAAO,MAAM,UAAU,QAAQ,aAAa,SAAS;AAAA,QACvD;AAGA,YAAI,MAAM,SAAU,YAAW,MAAM,MAAM,SAAQ,GAAI,MAAM,aAAa;AAAA,MAE5E,SAAS,KAAK;AACZ,gBAAQ,MAAM,wBAAwB,GAAG;AACzC,cAAM,SAAS,GAAG;AAElB,eAAO,MAAM,UAAU,QAAQ,WAAW,gBAAgB;AAC1D,gBAAQ,QAAQ;AAChB,cAAM,QAAQ;AAGd,mBAAW,MAAM;AACf,sBAAW;AAEX,iBAAO,MAAM,UAAU,QAAQ,kBAAkB,SAAS;AAAA,QAC5D,GAAG,IAAI;AAAA,MACT;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"EditImages.vue.js","sources":["../../../../../src/components/EditImages/EditImages.vue"],"sourcesContent":["<template>\n\t<div class=\"flex-nowrap flex gap-small\">\n <VueDraggableNext v-if=\"localImages.length > 0\" class=\"gap-small flex dragArea list-group w-full\" v-model=\"localImages\" @change=\"emitChanges\">\n\t\t\t<div v-for=\"(image, index) in localImages\" class=\"pos-relative\">\n\t\t\t\t<img loading=\"lazy\" class=\"i-extra object-fit-contain bg-black-transp-5 pd-nano radius-small o-hidden\" :src=\"(FILE_SERVER_URL || '') + image\" />\n\t\t\t\t\n <IconCross \n @click=\"deleteImage(index)\" \n class=\"cursor-pointer pos-absolute t-center flex-center flex radius-extra i-medium bg-red pos-t-10-negative pos-r-10-negative pd-micro\"\n />\n\t\t\t</div>\n\t\t</VueDraggableNext>\n <div\n v-if=\"localImages.length > 0\" \n class=\"i-extra uppercase flex-center flex radius-small o-hidden br-solid br-main br-2px pd-small\"\n >\n <UploadImageMultiple \n @update:images=\"onImagesUpdate\"\n text=\"Add\"\n :options=\"{\n showText: false\n }\"\n :uploadPath=\"'photos'\"\n class=\"radius-big\"\n />\n </div>\n\n\n\t\t<UploadImageMultiple \t\n v-if=\"localImages.length < 1\" \n @update:images=\"onImagesUpdate\"\n :uploadPath=\"props.uploadPath\"\n :text=\"props.text\"\n :options=\"props.options\"\n class=\"w-100 pd-medium\"\n />\n\t</div>\t\n</template>\n\n<script setup>\nimport { ref, defineProps, watchEffect } from 'vue';\nimport { VueDraggableNext } from 'vue-draggable-next'\nimport UploadImageMultiple from \"@martyrs/src/components/UploadImageMultiple/UploadImageMultiple.vue\";\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue';\n\nconst props = defineProps({\n images: Array,\n text: Object,\n options: Object,\n uploadPath: {\n type: Object,\n default: 'unsorted'\n }\n});\n\nconst emit = defineEmits(['update:images'])\n\nconst localImages = ref([...props.images])\n\nwatchEffect(() => {\n localImages.value = [...props.images]; // Обновление localImages при изменении props.images\n});\n\nconst emitChanges = () => {\n emit('update:images', localImages.value)\n}\n\nconst onImagesUpdate = (newImages) => {\n localImages.value = [...localImages.value, ...newImages]\n emitChanges()\n}\n\nconst deleteImage = (index) => {\n localImages.value.splice(index, 1)\n emitChanges()\n}\n</script>\n\n<style lang=\"scss\">\n// Your styles here\n</style>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA6CA,UAAM,QAAQ;AAUd,UAAM,OAAO;AAEb,UAAM,cAAc,IAAI,CAAC,GAAG,MAAM,MAAM,CAAC;AAEzC,gBAAY,MAAM;AAChB,kBAAY,QAAQ,CAAC,GAAG,MAAM,MAAM;AAAA,IACtC,CAAC;AAED,UAAM,cAAc,MAAM;AACxB,WAAK,iBAAiB,YAAY,KAAK;AAAA,IACzC;AAEA,UAAM,iBAAiB,CAAC,cAAc;AACpC,kBAAY,QAAQ,CAAC,GAAG,YAAY,OAAO,GAAG,SAAS;AACvD,kBAAW;AAAA,IACb;AAEA,UAAM,cAAc,CAAC,UAAU;AAC7B,kBAAY,MAAM,OAAO,OAAO,CAAC;AACjC,kBAAW;AAAA,IACb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Loader.vue.js","sources":["../../../../../src/components/Loader/Loader.vue"],"sourcesContent":["<template>\n <div class=\"circular-loader pos-relative z-index-1 w-100 h-100 w-max-2r h-max-2r\" :class=\"{ 'circular-loader-centered': centered }\">\n <svg viewBox=\"25 25 50 50\">\n <circle class=\"circular-loader-fill\" cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\" stroke-width=\"4\" stroke-miterlimit=\"10\" />\n <circle class=\"circular-loader-circle\" cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\" stroke-width=\"4\" stroke-miterlimit=\"10\" />\n </svg>\n <div v-if=\"progress\" class=\"progress-text\">{{ progress }}</div>\n <div v-if=\"status\" class=\"uppercase t-semi w-m-10r status-text\">{{ status }}</div>\n </div>\n</template>\n\n<script>\nexport default {\n props: {\n progress: {\n type: Number,\n default: null,\n },\n status: {\n type: String,\n default: null,\n },\n centered: {\n type: Boolean,\n default: false\n },\n },\n};\n</script>\n\n<style>\n.circular-loader-centered {\n top: calc(50% - 1rem);\n left: calc(50% - 1rem);\n}\n\n.circular-loader svg {\n animation: rotate 2s linear infinite;\n}\n\n.circular-loader-circle {\n stroke-dasharray: 1, 200;\n stroke-dashoffset: 0;\n stroke-linecap: round;\n stroke: rgb(var(--main));\n animation: dash 1.5s ease-in-out infinite;\n}\n\n.circular-loader-fill {\n stroke-linecap: round;\n stroke: rgba(var(--black),0.2);\n}\n\n.progress-text {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 0.8rem;\n color: rgb(var(--main));;\n}\n\n.status-text {\n position: absolute;\n top: 120%;\n left: calc(50% - 5rem);\n font-size: 0.8rem;\n width: 10rem !important;\n text-align: center;\n}\n\n@keyframes rotate {\n 100% {\n transform: rotate(360deg);\n }\n}\n\n@keyframes dash {\n 0% {\n stroke-dasharray: 1, 200;\n stroke-dashoffset: 0;\n }\n 50% {\n stroke-dasharray: 89, 200;\n stroke-dashoffset: -35;\n }\n 100% {\n stroke-dasharray: 1, 200;\n stroke-dashoffset: -124;\n }\n}\n</style>"],"names":["_createElementBlock","_normalizeClass","_createElementVNode","_toDisplayString","_createCommentVNode"],"mappings":";;;AAYA,MAAK,YAAU;AAAA,EACb,OAAO;AAAA,IACL,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA;IAEX,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA;IAEX,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA;;AAGf;;EA3BA,KAAA;AAAA,EAMyB,OAAM;;;EAN/B,KAAA;AAAA,EAOuB,OAAM;;;sBAN3BA,mBAOM,OAAA;AAAA,IAPD,OADPC,eAAA,CACa,wEAAsE,EAAA,4BAAuC,OAAA,UAAQ,CAAA;AAAA;8BAC9HC,mBAGM,OAAA,EAHD,SAAQ,iBAAa;AAAA,MACxBA,mBAAkH,UAAA;AAAA,QAA1G,OAAM;AAAA,QAAuB,IAAG;AAAA,QAAK,IAAG;AAAA,QAAK,GAAE;AAAA,QAAK,MAAK;AAAA,QAAO,gBAAa;AAAA,QAAI,qBAAkB;AAAA;MAC3GA,mBAAoH,UAAA;AAAA,QAA5G,OAAM;AAAA,QAAyB,IAAG;AAAA,QAAK,IAAG;AAAA,QAAK,GAAE;AAAA,QAAK,MAAK;AAAA,QAAO,gBAAa;AAAA,QAAI,qBAAkB;AAAA;;IAEpG,OAAA,yBAAXF,mBAA+D,OAA/D,YAA+DG,gBAAjB,OAAA,QAAQ,GAAA,CAAA,KAN1DC,mBAAA,IAAA,IAAA;AAAA,IAOe,OAAA,uBAAXJ,mBAAkF,OAAlF,YAAkFG,gBAAf,OAAA,MAAM,GAAA,CAAA,KAP7EC,mBAAA,IAAA,IAAA;AAAA;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Select.vue.js","sources":["../../../../../src/components/Select/Select.vue"],"sourcesContent":["<template>\n <!-- Input Wrapper -->\n <div \n ref=\"fieldWrapper\"\n tabindex=\"0\"\n @click.stop=\"toggleMenu\" \n v-click-outside=\"clickedOutside\" \n :class=\"$attrs.class\" \n class=\"cursor-pointer field-wrapper flex-v-center flex-nowrap flex pos-relative\"\n >\n <!-- Label -->\n <span v-if=\"label\" class=\"t-transp mn-r-small\">{{label}}</span>\n \n <!-- Input -->\n <span>\n {{ optionsSelected ? (optionsSelected.name || optionsSelected[props.value] || optionsSelected) : placeholder }}\n </span>\n <!-- Dropdown menu -->\n <transition mode=\"out-in\" name=\"TransitionTranslateY\">\n <ul \n v-show=\"showMenu\" \n class=\"bs-black pos-absolute pos-t-100 pos-l-0 z-index-5 pd-small radius-small bg-white mn-t-thin w-100\"\n style=\"min-width: max-content;\"\n >\n <li @click.stop=\"selectOption(option)\" v-for=\"option in optionsListed\" class=\"radius-thin hover-bg-light pd-thin text-box-trim\">\n <span v-if=\"option\" class=\"w-100\">\n {{ option.name || option[props.value] || option }}\n </span>\n </li>\n </ul>\n </transition>\n </div>\n <!-- Validation -->\n <transition mode=\"out-in\" name=\"fade\">\n <div v-if=\"validation\" class=\"mn-t-thin invalid-feedback\">\n * {{validation.message}}\n </div>\n </transition>\n</template>\n<script setup>\nimport { ref, computed, watch, nextTick } from 'vue'\nimport clickOutside from '../FieldPhone/click-outside.js';\nlet vClickOutside = clickOutside\nconst emit = defineEmits([\n 'update:select', \n 'focus', \n 'blur'\n])\nconst props = defineProps({\n label: String,\n placeholder: { type: String, default: 'Please select an item' },\n select: [String, Object],\n property: String,\n value: String,\n options: { type: Array, default: () => [] },\n validation: Boolean,\n})\nconst showMenu = ref(false)\nconst fieldWrapper = ref(null)\nconst optionsSelected = ref(\n props.property \n ? findObjectByValue(props.select, props.property, props.options) \n : props.select\n)\nconst optionsListed = computed(() => {\n return props.select \n ? props.options.filter(option => option !== props.select) \n : props.options\n})\nwatch(() => props.select, (newSelect) => {\n optionsSelected.value = \n props.property \n ? findObjectByValue(props.select, props.property, props.options) \n : props.select;\n});\nconst toggleMenu = async () => {\n showMenu.value = !showMenu.value\n \n if (showMenu.value) {\n await nextTick()\n fieldWrapper.value?.focus()\n emit('focus')\n } else {\n emit('blur')\n }\n}\nfunction clickedOutside () {\n showMenu.value = false\n}\nconst selectOption = option => {\n optionsSelected.value = option\n \n toggleMenu()\n if (props.property) { \n emit('update:select', optionsSelected.value[props.property])\n } else {\n emit('update:select', optionsSelected.value)\n }\n}\nfunction findObjectByValue (value, property, objects) {\n for (const object of objects) {\n if (object[property] === value || object === value) {\n return object;\n }\n }\n return null;\n}\n</script>\n<style lang=\"scss\" scoped>\n li {\n list-style-type: none;\n }\n ul li {\n line-height: 2;\n }\n .field-wrapper:focus {\n outline: none;\n }\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,QAAI,gBAAgB;AACpB,UAAM,OAAO;AAKb,UAAM,QAAQ;AASd,UAAM,WAAW,IAAI,KAAK;AAC1B,UAAM,eAAe,IAAI,IAAI;AAC7B,UAAM,kBAAkB;AAAA,MACtB,MAAM,WACJ,kBAAkB,MAAM,QAAQ,MAAM,UAAU,MAAM,OAAO,IAC7D,MAAM;AAAA,IACV;AACA,UAAM,gBAAgB,SAAS,MAAM;AACnC,aAAO,MAAM,SACX,MAAM,QAAQ,OAAO,YAAU,WAAW,MAAM,MAAM,IACtD,MAAM;AAAA,IACV,CAAC;AACD,UAAM,MAAM,MAAM,QAAQ,CAAC,cAAc;AACvC,sBAAgB,QAChB,MAAM,WACJ,kBAAkB,MAAM,QAAQ,MAAM,UAAU,MAAM,OAAO,IAC7D,MAAM;AAAA,IACV,CAAC;AACD,UAAM,aAAa,YAAY;AAC7B,eAAS,QAAQ,CAAC,SAAS;AAE3B,UAAI,SAAS,OAAO;AAClB,cAAM,SAAQ;AACd,qBAAa,OAAO,MAAK;AACzB,aAAK,OAAO;AAAA,MACd,OAAO;AACL,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AACA,aAAS,iBAAkB;AACzB,eAAS,QAAQ;AAAA,IACnB;AACA,UAAM,eAAe,YAAU;AAC7B,sBAAgB,QAAQ;AAExB,iBAAU;AACV,UAAI,MAAM,UAAU;AAClB,aAAK,iBAAiB,gBAAgB,MAAM,MAAM,QAAQ,CAAC;AAAA,MAC7D,OAAO;AACL,aAAK,iBAAiB,gBAAgB,KAAK;AAAA,MAC7C;AAAA,IACF;AACA,aAAS,kBAAmB,OAAO,UAAU,SAAS;AACpD,iBAAW,UAAU,SAAS;AAC5B,YAAI,OAAO,QAAQ,MAAM,SAAS,WAAW,OAAO;AAClD,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,2 +0,0 @@
1
-
2
- //# sourceMappingURL=Shader.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Shader.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Filters.vue.js","sources":["../../../../../../../../src/modules/core/views/components/sections/Filters.vue"],"sourcesContent":["<template>\n <div class=\"flex o-x-scroll scroll-hide t-nowrap gap-thin\">\n <!-- All Filters Button -->\n <button\n @click=\"showAllFilters = true\"\n class=\"pd-small radius-medium bg-light flex-v-center flex gap-micro cursor-pointer\"\n :class=\"{ 'bg-main': activeFiltersCount > 0 }\"\n >\n <IconFilter class=\"i-regular\" />\n <span class=\"h-1r\"></span>\n <span v-if=\"activeFiltersCount\">{{ activeFiltersCount }}</span>\n </button>\n\n <!-- Individual Filter Buttons -->\n <button\n v-for=\"filter in filters\"\n :key=\"filter.value\"\n @click=\"openFilter(filter.value)\"\n class=\"pd-small radius-medium bg-light cursor-pointer flex-v-center flex gap-micro\"\n :class=\"{ 'selected bg-main': isFilterActive(filter) }\"\n >\n <IconCalendar v-if=\"filter.type === 'date'\" class=\"mn-r-micro i-regular\" />\n <span class=\"t-nowrap\">{{ filter.type === 'date' && getFilterValue(filter) ? formatFilterValue(filter) : filter.title }}</span>\n <span v-if=\"getFilterValue(filter) && filter.type !== 'date'\" class=\"mn-l-micro\">\n {{ formatFilterValue(filter) }}\n </span>\n </button>\n\n <!-- All Filters Popup -->\n <Popup\n :isPopupOpen=\"showAllFilters\"\n @close-popup=\"closeAllFilters\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"w-min-20r bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <FiltersGroup\n :filters=\"filters\"\n v-model:selected=\"tempSelected\"\n :immediate=\"false\"\n :showHeader=\"true\"\n :showApplyButton=\"true\"\n :showResetButton=\"true\"\n @update:selected=\"applyAllFilters\"\n />\n </Popup>\n\n <!-- Individual Filter Popups -->\n <Popup\n v-for=\"filter in filters\"\n :key=\"`popup-${filter.value}`\"\n :isPopupOpen=\"individualPopups[filter.value]\"\n @close-popup=\"cancelFilter(filter.value)\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <h4 class=\"mn-b-medium\">{{ filter.title }}</h4>\n\n <!-- Checkbox Filter -->\n <FilterCheckbox\n v-if=\"filter.type === 'checkbox'\"\n v-model=\"tempSelected[filter.value]\"\n :options=\"filter.options\"\n />\n\n <!-- Range Filter -->\n <FilterRange\n v-else-if=\"filter.type === 'range'\"\n v-model=\"tempSelected[filter.value]\"\n :minPlaceholder=\"filter.minPlaceholder || 'Min'\"\n :maxPlaceholder=\"filter.maxPlaceholder || 'Max'\"\n :label=\"filter.label\"\n />\n\n <!-- Date Filter -->\n <div v-else-if=\"filter.type === 'date'\">\n <div class=\"mn-t-small\">\n <Calendar\n v-model:date=\"tempSelected[filter.value]\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n class=\"bg-light radius-small\"\n />\n </div>\n </div>\n\n <!-- Radio/Options Filter -->\n <FilterOptions\n v-else-if=\"filter.type === 'radio'\"\n v-model=\"tempSelected[filter.value]\"\n :options=\"filter.options\"\n />\n\n <div class=\"flex gap-thin mn-t-medium\">\n <button\n @click=\"cancelFilter(filter.value)\"\n class=\"bg-light button flex-child-full\"\n >\n Cancel\n </button>\n <button\n @click=\"applyFilter(filter.value)\"\n class=\"bg-main w-100 button flex-child-full\"\n >\n Apply\n </button>\n </div>\n </Popup>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, reactive, watch } from 'vue'\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js'\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport FiltersGroup from './filters/FiltersGroup.vue'\nimport FilterCheckbox from './filters/FilterCheckbox.vue'\nimport FilterRange from './filters/FilterRange.vue'\nimport FilterDateRange from './filters/FilterDateRange.vue'\nimport FilterOptions from './filters/FilterOptions.vue'\nimport IconFilter from '@martyrs/src/modules/icons/navigation/IconFilter.vue'\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue'\nimport IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue'\n\nconst filters = defineModel('filters', {\n type: Array,\n required: true\n})\n\nconst selected = defineModel('selected', {\n type: Object,\n default: () => ({})\n})\n\nconst emit = defineEmits(['select'])\n\nconst { formatDate, returnCurrency } = useGlobalMixins()\n\n// State\nconst showAllFilters = ref(false)\nconst individualPopups = reactive({})\nconst tempSelected = reactive({})\nconst tempDateRange = ref(null)\n\n// Initialize popups and temp values\nwatch(filters, (newFilters) => {\n newFilters.forEach(filter => {\n individualPopups[filter.value] = false\n \n if (!tempSelected[filter.value]) {\n if (filter.type === 'checkbox') {\n tempSelected[filter.value] = [...(selected.value[filter.value] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filter.value] = { ...(selected.value[filter.value] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filter.value] = selected.value[filter.value] || null\n } else {\n tempSelected[filter.value] = selected.value[filter.value] || null\n }\n }\n })\n}, { immediate: true, deep: true })\n\n// Sync selected to tempSelected\nwatch(selected, (newSelected) => {\n Object.keys(newSelected).forEach(key => {\n const filter = filters.value.find(f => f.value === key)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[key] = [...(newSelected[key] || [])]\n } else if (filter.type === 'range') {\n tempSelected[key] = { ...(newSelected[key] || { min: '', max: '' }) }\n } else {\n tempSelected[key] = newSelected[key]\n }\n }\n })\n}, { deep: true })\n\n// Computed\nconst activeFiltersCount = computed(() => {\n return Object.entries(selected.value).filter(([key, value]) => {\n if (Array.isArray(value)) return value.length > 0\n if (typeof value === 'object' && value !== null) {\n return value.min || value.max\n }\n return value !== null && value !== undefined\n }).length\n})\n\n// Methods\nconst openFilter = (filterValue) => {\n individualPopups[filterValue] = true\n}\n\nconst isFilterActive = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n if (Array.isArray(value)) return value.length > 0\n if (filter.type === 'range') return value.min || value.max\n return true\n}\n\nconst getFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n \n if (filter.type === 'range') {\n return value.min || value.max\n }\n \n if (filter.type === 'date') {\n return value && value.start && value.end\n }\n \n if (Array.isArray(value)) {\n return value.length > 0\n }\n \n return value\n}\n\nconst formatFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return ''\n \n if (Array.isArray(value)) {\n return `(${value.length})`\n }\n \n if (filter.type === 'range') {\n if (!value.min && !value.max) return ''\n return `${value.min || '0'}-${value.max || '∞'}`\n }\n \n if (filter.type === 'date') {\n if (!value || !value.start || !value.end) return ''\n return `${formatDate(value.start, { dayMonth: true, language: 'en' })} - ${formatDate(value.end, { dayMonth: true, language: 'en' })}`\n }\n \n if (filter.type === 'radio') {\n const option = filter.options.find(o => o.value === value)\n return option ? `(${option.label})` : ''\n }\n \n return ''\n}\n\nconst applyFilter = (filterValue) => {\n selected.value[filterValue] = tempSelected[filterValue]\n individualPopups[filterValue] = false\n emit('select', { filter: filterValue, value: tempSelected[filterValue] })\n}\n\nconst cancelFilter = (filterValue) => {\n const filter = filters.value.find(f => f.value === filterValue)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[filterValue] = [...(selected.value[filterValue] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filterValue] = { ...(selected.value[filterValue] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filterValue] = selected.value[filterValue] || null\n } else {\n tempSelected[filterValue] = selected.value[filterValue] || null\n }\n }\n individualPopups[filterValue] = false\n}\n\nconst applyAllFilters = (newValues) => {\n Object.entries(newValues).forEach(([key, value]) => {\n if (selected.value[key] !== value) {\n selected.value[key] = value\n emit('select', { filter: key, value })\n }\n })\n showAllFilters.value = false\n}\n\nconst closeAllFilters = () => {\n showAllFilters.value = false\n}\n</script>\n\n<style scoped>\n.filters-content {\n max-height: 60vh;\n overflow-y: auto;\n}\n</style>"],"names":["_useModel"],"mappings":"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"}
@@ -1,106 +0,0 @@
1
- import { ref, watchEffect, onMounted, createElementBlock, openBlock, createBlock, createCommentVNode, createVNode, unref, isRef } from "vue";
2
- import { useRouter } from "vue-router";
3
- import { useI18n } from "vue-i18n";
4
- import Loader from "../../../../components/Loader/Loader.vue.js";
5
- /* empty css */
6
- import _sfc_main$1 from "../../../../components/FieldBig/FieldBig.vue.js";
7
- import _sfc_main$2 from "../sections/SectionProduct.vue.js";
8
- import "../../../../components/Shader/Shader.vue.js";
9
- import _export_sfc from "../../../../../../_virtual/_plugin-vue_export-helper.js";
10
- import { actions, state } from "../../store/products.js";
11
- /* empty css */
12
- /* empty css */
13
- const _hoisted_1 = {
14
- id: "product-recommendation",
15
- class: "h-min-100 pd-thin t-white bg-black"
16
- };
17
- const _hoisted_2 = {
18
- key: 1,
19
- class: "section"
20
- };
21
- const _hoisted_3 = {
22
- key: 0,
23
- class: "mn-b-thin"
24
- };
25
- const _sfc_main = {
26
- __name: "ProductRecommmendation",
27
- setup(__props) {
28
- const router = useRouter();
29
- const loading = ref(true);
30
- const showInput = ref(false);
31
- const loadingTexts = ref([
32
- "Loading all we know about the buds",
33
- "Processing the cannabis universe",
34
- "Creating a strain of knowledge",
35
- "Harvesting taste insights"
36
- ]);
37
- const text = {
38
- messages: {
39
- en: {
40
- TITLE: "Increase Your High,<br><b class='t-white'>Powered by AI Budtender</b>",
41
- DESCRIPTION: "AI's got your chill, bro. We're picking out the most cosmic weed strains based on your desired vibe:",
42
- placeholder: "Describe your desired high, bro...",
43
- action: "Transmit →"
44
- },
45
- ru: {
46
- TITLE: "Персональный Накур,<br><b class='t-white'>Напрямую от AI</b>",
47
- DESCRIPTION: "AI на страже твоего релакса, бро. Мы подбираем самые космические сорта травы, исходя из твоего желаемого настроения:",
48
- placeholder: "Опиши свой желамый хай, bro...",
49
- action: "Передать →"
50
- }
51
- }
52
- };
53
- const { t } = useI18n(text);
54
- const loadingText = ref(loadingTexts.value[0]);
55
- let mood = ref(router.currentRoute.value.query.mood || t("Recommend me something"));
56
- watchEffect(async () => {
57
- mood.value = router.currentRoute.value.query.mood || t("Recommend me something");
58
- loading.value = true;
59
- await actions.submitMood(mood.value);
60
- loading.value = false;
61
- });
62
- onMounted(async () => {
63
- });
64
- setInterval(() => {
65
- const index = loadingTexts.value.indexOf(loadingText.value);
66
- loadingText.value = loadingTexts.value[(index + 1) % loadingTexts.value.length];
67
- }, 2e3);
68
- let inputValue = ref(router.currentRoute.value.query.mood || t("Recommend me something"));
69
- function submitInput() {
70
- router.push({ name: "Product Recommmendation", query: { mood: inputValue.value } });
71
- }
72
- return (_ctx, _cache) => {
73
- return openBlock(), createElementBlock("div", _hoisted_1, [
74
- loading.value ? (openBlock(), createBlock(Loader, {
75
- key: 0,
76
- status: loadingText.value,
77
- class: "pos-fixed"
78
- }, null, 8, ["status"])) : createCommentVNode("", true),
79
- !loading.value && !showInput.value ? (openBlock(), createElementBlock("div", _hoisted_2, [
80
- !loading.value ? (openBlock(), createElementBlock("div", _hoisted_3, [
81
- createVNode(_sfc_main$1, {
82
- input: unref(inputValue),
83
- loopTyping: false,
84
- enableTyping: false,
85
- placeholder: unref(t)("placeholder"),
86
- action: unref(t)("action"),
87
- "onUpdate:input": _cache[0] || (_cache[0] = ($event) => isRef(inputValue) ? inputValue.value = $event : inputValue = $event),
88
- onAction: submitInput,
89
- class: "t-white bg-dark-transp-50 w-100"
90
- }, null, 8, ["input", "placeholder", "action"])
91
- ])) : createCommentVNode("", true),
92
- createVNode(_sfc_main$2, {
93
- product: state.current,
94
- recommendation: state.current.recommendation,
95
- class: "bg-dark-transp-50 pd-big radius-medium"
96
- }, null, 8, ["product", "recommendation"])
97
- ])) : createCommentVNode("", true)
98
- ]);
99
- };
100
- }
101
- };
102
- const ProductRecommendation = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-ea639d49"]]);
103
- export {
104
- ProductRecommendation as default
105
- };
106
- //# sourceMappingURL=ProductRecommmendation.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProductRecommmendation.vue.js","sources":["../../../../../../../src/modules/products/components/pages/ProductRecommmendation.vue"],"sourcesContent":["<template>\n <div id=\"product-recommendation\" class=\"h-min-100 pd-thin t-white bg-black\">\n <Loader v-if=\"loading\" :status=\"loadingText\" class=\"pos-fixed\"/>\n\n <div v-if=\"!loading && !showInput\" class=\"section\">\n\n <div v-if=\"!loading\" class=\"mn-b-thin\">\n <FieldBig \n :input=\"inputValue\" \n :loopTyping=\"false\"\n :enableTyping=\"false\"\n :placeholder=\"t('placeholder')\"\n :action=\"t('action')\"\n @update:input=\"inputValue = $event\"\n @action=\"submitInput\"\n class=\"t-white bg-dark-transp-50 w-100\"\n />\n </div>\n\n <SectionProduct \n :product=\"products.state.current\" \n :recommendation=\"products.state.current.recommendation\" \n class=\"bg-dark-transp-50 pd-big radius-medium\"\n />\n </div>\n </div>\n</template>\n\n<script setup>\nimport { ref, onMounted, watchEffect } from 'vue'\nimport { useRouter } from 'vue-router'\nimport { useI18n } from 'vue-i18n'\nimport Loader from '@martyrs/src/components/Loader/Loader.vue'\nimport Breadcrumbs from '@martyrs/src/components/Breadcrumbs/Breadcrumbs.vue'\nimport FieldBig from \"@martyrs/src/components/FieldBig/FieldBig.vue\";\nimport SectionProduct from '@martyrs/src/modules/products/components/sections/SectionProduct.vue'\nimport HeroRecommendation from '@martyrs/src/modules/products/components/sections/HeroRecommendation.vue'\n\nimport * as products from '@martyrs/src/modules/products/store/products.js';\n\nconst router = useRouter()\nconst loading = ref(true)\nconst showInput = ref(false)\nconst loadingTexts = ref([\n \"Loading all we know about the buds\",\n \"Processing the cannabis universe\",\n \"Creating a strain of knowledge\",\n \"Harvesting taste insights\",\n])\n\nconst text = {\n messages: {\n en: {\n TITLE: \"Increase Your High,<br><b class='t-white'>Powered by AI Budtender</b>\",\n DESCRIPTION: \"AI's got your chill, bro. We're picking out the most cosmic weed strains based on your desired vibe:\",\n placeholder: 'Describe your desired high, bro...',\n action: \"Transmit →\",\n },\n ru: {\n TITLE: \"Персональный Накур,<br><b class='t-white'>Напрямую от AI</b>\",\n DESCRIPTION: \"AI на страже твоего релакса, бро. Мы подбираем самые космические сорта травы, исходя из твоего желаемого настроения:\",\n placeholder: 'Опиши свой желамый хай, bro...',\n action: \"Передать →\",\n }\n }\n}\n\nconst { t } = useI18n(text)\n\nconst loadingText = ref(loadingTexts.value[0])\n\nlet mood = ref(router.currentRoute.value.query.mood || t('Recommend me something'))\n\nwatchEffect(async () => {\n mood.value = router.currentRoute.value.query.mood || t('Recommend me something')\n loading.value = true\n await products.actions.submitMood(mood.value)\n loading.value = false\n})\n\nonMounted(async () => {\n // await products.actions.submitMood(mood.value)\n // loading.value = false\n})\n\nsetInterval(() => {\n const index = loadingTexts.value.indexOf(loadingText.value)\n loadingText.value = loadingTexts.value[(index + 1) % loadingTexts.value.length]\n}, 2000)\n\nlet inputValue = ref(router.currentRoute.value.query.mood || t('Recommend me something'))\n\nfunction submitInput() {\n router.push({ name: 'Product Recommmendation', query: { mood: inputValue.value } })\n}\n\n\nfunction tryAgain() {\n loading.value = true\n showInput.value = true\n}\n\nfunction hideInput() {\n showInput.value = false\n}\n</script>\n\n<style scoped>\n/* Add your styles here */\n</style>\n"],"names":["products.actions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,UAAM,SAAS,UAAS;AACxB,UAAM,UAAU,IAAI,IAAI;AACxB,UAAM,YAAY,IAAI,KAAK;AAC3B,UAAM,eAAe,IAAI;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ,CAAC;AAED,UAAM,OAAO;AAAA,MACT,UAAU;AAAA,QACN,IAAI;AAAA,UACA,OAAO;AAAA,UACP,aAAa;AAAA,UACb,aAAa;AAAA,UACb,QAAQ;AAAA,QACpB;AAAA,QACQ,IAAI;AAAA,UACA,OAAO;AAAA,UACP,aAAa;AAAA,UACb,aAAa;AAAA,UACb,QAAQ;AAAA,QACpB;AAAA,MACA;AAAA,IACA;AAEA,UAAM,EAAE,EAAC,IAAK,QAAQ,IAAI;AAE1B,UAAM,cAAc,IAAI,aAAa,MAAM,CAAC,CAAC;AAE7C,QAAI,OAAO,IAAI,OAAO,aAAa,MAAM,MAAM,QAAQ,EAAE,wBAAwB,CAAC;AAElF,gBAAY,YAAY;AACpB,WAAK,QAAQ,OAAO,aAAa,MAAM,MAAM,QAAQ,EAAE,wBAAwB;AAC/E,cAAQ,QAAQ;AAChB,YAAMA,QAAiB,WAAW,KAAK,KAAK;AAC5C,cAAQ,QAAQ;AAAA,IACpB,CAAC;AAED,cAAU,YAAY;AAAA,IAGtB,CAAC;AAED,gBAAY,MAAM;AACd,YAAM,QAAQ,aAAa,MAAM,QAAQ,YAAY,KAAK;AAC1D,kBAAY,QAAQ,aAAa,OAAO,QAAQ,KAAK,aAAa,MAAM,MAAM;AAAA,IAClF,GAAG,GAAI;AAEP,QAAI,aAAa,IAAI,OAAO,aAAa,MAAM,MAAM,QAAQ,EAAE,wBAAwB,CAAC;AAExF,aAAS,cAAc;AACnB,aAAO,KAAK,EAAE,MAAM,2BAA2B,OAAO,EAAE,MAAM,WAAW,QAAO,CAAE;AAAA,IACtF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,120 +0,0 @@
1
- import { ref, createElementBlock, openBlock, createElementVNode, createVNode, unref, isRef, Fragment, renderList, withModifiers, toDisplayString } from "vue";
2
- import _sfc_main$1 from "../../../../components/FieldBig/FieldBig.vue.js";
3
- import "../../../../components/Shader/Shader.vue.js";
4
- import { useRouter } from "vue-router";
5
- import { useI18n } from "vue-i18n";
6
- /* empty css */
7
- const _hoisted_1 = { class: "pd-big bg-black t-white pos-relative o-hidden" };
8
- const _hoisted_2 = { class: "flex-column flex-center flex t-center pos-relative z-index-1" };
9
- const _hoisted_3 = ["innerHTML"];
10
- const _hoisted_4 = ["innerHTML"];
11
- const _hoisted_5 = ["innerHTML"];
12
- const _hoisted_6 = {
13
- style: { "max-width": "50rem" },
14
- class: "w-100 h-max gap-thin cols-6"
15
- };
16
- const _hoisted_7 = ["onClick"];
17
- const _hoisted_8 = ["src"];
18
- const _hoisted_9 = { class: "t-white" };
19
- const _sfc_main = {
20
- __name: "HeroRecommendation",
21
- setup(__props) {
22
- const router = useRouter();
23
- const text = {
24
- messages: {
25
- "en": {
26
- "title": "Increase Your High <br><b class='t-main'>Boosted by AI Budtender</b>",
27
- "description": "Just tell us what you're want, and Weeder will find your ideal match.",
28
- "placeholderTexts": [
29
- "Lowest THC, please!",
30
- "Something with banana flavors?",
31
- "I'm in the mood for trippy vibes."
32
- ],
33
- "subdescription": "AI Curated Recommendations for Your Mood:",
34
- "presets": {
35
- "sleep": "sleep",
36
- "creative": "creative",
37
- "giggly": "giggly",
38
- "libido": "libido",
39
- "trippy": "trippy",
40
- "euphoric": "euphoric"
41
- },
42
- "placeholder": "Tell us what you're after...",
43
- "action": "Transmit"
44
- },
45
- "ru": {
46
- "title": "Персональный Накур,<br><b class='t-main'>Напрямую от AI</b>",
47
- "description": "AI на страже твоего релакса, бро. Мы подбираем самые космические товары с учетом твоего желаемого настроения:",
48
- "placeholderTexts": [
49
- "Я хочу самый низкий THC",
50
- "Я хочу чего-нибудь бананового",
51
- "Я хочу курнуть хейза"
52
- ],
53
- "presets": {
54
- "sleep": "сон",
55
- "creative": "креатив",
56
- "giggly": "смех",
57
- "libido": "либидо",
58
- "trippy": "трип",
59
- "euphoric": "кайф"
60
- },
61
- "subdescription": "Или выберите тег, и наш AI направит тебя к самым крутым вариантам:",
62
- "placeholder": "Опиши свой желаемый хай, bro...",
63
- "action": "Передать"
64
- }
65
- }
66
- };
67
- const { t, rt } = useI18n(text);
68
- let mood = ref("");
69
- const presets = ["sleep", "creative", "giggly", "libido", "trippy", "euphoric"];
70
- return (_ctx, _cache) => {
71
- return openBlock(), createElementBlock("div", _hoisted_1, [
72
- createElementVNode("div", _hoisted_2, [
73
- createElementVNode("h1", {
74
- class: "mn-b-semi",
75
- innerHTML: unref(t)("title")
76
- }, null, 8, _hoisted_3),
77
- createElementVNode("p", {
78
- class: "mn-b-big p-medium t-transp",
79
- innerHTML: unref(t)("description")
80
- }, null, 8, _hoisted_4),
81
- createVNode(_sfc_main$1, {
82
- input: unref(mood),
83
- typingSpeed: 100,
84
- loopTyping: true,
85
- enableTyping: true,
86
- placeholder: unref(t)("placeholder"),
87
- action: unref(t)("action"),
88
- "onUpdate:input": _cache[0] || (_cache[0] = ($event) => isRef(mood) ? mood.value = $event : mood = $event),
89
- onAction: _cache[1] || (_cache[1] = ($event) => unref(router).push({ name: "Product Recommmendation", query: { mood: unref(mood) } })),
90
- class: "mn-b-big pd-big bg-dark-transp-50 bg-blur-thin w-100 w-max-40r"
91
- }, null, 8, ["input", "placeholder", "action"]),
92
- createElementVNode("p", {
93
- class: "w-m-60r t-transp mn-b-semi p-regular",
94
- innerHTML: unref(t)("subdescription")
95
- }, null, 8, _hoisted_5),
96
- createElementVNode("div", _hoisted_6, [
97
- (openBlock(), createElementBlock(Fragment, null, renderList(presets, (preset, index) => {
98
- return createElementVNode("button", {
99
- key: preset,
100
- onClick: withModifiers(($event) => unref(router).push({ name: "ProductRecommmendation", query: { mood: preset } }), ["stop"]),
101
- class: "uppercase pd-thin t-medium flex-center flex-column flex-nowrap flex bg-dark-transp-50 bg-blur-thin radius-semi cursor-pointer transition-elastic hover-easeInOut-1"
102
- }, [
103
- createElementVNode("img", {
104
- loading: "lazy",
105
- src: (_ctx.FILE_SERVER_URL || "") + "/icons/moods/" + preset + ".svg",
106
- class: "w-100"
107
- }, null, 8, _hoisted_8),
108
- createElementVNode("span", _hoisted_9, toDisplayString(unref(t)(`presets.` + preset)), 1)
109
- ], 8, _hoisted_7);
110
- }), 64))
111
- ])
112
- ])
113
- ]);
114
- };
115
- }
116
- };
117
- export {
118
- _sfc_main as default
119
- };
120
- //# sourceMappingURL=HeroRecommendation.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HeroRecommendation.vue.js","sources":["../../../../../../../src/modules/products/components/sections/HeroRecommendation.vue"],"sourcesContent":["<script setup>\n\timport { ref, onMounted } from 'vue'\n\n\timport FieldBig from \"@martyrs/src/components/FieldBig/FieldBig.vue\";\n\timport Shader from \"@martyrs/src/components/Shader/Shader.vue\";\n\n\timport { useRouter } from 'vue-router'\n\timport { useI18n } from 'vue-i18n'\n\n\timport * as products from '@martyrs/src/modules/products/store/products.js';\n\n\tconst router = useRouter()\n\n\tconst text = {\n messages: {\n \"en\": {\n\t\t \"title\": \"Increase Your High <br><b class='t-main'>Boosted by AI Budtender</b>\",\n\t\t \"description\": \"Just tell us what you're want, and Weeder will find your ideal match.\",\n\t\t \"placeholderTexts\": [\n\t\t \t'Lowest THC, please!',\n\t\t \t'Something with banana flavors?',\n\t\t \t\"I'm in the mood for trippy vibes.\"\n\t\t ],\n\t\t \"subdescription\": \"AI Curated Recommendations for Your Mood:\",\n\t\t \"presets\": {\n\t\t \"sleep\": \"sleep\",\n\t\t \"creative\": \"creative\",\n\t\t \"giggly\": \"giggly\",\n\t\t \"libido\": \"libido\",\n\t\t \"trippy\": \"trippy\",\n\t\t \"euphoric\": \"euphoric\"\n\t\t },\n\t\t \"placeholder\": \"Tell us what you're after...\",\n\t\t \"action\": \"Transmit\"\n\t\t },\n\t\t \"ru\": {\n\t\t \"title\": \"Персональный Накур,<br><b class='t-main'>Напрямую от AI</b>\",\n\t\t \"description\": \"AI на страже твоего релакса, бро. Мы подбираем самые космические товары с учетом твоего желаемого настроения:\",\n\t\t \"placeholderTexts\": [\n\t\t \t'Я хочу самый низкий THC',\n\t\t \t'Я хочу чего-нибудь бананового',\n\t\t \t'Я хочу курнуть хейза'\n\t\t ],\n\t\t \t \"presets\": {\n\t\t \"sleep\": \"сон\",\n\t\t \"creative\": \"креатив\",\n\t\t \"giggly\": \"смех\",\n\t\t \"libido\": \"либидо\",\n\t\t \"trippy\": \"трип\",\n\t\t \"euphoric\": \"кайф\"\n\t\t },\n\t\t \"subdescription\": \"Или выберите тег, и наш AI направит тебя к самым крутым вариантам:\",\n\t\t \"placeholder\": \"Опиши свой желаемый хай, bro...\",\n\t\t \"action\": \"Передать\"\n\t\t }\n\t\t}\t\n\t}\n\n\tconst { t, rt } = useI18n(text)\n\n\tlet mood = ref('')\n\n\tconst presets = ['sleep','creative','giggly','libido','trippy','euphoric'];\n\n\tasync function submitMood(presetMood = null) {\n\t\tconst moodToSend = presetMood || mood.value;\n\t\tawait products.actions.submitMood(moodToSend);\n\t}\n\n\t\n</script>\n\n<template>\n\t<div \n\t\tclass=\"pd-big bg-black t-white pos-relative o-hidden \"\n\t>\n\t\t<div class=\"flex-column flex-center flex t-center pos-relative z-index-1\">\n\t\t\t\n\t\t\t<h1 \n\t\t\t\tclass=\"mn-b-semi\" \n\t\t\t\tv-html=\"t('title')\"\n\t\t\t/>\n\n\t\t\t<p \n\t\t\t\tclass=\"mn-b-big p-medium t-transp\" \n\t\t\t\tv-html=\"t('description')\"\n\t\t\t/>\n\t\t\t\n\t\t\t<FieldBig \n\t\t\t\t:input=\"mood\" \n\t\t :typingSpeed=\"100\"\n\t\t :loopTyping=\"true\"\n\t\t :enableTyping=\"true\"\n\t\t :placeholder=\"t('placeholder')\"\n\t\t :action=\"t('action')\"\n\t\t @update:input=\"mood = $event\"\n\t\t @action=\"router.push({name: 'Product Recommmendation', query: {mood: mood}})\"\n\t\t\t\tclass=\"mn-b-big pd-big bg-dark-transp-50 bg-blur-thin w-100 w-max-40r\"\n\t\t\t/>\n\n\t\t\t<p \n\t\t\t\tclass=\"w-m-60r t-transp mn-b-semi p-regular\" \n\t\t\t\tv-html=\"t('subdescription')\"\n\t\t\t/>\n\n\t\t\t<div style=\"max-width: 50rem;\" class=\"w-100 h-max gap-thin cols-6\">\n\n\t\t\t\t<button \n\t\t\t\t\tv-for=\"(preset,index) in presets\" \n\t\t\t\t\t:key=\"preset\" \n\t\t\t\t\t@click.stop=\"router.push({name: 'ProductRecommmendation', query: {mood: preset}})\"\n\t\t\t\t\tclass=\"\n\t\t\t\t\t\tuppercase \n\t\t\t\t\t\tpd-thin\n\t\t\t\t\t\tt-medium\n\t\t\t\t\t\tflex-center\n\t\t\t\t\t\tflex-column\n\t\t\t\t\t\tflex-nowrap\n\t\t\t\t\t\tflex\n\t\t\t\t\t\tbg-dark-transp-50 \n\t\t\t\t\t\tbg-blur-thin\n\t\t\t\t\t\tradius-semi\n\t\t\t\t\t\tcursor-pointer\n\t\t\t\t\t\ttransition-elastic\n\t\t\t\t\t\thover-easeInOut-1 \n\t\t\t\t\t\"\n\t\t\t\t>\n\t\t\t\t\t<img loading=\"lazy\" \n\t\t\t\t\t\t:src=\"(FILE_SERVER_URL || '') + '/icons/moods/' + preset + '.svg'\" \n\t\t\t\t\t\tclass=\"w-100\"\n\t\t\t\t\t/>\n\n\t\t\t\t\t<span class=\"t-white\"> \n\t\t\t\t\t\t{{ t(`presets.` + preset) }}\n\t\t\t\t\t</span>\n\t\t\t\t</button>\n\n\t\t\t</div>\n\n\t\t</div>\n\n\t\t<!-- <Shader class=\"w-100 h-100 flex flex-center pos-absolute pos-t-0 pos-r-0 z-index-0\"/> -->\n\n <!-- <div class=\"w-100 h-100 flex flex-center pos-absolute pos-t-0 pos-r-0 z-index-0\">\n \t <img src=\"/spiral.webp\" loading=\"lazy\" alt=\"\" class=\"spiral\"/>\n </div> -->\n\n\t</div>\n</template>\n\n<style style=\"scoped\">\n.spiral {\n object-fit: cover;\n width: 100rem;\n height: 100rem;\n position: absolute;\n top: 50%;\n left: 50%;\n opacity: 0.066;\n transform: translate(-50%, -50%) rotate(0deg);\n transform-origin: center center;\n animation: spin 5s linear infinite;\n}\n\n@keyframes spin {\n 0% {\n transform: translate(-50%, -50%) rotate(0deg);\n }\n 100% {\n transform: translate(-50%, -50%) rotate(360deg);\n }\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAWC,UAAM,SAAS,UAAS;AAExB,UAAM,OAAO;AAAA,MACV,UAAU;AAAA,QACR,MAAM;AAAA,UACN,SAAS;AAAA,UACT,eAAe;AAAA,UACf,oBAAoB;AAAA,YACnB;AAAA,YACA;AAAA,YACA;AAAA,UACP;AAAA,UACM,kBAAkB;AAAA,UAClB,WAAW;AAAA,YACT,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,UAAU;AAAA,YACV,UAAU;AAAA,YACV,YAAY;AAAA,UACpB;AAAA,UACM,eAAe;AAAA,UACf,UAAU;AAAA,QAChB;AAAA,QACI,MAAM;AAAA,UACJ,SAAS;AAAA,UACT,eAAe;AAAA,UACf,oBAAoB;AAAA,YACnB;AAAA,YACA;AAAA,YACA;AAAA,UACP;AAAA,UACO,WAAW;AAAA,YACV,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,UAAU;AAAA,YACV,UAAU;AAAA,YACV,YAAY;AAAA,UACpB;AAAA,UACM,kBAAkB;AAAA,UAClB,eAAe;AAAA,UACf,UAAU;AAAA,QAChB;AAAA,MACA;AAAA,IACA;AAEC,UAAM,EAAE,GAAG,GAAE,IAAK,QAAQ,IAAI;AAE9B,QAAI,OAAO,IAAI,EAAE;AAEjB,UAAM,UAAU,CAAC,SAAQ,YAAW,UAAS,UAAS,UAAS,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}