@magic-spells/gift-with-purchase 0.2.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.
@@ -0,0 +1,339 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Gift With Purchase Component - automatically adds/removes gift when cart threshold is met
5
+ * Emits gwp:added/gwp:removed/gwp:error events and broadcasts cart updates
6
+ */
7
+ class GiftWithPurchase extends HTMLElement {
8
+ // private fields
9
+ #threshold = 0;
10
+ #currentAmount = 0;
11
+ #variantId = null;
12
+ #isActive = false;
13
+ #isAdded = false;
14
+ #promoEnded = false;
15
+ #cartDialog = null;
16
+ #boundHandleCartDataChange = null; // pre-bound listener ref for clean-up
17
+ #debounceTimer = null; // debouncing cart updates
18
+ #messageAbove = null; // message when threshold is met
19
+ #messageBelow = null; // message when below threshold
20
+
21
+ static get observedAttributes() {
22
+ return ['threshold', 'current', 'variant-id', 'promo-ended', 'message-above', 'message-below'];
23
+ }
24
+
25
+ constructor() {
26
+ super();
27
+ // read initial attributes once
28
+ this.#threshold = parseFloat(this.getAttribute('threshold')) || 0;
29
+ this.#currentAmount = parseFloat(this.getAttribute('current')) || 0;
30
+ this.#variantId = this.getAttribute('variant-id');
31
+ this.#promoEnded = this.hasAttribute('promo-ended');
32
+ this.#messageAbove = this.getAttribute('message-above');
33
+ this.#messageBelow = this.getAttribute('message-below');
34
+ this.#boundHandleCartDataChange = this.#handleCartDataChange.bind(this);
35
+ }
36
+
37
+ connectedCallback() {
38
+ this.#render();
39
+ this.#attachListeners();
40
+ }
41
+
42
+ disconnectedCallback() {
43
+ if (this.#debounceTimer) clearTimeout(this.#debounceTimer);
44
+ if (this.#cartDialog)
45
+ this.#cartDialog.removeEventListener(
46
+ 'cart-dialog:data-changed',
47
+ this.#boundHandleCartDataChange
48
+ );
49
+ }
50
+
51
+ #render() {
52
+ this.classList.add('gift-with-purchase');
53
+ this.#renderMessages();
54
+ }
55
+
56
+ #renderMessages() {
57
+ // Look for existing message element with data-content-gwp-message
58
+ this.#updateMessages();
59
+ }
60
+
61
+ #updateMessages() {
62
+ const messageEl = this.querySelector('[data-content-gwp-message]');
63
+ if (!messageEl) return;
64
+
65
+ let message = '';
66
+
67
+ // console.log('updateMessages - this.#isActive', this.#isActive);
68
+
69
+ if (this.#isActive && this.#messageAbove) {
70
+ // set message to above threshold message
71
+ message = this.#messageAbove;
72
+ } else if (!this.#isActive && this.#messageBelow) {
73
+ // set message to below threshold message
74
+ const remaining = this.#threshold - this.#currentAmount;
75
+ const formattedAmount = remaining.toFixed(2).replace(/\.00$/, '');
76
+ message = this.#messageBelow
77
+ .replace(/\{\s*amount\s*\}/g, formattedAmount)
78
+ .replace(/\{amount\}/g, formattedAmount);
79
+ }
80
+
81
+ messageEl.textContent = message;
82
+ messageEl.style.display = message ? 'block' : 'none';
83
+ }
84
+
85
+ #attachListeners() {
86
+ // Look for cart-dialog element when attaching listeners (more reliable timing)
87
+ this.#cartDialog = this.closest('cart-dialog');
88
+
89
+ if (this.#cartDialog) {
90
+ // console.log('cartDialog exists and is attaching events');
91
+ this.#cartDialog.addEventListener(
92
+ 'cart-dialog:data-changed',
93
+ this.#boundHandleCartDataChange
94
+ );
95
+ } else {
96
+ // Try again after a short delay in case the DOM isn't fully ready
97
+ setTimeout(() => {
98
+ // console.log('cartDialog DIDNT exist and we waited to attach events');
99
+ this.#cartDialog = this.closest('cart-dialog');
100
+ if (this.#cartDialog) {
101
+ this.#cartDialog.addEventListener(
102
+ 'cart-dialog:data-changed',
103
+ this.#boundHandleCartDataChange
104
+ );
105
+ } else {
106
+ console.error('GWP - cart-dialog still not found after delay');
107
+ }
108
+ }, 100);
109
+ }
110
+ }
111
+
112
+ #handleCartDataChange(event) {
113
+ const cart = event.detail;
114
+ // console.log('GWP - handleCartDataChange cart: ', cart.calculated_subtotal, cart);
115
+
116
+ if (!cart || typeof cart.calculated_subtotal === 'undefined') return;
117
+ if (this.#debounceTimer) clearTimeout(this.#debounceTimer);
118
+
119
+ this.#debounceTimer = setTimeout(() => {
120
+ this.#debounceTimer = null;
121
+ this.#currentAmount = parseFloat(cart.calculated_subtotal / 100) || 0;
122
+ this.#checkGiftInCart(cart);
123
+ this.#updateState(cart);
124
+ }, 300);
125
+ }
126
+
127
+ // checks to see if the gift is already in the cart
128
+ #checkGiftInCart(cart) {
129
+ if (!cart.items || !this.#variantId) {
130
+ this.#isAdded = false;
131
+ return;
132
+ }
133
+ const giftLines = cart.items.filter(
134
+ (lineItem) =>
135
+ lineItem.variant_id.toString() === this.#variantId.toString() &&
136
+ lineItem.properties?._gwp_item === 'true'
137
+ );
138
+ this.#isAdded = giftLines.length > 0;
139
+ if (this.#promoEnded && giftLines.length) this.#removeAllGiftItems(giftLines);
140
+ }
141
+
142
+ #updateState(cart) {
143
+ // console.log('********** ---------- Updating state....');
144
+ const wasActive = this.#isActive;
145
+ this.#isActive = this.#currentAmount >= this.#threshold && !this.#promoEnded;
146
+
147
+ // console.log('********** ---------- this.#isActive', this.#isActive);
148
+
149
+ if (this.#promoEnded) {
150
+ // remove GWP from cart
151
+ this.#removeGiftFromCart(cart);
152
+ }
153
+
154
+ if (this.#isActive && !wasActive && !this.#isAdded && this.#variantId) {
155
+ this.#addGiftToCart();
156
+ } else if (!this.#isActive && wasActive && this.#isAdded && this.#variantId) {
157
+ this.#removeGiftFromCart(cart);
158
+ }
159
+
160
+ this.#updateVisualState();
161
+ this.#updateMessages();
162
+ }
163
+
164
+ #updateVisualState() {
165
+ if (this.#promoEnded) {
166
+ this.setAttribute('state', 'ended');
167
+ this.style.display = 'none';
168
+ return;
169
+ }
170
+
171
+ this.style.display = '';
172
+ if (this.#isAdded) {
173
+ this.setAttribute('state', 'added');
174
+ } else if (this.#isActive) {
175
+ this.setAttribute('state', 'active');
176
+ }
177
+ // Note: no 'inactive' state since component wouldn't be loaded if inactive
178
+ }
179
+
180
+ async #addGiftToCart() {
181
+ try {
182
+ const res = await fetch('/cart/add.js', {
183
+ method: 'POST',
184
+ credentials: 'same-origin',
185
+ headers: {
186
+ 'Content-Type': 'application/json',
187
+ 'X-Requested-With': 'XMLHttpRequest',
188
+ },
189
+ body: JSON.stringify({
190
+ items: [
191
+ {
192
+ id: this.#variantId,
193
+ quantity: 1,
194
+ properties: {
195
+ _gwp_item: 'true',
196
+ _hide_in_cart: 'true',
197
+ _ignore_price_in_subtotal: 'true',
198
+ },
199
+ },
200
+ ],
201
+ }),
202
+ });
203
+ if (!res.ok) throw new Error(`http ${res.status}`);
204
+ await res.json();
205
+ this.#isAdded = true;
206
+ this.dispatchEvent(
207
+ new CustomEvent('gwp:added', {
208
+ detail: { variantId: this.#variantId },
209
+ bubbles: true,
210
+ })
211
+ );
212
+ } catch (err) {
213
+ console.error('giftwithpurchase: add error', err);
214
+ this.dispatchEvent(
215
+ new CustomEvent('gwp:error', {
216
+ detail: { action: 'add', error: err.message },
217
+ bubbles: true,
218
+ })
219
+ );
220
+ }
221
+ }
222
+
223
+ async #removeGiftFromCart(cart) {
224
+ try {
225
+ // get all GWP items in the cart
226
+ const giftLines = cart.items.filter(
227
+ (lineItem) =>
228
+ lineItem.variant_id.toString() === this.#variantId.toString() &&
229
+ lineItem.properties?._gwp_item === 'true'
230
+ );
231
+
232
+ // exit if no items in the cart
233
+ if (!giftLines.length) {
234
+ this.#isAdded = false;
235
+ return;
236
+ }
237
+
238
+ // remove all GWP items from the cart
239
+ await this.#removeAllGiftItems(giftLines);
240
+ } catch (err) {
241
+ console.error('giftwithpurchase: remove error', err);
242
+ this.dispatchEvent(
243
+ new CustomEvent('gwp:error', {
244
+ detail: { action: 'remove', error: err.message },
245
+ bubbles: true,
246
+ })
247
+ );
248
+ }
249
+ }
250
+
251
+ async #removeAllGiftItems(giftLines) {
252
+ try {
253
+ await Promise.all(
254
+ giftLines.map((giftItem) =>
255
+ fetch('/cart/change.js', {
256
+ method: 'POST',
257
+ credentials: 'same-origin',
258
+ headers: {
259
+ 'Content-Type': 'application/json',
260
+ 'X-Requested-With': 'XMLHttpRequest',
261
+ },
262
+ body: JSON.stringify({ id: giftItem.key, quantity: 0 }),
263
+ })
264
+ )
265
+ );
266
+ this.#isAdded = false;
267
+ // note: you can broadcast cart again here if you want real-time re-render after remove
268
+ this.dispatchEvent(
269
+ new CustomEvent('gwp:removed', {
270
+ detail: { variantId: this.#variantId },
271
+ bubbles: true,
272
+ })
273
+ );
274
+ } catch (err) {
275
+ console.error('giftwithpurchase: bulk remove error', err);
276
+ this.dispatchEvent(
277
+ new CustomEvent('gwp:error', {
278
+ detail: { action: 'remove', error: err.message },
279
+ bubbles: true,
280
+ })
281
+ );
282
+ }
283
+ }
284
+
285
+ getState() {
286
+ return {
287
+ currentAmount: this.#currentAmount,
288
+ threshold: this.#threshold,
289
+ variantId: this.#variantId,
290
+ isActive: this.#isActive,
291
+ isAdded: this.#isAdded,
292
+ promoEnded: this.#promoEnded,
293
+ remainingAmount: Math.max(0, this.#threshold - this.#currentAmount),
294
+ };
295
+ }
296
+
297
+ get currentAmount() {
298
+ return this.#currentAmount;
299
+ }
300
+ get threshold() {
301
+ return this.#threshold;
302
+ }
303
+ get variantId() {
304
+ return this.#variantId;
305
+ }
306
+ get isActive() {
307
+ return this.#isActive;
308
+ }
309
+ get isAdded() {
310
+ return this.#isAdded;
311
+ }
312
+ get promoEnded() {
313
+ return this.#promoEnded;
314
+ }
315
+
316
+ // Public setter methods for programmatic control
317
+ setCurrentAmount(amount) {
318
+ this.#currentAmount = parseFloat(amount) || 0;
319
+ this.#updateState({ items: [] }); // Pass empty cart to avoid cart operations
320
+ this.#updateMessages();
321
+ }
322
+
323
+ setThreshold(threshold) {
324
+ this.#threshold = parseFloat(threshold) || 0;
325
+ this.#updateState({ items: [] }); // Pass empty cart to avoid cart operations
326
+ this.#updateMessages();
327
+ }
328
+
329
+ setVariantId(variantId) {
330
+ this.#variantId = variantId;
331
+ }
332
+ }
333
+
334
+ if (!customElements.get('gift-with-purchase')) {
335
+ customElements.define('gift-with-purchase', GiftWithPurchase);
336
+ }
337
+
338
+ exports.GiftWithPurchase = GiftWithPurchase;
339
+ //# sourceMappingURL=gift-with-purchase.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gift-with-purchase.cjs.js","sources":["../src/gift-with-purchase.js"],"sourcesContent":["import './gift-with-purchase.scss';\n\n/**\n * Gift With Purchase Component - automatically adds/removes gift when cart threshold is met\n * Emits gwp:added/gwp:removed/gwp:error events and broadcasts cart updates\n */\nclass GiftWithPurchase extends HTMLElement {\n\t// private fields\n\t#threshold = 0;\n\t#currentAmount = 0;\n\t#variantId = null;\n\t#isActive = false;\n\t#isAdded = false;\n\t#promoEnded = false;\n\t#cartDialog = null;\n\t#boundHandleCartDataChange = null; // pre-bound listener ref for clean-up\n\t#debounceTimer = null; // debouncing cart updates\n\t#messageAbove = null; // message when threshold is met\n\t#messageBelow = null; // message when below threshold\n\n\tstatic get observedAttributes() {\n\t\treturn ['threshold', 'current', 'variant-id', 'promo-ended', 'message-above', 'message-below'];\n\t}\n\n\tconstructor() {\n\t\tsuper();\n\t\t// read initial attributes once\n\t\tthis.#threshold = parseFloat(this.getAttribute('threshold')) || 0;\n\t\tthis.#currentAmount = parseFloat(this.getAttribute('current')) || 0;\n\t\tthis.#variantId = this.getAttribute('variant-id');\n\t\tthis.#promoEnded = this.hasAttribute('promo-ended');\n\t\tthis.#messageAbove = this.getAttribute('message-above');\n\t\tthis.#messageBelow = this.getAttribute('message-below');\n\t\tthis.#boundHandleCartDataChange = this.#handleCartDataChange.bind(this);\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#render();\n\t\tthis.#attachListeners();\n\t}\n\n\tdisconnectedCallback() {\n\t\tif (this.#debounceTimer) clearTimeout(this.#debounceTimer);\n\t\tif (this.#cartDialog)\n\t\t\tthis.#cartDialog.removeEventListener(\n\t\t\t\t'cart-dialog:data-changed',\n\t\t\t\tthis.#boundHandleCartDataChange\n\t\t\t);\n\t}\n\n\t#render() {\n\t\tthis.classList.add('gift-with-purchase');\n\t\tthis.#renderMessages();\n\t}\n\n\t#renderMessages() {\n\t\t// Look for existing message element with data-content-gwp-message\n\t\tthis.#updateMessages();\n\t}\n\n\t#updateMessages() {\n\t\tconst messageEl = this.querySelector('[data-content-gwp-message]');\n\t\tif (!messageEl) return;\n\n\t\tlet message = '';\n\n\t\t// console.log('updateMessages - this.#isActive', this.#isActive);\n\n\t\tif (this.#isActive && this.#messageAbove) {\n\t\t\t// set message to above threshold message\n\t\t\tmessage = this.#messageAbove;\n\t\t} else if (!this.#isActive && this.#messageBelow) {\n\t\t\t// set message to below threshold message\n\t\t\tconst remaining = this.#threshold - this.#currentAmount;\n\t\t\tconst formattedAmount = remaining.toFixed(2).replace(/\\.00$/, '');\n\t\t\tmessage = this.#messageBelow\n\t\t\t\t.replace(/\\{\\s*amount\\s*\\}/g, formattedAmount)\n\t\t\t\t.replace(/\\{amount\\}/g, formattedAmount);\n\t\t}\n\n\t\tmessageEl.textContent = message;\n\t\tmessageEl.style.display = message ? 'block' : 'none';\n\t}\n\n\t#attachListeners() {\n\t\t// Look for cart-dialog element when attaching listeners (more reliable timing)\n\t\tthis.#cartDialog = this.closest('cart-dialog');\n\n\t\tif (this.#cartDialog) {\n\t\t\t// console.log('cartDialog exists and is attaching events');\n\t\t\tthis.#cartDialog.addEventListener(\n\t\t\t\t'cart-dialog:data-changed',\n\t\t\t\tthis.#boundHandleCartDataChange\n\t\t\t);\n\t\t} else {\n\t\t\t// Try again after a short delay in case the DOM isn't fully ready\n\t\t\tsetTimeout(() => {\n\t\t\t\t// console.log('cartDialog DIDNT exist and we waited to attach events');\n\t\t\t\tthis.#cartDialog = this.closest('cart-dialog');\n\t\t\t\tif (this.#cartDialog) {\n\t\t\t\t\tthis.#cartDialog.addEventListener(\n\t\t\t\t\t\t'cart-dialog:data-changed',\n\t\t\t\t\t\tthis.#boundHandleCartDataChange\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('GWP - cart-dialog still not found after delay');\n\t\t\t\t}\n\t\t\t}, 100);\n\t\t}\n\t}\n\n\t#handleCartDataChange(event) {\n\t\tconst cart = event.detail;\n\t\t// console.log('GWP - handleCartDataChange cart: ', cart.calculated_subtotal, cart);\n\n\t\tif (!cart || typeof cart.calculated_subtotal === 'undefined') return;\n\t\tif (this.#debounceTimer) clearTimeout(this.#debounceTimer);\n\n\t\tthis.#debounceTimer = setTimeout(() => {\n\t\t\tthis.#debounceTimer = null;\n\t\t\tthis.#currentAmount = parseFloat(cart.calculated_subtotal / 100) || 0;\n\t\t\tthis.#checkGiftInCart(cart);\n\t\t\tthis.#updateState(cart);\n\t\t}, 300);\n\t}\n\n\t// checks to see if the gift is already in the cart\n\t#checkGiftInCart(cart) {\n\t\tif (!cart.items || !this.#variantId) {\n\t\t\tthis.#isAdded = false;\n\t\t\treturn;\n\t\t}\n\t\tconst giftLines = cart.items.filter(\n\t\t\t(lineItem) =>\n\t\t\t\tlineItem.variant_id.toString() === this.#variantId.toString() &&\n\t\t\t\tlineItem.properties?._gwp_item === 'true'\n\t\t);\n\t\tthis.#isAdded = giftLines.length > 0;\n\t\tif (this.#promoEnded && giftLines.length) this.#removeAllGiftItems(giftLines);\n\t}\n\n\t#updateState(cart) {\n\t\t// console.log('********** ---------- Updating state....');\n\t\tconst wasActive = this.#isActive;\n\t\tthis.#isActive = this.#currentAmount >= this.#threshold && !this.#promoEnded;\n\n\t\t// console.log('********** ---------- this.#isActive', this.#isActive);\n\n\t\tif (this.#promoEnded) {\n\t\t\t// remove GWP from cart\n\t\t\tthis.#removeGiftFromCart(cart);\n\t\t}\n\n\t\tif (this.#isActive && !wasActive && !this.#isAdded && this.#variantId) {\n\t\t\tthis.#addGiftToCart();\n\t\t} else if (!this.#isActive && wasActive && this.#isAdded && this.#variantId) {\n\t\t\tthis.#removeGiftFromCart(cart);\n\t\t}\n\n\t\tthis.#updateVisualState();\n\t\tthis.#updateMessages();\n\t}\n\n\t#updateVisualState() {\n\t\tif (this.#promoEnded) {\n\t\t\tthis.setAttribute('state', 'ended');\n\t\t\tthis.style.display = 'none';\n\t\t\treturn;\n\t\t}\n\n\t\tthis.style.display = '';\n\t\tif (this.#isAdded) {\n\t\t\tthis.setAttribute('state', 'added');\n\t\t} else if (this.#isActive) {\n\t\t\tthis.setAttribute('state', 'active');\n\t\t}\n\t\t// Note: no 'inactive' state since component wouldn't be loaded if inactive\n\t}\n\n\tasync #addGiftToCart() {\n\t\ttry {\n\t\t\tconst res = await fetch('/cart/add.js', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tcredentials: 'same-origin',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t'X-Requested-With': 'XMLHttpRequest',\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\titems: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: this.#variantId,\n\t\t\t\t\t\t\tquantity: 1,\n\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t_gwp_item: 'true',\n\t\t\t\t\t\t\t\t_hide_in_cart: 'true',\n\t\t\t\t\t\t\t\t_ignore_price_in_subtotal: 'true',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t}),\n\t\t\t});\n\t\t\tif (!res.ok) throw new Error(`http ${res.status}`);\n\t\t\tawait res.json();\n\t\t\tthis.#isAdded = true;\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent('gwp:added', {\n\t\t\t\t\tdetail: { variantId: this.#variantId },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t})\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tconsole.error('giftwithpurchase: add error', err);\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent('gwp:error', {\n\t\t\t\t\tdetail: { action: 'add', error: err.message },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t}\n\n\tasync #removeGiftFromCart(cart) {\n\t\ttry {\n\t\t\t// get all GWP items in the cart\n\t\t\tconst giftLines = cart.items.filter(\n\t\t\t\t(lineItem) =>\n\t\t\t\t\tlineItem.variant_id.toString() === this.#variantId.toString() &&\n\t\t\t\t\tlineItem.properties?._gwp_item === 'true'\n\t\t\t);\n\n\t\t\t// exit if no items in the cart\n\t\t\tif (!giftLines.length) {\n\t\t\t\tthis.#isAdded = false;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// remove all GWP items from the cart\n\t\t\tawait this.#removeAllGiftItems(giftLines);\n\t\t} catch (err) {\n\t\t\tconsole.error('giftwithpurchase: remove error', err);\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent('gwp:error', {\n\t\t\t\t\tdetail: { action: 'remove', error: err.message },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t}\n\n\tasync #removeAllGiftItems(giftLines) {\n\t\ttry {\n\t\t\tawait Promise.all(\n\t\t\t\tgiftLines.map((giftItem) =>\n\t\t\t\t\tfetch('/cart/change.js', {\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\tcredentials: 'same-origin',\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t\t\t'X-Requested-With': 'XMLHttpRequest',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbody: JSON.stringify({ id: giftItem.key, quantity: 0 }),\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t);\n\t\t\tthis.#isAdded = false;\n\t\t\t// note: you can broadcast cart again here if you want real-time re-render after remove\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent('gwp:removed', {\n\t\t\t\t\tdetail: { variantId: this.#variantId },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t})\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tconsole.error('giftwithpurchase: bulk remove error', err);\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent('gwp:error', {\n\t\t\t\t\tdetail: { action: 'remove', error: err.message },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t}\n\n\tgetState() {\n\t\treturn {\n\t\t\tcurrentAmount: this.#currentAmount,\n\t\t\tthreshold: this.#threshold,\n\t\t\tvariantId: this.#variantId,\n\t\t\tisActive: this.#isActive,\n\t\t\tisAdded: this.#isAdded,\n\t\t\tpromoEnded: this.#promoEnded,\n\t\t\tremainingAmount: Math.max(0, this.#threshold - this.#currentAmount),\n\t\t};\n\t}\n\n\tget currentAmount() {\n\t\treturn this.#currentAmount;\n\t}\n\tget threshold() {\n\t\treturn this.#threshold;\n\t}\n\tget variantId() {\n\t\treturn this.#variantId;\n\t}\n\tget isActive() {\n\t\treturn this.#isActive;\n\t}\n\tget isAdded() {\n\t\treturn this.#isAdded;\n\t}\n\tget promoEnded() {\n\t\treturn this.#promoEnded;\n\t}\n\n\t// Public setter methods for programmatic control\n\tsetCurrentAmount(amount) {\n\t\tthis.#currentAmount = parseFloat(amount) || 0;\n\t\tthis.#updateState({ items: [] }); // Pass empty cart to avoid cart operations\n\t\tthis.#updateMessages();\n\t}\n\n\tsetThreshold(threshold) {\n\t\tthis.#threshold = parseFloat(threshold) || 0;\n\t\tthis.#updateState({ items: [] }); // Pass empty cart to avoid cart operations\n\t\tthis.#updateMessages();\n\t}\n\n\tsetVariantId(variantId) {\n\t\tthis.#variantId = variantId;\n\t}\n}\n\nif (!customElements.get('gift-with-purchase')) {\n\tcustomElements.define('gift-with-purchase', GiftWithPurchase);\n}\n\nexport { GiftWithPurchase };\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ gift-with-purchase {
2
+ --gwp-border-radius: 8px;
3
+ --gwp-padding: 1rem;
4
+ --gwp-gap: 1rem;
5
+ --gwp-bg-active: #e8f5e8;
6
+ --gwp-bg-added: #d4edda;
7
+ --gwp-border-active: #28a745;
8
+ --gwp-border-added: #155724;
9
+ --gwp-text-active: #155724;
10
+ --gwp-text-added: #155724;
11
+ display: block;
12
+ border: 2px solid var(--gwp-border-active);
13
+ border-radius: var(--gwp-border-radius);
14
+ padding: var(--gwp-padding);
15
+ background-color: var(--gwp-bg-active);
16
+ color: var(--gwp-text-active);
17
+ }
18
+ gift-with-purchase .gwp-product {
19
+ display: flex;
20
+ align-items: flex-start;
21
+ gap: var(--gwp-gap);
22
+ }
23
+ gift-with-purchase [data-gwp-image] {
24
+ flex-shrink: 0;
25
+ }
26
+ gift-with-purchase .gwp-content {
27
+ flex: 1;
28
+ min-width: 0;
29
+ }
30
+ gift-with-purchase[state=active] {
31
+ background-color: var(--gwp-bg-active);
32
+ border-color: var(--gwp-border-active);
33
+ color: var(--gwp-text-active);
34
+ }
35
+ gift-with-purchase[state=added] {
36
+ background-color: var(--gwp-bg-added);
37
+ border-color: var(--gwp-border-added);
38
+ color: var(--gwp-text-added);
39
+ }
40
+ gift-with-purchase[state=ended] {
41
+ display: none;
42
+ }
43
+ /*# sourceMappingURL=gift-with-purchase.esm.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["gift-with-purchase.scss"],"names":[],"mappings":"AAAA;EACE,wBAAwB;EACxB,mBAAmB;EACnB,eAAe;EACf,wBAAwB;EACxB,uBAAuB;EACvB,4BAA4B;EAC5B,2BAA2B;EAC3B,0BAA0B;EAC1B,yBAAyB;EACzB,cAAc;EACd,0CAA0C;EAC1C,uCAAuC;EACvC,2BAA2B;EAC3B,sCAAsC;EACtC,6BAA6B;AAC/B;AACA;EACE,aAAa;EACb,uBAAuB;EACvB,mBAAmB;AACrB;AACA;EACE,cAAc;AAChB;AACA;EACE,OAAO;EACP,YAAY;AACd;AACA;EACE,sCAAsC;EACtC,sCAAsC;EACtC,6BAA6B;AAC/B;AACA;EACE,qCAAqC;EACrC,qCAAqC;EACrC,4BAA4B;AAC9B;AACA;EACE,aAAa;AACf","file":"gift-with-purchase.esm.css","sourcesContent":["gift-with-purchase {\n --gwp-border-radius: 8px;\n --gwp-padding: 1rem;\n --gwp-gap: 1rem;\n --gwp-bg-active: #e8f5e8;\n --gwp-bg-added: #d4edda;\n --gwp-border-active: #28a745;\n --gwp-border-added: #155724;\n --gwp-text-active: #155724;\n --gwp-text-added: #155724;\n display: block;\n border: 2px solid var(--gwp-border-active);\n border-radius: var(--gwp-border-radius);\n padding: var(--gwp-padding);\n background-color: var(--gwp-bg-active);\n color: var(--gwp-text-active);\n}\ngift-with-purchase .gwp-product {\n display: flex;\n align-items: flex-start;\n gap: var(--gwp-gap);\n}\ngift-with-purchase [data-gwp-image] {\n flex-shrink: 0;\n}\ngift-with-purchase .gwp-content {\n flex: 1;\n min-width: 0;\n}\ngift-with-purchase[state=active] {\n background-color: var(--gwp-bg-active);\n border-color: var(--gwp-border-active);\n color: var(--gwp-text-active);\n}\ngift-with-purchase[state=added] {\n background-color: var(--gwp-bg-added);\n border-color: var(--gwp-border-added);\n color: var(--gwp-text-added);\n}\ngift-with-purchase[state=ended] {\n display: none;\n}"]}