@occluze/tether 0.9.2 → 0.9.4
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 +1 -1
- package/dist/esm/astro.js +2 -2
- package/dist/esm/chunks/account-2467DHLU.js +1 -0
- package/dist/esm/chunks/{account-pages-FIXSWJH7.js → account-pages-X7U3E7D7.js} +1 -1
- package/dist/esm/chunks/{analytics-MO2ZWBOD.js → analytics-TF7M4KI2.js} +1 -1
- package/dist/esm/chunks/{chunk-7CRTJV25.js → chunk-4QINHHE4.js} +1 -1
- package/dist/esm/chunks/chunk-5TS6IBBB.js +1 -0
- package/dist/esm/chunks/{chunk-BVO7KK2M.js → chunk-646NGAEM.js} +1 -1
- package/dist/esm/chunks/chunk-67MCLHFS.js +1 -0
- package/dist/esm/chunks/{chunk-FWMPL6PR.js → chunk-6FWNC7QH.js} +1 -1
- package/dist/esm/chunks/{chunk-IJAMRI33.js → chunk-AHYDU7Z6.js} +1 -1
- package/dist/esm/chunks/{chunk-SZRDO62E.js → chunk-B2X6ZOKA.js} +1 -1
- package/dist/esm/chunks/chunk-C2GKO34C.js +1 -0
- package/dist/esm/chunks/chunk-EYVBEFKK.js +1 -0
- package/dist/esm/chunks/{chunk-DM5LEAWM.js → chunk-F3OXGENC.js} +1 -1
- package/dist/esm/chunks/{chunk-OENVX4NY.js → chunk-HEK66LYK.js} +1 -1
- package/dist/esm/chunks/chunk-I7XE7GQR.js +1 -0
- package/dist/esm/chunks/chunk-KIZBET7N.js +1 -0
- package/dist/esm/chunks/chunk-UJYL5G7T.js +1 -0
- package/dist/esm/chunks/{chunk-CRKJ2VEX.js → chunk-UM37ZVSP.js} +1 -1
- package/dist/esm/chunks/chunk-YW3ZIFWB.js +1 -0
- package/dist/esm/chunks/{diagnose-XSZPWEG7.js → diagnose-AOSBLXOJ.js} +1 -1
- package/dist/esm/chunks/{extras-DZIOTZ3H.js → extras-THTXX76O.js} +1 -1
- package/dist/esm/chunks/lists-UJMD7BCQ.js +1 -0
- package/dist/esm/chunks/{markets-ui-DEEYV4KT.js → markets-ui-PTAY3FHU.js} +1 -1
- package/dist/esm/chunks/search-G2SRQXDG.js +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/server.js +2 -2
- package/dist/tether.account-pages.js +3 -3
- package/dist/tether.account-pages.min.js +1 -1
- package/dist/tether.account.js +20 -20
- package/dist/tether.account.min.js +1 -1
- package/dist/tether.analytics.js +2 -2
- package/dist/tether.analytics.min.js +1 -1
- package/dist/tether.diagnose.js +2 -2
- package/dist/tether.diagnose.min.js +1 -1
- package/dist/tether.extras.js +1 -1
- package/dist/tether.extras.min.js +1 -1
- package/dist/tether.js +248 -129
- package/dist/tether.lists.js +12 -8
- package/dist/tether.lists.min.js +1 -1
- package/dist/tether.markets.js +2 -2
- package/dist/tether.markets.min.js +1 -1
- package/dist/tether.min.js +1 -1
- package/dist/tether.min.js.map +4 -4
- package/dist/tether.search.js +60 -23
- package/dist/tether.search.min.js +1 -1
- package/dist/types/server/src/shared/metafield-ref.d.ts +15 -0
- package/dist/types/src/account/server-client.d.ts +2 -1
- package/dist/types/src/analytics-queue.d.ts +9 -0
- package/dist/types/src/cart/checkout.d.ts +2 -2
- package/dist/types/src/cart/drawer.d.ts +9 -4
- package/dist/types/src/cart/store.d.ts +2 -0
- package/dist/types/src/cart.d.ts +1 -1
- package/dist/types/src/client.d.ts +6 -0
- package/dist/types/src/dom.d.ts +25 -1
- package/dist/types/src/index.d.ts +1 -1
- package/dist/types/src/search.d.ts +1 -1
- package/dist/types/src/shopify-values.d.ts +2 -0
- package/dist/types/src/version.d.ts +1 -1
- package/package.json +1 -1
- package/dist/esm/chunks/account-XBGNTM7V.js +0 -1
- package/dist/esm/chunks/chunk-2J3MTS3E.js +0 -1
- package/dist/esm/chunks/chunk-4FR3CUO2.js +0 -1
- package/dist/esm/chunks/chunk-7ZXEVDOS.js +0 -1
- package/dist/esm/chunks/chunk-FI4NIWAD.js +0 -1
- package/dist/esm/chunks/chunk-H6IORH7O.js +0 -1
- package/dist/esm/chunks/chunk-OATTAXPO.js +0 -1
- package/dist/esm/chunks/chunk-OJAV2I3C.js +0 -1
- package/dist/esm/chunks/chunk-Y3NKKN2O.js +0 -1
- package/dist/esm/chunks/lists-OJGSVQMM.js +0 -1
- package/dist/esm/chunks/search-A6HF5PMJ.js +0 -1
package/dist/tether.search.js
CHANGED
|
@@ -19,11 +19,11 @@
|
|
|
19
19
|
|
|
20
20
|
// tether-core:client.ts
|
|
21
21
|
var m2 = window.Tether.__core["client.ts"];
|
|
22
|
-
var [endpoint, gql, matches, orNull, shaped, TetherError] = m2;
|
|
22
|
+
var [endpoint, gql, matches, orNull, shaped, TetherError, withTimeout] = m2;
|
|
23
23
|
|
|
24
24
|
// tether-core:dom.ts
|
|
25
25
|
var m3 = window.Tether.__core["dom.ts"];
|
|
26
|
-
var [ANALYTICS_EVENTS, attr, attributesFromJson, busy, emit, formatDate, formatMoney, get, has, hasTemplate, isOwnEvent, notifyLayoutChanged, parseJSONAttr, productUrl, qsa, repeat, scoped, sel, setImage, setStoreHtml, setText, show] = m3;
|
|
26
|
+
var [ANALYTICS_EVENTS, attr, attributesFromJson, busy, emit, formatDate, formatMoney, get, has, hasTemplate, integerAttribute, isOwnEvent, notifyLayoutChanged, parseJSONAttr, productUrl, qsa, repeat, scoped, sel, setImage, setStoreHtml, setText, show] = m3;
|
|
27
27
|
|
|
28
28
|
// tether-core:mounting.ts
|
|
29
29
|
var m4 = window.Tether.__core["mounting.ts"];
|
|
@@ -39,13 +39,12 @@
|
|
|
39
39
|
});
|
|
40
40
|
var QUERY = `query TetherPredictive($q:String!,$limit:Int!){predictiveSearch(query:$q,limit:$limit,limitScope:EACH,types:[PRODUCT,COLLECTION,QUERY]){products{id handle title availableForSale featuredImage{url altText}priceRange{minVariantPrice{amount currencyCode}}}collections{handle title image{url altText}}queries{text}}}`;
|
|
41
41
|
var DEFAULT_LIMIT = 6;
|
|
42
|
+
var MAX_LIMIT = 10;
|
|
42
43
|
var DEFAULT_MIN_CHARACTERS = 2;
|
|
43
44
|
var DEFAULT_ACTION = "/search";
|
|
44
45
|
var mounted = /* @__PURE__ */ new WeakSet();
|
|
45
46
|
var searchBoxCount = 0;
|
|
46
|
-
|
|
47
|
-
return parseInt(get(el, name) || "", 10) || fallback;
|
|
48
|
-
}
|
|
47
|
+
var liveBoxes = /* @__PURE__ */ new Set();
|
|
49
48
|
var linkIn = (node) => node.tagName === "A" ? node : node.querySelector("a");
|
|
50
49
|
function bindValues(node, values) {
|
|
51
50
|
qsa(node, sel("search-bind")).forEach((el) => {
|
|
@@ -76,11 +75,16 @@
|
|
|
76
75
|
__publicField(this, "lastTerm", "");
|
|
77
76
|
/** Results per term, for typing back and forth. */
|
|
78
77
|
__publicField(this, "cache", /* @__PURE__ */ new Map());
|
|
78
|
+
/**
|
|
79
|
+
* Removes the box's listeners once its root has left the page. The window's own controller: a page's
|
|
80
|
+
* `addEventListener` takes only its own signals, and in jsdom those aren't Node's.
|
|
81
|
+
*/
|
|
82
|
+
__publicField(this, "listening", new window.AbortController());
|
|
79
83
|
this.root = root;
|
|
80
84
|
this.input = input;
|
|
81
85
|
this.results = results;
|
|
82
|
-
this.limit = integerAttribute(root, "search-limit", DEFAULT_LIMIT);
|
|
83
|
-
this.minCharacters = integerAttribute(root, "search-min", DEFAULT_MIN_CHARACTERS);
|
|
86
|
+
this.limit = integerAttribute(root, "search-limit", { min: 1, max: MAX_LIMIT, fallback: DEFAULT_LIMIT });
|
|
87
|
+
this.minCharacters = integerAttribute(root, "search-min", { min: 1, fallback: DEFAULT_MIN_CHARACTERS });
|
|
84
88
|
if (!results.id) {
|
|
85
89
|
searchBoxCount += 1;
|
|
86
90
|
results.id = `${cfg.prefix}-search-${searchBoxCount}`;
|
|
@@ -88,6 +92,14 @@
|
|
|
88
92
|
this.resultsId = results.id;
|
|
89
93
|
this.setUpAria();
|
|
90
94
|
this.listen();
|
|
95
|
+
liveBoxes.add(this);
|
|
96
|
+
}
|
|
97
|
+
/** Stops the box whose root a page swap removed; the root mounts afresh if it comes back. */
|
|
98
|
+
stop() {
|
|
99
|
+
this.listening.abort();
|
|
100
|
+
clearTimeout(this.timer);
|
|
101
|
+
liveBoxes.delete(this);
|
|
102
|
+
mounted.delete(this.root);
|
|
91
103
|
}
|
|
92
104
|
setUpAria() {
|
|
93
105
|
this.input.setAttribute("role", "combobox");
|
|
@@ -99,22 +111,43 @@
|
|
|
99
111
|
this.results.hidden = true;
|
|
100
112
|
}
|
|
101
113
|
listen() {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
114
|
+
const { signal } = this.listening;
|
|
115
|
+
this.input.addEventListener(
|
|
116
|
+
"input",
|
|
117
|
+
() => {
|
|
118
|
+
const term = this.input.value.trim();
|
|
119
|
+
if (term === this.lastTerm) return;
|
|
120
|
+
this.lastTerm = term;
|
|
121
|
+
clearTimeout(this.timer);
|
|
122
|
+
this.timer = setTimeout(() => void this.search(term), cfg.searchDelay);
|
|
123
|
+
},
|
|
124
|
+
{ signal }
|
|
125
|
+
);
|
|
126
|
+
this.input.addEventListener(
|
|
127
|
+
"focus",
|
|
128
|
+
() => {
|
|
129
|
+
if (this.input.value.trim().length >= this.minCharacters && this.options().length) this.open(true);
|
|
130
|
+
},
|
|
131
|
+
{ signal }
|
|
132
|
+
);
|
|
133
|
+
this.input.addEventListener(
|
|
134
|
+
"keydown",
|
|
135
|
+
(event) => {
|
|
136
|
+
this.onKeydown(event);
|
|
137
|
+
},
|
|
138
|
+
{ signal }
|
|
139
|
+
);
|
|
140
|
+
document.addEventListener(
|
|
141
|
+
"click",
|
|
142
|
+
(event) => {
|
|
143
|
+
if (!this.root.isConnected) {
|
|
144
|
+
this.stop();
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (!this.root.contains(event.target)) this.open(false);
|
|
148
|
+
},
|
|
149
|
+
{ signal }
|
|
150
|
+
);
|
|
118
151
|
}
|
|
119
152
|
setState(state) {
|
|
120
153
|
this.root.setAttribute(attr("search-state"), state);
|
|
@@ -202,6 +235,7 @@
|
|
|
202
235
|
option.id || (option.id = `${this.resultsId}-${index}`);
|
|
203
236
|
option.setAttribute("aria-selected", "false");
|
|
204
237
|
});
|
|
238
|
+
this.input.removeAttribute("aria-activedescendant");
|
|
205
239
|
}
|
|
206
240
|
highlight(options, index) {
|
|
207
241
|
options.forEach((option2, optionIndex) => {
|
|
@@ -231,6 +265,9 @@
|
|
|
231
265
|
}
|
|
232
266
|
};
|
|
233
267
|
function mountSearch(root = document) {
|
|
268
|
+
liveBoxes.forEach((box) => {
|
|
269
|
+
if (!box.root.isConnected) box.stop();
|
|
270
|
+
});
|
|
234
271
|
for (const el of within(root, sel("search"))) {
|
|
235
272
|
if (mounted.has(el)) continue;
|
|
236
273
|
mounted.add(el);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{var
|
|
1
|
+
(()=>{var E=Object.defineProperty;var V=(i,t,e)=>t in i?E(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var F=(i,t)=>{for(var e in t)E(i,e,{get:t[e],enumerable:!0})};var s=(i,t,e)=>V(i,typeof t!="symbol"?t+"":t,e);var b={};F(b,{mountSearch:()=>G});var j=window.Tether.__core["config.ts"],[u,rt,A,it,nt,x,st]=j;var B=window.Tether.__core["client.ts"],[at,L,lt,I,k,ct,ht]=B;var K=window.Tether.__core["dom.ts"],[dt,C,mt,pt,N,ft,R,p,gt,wt,f,yt,Tt,bt,M,h,P,St,l,q,Et,_,d]=K;var Q=window.Tether.__core["mounting.ts"],[xt,Lt,It,kt,Ct,v]=Q;var Y=k({predictiveSearch:I({products:[{priceRange:"object"}],collections:["object"],queries:[{text:"string"}]})}),J="query TetherPredictive($q:String!,$limit:Int!){predictiveSearch(query:$q,limit:$limit,limitScope:EACH,types:[PRODUCT,COLLECTION,QUERY]){products{id handle title availableForSale featuredImage{url altText}priceRange{minVariantPrice{amount currencyCode}}}collections{handle title image{url altText}}queries{text}}}",z=6,W=10,X=2,Z="/search",w=new WeakSet,$=0,y=new Set,U=i=>i.tagName==="A"?i:i.querySelector("a");function g(i,t){h(i,l("search-bind")).forEach(e=>{let r=p(e,"search-bind");r==="image"?q(e,t.image?.url,t.image?.altText||t.title):(r==="title"||r==="price"||r==="text")&&t[r]!=null&&_(e,t[r])})}function H(i,t){let e=U(i);e&&(t&&e.setAttribute("href",t),e.setAttribute("role","option"))}var T=class{constructor(t,e,r){s(this,"root");s(this,"input");s(this,"results");s(this,"limit");s(this,"minCharacters");s(this,"resultsId");s(this,"searchNumber",0);s(this,"timer");s(this,"lastTerm","");s(this,"cache",new Map);s(this,"listening",new window.AbortController);this.root=t,this.input=e,this.results=r,this.limit=f(t,"search-limit",{min:1,max:W,fallback:z}),this.minCharacters=f(t,"search-min",{min:1,fallback:X}),r.id||($+=1,r.id=`${u.prefix}-search-${$}`),this.resultsId=r.id,this.setUpAria(),this.listen(),y.add(this)}stop(){this.listening.abort(),clearTimeout(this.timer),y.delete(this),w.delete(this.root)}setUpAria(){this.input.setAttribute("role","combobox"),this.input.setAttribute("aria-autocomplete","list"),this.input.setAttribute("aria-controls",this.resultsId),this.input.setAttribute("aria-expanded","false"),this.input.setAttribute("autocomplete","off"),this.results.hasAttribute("role")||this.results.setAttribute("role","listbox"),this.results.hidden=!0}listen(){let{signal:t}=this.listening;this.input.addEventListener("input",()=>{let e=this.input.value.trim();e!==this.lastTerm&&(this.lastTerm=e,clearTimeout(this.timer),this.timer=setTimeout(()=>void this.search(e),u.searchDelay))},{signal:t}),this.input.addEventListener("focus",()=>{this.input.value.trim().length>=this.minCharacters&&this.options().length&&this.open(!0)},{signal:t}),this.input.addEventListener("keydown",e=>{this.onKeydown(e)},{signal:t}),document.addEventListener("click",e=>{if(!this.root.isConnected){this.stop();return}this.root.contains(e.target)||this.open(!1)},{signal:t})}setState(t){this.root.setAttribute(C("search-state"),t)}open(t){this.root.classList.toggle("is-open",t),this.results.hidden=!t,this.input.setAttribute("aria-expanded",String(t)),t||this.input.removeAttribute("aria-activedescendant")}options(){return h(this.results,'[role="option"]')}async fetchResults(t){let e=this.cache.get(t);if(e)return e;let r=await L(J,{q:t,limit:this.limit},Y);return this.cache.set(t,r.predictiveSearch),r.predictiveSearch}async search(t){this.searchNumber+=1;let e=this.searchNumber;if(t.length<this.minCharacters){this.open(!1),this.setState("idle");return}this.setState("loading");try{let r=await this.fetchResults(t);e===this.searchNumber&&this.render(r,t)}catch(r){if(e!==this.searchNumber){A("a superseded search failed",r);return}this.setState("error"),x(r,"search")}}fillList(t,e,r){h(this.results,l(t)).forEach(a=>{P(a,e,r),d(a,e.length>0)})}queryUrl(t){let e=this.root.getAttribute("action")||Z,r=e.includes("?")?"&":"?";return`${e}${r}${this.input.name||"q"}=${encodeURIComponent(t)}`}render(t,e){let r=t?.products??[],a=t?.collections??[],c=(t?.queries??[]).filter(o=>o.text.toLowerCase()!==e.toLowerCase());this.fillList("search-products",r,(o,n)=>{let D=R(n.priceRange.minVariantPrice);g(o,{title:n.title,price:D,image:n.featuredImage}),H(o,M(n.handle,n.id)),o.classList.toggle("is-sold-out",!n.availableForSale)}),this.fillList("search-collections",a,(o,n)=>{g(o,{title:n.title,image:n.image}),H(o,`${(u.collectionPath||"/collection").replace(/\/$/,"")}/${n.handle}`)}),this.fillList("search-queries",c,(o,n)=>{g(o,{text:n.text}),U(o)?.setAttribute("href",this.queryUrl(n.text))});let S=r.length+a.length+c.length;this.showCount(S),this.setState(S?"ready":"empty"),this.open(!0),N("search",{term:e,products:r,collections:a,queries:c},this.root)}showCount(t){h(this.root,l("show")).forEach(e=>{let r=p(e,"show");r==="search-empty"&&d(e,t===0),r==="search-results"&&d(e,t>0)}),this.options().forEach((e,r)=>{e.id||(e.id=`${this.resultsId}-${r}`),e.setAttribute("aria-selected","false")}),this.input.removeAttribute("aria-activedescendant")}highlight(t,e){t.forEach((a,c)=>{a.setAttribute("aria-selected",String(c===e))});let r=t[e];r&&(this.input.setAttribute("aria-activedescendant",r.id),r.scrollIntoView?.({block:"nearest"}))}onKeydown(t){let e=this.options(),r=e.findIndex(a=>a.getAttribute("aria-selected")==="true");t.key==="ArrowDown"&&e.length?(t.preventDefault(),this.open(!0),this.highlight(e,(r+1)%e.length)):t.key==="ArrowUp"&&e.length?(t.preventDefault(),this.highlight(e,r<=0?e.length-1:r-1)):t.key==="Enter"&&r>=0?(t.preventDefault(),e[r]?.click()):t.key==="Escape"&&this.open(!1)}};function G(i=document){y.forEach(t=>{t.root.isConnected||t.stop()});for(let t of v(i,l("search"))){if(w.has(t))continue;w.add(t);let e=t.querySelector(l("search-input"))??t.querySelector("input"),r=t.querySelector(l("search-results"));e&&r&&new T(t,e,r)}}function m(i){return i!==null&&typeof i=="object"&&!Array.isArray(i)}function tt(i){return m(i)&&m(i.__core)&&m(i.__parts)}function O(i,t){let e=Reflect.get(window,"Tether");if(!tt(e))throw new Error(`tether.${i}.js runs after the Tether script, which loads it, and needs its window.Tether`);e.__parts[i]=t}O("search",b);})();
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metafield references (`namespace.key`), which the browser's product fragment and the sync's product query write
|
|
3
|
+
* into their text: a GraphQL fragment can't declare variables, so they can't be sent as variables. Only these
|
|
4
|
+
* characters are let through, which covers Shopify's namespaces and keys.
|
|
5
|
+
*/
|
|
6
|
+
/** @returns True when both parts are ones a query may hold. */
|
|
7
|
+
export declare const isMetafieldIdentifier: (namespace: string, key: string) => boolean;
|
|
8
|
+
/**
|
|
9
|
+
* @param ref `namespace.key`: the namespace ends at the first dot, and the key may hold more.
|
|
10
|
+
* @returns Its parts, `null` when there is no namespace or either part isn't valid.
|
|
11
|
+
*/
|
|
12
|
+
export declare function metafieldIdentifierOf(ref: string): {
|
|
13
|
+
namespace: string;
|
|
14
|
+
key: string;
|
|
15
|
+
} | null;
|
|
@@ -21,7 +21,8 @@ export interface ServerRequest {
|
|
|
21
21
|
* cross-site forms.
|
|
22
22
|
*
|
|
23
23
|
* @throws {TetherError} `NOT_CONFIGURED` without `account.server`, `INVALID` for refused input, `HTTP_<status>` for
|
|
24
|
-
* any other failure but a 401, with the Worker's `userErrors`; `NETWORK` when the Worker can't be reached
|
|
24
|
+
* any other failure but a 401, with the Worker's `userErrors`; `NETWORK` when the Worker can't be reached or takes
|
|
25
|
+
* longer than `requestTimeout`.
|
|
25
26
|
*/
|
|
26
27
|
export declare function serverFetch(path: string, { method, body }?: ServerRequest): Promise<ServerAnswer>;
|
|
27
28
|
/**
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Parts } from './lazy.js';
|
|
2
|
+
/**
|
|
3
|
+
* Buffers the events the analytics part handles until `load` has the part, then hands it the buffer. When the part
|
|
4
|
+
* fails to load (an ad blocker, a CSP rule, an integrity mismatch) or to start, the buffer is emptied and its
|
|
5
|
+
* listeners removed, so the page keeps no cart or product details for a part that will never read them.
|
|
6
|
+
*
|
|
7
|
+
* @returns The buffer, which the part drains and then handles each event pushed to it as it comes.
|
|
8
|
+
*/
|
|
9
|
+
export declare function queueAnalyticsEvents(load: () => Promise<Pick<Parts['analytics'], 'startAnalytics'>>): Event[];
|
|
@@ -7,8 +7,8 @@ type CheckoutResolver = () => Promise<string | null>;
|
|
|
7
7
|
/** Sets the account part's checkout URL, or clears it with `null`. A URL it answers opens checkout logged in. */
|
|
8
8
|
export declare function setCheckoutResolver(resolver: CheckoutResolver | null): void;
|
|
9
9
|
/**
|
|
10
|
-
* Goes to Shopify's checkout. With `_blank` the tab opens inside
|
|
11
|
-
* await) and gets its URL once there is one.
|
|
10
|
+
* Goes to Shopify's checkout, with the cart as the changes already queued leave it. With `_blank` the tab opens inside
|
|
11
|
+
* the click (Safari blocks `window.open` after an await) and gets its URL once there is one.
|
|
12
12
|
*
|
|
13
13
|
* @returns The checkout URL, `null` with nothing to check out or after a reported failure.
|
|
14
14
|
*/
|
|
@@ -3,12 +3,17 @@ export declare const drawers: () => HTMLElement[];
|
|
|
3
3
|
/** True while a drawer, or the drawer-less cart, is open. */
|
|
4
4
|
export declare function isOpen(): boolean;
|
|
5
5
|
/**
|
|
6
|
-
* `aria-expanded` on the open buttons, and dialog semantics on the drawers unless their markup has its own.
|
|
7
|
-
* drawer is hidden from screen readers and,
|
|
6
|
+
* `aria-expanded` on the open buttons, and dialog semantics on the drawers unless their markup has its own. Each
|
|
7
|
+
* drawer follows its own open class: a closed one is hidden from screen readers and inert, out of the Tab order like
|
|
8
|
+
* a closed dialog, so nothing `aria-hidden` can take focus.
|
|
9
|
+
*/
|
|
10
|
+
export declare function syncDrawerAria(): void;
|
|
11
|
+
/**
|
|
12
|
+
* Opens every drawer but `tether-cart-drawer="manual"` ones, which only the site opens, by adding the open class. On a
|
|
13
|
+
* page whose drawers are all manual it does nothing.
|
|
8
14
|
*/
|
|
9
|
-
export declare function syncDrawerAria(open: boolean): void;
|
|
10
|
-
/** Opens every drawer except `tether-cart-drawer="manual"` ones, which the site opens itself. */
|
|
11
15
|
export declare function openCart(): void;
|
|
16
|
+
/** Closes every open drawer, `manual` ones included. */
|
|
12
17
|
export declare function closeCart(): void;
|
|
13
18
|
export declare function toggleCart(): void;
|
|
14
19
|
/**
|
|
@@ -175,6 +175,8 @@ export declare function showLastKnownCount(): void;
|
|
|
175
175
|
export declare function setWarnings(notes: readonly CartWarning[]): void;
|
|
176
176
|
/** @returns A runner that starts each task once the one before has settled, whether it succeeded or failed. */
|
|
177
177
|
export declare function serial(): <T>(task: () => Promise<T>) => Promise<T>;
|
|
178
|
+
/** The one queue every cart change runs through; the checkout's URL lookup waits in it too. */
|
|
179
|
+
export declare const runInOrder: <T>(task: () => Promise<T>) => Promise<T>;
|
|
178
180
|
/**
|
|
179
181
|
* Runs a cart change after the ones before it, so quick clicks never race. A failure sets the `error` status (shown by
|
|
180
182
|
* `tether-show="cart-error"` until the next change succeeds), emits `tether:cart-error` and rejects.
|
package/dist/types/src/cart.d.ts
CHANGED
|
@@ -84,7 +84,7 @@ export declare const Cart: {
|
|
|
84
84
|
*
|
|
85
85
|
* @throws {TetherError} `INVALID_DISCOUNT` (rejected) when Shopify doesn't accept the code.
|
|
86
86
|
*/
|
|
87
|
-
applyDiscount(
|
|
87
|
+
applyDiscount(typed: string): Promise<ShopifyCart | null>;
|
|
88
88
|
removeDiscount(code: string): Promise<ShopifyCart | null>;
|
|
89
89
|
/**
|
|
90
90
|
* Sets who is buying; a country changes the cart's currency and prices to that market's.
|
|
@@ -104,6 +104,12 @@ export declare function withContext(query: string, ctx?: {
|
|
|
104
104
|
country?: string | undefined;
|
|
105
105
|
language?: string | undefined;
|
|
106
106
|
}): string;
|
|
107
|
+
/**
|
|
108
|
+
* Runs `send` with a signal that aborts it, the answer's body included, after `ms` milliseconds (`0`: never), as
|
|
109
|
+
* `AbortSignal.timeout` would; Safari before 16 lacks that. A request that never settles would hold every cart change
|
|
110
|
+
* queued behind it (`enqueue`) for as long as the browser keeps the connection open.
|
|
111
|
+
*/
|
|
112
|
+
export declare function withTimeout<T>(ms: number, send: (signal: AbortSignal | null) => Promise<T>): Promise<T>;
|
|
107
113
|
/**
|
|
108
114
|
* One Storefront API request, for any config: the browser's shared one (`gql`) or one the server helpers build.
|
|
109
115
|
* Queries carry a time bucket so Shopify's cache of an identical query text is at most `maxAge` seconds old. A query
|
package/dist/types/src/dom.d.ts
CHANGED
|
@@ -33,8 +33,18 @@ export declare function setText(el: Element, value: string | number | boolean |
|
|
|
33
33
|
export declare function setTextTracked(el: HTMLElement, value: string | number | boolean | null | undefined): void;
|
|
34
34
|
/** Shows or hides `el`, restoring its own display value when shown again. */
|
|
35
35
|
export declare function show(el: HTMLElement, visible: boolean): void;
|
|
36
|
-
/**
|
|
36
|
+
/**
|
|
37
|
+
* Marks an option element as chosen: `is-selected`, the ARIA state its role takes (`chosenState`), and its own or
|
|
38
|
+
* inner radio/checkbox. An element that is no button and has no role of its own (a Webflow button is a link) gets
|
|
39
|
+
* `role="button"`, where `aria-pressed` is valid.
|
|
40
|
+
*/
|
|
37
41
|
export declare function setSelected(el: Element, selected: boolean): void;
|
|
42
|
+
/**
|
|
43
|
+
* Marks an option element the visitor can't buy: `is-unavailable`, and `aria-disabled` on the control assistive
|
|
44
|
+
* technology reads, the element itself or the radio/checkbox inside it. It stays clickable: choosing it picks the
|
|
45
|
+
* closest variant that has it.
|
|
46
|
+
*/
|
|
47
|
+
export declare function setUnavailable(el: Element, unavailable: boolean): void;
|
|
38
48
|
/**
|
|
39
49
|
* A global the page's own scripts set on `window`: `TETHER_CONFIG`, the site's config, `TETHER_INTEGRATION`, set by a
|
|
40
50
|
* framework integration (Astro) that starts Tether itself, and GSAP's `ScrollTrigger`. Another script wrote it, so it
|
|
@@ -58,6 +68,20 @@ export declare function watchImages(root: ParentNode, reason: string): void;
|
|
|
58
68
|
export declare function busy<T>(el: Element, task: () => T | Promise<T>): Promise<T | undefined>;
|
|
59
69
|
/** @returns The attribute's JSON, `null` when it is missing or not JSON (with a warning). */
|
|
60
70
|
export declare function parseJSONAttr(el: Element | null | undefined, name: string): unknown;
|
|
71
|
+
/** The integers a count attribute takes, and the value it has when it is missing or invalid. */
|
|
72
|
+
interface IntegerRange {
|
|
73
|
+
min: number;
|
|
74
|
+
max?: number;
|
|
75
|
+
fallback: number;
|
|
76
|
+
}
|
|
77
|
+
/** A whole number as text, the way attributes and quantity fields take one. */
|
|
78
|
+
export declare const INTEGER_TEXT: RegExp;
|
|
79
|
+
/**
|
|
80
|
+
* Parses a count attribute with the config's count-option rules: an integer above `max` is the site asking for as
|
|
81
|
+
* much as there is, so it gets `max`; a missing or empty attribute is `fallback`, and so, with a warning, is one that
|
|
82
|
+
* isn't an integer or is below `min`. An element warns once per attribute.
|
|
83
|
+
*/
|
|
84
|
+
export declare function integerAttribute(el: Element, name: string, { min, max, fallback }: IntegerRange): number;
|
|
61
85
|
export type AttributeValue = string | number | boolean | null | undefined;
|
|
62
86
|
/**
|
|
63
87
|
* `tether-line-attributes`, JSON the site writes: `{ a: 1 }` or `[{ key, value }]`. An array entry that isn't an
|
|
@@ -95,7 +95,7 @@ declare const publicApi: {
|
|
|
95
95
|
setNote(note: string | null | undefined): Promise<ShopifyCart | null>;
|
|
96
96
|
setAttributes(attributes: import("./cart/mutations.js").Attributes): Promise<ShopifyCart | null>;
|
|
97
97
|
setDiscountCodes(codes: string | string[] | ((current: string[]) => string[])): Promise<ShopifyCart | null>;
|
|
98
|
-
applyDiscount(
|
|
98
|
+
applyDiscount(typed: string): Promise<ShopifyCart | null>;
|
|
99
99
|
removeDiscount(code: string): Promise<ShopifyCart | null>;
|
|
100
100
|
setBuyerIdentity(buyerIdentity: {
|
|
101
101
|
countryCode?: string;
|
|
@@ -27,7 +27,7 @@ export interface SearchResults {
|
|
|
27
27
|
queries: SearchQuery[];
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
|
-
* Sets up every `[tether-search]` in `root` (and `root` itself) once.
|
|
30
|
+
* Sets up every `[tether-search]` in `root` (and `root` itself) once, and stops the boxes no longer on the page.
|
|
31
31
|
*/
|
|
32
32
|
export declare function mountSearch(root?: ParentNode & Partial<Pick<Element, 'matches'>>): void;
|
|
33
33
|
export {};
|
|
@@ -7,6 +7,8 @@ export interface Money {
|
|
|
7
7
|
amount: string;
|
|
8
8
|
currencyCode: string;
|
|
9
9
|
}
|
|
10
|
+
/** The largest `first` the Storefront API takes for a connection: a larger one fails the whole query. */
|
|
11
|
+
export declare const MAX_CONNECTION_SIZE = 250;
|
|
10
12
|
/** The `.env` names a store's domain and public Storefront token are read from, first match wins. */
|
|
11
13
|
export declare const STORE_ENV_NAMES: {
|
|
12
14
|
readonly domain: readonly ["PUBLIC_SHOPIFY_DOMAIN", "PUBLIC_SHOPIFY_STORE_DOMAIN", "SHOPIFY_DOMAIN"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "0.9.
|
|
1
|
+
export declare const VERSION = "0.9.4";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@occluze/tether",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.4",
|
|
4
4
|
"description": "Free, open-source alternative to Smootify and Storesynk (Shopyflow): Shopify products, cart and subscriptions in Webflow with HTML attributes. Optional Shopify to Webflow CMS sync.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/esm/index.js",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{f as j,g as V,h as G,i as R,m as v,n as H}from"./chunk-7CRTJV25.js";import{a as O,c as M}from"./chunk-IJAMRI33.js";import{f as q,g as F,h as P}from"./chunk-7ZXEVDOS.js";import"./chunk-BVO7KK2M.js";import{a as W}from"./chunk-2J3MTS3E.js";import"./chunk-H6IORH7O.js";import"./chunk-FWMPL6PR.js";import{C as $,D as _,F as A,H as L,a as f,m as c,n as l,p as d,t as h,w as N,y as D}from"./chunk-OATTAXPO.js";import{A as T,C as U,d as I,g as y,r as i,x as E,z as m}from"./chunk-OJAV2I3C.js";var g=null;function X(){let e=i.account?.server;if(!e)throw new f("Customer accounts need the Worker: set account.server",{code:"NOT_CONFIGURED"});return new URL(e,window.location.href).href.replace(/\/$/,"")}function B(e){e?q(O(),"1"):F(O())}async function ae(e,t){try{return await fetch(e,t)}catch(r){throw new f(`Network error: ${T(r)}`,{code:"NETWORK"})}}async function ue(e){let t;try{t=await e.json()}catch{return{}}return I(t)?t:{}}async function p(e,{method:t="GET",body:r}={}){let n={method:t,credentials:"include"};t==="POST"&&(n.headers={"Content-Type":"application/json","X-Tether-Account":"1"}),r&&(n.body=JSON.stringify(r));let s=await ae(`${X()}${e}`,n);if(s.status===401)return{kind:"logged-out"};let o=await ue(s);if(!s.ok){let u=y(o.error)??String(s.status),w=G(o.userErrors);throw new f(`Customer accounts: ${u}`,{status:s.status,...w.length>0&&{userErrors:w},...o.code==="INVALID"&&{code:"INVALID"}})}return{kind:"answer",data:o}}async function k(){if(!g){let e=await p("/me");g=e.kind==="answer"&&e.data.loggedIn===!0?{loggedIn:!0,customer:j(e.data.customer)}:{loggedIn:!1}}return B(g.loggedIn),g}var J=()=>g?.loggedIn===!0;function K(){g=null}function z(e){let t=i.account?.navigate;t?t(e):window.location.assign(e)}var de=e=>e||i.account?.locale||(i.locale||"").split("-")[0]||"";function Q({returnTo:e,locale:t}){let r=new URL(`${X()}/login`);r.searchParams.set("returnTo",e);let n=de(t);n&&r.searchParams.set("locale",n),i.country&&r.searchParams.set("country",i.country.toUpperCase()),z(r.toString())}async function Y(){let e=P.id();if(!(await k()).loggedIn||!e)return null;let t=await p("/cart",{method:"POST",body:{cartId:e}});return t.kind==="logged-out"?null:y(t.data.checkoutUrl)}async function Z(e){let t=await p("/logout",{method:"POST",body:{returnTo:e,cartId:P.id()}});g=null,B(!1),h("account-logout",{});let r=t.kind==="answer"?y(t.data.logoutUrl):null;return r?(z(r),"redirected"):"stayed"}var b=10,S=50,ee=e=>typeof e=="number"&&Number.isInteger(e)&&e>=1&&e<=S;function le(e){let t=Number.parseInt(e||String(b),10)||b;return Math.min(Math.max(t,1),S)}var me=e=>e.replace(/\?.*$/,"").replace(/^.*\//,"");function ge(e){let t=i.account?.orderUrl;if(t)return t.replaceAll("{id}",encodeURIComponent(me(e.id)));let r=e.statusPageUrl;return r!==null&&U(r)?r:null}var fe=e=>({name:e.name??"",date:_(e.processedAt),total:$(e.totalPrice),status:e.financialStatus?.toLowerCase(),fulfillment:e.fulfillmentStatus?.toLowerCase(),items:e.lineItems.nodes.map(t=>`${String(t.quantity)}\xD7 ${t.title??""}`).join(", ")});function pe(e,t){let r=t.lineItems.nodes,n=ge(t),s=fe(t);d(e,c("order-bind")).forEach(o=>{let u=l(o,"order-bind")??"";if(u==="url"){n&&o.setAttribute("href",n);return}if(u==="image"){let x=r.find(ce=>ce.image)?.image;x&&N(o,x.url,x.altText||r[0]?.title||"");return}let w=v(s,u);w!==void 0&&A(o,w)}),d(e,c("order-lines")).forEach(o=>{H(o,r,null)}),l(e,"order-bind")==="url"&&n&&e.setAttribute("href",n)}async function te(e,t){let r=d(e,c("orders")),n=r[0];if(!n)return;R(e,"show",{"orders-loading":!0,"orders-empty":!1});let s=le(l(n,"limit")),o;try{o=await t(s)}catch(u){m(u,"orders"),o=null}R(e,"show",{"orders-loading":!1,"orders-empty":o?.length===0}),r.forEach(u=>{D(u,o??[],pe)})}var we=["order","addresses","subscriptions","profile-form","address-form"],he=J;function Pe({returnTo:e=window.location.href,locale:t}={}){return new Promise(r=>{Q({returnTo:e,locale:t}),r()})}async function se(){let e=await k();return e.loggedIn?e.customer:null}async function ye({first:e=b}={}){if(!ee(e))throw new f(`Customer accounts: orders() takes first from 1 to ${String(S)}`,{code:"INVALID"});let t=await p(`/orders?${new URLSearchParams({first:String(e)}).toString()}`);return t.kind==="logged-out"?[]:V(t.data.orders)}async function Ae({returnTo:e=i.account?.logoutUrl||`${window.location.origin}/`}={}){await Z(e)==="stayed"&&await C(document)}async function ve(){try{return(await k()).loggedIn?{kind:"logged-in"}:{kind:"logged-out"}}catch(e){return{kind:"unknown",error:e}}}var re=e=>we.some(t=>d(e,c(t)).length>0);function ke(e){d(e,c("account-link")).forEach(t=>{t.setAttribute("href",be(l(t,"account-link")))})}function be(e){let t=i.account,r=`https://${i.domain}/account`;return e==="payment"?t?.paymentUrl||t?.subscriptionsUrl||r:e==="subscriptions"&&t?.subscriptionsUrl||r}async function C(e=document){let t=await ve();t.kind==="unknown"&&m(t.error,"account");let r=t.kind==="logged-in";if(d(e,c("show")).forEach(n=>{let s=l(n,"show");s==="logged-in"&&L(n,r),s==="logged-out"&&L(n,!r)}),ke(e),t.kind==="unknown"&&re(e)){(await a()).showUnavailable(e);return}r&&(await ie(e),await Promise.all([te(e,n=>ye({first:n})),re(e)?a().then(n=>n.renderPages(e)):null]))}async function ie(e){let t=d(e,c("account-bind"));if(!t.length)return;let r;try{r=await se()}catch(s){m(s,"account");return}if(!r)return;let n={"first-name":r.firstName,"last-name":r.lastName,name:r.displayName,email:r.emailAddress?.emailAddress,address:r.defaultAddress?.formatted.join(", ")};t.forEach(s=>{let o=v(n,l(s,"account-bind")??"");o!=null&&A(s,o)})}var ne=null;function a(){return ne??(ne=W("account-pages").then(e=>(e.setup({serverFetch:p,customer:se,bindCustomer:ie,reset:K}),e))),ne}var Ye=e=>a().then(t=>t.order(e)),Ze=e=>a().then(t=>t.updateProfile(e)),et=()=>a().then(e=>e.addresses()),tt=(e,t)=>a().then(r=>r.saveAddress(e,t)),rt=e=>a().then(t=>t.deleteAddress(e)),nt=()=>a().then(e=>e.subscriptions()),ot=(e,t)=>a().then(r=>r.subscriptionAction(e,t)),st=(e,t)=>a().then(r=>r.requestReturn(e,t));function Se(e){let t=e.target;t instanceof window.Element&&(t.closest(c("account-login"))?(e.preventDefault(),Pe().catch(r=>{m(r,"login")})):t.closest(c("account-logout"))&&(e.preventDefault(),Ae().catch(r=>{m(r,"logout")})))}function xe(){let e=new URL(window.location.href),t=e.searchParams.get("account");if(M(t))switch(e.searchParams.delete("account"),window.history.replaceState(window.history.state,"",e),t){case"in":h("account-login",{});break;case"expired":case"error":h("account-error",{error:t});break}}var oe=!1;async function it(e=document){if(oe){await C(e);return}oe=!0,document.addEventListener("click",Se),xe(),P.setCheckoutResolver(Y),await C(e),E("account",he()?"logged in":"logged out")}export{et as addresses,se as customer,rt as deleteAddress,he as isLoggedIn,Pe as login,Ae as logout,it as mountAccount,Ye as order,ye as orders,C as render,st as requestReturn,tt as saveAddress,ot as subscriptionAction,nt as subscriptions,Ze as updateProfile};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e={diagnose:()=>import("./diagnose-XSZPWEG7.js"),markets:()=>import("./markets-ui-DEEYV4KT.js"),search:()=>import("./search-A6HF5PMJ.js"),lists:()=>import("./lists-OJGSVQMM.js"),extras:()=>import("./extras-DZIOTZ3H.js"),account:()=>import("./account-XBGNTM7V.js"),"account-pages":()=>import("./account-pages-FIXSWJH7.js"),analytics:()=>import("./analytics-MO2ZWBOD.js")},a=t=>e[t](),o=void 0;export{a,o as b};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as n}from"./chunk-2J3MTS3E.js";import{g as r}from"./chunk-CRKJ2VEX.js";import{m as e}from"./chunk-OATTAXPO.js";import{z as i}from"./chunk-OJAV2I3C.js";var d=()=>`${e("collection")},${e("products")},${e("recommendations")}`;function a(t){return r(t,"loading"),{root:t,load:()=>n("lists").then(o=>o.loadList(t)).catch(o=>{r(t,"error",o),i(o,"lists")})}}export{d as a,a as b};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as Pt,d as Q,e as kt}from"./chunk-BVO7KK2M.js";import{c as Et}from"./chunk-H6IORH7O.js";import{b as Z,d as R}from"./chunk-FWMPL6PR.js";import{A as W,C as v,D as vt,E as At,F as g,G as k,H as M,K as Lt,P as D,a as b,c as q,d as H,h as V,k as ht,l as L,m as s,n as f,o as yt,p as d,t as y,v as bt,w as P,x as St,y as T,z as wt}from"./chunk-OATTAXPO.js";import{C as Ct,r as l,x as gt,z as w}from"./chunk-OJAV2I3C.js";var ne={id:"string",quantity:"number",attributes:["object"],cost:{totalAmount:R,subtotalAmount:R,amountPerQuantity:R},merchandise:{id:"string",selectedOptions:["object"],product:"object"}},tt={id:"string",checkoutUrl:"string",totalQuantity:"number",attributes:["object"],discountCodes:["object"],cost:{totalAmount:R,subtotalAmount:R},lines:{nodes:[ne]}};var re='a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex="-1"])',ie=60,et=!1,K=null,oe=t=>t!==null&&"focus"in t,It=t=>d(t,re).filter(e=>e.offsetParent!==null||e===document.activeElement),$=()=>d(document,s("cart-drawer")),nt=t=>t.classList.contains(l.cartDrawerOpenClass);function S(){let t=$();return t.length?t.some(nt):et}function j(t){d(document,s("cart-open")).forEach(e=>{e.setAttribute("aria-expanded",String(t))}),$().forEach(e=>{e.hasAttribute("role")||e.setAttribute("role","dialog"),!e.hasAttribute("aria-label")&&!e.hasAttribute("aria-labelledby")&&e.setAttribute("aria-label",f(e,"cart-label")||"Cart"),e.setAttribute("aria-modal",String(t)),!nt(e)&&(e.setAttribute("aria-hidden","true"),l.cartFocus&&(e.inert=!0))})}function ae(t){let e=It(t)[0]??t;e===t&&!t.hasAttribute("tabindex")&&(t.tabIndex=-1),e.focus({preventScroll:!0})}function B(){if(S())return;et=!0;let t=$().filter(n=>f(n,"cart-drawer")!=="manual");t.forEach(n=>{n.inert=!1,n.classList.add(l.cartDrawerOpenClass),n.setAttribute("aria-hidden","false")}),j(!0);let[e]=t;l.cartFocus&&e&&(K=oe(document.activeElement)?document.activeElement:null,setTimeout(()=>{ae(e)},ie)),l.onCartOpen?.(t),y("cart-toggled",{open:!0})}function rt(){if(!S())return;et=!1;let t=$(),e=t.some(n=>n.contains(document.activeElement));t.forEach(n=>{n.classList.remove(l.cartDrawerOpenClass),n.setAttribute("aria-hidden","true"),l.cartFocus&&(n.inert=!0)}),j(!1),e&&K?.isConnected&&K.focus({preventScroll:!0}),K=null,l.onCartClose?.(t),y("cart-toggled",{open:!1})}function xt(){S()?rt():B()}function se(t){if(t.key!=="Tab"||!l.cartFocus||!S())return;let e=$().find(nt);if(!e)return;let n=It(e),r=n[0],i=n.at(-1);if(!r||!i)return;let o=document.activeElement,a=t.shiftKey?o===r:o===i;e.contains(o)&&!a||(t.preventDefault(),(t.shiftKey?i:r).focus())}var ue=/^image:(\d+)$/,Tt="metafield:",ce=/^(rich_text|multi_line_text)_field$/,le=["","true","all","*"],ot=t=>t.tagName==="SELECT",it=(t,e)=>t.$(`select${e}`).filter(ot);function de(t,e){let n=e.images.nodes,r=[...t.children].map(o=>o.tagName==="IMG"?o:o.querySelector("img"));!St(t)&&r.length===n.length&&r.every((o,a)=>bt(o?.getAttribute("src"),n[a]?.url))||T(t,n,(o,a)=>{let u=o.matches(`img,${s("bind","image")}`)?o:d(o,"img")[0]??o;P(u,a.url,a.altText||e.title)})}function me(t,e,n){let r=n.indexOf("."),i=n.slice(0,r),o=n.slice(r+1),a=(e.metafields??[]).find(c=>c?.namespace===i&&c.key===o);if(!a){g(t,"");return}let u=a.reference?.image;if(u){P(t,u.url,u.altText);return}ce.test(a.type)&&(t.style.whiteSpace="pre-line"),g(t,a.value)}var pe=new Map(Object.entries({title:t=>t.title,"description-text":t=>t.description,vendor:t=>t.vendor,type:t=>t.productType,handle:t=>t.handle,"published-at":t=>vt(t.publishedAt),"min-price":t=>v(t.priceRange.minVariantPrice),"max-price":t=>v(t.priceRange.maxVariantPrice)}));function fe(t,e){let n=(t.getAttribute("exclude")??"").split(",").map(i=>i.trim()).filter(Boolean),r=e.tags.filter(i=>!n.includes(i));T(t,r,(i,o)=>{g(i,o)})}function ge(t,e,n){let r=pe.get(e);if(r){g(t,r(n));return}switch(e){case"description":At(t,n.descriptionHtml);break;case"featured-image":P(t,n.featuredImage?.url,n.featuredImage?.altText||n.title);break;case"url":case"link":{let i=W(n.handle,n.id);i&&t.setAttribute("href",i),e==="url"&&!t.firstElementChild&&!t.textContent.trim()&&g(t,n.title);break}case"images":de(t,n);break;case"tags":fe(t,n);break;default:he(t,e,n)}}function he(t,e,n){let r=ue.exec(e);if(r){let i=n.images.nodes[Number(r[1])-1]??n.featuredImage;P(t,i?.url,i?.altText||n.title)}else e.startsWith(Tt)&&me(t,n,e.slice(Tt.length))}function ye(t){let{product:e}=t;t.$(s("option-list")).forEach(n=>{let r=t.optName(f(n,"option-list")),i=e.options.find(o=>o.name===r);if(!i||i.optionValues.length<=1&&yt(n,"hide-single")){M(n,!1);return}T(n,i.optionValues,(o,a)=>{o.setAttribute(L("option-value"),a.name);let u=d(o,s("bind","option-value"))[0];u?g(u,a.name):o.firstElementChild||g(o,a.name);let c=d(o,s("bind","swatch"))[0],{swatch:p}=a;!c||!p||(p.color&&(c.style.backgroundColor=p.color),p.image?.previewImage&&P(c,p.image.previewImage.url,a.name))})})}function Ce(t){let{product:e}=t;it(t,s("option")).forEach(n=>{let r=e.options.find(i=>i.name===t.optName(f(n,"option")));if(!r){M(n,!1);return}n.replaceChildren(...r.optionValues.map(i=>new Option(i.name,i.name)))}),it(t,s("variant-select")).forEach(n=>{n.replaceChildren(...e.variants.nodes.map(r=>new Option(r.title,r.id)))}),it(t,s("plan")).forEach(n=>{let r=t.plans.map(a=>new Option(a.name,a.id)),i=!e.requiresSellingPlan&&f(n,"plan")!=="subscription-only",o=n.getAttribute(L("one-time-label"))||"One-time purchase";n.replaceChildren(...i?[new Option(o,"")]:[],...r)})}function be(t){t.$(s("plan-list")).forEach(e=>{let n=(f(e,"plan-list")??"").trim(),r=le.includes(n.toLowerCase())?null:n,i=t.plans.filter(o=>!r||o.group.name===r);T(e,i,(o,a)=>{o.setAttribute(L("plan-value"),a.id),!o.firstElementChild&&!o.querySelector(s("plan-bind"))&&g(o,a.name)})})}function Xe(t){t.$(s("bind")).forEach(e=>{ge(e,f(e,"bind")??"",t.product)}),ye(t),Ce(t),be(t)}var Mt="Default Title",at=(t,e)=>e.get(t.id)?.quantity??t.quantity,$t=t=>t.split("/").pop()??t;function Se(t){let e=t.merchandise,n=W(e.product.handle,e.product.id);if(!n)return null;let r=new URLSearchParams;r.set("variant",$t(e.id));let i=t.sellingPlanAllocation?.sellingPlan.id;return i&&r.set("selling_plan",$t(i)),`${n}${n.includes("?")?"&":"?"}${r.toString()}`}var Ot=t=>t.merchandise.product.title,Rt={title:Ot,"product-title":Ot,"variant-title":t=>t.merchandise.title===Mt?"":t.merchandise.title,options:t=>t.merchandise.selectedOptions.filter(e=>e.value!==Mt).map(e=>`${e.name}: ${e.value}`).join(", "),vendor:t=>t.merchandise.product.vendor,sku:t=>t.merchandise.sku??"",price:t=>v(t.cost.amountPerQuantity),"compare-at-price":t=>v(t.cost.compareAtAmountPerQuantity??t.merchandise.compareAtPrice),"line-total":t=>v(t.cost.totalAmount),"line-subtotal":t=>v(t.cost.subtotalAmount),quantity:(t,e)=>at(t,e.pending),plan:t=>t.sellingPlanAllocation?.sellingPlan.name??"","plan-description":t=>t.sellingPlanAllocation?.sellingPlan.description??"",components:t=>(t.lineComponents??[]).map(e=>`${e.quantity} \xD7 ${e.merchandise.product.title}`).join(", ")},Ut="attribute:";function we(t,e,n){if(Object.hasOwn(Rt,e))return Rt[e]?.(t,n);if(!e.startsWith(Ut))return;let r=e.slice(Ut.length);return t.attributes.find(i=>i.key===r)?.value??""}function ve(t,e,n){let r=kt(n),i=!n.requiresSellingPlan&&f(t,"line-plan")!=="subscription-only",o={value:"",label:t.getAttribute(L("one-time-label"))||"One-time purchase"},a=[...i?[o]:[],...r.map(c=>({value:c.id,label:c.name}))],u=a.map(c=>c.value).join("|");t.dataset.tetherSig!==u&&(t.replaceChildren(...a.map(c=>{let p=document.createElement("option");return p.value=c.value,p.textContent=c.label,p})),t.dataset.tetherSig=u),t.value=e.sellingPlanAllocation?.sellingPlan.id??"",M(t,r.length>0)}function Ae(t,e,n){let r=!!e.sellingPlanAllocation;t.classList.toggle("is-subscription",r);let i=n.warnings.find(u=>u.target===e.id);t.classList.toggle("is-warning",!!i);let o=n.pending.has(e.id);t.classList.toggle("is-busy",o),o?t.setAttribute("aria-busy","true"):t.removeAttribute("aria-busy"),d(t,s("line","warning")).forEach(u=>{k(u,i?.message??"")});let a=new Map([["subscription",r],["one-time",!r],["on-sale",Pt(e.cost.compareAtAmountPerQuantity?.amount,e.cost.amountPerQuantity.amount)],["has-components",(e.lineComponents??[]).length>0],["warning",!!i]]);d(t,s("line-show")).forEach(u=>{let c=f(u,"line-show"),p=c===null?void 0:a.get(c);p!==void 0&&M(u,p)})}function Le(t,e,n){let r=e.merchandise;t.setAttribute(L("line-id"),e.id),d(t,s("line")).forEach(o=>{let a=f(o,"line")??"";if(a==="image"){P(o,r.image?.url??r.product.featuredImage?.url,r.product.title);return}if(a==="url"){let c=Se(e);c&&o.setAttribute("href",c);return}let u=we(e,a,n);u!==void 0&&k(o,u)}),Ae(t,e,n),d(t,s("line-plan")).filter(ot).forEach(o=>{Et(r.product.handle).then(a=>{ve(o,e,a)}).catch(a=>{w(a,"line plan options")})})}function Pe(t,e){let n=t?.totalQuantity??0,r=(t?.lines.nodes??[]).some(o=>o.sellingPlanAllocation),i=new Map([["cart-empty",n===0],["cart-filled",n>0],["cart-has-subscription",r],["cart-no-subscription",!r],["cart-has-discount",(t?.discountCodes??[]).some(o=>o.applicable)],["cart-error",e.failed],["cart-warning",e.warnings.length>0]]);d(document,s("show")).forEach(o=>{let a=f(o,"show"),u=a===null?void 0:i.get(a);u===void 0||o.closest(s("product"))||M(o,u)}),d(document,s("checkout")).forEach(o=>{o.classList.toggle("is-disabled",!n),o.setAttribute("aria-disabled",String(!n))})}function ke(t){d(document,`textarea${s("cart-note")},input${s("cart-note")}`).forEach(e=>{document.activeElement!==e&&g(e,t?.note??"")}),d(document,s("cart-discounts")).forEach(e=>{T(e,t?.discountCodes??[],(n,r)=>{n.setAttribute(L("discount-code"),r.code);let i=n.querySelector(s("discount","code"))??(n.firstElementChild?null:n);i&&g(i,r.code),n.classList.toggle("is-inapplicable",!r.applicable)})})}function qt(t){let{cart:e}=t,n=r=>e?v(e.cost[r]):"";j(S()),d(document,s("cart-count")).forEach(r=>{k(r,e?.totalQuantity??0)}),d(document,s("cart-subtotal")).forEach(r=>{k(r,n("subtotalAmount"))}),d(document,s("cart-total")).forEach(r=>{k(r,n("totalAmount"))}),d(document,s("cart-checkout-charge")).forEach(r=>{k(r,n("checkoutChargeAmount"))}),Pe(e,t),d(document,s("cart-warning")).forEach(r=>{k(r,[...new Set(t.warnings.map(i=>i.message))].join(" "))}),ke(e),d(document,s("cart-lines")).forEach(r=>{wt(r,e?.lines.nodes??[],i=>i.id,(i,o)=>{Le(i,o,t)},{onEnter:l.onLineEnter,onLeave:l.onLineLeave})}),e&&Lt("cart")}function Dt(t){d(document,s("cart-count")).forEach(e=>{/^\s*0?\s*$/.test(e.textContent)&&(e.textContent=String(t))})}function st(t,e="localStorage"){try{return window[e].getItem(t)}catch{return null}}function ut(t,e,n="localStorage"){try{window[n].setItem(t,e)}catch{}}function Qt(t,e="localStorage"){try{window[e].removeItem(t)}catch{}}var Nt=/^gid:\/\/shopify\/Cart\/[\w-]+(\?key=[\w-]+)?$/;var h={kind:"unknown"},U=[],O=new Map,G=()=>h;function m(){switch(h.kind){case"ready":case"error":return h.cart;case"unknown":case"empty":return null}}var Ft=()=>U,ct=t=>t?{kind:"ready",cart:t}:{kind:"empty"},Ht=()=>`${l.storageKey}:seen`;function E(){let t=st(l.storageKey);return t?Nt.test(t)?t:(I(),null):null}function I(){Qt(l.storageKey)}function lt(t){h=ct(t),t&&ut(l.storageKey,t.id)}function N(){qt({cart:m(),warnings:U,pending:O,failed:h.kind==="error"})}function _(t){N(),y("cart-updated",{cart:m(),reason:t})}function C(t,e){return lt(t),ut(Ht(),`${Date.now()}|${t?.totalQuantity??0}`),_(e),t}function F(t){h=t.kind==="loaded"?ct(t.cart):{kind:"error",error:t.error,cart:null},_("load")}function Ee(){let t=st(Ht())?.split("|")[1]??"",e=Number(t);return/^\d+$/.test(t)&&Number.isSafeInteger(e)?e:null}function Vt(){if(h.kind!=="unknown")return;let t=Ee();t!==null&&Dt(t)}function Wt(t){U=t.filter((e,n)=>t.findIndex(r=>r.message===e.message)===n).map(e=>({...e,message:l.warningText?.(e)||e.message})),U.length&&y("cart-warning",{warnings:U})}var _t=()=>{};function Ie(){let t=Promise.resolve();return e=>{let n=t.then(e);return t=n.then(_t,_t),n}}var xe=Ie();function Kt(t){return xe(t).then(e=>(h.kind==="error"&&(h=ct(h.cart),N()),e),e=>{throw h={kind:"error",error:e,cart:m()},N(),y("cart-error",{error:e}),e})}var dt=t=>at(t,O),Te=()=>({open:S(),count:m()?.totalQuantity??0,loaded:h.kind!=="unknown",warnings:[...U]});function jt(t){let e=["cart-updated","cart-toggled"].map(r=>`${l.prefix}:${r}`),n=()=>{t(m(),Te())};return e.forEach(r=>{document.addEventListener(r,n)}),n(),()=>{e.forEach(r=>{document.removeEventListener(r,n)})}}var Me=/does not exist|not found|invalid id/i,$e=t=>H({[t]:q({cart:q(tt)})});function X(t){return t instanceof b?t.userErrors?.some(e=>e.field?.[0]==="cartId")?!0:(t.errors??[]).some(e=>Me.test(e.message)):!1}function Gt(t){if(!(t instanceof b))return!1;let{code:e,status:n=0}=t;return e==="NETWORK"||e==="INVALID_RESPONSE"||e==="SERVER_ERROR"||n>=500}function Xt(t,e=1,n={}){let r=typeof t=="object"&&t!==null?t:{...n,quantity:e,...t==null?{}:{variantId:t}},i=Q.variant(r.merchandiseId||r.variantId||r.id);if(!i)throw new b("add(): variantId is required");let o=parseInt(String(r.quantity??1),10),a={merchandiseId:i,quantity:Math.max(1,o||1)},u=Q.sellingPlan(r.sellingPlanId||r.sellingPlan);u&&(a.sellingPlanId=u);let c=D(r.attributes);return c.length&&(a.attributes=c),a}function Oe(t,e,n){return r=>`mutation Tether_${t}(${e}){${t}(${n}){cart{...TetherCart}userErrors{field message}warnings{code message target}}}${Z(r)}`}async function Yt(t,e,n,r){let i=await V(Oe(t,e,n),r,$e(t),{operation:"mutation"}),o=ht(i[t],t);return Wt(o.warnings??[]),o.cart}function Bt(t){let e=l.country?{buyerIdentity:{countryCode:l.country},...t}:t;return Yt("cartCreate","$input: CartInput!","input: $input",{input:e})}async function x({name:t,args:e,inner:n,variables:r,createInput:i}){let o=E();if(!o)return i?Bt(i):null;try{return await Yt(t,`$cartId: ID!, ${e}`,`cartId: $cartId, ${n}`,{...r,cartId:o})}catch(a){if(!X(a)||(I(),!i))throw a;return gt("cart expired, creating a new one"),Bt(i)}}async function mt(t){return(await V(n=>`query TetherCart($id:ID!){cart(id:$id){...TetherCart}}${Z(n)}`,{id:t},H({cart:q(tt)}))).cart}async function zt(t){return(await V("query TetherCheckout($id:ID!){cart(id:$id){checkoutUrl}}",{id:t},H({cart:q({checkoutUrl:"string"})}))).cart?.checkoutUrl??null}function Jt(t,e){let n=typeof e=="number"?{quantity:e}:e,r={id:t};n.quantity!==void 0&&(r.quantity=n.quantity),"sellingPlanId"in n&&(r.sellingPlanId=n.sellingPlanId?Q.sellingPlan(n.sellingPlanId):null),n.attributes&&(r.attributes=D(n.attributes));let i=n.merchandiseId||n.variantId;return i&&(r.merchandiseId=Q.variant(i)),r}var pt=t=>x({name:"cartLinesUpdate",args:"$lines: [CartLineUpdateInput!]!",inner:"lines: $lines",variables:{lines:t},createInput:null}),Y=t=>x({name:"cartLinesRemove",args:"$lineIds: [ID!]!",inner:"lineIds: $lineIds",variables:{lineIds:t},createInput:null}),Zt=(t,e)=>e>0?pt([{id:t,quantity:e}]):Y([t]);var ft=null;function te(t){ft=t}var Re=t=>zt(t).then(e=>({kind:"url",url:e}),e=>({kind:"failed",error:e}));async function Ue(){if(!ft)return null;try{let t=await ft();return t&&`${t}${t.includes("?")?"&":"?"}logged_in=true`}catch(t){return w(t,"account checkout"),null}}async function qe(t){let e=Re(t),n=await Ue();if(n)return n;let r=await e;if(r.kind==="failed")throw r.error;if(!r.url)throw new b("No checkoutUrl (cart empty or expired)");return r.url}function De(t){try{t.opener=null}catch{}}async function ee(t=l.checkoutTarget){let e=E(),n=m();if(!e||n&&!n.totalQuantity)return null;let r=t==="_blank"?window.open("","_blank"):null;r&&De(r);try{let i=await qe(e);if(!Ct(i))throw new b("The checkout URL is not https: not opened");return y("checkout",{url:i,cart:m()}),r&&!r.closed?r.location.href=i:window.location.href=i,i}catch(i){return r?.close(),w(i,"checkout failed"),null}}var J=()=>m()?.lines.nodes??[];async function Qe(){let t=E();if(t)try{let e=await mt(t);e||I(),C(e,"load")}catch(e){w(e,"cart reload after a failed change")}}function A(t){return Kt(()=>t().catch(async e=>{throw Gt(e)&&await Qe(),e}))}function Ne(t,e){let n=J().find(u=>u.id===t);if(!n)return Promise.resolve(m());let r=Math.max(0,dt(n)+e),i={quantity:r};O.set(t,i),_("pending");let o=()=>O.get(t)===i;return A(async()=>{if(!o())return m();if(J().find(p=>p.id===t)?.quantity===r)return m();let c=await Zt(t,r);return o()?C(c,r>0?"update":"remove"):(lt(c),c)}).finally(()=>{o()&&(O.delete(t),_("settled"))})}function _e(t){let e=(m()?.discountCodes??[]).map(r=>r.code),n=typeof t=="function"?t(e):t;return(Array.isArray(n)?n:[n]).map(r=>r.trim()).filter(Boolean)}function Fe(t){let e=new Map((m()?.attributes??[]).map(n=>[n.key,n.value]));return D(t).forEach(n=>e.set(n.key,n.value)),[...e].filter(([,n])=>n!=="").map(([n,r])=>({key:n,value:r}))}async function He(){let t=E();if(!t)return F({kind:"loaded",cart:null}),null;Vt();try{let e=await mt(t);e||I(),F({kind:"loaded",cart:e})}catch(e){w(e,"cart load failed"),X(e)&&I(),F({kind:"failed",error:e})}return m()}var z={init:He,id:E,get status(){return G()},get state(){return m()},get lines(){return[...J()]},get count(){return m()?.totalQuantity??0},get loaded(){return G().kind!=="unknown"},get lastError(){let t=G();return t.kind!=="error"?null:t.error instanceof Error?t.error:new Error(String(t.error))},get warnings(){return[...Ft()]},get pendingQty(){return O},setCheckoutResolver:te,forgetSaved(){I(),F({kind:"loaded",cart:null})},render:N,subscribe:jt,add(t,e=1,n={}){let r=(Array.isArray(t)?t:[t]).map(i=>Xt(i,e,n));return A(async()=>{let i=await x({name:"cartLinesAdd",args:"$lines: [CartLineInput!]!",inner:"lines: $lines",variables:{lines:r},createInput:{lines:r}});if(!i)throw new b("Shopify answered the add without a cart");return C(i,"add"),y("added",{cart:i,lines:r}),l.openCartOnAdd&&B(),i})},updateLine(t,e){let n=typeof e=="number"?e:e.quantity;if(n!==void 0&&n<=0)return z.removeLine(t);let r=Jt(t,e);return A(async()=>C(await pt([r]),"update"))},changeQuantity:Ne,quantityOf:dt,removeLine(t){let e=Array.isArray(t)?t:[t];return A(async()=>C(await Y(e),"remove"))},clear(){return A(async()=>{let t=J().map(e=>e.id);return t.length?C(await Y(t),"remove"):m()})},setNote(t){let e={note:t??""};return A(async()=>C(await x({name:"cartNoteUpdate",args:"$note: String!",inner:"note: $note",variables:e,createInput:e}),"note"))},setAttributes(t){return A(async()=>{let e={attributes:Fe(t)},n=await x({name:"cartAttributesUpdate",args:"$attributes: [AttributeInput!]!",inner:"attributes: $attributes",variables:e,createInput:e});return C(n,"attributes")})},setDiscountCodes(t){return A(async()=>{let e={discountCodes:_e(t)},n=await x({name:"cartDiscountCodesUpdate",args:"$discountCodes: [String!]!",inner:"discountCodes: $discountCodes",variables:e,createInput:e});return C(n,"discount")})},async applyDiscount(t){let e=await z.setDiscountCodes(i=>[...new Set([...i,t])]),n=t.toLowerCase();if((e?.discountCodes??[]).find(i=>i.code.toLowerCase()===n)?.applicable)return e;try{await z.removeDiscount(t)}catch(i){w(i,"removing a discount code Shopify refused")}throw new b(`Discount code not valid: ${t}`,{code:"INVALID_DISCOUNT"})},removeDiscount(t){let e=t.toLowerCase();return z.setDiscountCodes(n=>n.filter(r=>r.toLowerCase()!==e))},setBuyerIdentity(t,{create:e=!0}={}){return A(async()=>{let n=await x({name:"cartBuyerIdentityUpdate",args:"$buyerIdentity: CartBuyerIdentityInput!",inner:"buyerIdentity: $buyerIdentity",variables:{buyerIdentity:t},createInput:e?{buyerIdentity:t}:null}).catch(r=>{if(e||!X(r))throw r;return null});return C(n,"buyer-identity")})},checkout:ee,drawers:$,isOpen:S,open:B,close:rt,toggle:xt};export{se as a,ot as b,it as c,Xe as d,st as e,ut as f,Qt as g,z as h};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{b as Q,c as y,d as j,h as J}from"./chunk-7ZXEVDOS.js";import{a as T,b as K,c as A,d as M,e as W,f as X,g as Y,h as _,i as z}from"./chunk-DM5LEAWM.js";import{d as D,e as V,f as E,k as G}from"./chunk-BVO7KK2M.js";import{c as N,f as Z}from"./chunk-CRKJ2VEX.js";import{B as C,C as H,F as h,H as O,I as P,K as k,L as F,M as R,N as U,O as B,l as m,m as s,n as l,o as x,p as b,q as w,t as f,w as $}from"./chunk-OATTAXPO.js";import{b as p,r as I,z as L}from"./chunk-OJAV2I3C.js";var tt={money:H,percent:C},lt=e=>e.tagName==="INPUT";function q(e){let t=b(e,s("add-label"))[0]??e,n=t.dataset.tetherLabel??(lt(t)?t.value:t.textContent);return t.dataset.tetherLabel=n,{label:t,original:n}}function ct(e,t){let{product:n}=e,i=r=>t.selected[e.optName(r)]??"";e.$(s("option-selected")).forEach(r=>{h(r,i(l(r,"option-selected")))}),e.$(s("option-list")).forEach(r=>{let a=e.optName(l(r,"option-list"));b(r,s("option-value")).forEach(o=>{let c=l(o,"option-value")??"";P(o,t.selected[a]===c);let u=!K(n,t.selected,a,c);o.classList.toggle("is-unavailable",u),o.setAttribute("data-unavailable",u?"true":"false")})}),y(e,s("option")).forEach(r=>{r.value=i(l(r,"option"))}),y(e,s("variant-select")).forEach(r=>{r.value=t.variant.id})}function ut(e,t){let{variant:n,purchase:i,line:r}=t;e.$(s("purchase")).forEach(a=>{if(Q(a)){a.value=i.kind;return}let o=l(a,"purchase");P(a,o===i.kind);let c=o==="subscription"?!t.subscriptionAvailable:e.product.requiresSellingPlan;a.classList.toggle("is-unavailable",c)}),e.$(s("plan-value")).forEach(a=>{let o=l(a,"plan-value")??"";P(a,r.kind==="subscription"&&o===r.planId),a.classList.toggle("is-unavailable",!E(n,o));let c=e.plans.find(d=>d.id===o),u=z(n,o,c,tt);b(a,s("plan-bind")).forEach(d=>{let v=u.get(l(d,"plan-bind")??"");v&&h(d,v())})}),y(e,s("plan")).forEach(a=>{a.value=r.kind==="subscription"?r.planId:""})}function dt(e,t){let n=new Map(Object.entries(t.show));N.forEach(i=>n.set(i,i==="ready")),e.$(s("show")).forEach(i=>{let r=l(i,"show")??"",a=n.get(r);a!==void 0&&(N.some(o=>o===r)&&!Z(i,e.root)||O(i,a))})}function ht(e,t){let n=!t.variant.availableForSale;e.$(s("add-to-cart")).forEach(i=>{i.classList.toggle("is-disabled",n),i.setAttribute("aria-disabled",String(n)),"disabled"in i&&(i.disabled=n);let r=l(i,"soldout-text"),a=l(i,"subscribe-text");if(!r&&!a)return;let{label:o,original:c}=q(i),u=c;t.line.kind==="subscription"&&a&&(u=a),n&&r&&(u=r),i.getAttribute("aria-busy")!=="true"&&h(o,u)})}function et(e,t){let{variant:n}=t,{product:i}=e,r=_(t,tt);e.$(s("bind")).forEach(a=>{let o=l(a,"bind")??"";if(o==="variant-image"){$(a,n.image?.url||i.featuredImage?.url,n.image?.altText||i.title);return}let c=r.get(o);c&&h(a,c())}),ct(e,t),ut(e,t),dt(e,t),e.root.classList.toggle("is-subscription",t.line.kind==="subscription"),e.root.setAttribute(m("purchase-mode"),t.line.kind),ht(e,t)}var it=()=>s("product"),pt=e=>e.tagName==="INPUT"||e.tagName==="SELECT"||e.tagName==="TEXTAREA",nt=e=>e instanceof window.Element;function g(e,t,n){let i=t.closest(n);return i?.closest(it())===e.root?i:null}function mt(e,t){let{label:n,original:i}=q(t),r=l(t,"adding-text");R(t,async()=>{r&&h(n,r);try{await e.addToCart()}catch(a){L(a,"add to cart failed"),f("error",{error:a,context:"add-to-cart"},e.root)}finally{r&&h(n,i)}}).then(()=>{e.renderVariant()}).catch(a=>{L(a,"add to cart render")})}function ft(e,t,n){let i=g(e,n,s("option-value")),r=i?.closest(s("option-list"));if(i&&r){t.preventDefault(),e.select(e.optName(l(r,"option-list")),l(i,"option-value")??"");return}let a=g(e,n,s("plan-value"));if(a){t.preventDefault(),e.selectPlan(l(a,"plan-value"));return}let o=g(e,n,`${s("purchase")}:not(select)`);if(o){o.tagName!=="INPUT"&&t.preventDefault(),e.setPurchase(rt(l(o,"purchase")));return}let c=g(e,n,s("qty-plus")),u=c?null:g(e,n,s("qty-minus"));if(c||u){t.preventDefault(),e.setQuantity(e.quantity+(c?1:-1));return}let d=g(e,n,s("add-to-cart"));d&&(t.preventDefault(),mt(e,d))}var rt=e=>e==="subscription"?"subscription":"one-time";function vt(e,t){let n=pt(t)?t.value:"";t.matches(`select${s("option")}`)?e.select(e.optName(l(t,"option")),n):t.matches(`select${s("variant-select")}`)?e.selectVariant(n):t.matches(`select${s("plan")}`)?n?e.selectPlan(n):e.setPurchase("one-time"):t.matches(`select${s("purchase")}`)?e.setPurchase(rt(n)):t.matches(s("qty"))&&e.setQuantity(n)}function at(e){e.root.addEventListener("click",t=>{nt(t.target)&&ft(e,t,t.target)}),e.root.addEventListener("change",t=>{let{target:n}=t;nt(n)&&n.closest(it())===e.root&&vt(e,n)})}var gt=new WeakMap,bt=()=>s("product"),S=new Map;function Pt(e){e.forEach(t=>{S.has(t.handle)||S.set(t.handle,t.options.map(n=>n.name))})}var st=e=>e.tagName==="INPUT",Et=e=>e.tagName==="INPUT"||e.tagName==="SELECT"||e.tagName==="TEXTAREA";function yt(e){return st(e)&&e.type==="checkbox"?e.checked?e.value&&e.value!=="on"?e.value:"Yes":null:st(e)&&e.type==="radio"?e.checked?e.value:null:Et(e)&&e.value||null}var ot=class{constructor(t,n){p(this,"root");p(this,"product");p(this,"plans");p(this,"selected");p(this,"purchase");p(this,"variant");p(this,"quantity");this.root=t,this.product=n,this.plans=V(n);let i=new URLSearchParams(window.location.search),r=X(n,{variant:i.get("variant")||l(t,"variant"),sellingPlan:i.get("selling_plan"),defaultPlan:l(t,"default-plan"),defaultPurchase:l(t,"default-purchase")||I.defaultPurchase});this.selected=r.selected,this.purchase=r.purchase,this.variant=null,this.quantity=x(t,"quantity")?Math.max(0,parseInt(l(t,"quantity")??"",10)||0):1,gt.set(t,this),t.setAttribute(m("state"),"ready"),t.removeAttribute(m("error")),this.renderProduct(),at(this),this.renderVariant(),F(t,"product"),k("product"),f("product-ready",{product:n,scope:this},t)}update(t){let n=this.variant?.id;this.product=t,this.plans=V(t);let i=t.variants.nodes.find(r=>r.id===n);i&&(this.selected=T(i)),this.root.setAttribute(m("state"),"ready"),this.root.removeAttribute(m("error")),this.renderProduct(),this.renderVariant(),k("product"),f("product-updated",{product:t,scope:this},this.root)}$(t){let n=w(this.root,t,bt());return this.root.matches(t)?[this.root,...n]:n}optName(t){if(!t)return"";let{options:n}=this.product;if(n.some(r=>r.name===t))return t;let i=(S.get(this.product.handle)??[]).indexOf(t);return n[i]?.name??t}get plan(){let t=A(this.purchase);return this.plans.find(n=>n.id===t)??null}get subscriptionAvailable(){return this.plans.some(t=>E(this.variant,t.id))}get isSubscription(){return M(this.purchase,this.variant).kind==="subscription"}getLine(){if(!this.variant)return null;let t={merchandiseId:this.variant.id,quantity:this.quantity},n=M(this.purchase,this.variant);n.kind==="subscription"&&(t.sellingPlanId=n.planId);let i=this.collectAttributes();return i.length&&(t.attributes=i),t}collectAttributes(){let t=B(U(this.root,"line-attributes")),n=this.$(s("line-attribute")).flatMap(i=>{let r=yt(i);return r===null?[]:[{key:l(i,"line-attribute")??"",value:r}]});return[...t,...n]}select(t,n){if(this.selected[t]===n)return;let i=this.product.variants.nodes.filter(o=>o.selectedOptions.some(c=>c.name===t&&c.value===n)),[r]=i;if(!r)return;let a={...this.selected,[t]:n};if(!i.some(o=>o.selectedOptions.every(c=>a[c.name]===c.value))){let o=u=>u.selectedOptions.filter(v=>v.name!==t&&this.selected[v.name]===v.value).length*2+(u.availableForSale?1:0),c=i.reduce((u,d)=>o(d)>o(u)?d:u,r);Object.assign(a,T(c))}this.selected=a,this.renderVariant()}selectVariant(t){let n=this.product.variants.nodes.find(i=>i.id===D.variant(t));n&&(this.selected=T(n),this.renderVariant())}setPurchase(t){let n=W(this.product,this.variant,t,A(this.purchase));n.kind!==this.purchase.kind&&(this.purchase=n,this.renderVariant())}selectPlan(t){let n=G(this.product,t);n&&(this.purchase={kind:"subscription",planId:n.id},this.renderVariant())}setQuantity(t){let n=x(this.root,"quantity")?0:1;this.quantity=Math.max(n,parseInt(String(t),10)||0),this.$(s("qty")).forEach(i=>{h(i,this.quantity)}),this.renderVariant()}async addToCart(){if(!this.variant?.availableForSale)return null;let t=this.getLine();if(!t||t.quantity<1)return null;let n=await J.add(t);return f("product-added",{product:this.product,variant:this.variant,line:t},this.root),n}renderProduct(){let{product:t}=this;S.has(t.handle)||this.$(`${s("option-list")},select${s("option")}`).map(i=>l(i,"option-list")||l(i,"option")).some(i=>t.options.some(r=>r.name===i))&&Pt([t]),j(this)}renderVariant(){let t=Y(this.product,{selected:this.selected,purchase:this.purchase,quantity:this.quantity},I.lowStock);if(!t){this.variant=null;return}this.variant=t.variant,this.selected=t.selected,this.purchase=t.purchase,et(this,t),f("variant-changed",{product:this.product,variant:t.variant,selected:{...t.selected},purchase:t.purchase.kind,sellingPlanId:t.line.kind==="subscription"?t.line.planId:null},this.root)}};export{gt as a,Pt as b,ot as c};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as D,e as O,g as C}from"./chunk-FWMPL6PR.js";import{a as p,b as T,c as m,h as x}from"./chunk-OATTAXPO.js";import{G as I,d as w,r as v,x as $}from"./chunk-OJAV2I3C.js";var M=1e4,_=6e4,o=new Map,P=new Map,a=new Set,h=new Map,S=[],y=!1,f=0,N=t=>t.startsWith("gid://"),b=I;function E(t){if(!t)return;let e=Promise.resolve(t);o.set(t.handle,e),o.set(t.id,e)}function j(t){let e=b(t);if(!e)return Promise.reject(new p("empty product key",{code:"NOT_FOUND"}));let r=o.get(e);if(r)return r;let c=new Promise((d,s)=>{P.set(e,{resolve:d,reject:s}),S.push(e),y||(y=!0,setTimeout(()=>void A(),0))});return o.set(e,c),c}var q=t=>e=>`${t}${D(v,e)}`;function F(t){let e=t.filter(N),r=t.filter(l=>!N(l)),c=[],d=[],s={};return e.length&&(c.push("$ids: [ID!]!"),s.ids=e,d.push("byId:nodes(ids:$ids){... on Product{...TetherProduct}}")),r.forEach((l,n)=>{c.push(`$h${n}: String!`),s[`h${n}`]=l,d.push(`h${n}:product(handle:$h${n}){...TetherProduct}`)}),{query:q(`query TetherProducts(${c.join(",")}){${d.join(" ")}}`),variables:s,handles:r}}function R(t,e){let r=P.get(t);P.delete(t),r&&e(r)}function Q(t,e){if(e!==f)return;let r=o.get(t);setTimeout(()=>{o.get(t)===r&&o.delete(t)},M)}function W(t){if(!w(t))return!1;let{byId:e=[],...r}=t;return T(e,[m(C)])&&Object.values(r).every(m(O))}async function A(){y=!1;let t=f,e=S.splice(0);if(!e.length)return;let{query:r,variables:c,handles:d}=F(e);$("fetch products",e);let s;try{s=await x(r,c,W)}catch(n){e.forEach(u=>{R(u,i=>{t===f&&o.delete(u),i.reject(n)})});return}let g=new Map;for(let n of s.byId??[])n?.id&&g.set(n.id,n);d.forEach((n,u)=>{let i=s[`h${u}`];i&&g.set(n,i)});let l=Date.now();e.forEach(n=>{R(n,u=>{let i=g.get(n);if(!i){Q(n,t),u.reject(new p(`Product not found: ${n}`,{code:"NOT_FOUND"}));return}t===f&&(E(i),h.set(i.handle,l),h.set(i.id,l)),u.resolve(i)})})}function L(){o.clear(),f+=1,a.clear(),h.clear()}function J(t){for(let e of t??[])!e.id||!e.handle||Date.now()-(h.get(e.handle)??0)<_&&o.has(e.handle)||(E(e),a.add(e.handle),a.add(e.id))}function V(t){let e=b(t);return!e||!a.has(e)?!1:(a.delete(e),o.get(e)?.then(r=>{a.delete(r.handle),a.delete(r.id)},B),!0)}function B(){}function X(t){let e=b(t);return e&&o.delete(e),j(t)}export{b as a,E as b,j as c,q as d,L as e,J as f,V as g,X as h};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as j,E as q,F as Q,b as T,d as E,e as x,o as V,p as G,r as c,x as O,y as S,z as b}from"./chunk-OJAV2I3C.js";var g=class extends Error{constructor(r,{status:n,errors:o,userErrors:i,code:s}={}){super(r);T(this,"name","TetherError");T(this,"code");T(this,"status");T(this,"errors");T(this,"userErrors");this.code=s??(n?`HTTP_${n}`:"ERROR"),this.status=n,this.errors=o,this.userErrors=i}};function v(t,e){return typeof e=="function"?e(t):typeof e=="string"?e==="object"?E(t):typeof t===e:Et(e)?Array.isArray(t)&&t.every(r=>v(r,e[0])):E(t)&&Object.entries(e).every(([r,n])=>n===void 0||v(t[r],n))}var Et=t=>Array.isArray(t),He=t=>e=>e===null||v(e,t),$e=t=>e=>v(e,t);function Tt(t=c){return`https://${t.domain}/api/${t.apiVersion}/graphql.json`}var Y=/"(?:\\.|[^"\\\n])*"|#[^\n]*/g,bt=/^\s*(?:query|mutation)(?:\s+\w+)?\s*(?:\([^)]*\))?/;function wt(t){return/\bmutation\b/.test(t.replace(Y,""))?"mutation":"query"}function J(t,{country:e,language:r}){let n=[];if(e&&n.push(`country: ${e}`),r&&n.push(`language: ${r}`),!n.length)return t;let o=`@inContext(${n.join(", ")})`,i=t.replace(Y,p=>" ".repeat(p.length)),s=i.indexOf("{");if(i.slice(0,s).includes("@inContext"))return t;if(i.trimStart().startsWith("{"))return`query ${o} ${t.slice(s)}`;let a=bt.exec(i);if(!a)return t;let l=a[0].length;return`${t.slice(0,l).trimEnd()} ${o} ${t.slice(l).trimStart()}`}function De(t,e=c){let r=V(e.country)??void 0,n=G(e.language)??void 0;return J(t,{country:r,language:n})}var N=300,St=500,At=3e4,W=430,xt=1e3,L="quantityAvailable",B=new Set,vt=t=>`${t.domain} ${t.apiVersion} ${t.token}`;function kt(t,e,r,{context:n,operation:o}){let i=typeof e=="string"?e:e(r),s=n?J(i,t):i;return t.maxAge<=0||o==="mutation"?s:`${s} #${Math.floor(Date.now()/(t.maxAge*xt))}`}var Rt=t=>new Promise(e=>setTimeout(e,t));function I(t,e){if(t===401||t===403){let r=e.token.startsWith("shpat_")?", not an Admin API token (shpat_\u2026)":"";return`Shopify rejected the Storefront token for ${e.domain} (${t}): use the public Storefront API token (Headless channel)${r}`}return t===404?`Store or API version not found (404): check domain ${e.domain} and apiVersion ${e.apiVersion}`:`HTTP ${t} from ${e.domain}`}function Ot(t){let e=x(t,"message"),r=x(x(t,"extensions"),"code"),n=typeof e=="string"?e:"";return typeof r=="string"?{message:n,extensions:{code:r}}:{message:n}}function Ct(t){if(!E(t))return null;let{data:e,errors:r}=t;return r==null?{data:e}:Array.isArray(r)?{data:e,errors:r.map(Ot)}:null}function C(t,e){return t.ok?new g(`Invalid response (${t.status})`,{code:"INVALID_RESPONSE",status:t.status}):new g(I(t.status,e),{status:t.status})}function K(t,e,r,n){let o=e.map(s=>s.message).filter(Boolean).join(" | "),i=o||"Storefront API error";return t.ok||(i=t.status===401||t.status===403||!o?I(t.status,r):o),new g(i,{status:t.status,errors:e,code:n})}function z(t,e){if(e==="any")return{kind:"retry",backoffMs:N};throw new g(`Network error: ${j(t)}`,{code:"NETWORK"})}function Lt(t,e,r,n,o,i,s){if(r.includes(L)&&n.some(d=>d.message.includes(L)))return{kind:"inventory-refused",error:K(t,n,e)};let a=n.map(d=>d.extensions?.code);if(i!=="none"&&a.includes("THROTTLED"))return{kind:"retry",backoffMs:St};let l=a.includes("INTERNAL_SERVER_ERROR");if(i==="any"&&l)return{kind:"retry",backoffMs:N};let p=t.ok&&(l||s==="mutation"&&o==null);throw K(t,n,e,p?"SERVER_ERROR":void 0)}async function Nt(t,e){if(!t)return e(null);let r=new AbortController,n=setTimeout(()=>{r.abort(new DOMException("signal timed out","TimeoutError"))},t);try{return await e(r.signal)}finally{clearTimeout(n)}}async function It(t,e,r,n,o,i,s){let a;try{a=await(t.fetch??fetch)(Tt(t),{method:"POST",headers:{"Content-Type":"application/json","X-Shopify-Storefront-Access-Token":t.token},body:JSON.stringify({query:e,variables:r}),signal:s})}catch(f){return z(f,o)}if(a.status===W)throw new g("Shopify security rejection (430)",{status:W});if(o!=="none"&&a.status===429||o==="any"&&a.status>=500)return{kind:"retry",backoffMs:N};let l;try{l=await a.json()}catch(f){if(f instanceof SyntaxError)throw C(a,t);return z(f,o)}let p=Ct(l);if(!p)throw C(a,t);let{data:d,errors:h=[]}=p;if(h.length)return Lt(a,t,e,h,d,o,i);if(!a.ok)throw new g(I(a.status,t),{status:a.status});if(!n(d))throw C(a,t);return{kind:"data",data:d}}async function X(t,e,r,n,{context:o=!0,operation:i="query"}={}){if(!t.domain||!t.token)throw new g("Tether is not configured: domain and token are required",{code:"NOT_CONFIGURED"});let s=vt(t),a=i==="mutation"?"not-run":"any",l=0;for(;;){let p={inventory:!B.has(s)},d=kt(t,e,p,{context:o,operation:i}),h=l<t.retries?a:"none",f=await Nt(t.requestTimeout,w=>It(t,d,r,n,h,i,w));switch(f.kind){case"data":return f.data;case"inventory-refused":if(typeof e=="string"||!p.inventory)throw f.error;O(`the token can't read inventory: ${L} is left out from now on`),B.add(s);break;case"retry":await Rt(Math.min(f.backoffMs*2**l,At)),l+=1,O("retry",l);break}}}function Fe(t,e,r,n){return X(c,t,e,r,n)}var Pt=t=>typeof t=="object"&&t!==null;function Mt(t,e,r={},n){return X(t,e,r,Pt,{...n,operation:wt(e)})}function Ve(t,e,r){return Mt(c,t,e,r)}function Ge(t,e){if(!t)throw new g(`${e}: empty response`);let r=t.userErrors??[];if(r.length)throw new g(r.map(n=>n.message).join(" | "),{userErrors:r});return t}var m=t=>`${c.prefix}-${t}`,_t=(t,e)=>e===void 0?`[${m(t)}]`:`[${m(t)}="${e}"]`,P=(t,e)=>t.getAttribute(m(e)),Ut=(t,e)=>t.hasAttribute(m(e));function Z(t,e){return t?[...t.querySelectorAll(e)]:[]}var Ht=(t,e,r)=>Z(t,e).filter(n=>n.closest(r)===t),$t=["product-ready","list-ready","cart-updated","cart-toggled","checkout","search"],tt=new WeakMap;function et(t,e){let r=new CustomEvent(`${c.prefix}:${t}`,{detail:e,bubbles:!0});return tt.set(r,t),r}function Dt(t,e){return tt.get(t)===e}function M(t,e,r=document){r.dispatchEvent(et(t,e))}function nt(t,{width:e,height:r,crop:n}={}){if(!t)return t;let o;try{o=new URL(t)}catch(i){if(i instanceof TypeError)return t;throw i}return e&&o.searchParams.set("width",String(e)),r&&o.searchParams.set("height",String(r)),n&&o.searchParams.set("crop",n),o.toString()}function _(t,e){return t.getAttribute(e)??t.getAttribute(m(e))??t.getAttribute(`data-${e}`)}function ot(t,e){if(!t||!e)return t;let r=_(e,"max-width"),n=_(e,"max-height");return nt(t,{width:r,height:n,crop:r||n?_(e,"crop"):null})}var rt=t=>t.replace(/\?.*$/,"");function it(t,e){return!t||!e?!1:rt(t)===rt(e)}function Ft(t){return/^\s*[a-z][a-z0-9+.-]*:/i.test(t)&&!/^\s*(https?:|data:image\/)/i.test(t)?"none":`url("${t.replace(/["\\\n\r\f]/g,n=>`\\${n.charCodeAt(0).toString(16)} `)}")`}function Vt(t,e,r){if(!e)return;let n=ot(e,t);if(t.tagName!=="IMG"){t.style.backgroundImage=Ft(n);return}if(it(t.getAttribute("src"),n)){r!=null&&!t.getAttribute("alt")&&t.setAttribute("alt",r);return}t.removeAttribute("srcset"),t.removeAttribute("sizes"),t.setAttribute("src",n),r!=null&&t.setAttribute("alt",r),t.getAttribute("loading")||t.setAttribute("loading","lazy")}var U=new WeakMap,Gt=t=>!!U.get(t),H=t=>t.cloneNode(!0);function st(t){let e=U.get(t);if(e!==void 0)return e;let r=t.firstElementChild,n=r?H(r):null;return U.set(t,n),t.replaceChildren(),n}function jt(t,e,r){let n=st(t);if(!n){e.length&&S("repeater without a template child",t);return}t.replaceChildren(),e.forEach((o,i)=>{let s=H(n);r(s,o,i),t.appendChild(s)})}function qt(t,e){let r=()=>{t.remove()};if(!e){r();return}try{e(t,r)}catch(n){b(n,"repeater onLeave"),r()}}function Qt(t,e,r,n){e.forEach((o,i)=>{if(!r.has(o))return;let s=e[i-1];if(s?.parentNode===t?s.after(o):t.prepend(o),!!n)try{n(o)}catch(a){b(a,"repeater onEnter")}})}function Wt(t,e,r,n,{onEnter:o,onLeave:i}={}){let s=st(t);if(!s){S("repeater without a template child",t);return}let a=`data-${c.prefix}-key`,l=`data-${c.prefix}-leaving`,p=()=>[...t.children].filter(u=>u.hasAttribute(a)&&!u.hasAttribute(l)),d=new Map(p().map(u=>[u.getAttribute(a),u])),h=[],f=new Set;e.forEach((u,A)=>{let R=String(r(u,A)),y=d.get(R);y?d.delete(R):(y=H(s),y.setAttribute(a,R),f.add(y)),n(y,u,A,f.has(y)),h.push(y)});let w=h.filter(u=>!f.has(u)),F=p().filter(u=>w.includes(u));if(!(F.length===w.length&&F.every((u,A)=>u===w[A]))){d.forEach(u=>{u.remove()}),h.forEach(u=>t.appendChild(u));return}Qt(t,h,f,o),d.forEach(u=>{u.setAttribute(l,""),u.removeAttribute(a),u.style.pointerEvents="none",u.inert=!0,qt(u,i)})}var Bt="http://www.w3.org/1999/xhtml",Kt=new Set(["h1","h2","h3","h4","h5","h6","p","span","div","br","hr","blockquote","code","pre","strong","em","b","i","u","s","small","sub","sup","ul","ol","li","dl","dt","dd","table","caption","colgroup","col","thead","tbody","tfoot","tr","th","td","a","img","picture","source","video","figure","figcaption","iframe"]),zt=new Set(["script","style","template","noscript","textarea","select","title"]),Yt=new Set(["style","title","lang","dir","role","align","width","height"]),Jt=new Map([["a",new Set(["href","target","rel","hreflang"])],["img",new Set(["src","srcset","sizes","alt","loading","decoding"])],["source",new Set(["src","srcset","sizes","type","media"])],["video",new Set(["src","poster","controls","autoplay","muted","loop","playsinline","preload"])],["iframe",new Set(["src","allow","allowfullscreen","frameborder","loading"])],["blockquote",new Set(["cite"])],["ol",new Set(["start","type","reversed"])],["li",new Set(["value"])],["table",new Set(["border","cellpadding","cellspacing","summary"])],["col",new Set(["span"])],["colgroup",new Set(["span"])],["th",new Set(["colspan","rowspan","headers","scope","valign"])],["td",new Set(["colspan","rowspan","headers","valign"])]]),Xt=new Set(["href","src","poster","cite"]),Zt=/^(javascript|vbscript|data):/i,te=/^data:image\/(png|gif|jpeg|webp|avif);/i,ee=new Set(["position","top","right","bottom","left","z-index","-webkit-box-reflect"]),re=["inset","transform","translate","rotate","scale","offset"],ne=/\d(?:[sld]?v|cq)(?:w|h|i|b|min|max)\b/i,oe=/^(?:outline|box-shadow|text-shadow|filter|text-decoration|text-underline-offset|text-stroke)|^(?:border-image|mask-border|mask-box-image)(?:-outset)?$/,at=40,ie=new Map([["letter-spacing",{px:4,em:.25}],["word-spacing",{px:4,em:.25}],["text-indent",{px:at}]]),ut=/(?<![\w#.-])[+-]?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?(%|[a-z]+)?/gi,se=/(?<![\w-])(?!drop-shadow\(|blur\()[\w-]+\([^()]*\)/g,ct=/(?:var|calc|min|max|clamp|env|attr)\(/i,ae=/url\(|expression\(|@import/i,ue=/[\u0000- ]/g,ce="allow-scripts allow-same-origin allow-popups allow-presentation",le=new Set(["autoplay","encrypted-media","picture-in-picture","fullscreen","clipboard-write","accelerometer","gyroscope","web-share"]),de="strict-origin-when-cross-origin",fe=["https://www.youtube.com","https://www.youtube-nocookie.com","https://player.vimeo.com","https://www.loom.com","https://fast.wistia.net"];function pe(t,e){return Yt.has(e)||e.startsWith("aria-")||(Jt.get(t)?.has(e)??!1)}function ge(t,e,r){let n=r.replace(ue,"");return Zt.test(n)?t==="img"&&e==="src"&&te.test(n):!0}function lt(t,e){try{return new URL(t,e)}catch{return null}}function me(t,e,r){let n=t.baseURI,o=lt(n)?.origin??"null";return{origin:o==="null"?null:o,baseUrl:n,styleParser:e,embedOrigins:new Set([...fe,...r])}}function he(t,e){let r=lt(t.trim(),e.baseUrl);return r!==null&&r.origin!==e.origin&&e.embedOrigins.has(r.origin)}function ye(t){let e=t.split(";").map(r=>r.trim().split(/\s+/)[0]?.toLowerCase()??"");return[...new Set(e.filter(r=>le.has(r)))].join("; ")}function Ee(t,e){if(ee.has(t)||re.some(n=>t.startsWith(n))||ne.test(e))return!0;let r=ie.get(t);return r?ct.test(e)||Te(e,r):t.startsWith("margin")&&e.includes("-")}function Te(t,e){return[...t.matchAll(ut)].some(([r="",n=""])=>{let o=parseFloat(r);if(o>=0)return!1;let i=e[n.toLowerCase()];return i===void 0||-o>i})}function be(t,e){return oe.test(t.replace(/^-webkit-/,""))?ct.test(e)?!0:[...e.replace(se,"").matchAll(ut)].some(([r="",n=""])=>{let o=Math.abs(parseFloat(r));return o!==0&&(n.toLowerCase()!=="px"||o>at)}):!1}function we(t,e){let r=e.style;r.cssText=t;let n=Array.from({length:r.length},(i,s)=>r.item(s));for(let i of n){let s=r.getPropertyValue(i);(Ee(i,s)||be(i,s)||ae.test(s))&&r.removeProperty(i)}let o=r.cssText;return e.removeAttribute("style"),o}function Se(t,e){let r=t.localName;for(let i of[...t.attributes]){let s=i.name.toLowerCase(),a=Xt.has(s);pe(r,s)&&(!a||ge(r,s,i.value))||t.removeAttribute(i.name)}let n=t.getAttribute("style");if(n===null)return;let o=we(n,e.styleParser);o===""?t.removeAttribute("style"):t.setAttribute("style",o)}var Ae=new Set(["","_self","_parent","_top"]);function xe(t){if(t.localName==="iframe"){let n=ye(t.getAttribute("allow")??"");n===""?t.removeAttribute("allow"):t.setAttribute("allow",n),t.setAttribute("sandbox",ce),t.setAttribute("referrerpolicy",de);return}if(t.localName!=="a")return;let e=t.getAttribute("target");if(e===null||Ae.has(e.toLowerCase()))return;let r=new Set((t.getAttribute("rel")??"").split(/\s+/).filter(Boolean));r.add("noopener"),r.add("noreferrer"),t.setAttribute("rel",[...r].join(" "))}function ve(t,e){let r=t.localName,n=t.namespaceURI===Bt;if(n&&zt.has(r)){t.remove();return}if(!n||!Kt.has(r)){t.replaceWith(...t.childNodes);return}if(r==="iframe"&&!he(t.getAttribute("src")??"",e)){t.remove();return}Se(t,e),xe(t)}function dt(t,e=globalThis.document,r=[]){let n=e.createElement("template");n.innerHTML=t??"";let o=me(e,n,r);for(let i of[...n.content.querySelectorAll("*")])ve(i,o);return n.content}var ft="data-tether-seen",D="data-tether-shown",k="data-tether-prev-display",ke=120;function nr(t,e){return Q(c.productPath||"/product",t,e)}function ht(t,e){try{return t()}catch(r){if(r instanceof RangeError)return e;throw r}}function or(t,e=c.locale){return t?ht(()=>new Intl.NumberFormat(e||void 0,{style:"percent",maximumFractionDigits:0}).format(t/100),`${t}%`):""}function ir(t){return t?c.formatMoney?c.formatMoney(t,c.locale):q(t,c.locale):""}function sr(t){return t?ht(()=>new Date(t).toLocaleDateString(c.locale||void 0),""):""}function ar(t,e){t.replaceChildren(dt(e,t.ownerDocument,c.embedOrigins))}var yt=t=>t.tagName==="INPUT"||t.tagName==="TEXTAREA",pt=t=>t.tagName==="INPUT";function Re(t,e){let r=e==null?"":String(e);yt(t)?t.value=r:t.textContent=r}var gt=t=>yt(t)?t.value:t.textContent;function ur(t,e){let r=gt(t);if(Re(t,e),r!==gt(t)&&t.hasAttribute(ft)&&c.onValueChange)try{c.onValueChange(t,r)}catch(n){b(n,"onValueChange")}t.setAttribute(ft,"1")}function Oe(t){if(t.hasAttribute(D))return;t.setAttribute(D,""),t.removeAttribute("hidden");let e=t.getAttribute(k);e!==null?(t.style.display=e,t.removeAttribute(k)):t.style.display==="none"&&(t.style.display=""),typeof getComputedStyle=="function"&&getComputedStyle(t).display==="none"&&(t.style.display=t.getAttribute(m("display"))||"block")}function cr(t,e){if(e){Oe(t);return}t.removeAttribute(D),!t.hasAttribute(k)&&t.style.display!=="none"&&t.setAttribute(k,t.style.display),t.style.display="none"}function lr(t,e){t.classList.toggle("is-selected",e),t.setAttribute("aria-pressed",e?"true":"false"),pt(t)&&(t.type==="radio"||t.type==="checkbox")&&(t.checked=e);let r=t.querySelector('input[type="radio"],input[type="checkbox"]');r&&pt(r)&&(r.checked=e)}var mt,Ce=t=>Reflect.get(window,t);function Le(){let t=Ce("ScrollTrigger");if(typeof t!="function")return;let e=Reflect.get(t,"refresh");typeof e=="function"&&Reflect.apply(e,t,[])}function Ne(t){clearTimeout(mt),mt=setTimeout(()=>{try{c.onLayoutChange?c.onLayoutChange(t):Le()}catch(e){b(e,"layout-changed")}M("layout-changed",{reason:t})},ke)}function dr(t,e){let r=[...t.querySelectorAll("img")].filter(i=>!i.complete),n=r.length,o=()=>{n-=1,n===0&&Ne(`${e}:images`)};r.forEach(i=>{i.addEventListener("load",o,{once:!0}),i.addEventListener("error",o,{once:!0})})}function fr(t,e){return t.getAttribute("aria-busy")==="true"?Promise.resolve(void 0):(t.setAttribute("aria-busy","true"),Promise.resolve().then(e).finally(()=>{t.removeAttribute("aria-busy")}))}function pr(t,e){let r=t?P(t,e):null;if(!r)return null;try{return JSON.parse(r)}catch{return S(`invalid JSON in ${m(e)}`,t),null}}function $(t){return t==null?"":typeof t=="string"?t:typeof t=="number"||typeof t=="boolean"?String(t):JSON.stringify(t)}function gr(t){return Array.isArray(t)?t.filter(E).map(r=>({key:$(r.key),value:$(r.value)})):E(t)?Object.entries(t).map(([e,r])=>({key:e,value:$(r)})):[]}function mr(t){return t?Array.isArray(t)?t.map(e=>({key:String(e.key),value:String(e.value??"")})):Object.entries(t).map(([e,r])=>({key:e,value:String(r??"")})):[]}export{g as a,v as b,He as c,$e as d,Tt as e,De as f,X as g,Fe as h,Mt as i,Ve as j,Ge as k,m as l,_t as m,P as n,Ut as o,Z as p,Ht as q,$t as r,Dt as s,M as t,nt as u,it as v,Vt as w,Gt as x,jt as y,Wt as z,nr as A,or as B,ir as C,sr as D,ar as E,Re as F,ur as G,cr as H,lr as I,Ce as J,Ne as K,dr as L,fr as M,pr as N,gr as O,mr as P};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var w=Object.defineProperty;var G=(n,e,t)=>e in n?w(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var Fn=(n,e)=>{for(var t in e)w(n,t,{get:e[t],enumerable:!0})};var $n=(n,e,t)=>G(n,typeof e!="symbol"?e+"":e,t);var z=/^(\d{4})-(01|04|07|10)$/;function k(n){let e=z.exec(typeof n=="string"?n:"");return e?{year:Number(e[1]),month:Number(e[2])}:null}var S=n=>k(n)!==null,j=(n,e)=>`${n}-${String(e).padStart(2,"0")}`;function A(n,e=1){let t=k(n);if(!t)throw new Error(`not a quarterly Shopify API version: ${n}`);let o=t.year*4+(t.month-1)/3+e;return j(Math.floor(o/4),o%4*3+1)}function Dn(n,e=new Date){if(n==="unstable")return{version:n,ok:!1,note:'"unstable" changes without notice: pin a dated version such as 2026-07'};let t=k(n);if(!t)return{version:n,ok:!1,note:"not a quarterly version (YYYY-01, -04, -07 or -10)"};let o=new Date(Date.UTC(t.year,t.month-1,1)),r=new Date(Date.UTC(t.year,t.month-1+12,1)),i=(r.getTime()-e.getTime())/2630016e3,f=o<=e,c=`supported until about ${r.toISOString().slice(0,7)}`;return f?i<=0?c="no longer supported: Shopify falls back to the oldest supported version. Upgrade (see docs/reference.md)":i<3&&(c=`${c}: plan the upgrade to ${A(n)} or later (see docs/reference.md)`):c="not released yet (release candidate at best)",{version:n,ok:f&&i>0,monthsLeft:Math.round(i),next:A(n),note:c}}function O(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)}function v(n,e){return O(n)?n[e]:void 0}function Q(n){return Array.isArray(n)?n:[]}function Z(n){return typeof n=="string"&&n!==""?n:null}var B=n=>typeof n=="number"&&Number.isFinite(n)?n:null,Kn=n=>B(n)??0,x=(n,e)=>Q(n).map(t=>e(t)),Yn=(n,e)=>({nodes:x(v(n,"nodes"),e)}),Gn=n=>x(n,Z).filter(e=>e!==null);var q=/^[A-Z]{2}$/,W=new Set(["XX","T1"]),X=new Set(["PT_BR","PT_PT","ZH_CN","ZH_TW"]),J=/^[A-Z]{2,3}$/;function T(n){let e=(typeof n=="string"?n:"").trim().toUpperCase();return!q.test(e)||W.has(e)?null:e}function h(n){let e=(typeof n=="string"?n:"").trim().replace("-","_").toUpperCase();if(X.has(e))return e;let t=e.split("_")[0]??"";return J.test(t)?t:null}var E="2026-07";var nn=/^[A-Za-z0-9_.-]+$/,en=/^(\$app(:[A-Za-z0-9_-]+)?|[A-Za-z0-9_.-]+)$/,tn=/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,on=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/,rn=/^[A-Za-z_$][\w$]*$/,R="https://site.invalid",sn=new Set(["localhost","127.0.0.1","[::1]"]),N=["saved","server","webflow"],an=["no-banner","default-banner","custom-banner"],y=n=>typeof n=="string"&&n!=="",un=n=>typeof n=="function";function M(n,e){if(typeof n!="string"||!n)return"";let t=n.replace(/^https?:\/\//,"").replace(/\/.*$/,"");return dn(t)?t:(e("domain",n),"")}function P(n){if(!y(n))return!1;try{let e=new URL(n,`${R}/`);return e.origin===R?!0:e.protocol==="https:"||e.protocol==="http:"&&sn.has(e.hostname)}catch{return!1}}function L(n,e){return n==null||n===""?null:typeof n=="string"&&(P(n)||cn(n))?n:(e("partsUrl",n),null)}function cn(n){if(typeof location>"u")return!1;try{return new URL(n).origin===location.origin}catch{return!1}}function ln(n){if(typeof n!="string")return null;try{let e=new URL(n);return e.protocol==="https:"&&e.href===new URL(e.origin).href?e.origin:null}catch{return null}}function I(n,e){if(!Array.isArray(n))return e("embedOrigins",n),[];let t=[],o=n;for(let r of o){let i=ln(r);i?t.push(i):e("embedOrigin",r)}return t}function fn(n){let e,t;if(typeof n=="string"){let o=n.indexOf(".");e=o>0?n.slice(0,o):"",t=n.slice(o+1)}else typeof n=="object"&&n!==null&&(e=Reflect.get(n,"namespace"),t=Reflect.get(n,"key"));return typeof e!="string"||typeof t!="string"?null:en.test(e)&&nn.test(t)?{namespace:e,key:t}:null}function U(n,e){if(!Array.isArray(n))return e("metafields",n),[];let t=[],o=n;for(let r of o){let i=fn(r);i?t.push(typeof r=="string"?r:i):e("metafield",r)}return t}var d=n=>e=>n(e)?e:void 0,dn=n=>y(n)&&tn.test(n),pn=n=>y(n)&&on.test(n),gn=n=>typeof n=="boolean"||y(n)&&rn.test(n),g=d(P),C=d(y),_=d(n=>typeof n=="boolean"),F=d(un);function m(n,e,t,o){if(e==null)return null;if(!O(e))return o(n,e),null;let r={};for(let i in t){let f=e[i];if(f===void 0)continue;let c=t[i](f);c===void 0?o(`${n}.${i}`,f):r[i]=c}return r}var yn={server:g,orderUrl:g,subscriptionsUrl:g,paymentUrl:g,logoutUrl:g,locale:C,navigate:F},mn="customer accounts need the Worker since 0.7.0: set account.server",On={country:C,language:C,locale:C},Cn={detect:n=>{if(typeof n=="boolean")return n;let e=Array.isArray(n)?n:[n];return typeof n=="string"||Array.isArray(n)?N.filter(t=>e.includes(t)):void 0},locales:n=>{if(!O(n))return;let e={};for(let[t,o]of Object.entries(n)){let r=m(`markets.locales.${t}`,o,On,()=>{});r&&(e[t]=r)}return e},cookie:d(pn),remember:_,strict:_},kn={consent:n=>an.find(e=>e===n),proxy:n=>n!==void 0&&!!n},Tn={dataLayer:d(gn),shopify:n=>typeof n=="boolean"?n:m("analytics.shopify",n,kn,()=>{})??void 0,onEvent:F};function $(n,e,t){let o=m("account",n,yn,e);if(o===null)return null;let{server:r}=o;return r===void 0?(t(mn),null):{...o,server:r}}var b=(n,e)=>m("markets",n,Cn,e),V=(n,e)=>m("analytics",n,Tn,e);var l={domain:"",token:"",apiVersion:E,country:void 0,language:void 0,locale:void 0,markets:null,prefix:"tether",productPath:"/product",collectionPath:"/collection",metafields:[],embedOrigins:[],imagesFirst:25,variantsFirst:100,sellingPlanGroupsFirst:10,sellingPlansFirst:25,collectionFirst:24,retries:2,requestTimeout:15e3,revalidate:!0,storageKey:"",cartDrawerOpenClass:"is-open",openCartOnAdd:!0,cartFocus:!0,checkoutTarget:"_self",defaultPurchase:"one-time",variantUrl:!1,maxAge:60,lowStock:5,searchDelay:150,autoMount:!0,observe:!1,astro:!0,partsUrl:null,analytics:null,account:null,warningText:null,formatMoney:null,onLayoutChange:null,onCartOpen:null,onCartClose:null,onLineEnter:null,onLineLeave:null,onValueChange:null,onError:null,debug:!1},a={...l};function Y(n){let e=t=>(u(`Tether.config is read-only (${String(t)}): pass options to Tether.init() instead`),!1);return new Proxy(n,{get(t,o){let r=Reflect.get(t,o);return typeof r=="object"&&r!==null?Y(r):r},set:(t,o)=>e(o),deleteProperty:(t,o)=>e(o),defineProperty:(t,o)=>e(o)})}var ee=Y(a),hn=/^[a-z][a-z0-9-]*$/,bn=["revalidate","openCartOnAdd","cartFocus","variantUrl","autoMount","observe","astro","debug"],wn=["token","productPath","collectionPath","cartDrawerOpenClass"],An=["imagesFirst","variantsFirst","sellingPlanGroupsFirst","sellingPlansFirst","collectionFirst","retries","requestTimeout","maxAge","lowStock","searchDelay"],Sn=["warningText","formatMoney","onLayoutChange","onCartOpen","onCartClose","onLineEnter","onLineLeave","onValueChange","onError"];function p(n,e,t){return e!==void 0&&u(`invalid ${n} ${JSON.stringify(e)}: using ${JSON.stringify(t)}`),t}function s(n,e){u(`invalid ${n} ${JSON.stringify(e)}: ignored`)}function xn(n){for(let e of Object.keys(n))e in l||u(`unknown option ${JSON.stringify(e)}: ignored`)}function En(n,e,t){typeof t=="function"?n[e]=t:t!=null&&s(e,t)}var D=2147483647,Rn=10,_n={requestTimeout:D,searchDelay:D,retries:Rn};function Nn(n,e){if(typeof e!="number"||!Number.isInteger(e)||e<0)return p(n,e,l[n]);let t=_n[n];return t===void 0||e<=t?e:(u(`${n} ${String(e)} is more than its maximum: using ${String(t)}`),t)}function Mn(n,e){return typeof e=="boolean"?e:p(n,e,l[n])}function Pn(n,e){return typeof e=="string"?e:p(n,e,l[n])}function Ln(n){if(!(n==null||n==="")){try{if(typeof n=="string"&&Intl.getCanonicalLocales(n).length)return n}catch{}s("locale",n)}}function H(n,e,t){return t.find(o=>o===e)??p(n,e,t[0])}function In(n){return n==="unstable"?(u('apiVersion "unstable" changes without notice. Pin a dated version (e.g. 2026-07).'),n):S(n)?n:p("apiVersion",n,l.apiVersion)}function K(n,e,t){if(e==null||e==="")return;let o=t(e);if(o!==null)return o;s(n,e)}function Un(n){xn(n);let e=M(n.domain,s),t=typeof n.prefix=="string"&&hn.test(n.prefix)?n.prefix:p("prefix",n.prefix,l.prefix),o={...l,domain:e,apiVersion:In(n.apiVersion),country:K("country",n.country,T),locale:Ln(n.locale),partsUrl:L(n.partsUrl,s),language:K("language",n.language,h),markets:b(n.markets,s),analytics:V(n.analytics,s),account:$(n.account,s,u),prefix:t,storageKey:typeof n.storageKey=="string"&&n.storageKey?n.storageKey:`${t}:cart:${e}`,metafields:U(n.metafields??[],s),embedOrigins:I(n.embedOrigins??[],s),checkoutTarget:H("checkoutTarget",n.checkoutTarget,["_self","_blank"]),defaultPurchase:H("defaultPurchase",n.defaultPurchase,["one-time","subscription"])};for(let r of An)o[r]=Nn(r,n[r]);for(let r of bn)o[r]=Mn(r,n[r]);for(let r of wn)o[r]=Pn(r,n[r]);for(let r of Sn)En(o,r,n[r]);return o}var te=n=>b(n,s);function oe(n={}){let e=Un(n);for(let t of Object.keys(a))t in e||Reflect.deleteProperty(a,t);return Object.assign(a,e)}var re=()=>!!(a.domain&&a.token);function ie(...n){a.debug&&console.log(`[${a.prefix}]`,...n)}function u(...n){console.warn(`[${a.prefix}]`,...n)}function se(n,e){if(u(e,n instanceof Error&&n.message?n.message:n),!!a.onError)try{a.onError(n,e)}catch(t){u("onError threw",t)}}function ce(n){return n instanceof Error?n.message:String(n)}var fe={domain:["PUBLIC_SHOPIFY_DOMAIN","PUBLIC_SHOPIFY_STORE_DOMAIN","SHOPIFY_DOMAIN"],token:["PUBLIC_SHOPIFY_STOREFRONT_TOKEN","PUBLIC_SHOPIFY_STOREFRONT_ACCESS_TOKEN","SHOPIFY_STOREFRONT_TOKEN"]};function de(n){if(typeof n!="string")return!1;try{return new URL(n).protocol==="https:"}catch{return!1}}function pe(n){return/^shp[a-z]{2}_/.test(n.trim())}function ge(n,e){if(!n)return"";let t=parseFloat(n.amount);if(Number.isNaN(t))return"";try{return new Intl.NumberFormat(e||void 0,{style:"currency",currency:n.currencyCode}).format(t)}catch{return`${n.currencyCode} ${t.toFixed(2)}`}}function ye(n,e,t){if(!/\{(handle|id)\}/.test(n))return e?`${n.replace(/\/$/,"")}/${encodeURIComponent(e)}`:null;let o=t?t.split("/").at(-1)??"":"";return n.includes("{handle}")&&!e||n.includes("{id}")&&!o?null:n.replace(/\{handle\}/g,encodeURIComponent(e??"")).replace(/\{id\}/g,encodeURIComponent(o))}function me(n){let e=String(n??"").trim();return e?e.startsWith("gid://")?e:/^\d+$/.test(e)?`gid://shopify/Product/${e}`:/\/products\/([^/?#]+)/.exec(e)?.[1]??e:null}export{Fn as a,$n as b,Dn as c,O as d,v as e,Q as f,Z as g,B as h,Kn as i,x as j,Yn as k,Gn as l,N as m,fn as n,T as o,h as p,l as q,a as r,ee as s,Un as t,te as u,oe as v,re as w,ie as x,u as y,se as z,ce as A,fe as B,de as C,pe as D,ge as E,ye as F,me as G};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as A}from"./chunk-4FR3CUO2.js";import{a as l,b as K,c as $}from"./chunk-FI4NIWAD.js";import{b as E,d as b,g as m}from"./chunk-CRKJ2VEX.js";import{c as C,f as M,g as H,h as R}from"./chunk-H6IORH7O.js";import{f as T}from"./chunk-FWMPL6PR.js";import{l as c,n as L,p as x,t as p}from"./chunk-OATTAXPO.js";import{d as w,o as k,p as v,r as a,x as h,y as P,z as f}from"./chunk-OJAV2I3C.js";var W='script[type="application/json"][data-tether-hydrate]',g=new WeakSet,ut=new WeakSet,s=new Set,N=new Set,F=new WeakMap;function q(){s.forEach(t=>{t.isConnected||s.delete(t)}),N.forEach(t=>{t.root.isConnected||N.delete(t)})}function J(t,e){return[...t.matches?.(e)?[t]:[],...x(t,e)]}function z(t,e){let n=L(t,"page-title");!n||typeof document>"u"||(document.title=n.replace(/\{title\}/g,e.title).replace(/\{vendor\}/g,e.vendor||"").replace(/\{type\}/g,e.productType||""))}function D(t,{fromUrl:e,raw:n}){e?(g.add(t),m(t,"not-found"),p("product-not-found",{key:null,source:n},t)):t.closest(A())||P(`[${c("product")}] without a value. Bind it to the Shopify handle field, or use "url:handle".`,t)}function B(t,e,{fromUrl:n,raw:r},o){let d=b(o);if(m(t,d?"not-found":"error",o),!d){f(o,`product ${e}`),p("error",{error:o,context:"product",key:e},t);return}p("product-not-found",{key:e,source:r},t),n?h(`product not found: ${e}`):f(o,`product ${e}`)}function Q(t){if(g.has(t))return!1;let{key:e,...n}=E(t);if(!e)return D(t,n),!1;g.add(t),s.add(t);let r={};F.set(t,r);let o=()=>F.get(t)===r;return l.get(t)?t.setAttribute(c("state"),"updating"):m(t,"loading"),j(C(e)).then(u=>{if(!o())return;let S=l.get(t);S?S.update(u):new $(t,u),z(t,u),a.revalidate&&H(e)&&U(e)}).catch(u=>{o()&&B(t,e,n,u)}),!0}function dt(){q(),s.forEach(t=>{t.getAttribute(c("state"))!=="error"||t.getAttribute(c("error"))==="not-found"||(g.delete(t),Q(t))})}var y=new Set;function U(t){y.size||setTimeout(_,0),y.add(t)}function Y(t,e){s.forEach(n=>{let r=l.get(n);if(!r||!n.isConnected)return;let o=E(n).key;o!==t&&o!==e.handle&&o!==e.id||JSON.stringify(r.product)!==JSON.stringify(e)&&r.update(e)})}function _(){let t=[...y];y=new Set,t.forEach(e=>{R(e).then(n=>{Y(e,n)}).catch(n=>{f(n,`refresh ${e}`)})})}var i=null,j=t=>(i?.add(t),t);function G(){if(!i)return;let t=[...i];Promise.allSettled(t).then(()=>{if(!(!i||t.some(e=>!i?.has(e)))){if(t.length!==i.size){G();return}i=null,document.documentElement.classList.remove(`${a.prefix}-market-pending`)}})}function I(t){if(!w(t))return{country:void 0,language:void 0,products:[]};let{products:e}=t,n=Array.isArray(e)?e:[];return{country:k(t.country)??void 0,language:v(t.language)??void 0,products:n.filter(T)}}var O=new WeakSet;function at(t=document){J(t,W).forEach(e=>{if(O.has(e))return;O.add(e);let n;try{n=JSON.parse(e.textContent)}catch(u){P("bad data-tether-hydrate",u);return}let{country:r,language:o,products:d}=I(n);if(K(d),r===a.country&&o===a.language){M(d);return}h("hydration skipped: other market"),i||(i=new Set,document.documentElement.classList.add(`${a.prefix}-market-pending`))})}export{g as a,ut as b,s as c,N as d,q as e,J as f,Q as g,dt as h,j as i,G as j,at as k};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as T}from"./chunk-4FR3CUO2.js";import"./chunk-2J3MTS3E.js";import{b as E,d as w,g as I}from"./chunk-CRKJ2VEX.js";import{a as H,b as m,d as h}from"./chunk-H6IORH7O.js";import{c as A,h as x,i as M,j as O}from"./chunk-FWMPL6PR.js";import{E as b,F as $,H as f,K as N,M as q,a as y,h as a,l as P,m as c,n as i,o as d,q as k,t as u,w as v,y as K}from"./chunk-OATTAXPO.js";import{b as l,r as L,z as S}from"./chunk-OJAV2I3C.js";var U="url:",Y=`query TetherCollection($handle:String!,$first:Int!,$after:String,$sortKey:ProductCollectionSortKeys,$reverse:Boolean,$filters:[ProductFilter!]){collection(handle:$handle){${A()} products(first:$first,after:$after,sortKey:$sortKey,reverse:$reverse,filters:$filters){nodes{...TetherProduct}pageInfo{hasNextPage endCursor}}}}`,B="query TetherSearch($first:Int!,$after:String,$query:String,$sortKey:ProductSortKeys,$reverse:Boolean){products(first:$first,after:$after,query:$query,sortKey:$sortKey,reverse:$reverse){nodes{...TetherProduct}pageInfo{hasNextPage endCursor}}}";async function W({collection:n,query:t,first:o=L.collectionFirst,after:e=null,sortKey:r,reverse:s=!1,filters:D}={}){if(n){let C=await a(h(Y),{handle:n,first:o,after:e,sortKey:r||void 0,reverse:s,filters:D??void 0},x);if(!C.collection)throw new y(`Collection not found: ${n}`,{code:"NOT_FOUND"});let{products:g,..._}=C.collection;return g.nodes.forEach(m),{collection:_,products:g.nodes,pageInfo:g.pageInfo}}let p=await a(h(B),{first:o,after:e,query:t||void 0,sortKey:r||void 0,reverse:s},M);return p.products.nodes.forEach(m),{collection:null,products:p.products.nodes,pageInfo:p.products.pageInfo}}async function j(n,t="RELATED"){let o=H(typeof n=="object"?n?.id:n);if(!o)throw new y("No product for recommendations",{code:"NOT_FOUND"});let e=o.startsWith("gid://"),s=(await a(h(`query TetherRecs(${e?"$id: ID!":"$handle: String!"},$intent:ProductRecommendationIntent){productRecommendations(${e?"productId: $id":"productHandle: $handle"},intent:$intent){...TetherProduct}}`),e?{id:o,intent:t}:{handle:o,intent:t},O)).productRecommendations??[];return s.forEach(m),s}var z=n=>n instanceof window.Element,F=n=>parseInt(n??"",10)||void 0,G=n=>n==="COMPLEMENTARY"?"COMPLEMENTARY":"RELATED",R=class{constructor(t){l(this,"root");l(this,"products",[]);l(this,"pageInfo",null);l(this,"collection",null);l(this,"loadToken",0);this.root=t,t.addEventListener("click",o=>{if(!z(o.target))return;let e=o.target.closest(c("load-more"));e?.closest(T())===t&&(o.preventDefault(),q(e,()=>this.load(!0)))})}$(t){return k(this.root,t,T())}options(){let{root:t}=this,o={reverse:i(t,"reverse")==="true"},e=F(i(t,"limit"));e&&(o.first=e);let r=i(t,"sort");if(r&&(o.sortKey=r),d(t,"collection"))return o.collection=i(t,"collection")??"",o;let s=i(t,"products")??"";return o.query=s.startsWith(U)?new URL(window.location.href).searchParams.get(s.slice(U.length))||"":s,o}async loadRecommendations(){let{key:t}=E(this.root,window.location,"recommendations"),o=this.root.closest(c("product"));return!t&&o&&({key:t}=E(o)),j(t,G(i(this.root,"intent")))}async load(t=!1){this.loadToken+=1;let o=this.loadToken,e=()=>o!==this.loadToken;try{if(d(this.root,"recommendations")){let r=await this.loadRecommendations();if(e())return;let s=F(i(this.root,"limit"));this.products=s?r.slice(0,s):r}else{let r=await W({...this.options(),after:t?this.pageInfo?.endCursor??null:null});if(e())return;this.collection=r.collection,this.pageInfo=r.pageInfo,this.products=t?[...this.products,...r.products]:r.products}this.render(),I(this.root,"ready"),u("list-ready",{products:this.products,collection:this.collection},this.root)}catch(r){if(e())return;t||I(this.root,w(r)?"not-found":"error",r),w(r)&&d(this.root,"recommendations")||S(r,"list load failed"),u("error",{error:r,context:"list"},this.root)}}render(){let{collection:t}=this;this.$(c("collection-bind")).forEach(e=>{switch(i(e,"collection-bind")??""){case"title":$(e,t?.title??"");break;case"description":b(e,t?.descriptionHtml);break;case"image":v(e,t?.image?.url,t?.image?.altText||t?.title);break;case"count":$(e,this.products.length);break}}),this.$(c("list")).forEach(e=>{K(e,this.products,(r,s)=>{r.setAttribute(P("product"),s.handle),r.removeAttribute(P("state"))}),u("list-rendered",{container:e},this.root)});let o=this.products.length===0;this.$(c("show")).forEach(e=>{let r=i(e,"show");r==="list-empty"&&f(e,o),r==="list-filled"&&f(e,!o)}),this.$(c("load-more")).forEach(e=>{f(e,!!this.pageInfo?.hasNextPage)}),N("list")}},Q=new WeakMap;function nt(n){let t=Q.get(n);return t||(t=new R(n),Q.set(n,t)),t.load()}export{W as getProducts,j as getRecommendations,nt as loadList};
|