@altazion/commerce-sdk-vue 26.407.7565 → 26.415.7673

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.
package/README.md CHANGED
@@ -26,6 +26,26 @@ app.use(AltazionCommercePlugin, {
26
26
  app.mount('#app')
27
27
  ```
28
28
 
29
+ ## Mode offline borne
30
+
31
+ Le package expose aussi un store dédié à l'état réseau et au mode d'écran terminal.
32
+
33
+ ### `useConnectivityStore`
34
+
35
+ ```ts
36
+ import { useConnectivityStore } from '@altazion/commerce-sdk-vue'
37
+
38
+ const connectivityStore = useConnectivityStore()
39
+
40
+ connectivityStore.status // 'online' | 'offline'
41
+ connectivityStore.isOnline // boolean
42
+ connectivityStore.isOffline // boolean
43
+ connectivityStore.screenMode // 'interactive' | 'offline'
44
+ connectivityStore.isInteractiveAvailable // boolean
45
+ ```
46
+
47
+ Cas d'usage typique sur borne : basculer vers un écran passif (pub, branding, attente) quand `screenMode === 'offline'`.
48
+
29
49
  ## Stores Pinia
30
50
 
31
51
  ### `useCartStore`
@@ -48,7 +68,6 @@ cartStore.total // total TTC (computed)
48
68
  cartStore.isEmpty // boolean (computed)
49
69
  cartStore.loading // boolean
50
70
  cartStore.isOffline // boolean
51
- cartStore.hasPendingOperations // mutations en attente de sync
52
71
  ```
53
72
 
54
73
  ### `useCatalogStore`
@@ -95,6 +114,21 @@ sessionStore.isKiosk // boolean
95
114
  sessionStore.isReady // boolean
96
115
  ```
97
116
 
117
+ ### Exemple de bascule d'écran
118
+
119
+ ```vue
120
+ <script setup lang="ts">
121
+ import { useConnectivityStore } from '@altazion/commerce-sdk-vue'
122
+
123
+ const connectivityStore = useConnectivityStore()
124
+ </script>
125
+
126
+ <template>
127
+ <OfflineScreen v-if="connectivityStore.screenMode === 'offline'" />
128
+ <InteractiveApp v-else />
129
+ </template>
130
+ ```
131
+
98
132
  ## Composants
99
133
 
100
134
  ### `<ProductCard>`
package/dist/index.cjs CHANGED
@@ -20,6 +20,24 @@ function useCommerceClient() {
20
20
  }
21
21
  return client;
22
22
  }
23
+ const useConnectivityStore = pinia.defineStore("altazion:connectivity", () => {
24
+ const client = useCommerceClient();
25
+ const status = vue.ref(client.connectivity.isOnline ? "online" : "offline");
26
+ client.connectivity.subscribe((nextStatus) => {
27
+ status.value = nextStatus;
28
+ });
29
+ const isOnline = vue.computed(() => status.value === "online");
30
+ const isOffline = vue.computed(() => status.value === "offline");
31
+ const screenMode = vue.computed(() => isOffline.value ? "offline" : "interactive");
32
+ const isInteractiveAvailable = vue.computed(() => !isOffline.value);
33
+ return {
34
+ status,
35
+ isOnline,
36
+ isOffline,
37
+ screenMode,
38
+ isInteractiveAvailable
39
+ };
40
+ });
23
41
  const useSessionStore = pinia.defineStore("altazion:session", () => {
24
42
  const client = useCommerceClient();
25
43
  const session = vue.ref(null);
@@ -61,10 +79,6 @@ const useCartStore = pinia.defineStore("altazion:cart", () => {
61
79
  const cart = vue.ref(null);
62
80
  const loading = vue.ref(false);
63
81
  const error = vue.ref(null);
64
- const hasPendingOperations = vue.ref(false);
65
- client.onQueueEvent(async () => {
66
- hasPendingOperations.value = await client.pendingOperationsCount > 0;
67
- });
68
82
  const isOffline = vue.computed(() => client.isOffline);
69
83
  const itemCount = vue.computed(() => {
70
84
  var _a;
@@ -135,7 +149,6 @@ const useCartStore = pinia.defineStore("altazion:cart", () => {
135
149
  loading,
136
150
  error,
137
151
  isOffline,
138
- hasPendingOperations,
139
152
  itemCount,
140
153
  total,
141
154
  isEmpty,
@@ -234,7 +247,7 @@ const _hoisted_8$1 = {
234
247
  class: "altz-product-card__price--original"
235
248
  };
236
249
  const _hoisted_9$1 = { class: "altz-product-card__price--current" };
237
- const _hoisted_10$1 = {
250
+ const _hoisted_10 = {
238
251
  key: 0,
239
252
  class: "altz-product-card__unavailable"
240
253
  };
@@ -275,7 +288,7 @@ const _sfc_main$2 = /* @__PURE__ */ vue.defineComponent({
275
288
  __props.product.discountedPrice ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_8$1, vue.toDisplayString(__props.product.price.toFixed(2)) + " € ", 1)) : vue.createCommentVNode("", true),
276
289
  vue.createElementVNode("span", _hoisted_9$1, vue.toDisplayString((__props.product.discountedPrice ?? __props.product.price).toFixed(2)) + " € ", 1)
277
290
  ]),
278
- !__props.product.availableForOrder ? (vue.openBlock(), vue.createElementBlock("p", _hoisted_10$1, " Indisponible ")) : vue.createCommentVNode("", true),
291
+ !__props.product.availableForOrder ? (vue.openBlock(), vue.createElementBlock("p", _hoisted_10, " Indisponible ")) : vue.createCommentVNode("", true),
279
292
  __props.showAddToCart && __props.product.availableForOrder ? (vue.openBlock(), vue.createElementBlock("button", {
280
293
  key: 1,
281
294
  class: "altz-product-card__add-to-cart",
@@ -305,10 +318,6 @@ const _hoisted_6 = { class: "altz-cart-summary__line-qty" };
305
318
  const _hoisted_7 = { class: "altz-cart-summary__line-price" };
306
319
  const _hoisted_8 = { class: "altz-cart-summary__total" };
307
320
  const _hoisted_9 = { class: "altz-cart-summary__total-amount" };
308
- const _hoisted_10 = {
309
- key: 1,
310
- class: "altz-cart-summary__offline-notice"
311
- };
312
321
  const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
313
322
  __name: "CartSummary",
314
323
  props: {
@@ -338,8 +347,7 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
338
347
  vue.createElementVNode("div", _hoisted_8, [
339
348
  _cache[0] || (_cache[0] = vue.createElementVNode("span", { class: "altz-cart-summary__total-label" }, "Total", -1)),
340
349
  vue.createElementVNode("span", _hoisted_9, vue.toDisplayString(vue.unref(cartStore).total.toFixed(2)) + " €", 1)
341
- ]),
342
- vue.unref(cartStore).hasPendingOperations ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_10, " Modifications en attente de synchronisation… ")) : vue.createCommentVNode("", true)
350
+ ])
343
351
  ], 64))
344
352
  ]);
345
353
  };
@@ -383,6 +391,7 @@ exports.ProductCard = _sfc_main$2;
383
391
  exports.useCartStore = useCartStore;
384
392
  exports.useCatalogStore = useCatalogStore;
385
393
  exports.useCommerceClient = useCommerceClient;
394
+ exports.useConnectivityStore = useConnectivityStore;
386
395
  exports.useSearchStore = useSearchStore;
387
396
  exports.useSessionStore = useSessionStore;
388
397
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/plugin.ts","../src/composables/useCommerceClient.ts","../src/stores/useSessionStore.ts","../src/stores/useCartStore.ts","../src/stores/useCatalogStore.ts","../src/stores/useSearchStore.ts","../src/components/ProductCard.vue","../src/components/CartSummary.vue","../src/components/AddToCartButton.vue"],"sourcesContent":["import type { App } from 'vue'\nimport { createPinia, type Pinia } from 'pinia'\nimport type { CommerceClient } from '@altazion/commerce-sdk-core'\n\nexport const COMMERCE_CLIENT_KEY = Symbol('altazion:commerce-client')\n\nexport interface AltazionCommercePluginOptions {\n client: CommerceClient\n /** Pinia instance existante (optionnel — le plugin en crée une si absent) */\n pinia?: Pinia\n}\n\n/**\n * Plugin Vue 3 pour le SDK Altazion Commerce.\n *\n * Usage :\n * ```ts\n * import { createApp } from 'vue'\n * import { CommerceClient } from '@altazion/commerce-sdk-core'\n * import { AltazionCommercePlugin } from '@altazion/commerce-sdk-vue'\n *\n * const client = new CommerceClient({ baseUrl: '...', siteUrl: window.location.href })\n * await client.initialize()\n *\n * createApp(App)\n * .use(AltazionCommercePlugin, { client })\n * .mount('#app')\n * ```\n */\nexport const AltazionCommercePlugin = {\n install(app: App, options: AltazionCommercePluginOptions): void {\n const { client, pinia } = options\n\n // Installer Pinia si pas déjà présente\n const piniaInstance = pinia ?? createPinia()\n app.use(piniaInstance)\n\n // Rendre le client accessible via inject()\n app.provide(COMMERCE_CLIENT_KEY, client)\n }\n}\n","import { inject } from 'vue'\nimport { COMMERCE_CLIENT_KEY } from '../plugin.js'\nimport type { CommerceClient } from '@altazion/commerce-sdk-core'\n\n/**\n * Composable pour accéder au CommerceClient injecté par AltazionCommercePlugin.\n * Doit être utilisé dans un composant Vue (setup()) ou un store Pinia.\n */\nexport function useCommerceClient(): CommerceClient {\n const client = inject<CommerceClient>(COMMERCE_CLIENT_KEY)\n if (!client) {\n throw new Error(\n '[AltazionCommerce] useCommerceClient() : aucun client trouvé. ' +\n 'Assurez-vous d\\'avoir installé AltazionCommercePlugin via app.use().'\n )\n }\n return client\n}\n","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { SessionInfo, ConnectivityStatus } from '@altazion/commerce-sdk-core'\n\nexport const useSessionStore = defineStore('altazion:session', () => {\n const client = useCommerceClient()\n\n const session = ref<SessionInfo | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const isOnline = ref(client.connectivity.isOnline)\n client.connectivity.subscribe((status: ConnectivityStatus) => {\n isOnline.value = status === 'online'\n })\n\n const mode = computed(() => client.context.mode)\n const isKiosk = computed(() => mode.value === 'kiosk')\n const isReady = computed(() => session.value !== null || mode.value === 'kiosk')\n\n async function load(): Promise<void> {\n loading.value = true\n error.value = null\n try {\n session.value = await client.session.getSession()\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function associateStore(storeGuid: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n session.value = await client.session.associateStore(storeGuid)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return { session, loading, error, isOnline, mode, isKiosk, isReady, load, associateStore }\n})\n","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { Cart } from '@altazion/commerce-sdk-core'\n\nexport const useCartStore = defineStore('altazion:cart', () => {\n const client = useCommerceClient()\n\n const cart = ref<Cart | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n const hasPendingOperations = ref(false)\n\n // Mise à jour de hasPendingOperations via la file offline\n client.onQueueEvent(async () => {\n hasPendingOperations.value = (await client.pendingOperationsCount) > 0\n })\n\n const isOffline = computed(() => client.isOffline)\n const itemCount = computed(() => cart.value?.totalQuantity ?? 0)\n const total = computed(() => cart.value?.totalAmountWithTax ?? 0)\n const isEmpty = computed(() => itemCount.value === 0)\n\n async function load(): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.getCart()\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function addItem(reference: string, quantity: number, options?: Record<string, unknown>): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.addItem(reference, quantity, options)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function updateItem(lineId: string, quantity: number): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.updateItem(lineId, quantity)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function removeItem(lineId: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.removeItem(lineId)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function applyCoupon(code: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.applyCoupon(code)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return {\n cart, loading, error, isOffline, hasPendingOperations,\n itemCount, total, isEmpty,\n load, addItem, updateItem, removeItem, applyCoupon\n }\n})\n","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { ProductDetails, SearchResult, SearchRequest } from '@altazion/commerce-sdk-core'\n\nexport const useCatalogStore = defineStore('altazion:catalog', () => {\n const client = useCommerceClient()\n\n const currentProduct = ref<ProductDetails | null>(null)\n const categoryResult = ref<SearchResult | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const isOffline = computed(() => client.isOffline)\n\n async function loadProduct(reference: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n currentProduct.value = await client.catalog.getProduct(reference)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function loadCategory(categoryCode: string, pageIndex = 0, pageSize = 20): Promise<void> {\n loading.value = true\n error.value = null\n try {\n categoryResult.value = await client.catalog.getCategory(categoryCode, pageIndex, pageSize)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return {\n currentProduct, categoryResult, loading, error, isOffline,\n loadProduct, loadCategory\n }\n})\n","import { defineStore } from 'pinia'\nimport { ref } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { SearchResult, SearchRequest } from '@altazion/commerce-sdk-core'\n\nexport const useSearchStore = defineStore('altazion:search', () => {\n const client = useCommerceClient()\n\n const result = ref<SearchResult | null>(null)\n const suggestions = ref<string[]>([])\n const loading = ref(false)\n const error = ref<string | null>(null)\n const query = ref('')\n\n async function search(request: SearchRequest): Promise<void> {\n query.value = request.q ?? ''\n loading.value = true\n error.value = null\n try {\n result.value = await client.catalog.search(request)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function suggest(q: string): Promise<void> {\n if (!q.trim()) { suggestions.value = []; return }\n try {\n suggestions.value = await client.catalog.suggest(q)\n } catch {\n suggestions.value = []\n }\n }\n\n function clear(): void {\n result.value = null\n suggestions.value = []\n query.value = ''\n }\n\n return { result, suggestions, loading, error, query, search, suggest, clear }\n})\n","<script setup lang=\"ts\">\nimport type { WebProduct } from '@altazion/commerce-sdk-core'\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n product: WebProduct\n showAddToCart?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nasync function addToCart(): Promise<void> {\n await cartStore.addItem(props.product.sku ?? props.product.guid, 1)\n}\n</script>\n\n<template>\n <article class=\"altz-product-card\">\n <a :href=\"product.externalUrl ?? '#'\" class=\"altz-product-card__image-link\">\n <img\n v-if=\"product.mainImage\"\n :src=\"product.mainImage\"\n :alt=\"product.label ?? undefined\"\n class=\"altz-product-card__image\"\n loading=\"lazy\"\n />\n </a>\n\n <div class=\"altz-product-card__body\">\n <h3 class=\"altz-product-card__title\">\n <a :href=\"product.externalUrl ?? '#'\">{{ product.label }}</a>\n </h3>\n\n <div class=\"altz-product-card__price\">\n <span\n v-if=\"product.discountedPrice\"\n class=\"altz-product-card__price--original\"\n >\n {{ product.price.toFixed(2) }} &#8364;\n </span>\n <span class=\"altz-product-card__price--current\">\n {{ (product.discountedPrice ?? product.price).toFixed(2) }} &#8364;\n </span>\n </div>\n\n <p v-if=\"!product.availableForOrder\" class=\"altz-product-card__unavailable\">\n Indisponible\n </p>\n\n <button\n v-if=\"showAddToCart && product.availableForOrder\"\n class=\"altz-product-card__add-to-cart\"\n :disabled=\"cartStore.loading\"\n @click=\"addToCart\"\n >\n Ajouter au panier\n </button>\n </div>\n </article>\n</template>\n","<script setup lang=\"ts\">\nimport { onMounted } from 'vue'\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n showLines?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nonMounted(() => { cartStore.load() })\n</script>\n\n<template>\n <div class=\"altz-cart-summary\">\n <div v-if=\"cartStore.loading\" class=\"altz-cart-summary__loading\">\n Chargement du panier…\n </div>\n\n <div v-else-if=\"cartStore.isEmpty\" class=\"altz-cart-summary__empty\">\n Votre panier est vide.\n </div>\n\n <template v-else>\n <div v-if=\"showLines\" class=\"altz-cart-summary__lines\">\n <div\n v-for=\"line in cartStore.cart?.content?.flatMap(g => g.lines ?? [])\"\n :key=\"line.id\"\n class=\"altz-cart-summary__line\"\n >\n <span class=\"altz-cart-summary__line-label\">{{ line.label }}</span>\n <span class=\"altz-cart-summary__line-qty\">× {{ line.quantity }}</span>\n <span class=\"altz-cart-summary__line-price\">{{ (line.finalUnitPriceInclTax * line.quantity).toFixed(2) }} €</span>\n </div>\n </div>\n\n <div class=\"altz-cart-summary__total\">\n <span class=\"altz-cart-summary__total-label\">Total</span>\n <span class=\"altz-cart-summary__total-amount\">{{ cartStore.total.toFixed(2) }} €</span>\n </div>\n\n <div v-if=\"cartStore.hasPendingOperations\" class=\"altz-cart-summary__offline-notice\">\n Modifications en attente de synchronisation…\n </div>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n reference: string\n quantity?: number\n label?: string\n disabled?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nasync function handleClick(): Promise<void> {\n if (props.disabled) return\n await cartStore.addItem(props.reference, props.quantity ?? 1)\n}\n</script>\n\n<template>\n <button\n class=\"altz-add-to-cart\"\n :disabled=\"disabled || cartStore.loading\"\n :aria-busy=\"cartStore.loading\"\n @click=\"handleClick\"\n >\n <slot>{{ label ?? 'Ajouter au panier' }}</slot>\n </button>\n</template>\n"],"names":["pinia","createPinia","inject","defineStore","ref","computed","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_4","_hoisted_5","_toDisplayString","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_unref","onMounted","_Fragment","_renderList","_renderSlot"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/plugin.ts","../src/composables/useCommerceClient.ts","../src/stores/useConnectivityStore.ts","../src/stores/useSessionStore.ts","../src/stores/useCartStore.ts","../src/stores/useCatalogStore.ts","../src/stores/useSearchStore.ts","../src/components/ProductCard.vue","../src/components/CartSummary.vue","../src/components/AddToCartButton.vue"],"sourcesContent":["import type { App } from 'vue'\nimport { createPinia, type Pinia } from 'pinia'\nimport type { CommerceClient } from '@altazion/commerce-sdk-core'\n\nexport const COMMERCE_CLIENT_KEY = Symbol('altazion:commerce-client')\n\nexport interface AltazionCommercePluginOptions {\n client: CommerceClient\n /** Pinia instance existante (optionnel — le plugin en crée une si absent) */\n pinia?: Pinia\n}\n\n/**\n * Plugin Vue 3 pour le SDK Altazion Commerce.\n *\n * Usage :\n * ```ts\n * import { createApp } from 'vue'\n * import { CommerceClient } from '@altazion/commerce-sdk-core'\n * import { AltazionCommercePlugin } from '@altazion/commerce-sdk-vue'\n *\n * const client = new CommerceClient({ baseUrl: '...', siteUrl: window.location.href })\n * await client.initialize()\n *\n * createApp(App)\n * .use(AltazionCommercePlugin, { client })\n * .mount('#app')\n * ```\n */\nexport const AltazionCommercePlugin = {\n install(app: App, options: AltazionCommercePluginOptions): void {\n const { client, pinia } = options\n\n // Installer Pinia si pas déjà présente\n const piniaInstance = pinia ?? createPinia()\n app.use(piniaInstance)\n\n // Rendre le client accessible via inject()\n app.provide(COMMERCE_CLIENT_KEY, client)\n }\n}\n","import { inject } from 'vue'\nimport { COMMERCE_CLIENT_KEY } from '../plugin.js'\nimport type { CommerceClient } from '@altazion/commerce-sdk-core'\n\n/**\n * Composable pour accéder au CommerceClient injecté par AltazionCommercePlugin.\n * Doit être utilisé dans un composant Vue (setup()) ou un store Pinia.\n */\nexport function useCommerceClient(): CommerceClient {\n const client = inject<CommerceClient>(COMMERCE_CLIENT_KEY)\n if (!client) {\n throw new Error(\n '[AltazionCommerce] useCommerceClient() : aucun client trouvé. ' +\n 'Assurez-vous d\\'avoir installé AltazionCommercePlugin via app.use().'\n )\n }\n return client\n}\n","import { defineStore } from 'pinia'\nimport { computed, ref } from 'vue'\nimport type { ConnectivityStatus } from '@altazion/commerce-sdk-core'\n\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\n\nexport type TerminalScreenMode = 'interactive' | 'offline'\n\nexport const useConnectivityStore = defineStore('altazion:connectivity', () => {\n const client = useCommerceClient()\n\n const status = ref<ConnectivityStatus>(client.connectivity.isOnline ? 'online' : 'offline')\n\n client.connectivity.subscribe((nextStatus: ConnectivityStatus) => {\n status.value = nextStatus\n })\n\n const isOnline = computed(() => status.value === 'online')\n const isOffline = computed(() => status.value === 'offline')\n const screenMode = computed<TerminalScreenMode>(() => isOffline.value ? 'offline' : 'interactive')\n const isInteractiveAvailable = computed(() => !isOffline.value)\n\n return {\n status,\n isOnline,\n isOffline,\n screenMode,\n isInteractiveAvailable,\n }\n})","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { SessionInfo, ConnectivityStatus } from '@altazion/commerce-sdk-core'\n\nexport const useSessionStore = defineStore('altazion:session', () => {\n const client = useCommerceClient()\n\n const session = ref<SessionInfo | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const isOnline = ref(client.connectivity.isOnline)\n client.connectivity.subscribe((status: ConnectivityStatus) => {\n isOnline.value = status === 'online'\n })\n\n const mode = computed(() => client.context.mode)\n const isKiosk = computed(() => mode.value === 'kiosk')\n const isReady = computed(() => session.value !== null || mode.value === 'kiosk')\n\n async function load(): Promise<void> {\n loading.value = true\n error.value = null\n try {\n session.value = await client.session.getSession()\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function associateStore(storeGuid: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n session.value = await client.session.associateStore(storeGuid)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return { session, loading, error, isOnline, mode, isKiosk, isReady, load, associateStore }\n})\n","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { Cart } from '@altazion/commerce-sdk-core'\n\nexport const useCartStore = defineStore('altazion:cart', () => {\n const client = useCommerceClient()\n\n const cart = ref<Cart | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const isOffline = computed(() => client.isOffline)\n const itemCount = computed(() => cart.value?.totalQuantity ?? 0)\n const total = computed(() => cart.value?.totalAmountWithTax ?? 0)\n const isEmpty = computed(() => itemCount.value === 0)\n\n async function load(): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.getCart()\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function addItem(reference: string, quantity: number, options?: Record<string, unknown>): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.addItem(reference, quantity, options)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function updateItem(lineId: string, quantity: number): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.updateItem(lineId, quantity)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function removeItem(lineId: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.removeItem(lineId)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function applyCoupon(code: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.applyCoupon(code)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return {\n cart, loading, error, isOffline,\n itemCount, total, isEmpty,\n load, addItem, updateItem, removeItem, applyCoupon\n }\n})\n","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { ProductDetails, SearchResult, SearchRequest } from '@altazion/commerce-sdk-core'\n\nexport const useCatalogStore = defineStore('altazion:catalog', () => {\n const client = useCommerceClient()\n\n const currentProduct = ref<ProductDetails | null>(null)\n const categoryResult = ref<SearchResult | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const isOffline = computed(() => client.isOffline)\n\n async function loadProduct(reference: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n currentProduct.value = await client.catalog.getProduct(reference)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function loadCategory(categoryCode: string, pageIndex = 0, pageSize = 20): Promise<void> {\n loading.value = true\n error.value = null\n try {\n categoryResult.value = await client.catalog.getCategory(categoryCode, pageIndex, pageSize)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return {\n currentProduct, categoryResult, loading, error, isOffline,\n loadProduct, loadCategory\n }\n})\n","import { defineStore } from 'pinia'\nimport { ref } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { SearchResult, SearchRequest } from '@altazion/commerce-sdk-core'\n\nexport const useSearchStore = defineStore('altazion:search', () => {\n const client = useCommerceClient()\n\n const result = ref<SearchResult | null>(null)\n const suggestions = ref<string[]>([])\n const loading = ref(false)\n const error = ref<string | null>(null)\n const query = ref('')\n\n async function search(request: SearchRequest): Promise<void> {\n query.value = request.q ?? ''\n loading.value = true\n error.value = null\n try {\n result.value = await client.catalog.search(request)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function suggest(q: string): Promise<void> {\n if (!q.trim()) { suggestions.value = []; return }\n try {\n suggestions.value = await client.catalog.suggest(q)\n } catch {\n suggestions.value = []\n }\n }\n\n function clear(): void {\n result.value = null\n suggestions.value = []\n query.value = ''\n }\n\n return { result, suggestions, loading, error, query, search, suggest, clear }\n})\n","<script setup lang=\"ts\">\nimport type { WebProduct } from '@altazion/commerce-sdk-core'\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n product: WebProduct\n showAddToCart?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nasync function addToCart(): Promise<void> {\n await cartStore.addItem(props.product.sku ?? props.product.guid, 1)\n}\n</script>\n\n<template>\n <article class=\"altz-product-card\">\n <a :href=\"product.externalUrl ?? '#'\" class=\"altz-product-card__image-link\">\n <img\n v-if=\"product.mainImage\"\n :src=\"product.mainImage\"\n :alt=\"product.label ?? undefined\"\n class=\"altz-product-card__image\"\n loading=\"lazy\"\n />\n </a>\n\n <div class=\"altz-product-card__body\">\n <h3 class=\"altz-product-card__title\">\n <a :href=\"product.externalUrl ?? '#'\">{{ product.label }}</a>\n </h3>\n\n <div class=\"altz-product-card__price\">\n <span\n v-if=\"product.discountedPrice\"\n class=\"altz-product-card__price--original\"\n >\n {{ product.price.toFixed(2) }} &#8364;\n </span>\n <span class=\"altz-product-card__price--current\">\n {{ (product.discountedPrice ?? product.price).toFixed(2) }} &#8364;\n </span>\n </div>\n\n <p v-if=\"!product.availableForOrder\" class=\"altz-product-card__unavailable\">\n Indisponible\n </p>\n\n <button\n v-if=\"showAddToCart && product.availableForOrder\"\n class=\"altz-product-card__add-to-cart\"\n :disabled=\"cartStore.loading\"\n @click=\"addToCart\"\n >\n Ajouter au panier\n </button>\n </div>\n </article>\n</template>\n","<script setup lang=\"ts\">\nimport { onMounted } from 'vue'\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n showLines?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nonMounted(() => { cartStore.load() })\n</script>\n\n<template>\n <div class=\"altz-cart-summary\">\n <div v-if=\"cartStore.loading\" class=\"altz-cart-summary__loading\">\n Chargement du panier…\n </div>\n\n <div v-else-if=\"cartStore.isEmpty\" class=\"altz-cart-summary__empty\">\n Votre panier est vide.\n </div>\n\n <template v-else>\n <div v-if=\"showLines\" class=\"altz-cart-summary__lines\">\n <div\n v-for=\"line in cartStore.cart?.content?.flatMap(g => g.lines ?? [])\"\n :key=\"line.id\"\n class=\"altz-cart-summary__line\"\n >\n <span class=\"altz-cart-summary__line-label\">{{ line.label }}</span>\n <span class=\"altz-cart-summary__line-qty\">× {{ line.quantity }}</span>\n <span class=\"altz-cart-summary__line-price\">{{ (line.finalUnitPriceInclTax * line.quantity).toFixed(2) }} €</span>\n </div>\n </div>\n\n <div class=\"altz-cart-summary__total\">\n <span class=\"altz-cart-summary__total-label\">Total</span>\n <span class=\"altz-cart-summary__total-amount\">{{ cartStore.total.toFixed(2) }} €</span>\n </div>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n reference: string\n quantity?: number\n label?: string\n disabled?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nasync function handleClick(): Promise<void> {\n if (props.disabled) return\n await cartStore.addItem(props.reference, props.quantity ?? 1)\n}\n</script>\n\n<template>\n <button\n class=\"altz-add-to-cart\"\n :disabled=\"disabled || cartStore.loading\"\n :aria-busy=\"cartStore.loading\"\n @click=\"handleClick\"\n >\n <slot>{{ label ?? 'Ajouter au panier' }}</slot>\n </button>\n</template>\n"],"names":["pinia","createPinia","inject","defineStore","ref","computed","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_4","_hoisted_5","_toDisplayString","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_unref","onMounted","_Fragment","_renderList","_renderSlot"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -11,6 +11,7 @@ import { CommerceMode } from '@altazion/commerce-sdk-core';
11
11
  import { ComponentOptionsMixin } from 'vue';
12
12
  import { ComponentProvideOptions } from 'vue';
13
13
  import { ComputedRef } from 'vue';
14
+ import { ConnectivityStatus } from '@altazion/commerce-sdk-core';
14
15
  import { DefineComponent } from 'vue';
15
16
  import { ExtractPropTypes } from 'vue';
16
17
  import { Pinia } from 'pinia';
@@ -127,6 +128,8 @@ product: WebProduct;
127
128
  showAddToCart?: boolean;
128
129
  }>>> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
129
130
 
131
+ export declare type TerminalScreenMode = 'interactive' | 'offline';
132
+
130
133
  export declare const useCartStore: StoreDefinition<"altazion:cart", Pick<{
131
134
  cart: Ref< {
132
135
  guid: string;
@@ -754,7 +757,6 @@ pickupPersonName?: string | null | undefined;
754
757
  loading: Ref<boolean, boolean>;
755
758
  error: Ref<string | null, string | null>;
756
759
  isOffline: ComputedRef<boolean>;
757
- hasPendingOperations: Ref<boolean, boolean>;
758
760
  itemCount: ComputedRef<number>;
759
761
  total: ComputedRef<number>;
760
762
  isEmpty: ComputedRef<boolean>;
@@ -763,7 +765,7 @@ addItem: (reference: string, quantity: number, options?: Record<string, unknown>
763
765
  updateItem: (lineId: string, quantity: number) => Promise<void>;
764
766
  removeItem: (lineId: string) => Promise<void>;
765
767
  applyCoupon: (code: string) => Promise<void>;
766
- }, "cart" | "loading" | "error" | "hasPendingOperations">, Pick<{
768
+ }, "cart" | "loading" | "error">, Pick<{
767
769
  cart: Ref< {
768
770
  guid: string;
769
771
  orderNumber?: string | null | undefined;
@@ -1390,7 +1392,6 @@ pickupPersonName?: string | null | undefined;
1390
1392
  loading: Ref<boolean, boolean>;
1391
1393
  error: Ref<string | null, string | null>;
1392
1394
  isOffline: ComputedRef<boolean>;
1393
- hasPendingOperations: Ref<boolean, boolean>;
1394
1395
  itemCount: ComputedRef<number>;
1395
1396
  total: ComputedRef<number>;
1396
1397
  isEmpty: ComputedRef<boolean>;
@@ -2026,7 +2027,6 @@ pickupPersonName?: string | null | undefined;
2026
2027
  loading: Ref<boolean, boolean>;
2027
2028
  error: Ref<string | null, string | null>;
2028
2029
  isOffline: ComputedRef<boolean>;
2029
- hasPendingOperations: Ref<boolean, boolean>;
2030
2030
  itemCount: ComputedRef<number>;
2031
2031
  total: ComputedRef<number>;
2032
2032
  isEmpty: ComputedRef<boolean>;
@@ -4643,6 +4643,26 @@ loadCategory: (categoryCode: string, pageIndex?: number, pageSize?: number) => P
4643
4643
  */
4644
4644
  export declare function useCommerceClient(): CommerceClient;
4645
4645
 
4646
+ export declare const useConnectivityStore: StoreDefinition<"altazion:connectivity", Pick<{
4647
+ status: Ref<ConnectivityStatus, ConnectivityStatus>;
4648
+ isOnline: ComputedRef<boolean>;
4649
+ isOffline: ComputedRef<boolean>;
4650
+ screenMode: ComputedRef<TerminalScreenMode>;
4651
+ isInteractiveAvailable: ComputedRef<boolean>;
4652
+ }, "status">, Pick<{
4653
+ status: Ref<ConnectivityStatus, ConnectivityStatus>;
4654
+ isOnline: ComputedRef<boolean>;
4655
+ isOffline: ComputedRef<boolean>;
4656
+ screenMode: ComputedRef<TerminalScreenMode>;
4657
+ isInteractiveAvailable: ComputedRef<boolean>;
4658
+ }, "isOffline" | "isOnline" | "screenMode" | "isInteractiveAvailable">, Pick<{
4659
+ status: Ref<ConnectivityStatus, ConnectivityStatus>;
4660
+ isOnline: ComputedRef<boolean>;
4661
+ isOffline: ComputedRef<boolean>;
4662
+ screenMode: ComputedRef<TerminalScreenMode>;
4663
+ isInteractiveAvailable: ComputedRef<boolean>;
4664
+ }, never>>;
4665
+
4646
4666
  export declare const useSearchStore: StoreDefinition<"altazion:search", Pick<{
4647
4667
  result: Ref< {
4648
4668
  totalCount: number;
@@ -5204,7 +5224,7 @@ isKiosk: ComputedRef<boolean>;
5204
5224
  isReady: ComputedRef<boolean>;
5205
5225
  load: () => Promise<void>;
5206
5226
  associateStore: (storeGuid: string) => Promise<void>;
5207
- }, "loading" | "error" | "session" | "isOnline">, Pick<{
5227
+ }, "loading" | "error" | "isOnline" | "session">, Pick<{
5208
5228
  session: Ref< {
5209
5229
  id: string;
5210
5230
  expiresOn?: string | null | undefined;
package/dist/index.js CHANGED
@@ -18,6 +18,24 @@ function useCommerceClient() {
18
18
  }
19
19
  return client;
20
20
  }
21
+ const useConnectivityStore = defineStore("altazion:connectivity", () => {
22
+ const client = useCommerceClient();
23
+ const status = ref(client.connectivity.isOnline ? "online" : "offline");
24
+ client.connectivity.subscribe((nextStatus) => {
25
+ status.value = nextStatus;
26
+ });
27
+ const isOnline = computed(() => status.value === "online");
28
+ const isOffline = computed(() => status.value === "offline");
29
+ const screenMode = computed(() => isOffline.value ? "offline" : "interactive");
30
+ const isInteractiveAvailable = computed(() => !isOffline.value);
31
+ return {
32
+ status,
33
+ isOnline,
34
+ isOffline,
35
+ screenMode,
36
+ isInteractiveAvailable
37
+ };
38
+ });
21
39
  const useSessionStore = defineStore("altazion:session", () => {
22
40
  const client = useCommerceClient();
23
41
  const session = ref(null);
@@ -59,10 +77,6 @@ const useCartStore = defineStore("altazion:cart", () => {
59
77
  const cart = ref(null);
60
78
  const loading = ref(false);
61
79
  const error = ref(null);
62
- const hasPendingOperations = ref(false);
63
- client.onQueueEvent(async () => {
64
- hasPendingOperations.value = await client.pendingOperationsCount > 0;
65
- });
66
80
  const isOffline = computed(() => client.isOffline);
67
81
  const itemCount = computed(() => {
68
82
  var _a;
@@ -133,7 +147,6 @@ const useCartStore = defineStore("altazion:cart", () => {
133
147
  loading,
134
148
  error,
135
149
  isOffline,
136
- hasPendingOperations,
137
150
  itemCount,
138
151
  total,
139
152
  isEmpty,
@@ -232,7 +245,7 @@ const _hoisted_8$1 = {
232
245
  class: "altz-product-card__price--original"
233
246
  };
234
247
  const _hoisted_9$1 = { class: "altz-product-card__price--current" };
235
- const _hoisted_10$1 = {
248
+ const _hoisted_10 = {
236
249
  key: 0,
237
250
  class: "altz-product-card__unavailable"
238
251
  };
@@ -273,7 +286,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
273
286
  __props.product.discountedPrice ? (openBlock(), createElementBlock("span", _hoisted_8$1, toDisplayString(__props.product.price.toFixed(2)) + " € ", 1)) : createCommentVNode("", true),
274
287
  createElementVNode("span", _hoisted_9$1, toDisplayString((__props.product.discountedPrice ?? __props.product.price).toFixed(2)) + " € ", 1)
275
288
  ]),
276
- !__props.product.availableForOrder ? (openBlock(), createElementBlock("p", _hoisted_10$1, " Indisponible ")) : createCommentVNode("", true),
289
+ !__props.product.availableForOrder ? (openBlock(), createElementBlock("p", _hoisted_10, " Indisponible ")) : createCommentVNode("", true),
277
290
  __props.showAddToCart && __props.product.availableForOrder ? (openBlock(), createElementBlock("button", {
278
291
  key: 1,
279
292
  class: "altz-product-card__add-to-cart",
@@ -303,10 +316,6 @@ const _hoisted_6 = { class: "altz-cart-summary__line-qty" };
303
316
  const _hoisted_7 = { class: "altz-cart-summary__line-price" };
304
317
  const _hoisted_8 = { class: "altz-cart-summary__total" };
305
318
  const _hoisted_9 = { class: "altz-cart-summary__total-amount" };
306
- const _hoisted_10 = {
307
- key: 1,
308
- class: "altz-cart-summary__offline-notice"
309
- };
310
319
  const _sfc_main$1 = /* @__PURE__ */ defineComponent({
311
320
  __name: "CartSummary",
312
321
  props: {
@@ -336,8 +345,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
336
345
  createElementVNode("div", _hoisted_8, [
337
346
  _cache[0] || (_cache[0] = createElementVNode("span", { class: "altz-cart-summary__total-label" }, "Total", -1)),
338
347
  createElementVNode("span", _hoisted_9, toDisplayString(unref(cartStore).total.toFixed(2)) + " €", 1)
339
- ]),
340
- unref(cartStore).hasPendingOperations ? (openBlock(), createElementBlock("div", _hoisted_10, " Modifications en attente de synchronisation… ")) : createCommentVNode("", true)
348
+ ])
341
349
  ], 64))
342
350
  ]);
343
351
  };
@@ -382,6 +390,7 @@ export {
382
390
  useCartStore,
383
391
  useCatalogStore,
384
392
  useCommerceClient,
393
+ useConnectivityStore,
385
394
  useSearchStore,
386
395
  useSessionStore
387
396
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/plugin.ts","../src/composables/useCommerceClient.ts","../src/stores/useSessionStore.ts","../src/stores/useCartStore.ts","../src/stores/useCatalogStore.ts","../src/stores/useSearchStore.ts","../src/components/ProductCard.vue","../src/components/CartSummary.vue","../src/components/AddToCartButton.vue"],"sourcesContent":["import type { App } from 'vue'\nimport { createPinia, type Pinia } from 'pinia'\nimport type { CommerceClient } from '@altazion/commerce-sdk-core'\n\nexport const COMMERCE_CLIENT_KEY = Symbol('altazion:commerce-client')\n\nexport interface AltazionCommercePluginOptions {\n client: CommerceClient\n /** Pinia instance existante (optionnel — le plugin en crée une si absent) */\n pinia?: Pinia\n}\n\n/**\n * Plugin Vue 3 pour le SDK Altazion Commerce.\n *\n * Usage :\n * ```ts\n * import { createApp } from 'vue'\n * import { CommerceClient } from '@altazion/commerce-sdk-core'\n * import { AltazionCommercePlugin } from '@altazion/commerce-sdk-vue'\n *\n * const client = new CommerceClient({ baseUrl: '...', siteUrl: window.location.href })\n * await client.initialize()\n *\n * createApp(App)\n * .use(AltazionCommercePlugin, { client })\n * .mount('#app')\n * ```\n */\nexport const AltazionCommercePlugin = {\n install(app: App, options: AltazionCommercePluginOptions): void {\n const { client, pinia } = options\n\n // Installer Pinia si pas déjà présente\n const piniaInstance = pinia ?? createPinia()\n app.use(piniaInstance)\n\n // Rendre le client accessible via inject()\n app.provide(COMMERCE_CLIENT_KEY, client)\n }\n}\n","import { inject } from 'vue'\nimport { COMMERCE_CLIENT_KEY } from '../plugin.js'\nimport type { CommerceClient } from '@altazion/commerce-sdk-core'\n\n/**\n * Composable pour accéder au CommerceClient injecté par AltazionCommercePlugin.\n * Doit être utilisé dans un composant Vue (setup()) ou un store Pinia.\n */\nexport function useCommerceClient(): CommerceClient {\n const client = inject<CommerceClient>(COMMERCE_CLIENT_KEY)\n if (!client) {\n throw new Error(\n '[AltazionCommerce] useCommerceClient() : aucun client trouvé. ' +\n 'Assurez-vous d\\'avoir installé AltazionCommercePlugin via app.use().'\n )\n }\n return client\n}\n","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { SessionInfo, ConnectivityStatus } from '@altazion/commerce-sdk-core'\n\nexport const useSessionStore = defineStore('altazion:session', () => {\n const client = useCommerceClient()\n\n const session = ref<SessionInfo | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const isOnline = ref(client.connectivity.isOnline)\n client.connectivity.subscribe((status: ConnectivityStatus) => {\n isOnline.value = status === 'online'\n })\n\n const mode = computed(() => client.context.mode)\n const isKiosk = computed(() => mode.value === 'kiosk')\n const isReady = computed(() => session.value !== null || mode.value === 'kiosk')\n\n async function load(): Promise<void> {\n loading.value = true\n error.value = null\n try {\n session.value = await client.session.getSession()\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function associateStore(storeGuid: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n session.value = await client.session.associateStore(storeGuid)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return { session, loading, error, isOnline, mode, isKiosk, isReady, load, associateStore }\n})\n","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { Cart } from '@altazion/commerce-sdk-core'\n\nexport const useCartStore = defineStore('altazion:cart', () => {\n const client = useCommerceClient()\n\n const cart = ref<Cart | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n const hasPendingOperations = ref(false)\n\n // Mise à jour de hasPendingOperations via la file offline\n client.onQueueEvent(async () => {\n hasPendingOperations.value = (await client.pendingOperationsCount) > 0\n })\n\n const isOffline = computed(() => client.isOffline)\n const itemCount = computed(() => cart.value?.totalQuantity ?? 0)\n const total = computed(() => cart.value?.totalAmountWithTax ?? 0)\n const isEmpty = computed(() => itemCount.value === 0)\n\n async function load(): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.getCart()\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function addItem(reference: string, quantity: number, options?: Record<string, unknown>): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.addItem(reference, quantity, options)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function updateItem(lineId: string, quantity: number): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.updateItem(lineId, quantity)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function removeItem(lineId: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.removeItem(lineId)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function applyCoupon(code: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.applyCoupon(code)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return {\n cart, loading, error, isOffline, hasPendingOperations,\n itemCount, total, isEmpty,\n load, addItem, updateItem, removeItem, applyCoupon\n }\n})\n","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { ProductDetails, SearchResult, SearchRequest } from '@altazion/commerce-sdk-core'\n\nexport const useCatalogStore = defineStore('altazion:catalog', () => {\n const client = useCommerceClient()\n\n const currentProduct = ref<ProductDetails | null>(null)\n const categoryResult = ref<SearchResult | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const isOffline = computed(() => client.isOffline)\n\n async function loadProduct(reference: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n currentProduct.value = await client.catalog.getProduct(reference)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function loadCategory(categoryCode: string, pageIndex = 0, pageSize = 20): Promise<void> {\n loading.value = true\n error.value = null\n try {\n categoryResult.value = await client.catalog.getCategory(categoryCode, pageIndex, pageSize)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return {\n currentProduct, categoryResult, loading, error, isOffline,\n loadProduct, loadCategory\n }\n})\n","import { defineStore } from 'pinia'\nimport { ref } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { SearchResult, SearchRequest } from '@altazion/commerce-sdk-core'\n\nexport const useSearchStore = defineStore('altazion:search', () => {\n const client = useCommerceClient()\n\n const result = ref<SearchResult | null>(null)\n const suggestions = ref<string[]>([])\n const loading = ref(false)\n const error = ref<string | null>(null)\n const query = ref('')\n\n async function search(request: SearchRequest): Promise<void> {\n query.value = request.q ?? ''\n loading.value = true\n error.value = null\n try {\n result.value = await client.catalog.search(request)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function suggest(q: string): Promise<void> {\n if (!q.trim()) { suggestions.value = []; return }\n try {\n suggestions.value = await client.catalog.suggest(q)\n } catch {\n suggestions.value = []\n }\n }\n\n function clear(): void {\n result.value = null\n suggestions.value = []\n query.value = ''\n }\n\n return { result, suggestions, loading, error, query, search, suggest, clear }\n})\n","<script setup lang=\"ts\">\nimport type { WebProduct } from '@altazion/commerce-sdk-core'\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n product: WebProduct\n showAddToCart?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nasync function addToCart(): Promise<void> {\n await cartStore.addItem(props.product.sku ?? props.product.guid, 1)\n}\n</script>\n\n<template>\n <article class=\"altz-product-card\">\n <a :href=\"product.externalUrl ?? '#'\" class=\"altz-product-card__image-link\">\n <img\n v-if=\"product.mainImage\"\n :src=\"product.mainImage\"\n :alt=\"product.label ?? undefined\"\n class=\"altz-product-card__image\"\n loading=\"lazy\"\n />\n </a>\n\n <div class=\"altz-product-card__body\">\n <h3 class=\"altz-product-card__title\">\n <a :href=\"product.externalUrl ?? '#'\">{{ product.label }}</a>\n </h3>\n\n <div class=\"altz-product-card__price\">\n <span\n v-if=\"product.discountedPrice\"\n class=\"altz-product-card__price--original\"\n >\n {{ product.price.toFixed(2) }} &#8364;\n </span>\n <span class=\"altz-product-card__price--current\">\n {{ (product.discountedPrice ?? product.price).toFixed(2) }} &#8364;\n </span>\n </div>\n\n <p v-if=\"!product.availableForOrder\" class=\"altz-product-card__unavailable\">\n Indisponible\n </p>\n\n <button\n v-if=\"showAddToCart && product.availableForOrder\"\n class=\"altz-product-card__add-to-cart\"\n :disabled=\"cartStore.loading\"\n @click=\"addToCart\"\n >\n Ajouter au panier\n </button>\n </div>\n </article>\n</template>\n","<script setup lang=\"ts\">\nimport { onMounted } from 'vue'\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n showLines?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nonMounted(() => { cartStore.load() })\n</script>\n\n<template>\n <div class=\"altz-cart-summary\">\n <div v-if=\"cartStore.loading\" class=\"altz-cart-summary__loading\">\n Chargement du panier…\n </div>\n\n <div v-else-if=\"cartStore.isEmpty\" class=\"altz-cart-summary__empty\">\n Votre panier est vide.\n </div>\n\n <template v-else>\n <div v-if=\"showLines\" class=\"altz-cart-summary__lines\">\n <div\n v-for=\"line in cartStore.cart?.content?.flatMap(g => g.lines ?? [])\"\n :key=\"line.id\"\n class=\"altz-cart-summary__line\"\n >\n <span class=\"altz-cart-summary__line-label\">{{ line.label }}</span>\n <span class=\"altz-cart-summary__line-qty\">× {{ line.quantity }}</span>\n <span class=\"altz-cart-summary__line-price\">{{ (line.finalUnitPriceInclTax * line.quantity).toFixed(2) }} €</span>\n </div>\n </div>\n\n <div class=\"altz-cart-summary__total\">\n <span class=\"altz-cart-summary__total-label\">Total</span>\n <span class=\"altz-cart-summary__total-amount\">{{ cartStore.total.toFixed(2) }} €</span>\n </div>\n\n <div v-if=\"cartStore.hasPendingOperations\" class=\"altz-cart-summary__offline-notice\">\n Modifications en attente de synchronisation…\n </div>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n reference: string\n quantity?: number\n label?: string\n disabled?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nasync function handleClick(): Promise<void> {\n if (props.disabled) return\n await cartStore.addItem(props.reference, props.quantity ?? 1)\n}\n</script>\n\n<template>\n <button\n class=\"altz-add-to-cart\"\n :disabled=\"disabled || cartStore.loading\"\n :aria-busy=\"cartStore.loading\"\n @click=\"handleClick\"\n >\n <slot>{{ label ?? 'Ajouter au panier' }}</slot>\n </button>\n</template>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_4","_hoisted_5","_toDisplayString","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_unref","_Fragment","_renderList","_renderSlot"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/plugin.ts","../src/composables/useCommerceClient.ts","../src/stores/useConnectivityStore.ts","../src/stores/useSessionStore.ts","../src/stores/useCartStore.ts","../src/stores/useCatalogStore.ts","../src/stores/useSearchStore.ts","../src/components/ProductCard.vue","../src/components/CartSummary.vue","../src/components/AddToCartButton.vue"],"sourcesContent":["import type { App } from 'vue'\nimport { createPinia, type Pinia } from 'pinia'\nimport type { CommerceClient } from '@altazion/commerce-sdk-core'\n\nexport const COMMERCE_CLIENT_KEY = Symbol('altazion:commerce-client')\n\nexport interface AltazionCommercePluginOptions {\n client: CommerceClient\n /** Pinia instance existante (optionnel — le plugin en crée une si absent) */\n pinia?: Pinia\n}\n\n/**\n * Plugin Vue 3 pour le SDK Altazion Commerce.\n *\n * Usage :\n * ```ts\n * import { createApp } from 'vue'\n * import { CommerceClient } from '@altazion/commerce-sdk-core'\n * import { AltazionCommercePlugin } from '@altazion/commerce-sdk-vue'\n *\n * const client = new CommerceClient({ baseUrl: '...', siteUrl: window.location.href })\n * await client.initialize()\n *\n * createApp(App)\n * .use(AltazionCommercePlugin, { client })\n * .mount('#app')\n * ```\n */\nexport const AltazionCommercePlugin = {\n install(app: App, options: AltazionCommercePluginOptions): void {\n const { client, pinia } = options\n\n // Installer Pinia si pas déjà présente\n const piniaInstance = pinia ?? createPinia()\n app.use(piniaInstance)\n\n // Rendre le client accessible via inject()\n app.provide(COMMERCE_CLIENT_KEY, client)\n }\n}\n","import { inject } from 'vue'\nimport { COMMERCE_CLIENT_KEY } from '../plugin.js'\nimport type { CommerceClient } from '@altazion/commerce-sdk-core'\n\n/**\n * Composable pour accéder au CommerceClient injecté par AltazionCommercePlugin.\n * Doit être utilisé dans un composant Vue (setup()) ou un store Pinia.\n */\nexport function useCommerceClient(): CommerceClient {\n const client = inject<CommerceClient>(COMMERCE_CLIENT_KEY)\n if (!client) {\n throw new Error(\n '[AltazionCommerce] useCommerceClient() : aucun client trouvé. ' +\n 'Assurez-vous d\\'avoir installé AltazionCommercePlugin via app.use().'\n )\n }\n return client\n}\n","import { defineStore } from 'pinia'\nimport { computed, ref } from 'vue'\nimport type { ConnectivityStatus } from '@altazion/commerce-sdk-core'\n\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\n\nexport type TerminalScreenMode = 'interactive' | 'offline'\n\nexport const useConnectivityStore = defineStore('altazion:connectivity', () => {\n const client = useCommerceClient()\n\n const status = ref<ConnectivityStatus>(client.connectivity.isOnline ? 'online' : 'offline')\n\n client.connectivity.subscribe((nextStatus: ConnectivityStatus) => {\n status.value = nextStatus\n })\n\n const isOnline = computed(() => status.value === 'online')\n const isOffline = computed(() => status.value === 'offline')\n const screenMode = computed<TerminalScreenMode>(() => isOffline.value ? 'offline' : 'interactive')\n const isInteractiveAvailable = computed(() => !isOffline.value)\n\n return {\n status,\n isOnline,\n isOffline,\n screenMode,\n isInteractiveAvailable,\n }\n})","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { SessionInfo, ConnectivityStatus } from '@altazion/commerce-sdk-core'\n\nexport const useSessionStore = defineStore('altazion:session', () => {\n const client = useCommerceClient()\n\n const session = ref<SessionInfo | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const isOnline = ref(client.connectivity.isOnline)\n client.connectivity.subscribe((status: ConnectivityStatus) => {\n isOnline.value = status === 'online'\n })\n\n const mode = computed(() => client.context.mode)\n const isKiosk = computed(() => mode.value === 'kiosk')\n const isReady = computed(() => session.value !== null || mode.value === 'kiosk')\n\n async function load(): Promise<void> {\n loading.value = true\n error.value = null\n try {\n session.value = await client.session.getSession()\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function associateStore(storeGuid: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n session.value = await client.session.associateStore(storeGuid)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return { session, loading, error, isOnline, mode, isKiosk, isReady, load, associateStore }\n})\n","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { Cart } from '@altazion/commerce-sdk-core'\n\nexport const useCartStore = defineStore('altazion:cart', () => {\n const client = useCommerceClient()\n\n const cart = ref<Cart | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const isOffline = computed(() => client.isOffline)\n const itemCount = computed(() => cart.value?.totalQuantity ?? 0)\n const total = computed(() => cart.value?.totalAmountWithTax ?? 0)\n const isEmpty = computed(() => itemCount.value === 0)\n\n async function load(): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.getCart()\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function addItem(reference: string, quantity: number, options?: Record<string, unknown>): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.addItem(reference, quantity, options)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function updateItem(lineId: string, quantity: number): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.updateItem(lineId, quantity)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function removeItem(lineId: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.removeItem(lineId)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function applyCoupon(code: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n cart.value = await client.cart.applyCoupon(code)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return {\n cart, loading, error, isOffline,\n itemCount, total, isEmpty,\n load, addItem, updateItem, removeItem, applyCoupon\n }\n})\n","import { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { ProductDetails, SearchResult, SearchRequest } from '@altazion/commerce-sdk-core'\n\nexport const useCatalogStore = defineStore('altazion:catalog', () => {\n const client = useCommerceClient()\n\n const currentProduct = ref<ProductDetails | null>(null)\n const categoryResult = ref<SearchResult | null>(null)\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const isOffline = computed(() => client.isOffline)\n\n async function loadProduct(reference: string): Promise<void> {\n loading.value = true\n error.value = null\n try {\n currentProduct.value = await client.catalog.getProduct(reference)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function loadCategory(categoryCode: string, pageIndex = 0, pageSize = 20): Promise<void> {\n loading.value = true\n error.value = null\n try {\n categoryResult.value = await client.catalog.getCategory(categoryCode, pageIndex, pageSize)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n return {\n currentProduct, categoryResult, loading, error, isOffline,\n loadProduct, loadCategory\n }\n})\n","import { defineStore } from 'pinia'\nimport { ref } from 'vue'\nimport { useCommerceClient } from '../composables/useCommerceClient.js'\nimport type { SearchResult, SearchRequest } from '@altazion/commerce-sdk-core'\n\nexport const useSearchStore = defineStore('altazion:search', () => {\n const client = useCommerceClient()\n\n const result = ref<SearchResult | null>(null)\n const suggestions = ref<string[]>([])\n const loading = ref(false)\n const error = ref<string | null>(null)\n const query = ref('')\n\n async function search(request: SearchRequest): Promise<void> {\n query.value = request.q ?? ''\n loading.value = true\n error.value = null\n try {\n result.value = await client.catalog.search(request)\n } catch (err) {\n error.value = err instanceof Error ? err.message : String(err)\n } finally {\n loading.value = false\n }\n }\n\n async function suggest(q: string): Promise<void> {\n if (!q.trim()) { suggestions.value = []; return }\n try {\n suggestions.value = await client.catalog.suggest(q)\n } catch {\n suggestions.value = []\n }\n }\n\n function clear(): void {\n result.value = null\n suggestions.value = []\n query.value = ''\n }\n\n return { result, suggestions, loading, error, query, search, suggest, clear }\n})\n","<script setup lang=\"ts\">\nimport type { WebProduct } from '@altazion/commerce-sdk-core'\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n product: WebProduct\n showAddToCart?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nasync function addToCart(): Promise<void> {\n await cartStore.addItem(props.product.sku ?? props.product.guid, 1)\n}\n</script>\n\n<template>\n <article class=\"altz-product-card\">\n <a :href=\"product.externalUrl ?? '#'\" class=\"altz-product-card__image-link\">\n <img\n v-if=\"product.mainImage\"\n :src=\"product.mainImage\"\n :alt=\"product.label ?? undefined\"\n class=\"altz-product-card__image\"\n loading=\"lazy\"\n />\n </a>\n\n <div class=\"altz-product-card__body\">\n <h3 class=\"altz-product-card__title\">\n <a :href=\"product.externalUrl ?? '#'\">{{ product.label }}</a>\n </h3>\n\n <div class=\"altz-product-card__price\">\n <span\n v-if=\"product.discountedPrice\"\n class=\"altz-product-card__price--original\"\n >\n {{ product.price.toFixed(2) }} &#8364;\n </span>\n <span class=\"altz-product-card__price--current\">\n {{ (product.discountedPrice ?? product.price).toFixed(2) }} &#8364;\n </span>\n </div>\n\n <p v-if=\"!product.availableForOrder\" class=\"altz-product-card__unavailable\">\n Indisponible\n </p>\n\n <button\n v-if=\"showAddToCart && product.availableForOrder\"\n class=\"altz-product-card__add-to-cart\"\n :disabled=\"cartStore.loading\"\n @click=\"addToCart\"\n >\n Ajouter au panier\n </button>\n </div>\n </article>\n</template>\n","<script setup lang=\"ts\">\nimport { onMounted } from 'vue'\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n showLines?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nonMounted(() => { cartStore.load() })\n</script>\n\n<template>\n <div class=\"altz-cart-summary\">\n <div v-if=\"cartStore.loading\" class=\"altz-cart-summary__loading\">\n Chargement du panier…\n </div>\n\n <div v-else-if=\"cartStore.isEmpty\" class=\"altz-cart-summary__empty\">\n Votre panier est vide.\n </div>\n\n <template v-else>\n <div v-if=\"showLines\" class=\"altz-cart-summary__lines\">\n <div\n v-for=\"line in cartStore.cart?.content?.flatMap(g => g.lines ?? [])\"\n :key=\"line.id\"\n class=\"altz-cart-summary__line\"\n >\n <span class=\"altz-cart-summary__line-label\">{{ line.label }}</span>\n <span class=\"altz-cart-summary__line-qty\">× {{ line.quantity }}</span>\n <span class=\"altz-cart-summary__line-price\">{{ (line.finalUnitPriceInclTax * line.quantity).toFixed(2) }} €</span>\n </div>\n </div>\n\n <div class=\"altz-cart-summary__total\">\n <span class=\"altz-cart-summary__total-label\">Total</span>\n <span class=\"altz-cart-summary__total-amount\">{{ cartStore.total.toFixed(2) }} €</span>\n </div>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useCartStore } from '../stores/useCartStore.js'\n\nconst props = defineProps<{\n reference: string\n quantity?: number\n label?: string\n disabled?: boolean\n}>()\n\nconst cartStore = useCartStore()\n\nasync function handleClick(): Promise<void> {\n if (props.disabled) return\n await cartStore.addItem(props.reference, props.quantity ?? 1)\n}\n</script>\n\n<template>\n <button\n class=\"altz-add-to-cart\"\n :disabled=\"disabled || cartStore.loading\"\n :aria-busy=\"cartStore.loading\"\n @click=\"handleClick\"\n >\n <slot>{{ label ?? 'Ajouter au panier' }}</slot>\n </button>\n</template>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_4","_hoisted_5","_toDisplayString","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_unref","_Fragment","_renderList","_renderSlot"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@altazion/commerce-sdk-vue",
3
- "version": "26.407.7565",
3
+ "version": "26.415.7673",
4
4
  "description": "Altazion Commerce SDK — Plugin Vue 3 avec stores Pinia et composants",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",