@zenky/storefront-vue 0.9.47 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/LICENSE.md +2 -2
  2. package/README.md +163 -6
  3. package/dist/cart/index.d.ts +559 -0
  4. package/dist/cart/index.js +13 -0
  5. package/dist/cart/index.js.map +1 -0
  6. package/dist/catalog/index.d.ts +73 -0
  7. package/dist/catalog/index.js +4 -0
  8. package/dist/catalog/index.js.map +1 -0
  9. package/dist/chunk-2OD7CLKD.js +102 -0
  10. package/dist/chunk-2OD7CLKD.js.map +1 -0
  11. package/dist/chunk-4MJKN7PL.js +111 -0
  12. package/dist/chunk-4MJKN7PL.js.map +1 -0
  13. package/dist/chunk-5QCUH3FF.js +15 -0
  14. package/dist/chunk-5QCUH3FF.js.map +1 -0
  15. package/dist/chunk-AL5W5JSD.js +41 -0
  16. package/dist/chunk-AL5W5JSD.js.map +1 -0
  17. package/dist/chunk-BIGTKVC6.js +38 -0
  18. package/dist/chunk-BIGTKVC6.js.map +1 -0
  19. package/dist/chunk-BWUKMWHL.js +45 -0
  20. package/dist/chunk-BWUKMWHL.js.map +1 -0
  21. package/dist/chunk-DKWDKVXQ.js +91 -0
  22. package/dist/chunk-DKWDKVXQ.js.map +1 -0
  23. package/dist/chunk-EMGQXBU3.js +3 -0
  24. package/dist/chunk-EMGQXBU3.js.map +1 -0
  25. package/dist/chunk-EYRCAUUP.js +45 -0
  26. package/dist/chunk-EYRCAUUP.js.map +1 -0
  27. package/dist/chunk-GW2QNTAD.js +327 -0
  28. package/dist/chunk-GW2QNTAD.js.map +1 -0
  29. package/dist/chunk-IGDDWGS4.js +557 -0
  30. package/dist/chunk-IGDDWGS4.js.map +1 -0
  31. package/dist/chunk-OQLU7FSR.js +1841 -0
  32. package/dist/chunk-OQLU7FSR.js.map +1 -0
  33. package/dist/chunk-PJ2LEKW6.js +229 -0
  34. package/dist/chunk-PJ2LEKW6.js.map +1 -0
  35. package/dist/chunk-PWHIDGKW.js +97 -0
  36. package/dist/chunk-PWHIDGKW.js.map +1 -0
  37. package/dist/chunk-RO25KNM5.js +36 -0
  38. package/dist/chunk-RO25KNM5.js.map +1 -0
  39. package/dist/chunk-V3VVDQIR.js +27 -0
  40. package/dist/chunk-V3VVDQIR.js.map +1 -0
  41. package/dist/chunk-VL3T36VM.js +386 -0
  42. package/dist/chunk-VL3T36VM.js.map +1 -0
  43. package/dist/chunk-XUGXLJZB.js +14 -0
  44. package/dist/chunk-XUGXLJZB.js.map +1 -0
  45. package/dist/chunk-Z3IW4ODZ.js +36 -0
  46. package/dist/chunk-Z3IW4ODZ.js.map +1 -0
  47. package/dist/index.d.ts +26 -0
  48. package/dist/index.js +21 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/layout/index.d.ts +54 -0
  51. package/dist/layout/index.js +102 -0
  52. package/dist/layout/index.js.map +1 -0
  53. package/dist/money/index.d.ts +26 -0
  54. package/dist/money/index.js +3 -0
  55. package/dist/money/index.js.map +1 -0
  56. package/dist/order/index.d.ts +34 -0
  57. package/dist/order/index.js +209 -0
  58. package/dist/order/index.js.map +1 -0
  59. package/dist/pagination/index.d.ts +87 -0
  60. package/dist/pagination/index.js +97 -0
  61. package/dist/pagination/index.js.map +1 -0
  62. package/dist/ports/index.d.ts +124 -0
  63. package/dist/ports/index.js +3 -0
  64. package/dist/ports/index.js.map +1 -0
  65. package/dist/products/index.d.ts +105 -0
  66. package/dist/products/index.js +7 -0
  67. package/dist/products/index.js.map +1 -0
  68. package/dist/promotions/index.d.ts +10 -0
  69. package/dist/promotions/index.js +7 -0
  70. package/dist/promotions/index.js.map +1 -0
  71. package/dist/schedule-Dd3zwHEb.d.ts +27 -0
  72. package/dist/seo/index.d.ts +91 -0
  73. package/dist/seo/index.js +289 -0
  74. package/dist/seo/index.js.map +1 -0
  75. package/dist/snippets/index.d.ts +17 -0
  76. package/dist/snippets/index.js +3 -0
  77. package/dist/snippets/index.js.map +1 -0
  78. package/dist/snippets-BC5bkSjm.d.ts +23 -0
  79. package/dist/stores/index.d.ts +196 -0
  80. package/dist/stores/index.js +8 -0
  81. package/dist/stores/index.js.map +1 -0
  82. package/dist/theme/index.d.ts +60 -0
  83. package/dist/theme/index.js +3 -0
  84. package/dist/theme/index.js.map +1 -0
  85. package/dist/utils/index.d.ts +66 -0
  86. package/dist/utils/index.js +4 -0
  87. package/dist/utils/index.js.map +1 -0
  88. package/dist/website-settings/index.d.ts +38 -0
  89. package/dist/website-settings/index.js +3 -0
  90. package/dist/website-settings/index.js.map +1 -0
  91. package/package.json +121 -47
  92. package/dist/cjs/index.cjs +0 -3742
  93. package/dist/esm/index.mjs +0 -3642
  94. package/dist/zenky.d.ts +0 -10377
@@ -0,0 +1,386 @@
1
+ import { useRuntime } from './chunk-V3VVDQIR.js';
2
+ import { DeliveryMethod, PaymentMethod } from '@zenky/storefront-api';
3
+ import { defineStore } from 'pinia';
4
+ import { ref, computed } from 'vue';
5
+
6
+ var KEY_DELIVERY_METHOD = "zenky_delivery_method";
7
+ var KEY_ON_PREMISE_TABLE = "zenky_on_premise_table";
8
+ var KEY_SELECTED_STOCK_ID = "zenky_selected_stock_id";
9
+ var KEY_SELECTED_ADDRESS = "zenky_selected_address";
10
+ var KEY_SELECTED_ADDRESS_ID = "zenky_selected_address_id";
11
+ var KEY_SELECTED_ADDRESS_NAME = "zenky_selected_address_name";
12
+ var VALID_DELIVERY_METHODS = new Set(Object.values(DeliveryMethod));
13
+ var useOrderSettingsStore = defineStore("zenky-order-settings", () => {
14
+ const { storage } = useRuntime();
15
+ const deliveryMethod = ref(DeliveryMethod.Delivery);
16
+ const onPremiseTable = ref(null);
17
+ const selectedStock = ref(null);
18
+ const selectedAddress = ref(null);
19
+ const selectedAddressId = ref(null);
20
+ const selectedAddressName = ref(null);
21
+ function setDeliveryMethod(method) {
22
+ deliveryMethod.value = method;
23
+ storage.set(KEY_DELIVERY_METHOD, method);
24
+ }
25
+ function setOnPremiseTable(table) {
26
+ onPremiseTable.value = table;
27
+ if (table) storage.set(KEY_ON_PREMISE_TABLE, table);
28
+ else storage.remove(KEY_ON_PREMISE_TABLE);
29
+ }
30
+ function setSelectedStock(stock) {
31
+ selectedStock.value = stock;
32
+ if (stock) storage.set(KEY_SELECTED_STOCK_ID, stock.id);
33
+ else storage.remove(KEY_SELECTED_STOCK_ID);
34
+ }
35
+ function setSelectedAddress(address, addressId, addressName) {
36
+ selectedAddress.value = address;
37
+ selectedAddressId.value = addressId ?? null;
38
+ selectedAddressName.value = addressName ?? null;
39
+ writeOrRemove(KEY_SELECTED_ADDRESS, address);
40
+ writeOrRemove(KEY_SELECTED_ADDRESS_ID, addressId ?? null);
41
+ writeOrRemove(KEY_SELECTED_ADDRESS_NAME, addressName ?? null);
42
+ }
43
+ function writeOrRemove(key, value) {
44
+ if (value) storage.set(key, value);
45
+ else storage.remove(key);
46
+ }
47
+ function validateDeliveryMethod(availableMethods) {
48
+ const first = availableMethods[0];
49
+ if (!first) return;
50
+ if (!availableMethods.includes(deliveryMethod.value)) {
51
+ deliveryMethod.value = first;
52
+ storage.set(KEY_DELIVERY_METHOD, first);
53
+ }
54
+ }
55
+ function restoreFromCookies(city) {
56
+ const savedMethod = storage.get(KEY_DELIVERY_METHOD);
57
+ if (savedMethod && VALID_DELIVERY_METHODS.has(savedMethod)) {
58
+ deliveryMethod.value = savedMethod;
59
+ }
60
+ const savedStockId = storage.get(KEY_SELECTED_STOCK_ID);
61
+ const stocks = city.stocks ?? [];
62
+ if (savedStockId && stocks.length) {
63
+ const stock = stocks.find((s) => s.id === savedStockId) ?? null;
64
+ selectedStock.value = stock;
65
+ if (!stock) storage.remove(KEY_SELECTED_STOCK_ID);
66
+ }
67
+ const savedAddress = storage.get(KEY_SELECTED_ADDRESS);
68
+ if (savedAddress) selectedAddress.value = savedAddress;
69
+ const savedAddressId = storage.get(KEY_SELECTED_ADDRESS_ID);
70
+ if (savedAddressId) selectedAddressId.value = savedAddressId;
71
+ const savedAddressName = storage.get(KEY_SELECTED_ADDRESS_NAME);
72
+ if (savedAddressName) selectedAddressName.value = savedAddressName;
73
+ const savedTable = storage.get(KEY_ON_PREMISE_TABLE);
74
+ if (savedTable) onPremiseTable.value = savedTable;
75
+ }
76
+ const isDelivery = computed(() => deliveryMethod.value === DeliveryMethod.Delivery);
77
+ const isPickup = computed(() => deliveryMethod.value === DeliveryMethod.Pickup);
78
+ const isOnPremise = computed(() => deliveryMethod.value === DeliveryMethod.OnPremise);
79
+ const needsAddress = computed(() => deliveryMethod.value === DeliveryMethod.Delivery);
80
+ const needsStock = computed(
81
+ () => deliveryMethod.value === DeliveryMethod.Pickup || deliveryMethod.value === DeliveryMethod.OnPremise
82
+ );
83
+ const needsTable = computed(() => deliveryMethod.value === DeliveryMethod.OnPremise);
84
+ return {
85
+ deliveryMethod,
86
+ onPremiseTable,
87
+ selectedStock,
88
+ selectedAddress,
89
+ selectedAddressId,
90
+ selectedAddressName,
91
+ setDeliveryMethod,
92
+ setOnPremiseTable,
93
+ setSelectedStock,
94
+ setSelectedAddress,
95
+ validateDeliveryMethod,
96
+ restoreFromCookies,
97
+ isDelivery,
98
+ isPickup,
99
+ isOnPremise,
100
+ needsAddress,
101
+ needsStock,
102
+ needsTable
103
+ };
104
+ });
105
+ var KEY_COMMENT = "zenky_order_comment";
106
+ var KEY_PERSONS_COUNT = "zenky_order_persons_count";
107
+ function emptyBonusesIntent() {
108
+ return { enabled: false, desiredAmountMinor: null, requiresConfirmation: false };
109
+ }
110
+ function parsePersonsCount(raw) {
111
+ const parsed = raw ? Number.parseInt(raw, 10) : NaN;
112
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;
113
+ }
114
+ var useCartStore = defineStore("zenky-cart", () => {
115
+ const { storage } = useRuntime();
116
+ const order = ref(null);
117
+ const credentials = ref(null);
118
+ const loading = ref(false);
119
+ const initializing = ref(false);
120
+ const optimisticAdjustments = ref({});
121
+ const lineOptimistic = ref({});
122
+ const deliveryMethods = ref([]);
123
+ const orderSettings = ref(null);
124
+ const comment = ref(storage.get(KEY_COMMENT) ?? "");
125
+ const personsCount = ref(parsePersonsCount(storage.get(KEY_PERSONS_COUNT)));
126
+ const checkoutTotal = ref(null);
127
+ const selectedPaymentMethod = ref(null);
128
+ const selectedPaymentBill = ref(null);
129
+ const selectedCardTokenId = ref(null);
130
+ const selectedSaveCard = ref(false);
131
+ const bonusesIntent = ref(emptyBonusesIntent());
132
+ const deliveryTimeIntent = ref(null);
133
+ const minPriceViolation = ref(null);
134
+ function restorePaymentSelection(payments) {
135
+ const restored = payments.find((p) => {
136
+ const raw2 = p.method;
137
+ const id = typeof raw2 === "string" ? raw2 : raw2?.id ?? null;
138
+ return id !== PaymentMethod.Bonuses;
139
+ });
140
+ if (!restored) return;
141
+ const raw = restored.method;
142
+ const methodId = typeof raw === "string" ? raw : raw?.id ?? null;
143
+ if (!methodId || selectedPaymentMethod.value === methodId) return;
144
+ selectedPaymentMethod.value = methodId;
145
+ const meta = restored.transaction_meta;
146
+ const billMinor = meta?.bill ?? null;
147
+ const newBill = billMinor != null && billMinor > 0 ? billMinor : null;
148
+ if (selectedPaymentBill.value !== newBill) {
149
+ selectedPaymentBill.value = newBill;
150
+ }
151
+ }
152
+ function validatePaymentSelection() {
153
+ if (!selectedPaymentMethod.value) return;
154
+ const methods = orderSettings.value?.payment_methods ?? [];
155
+ if (!methods.some((m) => m.id === selectedPaymentMethod.value)) {
156
+ selectedPaymentMethod.value = null;
157
+ selectedPaymentBill.value = null;
158
+ }
159
+ }
160
+ function setOrder(next) {
161
+ if (!next || !next.id || !next.token) {
162
+ console.warn("[cart] setOrder ignored \u2014 missing id/token", next);
163
+ return;
164
+ }
165
+ order.value = next;
166
+ credentials.value = { id: next.id, token: next.token };
167
+ if (Array.isArray(next.payments) && next.payments.length > 0) {
168
+ restorePaymentSelection(next.payments);
169
+ }
170
+ }
171
+ function patchOrder(partial) {
172
+ if (!partial || !partial.id || !partial.token) {
173
+ console.warn("[cart] patchOrder ignored \u2014 missing id/token", partial);
174
+ return;
175
+ }
176
+ if (!order.value) {
177
+ order.value = partial;
178
+ } else {
179
+ const merged = { ...order.value };
180
+ for (const key of Object.keys(partial)) {
181
+ const value = partial[key];
182
+ if (value !== void 0) {
183
+ merged[key] = value;
184
+ }
185
+ }
186
+ order.value = merged;
187
+ }
188
+ credentials.value = { id: partial.id, token: partial.token };
189
+ if (Array.isArray(partial.payments) && partial.payments.length > 0) {
190
+ restorePaymentSelection(partial.payments);
191
+ }
192
+ }
193
+ function setCredentials(next) {
194
+ credentials.value = next;
195
+ }
196
+ function setLoading(value) {
197
+ loading.value = value;
198
+ }
199
+ function setInitializing(value) {
200
+ initializing.value = value;
201
+ }
202
+ function adjustOptimistic(productId, delta) {
203
+ const next = (optimisticAdjustments.value[productId] ?? 0) + delta;
204
+ if (next === 0) delete optimisticAdjustments.value[productId];
205
+ else optimisticAdjustments.value[productId] = next;
206
+ }
207
+ function clearOptimistic(productId) {
208
+ delete optimisticAdjustments.value[productId];
209
+ }
210
+ function adjustLineOptimistic(lineKey, delta) {
211
+ const next = (lineOptimistic.value[lineKey] ?? 0) + delta;
212
+ if (next === 0) delete lineOptimistic.value[lineKey];
213
+ else lineOptimistic.value[lineKey] = next;
214
+ }
215
+ function setDeliveryMethods(methods) {
216
+ deliveryMethods.value = methods;
217
+ const settingsStore = useOrderSettingsStore();
218
+ settingsStore.validateDeliveryMethod(methods.map((m) => m.id));
219
+ }
220
+ function setOrderSettings(settings) {
221
+ orderSettings.value = settings;
222
+ setDeliveryMethods(settings.delivery_methods);
223
+ validatePaymentSelection();
224
+ }
225
+ function setComment(value) {
226
+ comment.value = value;
227
+ if (value) storage.set(KEY_COMMENT, value);
228
+ else storage.remove(KEY_COMMENT);
229
+ }
230
+ function setPersonsCount(value) {
231
+ personsCount.value = value;
232
+ if (value > 0) storage.set(KEY_PERSONS_COUNT, String(value));
233
+ else storage.remove(KEY_PERSONS_COUNT);
234
+ }
235
+ function setSelectedPaymentMethod(method) {
236
+ selectedPaymentMethod.value = method;
237
+ }
238
+ function setSelectedPaymentBill(bill) {
239
+ selectedPaymentBill.value = bill;
240
+ }
241
+ function setSelectedCardTokenId(id) {
242
+ selectedCardTokenId.value = id;
243
+ }
244
+ function setSelectedSaveCard(value) {
245
+ selectedSaveCard.value = value;
246
+ }
247
+ function setBonusesIntentEnabled(value) {
248
+ bonusesIntent.value.enabled = value;
249
+ if (!value) {
250
+ bonusesIntent.value.desiredAmountMinor = null;
251
+ bonusesIntent.value.requiresConfirmation = false;
252
+ }
253
+ }
254
+ function setDesiredBonusesAmount(value) {
255
+ bonusesIntent.value.desiredAmountMinor = value;
256
+ }
257
+ function setBonusesRequiresConfirmation(value) {
258
+ bonusesIntent.value.requiresConfirmation = value;
259
+ }
260
+ function clearBonusesIntent() {
261
+ bonusesIntent.value = emptyBonusesIntent();
262
+ }
263
+ function setDeliveryTimeIntent(value) {
264
+ deliveryTimeIntent.value = value;
265
+ }
266
+ function setOrderPaymentsState(payments) {
267
+ if (order.value) {
268
+ order.value = { ...order.value, payments };
269
+ }
270
+ restorePaymentSelection(payments);
271
+ }
272
+ function setCheckoutTotal(value) {
273
+ checkoutTotal.value = value;
274
+ const min = value.min_price;
275
+ minPriceViolation.value = min != null && value.total > 0 && value.total < min ? {
276
+ remaining: Math.max(0, min - value.total),
277
+ progress: Math.min(1, value.total / min),
278
+ minPrice: min
279
+ } : null;
280
+ }
281
+ function clearCart() {
282
+ order.value = null;
283
+ credentials.value = null;
284
+ checkoutTotal.value = null;
285
+ optimisticAdjustments.value = {};
286
+ lineOptimistic.value = {};
287
+ orderSettings.value = null;
288
+ comment.value = "";
289
+ personsCount.value = 0;
290
+ storage.remove(KEY_COMMENT);
291
+ storage.remove(KEY_PERSONS_COUNT);
292
+ selectedPaymentMethod.value = null;
293
+ selectedPaymentBill.value = null;
294
+ selectedCardTokenId.value = null;
295
+ selectedSaveCard.value = false;
296
+ bonusesIntent.value = emptyBonusesIntent();
297
+ deliveryTimeIntent.value = null;
298
+ minPriceViolation.value = null;
299
+ }
300
+ const hasOrder = computed(() => order.value !== null);
301
+ const hasCredentials = computed(() => credentials.value !== null);
302
+ const variants = computed(() => order.value?.variants ?? []);
303
+ const totalPrice = computed(() => order.value?.total_price ?? 0);
304
+ const itemCount = computed(() => variants.value.reduce((sum, v) => sum + v.quantity, 0));
305
+ const availableDeliveryMethodIds = computed(
306
+ () => deliveryMethods.value.map((m) => m.id)
307
+ );
308
+ const paymentMethods = computed(
309
+ () => orderSettings.value?.payment_methods ?? []
310
+ );
311
+ const hasBonusesApplied = computed(() => {
312
+ const payments = order.value?.payments ?? [];
313
+ return payments.some((p) => {
314
+ const raw = p.method;
315
+ const id = typeof raw === "string" ? raw : raw?.id ?? null;
316
+ return id === PaymentMethod.Bonuses;
317
+ });
318
+ });
319
+ const productQuantities = computed(() => {
320
+ const map = {};
321
+ for (const variant of variants.value) {
322
+ const pid = variant.product_id;
323
+ map[pid] = (map[pid] ?? 0) + variant.quantity;
324
+ }
325
+ return map;
326
+ });
327
+ return {
328
+ order,
329
+ credentials,
330
+ loading,
331
+ initializing,
332
+ optimisticAdjustments,
333
+ lineOptimistic,
334
+ deliveryMethods,
335
+ orderSettings,
336
+ comment,
337
+ personsCount,
338
+ checkoutTotal,
339
+ selectedPaymentMethod,
340
+ selectedPaymentBill,
341
+ selectedCardTokenId,
342
+ selectedSaveCard,
343
+ bonusesIntent,
344
+ deliveryTimeIntent,
345
+ minPriceViolation,
346
+ setOrder,
347
+ patchOrder,
348
+ setCredentials,
349
+ setLoading,
350
+ setInitializing,
351
+ adjustOptimistic,
352
+ clearOptimistic,
353
+ adjustLineOptimistic,
354
+ setDeliveryMethods,
355
+ setOrderSettings,
356
+ setComment,
357
+ setPersonsCount,
358
+ setSelectedPaymentMethod,
359
+ setSelectedPaymentBill,
360
+ setSelectedCardTokenId,
361
+ setSelectedSaveCard,
362
+ setBonusesIntentEnabled,
363
+ setDesiredBonusesAmount,
364
+ setBonusesRequiresConfirmation,
365
+ clearBonusesIntent,
366
+ setDeliveryTimeIntent,
367
+ restorePaymentSelection,
368
+ validatePaymentSelection,
369
+ setOrderPaymentsState,
370
+ setCheckoutTotal,
371
+ clearCart,
372
+ hasOrder,
373
+ hasCredentials,
374
+ variants,
375
+ totalPrice,
376
+ itemCount,
377
+ availableDeliveryMethodIds,
378
+ paymentMethods,
379
+ hasBonusesApplied,
380
+ productQuantities
381
+ };
382
+ });
383
+
384
+ export { useCartStore, useOrderSettingsStore };
385
+ //# sourceMappingURL=chunk-VL3T36VM.js.map
386
+ //# sourceMappingURL=chunk-VL3T36VM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stores/order-settings.ts","../src/stores/cart.ts"],"names":["defineStore","ref","raw","computed"],"mappings":"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","file":"chunk-VL3T36VM.js","sourcesContent":["import { DeliveryMethod } from '@zenky/storefront-api'\nimport { defineStore } from 'pinia'\nimport { computed, ref, type ComputedRef, type Ref } from 'vue'\n\nimport type { City, Stock } from '@zenky/storefront-api'\n\nimport { useRuntime } from '../ports/runtime'\n\n// Ключи совпадают с прежними CookieKey.* — чтобы не потерять сохранённые настройки.\nconst KEY_DELIVERY_METHOD = 'zenky_delivery_method'\nconst KEY_ON_PREMISE_TABLE = 'zenky_on_premise_table'\nconst KEY_SELECTED_STOCK_ID = 'zenky_selected_stock_id'\nconst KEY_SELECTED_ADDRESS = 'zenky_selected_address'\nconst KEY_SELECTED_ADDRESS_ID = 'zenky_selected_address_id'\nconst KEY_SELECTED_ADDRESS_NAME = 'zenky_selected_address_name'\n\nconst VALID_DELIVERY_METHODS = new Set<string>(Object.values(DeliveryMethod))\n\nexport interface OrderSettingsStore {\n deliveryMethod: Ref<DeliveryMethod>\n onPremiseTable: Ref<string | null>\n selectedStock: Ref<Stock | null>\n selectedAddress: Ref<string | null>\n selectedAddressId: Ref<string | null>\n selectedAddressName: Ref<string | null>\n setDeliveryMethod: (method: DeliveryMethod) => void\n setOnPremiseTable: (table: string | null) => void\n setSelectedStock: (stock: Stock | null) => void\n setSelectedAddress: (\n address: string | null,\n addressId?: string | null,\n addressName?: string | null\n ) => void\n validateDeliveryMethod: (availableMethods: DeliveryMethod[]) => void\n restoreFromCookies: (city: City) => void\n isDelivery: ComputedRef<boolean>\n isPickup: ComputedRef<boolean>\n isOnPremise: ComputedRef<boolean>\n needsAddress: ComputedRef<boolean>\n needsStock: ComputedRef<boolean>\n needsTable: ComputedRef<boolean>\n}\n\nexport const useOrderSettingsStore = defineStore('zenky-order-settings', (): OrderSettingsStore => {\n const { storage } = useRuntime()\n\n const deliveryMethod = ref<DeliveryMethod>(DeliveryMethod.Delivery)\n const onPremiseTable = ref<string | null>(null)\n const selectedStock = ref<Stock | null>(null)\n const selectedAddress = ref<string | null>(null)\n const selectedAddressId = ref<string | null>(null)\n const selectedAddressName = ref<string | null>(null)\n\n function setDeliveryMethod(method: DeliveryMethod): void {\n deliveryMethod.value = method\n storage.set(KEY_DELIVERY_METHOD, method)\n }\n\n function setOnPremiseTable(table: string | null): void {\n onPremiseTable.value = table\n if (table) storage.set(KEY_ON_PREMISE_TABLE, table)\n else storage.remove(KEY_ON_PREMISE_TABLE)\n }\n\n function setSelectedStock(stock: Stock | null): void {\n selectedStock.value = stock\n if (stock) storage.set(KEY_SELECTED_STOCK_ID, stock.id)\n else storage.remove(KEY_SELECTED_STOCK_ID)\n }\n\n function setSelectedAddress(\n address: string | null,\n addressId?: string | null,\n addressName?: string | null\n ): void {\n selectedAddress.value = address\n selectedAddressId.value = addressId ?? null\n selectedAddressName.value = addressName ?? null\n writeOrRemove(KEY_SELECTED_ADDRESS, address)\n writeOrRemove(KEY_SELECTED_ADDRESS_ID, addressId ?? null)\n writeOrRemove(KEY_SELECTED_ADDRESS_NAME, addressName ?? null)\n }\n\n function writeOrRemove(key: string, value: string | null): void {\n if (value) storage.set(key, value)\n else storage.remove(key)\n }\n\n /** Если текущий метод не входит в доступные — переключить на первый доступный. */\n function validateDeliveryMethod(availableMethods: DeliveryMethod[]): void {\n const first = availableMethods[0]\n if (!first) return\n\n if (!availableMethods.includes(deliveryMethod.value)) {\n deliveryMethod.value = first\n storage.set(KEY_DELIVERY_METHOD, first)\n }\n }\n\n /** Восстановить настройки из cookies. Вызывать после загрузки города. */\n function restoreFromCookies(city: City): void {\n const savedMethod = storage.get(KEY_DELIVERY_METHOD)\n if (savedMethod && VALID_DELIVERY_METHODS.has(savedMethod)) {\n deliveryMethod.value = savedMethod as DeliveryMethod\n }\n\n const savedStockId = storage.get(KEY_SELECTED_STOCK_ID)\n const stocks = city.stocks ?? []\n if (savedStockId && stocks.length) {\n const stock = stocks.find((s) => s.id === savedStockId) ?? null\n selectedStock.value = stock\n if (!stock) storage.remove(KEY_SELECTED_STOCK_ID)\n }\n\n const savedAddress = storage.get(KEY_SELECTED_ADDRESS)\n if (savedAddress) selectedAddress.value = savedAddress\n\n const savedAddressId = storage.get(KEY_SELECTED_ADDRESS_ID)\n if (savedAddressId) selectedAddressId.value = savedAddressId\n\n const savedAddressName = storage.get(KEY_SELECTED_ADDRESS_NAME)\n if (savedAddressName) selectedAddressName.value = savedAddressName\n\n const savedTable = storage.get(KEY_ON_PREMISE_TABLE)\n if (savedTable) onPremiseTable.value = savedTable\n }\n\n const isDelivery = computed(() => deliveryMethod.value === DeliveryMethod.Delivery)\n const isPickup = computed(() => deliveryMethod.value === DeliveryMethod.Pickup)\n const isOnPremise = computed(() => deliveryMethod.value === DeliveryMethod.OnPremise)\n const needsAddress = computed(() => deliveryMethod.value === DeliveryMethod.Delivery)\n const needsStock = computed(\n () =>\n deliveryMethod.value === DeliveryMethod.Pickup ||\n deliveryMethod.value === DeliveryMethod.OnPremise\n )\n const needsTable = computed(() => deliveryMethod.value === DeliveryMethod.OnPremise)\n\n return {\n deliveryMethod,\n onPremiseTable,\n selectedStock,\n selectedAddress,\n selectedAddressId,\n selectedAddressName,\n setDeliveryMethod,\n setOnPremiseTable,\n setSelectedStock,\n setSelectedAddress,\n validateDeliveryMethod,\n restoreFromCookies,\n isDelivery,\n isPickup,\n isOnPremise,\n needsAddress,\n needsStock,\n needsTable,\n }\n})\n","import { PaymentMethod } from '@zenky/storefront-api'\nimport { defineStore } from 'pinia'\nimport { computed, ref, type ComputedRef, type Ref } from 'vue'\n\nimport type {\n DeliveryMethod,\n Order,\n OrderCheckoutTotal,\n OrderDeliveryMethod,\n OrderPaymentMethod,\n OrderPaymentTransaction,\n OrderProductVariant,\n OrderSettings,\n} from '@zenky/storefront-api'\n\nimport { useRuntime } from '../ports/runtime'\nimport { useOrderSettingsStore } from './order-settings'\n\n// Ключи совпадают с прежними CookieKey.* — чтобы не потерять сохранённое.\nconst KEY_COMMENT = 'zenky_order_comment'\nconst KEY_PERSONS_COUNT = 'zenky_order_persons_count'\n\nexport interface CartCredentials {\n id: string\n token: string\n}\n\n/** Намерение по бонусам (business-state) — для headless-reconciliation. */\nexport interface AppliedBonusesIntent {\n enabled: boolean\n /** null = «списать максимум». */\n desiredAmountMinor: number | null\n /** PIN-flow: бонусы сняты, нужно подтвердить заново. */\n requiresConfirmation: boolean\n}\n\nexport interface MinPriceViolation {\n remaining: number\n progress: number\n minPrice: number\n}\n\nfunction emptyBonusesIntent(): AppliedBonusesIntent {\n return { enabled: false, desiredAmountMinor: null, requiresConfirmation: false }\n}\n\nfunction parsePersonsCount(raw: string | null): number {\n const parsed = raw ? Number.parseInt(raw, 10) : NaN\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 0\n}\n\nexport interface CartStore {\n order: Ref<Order | null>\n credentials: Ref<CartCredentials | null>\n loading: Ref<boolean>\n initializing: Ref<boolean>\n optimisticAdjustments: Ref<Record<string, number>>\n lineOptimistic: Ref<Record<string, number>>\n deliveryMethods: Ref<OrderDeliveryMethod[]>\n orderSettings: Ref<OrderSettings | null>\n comment: Ref<string>\n personsCount: Ref<number>\n checkoutTotal: Ref<OrderCheckoutTotal | null>\n selectedPaymentMethod: Ref<PaymentMethod | null>\n selectedPaymentBill: Ref<number | null>\n selectedCardTokenId: Ref<string | null>\n selectedSaveCard: Ref<boolean>\n bonusesIntent: Ref<AppliedBonusesIntent>\n deliveryTimeIntent: Ref<string | null>\n minPriceViolation: Ref<MinPriceViolation | null>\n setOrder: (order: Order) => void\n patchOrder: (partial: Order) => void\n setCredentials: (credentials: CartCredentials) => void\n setLoading: (value: boolean) => void\n setInitializing: (value: boolean) => void\n adjustOptimistic: (productId: string, delta: number) => void\n clearOptimistic: (productId: string) => void\n adjustLineOptimistic: (lineKey: string, delta: number) => void\n setDeliveryMethods: (methods: OrderDeliveryMethod[]) => void\n setOrderSettings: (settings: OrderSettings) => void\n setComment: (value: string) => void\n setPersonsCount: (value: number) => void\n setSelectedPaymentMethod: (method: PaymentMethod | null) => void\n setSelectedPaymentBill: (bill: number | null) => void\n setSelectedCardTokenId: (id: string | null) => void\n setSelectedSaveCard: (value: boolean) => void\n setBonusesIntentEnabled: (value: boolean) => void\n setDesiredBonusesAmount: (value: number | null) => void\n setBonusesRequiresConfirmation: (value: boolean) => void\n clearBonusesIntent: () => void\n setDeliveryTimeIntent: (value: string | null) => void\n restorePaymentSelection: (payments: OrderPaymentTransaction[]) => void\n validatePaymentSelection: () => void\n setOrderPaymentsState: (payments: OrderPaymentTransaction[]) => void\n setCheckoutTotal: (value: OrderCheckoutTotal) => void\n clearCart: () => void\n hasOrder: ComputedRef<boolean>\n hasCredentials: ComputedRef<boolean>\n variants: ComputedRef<OrderProductVariant[]>\n totalPrice: ComputedRef<number>\n itemCount: ComputedRef<number>\n availableDeliveryMethodIds: ComputedRef<DeliveryMethod[]>\n paymentMethods: ComputedRef<OrderPaymentMethod[]>\n hasBonusesApplied: ComputedRef<boolean>\n productQuantities: ComputedRef<Record<string, number>>\n}\n\nexport const useCartStore = defineStore('zenky-cart', (): CartStore => {\n const { storage } = useRuntime()\n\n const order = ref<Order | null>(null)\n const credentials = ref<CartCredentials | null>(null)\n const loading = ref(false)\n const initializing = ref(false)\n const optimisticAdjustments = ref<Record<string, number>>({})\n const lineOptimistic = ref<Record<string, number>>({})\n const deliveryMethods = ref<OrderDeliveryMethod[]>([])\n const orderSettings = ref<OrderSettings | null>(null)\n const comment = ref(storage.get(KEY_COMMENT) ?? '')\n const personsCount = ref(parsePersonsCount(storage.get(KEY_PERSONS_COUNT)))\n const checkoutTotal = ref<OrderCheckoutTotal | null>(null)\n const selectedPaymentMethod = ref<PaymentMethod | null>(null)\n const selectedPaymentBill = ref<number | null>(null)\n const selectedCardTokenId = ref<string | null>(null)\n const selectedSaveCard = ref(false)\n const bonusesIntent = ref<AppliedBonusesIntent>(emptyBonusesIntent())\n const deliveryTimeIntent = ref<string | null>(null)\n const minPriceViolation = ref<MinPriceViolation | null>(null)\n\n function restorePaymentSelection(payments: OrderPaymentTransaction[]): void {\n const restored = payments.find((p) => {\n const raw = p.method as unknown\n const id = typeof raw === 'string' ? raw : ((raw as { id?: string } | null)?.id ?? null)\n return id !== PaymentMethod.Bonuses\n })\n if (!restored) return\n\n const raw = restored.method as unknown\n const methodId = (\n typeof raw === 'string' ? raw : ((raw as { id?: PaymentMethod } | null)?.id ?? null)\n ) as PaymentMethod | null\n if (!methodId || selectedPaymentMethod.value === methodId) return\n\n selectedPaymentMethod.value = methodId\n\n const meta = restored.transaction_meta as { bill?: number | null } | null | undefined\n const billMinor = meta?.bill ?? null\n const newBill = billMinor != null && billMinor > 0 ? billMinor : null\n if (selectedPaymentBill.value !== newBill) {\n selectedPaymentBill.value = newBill\n }\n }\n\n function validatePaymentSelection(): void {\n if (!selectedPaymentMethod.value) return\n const methods = orderSettings.value?.payment_methods ?? []\n if (!methods.some((m) => m.id === selectedPaymentMethod.value)) {\n selectedPaymentMethod.value = null\n selectedPaymentBill.value = null\n }\n }\n\n function setOrder(next: Order): void {\n if (!next || !next.id || !next.token) {\n console.warn('[cart] setOrder ignored — missing id/token', next)\n return\n }\n\n order.value = next\n credentials.value = { id: next.id, token: next.token }\n\n if (Array.isArray(next.payments) && next.payments.length > 0) {\n restorePaymentSelection(next.payments as unknown as OrderPaymentTransaction[])\n }\n }\n\n function patchOrder(partial: Order): void {\n if (!partial || !partial.id || !partial.token) {\n console.warn('[cart] patchOrder ignored — missing id/token', partial)\n return\n }\n\n if (!order.value) {\n order.value = partial\n } else {\n const merged: Order = { ...order.value }\n for (const key of Object.keys(partial) as (keyof Order)[]) {\n const value = partial[key]\n if (value !== undefined) {\n ;(merged as unknown as Record<string, unknown>)[key as string] = value\n }\n }\n order.value = merged\n }\n\n credentials.value = { id: partial.id, token: partial.token }\n\n if (Array.isArray(partial.payments) && partial.payments.length > 0) {\n restorePaymentSelection(partial.payments as unknown as OrderPaymentTransaction[])\n }\n }\n\n function setCredentials(next: CartCredentials): void {\n credentials.value = next\n }\n\n function setLoading(value: boolean): void {\n loading.value = value\n }\n\n function setInitializing(value: boolean): void {\n initializing.value = value\n }\n\n function adjustOptimistic(productId: string, delta: number): void {\n const next = (optimisticAdjustments.value[productId] ?? 0) + delta\n if (next === 0) delete optimisticAdjustments.value[productId]\n else optimisticAdjustments.value[productId] = next\n }\n\n function clearOptimistic(productId: string): void {\n delete optimisticAdjustments.value[productId]\n }\n\n function adjustLineOptimistic(lineKey: string, delta: number): void {\n const next = (lineOptimistic.value[lineKey] ?? 0) + delta\n if (next === 0) delete lineOptimistic.value[lineKey]\n else lineOptimistic.value[lineKey] = next\n }\n\n function setDeliveryMethods(methods: OrderDeliveryMethod[]): void {\n deliveryMethods.value = methods\n const settingsStore = useOrderSettingsStore()\n settingsStore.validateDeliveryMethod(methods.map((m) => m.id))\n }\n\n function setOrderSettings(settings: OrderSettings): void {\n orderSettings.value = settings\n setDeliveryMethods(settings.delivery_methods)\n validatePaymentSelection()\n }\n\n function setComment(value: string): void {\n comment.value = value\n if (value) storage.set(KEY_COMMENT, value)\n else storage.remove(KEY_COMMENT)\n }\n\n function setPersonsCount(value: number): void {\n personsCount.value = value\n if (value > 0) storage.set(KEY_PERSONS_COUNT, String(value))\n else storage.remove(KEY_PERSONS_COUNT)\n }\n\n function setSelectedPaymentMethod(method: PaymentMethod | null): void {\n selectedPaymentMethod.value = method\n }\n\n function setSelectedPaymentBill(bill: number | null): void {\n selectedPaymentBill.value = bill\n }\n\n function setSelectedCardTokenId(id: string | null): void {\n selectedCardTokenId.value = id\n }\n\n function setSelectedSaveCard(value: boolean): void {\n selectedSaveCard.value = value\n }\n\n function setBonusesIntentEnabled(value: boolean): void {\n bonusesIntent.value.enabled = value\n if (!value) {\n bonusesIntent.value.desiredAmountMinor = null\n bonusesIntent.value.requiresConfirmation = false\n }\n }\n\n function setDesiredBonusesAmount(value: number | null): void {\n bonusesIntent.value.desiredAmountMinor = value\n }\n\n function setBonusesRequiresConfirmation(value: boolean): void {\n bonusesIntent.value.requiresConfirmation = value\n }\n\n function clearBonusesIntent(): void {\n bonusesIntent.value = emptyBonusesIntent()\n }\n\n function setDeliveryTimeIntent(value: string | null): void {\n deliveryTimeIntent.value = value\n }\n\n function setOrderPaymentsState(payments: OrderPaymentTransaction[]): void {\n if (order.value) {\n order.value = { ...order.value, payments } as Order\n }\n restorePaymentSelection(payments)\n }\n\n function setCheckoutTotal(value: OrderCheckoutTotal): void {\n checkoutTotal.value = value\n\n const min = value.min_price\n minPriceViolation.value =\n min != null && value.total > 0 && value.total < min\n ? {\n remaining: Math.max(0, min - value.total),\n progress: Math.min(1, value.total / min),\n minPrice: min,\n }\n : null\n }\n\n function clearCart(): void {\n order.value = null\n credentials.value = null\n checkoutTotal.value = null\n optimisticAdjustments.value = {}\n lineOptimistic.value = {}\n orderSettings.value = null\n comment.value = ''\n personsCount.value = 0\n storage.remove(KEY_COMMENT)\n storage.remove(KEY_PERSONS_COUNT)\n selectedPaymentMethod.value = null\n selectedPaymentBill.value = null\n selectedCardTokenId.value = null\n selectedSaveCard.value = false\n bonusesIntent.value = emptyBonusesIntent()\n deliveryTimeIntent.value = null\n minPriceViolation.value = null\n }\n\n const hasOrder = computed(() => order.value !== null)\n const hasCredentials = computed(() => credentials.value !== null)\n const variants = computed<OrderProductVariant[]>(() => order.value?.variants ?? [])\n const totalPrice = computed(() => order.value?.total_price ?? 0)\n const itemCount = computed(() => variants.value.reduce((sum, v) => sum + v.quantity, 0))\n const availableDeliveryMethodIds = computed<DeliveryMethod[]>(() =>\n deliveryMethods.value.map((m) => m.id)\n )\n const paymentMethods = computed<OrderPaymentMethod[]>(\n () => orderSettings.value?.payment_methods ?? []\n )\n const hasBonusesApplied = computed(() => {\n const payments = order.value?.payments ?? []\n return (payments as unknown as Array<{ method: unknown }>).some((p) => {\n const raw = p.method\n const id = typeof raw === 'string' ? raw : ((raw as { id?: string } | null)?.id ?? null)\n return id === PaymentMethod.Bonuses\n })\n })\n const productQuantities = computed<Record<string, number>>(() => {\n const map: Record<string, number> = {}\n for (const variant of variants.value) {\n const pid = variant.product_id\n map[pid] = (map[pid] ?? 0) + variant.quantity\n }\n return map\n })\n\n return {\n order,\n credentials,\n loading,\n initializing,\n optimisticAdjustments,\n lineOptimistic,\n deliveryMethods,\n orderSettings,\n comment,\n personsCount,\n checkoutTotal,\n selectedPaymentMethod,\n selectedPaymentBill,\n selectedCardTokenId,\n selectedSaveCard,\n bonusesIntent,\n deliveryTimeIntent,\n minPriceViolation,\n setOrder,\n patchOrder,\n setCredentials,\n setLoading,\n setInitializing,\n adjustOptimistic,\n clearOptimistic,\n adjustLineOptimistic,\n setDeliveryMethods,\n setOrderSettings,\n setComment,\n setPersonsCount,\n setSelectedPaymentMethod,\n setSelectedPaymentBill,\n setSelectedCardTokenId,\n setSelectedSaveCard,\n setBonusesIntentEnabled,\n setDesiredBonusesAmount,\n setBonusesRequiresConfirmation,\n clearBonusesIntent,\n setDeliveryTimeIntent,\n restorePaymentSelection,\n validatePaymentSelection,\n setOrderPaymentsState,\n setCheckoutTotal,\n clearCart,\n hasOrder,\n hasCredentials,\n variants,\n totalPrice,\n itemCount,\n availableDeliveryMethodIds,\n paymentMethods,\n hasBonusesApplied,\n productQuantities,\n }\n})\n"]}
@@ -0,0 +1,14 @@
1
+ // src/utils/debounce.ts
2
+ function createDebounce(fn, delay) {
3
+ let timeout = null;
4
+ return () => {
5
+ if (timeout) {
6
+ clearTimeout(timeout);
7
+ }
8
+ timeout = setTimeout(fn, delay);
9
+ };
10
+ }
11
+
12
+ export { createDebounce };
13
+ //# sourceMappingURL=chunk-XUGXLJZB.js.map
14
+ //# sourceMappingURL=chunk-XUGXLJZB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/debounce.ts"],"names":[],"mappings":";AAAO,SAAS,cAAA,CAAe,IAAgB,KAAA,EAA2B;AACtE,EAAA,IAAI,OAAA,GAAgD,IAAA;AAEpD,EAAA,OAAO,MAAM;AACT,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,YAAA,CAAa,OAAO,CAAA;AAAA,IACxB;AAEA,IAAA,OAAA,GAAU,UAAA,CAAW,IAAI,KAAK,CAAA;AAAA,EAClC,CAAA;AACJ","file":"chunk-XUGXLJZB.js","sourcesContent":["export function createDebounce(fn: () => void, delay: number): () => void {\n let timeout: ReturnType<typeof setTimeout> | null = null\n\n return () => {\n if (timeout) {\n clearTimeout(timeout)\n }\n\n timeout = setTimeout(fn, delay)\n }\n}\n"]}
@@ -0,0 +1,36 @@
1
+ import { defineStore } from 'pinia';
2
+ import { ref, computed } from 'vue';
3
+
4
+ // src/stores/catalog.ts
5
+ var useCatalogStore = defineStore("zenky-catalog", () => {
6
+ const catalog = ref([]);
7
+ const currentHash = ref(null);
8
+ const reloading = ref(false);
9
+ const loadError = ref(false);
10
+ function initCatalog(items, hash) {
11
+ catalog.value = items;
12
+ currentHash.value = hash ?? null;
13
+ loadError.value = false;
14
+ }
15
+ function setLoadError() {
16
+ loadError.value = true;
17
+ }
18
+ function setReloading(value) {
19
+ reloading.value = value;
20
+ }
21
+ const hasCatalog = computed(() => catalog.value.length > 0);
22
+ return {
23
+ catalog,
24
+ currentHash,
25
+ reloading,
26
+ loadError,
27
+ initCatalog,
28
+ setLoadError,
29
+ setReloading,
30
+ hasCatalog
31
+ };
32
+ });
33
+
34
+ export { useCatalogStore };
35
+ //# sourceMappingURL=chunk-Z3IW4ODZ.js.map
36
+ //# sourceMappingURL=chunk-Z3IW4ODZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stores/catalog.ts"],"names":[],"mappings":";;;;AAoBO,IAAM,eAAA,GAAkB,WAAA,CAAY,eAAA,EAAiB,MAAoB;AAC5E,EAAA,MAAM,OAAA,GAAU,GAAA,CAAmB,EAAE,CAAA;AACrC,EAAA,MAAM,WAAA,GAAc,IAAmB,IAAI,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,IAAI,KAAK,CAAA;AAC3B,EAAA,MAAM,SAAA,GAAY,IAAI,KAAK,CAAA;AAE3B,EAAA,SAAS,WAAA,CAAY,OAAsB,IAAA,EAA4B;AACnE,IAAA,OAAA,CAAQ,KAAA,GAAQ,KAAA;AAChB,IAAA,WAAA,CAAY,QAAQ,IAAA,IAAQ,IAAA;AAC5B,IAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,EACtB;AAEA,EAAA,SAAS,YAAA,GAAqB;AAC1B,IAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAAA,EACtB;AAEA,EAAA,SAAS,aAAa,KAAA,EAAsB;AACxC,IAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,EACtB;AAEA,EAAA,MAAM,aAAa,QAAA,CAAS,MAAM,OAAA,CAAQ,KAAA,CAAM,SAAS,CAAC,CAAA;AAE1D,EAAA,OAAO;AAAA,IACH,OAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACJ;AACJ,CAAC","file":"chunk-Z3IW4ODZ.js","sourcesContent":["import { defineStore } from 'pinia'\nimport { computed, ref, type ComputedRef, type Ref } from 'vue'\n\nimport type { CatalogItem } from '@zenky/storefront-api'\n\n// Явный тип возврата (а не выведенный) — иначе Pinia-инференс структурно разворачивает\n// SDK-типы в .d.ts и раздувает его. Заодно соответствует правилу «явные return types».\nexport interface CatalogStore {\n catalog: Ref<CatalogItem[]>\n currentHash: Ref<string | null>\n reloading: Ref<boolean>\n loadError: Ref<boolean>\n initCatalog: (items: CatalogItem[], hash?: string | null) => void\n setLoadError: () => void\n setReloading: (value: boolean) => void\n hasCatalog: ComputedRef<boolean>\n}\n\n// Setup-стор (док 05): id с префиксом zenky-*, чтобы не столкнуться со сторами потребителя.\n// Чистый контейнер состояния — API/куки живут в composables/bootstrap, которые зовут actions.\nexport const useCatalogStore = defineStore('zenky-catalog', (): CatalogStore => {\n const catalog = ref<CatalogItem[]>([])\n const currentHash = ref<string | null>(null)\n const reloading = ref(false)\n const loadError = ref(false)\n\n function initCatalog(items: CatalogItem[], hash?: string | null): void {\n catalog.value = items\n currentHash.value = hash ?? null\n loadError.value = false\n }\n\n function setLoadError(): void {\n loadError.value = true\n }\n\n function setReloading(value: boolean): void {\n reloading.value = value\n }\n\n const hasCatalog = computed(() => catalog.value.length > 0)\n\n return {\n catalog,\n currentHash,\n reloading,\n loadError,\n initCatalog,\n setLoadError,\n setReloading,\n hasCatalog,\n }\n})\n"]}
@@ -0,0 +1,26 @@
1
+ import { StorefrontRuntime } from './ports/index.js';
2
+ export { ActivityReporter, CatalogReloader, CommerceAddedToCartPayload, CommerceEventIdentity, CommerceEventsPort, CommerceRemovedFromCartPayload, EventsPort, NOOP_ACTIVITY_REPORTER, NOOP_NOTIFIER, NOOP_RUM, Notifier, RealtimeAdapter, RealtimeChannel, RealtimePort, Result, RumReporter, StorageAdapter, StorageOptions, StorefrontConfig, createMemoryStorage, err, ok } from './ports/index.js';
3
+ import { Plugin } from 'vue';
4
+ export { Major, Minor, asMajor, asMinor, formatPrice, majorToMinor, minorToMajor, minorToMajorString } from './money/index.js';
5
+ export { DARK_THEME_PRESETS, FontConfig, PrimaryShades, THEME_PRESETS, ThemeColorConfig, ThemeData, ThemePreset, buildCssVariableMap, generatePrimaryShades, generateShades, useTheme } from './theme/index.js';
6
+ export { OperationChain, buildQrCodeUrl, createDebounce, createOperationChain, formatAddressCityLast, formatDate, formatDateTime, formatPhoneNational, formatPhoneSpaced, getApiErrorMessage, getApiFieldErrors, getPhoneTelLink, pluralize, toDateInputValue, todayInTimezone } from './utils/index.js';
7
+ export { D as DayScheduleInfo, S as SocialLink, T as TodayScheduleInfo, f as formatScheduleStatus, g as getEmailLink, a as getSocialLinks, b as getTodayInfo, c as getWebsiteLink, d as getWeeklySchedule } from './schedule-Dd3zwHEb.js';
8
+ export { CatalogProductMatch, CategoryWithProducts, OrderCredentials, ProductVariantOptionListItem, ResolvedPrice, canAddDirectly, findProductInCatalog, formatWeight, getProductWeight, getVariantWeight, resolveVariantPrice, toGrams, usePriceRecalculation, useProductPricing, useProductVariant, useProductVariantModifiers, useProductVariantSelector, useProductsByCategory, useRelatedProducts } from './products/index.js';
9
+ export { GroupedProducts, SubcategoryGroup, catalogRoutes, collectDescendantIds, findCategoryById, findCategoryByShortId, findRootAncestor, getCategoryPath, getCity, getRemoteCatalog, getStock, groupProductsBySubcategory, useCollections } from './catalog/index.js';
10
+ export { AttachedCustomerCache, BonusesReconciliation, BonusesReconciliationDeps, CASH_DENOMINATIONS_MAJOR, CachedCustomerView, CartCredentials, CartDependencies, CartErrorScope, CartInitialization, CartItemRequest, CartLineKeyParams, CartMutationComposable, CartOperations, CartQuantities, CartRecalculation, CartRecalculationDeps, CartStockWatcher, CashChangePresetsOptions, CheckoutFlowFlags, CheckoutSubmitComposable, CustomerAttachComposable, DEFAULT_ROUND_STEPS_MAJOR, MainPaymentRequestParams, MutationKind, MutationOptions, ORDER_EVENTS, ORDER_WITH, OrderBonusesComposable, OrderBonusesDeps, OrderCredentialsLike, OrderDelivery, OrderDeliveryDeps, OrderPromocodeComposable, OrderPromocodeDeps, OrderSettingsComposable, OrderTotal, PaymentSelection, PaymentSelectionComposable, RecaptchaPayloadProvider, RetryOptions, StorefrontCart, buildCartLineKey, buildCashChangePresets, buildMainPaymentRequest, getCartErrorCode, getCartErrorHttpCode, getCartErrorMessage, getCashDenominationsMinor, getDefaultRoundStepsMinor, getValidationErrors, logCartError, normalizeAddress, useBonusesReconciliation, useCartAddressSync, useCartCredentials, useCartCustomerAttachment, useCartDeliveryAttachment, useCartInitialization, useCartMutation, useCartOperations, useCartQuantities, useCartRecalculation, useCartStockWatcher, useCheckoutFlow, useCheckoutSubmit, useCustomerAttach, useOnlinePaymentRetry, useOrderBonuses, useOrderChannel, useOrderDelivery, useOrderPromocode, useOrderSettings, useOrderTotal, usePaymentSelection, useStorefrontCart, variantLineKey } from './cart/index.js';
11
+ export { R as RawSnippetItem, S as Snippet, a as SnippetGroup, b as SnippetLanguage, c as SnippetPosition, n as normalizeSnippets } from './snippets-BC5bkSjm.js';
12
+ export { SnippetHead, buildSnippetHead } from './snippets/index.js';
13
+ export { SettingValue, Website, WebsitePage, WebsitePageListItem, WebsitePageSeo, WebsitePageType, WebsiteSettingsValues } from './website-settings/index.js';
14
+ export { AppliedBonusesIntent, AuthStore, CartStore, MinPriceViolation, OrderSettingsStore, PromotionsStore, RewardSelection, RewardSelectionContext, StoreProfileStore, useAuthStore, useCartStore, useCatalogStore, useOrderSettingsStore, useProductsStore, usePromotionsStore, useStore, useStoreProfileStore, useStorefrontProfile } from './stores/index.js';
15
+ import '@zenky/integrations-sdk';
16
+ import '@zenky/storefront-api';
17
+ import 'pinia';
18
+
19
+ /** Vue-плагин: app.use(createStorefront(runtime)). */
20
+ declare function createStorefront(runtime: StorefrontRuntime): Plugin;
21
+ /** Альтернатива плагину — provide внутри setup (напр. в изолированном виджете). */
22
+ declare function provideStorefront(runtime: StorefrontRuntime): void;
23
+ /** Доступ к рантайму из любого composable/стора ядра. */
24
+ declare function useRuntime(): StorefrontRuntime;
25
+
26
+ export { StorefrontRuntime, createStorefront, provideStorefront, useRuntime };
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ export { canAddDirectly, findProductInCatalog, formatWeight, getProductWeight, getVariantWeight, resolveVariantPrice, toGrams, usePriceRecalculation, useProductPricing, useProductVariant, useProductVariantModifiers, useProductVariantSelector, useProductsByCategory, useRelatedProducts } from './chunk-IGDDWGS4.js';
2
+ export { buildSnippetHead, normalizeSnippets } from './chunk-DKWDKVXQ.js';
3
+ export { useProductsStore, useStore, useStorefrontProfile } from './chunk-BIGTKVC6.js';
4
+ export { DARK_THEME_PRESETS, THEME_PRESETS, buildCssVariableMap, generatePrimaryShades, generateShades, useTheme } from './chunk-GW2QNTAD.js';
5
+ import './chunk-EMGQXBU3.js';
6
+ export { CASH_DENOMINATIONS_MAJOR, DEFAULT_ROUND_STEPS_MAJOR, ORDER_EVENTS, ORDER_WITH, buildCartLineKey, buildCashChangePresets, buildMainPaymentRequest, getCartErrorCode, getCartErrorHttpCode, getCartErrorMessage, getCashDenominationsMinor, getDefaultRoundStepsMinor, getValidationErrors, logCartError, normalizeAddress, useBonusesReconciliation, useCartAddressSync, useCartCustomerAttachment, useCartDeliveryAttachment, useCartInitialization, useCartMutation, useCartOperations, useCartQuantities, useCartRecalculation, useCartStockWatcher, useCheckoutFlow, useCheckoutSubmit, useCustomerAttach, useOnlinePaymentRetry, useOrderBonuses, useOrderChannel, useOrderDelivery, useOrderPromocode, useOrderSettings, useOrderTotal, usePaymentSelection, useStorefrontCart, variantLineKey } from './chunk-OQLU7FSR.js';
7
+ export { useCartCredentials } from './chunk-4MJKN7PL.js';
8
+ import './chunk-5QCUH3FF.js';
9
+ export { useCatalogStore } from './chunk-Z3IW4ODZ.js';
10
+ export { usePromotionsStore } from './chunk-BWUKMWHL.js';
11
+ export { useAuthStore, useStoreProfileStore } from './chunk-PWHIDGKW.js';
12
+ export { catalogRoutes, collectDescendantIds, findCategoryById, findCategoryByShortId, findRootAncestor, getCategoryPath, groupProductsBySubcategory, useCollections } from './chunk-2OD7CLKD.js';
13
+ export { getCity, getRemoteCatalog, getStock } from './chunk-EYRCAUUP.js';
14
+ export { buildQrCodeUrl, createOperationChain, formatAddressCityLast, formatDate, formatDateTime, formatPhoneNational, formatPhoneSpaced, formatScheduleStatus, getApiErrorMessage, getApiFieldErrors, getEmailLink, getPhoneTelLink, getSocialLinks, getTodayInfo, getWebsiteLink, getWeeklySchedule, pluralize, toDateInputValue, todayInTimezone } from './chunk-PJ2LEKW6.js';
15
+ export { createDebounce } from './chunk-XUGXLJZB.js';
16
+ export { useCartStore, useOrderSettingsStore } from './chunk-VL3T36VM.js';
17
+ export { createStorefront, provideStorefront, useRuntime } from './chunk-V3VVDQIR.js';
18
+ export { asMajor, asMinor, formatPrice, majorToMinor, minorToMajor, minorToMajorString } from './chunk-RO25KNM5.js';
19
+ export { NOOP_ACTIVITY_REPORTER, NOOP_NOTIFIER, NOOP_RUM, createMemoryStorage, err, ok } from './chunk-AL5W5JSD.js';
20
+ //# sourceMappingURL=index.js.map
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,54 @@
1
+ import { ComputedRef } from 'vue';
2
+ import { City, Phone, Store, Stock } from '@zenky/storefront-api';
3
+ import { T as TodayScheduleInfo, D as DayScheduleInfo, S as SocialLink } from '../schedule-Dd3zwHEb.js';
4
+
5
+ interface LegalLink {
6
+ label: string;
7
+ to: string;
8
+ }
9
+ interface FormattedPhone {
10
+ formatted: string;
11
+ telLink: string;
12
+ }
13
+ /** App-специфичные значения для шапки (из Website Builder / app.config). */
14
+ interface HeaderDataOptions {
15
+ showStoreName: boolean;
16
+ logoOverride: string | null;
17
+ }
18
+ /** App-специфичные значения для футера (logo-override + правовые ссылки фичи). */
19
+ interface FooterDataOptions {
20
+ logoOverride: string | null;
21
+ legalLinks: ComputedRef<LegalLink[]>;
22
+ }
23
+ interface HeaderData {
24
+ storeName: ComputedRef<string>;
25
+ showStoreName: ComputedRef<boolean>;
26
+ logoUrl: ComputedRef<string | null>;
27
+ cityName: ComputedRef<string | null>;
28
+ cities: ComputedRef<City[]>;
29
+ phone: ComputedRef<Phone | null>;
30
+ phoneFormatted: ComputedRef<string | null>;
31
+ phoneTelLink: ComputedRef<string | null>;
32
+ schedule: ComputedRef<TodayScheduleInfo | null>;
33
+ scheduleHours: ComputedRef<string | null>;
34
+ cartCount: ComputedRef<number>;
35
+ }
36
+ interface FooterData {
37
+ storeName: ComputedRef<string>;
38
+ logoUrl: ComputedRef<string | null>;
39
+ phones: ComputedRef<FormattedPhone[]>;
40
+ todaySchedule: ComputedRef<TodayScheduleInfo | null>;
41
+ weeklySchedule: ComputedRef<DayScheduleInfo[]>;
42
+ address: ComputedRef<string | null>;
43
+ socialLinks: ComputedRef<SocialLink[]>;
44
+ legalLinks: ComputedRef<LegalLink[]>;
45
+ copyrightYear: ComputedRef<number>;
46
+ appStoreUrl: ComputedRef<string | null>;
47
+ googlePlayUrl: ComputedRef<string | null>;
48
+ }
49
+
50
+ declare function useHeaderData(store: ComputedRef<Store>, city: ComputedRef<City>, stock: ComputedRef<Stock | null>, options: HeaderDataOptions): HeaderData;
51
+
52
+ declare function useFooterData(store: ComputedRef<Store>, city: ComputedRef<City>, stock: ComputedRef<Stock | null>, options: FooterDataOptions): FooterData;
53
+
54
+ export { type FooterData, type FooterDataOptions, type FormattedPhone, type HeaderData, type HeaderDataOptions, type LegalLink, useFooterData, useHeaderData };