@standhigher/besttrack-page-extension 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +69 -32
- package/dist/chunk-KD7KFFFK.js +127 -0
- package/dist/index.d.ts +359 -16
- package/dist/index.js +1943 -515
- package/dist/validation.d.ts +9 -0
- package/dist/validation.js +121 -0
- package/package.json +7 -3
package/dist/index.js
CHANGED
|
@@ -1,5 +1,828 @@
|
|
|
1
|
+
import {
|
|
2
|
+
formatTrackingPageMoney,
|
|
3
|
+
getResolvedShopifyResource,
|
|
4
|
+
getShopifyResourceResolutionError,
|
|
5
|
+
isEmptyTrackingPageResult,
|
|
6
|
+
isSafeTrackingPageUrl,
|
|
7
|
+
isShopifyResourceReference,
|
|
8
|
+
isTrackingPageResourceReference,
|
|
9
|
+
isValidOrderEmail,
|
|
10
|
+
isValidOrderNumber,
|
|
11
|
+
isValidTrackingNumber,
|
|
12
|
+
resolveShopifyResources,
|
|
13
|
+
safeTrackingPageUrl
|
|
14
|
+
} from "./chunk-KD7KFFFK.js";
|
|
15
|
+
|
|
1
16
|
// src/ready-to-go.tsx
|
|
2
|
-
import { createContext, useCallback, useContext, useMemo, useState as useState2 } from "react";
|
|
17
|
+
import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState as useState2 } from "react";
|
|
18
|
+
|
|
19
|
+
// src/shopify-track-page/i18n/locales.ts
|
|
20
|
+
var SUPPORTED_LOCALES = [
|
|
21
|
+
"EN",
|
|
22
|
+
"ZH-HANS",
|
|
23
|
+
"FR",
|
|
24
|
+
"ES",
|
|
25
|
+
"DE",
|
|
26
|
+
"PT-BR",
|
|
27
|
+
"IT",
|
|
28
|
+
"ID",
|
|
29
|
+
"VI",
|
|
30
|
+
"TH"
|
|
31
|
+
];
|
|
32
|
+
var LOCALE_STORAGE_KEY = "bestrack_locale";
|
|
33
|
+
function isSupportedLocale(value) {
|
|
34
|
+
return SUPPORTED_LOCALES.includes(value);
|
|
35
|
+
}
|
|
36
|
+
function normalizeLocale(value) {
|
|
37
|
+
if (!value) return null;
|
|
38
|
+
const normalized = value.trim();
|
|
39
|
+
const canonical = normalized.toUpperCase();
|
|
40
|
+
if (isSupportedLocale(canonical)) return canonical;
|
|
41
|
+
const lower = normalized.toLowerCase();
|
|
42
|
+
if (lower === "zh" || lower === "zh-cn" || lower === "zh-hans") return "ZH-HANS";
|
|
43
|
+
if (lower === "en" || lower.startsWith("en-")) return "EN";
|
|
44
|
+
if (lower === "fr" || lower.startsWith("fr-")) return "FR";
|
|
45
|
+
if (lower === "es" || lower.startsWith("es-")) return "ES";
|
|
46
|
+
if (lower === "de" || lower.startsWith("de-")) return "DE";
|
|
47
|
+
if (lower === "pt" || lower.startsWith("pt-")) return "PT-BR";
|
|
48
|
+
if (lower === "it" || lower.startsWith("it-")) return "IT";
|
|
49
|
+
if (lower === "id" || lower.startsWith("id-")) return "ID";
|
|
50
|
+
if (lower === "vi" || lower.startsWith("vi-")) return "VI";
|
|
51
|
+
if (lower === "th" || lower.startsWith("th-")) return "TH";
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
function resolveInitialLocale() {
|
|
55
|
+
if (typeof window !== "undefined") {
|
|
56
|
+
const urlLocale = normalizeLocale(new URLSearchParams(window.location.search).get("lang"));
|
|
57
|
+
if (urlLocale) return urlLocale;
|
|
58
|
+
const storedLocale = normalizeLocale(window.localStorage.getItem(LOCALE_STORAGE_KEY));
|
|
59
|
+
if (storedLocale) return storedLocale;
|
|
60
|
+
}
|
|
61
|
+
return "EN";
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// src/shopify-track-page/i18n/dateTime.ts
|
|
65
|
+
var localeMap = {
|
|
66
|
+
EN: "en-US",
|
|
67
|
+
"ZH-HANS": "zh-CN",
|
|
68
|
+
FR: "fr-FR",
|
|
69
|
+
ES: "es-ES",
|
|
70
|
+
DE: "de-DE",
|
|
71
|
+
"PT-BR": "pt-BR",
|
|
72
|
+
IT: "it-IT",
|
|
73
|
+
ID: "id-ID",
|
|
74
|
+
VI: "vi-VN",
|
|
75
|
+
TH: "th-TH"
|
|
76
|
+
};
|
|
77
|
+
var tryParseDate = (time) => {
|
|
78
|
+
const normalized = time.trim();
|
|
79
|
+
if (!normalized) return null;
|
|
80
|
+
const isoCandidate = /\d{4}-\d{2}-\d{2} \d{2}:\d{2}/.test(normalized) && !normalized.includes("T") ? normalized.replace(" ", "T") : normalized;
|
|
81
|
+
const parsed = Date.parse(isoCandidate);
|
|
82
|
+
if (Number.isNaN(parsed)) return null;
|
|
83
|
+
return new Date(parsed);
|
|
84
|
+
};
|
|
85
|
+
var getFormatter = (locale, options) => new Intl.DateTimeFormat(localeMap[locale], options);
|
|
86
|
+
function formatTrackingDateLabel(time, locale, options = {}) {
|
|
87
|
+
const date = tryParseDate(time);
|
|
88
|
+
if (!date) return time;
|
|
89
|
+
return getFormatter(locale, {
|
|
90
|
+
month: "short",
|
|
91
|
+
day: "numeric",
|
|
92
|
+
...options
|
|
93
|
+
}).format(date);
|
|
94
|
+
}
|
|
95
|
+
function formatTrackingDateTime(time, locale, options = {}) {
|
|
96
|
+
const date = tryParseDate(time);
|
|
97
|
+
if (!date) return time;
|
|
98
|
+
return getFormatter(locale, {
|
|
99
|
+
month: "short",
|
|
100
|
+
day: "numeric",
|
|
101
|
+
hour: "numeric",
|
|
102
|
+
minute: "2-digit",
|
|
103
|
+
hour12: locale === "EN",
|
|
104
|
+
...options
|
|
105
|
+
}).format(date);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// src/shopify-track-page/timeline.ts
|
|
109
|
+
var DEFAULT_INFO_NODE = {
|
|
110
|
+
node: "InfoReceived",
|
|
111
|
+
description: "",
|
|
112
|
+
time: "",
|
|
113
|
+
location: "",
|
|
114
|
+
country: "",
|
|
115
|
+
state: "",
|
|
116
|
+
city: "",
|
|
117
|
+
street: "",
|
|
118
|
+
carrier: ""
|
|
119
|
+
};
|
|
120
|
+
function normalizeExternalUrl(url) {
|
|
121
|
+
const trimmedUrl = url.trim();
|
|
122
|
+
if (!trimmedUrl) return "";
|
|
123
|
+
if (/^[a-z][a-z\d+.-]*:\/\//i.test(trimmedUrl)) return trimmedUrl;
|
|
124
|
+
if (trimmedUrl.startsWith("//")) return `https:${trimmedUrl}`;
|
|
125
|
+
return `https://${trimmedUrl}`;
|
|
126
|
+
}
|
|
127
|
+
function getUrlParam(params, key) {
|
|
128
|
+
return params.get(key)?.trim() ?? "";
|
|
129
|
+
}
|
|
130
|
+
var baseTrackingSteps = [
|
|
131
|
+
{
|
|
132
|
+
key: "ordered",
|
|
133
|
+
label: "Ordered",
|
|
134
|
+
date: "Aug 7",
|
|
135
|
+
done: true,
|
|
136
|
+
icon: "check"
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
key: "ready",
|
|
140
|
+
label: "Order Ready",
|
|
141
|
+
date: "Aug 8",
|
|
142
|
+
done: false,
|
|
143
|
+
icon: "bag"
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
key: "transit",
|
|
147
|
+
label: "In Transit",
|
|
148
|
+
date: "Aug 9",
|
|
149
|
+
done: false,
|
|
150
|
+
icon: "truck"
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
key: "out",
|
|
154
|
+
label: "Out for Delivery",
|
|
155
|
+
date: "Aug 16",
|
|
156
|
+
done: false,
|
|
157
|
+
icon: "box"
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
key: "delivered",
|
|
161
|
+
label: "Delivered",
|
|
162
|
+
date: "Aug 16",
|
|
163
|
+
done: false,
|
|
164
|
+
icon: "check"
|
|
165
|
+
}
|
|
166
|
+
];
|
|
167
|
+
var trackingStatusMappings = [
|
|
168
|
+
{ stage: "InfoReceived", subStatus: "InfoReceived", stepKey: "ordered" },
|
|
169
|
+
{ stage: "InTransit", subStatus: "InTransit_PickedUp", stepKey: "ready" },
|
|
170
|
+
{ stage: "InTransit", subStatus: "InTransit_Other", stepKey: "transit" },
|
|
171
|
+
{ stage: "InTransit", subStatus: "InTransit_Departure", stepKey: "transit" },
|
|
172
|
+
{ stage: "InTransit", subStatus: "InTransit_Arrival", stepKey: "transit" },
|
|
173
|
+
{ stage: "InTransit", subStatus: "InTransit_CustomsProcessing", stepKey: "transit" },
|
|
174
|
+
{ stage: "InTransit", subStatus: "InTransit_CustomsReleased", stepKey: "transit" },
|
|
175
|
+
{ stage: "InTransit", subStatus: "InTransit_CustomsRequiringInformation", stepKey: "transit" },
|
|
176
|
+
{ stage: "Expired", subStatus: "Expired_Other", stepKey: "transit" },
|
|
177
|
+
{ stage: "AvailableForPickup", subStatus: "AvailableForPickup_Other", stepKey: "transit" },
|
|
178
|
+
{ stage: "OutForDelivery", subStatus: "OutForDelivery_Other", stepKey: "out" },
|
|
179
|
+
{ stage: "DeliveryFailure", subStatus: "DeliveryFailure_Other", stepKey: "out" },
|
|
180
|
+
{ stage: "DeliveryFailure", subStatus: "DeliveryFailure_NoBody", stepKey: "out" },
|
|
181
|
+
{ stage: "DeliveryFailure", subStatus: "DeliveryFailure_Security", stepKey: "out" },
|
|
182
|
+
{ stage: "DeliveryFailure", subStatus: "DeliveryFailure_Rejected", stepKey: "out" },
|
|
183
|
+
{ stage: "DeliveryFailure", subStatus: "DeliveryFailure_InvalidAddress", stepKey: "out" },
|
|
184
|
+
{ stage: "Delivered", subStatus: "Delivered_Other", stepKey: "delivered" }
|
|
185
|
+
];
|
|
186
|
+
var subStatusStepMap = new Map(
|
|
187
|
+
trackingStatusMappings.map(({ subStatus, stepKey }) => [subStatus, stepKey])
|
|
188
|
+
);
|
|
189
|
+
var stageStepMap = new Map(
|
|
190
|
+
trackingStatusMappings.map(({ stage, stepKey }) => [stage, stepKey])
|
|
191
|
+
);
|
|
192
|
+
var legacyNodeStepMap = /* @__PURE__ */ new Map([
|
|
193
|
+
["InfoReceived", "ordered"],
|
|
194
|
+
["PickedUp", "ready"],
|
|
195
|
+
["Departure", "transit"],
|
|
196
|
+
["Arrival", "transit"],
|
|
197
|
+
["AvailableForPickup", "transit"],
|
|
198
|
+
["OutForDelivery", "out"],
|
|
199
|
+
["Delivered", "delivered"],
|
|
200
|
+
["Returned", "delivered"],
|
|
201
|
+
["Returning", "delivered"]
|
|
202
|
+
]);
|
|
203
|
+
var getStepKeyForStatus = (status) => {
|
|
204
|
+
const normalized = status?.trim() ?? "";
|
|
205
|
+
if (!normalized) return null;
|
|
206
|
+
const exactMatch = subStatusStepMap.get(normalized) ?? legacyNodeStepMap.get(normalized);
|
|
207
|
+
if (exactMatch) return exactMatch;
|
|
208
|
+
const stage = normalized.split("_")[0];
|
|
209
|
+
return stageStepMap.get(stage) ?? null;
|
|
210
|
+
};
|
|
211
|
+
var getStepKeyForStatusRecord = (record) => getStepKeyForStatus(record.status) ?? (record.fallbackStatus ? getStepKeyForStatus(record.fallbackStatus) : null);
|
|
212
|
+
var getStepIndexForStatusRecord = (record) => {
|
|
213
|
+
const stepKey = getStepKeyForStatusRecord(record);
|
|
214
|
+
return stepKey ? baseTrackingSteps.findIndex((step) => step.key === stepKey) : -1;
|
|
215
|
+
};
|
|
216
|
+
var buildStepsFromStatusRecords = (records, locale) => {
|
|
217
|
+
let maxIndex = -1;
|
|
218
|
+
records.forEach((record) => {
|
|
219
|
+
const index = getStepIndexForStatusRecord(record);
|
|
220
|
+
if (index > maxIndex) {
|
|
221
|
+
maxIndex = index;
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
return baseTrackingSteps.map((step, index) => {
|
|
225
|
+
const matchedRecord = records.find((record) => getStepKeyForStatusRecord(record) === step.key);
|
|
226
|
+
const date = matchedRecord ? formatNodeDateLabel(matchedRecord.time, locale) : "";
|
|
227
|
+
return {
|
|
228
|
+
...step,
|
|
229
|
+
done: maxIndex >= 0 ? index <= maxIndex : step.done,
|
|
230
|
+
date: matchedRecord ? date : ""
|
|
231
|
+
};
|
|
232
|
+
});
|
|
233
|
+
};
|
|
234
|
+
var buildStepsFromRawEvents = (events, locale) => buildStepsFromStatusRecords(
|
|
235
|
+
events.map((event) => ({
|
|
236
|
+
status: event.sub_status || event.stage || "",
|
|
237
|
+
fallbackStatus: event.stage,
|
|
238
|
+
time: event.time
|
|
239
|
+
})),
|
|
240
|
+
locale
|
|
241
|
+
);
|
|
242
|
+
var buildStepsFromNodes = (nodeList, locale) => buildStepsFromStatusRecords(
|
|
243
|
+
nodeList.map((node) => ({
|
|
244
|
+
status: node.node,
|
|
245
|
+
time: node.time
|
|
246
|
+
})),
|
|
247
|
+
locale
|
|
248
|
+
);
|
|
249
|
+
var monthIndexMap = /* @__PURE__ */ new Map([
|
|
250
|
+
["jan", 0],
|
|
251
|
+
["january", 0],
|
|
252
|
+
["feb", 1],
|
|
253
|
+
["february", 1],
|
|
254
|
+
["mar", 2],
|
|
255
|
+
["march", 2],
|
|
256
|
+
["apr", 3],
|
|
257
|
+
["april", 3],
|
|
258
|
+
["may", 4],
|
|
259
|
+
["jun", 5],
|
|
260
|
+
["june", 5],
|
|
261
|
+
["jul", 6],
|
|
262
|
+
["july", 6],
|
|
263
|
+
["aug", 7],
|
|
264
|
+
["august", 7],
|
|
265
|
+
["sep", 8],
|
|
266
|
+
["sept", 8],
|
|
267
|
+
["september", 8],
|
|
268
|
+
["oct", 9],
|
|
269
|
+
["october", 9],
|
|
270
|
+
["nov", 10],
|
|
271
|
+
["november", 10],
|
|
272
|
+
["dec", 11],
|
|
273
|
+
["december", 11]
|
|
274
|
+
]);
|
|
275
|
+
var normalizeNodeTime = (time) => time.replace(/\s+/g, " ").trim();
|
|
276
|
+
var toParsedNodeTime = ({
|
|
277
|
+
year,
|
|
278
|
+
monthIndex,
|
|
279
|
+
day,
|
|
280
|
+
hourInput,
|
|
281
|
+
minute,
|
|
282
|
+
period
|
|
283
|
+
}) => {
|
|
284
|
+
if (day < 1 || day > 31 || hourInput < 1 || hourInput > 12 || minute < 0 || minute > 59) {
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
let hour = hourInput % 12;
|
|
288
|
+
if (period.toLowerCase() === "pm") {
|
|
289
|
+
hour += 12;
|
|
290
|
+
}
|
|
291
|
+
const hasYear = year !== void 0;
|
|
292
|
+
const timestamp = Date.UTC(hasYear ? year : 2001, monthIndex, day, hour, minute);
|
|
293
|
+
return { timestamp, hasYear, monthIndex, day, hour, minute };
|
|
294
|
+
};
|
|
295
|
+
var parseMonthNameTime = (time) => {
|
|
296
|
+
const match = time.match(/^([a-z]+)\s+(\d{1,2})(?:,?\s+(\d{4}))?\s+(\d{1,2}):(\d{2})\s*(am|pm)$/i);
|
|
297
|
+
if (!match) return null;
|
|
298
|
+
const [, monthName, dayValue, yearValue, hourValue, minuteValue, period] = match;
|
|
299
|
+
const monthIndex = monthIndexMap.get(monthName.toLowerCase());
|
|
300
|
+
if (monthIndex === void 0) return null;
|
|
301
|
+
return toParsedNodeTime({
|
|
302
|
+
year: yearValue ? Number(yearValue) : void 0,
|
|
303
|
+
monthIndex,
|
|
304
|
+
day: Number(dayValue),
|
|
305
|
+
hourInput: Number(hourValue),
|
|
306
|
+
minute: Number(minuteValue),
|
|
307
|
+
period
|
|
308
|
+
});
|
|
309
|
+
};
|
|
310
|
+
var parseYearFirstMonthNameTime = (time) => {
|
|
311
|
+
const match = time.match(/^(\d{4})\s+([a-z]+)\s+(\d{1,2})\s+(\d{1,2}):(\d{2})\s*(am|pm)$/i);
|
|
312
|
+
if (!match) return null;
|
|
313
|
+
const [, yearValue, monthName, dayValue, hourValue, minuteValue, period] = match;
|
|
314
|
+
const monthIndex = monthIndexMap.get(monthName.toLowerCase());
|
|
315
|
+
if (monthIndex === void 0) return null;
|
|
316
|
+
return toParsedNodeTime({
|
|
317
|
+
year: Number(yearValue),
|
|
318
|
+
monthIndex,
|
|
319
|
+
day: Number(dayValue),
|
|
320
|
+
hourInput: Number(hourValue),
|
|
321
|
+
minute: Number(minuteValue),
|
|
322
|
+
period
|
|
323
|
+
});
|
|
324
|
+
};
|
|
325
|
+
var parseNumericDateTime = (time) => {
|
|
326
|
+
const match = time.match(/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})[ T](\d{1,2}):(\d{2})(?::\d{2})?(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?$/);
|
|
327
|
+
if (!match) return null;
|
|
328
|
+
const [, yearValue, monthValue, dayValue, hourValue, minuteValue] = match;
|
|
329
|
+
const year = Number(yearValue);
|
|
330
|
+
const monthIndex = Number(monthValue) - 1;
|
|
331
|
+
const day = Number(dayValue);
|
|
332
|
+
const hour = Number(hourValue);
|
|
333
|
+
const minute = Number(minuteValue);
|
|
334
|
+
if (monthIndex < 0 || monthIndex > 11 || day < 1 || day > 31 || hour < 0 || hour > 23 || minute < 0 || minute > 59) {
|
|
335
|
+
return null;
|
|
336
|
+
}
|
|
337
|
+
return {
|
|
338
|
+
timestamp: Date.UTC(year, monthIndex, day, hour, minute),
|
|
339
|
+
hasYear: true,
|
|
340
|
+
monthIndex,
|
|
341
|
+
day,
|
|
342
|
+
hour,
|
|
343
|
+
minute
|
|
344
|
+
};
|
|
345
|
+
};
|
|
346
|
+
var parseNativeDateTime = (time) => {
|
|
347
|
+
const isoCandidate = /\d{4}-\d{2}-\d{2} \d{2}:\d{2}/.test(time) && !time.includes("T") ? time.replace(" ", "T") : time;
|
|
348
|
+
const parsed = Date.parse(isoCandidate);
|
|
349
|
+
if (Number.isNaN(parsed)) return null;
|
|
350
|
+
const date = new Date(parsed);
|
|
351
|
+
return {
|
|
352
|
+
timestamp: parsed,
|
|
353
|
+
hasYear: /\d{4}/.test(time),
|
|
354
|
+
monthIndex: date.getMonth(),
|
|
355
|
+
day: date.getDate(),
|
|
356
|
+
hour: date.getHours(),
|
|
357
|
+
minute: date.getMinutes()
|
|
358
|
+
};
|
|
359
|
+
};
|
|
360
|
+
var getNodeTimeMeta = (time) => {
|
|
361
|
+
const normalized = normalizeNodeTime(time);
|
|
362
|
+
if (!normalized) return null;
|
|
363
|
+
return parseMonthNameTime(normalized) ?? parseYearFirstMonthNameTime(normalized) ?? parseNumericDateTime(normalized) ?? parseNativeDateTime(normalized);
|
|
364
|
+
};
|
|
365
|
+
var formatNodeTime = (time, locale) => formatTrackingDateTime(normalizeNodeTime(time), locale);
|
|
366
|
+
var formatNodeDateLabel = (time, locale) => formatTrackingDateLabel(normalizeNodeTime(time), locale);
|
|
367
|
+
function formatEstimatedDelivery(estimatedDelivery, locale) {
|
|
368
|
+
if (!estimatedDelivery || !locale) return null;
|
|
369
|
+
const from = estimatedDelivery.from.trim();
|
|
370
|
+
const to = estimatedDelivery.to.trim();
|
|
371
|
+
if (!from || !to) return null;
|
|
372
|
+
const dateText = from === to ? formatTrackingDateLabel(from, locale) : `${formatTrackingDateLabel(from, locale)}-${formatTrackingDateLabel(to, locale)}`;
|
|
373
|
+
return {
|
|
374
|
+
dateText,
|
|
375
|
+
fromLabel: formatTrackingDateLabel(from, locale),
|
|
376
|
+
toLabel: formatTrackingDateLabel(to, locale)
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
var getComparisonDateTimestamp = (value, now = /* @__PURE__ */ new Date()) => {
|
|
380
|
+
const normalized = normalizeNodeTime(value);
|
|
381
|
+
if (!normalized) return null;
|
|
382
|
+
const dateOnlyMatch = normalized.match(/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/);
|
|
383
|
+
if (dateOnlyMatch) {
|
|
384
|
+
const [, year, month, day] = dateOnlyMatch;
|
|
385
|
+
return Date.UTC(Number(year), Number(month) - 1, Number(day));
|
|
386
|
+
}
|
|
387
|
+
const parsed = getNodeTimeMeta(normalized);
|
|
388
|
+
if (parsed) {
|
|
389
|
+
const year = parsed.hasYear ? new Date(parsed.timestamp).getUTCFullYear() : now.getFullYear();
|
|
390
|
+
return Date.UTC(year, parsed.monthIndex, parsed.day);
|
|
391
|
+
}
|
|
392
|
+
const nativeTimestamp = Date.parse(normalized);
|
|
393
|
+
if (Number.isNaN(nativeTimestamp)) return null;
|
|
394
|
+
const date = new Date(nativeTimestamp);
|
|
395
|
+
return Date.UTC(date.getFullYear(), date.getMonth(), date.getDate());
|
|
396
|
+
};
|
|
397
|
+
var getLatestTrackingTimestamp = (milestone, now = /* @__PURE__ */ new Date()) => {
|
|
398
|
+
const times = (milestone.rawEventList?.length ? milestone.rawEventList.map((event) => event.time) : milestone.nodeList.map((node) => node.time)).map((time) => getComparisonDateTimestamp(time, now)).filter((timestamp) => timestamp !== null);
|
|
399
|
+
return times.length > 0 ? Math.max(...times) : null;
|
|
400
|
+
};
|
|
401
|
+
var hasActualDelivery = (milestone) => {
|
|
402
|
+
const statuses = milestone.rawEventList?.length ? milestone.rawEventList.flatMap((event) => [event.sub_status, event.stage]) : milestone.nodeList.map((node) => node.node);
|
|
403
|
+
return statuses.some((status) => /^delivered(?:_|$)/i.test(status.trim()));
|
|
404
|
+
};
|
|
405
|
+
function shouldShowEstimatedDelivery(milestone, now = /* @__PURE__ */ new Date()) {
|
|
406
|
+
const estimatedDelivery = milestone?.estimated_delivery;
|
|
407
|
+
if (!milestone || !estimatedDelivery) return false;
|
|
408
|
+
if (hasActualDelivery(milestone)) return false;
|
|
409
|
+
const endTimestamp = getComparisonDateTimestamp(estimatedDelivery.to, now);
|
|
410
|
+
if (endTimestamp === null) return false;
|
|
411
|
+
const today = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();
|
|
412
|
+
const latestTracking = getLatestTrackingTimestamp(milestone, now) ?? today;
|
|
413
|
+
return endTimestamp >= Math.max(today, latestTracking);
|
|
414
|
+
}
|
|
415
|
+
var fixYearBoundary = (details) => {
|
|
416
|
+
if (details.some((d) => d.hasYear)) return details;
|
|
417
|
+
const valid = details.map((d) => d.timestamp).filter((t) => t !== null);
|
|
418
|
+
if (valid.length < 2) return details;
|
|
419
|
+
const minTs = Math.min(...valid);
|
|
420
|
+
const maxTs = Math.max(...valid);
|
|
421
|
+
const SIX_MONTHS_MS = 6 * 30 * 24 * 60 * 60 * 1e3;
|
|
422
|
+
const ONE_YEAR_MS = 365 * 24 * 60 * 60 * 1e3;
|
|
423
|
+
if (maxTs - minTs <= SIX_MONTHS_MS) return details;
|
|
424
|
+
return details.map((d) => {
|
|
425
|
+
if (d.timestamp === null || d.timestamp - minTs <= SIX_MONTHS_MS) return d;
|
|
426
|
+
return { ...d, timestamp: d.timestamp - ONE_YEAR_MS };
|
|
427
|
+
});
|
|
428
|
+
};
|
|
429
|
+
var normalizeSyntheticPrefixTimeline = (details, syntheticPrefixLength = 0) => {
|
|
430
|
+
if (syntheticPrefixLength <= 0) return details;
|
|
431
|
+
if (details.some((item) => item.hasYear)) return details;
|
|
432
|
+
const syntheticDetails = details.slice(0, syntheticPrefixLength);
|
|
433
|
+
const realDetails = details.slice(syntheticPrefixLength);
|
|
434
|
+
const syntheticTimestamps = syntheticDetails.map((item) => item.timestamp).filter((timestamp) => timestamp !== null);
|
|
435
|
+
const realTimestamps = realDetails.map((item) => item.timestamp).filter((timestamp) => timestamp !== null);
|
|
436
|
+
if (syntheticTimestamps.length === 0 || realTimestamps.length === 0) return details;
|
|
437
|
+
const minSyntheticTs = Math.min(...syntheticTimestamps);
|
|
438
|
+
const maxRealTs = Math.max(...realTimestamps);
|
|
439
|
+
if (minSyntheticTs <= maxRealTs) return details;
|
|
440
|
+
const THIRTY_DAYS_MS = 30 * 24 * 60 * 60 * 1e3;
|
|
441
|
+
if (minSyntheticTs - maxRealTs <= THIRTY_DAYS_MS) return details;
|
|
442
|
+
const minRealTs = Math.min(...realTimestamps);
|
|
443
|
+
const ONE_YEAR_MS = 365 * 24 * 60 * 60 * 1e3;
|
|
444
|
+
const shiftYears = Math.ceil((minSyntheticTs - minRealTs + 1) / ONE_YEAR_MS);
|
|
445
|
+
return details.map((item, index) => {
|
|
446
|
+
if (index >= syntheticPrefixLength || item.timestamp === null) return item;
|
|
447
|
+
return { ...item, timestamp: item.timestamp - shiftYears * ONE_YEAR_MS };
|
|
448
|
+
});
|
|
449
|
+
};
|
|
450
|
+
var sortShippingDetailsByTime = (details, syntheticPrefixLength = 0) => {
|
|
451
|
+
const adjustedDetails = normalizeSyntheticPrefixTimeline(
|
|
452
|
+
fixYearBoundary(details),
|
|
453
|
+
syntheticPrefixLength
|
|
454
|
+
);
|
|
455
|
+
const hasTimestamp = adjustedDetails.some((item) => item.timestamp !== null);
|
|
456
|
+
return hasTimestamp ? [...adjustedDetails].sort((a, b) => {
|
|
457
|
+
if (a.timestamp === null && b.timestamp === null) {
|
|
458
|
+
return a.index - b.index;
|
|
459
|
+
}
|
|
460
|
+
if (a.timestamp === null) {
|
|
461
|
+
return 1;
|
|
462
|
+
}
|
|
463
|
+
if (b.timestamp === null) {
|
|
464
|
+
return -1;
|
|
465
|
+
}
|
|
466
|
+
return b.timestamp - a.timestamp || a.index - b.index;
|
|
467
|
+
}) : adjustedDetails;
|
|
468
|
+
};
|
|
469
|
+
var buildShippingDetailsFromRecords = (records, locale) => {
|
|
470
|
+
const filtered = records.filter(
|
|
471
|
+
(record) => record.location.trim() || record.description.trim() || record.time.trim()
|
|
472
|
+
);
|
|
473
|
+
if (filtered.length === 0) return [];
|
|
474
|
+
const rawDetails = filtered.map((record, index) => {
|
|
475
|
+
const timeMeta = getNodeTimeMeta(record.time);
|
|
476
|
+
return {
|
|
477
|
+
index,
|
|
478
|
+
description: [record.location.trim(), record.description.trim()].filter(Boolean).join(", "),
|
|
479
|
+
time: formatNodeTime(record.time, locale),
|
|
480
|
+
timestamp: timeMeta?.timestamp ?? null,
|
|
481
|
+
hasYear: timeMeta?.hasYear ?? false
|
|
482
|
+
};
|
|
483
|
+
});
|
|
484
|
+
const sortedDetails = sortShippingDetailsByTime(rawDetails);
|
|
485
|
+
return sortedDetails.map((item, index) => ({
|
|
486
|
+
description: item.description,
|
|
487
|
+
time: item.time,
|
|
488
|
+
isLatest: index === 0
|
|
489
|
+
}));
|
|
490
|
+
};
|
|
491
|
+
var buildShippingDetails = (nodeList, locale) => buildShippingDetailsFromRecords(nodeList, locale);
|
|
492
|
+
var hasRawTrackingSignal = (event) => Boolean(
|
|
493
|
+
event.sub_status.trim() || event.location.trim() || event.country.trim() || event.state.trim() || event.city.trim() || event.street.trim() || getStepKeyForStatus(event.stage)
|
|
494
|
+
);
|
|
495
|
+
var getSyntheticRawEventPrefixLength = (events) => {
|
|
496
|
+
const firstEventStage = events[0]?.stage.trim().toLowerCase();
|
|
497
|
+
if (firstEventStage !== "order confirmed" && firstEventStage !== "package picked up") {
|
|
498
|
+
return 0;
|
|
499
|
+
}
|
|
500
|
+
let length = 0;
|
|
501
|
+
for (const event of events) {
|
|
502
|
+
if (hasRawTrackingSignal(event)) break;
|
|
503
|
+
length += 1;
|
|
504
|
+
}
|
|
505
|
+
return length;
|
|
506
|
+
};
|
|
507
|
+
var getMilestoneNodeList = (milestone) => {
|
|
508
|
+
const rawNodeList = milestone?.nodeList ?? [];
|
|
509
|
+
return rawNodeList.length > 0 ? rawNodeList : [DEFAULT_INFO_NODE];
|
|
510
|
+
};
|
|
511
|
+
function buildTrackingStepsFromMilestone(milestone, locale) {
|
|
512
|
+
const rawEvents = milestone?.rawEventList ?? [];
|
|
513
|
+
return rawEvents.length > 0 ? buildStepsFromRawEvents(rawEvents, locale) : buildStepsFromNodes(getMilestoneNodeList(milestone), locale);
|
|
514
|
+
}
|
|
515
|
+
function buildShippingDetailsFromMilestone(milestone, locale) {
|
|
516
|
+
const rawEvents = milestone?.rawEventList ?? [];
|
|
517
|
+
return rawEvents.length > 0 ? buildShippingDetailsFromRawEvents(rawEvents, locale) : buildShippingDetails(milestone?.nodeList ?? [], locale);
|
|
518
|
+
}
|
|
519
|
+
var buildShippingDetailsFromRawEvents = (events, locale) => {
|
|
520
|
+
const filtered = events.filter(
|
|
521
|
+
(event) => event.location.trim() || event.description.trim() || event.time.trim()
|
|
522
|
+
);
|
|
523
|
+
if (filtered.length === 0) return [];
|
|
524
|
+
const syntheticPrefixLength = getSyntheticRawEventPrefixLength(filtered);
|
|
525
|
+
const rawDetails = filtered.map((event, index) => {
|
|
526
|
+
const timeMeta = getNodeTimeMeta(event.time);
|
|
527
|
+
return {
|
|
528
|
+
index,
|
|
529
|
+
description: [event.location.trim(), event.description.trim()].filter(Boolean).join(", "),
|
|
530
|
+
time: formatNodeTime(event.time, locale),
|
|
531
|
+
timestamp: timeMeta?.timestamp ?? null,
|
|
532
|
+
hasYear: timeMeta?.hasYear ?? false
|
|
533
|
+
};
|
|
534
|
+
});
|
|
535
|
+
const sortedDetails = sortShippingDetailsByTime(rawDetails, syntheticPrefixLength);
|
|
536
|
+
return sortedDetails.map((item, index) => ({
|
|
537
|
+
description: item.description,
|
|
538
|
+
time: item.time,
|
|
539
|
+
isLatest: index === 0
|
|
540
|
+
}));
|
|
541
|
+
};
|
|
542
|
+
function normalizeOrderValue(value) {
|
|
543
|
+
return value.trim();
|
|
544
|
+
}
|
|
545
|
+
function syncTrackingQueryToUrl(type, value, contactValue = "") {
|
|
546
|
+
if (typeof window === "undefined") return;
|
|
547
|
+
const normalizedValue = value.trim();
|
|
548
|
+
if (!normalizedValue) return;
|
|
549
|
+
const normalizedContactValue = contactValue.trim();
|
|
550
|
+
const url = new URL(window.location.href);
|
|
551
|
+
const params = new URLSearchParams(url.hash.replace(/^#/, ""));
|
|
552
|
+
params.delete("order_number");
|
|
553
|
+
params.delete("tracking_number");
|
|
554
|
+
params.delete("email");
|
|
555
|
+
if (type === "order") {
|
|
556
|
+
params.set("order_number", normalizedValue);
|
|
557
|
+
if (normalizedContactValue) {
|
|
558
|
+
params.set("email", normalizedContactValue);
|
|
559
|
+
}
|
|
560
|
+
} else {
|
|
561
|
+
params.set("tracking_number", normalizedValue);
|
|
562
|
+
}
|
|
563
|
+
url.hash = params.toString();
|
|
564
|
+
window.history.replaceState(window.history.state, "", url);
|
|
565
|
+
}
|
|
566
|
+
function readTrackingQueryLocationState(search = typeof window === "undefined" ? "" : window.location.search, hash = typeof window === "undefined" ? "" : window.location.hash) {
|
|
567
|
+
const searchParams = new URLSearchParams(search);
|
|
568
|
+
const hashParams = new URLSearchParams(hash.replace(/^#/, ""));
|
|
569
|
+
const getParam = (key) => getUrlParam(searchParams, key) || getUrlParam(hashParams, key);
|
|
570
|
+
const trackingNumber = getParam("tracking_number");
|
|
571
|
+
const orderNumber = normalizeOrderValue(getParam("order_number"));
|
|
572
|
+
const email = getParam("email");
|
|
573
|
+
if (trackingNumber) {
|
|
574
|
+
return { tab: "tracking", trackingNumber, orderNumber: "", email: "", canAutoQuery: true };
|
|
575
|
+
}
|
|
576
|
+
if (orderNumber) {
|
|
577
|
+
return { tab: "order", trackingNumber: "", orderNumber, email, canAutoQuery: Boolean(email) };
|
|
578
|
+
}
|
|
579
|
+
return { tab: "tracking", trackingNumber: "", orderNumber: "", email: "", canAutoQuery: false };
|
|
580
|
+
}
|
|
581
|
+
function readTrackingQueryFromLocation(search = typeof window === "undefined" ? "" : window.location.search, hash = typeof window === "undefined" ? "" : window.location.hash) {
|
|
582
|
+
const state = readTrackingQueryLocationState(search, hash);
|
|
583
|
+
if (!state.canAutoQuery) return void 0;
|
|
584
|
+
if (state.tab === "tracking") return { mode: "tracking", trackingNumber: state.trackingNumber };
|
|
585
|
+
return { mode: "order", orderNumber: state.orderNumber, email: state.email };
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
// src/shopify-track-page/poweredBy.ts
|
|
589
|
+
var POWERED_BY_HIDDEN_STORE_DOMAINS = /* @__PURE__ */ new Set([
|
|
590
|
+
"nbstore-unlrgjwn.myshopify.com",
|
|
591
|
+
"wavvveglobal.com"
|
|
592
|
+
]);
|
|
593
|
+
function getUrlParam2(params, key) {
|
|
594
|
+
return params.get(key)?.trim() ?? "";
|
|
595
|
+
}
|
|
596
|
+
var normalizeStoreDomain = (value) => {
|
|
597
|
+
const trimmedValue = value.trim().toLowerCase();
|
|
598
|
+
if (!trimmedValue) return "";
|
|
599
|
+
const host = trimmedValue.replace(/^[a-z][a-z\d+.-]*:\/\//i, "").replace(/^\/\//, "").split(/[/?#]/)[0].replace(/:\d+$/, "");
|
|
600
|
+
return host.replace(/^www\./, "");
|
|
601
|
+
};
|
|
602
|
+
function shouldHidePoweredBy(targetWindow) {
|
|
603
|
+
const runtimeWindow = targetWindow ?? (typeof window === "undefined" ? void 0 : window);
|
|
604
|
+
if (!runtimeWindow) return false;
|
|
605
|
+
const shopifyWindow = runtimeWindow;
|
|
606
|
+
if (shopifyWindow.__BESTRACK__?.featureFlags?.enableTrackingPageWatermarkRemoval === true) {
|
|
607
|
+
return true;
|
|
608
|
+
}
|
|
609
|
+
const searchParams = new URLSearchParams(runtimeWindow.location.search);
|
|
610
|
+
const hashParams = new URLSearchParams(runtimeWindow.location.hash.replace(/^#/, ""));
|
|
611
|
+
const candidateDomains = [
|
|
612
|
+
runtimeWindow.location.hostname,
|
|
613
|
+
getUrlParam2(searchParams, "shop"),
|
|
614
|
+
getUrlParam2(searchParams, "shop_domain"),
|
|
615
|
+
getUrlParam2(hashParams, "shop"),
|
|
616
|
+
getUrlParam2(hashParams, "shop_domain"),
|
|
617
|
+
shopifyWindow.Shopify?.shop ?? "",
|
|
618
|
+
shopifyWindow.Shopify?.domain ?? ""
|
|
619
|
+
];
|
|
620
|
+
return candidateDomains.map(normalizeStoreDomain).some((domain) => POWERED_BY_HIDDEN_STORE_DOMAINS.has(domain));
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
// src/shopify-track-query.ts
|
|
624
|
+
var SHOPIFY_TRACK_QUERY_PATH = "/track/query";
|
|
625
|
+
var SHOPIFY_RECOMMEND_PATH = "/products/recommend";
|
|
626
|
+
function resolveShopifyTrackQueryLocale(locale) {
|
|
627
|
+
const resolved = typeof locale === "function" ? locale() : locale;
|
|
628
|
+
return resolved ?? resolveInitialLocale();
|
|
629
|
+
}
|
|
630
|
+
function withShopifyAppProxyPrefix(path, prefix) {
|
|
631
|
+
const trimmed = prefix.trim();
|
|
632
|
+
const normalizedPrefix = !trimmed || trimmed === "/" ? "" : (trimmed.startsWith("/") ? trimmed : `/${trimmed}`).replace(/\/+$/, "");
|
|
633
|
+
const normalizedPath = path.startsWith("/") ? path : `/${path}`;
|
|
634
|
+
return `${normalizedPrefix}${normalizedPath}`;
|
|
635
|
+
}
|
|
636
|
+
var emptyResult = () => ({
|
|
637
|
+
outcome: "empty",
|
|
638
|
+
trackingNumber: "",
|
|
639
|
+
status: ""
|
|
640
|
+
});
|
|
641
|
+
function withShopifyTrackCacheBust(url, now = Date.now()) {
|
|
642
|
+
const separator = url.includes("?") ? "&" : "?";
|
|
643
|
+
return `${url}${separator}_t=${now}`;
|
|
644
|
+
}
|
|
645
|
+
function buildShopifyTrackQueryPayload(request, locale = "EN") {
|
|
646
|
+
return {
|
|
647
|
+
order_number: request.mode === "order" ? request.orderNumber.trim() : "",
|
|
648
|
+
email: request.mode === "order" ? request.email.trim() : "",
|
|
649
|
+
tracking_number: request.mode === "tracking" ? request.trackingNumber.trim() : "",
|
|
650
|
+
lang: locale
|
|
651
|
+
};
|
|
652
|
+
}
|
|
653
|
+
function buildShopifyRecommendPayload(page = 1, pageSize = 20) {
|
|
654
|
+
return { page, page_size: pageSize };
|
|
655
|
+
}
|
|
656
|
+
function toProgress(steps) {
|
|
657
|
+
let lastDone = -1;
|
|
658
|
+
steps.forEach((step, index) => {
|
|
659
|
+
if (step.done) lastDone = index;
|
|
660
|
+
});
|
|
661
|
+
return steps.map((step, index) => ({
|
|
662
|
+
id: step.key,
|
|
663
|
+
label: step.label,
|
|
664
|
+
date: step.date || void 0,
|
|
665
|
+
icon: step.icon,
|
|
666
|
+
state: !step.done ? "upcoming" : index === lastDone ? "current" : "complete"
|
|
667
|
+
}));
|
|
668
|
+
}
|
|
669
|
+
function toEvents(details) {
|
|
670
|
+
return details.map((detail, index) => ({
|
|
671
|
+
id: `event-${index}`,
|
|
672
|
+
title: detail.description,
|
|
673
|
+
at: detail.time || void 0,
|
|
674
|
+
state: detail.isLatest ? "current" : "complete"
|
|
675
|
+
}));
|
|
676
|
+
}
|
|
677
|
+
function toOrderItems(items) {
|
|
678
|
+
return (items ?? []).map((item, index) => ({
|
|
679
|
+
id: item.variant_id || item.product_id || `item-${index}`,
|
|
680
|
+
title: [item.title, item.variant_title].filter(Boolean).join(" - "),
|
|
681
|
+
quantity: item.quantity,
|
|
682
|
+
imageUrl: item.image_url || void 0
|
|
683
|
+
}));
|
|
684
|
+
}
|
|
685
|
+
function cityRegion(milestone) {
|
|
686
|
+
const records = milestone?.rawEventList?.length ? milestone.rawEventList : milestone?.nodeList ?? [];
|
|
687
|
+
for (const record of records) {
|
|
688
|
+
const value = [record.city, record.state, record.country].map((part) => part.trim()).filter(Boolean).join(", ");
|
|
689
|
+
if (value) return value;
|
|
690
|
+
}
|
|
691
|
+
return void 0;
|
|
692
|
+
}
|
|
693
|
+
function mapAd(ad) {
|
|
694
|
+
const imageUrl = ad?.image_url?.trim();
|
|
695
|
+
if (!ad || !imageUrl) return void 0;
|
|
696
|
+
const href = ad.link_url?.trim() ? normalizeExternalUrl(ad.link_url) : void 0;
|
|
697
|
+
return href ? { imageUrl, href } : { imageUrl };
|
|
698
|
+
}
|
|
699
|
+
function mapMilestone(milestone, locale, index) {
|
|
700
|
+
const steps = toProgress(buildTrackingStepsFromMilestone(milestone, locale));
|
|
701
|
+
const events = toEvents(buildShippingDetailsFromMilestone(milestone, locale));
|
|
702
|
+
const current = [...steps].reverse().find((step) => step.state !== "upcoming");
|
|
703
|
+
const estimatedDelivery = shouldShowEstimatedDelivery(milestone) ? formatEstimatedDelivery(milestone?.estimated_delivery, locale)?.dateText : void 0;
|
|
704
|
+
return {
|
|
705
|
+
id: milestone?.tracking_number || `shipment-${index}`,
|
|
706
|
+
label: `Shipment ${index + 1}`,
|
|
707
|
+
trackingNumber: milestone?.tracking_number || void 0,
|
|
708
|
+
status: current?.label || "Ordered",
|
|
709
|
+
carrier: milestone?.carrier || void 0,
|
|
710
|
+
latestEvent: events[0]?.title,
|
|
711
|
+
updatedAt: events[0]?.at,
|
|
712
|
+
destination: cityRegion(milestone),
|
|
713
|
+
estimatedDelivery,
|
|
714
|
+
progress: steps,
|
|
715
|
+
events,
|
|
716
|
+
orderItems: toOrderItems(milestone?.package_items),
|
|
717
|
+
ad: void 0
|
|
718
|
+
};
|
|
719
|
+
}
|
|
720
|
+
function mapShopifyTrackQueryResponse(response, request, locale = "EN") {
|
|
721
|
+
if (response.code !== 0) {
|
|
722
|
+
return emptyResult();
|
|
723
|
+
}
|
|
724
|
+
const data = response.data;
|
|
725
|
+
const milestones = data?.mileStoneList ?? [];
|
|
726
|
+
const shipments = milestones.map((milestone, index) => mapMilestone(milestone, locale, index));
|
|
727
|
+
const primary = shipments[0] ?? mapMilestone(void 0, locale, 0);
|
|
728
|
+
const trackingNumber = request.mode === "tracking" ? request.trackingNumber.trim() : primary.trackingNumber || "";
|
|
729
|
+
const ad = mapAd(data?.ad_config ?? null);
|
|
730
|
+
return {
|
|
731
|
+
outcome: "found",
|
|
732
|
+
trackingNumber,
|
|
733
|
+
status: primary.status || "Ordered",
|
|
734
|
+
carrier: primary.carrier,
|
|
735
|
+
latestEvent: primary.latestEvent,
|
|
736
|
+
updatedAt: primary.updatedAt,
|
|
737
|
+
destination: primary.destination,
|
|
738
|
+
orderNumber: data?.order_number || (request.mode === "order" ? request.orderNumber : void 0),
|
|
739
|
+
estimatedDelivery: primary.estimatedDelivery,
|
|
740
|
+
progress: primary.progress,
|
|
741
|
+
events: primary.events,
|
|
742
|
+
orderItems: primary.orderItems,
|
|
743
|
+
ad,
|
|
744
|
+
shipments: shipments.map((shipment) => ({ ...shipment, ad }))
|
|
745
|
+
};
|
|
746
|
+
}
|
|
747
|
+
function parseRecommendPrice(value) {
|
|
748
|
+
if (!value) return void 0;
|
|
749
|
+
const numeric = Number(value.replace(/[^0-9.]/g, ""));
|
|
750
|
+
if (!Number.isFinite(numeric)) return void 0;
|
|
751
|
+
const amount = Math.round(numeric * 100);
|
|
752
|
+
if (!Number.isInteger(amount)) return void 0;
|
|
753
|
+
return { amount, currencyCode: "USD" };
|
|
754
|
+
}
|
|
755
|
+
function resolveShopifyRecommendHref(onlineStoreUrl, handle) {
|
|
756
|
+
const trimmedUrl = onlineStoreUrl?.trim();
|
|
757
|
+
if (trimmedUrl) {
|
|
758
|
+
if (trimmedUrl.startsWith("/") && typeof window !== "undefined") {
|
|
759
|
+
return new URL(trimmedUrl, window.location.origin).toString();
|
|
760
|
+
}
|
|
761
|
+
return normalizeExternalUrl(trimmedUrl) || void 0;
|
|
762
|
+
}
|
|
763
|
+
const trimmedHandle = handle?.trim();
|
|
764
|
+
if (!trimmedHandle) return void 0;
|
|
765
|
+
const relative = `/products/${trimmedHandle}`;
|
|
766
|
+
if (typeof window !== "undefined") return new URL(relative, window.location.origin).toString();
|
|
767
|
+
return relative;
|
|
768
|
+
}
|
|
769
|
+
function mapShopifyRecommendationsResponse(response) {
|
|
770
|
+
const products = response.data?.products ?? [];
|
|
771
|
+
return products.map((product) => ({
|
|
772
|
+
id: product.id,
|
|
773
|
+
title: product.title,
|
|
774
|
+
description: "",
|
|
775
|
+
imageUrl: product.featuredImage?.url,
|
|
776
|
+
href: resolveShopifyRecommendHref(product.onlineStoreUrl, product.handle),
|
|
777
|
+
price: parseRecommendPrice(product.price || product.variants?.[0]?.price)
|
|
778
|
+
}));
|
|
779
|
+
}
|
|
780
|
+
async function postWithRetry(post, url, body, retries) {
|
|
781
|
+
let lastError;
|
|
782
|
+
for (let attempt = 0; attempt <= retries; attempt += 1) {
|
|
783
|
+
try {
|
|
784
|
+
return await post(withShopifyTrackCacheBust(url), body);
|
|
785
|
+
} catch (error) {
|
|
786
|
+
lastError = error;
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
throw lastError ?? new Error("track query failed");
|
|
790
|
+
}
|
|
791
|
+
function createShopifyTrackQuery(transport) {
|
|
792
|
+
const retries = transport.retries ?? 1;
|
|
793
|
+
return async (request) => {
|
|
794
|
+
const locale = resolveShopifyTrackQueryLocale(transport.locale);
|
|
795
|
+
const payload = buildShopifyTrackQueryPayload(request, locale);
|
|
796
|
+
try {
|
|
797
|
+
const response = await postWithRetry(transport.post, SHOPIFY_TRACK_QUERY_PATH, { ...payload }, retries);
|
|
798
|
+
const mapped = mapShopifyTrackQueryResponse(response, request, locale);
|
|
799
|
+
if (mapped.outcome !== "empty" || !transport.fallbackToEnglish || locale === "EN") return mapped;
|
|
800
|
+
} catch {
|
|
801
|
+
if (!transport.fallbackToEnglish || locale === "EN") return emptyResult();
|
|
802
|
+
}
|
|
803
|
+
try {
|
|
804
|
+
const fallback = await postWithRetry(
|
|
805
|
+
transport.post,
|
|
806
|
+
SHOPIFY_TRACK_QUERY_PATH,
|
|
807
|
+
{ ...buildShopifyTrackQueryPayload(request, "EN") },
|
|
808
|
+
retries
|
|
809
|
+
);
|
|
810
|
+
return mapShopifyTrackQueryResponse(fallback, request, "EN");
|
|
811
|
+
} catch {
|
|
812
|
+
return emptyResult();
|
|
813
|
+
}
|
|
814
|
+
};
|
|
815
|
+
}
|
|
816
|
+
function createShopifyRecommendationsQuery(post) {
|
|
817
|
+
return async () => {
|
|
818
|
+
try {
|
|
819
|
+
const response = await post(SHOPIFY_RECOMMEND_PATH, { ...buildShopifyRecommendPayload() });
|
|
820
|
+
return mapShopifyRecommendationsResponse(response);
|
|
821
|
+
} catch {
|
|
822
|
+
return [];
|
|
823
|
+
}
|
|
824
|
+
};
|
|
825
|
+
}
|
|
3
826
|
|
|
4
827
|
// src/track-page-display.tsx
|
|
5
828
|
import { useState } from "react";
|
|
@@ -15,23 +838,10 @@ function text(props, key, fallback = "") {
|
|
|
15
838
|
return typeof props[key] === "string" ? props[key] : fallback;
|
|
16
839
|
}
|
|
17
840
|
function safeHref(value) {
|
|
18
|
-
|
|
19
|
-
if (value.startsWith("/")) return value;
|
|
20
|
-
try {
|
|
21
|
-
const url = new URL(value);
|
|
22
|
-
return url.protocol === "https:" || url.protocol === "http:" ? url.toString() : "#";
|
|
23
|
-
} catch {
|
|
24
|
-
return "#";
|
|
25
|
-
}
|
|
841
|
+
return safeTrackingPageUrl(value);
|
|
26
842
|
}
|
|
27
843
|
function safeImageUrl(value) {
|
|
28
|
-
|
|
29
|
-
try {
|
|
30
|
-
const url = new URL(value);
|
|
31
|
-
return url.protocol === "https:" || url.protocol === "http:" ? url.toString() : "";
|
|
32
|
-
} catch {
|
|
33
|
-
return "";
|
|
34
|
-
}
|
|
844
|
+
return safeTrackingPageUrl(value);
|
|
35
845
|
}
|
|
36
846
|
function defaultProgress(status) {
|
|
37
847
|
const steps = [
|
|
@@ -136,7 +946,7 @@ function PackageContents({ items }) {
|
|
|
136
946
|
"x",
|
|
137
947
|
item.quantity
|
|
138
948
|
] }),
|
|
139
|
-
item.href ? /* @__PURE__ */ jsx("a", { href: safeHref(item.href), style: { display: "inline-flex", minHeight: 32, alignItems: "center", padding: "6px 16px", border: "1px solid #cbd5e1", borderRadius: 6, color: "#1e293b", fontSize: 13, fontWeight: 500, textDecoration: "none" }, children: "Reorder" }) : null
|
|
949
|
+
safeHref(item.href) ? /* @__PURE__ */ jsx("a", { href: safeHref(item.href), style: { display: "inline-flex", minHeight: 32, alignItems: "center", padding: "6px 16px", border: "1px solid #cbd5e1", borderRadius: 6, color: "#1e293b", fontSize: 13, fontWeight: 500, textDecoration: "none" }, children: "Reorder" }) : null
|
|
140
950
|
] })
|
|
141
951
|
] })
|
|
142
952
|
] }, item.id);
|
|
@@ -147,11 +957,27 @@ function RecommendationCards({ items }) {
|
|
|
147
957
|
/* @__PURE__ */ jsx("div", { style: { width: 262, height: 262, maxWidth: "100%", borderRadius: "var(--pb-radius, 8px)", border: "1px solid #E3E3E3", overflow: "hidden", background: "#f1f5f9" }, children: /* @__PURE__ */ jsx(ProductImage, { src: item.imageUrl, alt: item.title, size: 262 }) }),
|
|
148
958
|
/* @__PURE__ */ jsxs("div", { style: { padding: "12px 8px", textAlign: "center", fontSize: 14 }, children: [
|
|
149
959
|
/* @__PURE__ */ jsx("p", { style: { margin: 0, color: "#334155" }, children: item.title }),
|
|
150
|
-
item.price ? /* @__PURE__ */ jsx("p", { style: { margin: "4px 0 0", fontWeight: 600, color: "#0f172a" }, children: item.price }) : null,
|
|
960
|
+
item.price && formatTrackingPageMoney(item.price)?.amount ? /* @__PURE__ */ jsx("p", { style: { margin: "4px 0 0", fontWeight: 600, color: "#0f172a" }, children: formatTrackingPageMoney(item.price).amount }) : null,
|
|
151
961
|
item.description ? /* @__PURE__ */ jsx("p", { style: { margin: "4px 0 0", color: "#64748b", fontSize: 13 }, children: item.description }) : null
|
|
152
962
|
] })
|
|
153
963
|
] }, item.id)) });
|
|
154
964
|
}
|
|
965
|
+
function TrackingPageAdSlot({ ad, editor = false }) {
|
|
966
|
+
const [failedUrl, setFailedUrl] = useState();
|
|
967
|
+
const imageUrl = safeImageUrl(ad?.imageUrl);
|
|
968
|
+
if ((!imageUrl || failedUrl === imageUrl) && !editor) return null;
|
|
969
|
+
const content = imageUrl && failedUrl !== imageUrl ? /* @__PURE__ */ jsx("img", { src: imageUrl, alt: ad?.alt ?? "Promotion", loading: "lazy", onError: () => setFailedUrl(imageUrl), style: { display: "block", width: "100%", height: "auto", objectFit: "cover" } }) : /* @__PURE__ */ jsx("div", { "aria-label": "Advertisement placeholder", style: { display: "grid", minHeight: 120, placeItems: "center", border: "1px dashed #cbd5e1", background: "#f8fafc", color: "#64748b", fontSize: 13 }, children: "Advertisement space" });
|
|
970
|
+
const href = safeHref(ad?.href);
|
|
971
|
+
if (!imageUrl || !href) return /* @__PURE__ */ jsx("div", { "data-tracking-page-ad": true, children: content });
|
|
972
|
+
return /* @__PURE__ */ jsx("a", { "data-tracking-page-ad": true, href, target: "_blank", rel: "noopener noreferrer", children: content });
|
|
973
|
+
}
|
|
974
|
+
function EstimatedDeliveryCard({ dateText }) {
|
|
975
|
+
return /* @__PURE__ */ jsxs("div", { "aria-label": "Est. Delivery", style: { margin: "16px auto 0", width: "100%", boxSizing: "border-box", border: "1px solid transparent", borderRadius: 10, backgroundColor: "#eaf4ff", padding: "20px 22px 18px", textAlign: "left" }, children: [
|
|
976
|
+
/* @__PURE__ */ jsx("p", { style: { margin: 0, color: "#202124", fontSize: 13, fontWeight: 700, lineHeight: 1.3 }, children: "Est. Delivery" }),
|
|
977
|
+
/* @__PURE__ */ jsx("p", { style: { margin: "6px 0 0", color: "#202124", fontSize: 22, fontWeight: 700, lineHeight: 1.15, letterSpacing: 0, overflowWrap: "anywhere", wordBreak: "break-word" }, children: dateText }),
|
|
978
|
+
/* @__PURE__ */ jsx("p", { style: { margin: "6px 0 0", color: "#5f6368", fontSize: 13, fontWeight: 400, lineHeight: 1.35 }, children: "Estimated time may update as tracking progresses." })
|
|
979
|
+
] });
|
|
980
|
+
}
|
|
155
981
|
function SectionShell({ title, children, bordered = true }) {
|
|
156
982
|
return /* @__PURE__ */ jsx("section", { "aria-label": title, style: { ...pageFont, background: "var(--pb-color-background, #fff)", color: "var(--pb-color-text, #0f172a)", borderBottom: bordered ? "1px solid #f1f5f9" : "0" }, children });
|
|
157
983
|
}
|
|
@@ -162,11 +988,28 @@ function SkeletonRow() {
|
|
|
162
988
|
return /* @__PURE__ */ jsx("div", { "aria-hidden": "true", style: { display: "grid", gridTemplateColumns: "44px minmax(20px, 1fr) 44px minmax(20px, 1fr) 44px minmax(20px, 1fr) 44px minmax(20px, 1fr) 44px", columnGap: 8, width: "100%", maxWidth: 1200, margin: "32px auto 0" }, children: Array.from({ length: 5 }, (_, index) => /* @__PURE__ */ jsx("span", { style: { display: "block", width: 44, height: 44, borderRadius: 9999, background: "#e2e8f0" } }, index)).flatMap((circle, index, list) => index < list.length - 1 ? [circle, /* @__PURE__ */ jsx("span", { style: { display: "block", height: 6, marginTop: 19, borderRadius: 999, background: "#e2e8f0" } }, "line-" + index)] : [circle]) });
|
|
163
989
|
}
|
|
164
990
|
|
|
991
|
+
// src/shopify-track-page/assets/not-found.png.ts
|
|
992
|
+
var not_found_png_default = "data:image/png;base64,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";
|
|
993
|
+
|
|
994
|
+
// src/tracking-not-found.tsx
|
|
995
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
996
|
+
function TrackingNotFound() {
|
|
997
|
+
return /* @__PURE__ */ jsxs2("section", { "aria-label": "Order not found", role: "status", style: { display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", padding: "80px 24px", gap: 16 }, children: [
|
|
998
|
+
/* @__PURE__ */ jsx2("img", { src: not_found_png_default, alt: "", width: 180, height: 180, style: { width: 180, height: 180, objectFit: "contain" } }),
|
|
999
|
+
/* @__PURE__ */ jsx2("p", { style: { margin: 0, fontSize: 16, fontWeight: 500, color: "#475569" }, children: "Can not find order" })
|
|
1000
|
+
] });
|
|
1001
|
+
}
|
|
1002
|
+
|
|
165
1003
|
// src/ready-to-go.tsx
|
|
166
|
-
import { Fragment, jsx as
|
|
167
|
-
var initialRuntime = {
|
|
168
|
-
|
|
169
|
-
|
|
1004
|
+
import { Fragment, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
1005
|
+
var initialRuntime = {
|
|
1006
|
+
phase: "idle",
|
|
1007
|
+
recommendations: { phase: "idle", items: [] },
|
|
1008
|
+
autoQueryFromUrl: false,
|
|
1009
|
+
async query() {
|
|
1010
|
+
return void 0;
|
|
1011
|
+
}
|
|
1012
|
+
};
|
|
170
1013
|
var ReadyToGoRuntimeContext = createContext(initialRuntime);
|
|
171
1014
|
function previewReadyToGoTracking(trackingNumber = "BT-2048-DEMO") {
|
|
172
1015
|
return {
|
|
@@ -175,7 +1018,7 @@ function previewReadyToGoTracking(trackingNumber = "BT-2048-DEMO") {
|
|
|
175
1018
|
carrier: "BestTrack demo carrier",
|
|
176
1019
|
latestEvent: "Shipment accepted at the regional hub",
|
|
177
1020
|
updatedAt: "Sep 17, 10:00 AM",
|
|
178
|
-
|
|
1021
|
+
destination: "Shanghai",
|
|
179
1022
|
estimatedDelivery: "Sep 22 - Sep 24",
|
|
180
1023
|
progress: defaultProgress("In transit"),
|
|
181
1024
|
events: [
|
|
@@ -184,30 +1027,72 @@ function previewReadyToGoTracking(trackingNumber = "BT-2048-DEMO") {
|
|
|
184
1027
|
],
|
|
185
1028
|
orderItems: [{ id: "demo-order-item", title: "Demo shipment item", quantity: 1, description: "Product details are available in your order." }],
|
|
186
1029
|
recommendations: [
|
|
187
|
-
{ id: "shipping-protection", title: "Shipping protection", description: "Extra assurance for your next delivery.", price: "
|
|
188
|
-
{ id: "delivery-alerts", title: "Delivery alerts", description: "Receive an update at every milestone.", price: "
|
|
1030
|
+
{ id: "shipping-protection", title: "Shipping protection", description: "Extra assurance for your next delivery.", price: { amount: 900, currencyCode: "USD" } },
|
|
1031
|
+
{ id: "delivery-alerts", title: "Delivery alerts", description: "Receive an update at every milestone.", price: { amount: 400, currencyCode: "USD" } }
|
|
189
1032
|
]
|
|
190
1033
|
};
|
|
191
1034
|
}
|
|
192
|
-
async function queryMockReadyToGoTracking(
|
|
193
|
-
return previewReadyToGoTracking(trackingNumber);
|
|
1035
|
+
async function queryMockReadyToGoTracking(request) {
|
|
1036
|
+
return previewReadyToGoTracking(request.mode === "tracking" ? request.trackingNumber : request.orderNumber);
|
|
194
1037
|
}
|
|
195
|
-
function ReadyToGoRuntimeProvider({ children,
|
|
1038
|
+
function ReadyToGoRuntimeProvider({ children, query: injectedQuery, queryRecommendations, transport, autoQueryFromUrl, watermark }) {
|
|
196
1039
|
const [state, setState] = useState2({ phase: "idle" });
|
|
197
|
-
const
|
|
1040
|
+
const [recommendations, setRecommendations] = useState2(() => ({
|
|
1041
|
+
phase: queryRecommendations || transport && !injectedQuery ? "loading" : "idle",
|
|
1042
|
+
items: []
|
|
1043
|
+
}));
|
|
1044
|
+
const requestId = useRef(0);
|
|
1045
|
+
const resolvedQuery = useMemo(() => {
|
|
1046
|
+
if (injectedQuery) return injectedQuery;
|
|
1047
|
+
if (transport) return createShopifyTrackQuery(transport);
|
|
1048
|
+
return void 0;
|
|
1049
|
+
}, [injectedQuery, transport]);
|
|
1050
|
+
const resolvedRecommendations = useMemo(() => {
|
|
1051
|
+
if (queryRecommendations) return queryRecommendations;
|
|
1052
|
+
if (transport && !injectedQuery) return createShopifyRecommendationsQuery(transport.post);
|
|
1053
|
+
return void 0;
|
|
1054
|
+
}, [injectedQuery, queryRecommendations, transport]);
|
|
1055
|
+
const live = Boolean(resolvedQuery);
|
|
1056
|
+
useEffect(() => {
|
|
1057
|
+
if (!resolvedRecommendations) return;
|
|
1058
|
+
let active = true;
|
|
1059
|
+
void resolvedRecommendations().then((items) => {
|
|
1060
|
+
if (!active) return;
|
|
1061
|
+
setRecommendations({ phase: items.length ? "success" : "empty", items });
|
|
1062
|
+
}).catch(() => {
|
|
1063
|
+
if (!active) return;
|
|
1064
|
+
setRecommendations({ phase: "error", items: [] });
|
|
1065
|
+
});
|
|
1066
|
+
return () => {
|
|
1067
|
+
active = false;
|
|
1068
|
+
};
|
|
1069
|
+
}, [resolvedRecommendations]);
|
|
1070
|
+
const query = useCallback(async (request) => {
|
|
1071
|
+
const currentRequestId = ++requestId.current;
|
|
198
1072
|
setState({ phase: "loading" });
|
|
199
1073
|
try {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
setState({ phase:
|
|
1074
|
+
const result = live ? await resolvedQuery(request) : await queryMockReadyToGoTracking(request);
|
|
1075
|
+
if (currentRequestId !== requestId.current) return;
|
|
1076
|
+
setState({ phase: isEmptyTrackingPageResult(result) ? "empty" : "success", result });
|
|
1077
|
+
} catch {
|
|
1078
|
+
if (currentRequestId !== requestId.current) return;
|
|
1079
|
+
setState({ phase: "error", error: "We couldn\u2019t retrieve this order right now. Please try again later." });
|
|
203
1080
|
}
|
|
204
|
-
}, [
|
|
205
|
-
const
|
|
206
|
-
|
|
1081
|
+
}, [live, resolvedQuery]);
|
|
1082
|
+
const resolveAutoQuery = autoQueryFromUrl ?? Boolean(transport && !injectedQuery);
|
|
1083
|
+
const resolvedWatermark = useMemo(
|
|
1084
|
+
() => watermark ?? { visible: !shouldHidePoweredBy() },
|
|
1085
|
+
[watermark]
|
|
1086
|
+
);
|
|
1087
|
+
const value = useMemo(() => ({ ...state, query, recommendations, autoQueryFromUrl: resolveAutoQuery, watermark: resolvedWatermark }), [query, recommendations, resolveAutoQuery, resolvedWatermark, state]);
|
|
1088
|
+
return /* @__PURE__ */ jsx3(ReadyToGoRuntimeContext.Provider, { value, children });
|
|
207
1089
|
}
|
|
208
1090
|
function useReadyToGoRuntime() {
|
|
209
1091
|
return useContext(ReadyToGoRuntimeContext);
|
|
210
1092
|
}
|
|
1093
|
+
function RuntimeWatermark({ watermark }) {
|
|
1094
|
+
return watermark?.visible ? /* @__PURE__ */ jsx3("small", { style: { display: "block", marginTop: "auto", paddingTop: 28, textAlign: "center", fontSize: 12, lineHeight: "17px", fontStyle: "italic", color: "#b8b8b8" }, children: watermark.label || "Powered by BestTrack" }) : null;
|
|
1095
|
+
}
|
|
211
1096
|
var heroStyle = {
|
|
212
1097
|
...pageFont,
|
|
213
1098
|
position: "relative",
|
|
@@ -219,6 +1104,15 @@ var heroStyle = {
|
|
|
219
1104
|
padding: "48px 24px",
|
|
220
1105
|
boxSizing: "border-box"
|
|
221
1106
|
};
|
|
1107
|
+
var editorHeroStyle = {
|
|
1108
|
+
...pageFont,
|
|
1109
|
+
position: "relative",
|
|
1110
|
+
display: "grid",
|
|
1111
|
+
placeItems: "center",
|
|
1112
|
+
backgroundColor: "#fff",
|
|
1113
|
+
padding: "48px 24px",
|
|
1114
|
+
boxSizing: "border-box"
|
|
1115
|
+
};
|
|
222
1116
|
var formCardStyle = {
|
|
223
1117
|
display: "flex",
|
|
224
1118
|
flexDirection: "column",
|
|
@@ -232,6 +1126,7 @@ var formCardStyle = {
|
|
|
232
1126
|
boxSizing: "border-box",
|
|
233
1127
|
boxShadow: "0 8px 24px rgba(0, 0, 0, 0.12)"
|
|
234
1128
|
};
|
|
1129
|
+
var editorFormCardStyle = { ...formCardStyle, minHeight: 0 };
|
|
235
1130
|
var tabStyle = (active) => ({
|
|
236
1131
|
appearance: "none",
|
|
237
1132
|
flex: 1,
|
|
@@ -263,12 +1158,12 @@ var inputStyle = {
|
|
|
263
1158
|
boxSizing: "border-box"
|
|
264
1159
|
};
|
|
265
1160
|
function ReadyToGoTextField({ value, onChange }) {
|
|
266
|
-
return /* @__PURE__ */
|
|
1161
|
+
return /* @__PURE__ */ jsx3("input", { "aria-label": "Ready-to-go text", value: typeof value === "string" ? value : "", onChange: (event) => onChange(event.target.value) });
|
|
267
1162
|
}
|
|
268
1163
|
function InlineText({ block, name, fallback }) {
|
|
269
1164
|
const value = text(block, name, fallback);
|
|
270
|
-
if (!block.selected) return /* @__PURE__ */
|
|
271
|
-
return /* @__PURE__ */
|
|
1165
|
+
if (!block.selected) return /* @__PURE__ */ jsx3("span", { "data-ready-to-go-editor-field": name, children: value });
|
|
1166
|
+
return /* @__PURE__ */ jsx3(
|
|
272
1167
|
"input",
|
|
273
1168
|
{
|
|
274
1169
|
"aria-label": "Canvas " + name,
|
|
@@ -277,7 +1172,23 @@ function InlineText({ block, name, fallback }) {
|
|
|
277
1172
|
onMouseDown: (event) => event.stopPropagation(),
|
|
278
1173
|
onClick: (event) => event.stopPropagation(),
|
|
279
1174
|
onChange: (event) => block.onPropsChange({ [name]: event.currentTarget.value }),
|
|
280
|
-
style: {
|
|
1175
|
+
style: {
|
|
1176
|
+
display: "inline-block",
|
|
1177
|
+
width: "100%",
|
|
1178
|
+
minWidth: "5ch",
|
|
1179
|
+
boxSizing: "border-box",
|
|
1180
|
+
/* border: "1px dashed currentColor", */
|
|
1181
|
+
border: "none",
|
|
1182
|
+
borderRadius: 3,
|
|
1183
|
+
padding: "2px 5px",
|
|
1184
|
+
background: "transparent",
|
|
1185
|
+
color: "inherit",
|
|
1186
|
+
font: "inherit",
|
|
1187
|
+
fontWeight: "inherit",
|
|
1188
|
+
lineHeight: "inherit",
|
|
1189
|
+
letterSpacing: "inherit",
|
|
1190
|
+
textAlign: "inherit"
|
|
1191
|
+
}
|
|
281
1192
|
}
|
|
282
1193
|
);
|
|
283
1194
|
}
|
|
@@ -288,47 +1199,45 @@ function eventsFrom(result) {
|
|
|
288
1199
|
}
|
|
289
1200
|
function ProgressResult({ result, showEstimatedDelivery = true }) {
|
|
290
1201
|
const steps = result.progress?.length ? result.progress : defaultProgress(result.status);
|
|
291
|
-
return /* @__PURE__ */
|
|
292
|
-
/* @__PURE__ */
|
|
1202
|
+
return /* @__PURE__ */ jsxs3(Fragment, { children: [
|
|
1203
|
+
/* @__PURE__ */ jsxs3("p", { style: { margin: 0, fontSize: 20, lineHeight: 1.4, color: "#000" }, children: [
|
|
293
1204
|
"Tracking: ",
|
|
294
1205
|
result.trackingNumber
|
|
295
1206
|
] }),
|
|
296
|
-
/* @__PURE__ */
|
|
297
|
-
showEstimatedDelivery && result.estimatedDelivery ? /* @__PURE__ */
|
|
298
|
-
|
|
299
|
-
/* @__PURE__ */ jsx2("p", { style: { margin: "6px 0 0", fontSize: 22, fontWeight: 700, color: "#202124" }, children: result.estimatedDelivery })
|
|
300
|
-
] }) : null,
|
|
301
|
-
/* @__PURE__ */ jsx2(TrackingProgress, { steps })
|
|
1207
|
+
/* @__PURE__ */ jsx3("h2", { style: { margin: "48px 0 0", fontSize: 32, lineHeight: "40px", fontWeight: 700, color: "#303030" }, children: result.status }),
|
|
1208
|
+
showEstimatedDelivery && result.estimatedDelivery ? /* @__PURE__ */ jsx3(EstimatedDeliveryCard, { dateText: result.estimatedDelivery }) : null,
|
|
1209
|
+
/* @__PURE__ */ jsx3(TrackingProgress, { steps })
|
|
302
1210
|
] });
|
|
303
1211
|
}
|
|
304
|
-
function DeliveryResult({ heading, contentsHeading, carrierHeading, result }) {
|
|
305
|
-
return /* @__PURE__ */
|
|
306
|
-
/* @__PURE__ */
|
|
307
|
-
/* @__PURE__ */
|
|
308
|
-
/* @__PURE__ */
|
|
1212
|
+
function DeliveryResult({ heading, contentsHeading, carrierHeading, result, editor = false }) {
|
|
1213
|
+
return /* @__PURE__ */ jsxs3("div", { style: { ...contentWidth, display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(min(100%, 280px), 500px))", gap: 40, justifyContent: "center", alignItems: "start" }, children: [
|
|
1214
|
+
/* @__PURE__ */ jsxs3("div", { children: [
|
|
1215
|
+
/* @__PURE__ */ jsx3("h3", { style: { margin: 0, fontSize: 20, lineHeight: "20px", fontWeight: 700 }, children: heading }),
|
|
1216
|
+
/* @__PURE__ */ jsx3(ShippingTimeline, { events: eventsFrom(result) })
|
|
309
1217
|
] }),
|
|
310
|
-
/* @__PURE__ */
|
|
311
|
-
/* @__PURE__ */
|
|
312
|
-
|
|
313
|
-
/* @__PURE__ */
|
|
1218
|
+
/* @__PURE__ */ jsxs3("div", { style: { display: "flex", flexDirection: "column", gap: 24 }, children: [
|
|
1219
|
+
/* @__PURE__ */ jsx3(TrackingPageAdSlot, { ad: result.ad, editor }),
|
|
1220
|
+
/* @__PURE__ */ jsxs3("div", { children: [
|
|
1221
|
+
/* @__PURE__ */ jsx3("h3", { style: { margin: "0 0 12px", fontSize: 18, fontWeight: 700 }, children: contentsHeading }),
|
|
1222
|
+
/* @__PURE__ */ jsx3(PackageContents, { items: result.orderItems ?? [] })
|
|
314
1223
|
] }),
|
|
315
|
-
/* @__PURE__ */
|
|
316
|
-
/* @__PURE__ */
|
|
317
|
-
/* @__PURE__ */
|
|
318
|
-
/* @__PURE__ */
|
|
1224
|
+
/* @__PURE__ */ jsxs3("div", { children: [
|
|
1225
|
+
/* @__PURE__ */ jsx3("h3", { style: { margin: "0 0 12px", fontSize: 18, fontWeight: 700 }, children: carrierHeading }),
|
|
1226
|
+
/* @__PURE__ */ jsx3("p", { style: { margin: 0, fontSize: 14, fontWeight: 600, color: "#1e293b" }, children: result.carrier ?? "Not available" }),
|
|
1227
|
+
/* @__PURE__ */ jsx3("p", { style: { margin: "8px 0 0", fontSize: 14, color: "#64748b" }, children: result.destination ?? "Destination details are not available." })
|
|
319
1228
|
] })
|
|
320
1229
|
] })
|
|
321
1230
|
] });
|
|
322
1231
|
}
|
|
323
1232
|
function ReadyToGoQueryEditor(block) {
|
|
324
|
-
return /* @__PURE__ */
|
|
325
|
-
/* @__PURE__ */
|
|
326
|
-
/* @__PURE__ */
|
|
327
|
-
/* @__PURE__ */
|
|
328
|
-
/* @__PURE__ */
|
|
1233
|
+
return /* @__PURE__ */ jsx3("section", { "aria-label": "Ready-to-go query editor", style: editorHeroStyle, children: /* @__PURE__ */ jsxs3("div", { role: "region", "aria-label": "Ready-to-go tracking query", style: editorFormCardStyle, children: [
|
|
1234
|
+
/* @__PURE__ */ jsx3("h1", { style: { margin: "0 0 24px", textAlign: "center", fontSize: 28, lineHeight: 1.15 }, children: /* @__PURE__ */ jsx3(InlineText, { block, name: "heading", fallback: "Track your order" }) }),
|
|
1235
|
+
/* @__PURE__ */ jsxs3("div", { style: { display: "flex", width: "100%", borderBottom: "1px solid #cbd5e1" }, children: [
|
|
1236
|
+
/* @__PURE__ */ jsx3("div", { style: { ...tabStyle(true), display: "flex", alignItems: "center", justifyContent: "center", cursor: "default" }, children: /* @__PURE__ */ jsx3(InlineText, { block, name: "trackingTabLabel", fallback: "Tracking Number" }) }),
|
|
1237
|
+
/* @__PURE__ */ jsx3("div", { style: { ...tabStyle(false), display: "flex", alignItems: "center", justifyContent: "center", cursor: "default" }, children: /* @__PURE__ */ jsx3(InlineText, { block, name: "orderTabLabel", fallback: "Order Number" }) })
|
|
329
1238
|
] }),
|
|
330
|
-
/* @__PURE__ */
|
|
331
|
-
/* @__PURE__ */
|
|
1239
|
+
/* @__PURE__ */ jsxs3("div", { style: { marginTop: 24, display: "flex", flexDirection: "column", gap: 16, flex: 1 }, children: [
|
|
1240
|
+
/* @__PURE__ */ jsx3(
|
|
332
1241
|
"input",
|
|
333
1242
|
{
|
|
334
1243
|
"aria-label": "Canvas default tracking number",
|
|
@@ -337,135 +1246,178 @@ function ReadyToGoQueryEditor(block) {
|
|
|
337
1246
|
onMouseDown: (event) => block.selected && event.stopPropagation(),
|
|
338
1247
|
onClick: (event) => block.selected && event.stopPropagation(),
|
|
339
1248
|
onChange: (event) => block.onPropsChange({ defaultTrackingNumber: event.currentTarget.value }),
|
|
340
|
-
style: {
|
|
1249
|
+
style: {
|
|
1250
|
+
...inputStyle
|
|
1251
|
+
/* , border: block.selected ? "1px dashed #111" : inputStyle.border */
|
|
1252
|
+
}
|
|
341
1253
|
}
|
|
342
1254
|
),
|
|
343
|
-
/* @__PURE__ */
|
|
1255
|
+
/* @__PURE__ */ jsx3("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", width: "100%", minHeight: 58, marginTop: 8, borderRadius: "var(--pb-radius, 8px)", background: "var(--pb-color-primary, #111)", color: "#fff", fontSize: 15, fontWeight: 600 }, children: /* @__PURE__ */ jsx3(InlineText, { block, name: "submitLabel", fallback: "Track Your Order" }) })
|
|
344
1256
|
] }),
|
|
345
|
-
/* @__PURE__ */
|
|
1257
|
+
/* @__PURE__ */ jsx3("p", { style: { marginTop: "auto", paddingTop: 28, textAlign: "center", fontSize: 12, lineHeight: "17px", fontStyle: "italic", color: "#b8b8b8" }, children: "Powered by BestTrack" })
|
|
346
1258
|
] }) });
|
|
347
1259
|
}
|
|
348
1260
|
function ReadyToGoProgressEditor() {
|
|
349
|
-
return /* @__PURE__ */
|
|
1261
|
+
return /* @__PURE__ */ jsx3("section", { "aria-label": "Ready-to-go progress editor", style: { ...pageFont, background: "var(--pb-color-background, #fff)", color: "var(--pb-color-text, #0f172a)", borderBottom: "1px solid #f1f5f9" }, children: /* @__PURE__ */ jsx3("div", { style: { ...contentWidth, textAlign: "center", width: "min(1248px, 100%)" }, children: /* @__PURE__ */ jsx3(ProgressResult, { result: previewReadyToGoTracking() }) }) });
|
|
350
1262
|
}
|
|
351
1263
|
function ReadyToGoDeliveryEditor(block) {
|
|
352
|
-
return /* @__PURE__ */
|
|
1264
|
+
return /* @__PURE__ */ jsx3("section", { "aria-label": "Ready-to-go delivery editor", style: { ...pageFont, background: "var(--pb-color-background, #fff)", color: "var(--pb-color-text, #0f172a)", borderBottom: "1px solid #f1f5f9" }, children: /* @__PURE__ */ jsx3(
|
|
353
1265
|
DeliveryResult,
|
|
354
1266
|
{
|
|
355
|
-
heading: /* @__PURE__ */
|
|
356
|
-
contentsHeading: /* @__PURE__ */
|
|
357
|
-
carrierHeading: /* @__PURE__ */
|
|
358
|
-
result: previewReadyToGoTracking()
|
|
1267
|
+
heading: /* @__PURE__ */ jsx3(InlineText, { block, name: "heading", fallback: "Shipping Details" }),
|
|
1268
|
+
contentsHeading: /* @__PURE__ */ jsx3(InlineText, { block, name: "contentsHeading", fallback: "Package Contents" }),
|
|
1269
|
+
carrierHeading: /* @__PURE__ */ jsx3(InlineText, { block, name: "carrierHeading", fallback: "Carrier" }),
|
|
1270
|
+
result: previewReadyToGoTracking(),
|
|
1271
|
+
editor: true
|
|
359
1272
|
}
|
|
360
1273
|
) });
|
|
361
1274
|
}
|
|
362
1275
|
function ReadyToGoRecommendationsEditor(block) {
|
|
363
1276
|
const preview = previewReadyToGoTracking();
|
|
364
|
-
return /* @__PURE__ */
|
|
365
|
-
/* @__PURE__ */
|
|
366
|
-
/* @__PURE__ */
|
|
1277
|
+
return /* @__PURE__ */ jsx3("section", { "aria-label": "Ready-to-go recommendations editor", style: { ...pageFont, background: "var(--pb-color-background, #fff)", color: "var(--pb-color-text, #0f172a)" }, children: /* @__PURE__ */ jsxs3("div", { style: { ...contentWidth, padding: "48px 24px" }, children: [
|
|
1278
|
+
/* @__PURE__ */ jsx3("h3", { style: { margin: 0, textAlign: "center", fontSize: 20, lineHeight: "20px", fontWeight: 700 }, children: /* @__PURE__ */ jsx3(InlineText, { block, name: "heading", fallback: "You may also like..." }) }),
|
|
1279
|
+
/* @__PURE__ */ jsx3("div", { style: { marginTop: 24 }, children: /* @__PURE__ */ jsx3(RecommendationCards, { items: preview.recommendations ?? [] }) })
|
|
367
1280
|
] }) });
|
|
368
1281
|
}
|
|
369
1282
|
function ReadyToGoQueryBlock(props) {
|
|
370
1283
|
const runtime = useReadyToGoRuntime();
|
|
371
|
-
const [
|
|
372
|
-
const [
|
|
373
|
-
const [
|
|
374
|
-
const [
|
|
1284
|
+
const [locationState] = useState2(() => runtime.autoQueryFromUrl ? readTrackingQueryLocationState() : void 0);
|
|
1285
|
+
const [mode, setMode] = useState2(locationState?.tab ?? (text(props, "defaultQueryMode", "tracking") === "order" ? "order" : "tracking"));
|
|
1286
|
+
const [trackingNumber, setTrackingNumber] = useState2(locationState?.trackingNumber || text(props, "defaultTrackingNumber", "BT-2048-DEMO"));
|
|
1287
|
+
const [orderNumber, setOrderNumber] = useState2(locationState?.orderNumber || text(props, "defaultOrderNumber", ""));
|
|
1288
|
+
const [email, setEmail] = useState2(locationState?.email ?? "");
|
|
375
1289
|
const [localError, setLocalError] = useState2("");
|
|
1290
|
+
const autoQueryStarted = useRef(false);
|
|
376
1291
|
const heading = text(props, "heading");
|
|
377
1292
|
const submitLabel = text(props, "submitLabel", "Track Your Order");
|
|
378
1293
|
const trackingTabLabel = text(props, "trackingTabLabel", "Tracking Number");
|
|
379
1294
|
const orderTabLabel = text(props, "orderTabLabel", "Order Number");
|
|
1295
|
+
useEffect(() => {
|
|
1296
|
+
if (!locationState?.canAutoQuery || autoQueryStarted.current) return;
|
|
1297
|
+
autoQueryStarted.current = true;
|
|
1298
|
+
void runtime.query(locationState.tab === "tracking" ? { mode: "tracking", trackingNumber: locationState.trackingNumber } : { mode: "order", orderNumber: locationState.orderNumber, email: locationState.email });
|
|
1299
|
+
}, [locationState, runtime]);
|
|
380
1300
|
const submit = (event) => {
|
|
381
1301
|
event.preventDefault();
|
|
382
1302
|
setLocalError("");
|
|
383
1303
|
if (mode === "order") {
|
|
384
1304
|
if (!orderNumber.trim() || !email.trim()) {
|
|
385
|
-
setLocalError("
|
|
1305
|
+
setLocalError("Please enter your order number and email address");
|
|
386
1306
|
return;
|
|
387
1307
|
}
|
|
388
|
-
|
|
1308
|
+
syncTrackingQueryToUrl("order", orderNumber.trim(), email.trim());
|
|
1309
|
+
void runtime.query({ mode: "order", orderNumber: orderNumber.trim(), email: email.trim() });
|
|
1310
|
+
return;
|
|
1311
|
+
}
|
|
1312
|
+
if (!trackingNumber.trim()) {
|
|
1313
|
+
setLocalError("Please enter your tracking number");
|
|
389
1314
|
return;
|
|
390
1315
|
}
|
|
391
|
-
|
|
1316
|
+
syncTrackingQueryToUrl("tracking", trackingNumber.trim());
|
|
1317
|
+
void runtime.query({ mode: "tracking", trackingNumber: trackingNumber.trim() });
|
|
392
1318
|
};
|
|
393
1319
|
const loading = runtime.phase === "loading";
|
|
394
|
-
return /* @__PURE__ */
|
|
395
|
-
heading ? /* @__PURE__ */
|
|
396
|
-
/* @__PURE__ */
|
|
397
|
-
/* @__PURE__ */
|
|
1320
|
+
return /* @__PURE__ */ jsx3("section", { style: heroStyle, children: /* @__PURE__ */ jsxs3("div", { role: "region", "aria-label": "Ready-to-go tracking query", style: formCardStyle, children: [
|
|
1321
|
+
heading ? /* @__PURE__ */ jsx3("h1", { style: { margin: "0 0 24px", textAlign: "center", fontSize: 28, lineHeight: 1.15 }, children: heading }) : null,
|
|
1322
|
+
/* @__PURE__ */ jsxs3("div", { role: "tablist", "aria-label": "Tracking method", style: { display: "flex", width: "100%", borderBottom: "1px solid #cbd5e1" }, children: [
|
|
1323
|
+
/* @__PURE__ */ jsx3("button", { type: "button", role: "tab", "aria-selected": mode === "tracking", onClick: () => {
|
|
398
1324
|
setMode("tracking");
|
|
399
1325
|
setLocalError("");
|
|
400
1326
|
}, style: tabStyle(mode === "tracking"), children: trackingTabLabel }),
|
|
401
|
-
/* @__PURE__ */
|
|
1327
|
+
/* @__PURE__ */ jsx3("button", { type: "button", role: "tab", "aria-selected": mode === "order", onClick: () => {
|
|
402
1328
|
setMode("order");
|
|
403
1329
|
setLocalError("");
|
|
404
1330
|
}, style: tabStyle(mode === "order"), children: orderTabLabel })
|
|
405
1331
|
] }),
|
|
406
|
-
/* @__PURE__ */
|
|
407
|
-
mode === "order" ? /* @__PURE__ */
|
|
408
|
-
/* @__PURE__ */
|
|
409
|
-
/* @__PURE__ */
|
|
410
|
-
/* @__PURE__ */
|
|
411
|
-
/* @__PURE__ */
|
|
412
|
-
] }) : /* @__PURE__ */
|
|
413
|
-
/* @__PURE__ */
|
|
414
|
-
/* @__PURE__ */
|
|
1332
|
+
/* @__PURE__ */ jsxs3("form", { onSubmit: submit, style: { marginTop: 24, display: "flex", flexDirection: "column", gap: 16, flex: 1 }, children: [
|
|
1333
|
+
mode === "order" ? /* @__PURE__ */ jsxs3(Fragment, { children: [
|
|
1334
|
+
/* @__PURE__ */ jsx3("label", { htmlFor: "ready-to-go-order-number", style: { position: "absolute", width: 1, height: 1, overflow: "hidden", clipPath: "inset(50%)" }, children: "Order number" }),
|
|
1335
|
+
/* @__PURE__ */ jsx3("input", { id: "ready-to-go-order-number", "aria-label": "Order number", value: orderNumber, onChange: (event) => setOrderNumber(event.target.value), placeholder: "Order Number", style: inputStyle }),
|
|
1336
|
+
/* @__PURE__ */ jsx3("label", { htmlFor: "ready-to-go-email", style: { position: "absolute", width: 1, height: 1, overflow: "hidden", clipPath: "inset(50%)" }, children: "Email" }),
|
|
1337
|
+
/* @__PURE__ */ jsx3("input", { id: "ready-to-go-email", "aria-label": "Email", value: email, onChange: (event) => setEmail(event.target.value), placeholder: "Email", style: inputStyle })
|
|
1338
|
+
] }) : /* @__PURE__ */ jsxs3(Fragment, { children: [
|
|
1339
|
+
/* @__PURE__ */ jsx3("label", { htmlFor: "ready-to-go-tracking-number", style: { position: "absolute", width: 1, height: 1, overflow: "hidden", clipPath: "inset(50%)" }, children: "Tracking number" }),
|
|
1340
|
+
/* @__PURE__ */ jsx3("input", { id: "ready-to-go-tracking-number", "aria-label": "Tracking number", value: trackingNumber, onChange: (event) => setTrackingNumber(event.target.value), placeholder: "Tracking Number", style: inputStyle })
|
|
415
1341
|
] }),
|
|
416
|
-
localError ? /* @__PURE__ */
|
|
417
|
-
/* @__PURE__ */
|
|
418
|
-
runtime.phase === "error" ? /* @__PURE__ */
|
|
1342
|
+
localError ? /* @__PURE__ */ jsx3("p", { style: { margin: 0, textAlign: "center", fontSize: 12, color: "#f43f5e" }, children: localError }) : null,
|
|
1343
|
+
/* @__PURE__ */ jsx3("button", { type: "submit", disabled: loading, style: { display: "flex", alignItems: "center", justifyContent: "center", width: "100%", minHeight: 58, marginTop: 8, border: 0, borderRadius: "var(--pb-radius, 8px)", background: loading ? "#475569" : "var(--pb-color-primary, #111)", color: "#fff", font: "inherit", fontSize: 15, fontWeight: 600, cursor: loading ? "wait" : "pointer", opacity: loading ? 0.7 : 1 }, children: loading ? "Tracking..." : submitLabel }),
|
|
1344
|
+
runtime.phase === "error" ? /* @__PURE__ */ jsx3("p", { role: "alert", style: { margin: 0, textAlign: "center", fontSize: 12, color: "#f43f5e" }, children: runtime.error }) : null
|
|
419
1345
|
] }),
|
|
420
|
-
/* @__PURE__ */
|
|
1346
|
+
/* @__PURE__ */ jsx3(RuntimeWatermark, { watermark: runtime.watermark })
|
|
421
1347
|
] }) });
|
|
422
1348
|
}
|
|
423
1349
|
function ReadyToGoProgressBlock() {
|
|
424
1350
|
const runtime = useReadyToGoRuntime();
|
|
425
1351
|
const result = runtime.result;
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
1352
|
+
if (runtime.phase === "idle") return null;
|
|
1353
|
+
if (runtime.phase === "empty") return /* @__PURE__ */ jsx3(TrackingNotFound, {});
|
|
1354
|
+
return /* @__PURE__ */ jsx3(SectionShell, { title: "Shipment progress", children: /* @__PURE__ */ jsxs3("div", { style: { ...contentWidth, textAlign: "center", width: "min(1248px, 100%)" }, children: [
|
|
1355
|
+
runtime.phase === "loading" ? /* @__PURE__ */ jsxs3("div", { "aria-label": "Loading shipment progress", children: [
|
|
1356
|
+
/* @__PURE__ */ jsx3(IdleMessage, { children: "Loading shipment progress\u2026" }),
|
|
1357
|
+
/* @__PURE__ */ jsx3(SkeletonRow, {})
|
|
430
1358
|
] }) : null,
|
|
431
|
-
runtime.phase === "error" ? /* @__PURE__ */
|
|
432
|
-
runtime.phase === "
|
|
433
|
-
runtime.phase === "success" && result ? /* @__PURE__ */ jsx2(ProgressResult, { result }) : null
|
|
1359
|
+
runtime.phase === "error" ? /* @__PURE__ */ jsx3("p", { style: { margin: 0, color: "#b42318" }, children: "Shipment progress is temporarily unavailable." }) : null,
|
|
1360
|
+
runtime.phase === "success" && result ? /* @__PURE__ */ jsx3(ProgressResult, { result }) : null
|
|
434
1361
|
] }) });
|
|
435
1362
|
}
|
|
436
1363
|
function ReadyToGoDeliveryBlock(props) {
|
|
437
1364
|
const runtime = useReadyToGoRuntime();
|
|
1365
|
+
if (runtime.phase === "idle" || runtime.phase === "empty") return null;
|
|
438
1366
|
const heading = text(props, "heading", "Shipping Details");
|
|
439
1367
|
const contentsHeading = text(props, "contentsHeading", "Package Contents");
|
|
440
1368
|
const carrierHeading = text(props, "carrierHeading", "Carrier");
|
|
441
1369
|
const result = runtime.result;
|
|
442
|
-
return /* @__PURE__ */
|
|
443
|
-
/* @__PURE__ */
|
|
444
|
-
runtime.phase === "loading" ? /* @__PURE__ */
|
|
445
|
-
runtime.phase === "error" ? /* @__PURE__ */
|
|
446
|
-
runtime.phase === "idle" ? /* @__PURE__ */ jsx2("p", { style: { margin: "16px 0 0", color: "#64748b" }, children: "Delivery details will appear after a successful query." }) : null
|
|
1370
|
+
return /* @__PURE__ */ jsx3(SectionShell, { title: heading, children: runtime.phase === "success" && result ? /* @__PURE__ */ jsx3(DeliveryResult, { heading, contentsHeading, carrierHeading, result }) : /* @__PURE__ */ jsx3("div", { style: { ...contentWidth, display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(min(100%, 280px), 500px))", gap: 40, justifyContent: "center", alignItems: "start" }, children: /* @__PURE__ */ jsxs3("div", { children: [
|
|
1371
|
+
/* @__PURE__ */ jsx3("h3", { style: { margin: 0, fontSize: 20, lineHeight: "20px", fontWeight: 700 }, children: heading }),
|
|
1372
|
+
runtime.phase === "loading" ? /* @__PURE__ */ jsx3(IdleMessage, { children: "Loading delivery details\u2026" }) : null,
|
|
1373
|
+
runtime.phase === "error" ? /* @__PURE__ */ jsx3("p", { style: { margin: "16px 0 0", color: "#b42318" }, children: "Delivery details are temporarily unavailable." }) : null
|
|
447
1374
|
] }) }) });
|
|
448
1375
|
}
|
|
449
1376
|
function ReadyToGoRecommendationsBlock(props) {
|
|
450
1377
|
const runtime = useReadyToGoRuntime();
|
|
451
1378
|
const heading = text(props, "heading", "You may also like...");
|
|
1379
|
+
const independent = runtime.recommendations.phase !== "idle";
|
|
1380
|
+
if (independent) {
|
|
1381
|
+
if (runtime.recommendations.phase !== "success" || runtime.recommendations.items.length === 0) return null;
|
|
1382
|
+
return /* @__PURE__ */ jsx3(SectionShell, { title: heading, bordered: false, children: /* @__PURE__ */ jsxs3("div", { style: { ...contentWidth, padding: "48px 24px" }, children: [
|
|
1383
|
+
/* @__PURE__ */ jsx3("h3", { style: { margin: 0, textAlign: "center", fontSize: 20, lineHeight: "20px", fontWeight: 700 }, children: heading }),
|
|
1384
|
+
/* @__PURE__ */ jsx3("div", { style: { marginTop: 24 }, children: /* @__PURE__ */ jsx3(RecommendationCards, { items: runtime.recommendations.items }) })
|
|
1385
|
+
] }) });
|
|
1386
|
+
}
|
|
1387
|
+
if (runtime.phase === "empty") return null;
|
|
452
1388
|
const recommendations = runtime.result?.recommendations ?? [];
|
|
453
|
-
return /* @__PURE__ */
|
|
454
|
-
/* @__PURE__ */
|
|
455
|
-
/* @__PURE__ */
|
|
456
|
-
runtime.phase === "loading" ? /* @__PURE__ */
|
|
457
|
-
runtime.phase === "error" ? /* @__PURE__ */
|
|
458
|
-
runtime.phase === "idle" ? /* @__PURE__ */
|
|
459
|
-
runtime.phase === "success" && recommendations.length ? /* @__PURE__ */
|
|
460
|
-
runtime.phase === "success" && !recommendations.length ? /* @__PURE__ */
|
|
1389
|
+
return /* @__PURE__ */ jsx3(SectionShell, { title: heading, bordered: false, children: /* @__PURE__ */ jsxs3("div", { style: { ...contentWidth, padding: "48px 24px" }, children: [
|
|
1390
|
+
/* @__PURE__ */ jsx3("h3", { style: { margin: 0, textAlign: "center", fontSize: 20, lineHeight: "20px", fontWeight: 700 }, children: heading }),
|
|
1391
|
+
/* @__PURE__ */ jsxs3("div", { style: { marginTop: 24 }, children: [
|
|
1392
|
+
runtime.phase === "loading" ? /* @__PURE__ */ jsx3(IdleMessage, { children: "Loading recommendations\u2026" }) : null,
|
|
1393
|
+
runtime.phase === "error" ? /* @__PURE__ */ jsx3("p", { style: { margin: 0, textAlign: "center", color: "#b42318" }, children: "Recommendations are temporarily unavailable." }) : null,
|
|
1394
|
+
runtime.phase === "idle" ? /* @__PURE__ */ jsx3(IdleMessage, { children: "Recommendations appear with your shipment result." }) : null,
|
|
1395
|
+
runtime.phase === "success" && recommendations.length ? /* @__PURE__ */ jsx3(RecommendationCards, { items: recommendations }) : null,
|
|
1396
|
+
runtime.phase === "success" && !recommendations.length ? /* @__PURE__ */ jsx3(IdleMessage, { children: "No recommendations are available for this shipment." }) : null
|
|
461
1397
|
] })
|
|
462
1398
|
] }) });
|
|
463
1399
|
}
|
|
464
1400
|
|
|
465
1401
|
// src/ready-to-go-definition.ts
|
|
466
1402
|
import { createPageDocument } from "@standhigher/puck-page-builder/runtime";
|
|
1403
|
+
|
|
1404
|
+
// src/template-policy.ts
|
|
1405
|
+
function defineTemplatePolicy(templateId, displayName, defaultBlockOrder, lockedBlockTypes) {
|
|
1406
|
+
return Object.freeze({
|
|
1407
|
+
templateId,
|
|
1408
|
+
displayName,
|
|
1409
|
+
defaultBlockOrder: Object.freeze([...defaultBlockOrder]),
|
|
1410
|
+
blocks: Object.freeze(defaultBlockOrder.map((blockType) => Object.freeze({ blockType, singleton: true, deletable: !lockedBlockTypes.includes(blockType) }))),
|
|
1411
|
+
enforcement: "core-block-policy"
|
|
1412
|
+
});
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
// src/ready-to-go-definition.ts
|
|
467
1416
|
var text2 = (label, options = {}) => ({ field: "besttrack.ready-to-go.text", label, control: "text", ...options });
|
|
468
|
-
|
|
1417
|
+
function withTemplatePolicy(blocks, protectedBlocks) {
|
|
1418
|
+
return blocks.map((block) => ({ ...block, policy: { singleton: true, ...protectedBlocks.includes(block.type) ? { required: true, allowDelete: false } : {} } }));
|
|
1419
|
+
}
|
|
1420
|
+
var readyToGoBlocks = withTemplatePolicy([
|
|
469
1421
|
{
|
|
470
1422
|
type: "besttrack.ready-to-go.query",
|
|
471
1423
|
version: 1,
|
|
@@ -476,6 +1428,7 @@ var readyToGoBlocks = [
|
|
|
476
1428
|
heading: "Track your order",
|
|
477
1429
|
submitLabel: "Track Your Order",
|
|
478
1430
|
defaultTrackingNumber: "BT-2048-DEMO",
|
|
1431
|
+
defaultOrderNumber: "",
|
|
479
1432
|
defaultQueryMode: "tracking",
|
|
480
1433
|
trackingTabLabel: "Tracking Number",
|
|
481
1434
|
orderTabLabel: "Order Number"
|
|
@@ -486,6 +1439,7 @@ var readyToGoBlocks = [
|
|
|
486
1439
|
heading: text2("Heading"),
|
|
487
1440
|
submitLabel: text2("Button label"),
|
|
488
1441
|
defaultTrackingNumber: text2("Default tracking number"),
|
|
1442
|
+
defaultOrderNumber: text2("Default order number"),
|
|
489
1443
|
defaultQueryMode: text2("Default query mode"),
|
|
490
1444
|
trackingTabLabel: text2("Tracking tab label"),
|
|
491
1445
|
orderTabLabel: text2("Order tab label")
|
|
@@ -528,7 +1482,13 @@ var readyToGoBlocks = [
|
|
|
528
1482
|
fields: { heading: text2("Heading") },
|
|
529
1483
|
render: { web: ReadyToGoRecommendationsBlock, editor: ReadyToGoRecommendationsEditor }
|
|
530
1484
|
}
|
|
531
|
-
];
|
|
1485
|
+
], ["besttrack.ready-to-go.query"]);
|
|
1486
|
+
var readyToGoTemplatePolicy = defineTemplatePolicy(
|
|
1487
|
+
"besttrack.ready-to-go",
|
|
1488
|
+
"Ready-to-go",
|
|
1489
|
+
readyToGoBlocks.map((block) => block.type),
|
|
1490
|
+
["besttrack.ready-to-go.query"]
|
|
1491
|
+
);
|
|
532
1492
|
function createReadyToGoTemplate() {
|
|
533
1493
|
return {
|
|
534
1494
|
id: "besttrack.ready-to-go",
|
|
@@ -577,15 +1537,347 @@ var bestTrackPageExtension = Object.freeze({
|
|
|
577
1537
|
import { createPageDocument as createPageDocument2 } from "@standhigher/puck-page-builder/runtime";
|
|
578
1538
|
|
|
579
1539
|
// src/branded.tsx
|
|
580
|
-
import { createContext as createContext2, useCallback as useCallback2, useContext as useContext2, useMemo as useMemo2, useRef, useState as
|
|
1540
|
+
import { createContext as createContext2, useCallback as useCallback2, useContext as useContext2, useMemo as useMemo2, useRef as useRef3, useState as useState4 } from "react";
|
|
581
1541
|
|
|
582
|
-
// src/tracking-
|
|
583
|
-
|
|
584
|
-
|
|
1542
|
+
// src/tracking-query-experience.tsx
|
|
1543
|
+
import { useEffect as useEffect2, useId, useRef as useRef2, useState as useState3 } from "react";
|
|
1544
|
+
import { Fragment as Fragment2, jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
1545
|
+
var srOnly = {
|
|
1546
|
+
position: "absolute",
|
|
1547
|
+
width: 1,
|
|
1548
|
+
height: 1,
|
|
1549
|
+
padding: 0,
|
|
1550
|
+
margin: -1,
|
|
1551
|
+
overflow: "hidden",
|
|
1552
|
+
clip: "rect(0, 0, 0, 0)",
|
|
1553
|
+
whiteSpace: "nowrap",
|
|
1554
|
+
border: 0
|
|
1555
|
+
};
|
|
1556
|
+
var defaultTabStyle = (active) => ({
|
|
1557
|
+
minHeight: 44,
|
|
1558
|
+
border: 0,
|
|
1559
|
+
borderBottom: active ? "2px solid currentColor" : "2px solid transparent",
|
|
1560
|
+
background: "transparent",
|
|
1561
|
+
color: "inherit",
|
|
1562
|
+
font: "inherit",
|
|
1563
|
+
fontWeight: active ? 700 : 400,
|
|
1564
|
+
cursor: "pointer"
|
|
1565
|
+
});
|
|
1566
|
+
var defaultInputStyle = {
|
|
1567
|
+
boxSizing: "border-box",
|
|
1568
|
+
width: "100%",
|
|
1569
|
+
minHeight: 48,
|
|
1570
|
+
padding: "12px 16px",
|
|
1571
|
+
border: "1px solid #cbd5e1",
|
|
1572
|
+
borderRadius: 8,
|
|
1573
|
+
background: "#fff",
|
|
1574
|
+
color: "#0f172a",
|
|
1575
|
+
font: "inherit"
|
|
1576
|
+
};
|
|
1577
|
+
var defaultSubmitStyle = (loading) => ({
|
|
1578
|
+
width: "100%",
|
|
1579
|
+
minHeight: 48,
|
|
1580
|
+
border: 0,
|
|
1581
|
+
borderRadius: 8,
|
|
1582
|
+
background: loading ? "#64748b" : "#111827",
|
|
1583
|
+
color: "#fff",
|
|
1584
|
+
font: "inherit",
|
|
1585
|
+
fontWeight: 700,
|
|
1586
|
+
cursor: loading ? "wait" : "pointer"
|
|
1587
|
+
});
|
|
1588
|
+
function fieldError(field) {
|
|
1589
|
+
if (field === "tracking") return "Enter a valid tracking number.";
|
|
1590
|
+
if (field === "order") return "Enter a valid order number.";
|
|
1591
|
+
return "Enter a valid email address.";
|
|
1592
|
+
}
|
|
1593
|
+
function TrackingQueryCard({
|
|
1594
|
+
phase,
|
|
1595
|
+
onQuery,
|
|
1596
|
+
heading,
|
|
1597
|
+
submitLabel,
|
|
1598
|
+
initialTrackingNumber,
|
|
1599
|
+
initialOrderNumber = "",
|
|
1600
|
+
initialMode = "tracking",
|
|
1601
|
+
trackingTabLabel = "Tracking Number",
|
|
1602
|
+
orderTabLabel = "Order Number",
|
|
1603
|
+
trackingPlaceholder = "Enter your tracking number",
|
|
1604
|
+
orderPlaceholder = "Enter your order number",
|
|
1605
|
+
emailPlaceholder = "Enter your email",
|
|
1606
|
+
loadingLabel = "Querying...",
|
|
1607
|
+
loadingMessage = "Checking your order...",
|
|
1608
|
+
emptyMessage = "We couldn't find an order or shipment for that number.",
|
|
1609
|
+
errorMessage = "We couldn't retrieve this order right now. Please try again later.",
|
|
1610
|
+
trackingInputLabel = "Tracking number",
|
|
1611
|
+
orderInputLabel = "Order number",
|
|
1612
|
+
emailInputLabel = "Email",
|
|
1613
|
+
cardDataAttribute,
|
|
1614
|
+
resultDataAttribute,
|
|
1615
|
+
resultTestId,
|
|
1616
|
+
result,
|
|
1617
|
+
watermark,
|
|
1618
|
+
cardStyle: cardStyle2,
|
|
1619
|
+
headingStyle,
|
|
1620
|
+
tabListStyle,
|
|
1621
|
+
tabStyle: tabStyle2 = defaultTabStyle,
|
|
1622
|
+
formStyle,
|
|
1623
|
+
inputStyle: inputStyle2 = defaultInputStyle,
|
|
1624
|
+
submitStyle = defaultSubmitStyle,
|
|
1625
|
+
messageStyle,
|
|
1626
|
+
resultStyle
|
|
1627
|
+
}) {
|
|
1628
|
+
const trackingInputId = useId();
|
|
1629
|
+
const orderInputId = useId();
|
|
1630
|
+
const emailInputId = useId();
|
|
1631
|
+
const trackingTabId = useId();
|
|
1632
|
+
const orderTabId = useId();
|
|
1633
|
+
const tabPanelId = useId();
|
|
1634
|
+
const queryStatusId = useId();
|
|
1635
|
+
const [mode, setMode] = useState3(initialMode);
|
|
1636
|
+
const [trackingNumber, setTrackingNumber] = useState3(initialTrackingNumber);
|
|
1637
|
+
const [orderNumber, setOrderNumber] = useState3(initialOrderNumber);
|
|
1638
|
+
const [email, setEmail] = useState3("");
|
|
1639
|
+
const [errors, setErrors] = useState3({});
|
|
1640
|
+
const cardRef = useRef2(null);
|
|
1641
|
+
const resultRef = useRef2(null);
|
|
1642
|
+
const trackingInputRef = useRef2(null);
|
|
1643
|
+
const orderInputRef = useRef2(null);
|
|
1644
|
+
const emailInputRef = useRef2(null);
|
|
1645
|
+
const tabRefs = useRef2({ tracking: null, order: null });
|
|
1646
|
+
const loading = phase === "loading";
|
|
1647
|
+
const terminalPhase = phase === "success" || phase === "empty" || phase === "error";
|
|
1648
|
+
useEffect2(() => {
|
|
1649
|
+
if (!terminalPhase) return;
|
|
1650
|
+
const card = cardRef.current;
|
|
1651
|
+
const resultNode = resultRef.current;
|
|
1652
|
+
if (card && resultNode && typeof card.scrollTo === "function") {
|
|
1653
|
+
card.scrollTo({ top: Math.max(0, resultNode.offsetTop - card.offsetTop - 16), behavior: "smooth" });
|
|
1654
|
+
}
|
|
1655
|
+
resultNode?.focus({ preventScroll: true });
|
|
1656
|
+
}, [phase, terminalPhase]);
|
|
1657
|
+
const focusField = (field) => {
|
|
1658
|
+
const input = field === "tracking" ? trackingInputRef.current : field === "order" ? orderInputRef.current : emailInputRef.current;
|
|
1659
|
+
input?.focus();
|
|
1660
|
+
};
|
|
1661
|
+
const setActiveMode = (nextMode, moveFocus = false) => {
|
|
1662
|
+
setMode(nextMode);
|
|
1663
|
+
setErrors({});
|
|
1664
|
+
if (moveFocus) tabRefs.current[nextMode]?.focus();
|
|
1665
|
+
};
|
|
1666
|
+
const onTabKeyDown = (event, currentMode) => {
|
|
1667
|
+
const modes = ["tracking", "order"];
|
|
1668
|
+
const currentIndex = modes.indexOf(currentMode);
|
|
1669
|
+
const nextMode = event.key === "ArrowRight" ? modes[(currentIndex + 1) % modes.length] : event.key === "ArrowLeft" ? modes[(currentIndex - 1 + modes.length) % modes.length] : event.key === "Home" ? modes[0] : event.key === "End" ? modes[modes.length - 1] : void 0;
|
|
1670
|
+
if (!nextMode) return;
|
|
1671
|
+
event.preventDefault();
|
|
1672
|
+
setActiveMode(nextMode, true);
|
|
1673
|
+
};
|
|
1674
|
+
const clearError = (field) => {
|
|
1675
|
+
setErrors((current) => {
|
|
1676
|
+
if (!current[field]) return current;
|
|
1677
|
+
const next = { ...current };
|
|
1678
|
+
delete next[field];
|
|
1679
|
+
return next;
|
|
1680
|
+
});
|
|
1681
|
+
};
|
|
1682
|
+
const submit = (event) => {
|
|
1683
|
+
event.preventDefault();
|
|
1684
|
+
const nextErrors = {};
|
|
1685
|
+
const normalizedTrackingNumber = trackingNumber.trim();
|
|
1686
|
+
const normalizedOrderNumber = orderNumber.trim();
|
|
1687
|
+
const normalizedEmail = email.trim();
|
|
1688
|
+
if (mode === "tracking" && !isValidTrackingNumber(normalizedTrackingNumber)) nextErrors.tracking = fieldError("tracking");
|
|
1689
|
+
if (mode === "order" && !isValidOrderNumber(normalizedOrderNumber)) nextErrors.order = fieldError("order");
|
|
1690
|
+
if (mode === "order" && !isValidOrderEmail(normalizedEmail)) nextErrors.email = fieldError("email");
|
|
1691
|
+
const firstInvalidField = mode === "tracking" ? "tracking" : nextErrors.order ? "order" : nextErrors.email ? "email" : void 0;
|
|
1692
|
+
if (firstInvalidField && nextErrors[firstInvalidField]) {
|
|
1693
|
+
setErrors(nextErrors);
|
|
1694
|
+
focusField(firstInvalidField);
|
|
1695
|
+
return;
|
|
1696
|
+
}
|
|
1697
|
+
setErrors({});
|
|
1698
|
+
void onQuery(mode === "tracking" ? { mode, trackingNumber: normalizedTrackingNumber } : { mode, orderNumber: normalizedOrderNumber, email: normalizedEmail });
|
|
1699
|
+
};
|
|
1700
|
+
const errorFor = (field) => errors[field];
|
|
1701
|
+
const inputWithError = (field) => ({ ...inputStyle2, borderColor: errorFor(field) ? "#b42318" : inputStyle2.borderColor ?? "#cbd5e1" });
|
|
1702
|
+
const message = phase === "loading" ? loadingMessage : phase === "empty" ? emptyMessage : phase === "error" ? errorMessage : void 0;
|
|
1703
|
+
const cardData = cardDataAttribute ? { [cardDataAttribute]: "true" } : {};
|
|
1704
|
+
const resultData = resultDataAttribute ? { [resultDataAttribute]: "true" } : {};
|
|
1705
|
+
const activeTabId = mode === "tracking" ? trackingTabId : orderTabId;
|
|
1706
|
+
const resultLabel = phase === "success" ? "Tracking result" : "Tracking query status";
|
|
1707
|
+
return /* @__PURE__ */ jsxs4("div", { ref: cardRef, "data-tracking-query-card": true, ...cardData, "aria-busy": loading || void 0, style: { boxSizing: "border-box", minWidth: 0, maxWidth: "100%", overflowX: "hidden", overflowY: "auto", overscrollBehavior: "contain", scrollPaddingBlock: 16, ...cardStyle2 }, children: [
|
|
1708
|
+
/* @__PURE__ */ jsx4("h1", { style: { margin: "0 0 28px", textAlign: "center", ...headingStyle }, children: heading }),
|
|
1709
|
+
/* @__PURE__ */ jsxs4("div", { role: "tablist", "aria-label": "Tracking method", style: { display: "grid", gridTemplateColumns: "1fr 1fr", borderBottom: "1px solid #cbd5e1", marginBottom: 18, ...tabListStyle }, children: [
|
|
1710
|
+
/* @__PURE__ */ jsx4("button", { ref: (element) => {
|
|
1711
|
+
tabRefs.current.tracking = element;
|
|
1712
|
+
}, id: trackingTabId, type: "button", role: "tab", "aria-selected": mode === "tracking", "aria-controls": tabPanelId, tabIndex: mode === "tracking" ? 0 : -1, onClick: () => setActiveMode("tracking"), onKeyDown: (event) => onTabKeyDown(event, "tracking"), style: tabStyle2(mode === "tracking"), children: trackingTabLabel }),
|
|
1713
|
+
/* @__PURE__ */ jsx4("button", { ref: (element) => {
|
|
1714
|
+
tabRefs.current.order = element;
|
|
1715
|
+
}, id: orderTabId, type: "button", role: "tab", "aria-selected": mode === "order", "aria-controls": tabPanelId, tabIndex: mode === "order" ? 0 : -1, onClick: () => setActiveMode("order"), onKeyDown: (event) => onTabKeyDown(event, "order"), style: tabStyle2(mode === "order"), children: orderTabLabel })
|
|
1716
|
+
] }),
|
|
1717
|
+
/* @__PURE__ */ jsx4("div", { id: tabPanelId, role: "tabpanel", "aria-labelledby": activeTabId, children: /* @__PURE__ */ jsxs4("form", { noValidate: true, onSubmit: submit, style: { display: "grid", gap: 12, minWidth: 0, ...formStyle }, children: [
|
|
1718
|
+
mode === "tracking" ? /* @__PURE__ */ jsxs4("div", { children: [
|
|
1719
|
+
/* @__PURE__ */ jsx4("label", { htmlFor: trackingInputId, style: srOnly, children: trackingInputLabel }),
|
|
1720
|
+
/* @__PURE__ */ jsx4("input", { ref: trackingInputRef, id: trackingInputId, "aria-label": trackingInputLabel, "aria-invalid": Boolean(errorFor("tracking")), "aria-describedby": errorFor("tracking") ? trackingInputId + "-error" : void 0, value: trackingNumber, onChange: (event) => {
|
|
1721
|
+
setTrackingNumber(event.target.value);
|
|
1722
|
+
clearError("tracking");
|
|
1723
|
+
}, placeholder: trackingPlaceholder, style: inputWithError("tracking") }),
|
|
1724
|
+
errorFor("tracking") ? /* @__PURE__ */ jsx4("p", { id: trackingInputId + "-error", role: "alert", style: { margin: "6px 0 0", color: "#b42318", fontSize: 13 }, children: errorFor("tracking") }) : null
|
|
1725
|
+
] }) : /* @__PURE__ */ jsxs4(Fragment2, { children: [
|
|
1726
|
+
/* @__PURE__ */ jsxs4("div", { children: [
|
|
1727
|
+
/* @__PURE__ */ jsx4("label", { htmlFor: orderInputId, style: srOnly, children: orderInputLabel }),
|
|
1728
|
+
/* @__PURE__ */ jsx4("input", { ref: orderInputRef, id: orderInputId, "aria-label": orderInputLabel, "aria-invalid": Boolean(errorFor("order")), "aria-describedby": errorFor("order") ? orderInputId + "-error" : void 0, value: orderNumber, onChange: (event) => {
|
|
1729
|
+
setOrderNumber(event.target.value);
|
|
1730
|
+
clearError("order");
|
|
1731
|
+
}, placeholder: orderPlaceholder, style: inputWithError("order") }),
|
|
1732
|
+
errorFor("order") ? /* @__PURE__ */ jsx4("p", { id: orderInputId + "-error", role: "alert", style: { margin: "6px 0 0", color: "#b42318", fontSize: 13 }, children: errorFor("order") }) : null
|
|
1733
|
+
] }),
|
|
1734
|
+
/* @__PURE__ */ jsxs4("div", { children: [
|
|
1735
|
+
/* @__PURE__ */ jsx4("label", { htmlFor: emailInputId, style: srOnly, children: emailInputLabel }),
|
|
1736
|
+
/* @__PURE__ */ jsx4("input", { ref: emailInputRef, id: emailInputId, type: "email", "aria-label": emailInputLabel, "aria-invalid": Boolean(errorFor("email")), "aria-describedby": errorFor("email") ? emailInputId + "-error" : void 0, value: email, onChange: (event) => {
|
|
1737
|
+
setEmail(event.target.value);
|
|
1738
|
+
clearError("email");
|
|
1739
|
+
}, placeholder: emailPlaceholder, style: inputWithError("email") }),
|
|
1740
|
+
errorFor("email") ? /* @__PURE__ */ jsx4("p", { id: emailInputId + "-error", role: "alert", style: { margin: "6px 0 0", color: "#b42318", fontSize: 13 }, children: errorFor("email") }) : null
|
|
1741
|
+
] })
|
|
1742
|
+
] }),
|
|
1743
|
+
/* @__PURE__ */ jsx4("button", { type: "submit", disabled: loading, style: submitStyle(loading), children: loading ? loadingLabel : submitLabel })
|
|
1744
|
+
] }) }),
|
|
1745
|
+
message ? /* @__PURE__ */ jsx4("p", { id: queryStatusId, role: phase === "error" ? "alert" : "status", "aria-live": phase === "error" ? "assertive" : "polite", style: { margin: "16px 0 0", color: phase === "error" ? "#b42318" : "#64748b", ...messageStyle }, children: message }) : null,
|
|
1746
|
+
phase === "success" ? /* @__PURE__ */ jsx4("p", { id: queryStatusId, role: "status", "aria-live": "polite", style: srOnly, children: "Tracking details loaded." }) : null,
|
|
1747
|
+
terminalPhase ? /* @__PURE__ */ jsx4("div", { ref: resultRef, role: "region", "aria-label": resultLabel, "aria-describedby": queryStatusId, "data-tracking-query-result": true, ...resultData, "data-testid": resultTestId, tabIndex: -1, style: { minWidth: 0, overflowWrap: "anywhere", marginTop: phase === "success" ? 20 : 0, ...resultStyle }, children: phase === "success" ? result : null }) : null,
|
|
1748
|
+
watermark
|
|
1749
|
+
] });
|
|
1750
|
+
}
|
|
1751
|
+
function defaultProgress2(status) {
|
|
1752
|
+
const steps = [
|
|
1753
|
+
{ id: "ordered", label: "Ordered", icon: "check" },
|
|
1754
|
+
{ id: "ready", label: "Order Ready", icon: "bag" },
|
|
1755
|
+
{ id: "transit", label: "In Transit", icon: "truck" },
|
|
1756
|
+
{ id: "out", label: "Out for Delivery", icon: "box" },
|
|
1757
|
+
{ id: "delivered", label: "Delivered", icon: "check" }
|
|
1758
|
+
];
|
|
1759
|
+
const normalized = status.toLowerCase();
|
|
1760
|
+
const current = normalized.includes("deliver") ? normalized.includes("out for") ? 3 : 4 : normalized.includes("transit") ? 2 : normalized.includes("ready") ? 1 : 0;
|
|
1761
|
+
return steps.map((step, index) => ({ ...step, state: index < current ? "complete" : index === current ? "current" : "upcoming" }));
|
|
1762
|
+
}
|
|
1763
|
+
function TrackingProgressDetails({ steps }) {
|
|
1764
|
+
return /* @__PURE__ */ jsx4("ol", { "aria-label": "Delivery progress", style: { display: "grid", gridTemplateColumns: "repeat(5, minmax(0, 1fr))", gap: 4, margin: "20px 0 0", padding: 0, listStyle: "none" }, children: steps.slice(0, 5).map((step, index) => /* @__PURE__ */ jsxs4("li", { style: { minWidth: 0, textAlign: "center", color: step.state === "upcoming" ? "#64748b" : "#0f172a" }, children: [
|
|
1765
|
+
/* @__PURE__ */ jsx4("span", { "aria-label": step.label + " " + step.state, style: { display: "grid", placeItems: "center", width: 28, height: 28, margin: "0 auto", border: "1px solid " + (step.state === "upcoming" ? "#94a3b8" : "#0f172a"), borderRadius: "50%", background: step.state === "current" ? "#0f172a" : "#fff", color: step.state === "current" ? "#fff" : "#0f172a", fontSize: 13, fontWeight: 700 }, children: step.state === "complete" || step.state === "current" ? "\u2713" : index + 1 }),
|
|
1766
|
+
/* @__PURE__ */ jsx4("span", { style: { display: "block", marginTop: 6, overflowWrap: "anywhere", fontSize: 11, lineHeight: 1.25 }, children: step.label }),
|
|
1767
|
+
step.date ? /* @__PURE__ */ jsx4("span", { style: { display: "block", marginTop: 3, color: "#94a3b8", fontSize: 10, lineHeight: 1.2 }, children: step.date }) : null
|
|
1768
|
+
] }, step.id)) });
|
|
1769
|
+
}
|
|
1770
|
+
function TrackingEvents({ result }) {
|
|
1771
|
+
const [expanded, setExpanded] = useState3(false);
|
|
1772
|
+
const events = result.events ?? (result.latestEvent ? [{ id: "latest", title: result.latestEvent, at: result.updatedAt, state: "current" }] : []);
|
|
1773
|
+
if (!events.length) return /* @__PURE__ */ jsx4("p", { style: { margin: "12px 0 0", color: "#64748b", fontSize: 14 }, children: "Tracking events are not available yet. Please try again later." });
|
|
1774
|
+
const visibleEvents = events.slice(0, expanded ? 50 : 3);
|
|
1775
|
+
return /* @__PURE__ */ jsxs4("div", { "aria-label": "Shipping events", style: { marginTop: 16 }, children: [
|
|
1776
|
+
/* @__PURE__ */ jsx4("ol", { style: { display: "grid", gap: 14, margin: 0, padding: 0, listStyle: "none" }, children: visibleEvents.map((event, index) => /* @__PURE__ */ jsxs4("li", { style: { position: "relative", minWidth: 0, paddingLeft: 22, overflowWrap: "anywhere" }, children: [
|
|
1777
|
+
/* @__PURE__ */ jsx4("span", { "aria-hidden": "true", style: { position: "absolute", left: 0, top: 4, width: 10, height: 10, borderRadius: "50%", background: event.state === "current" || index === 0 ? "#111827" : "#cbd5e1" } }),
|
|
1778
|
+
/* @__PURE__ */ jsx4("strong", { style: { display: "block", fontSize: 14 }, children: event.title }),
|
|
1779
|
+
event.detail ? /* @__PURE__ */ jsx4("span", { style: { display: "block", marginTop: 2, color: "#64748b", fontSize: 13 }, children: event.detail }) : null,
|
|
1780
|
+
event.at ? /* @__PURE__ */ jsx4("time", { style: { display: "block", marginTop: 3, color: "#94a3b8", fontSize: 12 }, children: event.at }) : null
|
|
1781
|
+
] }, event.id)) }),
|
|
1782
|
+
events.length > 3 ? /* @__PURE__ */ jsx4("button", { type: "button", onClick: () => setExpanded((current) => !current), style: { minWidth: 44, minHeight: 44, marginTop: 14, padding: "6px 12px", border: "1px solid #cbd5e1", borderRadius: 6, background: "#fff", color: "#0f172a", font: "inherit", fontSize: 13, cursor: "pointer" }, children: expanded ? "Show recent events" : "Show all events" }) : null
|
|
1783
|
+
] });
|
|
1784
|
+
}
|
|
1785
|
+
function TrackingOrderItemImage({ src, title }) {
|
|
1786
|
+
const [failed, setFailed] = useState3(false);
|
|
1787
|
+
const imageUrl = safeTrackingPageUrl(src);
|
|
1788
|
+
if (!imageUrl || failed) return /* @__PURE__ */ jsx4("span", { "aria-label": title + " image unavailable", style: { display: "grid", width: 56, height: 56, placeItems: "center", borderRadius: 6, background: "#e2e8f0", color: "#64748b", fontSize: 13 }, children: title.slice(0, 1).toUpperCase() });
|
|
1789
|
+
return /* @__PURE__ */ jsx4("img", { src: imageUrl, alt: "", onError: () => setFailed(true), style: { width: 56, height: 56, borderRadius: 6, objectFit: "cover", background: "#f1f5f9" } });
|
|
1790
|
+
}
|
|
1791
|
+
function TrackingOrderItems({ items }) {
|
|
1792
|
+
if (!items.length) return null;
|
|
1793
|
+
return /* @__PURE__ */ jsxs4("section", { "aria-label": "Order items", style: { marginTop: 24, borderTop: "1px solid #e2e8f0", paddingTop: 18 }, children: [
|
|
1794
|
+
/* @__PURE__ */ jsx4("h2", { style: { margin: 0, fontSize: 16 }, children: "Items in your order" }),
|
|
1795
|
+
/* @__PURE__ */ jsx4("div", { style: { display: "grid", gap: 12, marginTop: 12 }, children: items.map((item) => {
|
|
1796
|
+
const price = item.price ? formatTrackingPageMoney(item.price) : void 0;
|
|
1797
|
+
const href = safeTrackingPageUrl(item.href);
|
|
1798
|
+
return /* @__PURE__ */ jsxs4("article", { style: { display: "grid", gridTemplateColumns: "56px minmax(0, 1fr)", gap: 12, alignItems: "center" }, children: [
|
|
1799
|
+
/* @__PURE__ */ jsx4(TrackingOrderItemImage, { src: item.imageUrl, title: item.title }),
|
|
1800
|
+
/* @__PURE__ */ jsxs4("div", { style: { minWidth: 0, overflowWrap: "anywhere" }, children: [
|
|
1801
|
+
href ? /* @__PURE__ */ jsx4("a", { href, style: { color: "inherit", fontWeight: 700, overflowWrap: "anywhere" }, children: item.title }) : /* @__PURE__ */ jsx4("strong", { style: { overflowWrap: "anywhere" }, children: item.title }),
|
|
1802
|
+
item.description ? /* @__PURE__ */ jsx4("p", { style: { margin: "3px 0 0", color: "#64748b", fontSize: 13 }, children: item.description }) : null,
|
|
1803
|
+
/* @__PURE__ */ jsxs4("p", { style: { display: "flex", flexWrap: "wrap", gap: 8, margin: "4px 0 0", color: "#475569", fontSize: 13 }, children: [
|
|
1804
|
+
/* @__PURE__ */ jsxs4("span", { children: [
|
|
1805
|
+
"Qty ",
|
|
1806
|
+
item.quantity
|
|
1807
|
+
] }),
|
|
1808
|
+
price?.amount ? /* @__PURE__ */ jsxs4("span", { children: [
|
|
1809
|
+
price.amount,
|
|
1810
|
+
price.startsAt ? " and up" : ""
|
|
1811
|
+
] }) : null,
|
|
1812
|
+
price?.compareAt ? /* @__PURE__ */ jsx4("s", { style: { color: "#94a3b8" }, children: price.compareAt }) : null
|
|
1813
|
+
] })
|
|
1814
|
+
] })
|
|
1815
|
+
] }, item.id);
|
|
1816
|
+
}) })
|
|
1817
|
+
] });
|
|
1818
|
+
}
|
|
1819
|
+
function TrackingQueryResultDetails({ result, onTrackAnother, trackAnotherLabel = "Track another" }) {
|
|
1820
|
+
const [copied, setCopied] = useState3(false);
|
|
1821
|
+
const progress = result.progress?.length === 5 ? result.progress : defaultProgress2(result.status);
|
|
1822
|
+
const copyTrackingNumber = () => {
|
|
1823
|
+
if (typeof navigator !== "undefined" && navigator.clipboard?.writeText) {
|
|
1824
|
+
void navigator.clipboard.writeText(result.trackingNumber).then(() => setCopied(true)).catch(() => void 0);
|
|
1825
|
+
}
|
|
1826
|
+
};
|
|
1827
|
+
return /* @__PURE__ */ jsxs4("section", { "aria-label": "Tracking result details", style: { minWidth: 0, overflowWrap: "anywhere" }, children: [
|
|
1828
|
+
/* @__PURE__ */ jsxs4("div", { style: { display: "flex", flexWrap: "wrap", alignItems: "start", justifyContent: "space-between", gap: 12 }, children: [
|
|
1829
|
+
/* @__PURE__ */ jsxs4("div", { style: { minWidth: 0, flex: "1 1 180px" }, children: [
|
|
1830
|
+
/* @__PURE__ */ jsxs4("strong", { style: { fontSize: 17 }, children: [
|
|
1831
|
+
"Your order is ",
|
|
1832
|
+
result.status || "being updated"
|
|
1833
|
+
] }),
|
|
1834
|
+
result.estimatedDelivery ? /* @__PURE__ */ jsxs4("p", { style: { margin: "5px 0 0", color: "#475569", fontSize: 14 }, children: [
|
|
1835
|
+
"Estimated delivery: ",
|
|
1836
|
+
result.estimatedDelivery
|
|
1837
|
+
] }) : null
|
|
1838
|
+
] }),
|
|
1839
|
+
onTrackAnother ? /* @__PURE__ */ jsx4("button", { type: "button", onClick: onTrackAnother, style: { minWidth: 44, minHeight: 44, flex: "0 0 auto", padding: "6px 10px", border: "1px solid #cbd5e1", borderRadius: 6, background: "#fff", color: "#0f172a", font: "inherit", fontSize: 12, cursor: "pointer" }, children: trackAnotherLabel }) : null
|
|
1840
|
+
] }),
|
|
1841
|
+
/* @__PURE__ */ jsx4(TrackingProgressDetails, { steps: progress }),
|
|
1842
|
+
/* @__PURE__ */ jsxs4("div", { style: { display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(min(100%, 140px), 1fr))", gap: 10, marginTop: 22, padding: 12, borderRadius: 8, background: "#f8fafc", color: "#334155", fontSize: 13 }, children: [
|
|
1843
|
+
/* @__PURE__ */ jsxs4("span", { style: { minWidth: 0, overflowWrap: "anywhere" }, children: [
|
|
1844
|
+
/* @__PURE__ */ jsx4("strong", { children: "Carrier" }),
|
|
1845
|
+
/* @__PURE__ */ jsx4("br", {}),
|
|
1846
|
+
result.carrier || "\u2014"
|
|
1847
|
+
] }),
|
|
1848
|
+
/* @__PURE__ */ jsxs4("span", { style: { minWidth: 0, overflowWrap: "anywhere" }, children: [
|
|
1849
|
+
/* @__PURE__ */ jsx4("strong", { children: "Tracking number" }),
|
|
1850
|
+
/* @__PURE__ */ jsx4("br", {}),
|
|
1851
|
+
/* @__PURE__ */ jsx4("span", { children: result.trackingNumber }),
|
|
1852
|
+
" ",
|
|
1853
|
+
/* @__PURE__ */ jsx4("button", { type: "button", onClick: copyTrackingNumber, style: { minWidth: 44, minHeight: 44, border: 0, background: "transparent", color: "#0f172a", font: "inherit", fontSize: 12, fontWeight: 700, cursor: "pointer" }, children: copied ? "Copied" : "Copy" })
|
|
1854
|
+
] }),
|
|
1855
|
+
/* @__PURE__ */ jsxs4("span", { style: { minWidth: 0, overflowWrap: "anywhere" }, children: [
|
|
1856
|
+
/* @__PURE__ */ jsx4("strong", { children: "Destination" }),
|
|
1857
|
+
/* @__PURE__ */ jsx4("br", {}),
|
|
1858
|
+
result.destination || "\u2014"
|
|
1859
|
+
] }),
|
|
1860
|
+
/* @__PURE__ */ jsxs4("span", { style: { minWidth: 0, overflowWrap: "anywhere" }, children: [
|
|
1861
|
+
/* @__PURE__ */ jsx4("strong", { children: "Transit time" }),
|
|
1862
|
+
/* @__PURE__ */ jsx4("br", {}),
|
|
1863
|
+
result.transitDuration || "\u2014"
|
|
1864
|
+
] }),
|
|
1865
|
+
result.orderNumber ? /* @__PURE__ */ jsxs4("span", { style: { minWidth: 0, overflowWrap: "anywhere" }, children: [
|
|
1866
|
+
/* @__PURE__ */ jsx4("strong", { children: "Order number" }),
|
|
1867
|
+
/* @__PURE__ */ jsx4("br", {}),
|
|
1868
|
+
result.orderNumber
|
|
1869
|
+
] }) : null
|
|
1870
|
+
] }),
|
|
1871
|
+
/* @__PURE__ */ jsxs4("section", { "aria-label": "Tracking timeline", style: { marginTop: 24, borderTop: "1px solid #e2e8f0", paddingTop: 18 }, children: [
|
|
1872
|
+
/* @__PURE__ */ jsx4("h2", { style: { margin: 0, fontSize: 16 }, children: "Tracking timeline" }),
|
|
1873
|
+
/* @__PURE__ */ jsx4(TrackingEvents, { result })
|
|
1874
|
+
] }),
|
|
1875
|
+
/* @__PURE__ */ jsx4(TrackingOrderItems, { items: result.orderItems ?? [] })
|
|
1876
|
+
] });
|
|
585
1877
|
}
|
|
586
1878
|
|
|
587
1879
|
// src/branded.tsx
|
|
588
|
-
import { jsx as
|
|
1880
|
+
import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
589
1881
|
var initialRuntime2 = {
|
|
590
1882
|
phase: "idle",
|
|
591
1883
|
selectedShipmentId: null,
|
|
@@ -602,15 +1894,16 @@ var initialRuntime2 = {
|
|
|
602
1894
|
var BrandedRuntimeContext = createContext2(initialRuntime2);
|
|
603
1895
|
var contentWidth2 = { width: "min(1200px, 100%)", margin: "0 auto", padding: "0 clamp(16px, 4vw, 48px)", boxSizing: "border-box" };
|
|
604
1896
|
var cardStyle = { background: "#fff", color: "#0a0a0a", border: "1px solid #e7e7e7", borderRadius: 10, fontFamily: "var(--pb-font-family)" };
|
|
605
|
-
function BrandedRuntimeProvider({ children,
|
|
606
|
-
const [state, setState] =
|
|
607
|
-
const [selectedShipmentId, setSelectedShipmentId] =
|
|
608
|
-
const requestId =
|
|
609
|
-
const query = useCallback2(async (
|
|
1897
|
+
function BrandedRuntimeProvider({ children, query: injectedQuery, watermark }) {
|
|
1898
|
+
const [state, setState] = useState4({ phase: "idle" });
|
|
1899
|
+
const [selectedShipmentId, setSelectedShipmentId] = useState4(null);
|
|
1900
|
+
const requestId = useRef3(0);
|
|
1901
|
+
const query = useCallback2(async (request) => {
|
|
610
1902
|
const currentRequestId = ++requestId.current;
|
|
611
1903
|
setState({ phase: "loading" });
|
|
612
1904
|
try {
|
|
613
|
-
|
|
1905
|
+
if (!injectedQuery) throw new Error("tracking-query-not-configured");
|
|
1906
|
+
const result = await injectedQuery(request);
|
|
614
1907
|
if (currentRequestId !== requestId.current) return;
|
|
615
1908
|
setSelectedShipmentId(result.shipments?.[0]?.id ?? null);
|
|
616
1909
|
setState({ phase: isEmptyTrackingPageResult(result) ? "empty" : "success", result });
|
|
@@ -618,7 +1911,7 @@ function BrandedRuntimeProvider({ children, queryTracking }) {
|
|
|
618
1911
|
if (currentRequestId !== requestId.current) return;
|
|
619
1912
|
setState({ phase: "error", error: "tracking-query-failed" });
|
|
620
1913
|
}
|
|
621
|
-
}, [
|
|
1914
|
+
}, [injectedQuery]);
|
|
622
1915
|
const reset = useCallback2(() => {
|
|
623
1916
|
requestId.current += 1;
|
|
624
1917
|
setSelectedShipmentId(null);
|
|
@@ -633,162 +1926,104 @@ function BrandedRuntimeProvider({ children, queryTracking }) {
|
|
|
633
1926
|
if (state.result?.shipments?.some((shipment) => shipment.id === id)) setSelectedShipmentId(id);
|
|
634
1927
|
}, [state.result]);
|
|
635
1928
|
const value = useMemo2(
|
|
636
|
-
() => ({ ...state, displayedResult, selectedShipmentId, query, reset, selectShipment }),
|
|
637
|
-
[displayedResult, query, reset, selectedShipmentId, selectShipment, state]
|
|
1929
|
+
() => ({ ...state, displayedResult, selectedShipmentId, query, reset, selectShipment, watermark }),
|
|
1930
|
+
[displayedResult, query, reset, selectedShipmentId, selectShipment, state, watermark]
|
|
638
1931
|
);
|
|
639
|
-
return /* @__PURE__ */
|
|
1932
|
+
return /* @__PURE__ */ jsx5(BrandedRuntimeContext.Provider, { value, children });
|
|
640
1933
|
}
|
|
641
1934
|
function useBrandedRuntime() {
|
|
642
1935
|
return useContext2(BrandedRuntimeContext);
|
|
643
1936
|
}
|
|
1937
|
+
function RuntimeWatermark2({ watermark }) {
|
|
1938
|
+
return watermark?.visible ? /* @__PURE__ */ jsx5("small", { style: { display: "block", marginTop: 10, color: "#8a8a8a", fontSize: 8, textAlign: "right" }, children: watermark.label || "Powered by BestTrack" }) : null;
|
|
1939
|
+
}
|
|
644
1940
|
function text3(props, key, fallback) {
|
|
645
1941
|
return typeof props[key] === "string" ? props[key] : fallback;
|
|
646
1942
|
}
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
if (value.startsWith("/") && !value.startsWith("//")) return value;
|
|
650
|
-
try {
|
|
651
|
-
const url = new URL(value);
|
|
652
|
-
return url.protocol === "https:" || url.protocol === "http:" ? url.toString() : "#";
|
|
653
|
-
} catch {
|
|
654
|
-
return "#";
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
function safeImageUrl2(value) {
|
|
658
|
-
if (typeof value !== "string") return "";
|
|
659
|
-
try {
|
|
660
|
-
const url = new URL(value);
|
|
661
|
-
return url.protocol === "https:" || url.protocol === "http:" ? url.toString() : "";
|
|
662
|
-
} catch {
|
|
663
|
-
return "";
|
|
664
|
-
}
|
|
665
|
-
}
|
|
1943
|
+
var safeHref2 = safeTrackingPageUrl;
|
|
1944
|
+
var safeImageUrl2 = safeTrackingPageUrl;
|
|
666
1945
|
function shipmentLabels(value) {
|
|
667
1946
|
return typeof value === "string" ? value.split("|").map((label, index) => ({ id: "configured-" + index, label: label.trim() })).filter((item) => item.label) : [];
|
|
668
1947
|
}
|
|
669
1948
|
function ProductImage2({ src, alt }) {
|
|
670
|
-
const [failed, setFailed] =
|
|
1949
|
+
const [failed, setFailed] = useState4(false);
|
|
671
1950
|
const safeSrc = safeImageUrl2(src);
|
|
672
1951
|
if (!safeSrc || failed) {
|
|
673
|
-
return /* @__PURE__ */
|
|
1952
|
+
return /* @__PURE__ */ jsx5("span", { "aria-label": alt + " image unavailable", style: { display: "grid", placeItems: "center", width: 72, height: 72, flex: "0 0 auto", borderRadius: 6, background: "#f2f2f2", color: "#6b6b6b", fontSize: 14 }, children: alt.slice(0, 1).toUpperCase() });
|
|
674
1953
|
}
|
|
675
|
-
return /* @__PURE__ */
|
|
1954
|
+
return /* @__PURE__ */ jsx5("img", { src: safeSrc, alt, onError: () => setFailed(true), style: { width: 72, height: 72, flex: "0 0 auto", borderRadius: 6, objectFit: "cover", background: "#f2f2f2" } });
|
|
676
1955
|
}
|
|
677
1956
|
function ShipmentSwitcher({ shipmentLabels: configuredLabels }) {
|
|
678
1957
|
const runtime = useBrandedRuntime();
|
|
679
1958
|
const configuredShipments = shipmentLabels(configuredLabels);
|
|
680
1959
|
const shipments = runtime.phase === "idle" || runtime.phase === "loading" ? configuredShipments : runtime.result?.shipments ?? [];
|
|
681
1960
|
if (!shipments.length) return null;
|
|
682
|
-
return /* @__PURE__ */
|
|
1961
|
+
return /* @__PURE__ */ jsx5("div", { "aria-label": "Shipment switcher", style: { ...contentWidth2, minWidth: 0, minHeight: 56, display: "flex", alignItems: "center", gap: 8, overflowX: "auto", whiteSpace: "nowrap" }, children: shipments.map((shipment, index) => {
|
|
683
1962
|
const selected = (runtime.selectedShipmentId ?? shipments[0]?.id) === shipment.id;
|
|
684
|
-
return /* @__PURE__ */
|
|
1963
|
+
return /* @__PURE__ */ jsx5("button", { type: "button", onClick: () => runtime.selectShipment(shipment.id), "aria-pressed": selected, style: { minWidth: 92, minHeight: 44, padding: "0 12px", border: selected ? "1px solid #1a1a1a" : "1px solid #e7e7e7", borderRadius: 4, background: "#fff", color: "#0a0a0a", fontSize: 11, fontWeight: selected ? 700 : 400, cursor: "pointer" }, children: shipment.label || "Shipment #" + (index + 1) }, shipment.id);
|
|
685
1964
|
}) });
|
|
686
1965
|
}
|
|
687
1966
|
function QueryHero(props) {
|
|
688
1967
|
const runtime = useBrandedRuntime();
|
|
689
|
-
const [
|
|
690
|
-
const
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
1968
|
+
const [heroImageFailed, setHeroImageFailed] = useState4(false);
|
|
1969
|
+
const result = runtime.displayedResult;
|
|
1970
|
+
return /* @__PURE__ */ jsxs5("div", { style: { position: "relative", minWidth: 0, minHeight: "clamp(520px, 44vw, 560px)", display: "grid", overflow: "hidden", background: "linear-gradient(135deg, #dedbd4, #b9b3aa)" }, children: [
|
|
1971
|
+
!heroImageFailed && safeImageUrl2(props.heroImageUrl) ? /* @__PURE__ */ jsx5("img", { src: safeImageUrl2(props.heroImageUrl), alt: "", onError: () => setHeroImageFailed(true), style: { position: "absolute", inset: 0, width: "100%", height: "100%", objectFit: "cover" } }) : null,
|
|
1972
|
+
/* @__PURE__ */ jsx5("div", { "aria-hidden": "true", style: { position: "absolute", inset: 0, background: "rgba(255,255,255,0.12)" } }),
|
|
1973
|
+
/* @__PURE__ */ jsx5("div", { style: { ...contentWidth2, position: "relative", zIndex: 1, display: "grid", alignItems: "center", width: "100%", minWidth: 0, paddingTop: "clamp(24px, 5vw, 48px)", paddingBottom: "clamp(24px, 5vw, 48px)" }, children: /* @__PURE__ */ jsx5(
|
|
1974
|
+
TrackingQueryCard,
|
|
1975
|
+
{
|
|
1976
|
+
phase: runtime.phase,
|
|
1977
|
+
onQuery: runtime.query,
|
|
1978
|
+
heading: text3(props, "heading", "Track your order"),
|
|
1979
|
+
submitLabel: text3(props, "submitLabel", "Track"),
|
|
1980
|
+
initialTrackingNumber: text3(props, "defaultTrackingNumber", "DEMO-YQTRACK9999"),
|
|
1981
|
+
initialOrderNumber: text3(props, "defaultOrderNumber", ""),
|
|
1982
|
+
initialMode: text3(props, "defaultQueryMode", "tracking") === "order" ? "order" : "tracking",
|
|
1983
|
+
trackingTabLabel: text3(props, "trackingTabLabel", "Tracking Number"),
|
|
1984
|
+
orderTabLabel: text3(props, "orderTabLabel", "Order Number"),
|
|
1985
|
+
loadingLabel: "Tracking...",
|
|
1986
|
+
loadingMessage: "Checking your order\u2026",
|
|
1987
|
+
emptyMessage: "We couldn\u2019t find an order for that number.",
|
|
1988
|
+
errorMessage: "We couldn\u2019t retrieve this order right now. Please try again later.",
|
|
1989
|
+
cardDataAttribute: "data-branded-query-card",
|
|
1990
|
+
resultDataAttribute: "data-branded-query-result",
|
|
1991
|
+
resultTestId: "branded-result",
|
|
1992
|
+
cardStyle: { ...cardStyle, width: "min(560px, 100%)", maxHeight: "min(560px, calc(100dvh - 32px))", marginLeft: "auto", padding: "clamp(24px, 5vw, 48px)", boxSizing: "border-box", boxShadow: "0 16px 40px rgb(0 0 0 / 8%)" },
|
|
1993
|
+
headingStyle: { marginBottom: 36, fontSize: "clamp(28px, 3vw, 32px)", lineHeight: 1.15 },
|
|
1994
|
+
tabListStyle: { borderBottomColor: "#e7e7e7", marginBottom: 24 },
|
|
1995
|
+
tabStyle: (active) => ({ minHeight: 44, border: 0, borderBottom: active ? "2px solid #0a0a0a" : "2px solid transparent", background: "transparent", font: "inherit", fontWeight: active ? 700 : 400, cursor: "pointer" }),
|
|
1996
|
+
formStyle: { gap: 12 },
|
|
1997
|
+
inputStyle: { width: "100%", height: 48, padding: "0 16px", boxSizing: "border-box", border: "1px solid #e2e2e2", borderRadius: 10, font: "inherit" },
|
|
1998
|
+
submitStyle: (loading) => ({ width: "100%", minHeight: 48, marginTop: 12, border: 0, borderRadius: 10, background: loading ? "#6b6b6b" : "#000", color: "#fff", font: "inherit", cursor: loading ? "wait" : "pointer" }),
|
|
1999
|
+
result: result ? /* @__PURE__ */ jsx5(TrackingQueryResultDetails, { result, onTrackAnother: runtime.reset, trackAnotherLabel: text3(props, "trackAnotherLabel", "Track another order") }) : null,
|
|
2000
|
+
resultStyle: { padding: 16, border: "1px solid #e7e7e7", borderRadius: 8, background: "#fffdf0" },
|
|
2001
|
+
watermark: /* @__PURE__ */ jsx5(RuntimeWatermark2, { watermark: runtime.watermark })
|
|
2002
|
+
}
|
|
2003
|
+
) })
|
|
714
2004
|
] });
|
|
715
2005
|
}
|
|
716
|
-
function defaultProgress2(status) {
|
|
717
|
-
const steps = ["Ordered", "Order Ready", "In Transit", "Out for Delivery", "Delivered"];
|
|
718
|
-
const normalized = status.toLowerCase();
|
|
719
|
-
const current = normalized.includes("deliver") ? normalized.includes("out for") ? 3 : 4 : normalized.includes("transit") ? 2 : normalized.includes("ready") ? 1 : 0;
|
|
720
|
-
return steps.map((label, index) => ({ id: label.toLowerCase().replaceAll(" ", "-"), label, state: index < current ? "complete" : index === current ? "current" : "upcoming" }));
|
|
721
|
-
}
|
|
722
|
-
function TrackingProgress2({ steps }) {
|
|
723
|
-
return /* @__PURE__ */ jsx3("div", { "aria-label": "Delivery progress", style: { overflowX: "auto", padding: "28px 0 8px" }, children: /* @__PURE__ */ jsx3("ol", { style: { display: "grid", gridTemplateColumns: "repeat(" + steps.length + ", minmax(112px, 1fr))", minWidth: Math.max(560, steps.length * 138), padding: 0, margin: 0, listStyle: "none" }, children: steps.map((step, index) => /* @__PURE__ */ jsxs3("li", { style: { position: "relative", display: "grid", justifyItems: "center", gap: 12, color: step.state === "upcoming" ? "#718096" : "#0f1d3a", textAlign: "center" }, children: [
|
|
724
|
-
index > 0 ? /* @__PURE__ */ jsx3("span", { "aria-hidden": "true", style: { position: "absolute", top: 19, right: "50%", width: "100%", height: 8, transform: "translateX(-50%)", background: step.state === "upcoming" ? "#d1d5db" : "#0f1d3a" } }) : null,
|
|
725
|
-
/* @__PURE__ */ jsx3("span", { "aria-label": step.label + " " + step.state, style: { position: "relative", zIndex: 1, display: "grid", placeItems: "center", width: 40, height: 40, border: step.state === "current" ? "1px solid #0f1d3a" : "1px solid #8190a4", borderRadius: "50%", background: step.state === "complete" ? "#0f1d3a" : "#fff", color: step.state === "complete" ? "#fff" : "#0f1d3a", fontWeight: 700 }, children: step.state === "complete" ? "\u2713" : index + 1 }),
|
|
726
|
-
/* @__PURE__ */ jsx3("strong", { style: { fontSize: 14 }, children: step.label })
|
|
727
|
-
] }, step.id)) }) });
|
|
728
|
-
}
|
|
729
|
-
function ShippingTimeline2({ events }) {
|
|
730
|
-
if (!events.length) return /* @__PURE__ */ jsx3("p", { style: { margin: 0, color: "#6b6b6b" }, children: "Shipping events will appear when the carrier publishes them." });
|
|
731
|
-
return /* @__PURE__ */ jsx3("ol", { "aria-label": "Shipping events", style: { display: "grid", gap: 22, margin: 0, padding: 0, listStyle: "none" }, children: events.map((event, index) => /* @__PURE__ */ jsxs3("li", { style: { display: "grid", gridTemplateColumns: "22px 1fr", columnGap: 14, position: "relative" }, children: [
|
|
732
|
-
/* @__PURE__ */ jsx3("span", { "aria-hidden": "true", style: { position: "relative", zIndex: 1, width: 14, height: 14, marginTop: 4, borderRadius: "50%", background: event.state === "current" || index === 0 ? "#42b765" : "#d5dfed" } }),
|
|
733
|
-
index < events.length - 1 ? /* @__PURE__ */ jsx3("span", { "aria-hidden": "true", style: { position: "absolute", left: 6, top: 18, bottom: -26, width: 2, background: "#e0e7f0" } }) : null,
|
|
734
|
-
/* @__PURE__ */ jsxs3("div", { children: [
|
|
735
|
-
/* @__PURE__ */ jsx3("strong", { style: { color: index === 0 ? "#cb4d34" : "#51657f" }, children: event.title }),
|
|
736
|
-
event.detail ? /* @__PURE__ */ jsx3("p", { style: { margin: "4px 0", color: "#6b6b6b" }, children: event.detail }) : null,
|
|
737
|
-
event.at ? /* @__PURE__ */ jsx3("small", { style: { color: "#8a9ab0" }, children: event.at }) : null
|
|
738
|
-
] })
|
|
739
|
-
] }, event.id)) });
|
|
740
|
-
}
|
|
741
2006
|
function PackageContents2({ items }) {
|
|
742
|
-
if (!items?.length) return /* @__PURE__ */
|
|
743
|
-
return /* @__PURE__ */
|
|
744
|
-
/* @__PURE__ */
|
|
745
|
-
/* @__PURE__ */
|
|
746
|
-
/* @__PURE__ */
|
|
747
|
-
/* @__PURE__ */
|
|
748
|
-
/* @__PURE__ */
|
|
2007
|
+
if (!items?.length) return /* @__PURE__ */ jsx5("p", { style: { margin: 0, color: "#6b6b6b" }, children: "Package contents are not available for this shipment." });
|
|
2008
|
+
return /* @__PURE__ */ jsx5("div", { style: { display: "grid", gap: 16 }, children: items.map((item) => /* @__PURE__ */ jsxs5("article", { style: { display: "flex", alignItems: "flex-start", gap: 14, minWidth: 0 }, children: [
|
|
2009
|
+
/* @__PURE__ */ jsx5(ProductImage2, { src: item.imageUrl, alt: item.title }),
|
|
2010
|
+
/* @__PURE__ */ jsxs5("div", { style: { minWidth: 0, overflowWrap: "anywhere" }, children: [
|
|
2011
|
+
/* @__PURE__ */ jsx5("strong", { children: item.title }),
|
|
2012
|
+
/* @__PURE__ */ jsx5("p", { style: { margin: "5px 0", color: "#6b6b6b", fontSize: 14 }, children: item.description ?? "Product details are available in your order." }),
|
|
2013
|
+
/* @__PURE__ */ jsxs5("small", { style: { color: "#6b6b6b" }, children: [
|
|
749
2014
|
"Qty ",
|
|
750
2015
|
item.quantity
|
|
751
2016
|
] })
|
|
752
2017
|
] })
|
|
753
2018
|
] }, item.id)) });
|
|
754
2019
|
}
|
|
755
|
-
function TrackingResult({ props }) {
|
|
756
|
-
const runtime = useBrandedRuntime();
|
|
757
|
-
const result = runtime.displayedResult;
|
|
758
|
-
if (!result) return null;
|
|
759
|
-
const progress = result.progress?.length ? result.progress : defaultProgress2(result.status);
|
|
760
|
-
const events = result.events?.length ? result.events : result.latestEvent ? [{ id: "latest", title: result.latestEvent, at: result.updatedAt, state: "current" }] : [];
|
|
761
|
-
return /* @__PURE__ */ jsxs3("section", { "aria-label": "Tracking result", style: { background: "#fff", borderTop: "1px solid #edf0f4", color: "#101828", fontFamily: "var(--pb-font-family)", padding: "clamp(36px, 6vw, 64px) 0" }, children: [
|
|
762
|
-
/* @__PURE__ */ jsxs3("div", { style: contentWidth2, children: [
|
|
763
|
-
/* @__PURE__ */ jsxs3("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "baseline", gap: 16, flexWrap: "wrap", textAlign: "center" }, children: [
|
|
764
|
-
/* @__PURE__ */ jsxs3("p", { style: { flex: "1 1 360px", margin: 0, fontSize: "clamp(18px, 2vw, 28px)" }, children: [
|
|
765
|
-
"Tracking: ",
|
|
766
|
-
result.trackingNumber
|
|
767
|
-
] }),
|
|
768
|
-
/* @__PURE__ */ jsx3("button", { type: "button", onClick: runtime.reset, style: { padding: "8px 12px", border: "1px solid #cbd5e1", borderRadius: 6, background: "#fff", color: "#101828", font: "inherit", cursor: "pointer" }, children: text3(props, "trackAnotherLabel", "Track another order") })
|
|
769
|
-
] }),
|
|
770
|
-
/* @__PURE__ */ jsx3("h1", { style: { margin: "54px 0 0", fontSize: "clamp(36px, 5vw, 56px)", lineHeight: 1.1, textAlign: "center" }, children: result.status }),
|
|
771
|
-
/* @__PURE__ */ jsx3(TrackingProgress2, { steps: progress })
|
|
772
|
-
] }),
|
|
773
|
-
/* @__PURE__ */ jsx3("div", { style: { borderTop: "1px solid #edf0f4", marginTop: "clamp(28px, 5vw, 54px)", paddingTop: "clamp(36px, 5vw, 60px)" }, children: /* @__PURE__ */ jsxs3("div", { style: { ...contentWidth2, display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(min(100%, 340px), 1fr))", gap: "clamp(36px, 8vw, 120px)" }, children: [
|
|
774
|
-
/* @__PURE__ */ jsxs3("section", { "aria-label": "Shipping details", children: [
|
|
775
|
-
/* @__PURE__ */ jsx3("h2", { style: { margin: "0 0 28px", fontSize: 28 }, children: "Shipping Details" }),
|
|
776
|
-
/* @__PURE__ */ jsx3(ShippingTimeline2, { events })
|
|
777
|
-
] }),
|
|
778
|
-
/* @__PURE__ */ jsxs3("section", { "aria-label": "Package contents", children: [
|
|
779
|
-
/* @__PURE__ */ jsx3("h2", { style: { margin: "0 0 28px", fontSize: 28 }, children: "Package Contents" }),
|
|
780
|
-
/* @__PURE__ */ jsx3(PackageContents2, { items: result.orderItems })
|
|
781
|
-
] })
|
|
782
|
-
] }) })
|
|
783
|
-
] });
|
|
784
|
-
}
|
|
785
2020
|
function BrandedTextField({ value, onChange }) {
|
|
786
|
-
return /* @__PURE__ */
|
|
2021
|
+
return /* @__PURE__ */ jsx5("input", { "aria-label": "Branded text", value: typeof value === "string" ? value : "", onChange: (event) => onChange(event.target.value) });
|
|
787
2022
|
}
|
|
788
2023
|
function InlineText2({ block, name, fallback }) {
|
|
789
2024
|
const value = text3(block, name, fallback);
|
|
790
|
-
if (!block.selected) return /* @__PURE__ */
|
|
791
|
-
return /* @__PURE__ */
|
|
2025
|
+
if (!block.selected) return /* @__PURE__ */ jsx5("span", { "data-branded-editor-field": name, children: value });
|
|
2026
|
+
return /* @__PURE__ */ jsx5(
|
|
792
2027
|
"input",
|
|
793
2028
|
{
|
|
794
2029
|
"aria-label": "Canvas " + name,
|
|
@@ -797,105 +2032,132 @@ function InlineText2({ block, name, fallback }) {
|
|
|
797
2032
|
onMouseDown: (event) => event.stopPropagation(),
|
|
798
2033
|
onClick: (event) => event.stopPropagation(),
|
|
799
2034
|
onChange: (event) => block.onPropsChange({ [name]: event.currentTarget.value }),
|
|
800
|
-
style: {
|
|
2035
|
+
style: {
|
|
2036
|
+
display: "inline-block",
|
|
2037
|
+
width: "100%",
|
|
2038
|
+
minWidth: "5ch",
|
|
2039
|
+
boxSizing: "border-box",
|
|
2040
|
+
/* border: "1px dashed currentColor", */
|
|
2041
|
+
border: "none",
|
|
2042
|
+
borderRadius: 3,
|
|
2043
|
+
padding: "2px 5px",
|
|
2044
|
+
background: "transparent",
|
|
2045
|
+
color: "inherit",
|
|
2046
|
+
font: "inherit",
|
|
2047
|
+
fontWeight: "inherit",
|
|
2048
|
+
lineHeight: "inherit",
|
|
2049
|
+
letterSpacing: "inherit",
|
|
2050
|
+
textAlign: "inherit"
|
|
2051
|
+
}
|
|
801
2052
|
}
|
|
802
2053
|
);
|
|
803
2054
|
}
|
|
804
2055
|
function EditorSurface({ block, children }) {
|
|
805
|
-
return /* @__PURE__ */
|
|
2056
|
+
return /* @__PURE__ */ jsx5("section", { "aria-label": "Branded editor preview", style: { ...cardStyle, outline: block.selected ? "2px solid #2563eb" : "1px dashed #cbd5e1", outlineOffset: -2, padding: 24 }, children });
|
|
806
2057
|
}
|
|
807
2058
|
function BrandedAnnouncementEditor(block) {
|
|
808
|
-
return /* @__PURE__ */
|
|
2059
|
+
return /* @__PURE__ */ jsx5("section", { "aria-label": "Branded announcement editor", style: { minHeight: 36, display: "grid", placeItems: "center", padding: "0 16px", background: "#252525", color: "#fff", fontFamily: "var(--pb-font-family)", fontSize: 12, textAlign: "center" }, children: /* @__PURE__ */ jsx5(InlineText2, { block, name: "message", fallback: "Check out our summer sale" }) });
|
|
809
2060
|
}
|
|
810
2061
|
function BrandedTrackingExperienceEditor(block) {
|
|
811
2062
|
const labels = shipmentLabels(block.shipmentLabels);
|
|
812
|
-
return /* @__PURE__ */
|
|
813
|
-
/* @__PURE__ */
|
|
814
|
-
/* @__PURE__ */
|
|
815
|
-
/* @__PURE__ */
|
|
816
|
-
/* @__PURE__ */
|
|
817
|
-
/* @__PURE__ */
|
|
818
|
-
/* @__PURE__ */
|
|
2063
|
+
return /* @__PURE__ */ jsxs5("section", { "aria-label": "Branded tracking experience editor", style: { background: "#fffdf0", fontFamily: "var(--pb-font-family)" }, children: [
|
|
2064
|
+
/* @__PURE__ */ jsx5("div", { style: { ...contentWidth2, minHeight: 56, display: "flex", alignItems: "center", gap: 8, overflowX: "auto" }, children: labels.map((shipment, index) => /* @__PURE__ */ jsx5("span", { style: { minWidth: 92, padding: "9px 12px", border: index === 0 ? "1px solid #1a1a1a" : "1px solid #e7e7e7", borderRadius: 4, background: "#fff", fontSize: 11, fontWeight: index === 0 ? 700 : 400 }, children: shipment.label }, shipment.id)) }),
|
|
2065
|
+
/* @__PURE__ */ jsx5("div", { style: { minHeight: 360, display: "grid", placeItems: "center", padding: 16, background: "linear-gradient(135deg, #dedbd4, #b9b3aa)" }, children: /* @__PURE__ */ jsxs5(EditorSurface, { block, children: [
|
|
2066
|
+
/* @__PURE__ */ jsx5("h1", { style: { margin: "0 0 28px", textAlign: "center", fontSize: 32 }, children: /* @__PURE__ */ jsx5(InlineText2, { block, name: "heading", fallback: "Track your order" }) }),
|
|
2067
|
+
/* @__PURE__ */ jsxs5("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", borderBottom: "1px solid #e7e7e7", marginBottom: 20, textAlign: "center" }, children: [
|
|
2068
|
+
/* @__PURE__ */ jsx5("span", { style: { padding: 10 }, children: /* @__PURE__ */ jsx5(InlineText2, { block, name: "orderTabLabel", fallback: "Order Number" }) }),
|
|
2069
|
+
/* @__PURE__ */ jsx5("strong", { style: { padding: 10, borderBottom: "2px solid #0a0a0a" }, children: /* @__PURE__ */ jsx5(InlineText2, { block, name: "trackingTabLabel", fallback: "Tracking Number" }) })
|
|
819
2070
|
] }),
|
|
820
|
-
/* @__PURE__ */
|
|
821
|
-
|
|
822
|
-
|
|
2071
|
+
/* @__PURE__ */ jsx5("input", { "aria-label": "Canvas default tracking number", readOnly: !block.selected, value: text3(block, "defaultTrackingNumber", "DEMO-YQTRACK9999"), onMouseDown: (event) => block.selected && event.stopPropagation(), onClick: (event) => block.selected && event.stopPropagation(), onChange: (event) => block.onPropsChange({ defaultTrackingNumber: event.currentTarget.value }), style: {
|
|
2072
|
+
width: "100%",
|
|
2073
|
+
height: 44,
|
|
2074
|
+
boxSizing: "border-box",
|
|
2075
|
+
padding: "0 12px",
|
|
2076
|
+
/* border: block.selected ? "1px dashed #0a0a0a" : "1px solid #e2e2e2", */
|
|
2077
|
+
border: "1px solid #e2e2e2",
|
|
2078
|
+
borderRadius: 10,
|
|
2079
|
+
background: "#fff",
|
|
2080
|
+
font: "inherit"
|
|
2081
|
+
} }),
|
|
2082
|
+
/* @__PURE__ */ jsx5("div", { style: { display: "grid", placeItems: "center", minHeight: 46, marginTop: 16, borderRadius: 10, background: "#000", color: "#fff", fontWeight: 700 }, children: /* @__PURE__ */ jsx5(InlineText2, { block, name: "submitLabel", fallback: "Track" }) }),
|
|
2083
|
+
/* @__PURE__ */ jsx5("small", { style: { display: "block", marginTop: 10, color: "#8a8a8a", fontSize: 9, textAlign: "right" }, children: "Powered by BestTrack" })
|
|
823
2084
|
] }) })
|
|
824
2085
|
] });
|
|
825
2086
|
}
|
|
826
2087
|
function BrandedQueryEditor(block) {
|
|
827
|
-
return /* @__PURE__ */
|
|
2088
|
+
return /* @__PURE__ */ jsx5(BrandedTrackingExperienceEditor, { ...block });
|
|
828
2089
|
}
|
|
829
2090
|
function BrandedOrderItemsEditor(block) {
|
|
830
|
-
return /* @__PURE__ */
|
|
831
|
-
/* @__PURE__ */
|
|
832
|
-
/* @__PURE__ */
|
|
2091
|
+
return /* @__PURE__ */ jsxs5(EditorSurface, { block, children: [
|
|
2092
|
+
/* @__PURE__ */ jsx5("h2", { style: { margin: 0 }, children: /* @__PURE__ */ jsx5(InlineText2, { block, name: "heading", fallback: "What's Inside" }) }),
|
|
2093
|
+
/* @__PURE__ */ jsx5("p", { style: { color: "#6b6b6b" }, children: "Package contents appear after a consumer tracking query." })
|
|
833
2094
|
] });
|
|
834
2095
|
}
|
|
835
2096
|
function BrandedRecommendationsEditor(block) {
|
|
836
|
-
return /* @__PURE__ */
|
|
837
|
-
/* @__PURE__ */
|
|
838
|
-
/* @__PURE__ */
|
|
2097
|
+
return /* @__PURE__ */ jsxs5(EditorSurface, { block, children: [
|
|
2098
|
+
/* @__PURE__ */ jsx5("h2", { style: { margin: 0, textAlign: "center" }, children: /* @__PURE__ */ jsx5(InlineText2, { block, name: "heading", fallback: "You might also like" }) }),
|
|
2099
|
+
/* @__PURE__ */ jsx5("p", { style: { color: "#6b6b6b", textAlign: "center" }, children: "Recommendations appear with the active shipment." })
|
|
839
2100
|
] });
|
|
840
2101
|
}
|
|
841
2102
|
function BrandedQuickLinksEditor(block) {
|
|
842
|
-
return /* @__PURE__ */
|
|
843
|
-
/* @__PURE__ */
|
|
844
|
-
/* @__PURE__ */
|
|
845
|
-
/* @__PURE__ */
|
|
846
|
-
/* @__PURE__ */
|
|
2103
|
+
return /* @__PURE__ */ jsxs5(EditorSurface, { block, children: [
|
|
2104
|
+
/* @__PURE__ */ jsx5("h2", { children: /* @__PURE__ */ jsx5(InlineText2, { block, name: "heading", fallback: "Need help?" }) }),
|
|
2105
|
+
/* @__PURE__ */ jsxs5("div", { style: { display: "flex", gap: 20 }, children: [
|
|
2106
|
+
/* @__PURE__ */ jsx5(InlineText2, { block, name: "primaryLabel", fallback: "Shipping help" }),
|
|
2107
|
+
/* @__PURE__ */ jsx5(InlineText2, { block, name: "secondaryLabel", fallback: "Contact us" })
|
|
847
2108
|
] })
|
|
848
2109
|
] });
|
|
849
2110
|
}
|
|
850
2111
|
function BrandedBlogEditor(block) {
|
|
851
|
-
return /* @__PURE__ */
|
|
852
|
-
/* @__PURE__ */
|
|
853
|
-
/* @__PURE__ */
|
|
854
|
-
/* @__PURE__ */
|
|
855
|
-
/* @__PURE__ */
|
|
856
|
-
/* @__PURE__ */
|
|
2112
|
+
return /* @__PURE__ */ jsxs5(EditorSurface, { block, children: [
|
|
2113
|
+
/* @__PURE__ */ jsx5("h2", { children: /* @__PURE__ */ jsx5(InlineText2, { block, name: "heading", fallback: "From our journal" }) }),
|
|
2114
|
+
/* @__PURE__ */ jsxs5("article", { children: [
|
|
2115
|
+
/* @__PURE__ */ jsx5("strong", { children: /* @__PURE__ */ jsx5(InlineText2, { block, name: "articleTitle", fallback: "Delivery tips for every season" }) }),
|
|
2116
|
+
/* @__PURE__ */ jsx5("p", { children: /* @__PURE__ */ jsx5(InlineText2, { block, name: "excerpt", fallback: "Simple ways to make every delivery feel considered." }) }),
|
|
2117
|
+
/* @__PURE__ */ jsx5(InlineText2, { block, name: "linkLabel", fallback: "Read the story" })
|
|
857
2118
|
] })
|
|
858
2119
|
] });
|
|
859
2120
|
}
|
|
860
2121
|
function BrandedAnnouncementBlock(props) {
|
|
861
2122
|
const message = text3(props, "message", "");
|
|
2123
|
+
const href = safeHref2(props.href);
|
|
862
2124
|
if (!message) return null;
|
|
863
|
-
return /* @__PURE__ */
|
|
2125
|
+
return /* @__PURE__ */ jsx5("section", { "aria-label": "Branded announcement", style: { minHeight: 36, display: "grid", placeItems: "center", padding: "0 16px", background: "#252525", color: "#fff", fontFamily: "var(--pb-font-family)", fontSize: 12, textAlign: "center" }, children: href ? /* @__PURE__ */ jsx5("a", { href, style: { color: "inherit", textDecoration: "none" }, children: message }) : message });
|
|
864
2126
|
}
|
|
865
2127
|
function BrandedTrackingExperienceBlock(props) {
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
/* @__PURE__ */
|
|
869
|
-
runtime.phase === "success" ? /* @__PURE__ */ jsx3(TrackingResult, { props }) : /* @__PURE__ */ jsx3(QueryHero, { ...props })
|
|
2128
|
+
return /* @__PURE__ */ jsxs5("section", { "aria-label": "Branded tracking experience", style: { background: "#fffdf0", fontFamily: "var(--pb-font-family)" }, children: [
|
|
2129
|
+
/* @__PURE__ */ jsx5(ShipmentSwitcher, { shipmentLabels: props.shipmentLabels }),
|
|
2130
|
+
/* @__PURE__ */ jsx5(QueryHero, { ...props })
|
|
870
2131
|
] });
|
|
871
2132
|
}
|
|
872
2133
|
function BrandedQueryBlock(props) {
|
|
873
|
-
return /* @__PURE__ */
|
|
874
|
-
/* @__PURE__ */
|
|
875
|
-
/* @__PURE__ */
|
|
2134
|
+
return /* @__PURE__ */ jsxs5("section", { "aria-label": "Branded tracking query", style: { background: "#fffdf0", fontFamily: "var(--pb-font-family)" }, children: [
|
|
2135
|
+
/* @__PURE__ */ jsx5(ShipmentSwitcher, { shipmentLabels: props.shipmentLabels }),
|
|
2136
|
+
/* @__PURE__ */ jsx5(QueryHero, { ...props })
|
|
876
2137
|
] });
|
|
877
2138
|
}
|
|
878
2139
|
function BrandedOrderItemsBlock(props) {
|
|
879
2140
|
const runtime = useBrandedRuntime();
|
|
880
2141
|
const items = runtime.displayedResult?.orderItems ?? [];
|
|
881
2142
|
const title = text3(props, "heading", "What's Inside");
|
|
882
|
-
return /* @__PURE__ */
|
|
883
|
-
/* @__PURE__ */
|
|
2143
|
+
return /* @__PURE__ */ jsx5("section", { "aria-label": title, style: { background: "#fffdf0", color: "#0a0a0a", fontFamily: "var(--pb-font-family)", padding: "clamp(28px, 4vw, 48px) 0" }, children: /* @__PURE__ */ jsxs5("div", { style: contentWidth2, children: [
|
|
2144
|
+
/* @__PURE__ */ jsxs5("h2", { style: { margin: "0 0 20px", fontSize: 20 }, children: [
|
|
884
2145
|
title,
|
|
885
2146
|
runtime.phase === "success" ? " (" + items.length + ")" : ""
|
|
886
2147
|
] }),
|
|
887
|
-
runtime.phase === "success" ? /* @__PURE__ */
|
|
2148
|
+
runtime.phase === "success" ? /* @__PURE__ */ jsx5(PackageContents2, { items }) : /* @__PURE__ */ jsx5("p", { style: { margin: 0, color: runtime.phase === "error" ? "#b42318" : "#6b6b6b" }, children: runtime.phase === "error" ? "Order items are temporarily unavailable." : "Track an order to see what is inside." })
|
|
888
2149
|
] }) });
|
|
889
2150
|
}
|
|
890
2151
|
function RecommendationCard({ item }) {
|
|
891
2152
|
const href = safeHref2(item.href);
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
/* @__PURE__ */
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
/* @__PURE__ */
|
|
898
|
-
|
|
2153
|
+
const price = item.price ? formatTrackingPageMoney(item.price) : void 0;
|
|
2154
|
+
return /* @__PURE__ */ jsxs5("article", { style: { overflow: "hidden", borderRadius: 6, background: "#fff", boxShadow: "0 1px 2px rgb(0 0 0 / 8%)" }, children: [
|
|
2155
|
+
/* @__PURE__ */ jsx5(ProductImage2, { src: item.imageUrl, alt: item.title }),
|
|
2156
|
+
/* @__PURE__ */ jsxs5("div", { style: { padding: 14 }, children: [
|
|
2157
|
+
/* @__PURE__ */ jsx5("strong", { children: item.title }),
|
|
2158
|
+
price?.amount ? /* @__PURE__ */ jsx5("p", { style: { margin: "6px 0", fontWeight: 700 }, children: price.amount }) : null,
|
|
2159
|
+
/* @__PURE__ */ jsx5("p", { style: { margin: "6px 0", color: "#6b6b6b", fontSize: 13 }, children: item.description }),
|
|
2160
|
+
!href ? /* @__PURE__ */ jsx5("span", { style: { color: "#6b6b6b", fontSize: 13, fontWeight: 700 }, children: "View product" }) : /* @__PURE__ */ jsx5("a", { href, style: { color: "#0a0a0a", fontSize: 13, fontWeight: 700 }, children: "View product" })
|
|
899
2161
|
] })
|
|
900
2162
|
] });
|
|
901
2163
|
}
|
|
@@ -904,56 +2166,70 @@ function BrandedRecommendationsBlock(props) {
|
|
|
904
2166
|
const recommendations = runtime.displayedResult?.recommendations ?? [];
|
|
905
2167
|
const title = text3(props, "heading", "You might also like");
|
|
906
2168
|
if ((runtime.phase === "success" || runtime.phase === "empty") && !recommendations.length && text3(props, "hideWhenEmpty", "false") === "true") return null;
|
|
907
|
-
return /* @__PURE__ */
|
|
908
|
-
/* @__PURE__ */
|
|
909
|
-
runtime.phase === "loading" ? /* @__PURE__ */
|
|
2169
|
+
return /* @__PURE__ */ jsx5("section", { "aria-label": title, style: { background: "#fffdf0", color: "#0a0a0a", fontFamily: "var(--pb-font-family)", padding: "clamp(28px, 4vw, 48px) 0" }, children: /* @__PURE__ */ jsxs5("div", { style: contentWidth2, children: [
|
|
2170
|
+
/* @__PURE__ */ jsx5("h2", { style: { margin: "0 0 24px", textAlign: "center", fontSize: 20 }, children: title }),
|
|
2171
|
+
runtime.phase === "loading" ? /* @__PURE__ */ jsx5("div", { "aria-label": "Loading recommendations", style: { display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(220px, 1fr))", gap: 16 }, children: [0, 1, 2].map((item) => /* @__PURE__ */ jsx5("span", { style: { display: "block", height: 220, borderRadius: 6, background: "#e7e7e7" } }, item)) }) : runtime.phase === "success" && recommendations.length ? /* @__PURE__ */ jsx5("div", { style: { display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(220px, 1fr))", gap: 16 }, children: recommendations.map((item) => /* @__PURE__ */ jsx5(RecommendationCard, { item }, item.id)) }) : /* @__PURE__ */ jsx5("p", { style: { margin: 0, textAlign: "center", color: runtime.phase === "error" ? "#b42318" : "#6b6b6b" }, children: runtime.phase === "error" ? "Recommendations are temporarily unavailable." : runtime.phase === "empty" ? "No recommendations are available for that number." : "Recommendations will appear with your order." })
|
|
910
2172
|
] }) });
|
|
911
2173
|
}
|
|
912
2174
|
function BrandedQuickLinksBlock(props) {
|
|
913
2175
|
const title = text3(props, "heading", "Need help?");
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
2176
|
+
const primaryHref = safeHref2(props.primaryHref);
|
|
2177
|
+
const secondaryHref = safeHref2(props.secondaryHref);
|
|
2178
|
+
return /* @__PURE__ */ jsxs5("section", { "aria-label": title, style: { ...cardStyle, margin: "24px auto", maxWidth: 1200, padding: 24 }, children: [
|
|
2179
|
+
/* @__PURE__ */ jsx5("h2", { children: title }),
|
|
2180
|
+
/* @__PURE__ */ jsxs5("div", { style: { display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(180px, 1fr))", gap: 16 }, children: [
|
|
2181
|
+
primaryHref ? /* @__PURE__ */ jsx5("a", { href: primaryHref, style: { color: "#0a0a0a" }, children: text3(props, "primaryLabel", "Shipping help") }) : /* @__PURE__ */ jsx5("span", { children: text3(props, "primaryLabel", "Shipping help") }),
|
|
2182
|
+
secondaryHref ? /* @__PURE__ */ jsx5("a", { href: secondaryHref, style: { color: "#0a0a0a" }, children: text3(props, "secondaryLabel", "Contact us") }) : /* @__PURE__ */ jsx5("span", { children: text3(props, "secondaryLabel", "Contact us") })
|
|
919
2183
|
] })
|
|
920
2184
|
] });
|
|
921
2185
|
}
|
|
922
2186
|
function BrandedBlogBlock(props) {
|
|
923
2187
|
const title = text3(props, "heading", "From our journal");
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
/* @__PURE__ */
|
|
927
|
-
|
|
928
|
-
/* @__PURE__ */
|
|
929
|
-
/* @__PURE__ */
|
|
2188
|
+
const href = safeHref2(props.articleHref);
|
|
2189
|
+
return /* @__PURE__ */ jsxs5("section", { "aria-label": title, style: { ...cardStyle, margin: "24px auto", maxWidth: 1200, padding: 24 }, children: [
|
|
2190
|
+
/* @__PURE__ */ jsx5("h2", { children: title }),
|
|
2191
|
+
/* @__PURE__ */ jsxs5("article", { children: [
|
|
2192
|
+
/* @__PURE__ */ jsx5("strong", { children: text3(props, "articleTitle", "Delivery tips for every season") }),
|
|
2193
|
+
/* @__PURE__ */ jsx5("p", { children: text3(props, "excerpt", "Simple ways to make every delivery feel considered.") }),
|
|
2194
|
+
href ? /* @__PURE__ */ jsx5("a", { href, style: { color: "#0a0a0a" }, children: text3(props, "linkLabel", "Read the story") }) : /* @__PURE__ */ jsx5("span", { children: text3(props, "linkLabel", "Read the story") })
|
|
930
2195
|
] })
|
|
931
2196
|
] });
|
|
932
2197
|
}
|
|
933
2198
|
|
|
934
2199
|
// src/branded-definition.ts
|
|
935
2200
|
var text4 = (label, options = {}) => ({ field: "besttrack.branded.text", label, control: "text", ...options });
|
|
936
|
-
var
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
2201
|
+
var httpsUrl = (label) => text4(label, { control: "url", validation: { allowRelativeUrl: false, allowedUrlProtocols: ["https:"], allowLocalhost: true } });
|
|
2202
|
+
function withTemplatePolicy2(blocks, protectedBlocks) {
|
|
2203
|
+
return blocks.map((block) => ({ ...block, policy: { singleton: true, ...protectedBlocks.includes(block.type) ? { required: true, allowDelete: false } : {} } }));
|
|
2204
|
+
}
|
|
2205
|
+
var brandedBlocks = withTemplatePolicy2([
|
|
2206
|
+
{ type: "besttrack.branded.announcement", version: 1, label: "Announcement", category: "BestTrack Branded", targets: ["web"], defaultProps: { message: "Check out our summer sale", href: "https://example.com/collections/sale" }, defaultVariant: "brand", variants: [{ id: "brand", label: "Brand" }, { id: "minimal", label: "Minimal", theme: { "color.primary": "#202223" } }], fields: { message: text4("Announcement", { control: "textarea" }), href: httpsUrl("Announcement URL") }, render: { web: BrandedAnnouncementBlock, editor: BrandedAnnouncementEditor } },
|
|
2207
|
+
{ type: "besttrack.branded.tracking-experience", version: 1, label: "Tracking experience", category: "BestTrack Branded", targets: ["web"], defaultProps: { heading: "Track your order", submitLabel: "Track", trackAnotherLabel: "Track another order", defaultTrackingNumber: "DEMO-YQTRACK9999", defaultOrderNumber: "", defaultQueryMode: "tracking", trackingTabLabel: "Tracking Number", orderTabLabel: "Order Number", shipmentLabels: "Shipment #1|Shipment #2|Shipment #3", heroImageUrl: "https://images.unsplash.com/photo-1596462502278-27bfdc403348?auto=format&fit=crop&w=1600&q=85" }, defaultVariant: "brand", variants: [{ id: "brand", label: "Brand" }, { id: "compact", label: "Compact", theme: { spacing: "12px" } }], fields: { heading: text4("Heading"), submitLabel: text4("Button label"), trackAnotherLabel: text4("Track another label"), defaultTrackingNumber: text4("Default tracking number"), defaultOrderNumber: text4("Default order number"), defaultQueryMode: text4("Default query mode"), trackingTabLabel: text4("Tracking tab label"), orderTabLabel: text4("Order tab label"), shipmentLabels: text4("Shipment labels (separate with |)"), heroImageUrl: httpsUrl("Hero image URL") }, render: { web: BrandedTrackingExperienceBlock, editor: BrandedTrackingExperienceEditor } },
|
|
2208
|
+
{ type: "besttrack.branded.query", version: 1, label: "Order query", category: "BestTrack Branded", targets: ["web"], defaultProps: { heading: "Track your order", submitLabel: "Track", defaultTrackingNumber: "DEMO-YQTRACK9999", defaultOrderNumber: "", defaultQueryMode: "tracking", trackingTabLabel: "Tracking Number", orderTabLabel: "Order Number", shipmentLabels: "Shipment #1|Shipment #2|Shipment #3", heroImageUrl: "https://images.unsplash.com/photo-1596462502278-27bfdc403348?auto=format&fit=crop&w=1600&q=85" }, defaultVariant: "brand", variants: [{ id: "brand", label: "Brand" }, { id: "compact", label: "Compact", theme: { spacing: "12px" } }], fields: { heading: text4("Heading"), submitLabel: text4("Button label"), defaultTrackingNumber: text4("Default tracking number"), defaultOrderNumber: text4("Default order number"), defaultQueryMode: text4("Default query mode"), trackingTabLabel: text4("Tracking tab label"), orderTabLabel: text4("Order tab label"), shipmentLabels: text4("Shipment labels (separate with |)"), heroImageUrl: httpsUrl("Hero image URL") }, render: { web: BrandedQueryBlock, editor: BrandedQueryEditor } },
|
|
940
2209
|
{ type: "besttrack.branded.order-items", version: 1, label: "Order items", category: "BestTrack Branded", targets: ["web"], defaultProps: { heading: "What's Inside" }, defaultVariant: "brand", variants: [{ id: "brand", label: "Brand" }, { id: "minimal", label: "Minimal" }], fields: { heading: text4("Heading") }, render: { web: BrandedOrderItemsBlock, editor: BrandedOrderItemsEditor } },
|
|
941
2210
|
{ type: "besttrack.branded.recommendations", version: 1, label: "Recommended products", category: "BestTrack Branded", targets: ["web"], defaultProps: { heading: "You might also like", hideWhenEmpty: "false" }, defaultVariant: "brand", variants: [{ id: "brand", label: "Brand" }, { id: "editorial", label: "Editorial", theme: { "color.surface": "#fffdf0" } }], fields: { heading: text4("Heading"), hideWhenEmpty: text4("Hide when empty (true/false)") }, render: { web: BrandedRecommendationsBlock, editor: BrandedRecommendationsEditor } },
|
|
942
|
-
{ type: "besttrack.branded.quick-links", version: 1, label: "Quick links", category: "BestTrack Branded", targets: ["web"], defaultProps: { heading: "Need help?", primaryLabel: "Shipping help", primaryHref: "/pages/shipping", secondaryLabel: "Contact us", secondaryHref: "/pages/contact" }, defaultVariant: "brand", variants: [{ id: "brand", label: "Brand" }], fields: { heading: text4("Heading"), primaryLabel: text4("Primary link label"), primaryHref:
|
|
943
|
-
{ type: "besttrack.branded.blog", version: 1, label: "Blog", category: "BestTrack Branded", targets: ["web"], defaultProps: { heading: "From our journal", articleTitle: "Delivery tips for every season", excerpt: "Simple ways to make every delivery feel considered.", articleHref: "/blogs/news", linkLabel: "Read the story" }, defaultVariant: "brand", variants: [{ id: "brand", label: "Brand" }], fields: { heading: text4("Heading"), articleTitle: text4("Article title"), excerpt: text4("Excerpt", { control: "textarea" }), articleHref:
|
|
944
|
-
];
|
|
2211
|
+
{ type: "besttrack.branded.quick-links", version: 1, label: "Quick links", category: "BestTrack Branded", targets: ["web"], defaultProps: { heading: "Need help?", primaryLabel: "Shipping help", primaryHref: "https://example.com/pages/shipping", secondaryLabel: "Contact us", secondaryHref: "https://example.com/pages/contact" }, defaultVariant: "brand", variants: [{ id: "brand", label: "Brand" }], fields: { heading: text4("Heading"), primaryLabel: text4("Primary link label"), primaryHref: httpsUrl("Primary link URL"), secondaryLabel: text4("Secondary link label"), secondaryHref: httpsUrl("Secondary link URL") }, render: { web: BrandedQuickLinksBlock, editor: BrandedQuickLinksEditor } },
|
|
2212
|
+
{ type: "besttrack.branded.blog", version: 1, label: "Blog", category: "BestTrack Branded", targets: ["web"], defaultProps: { heading: "From our journal", articleTitle: "Delivery tips for every season", excerpt: "Simple ways to make every delivery feel considered.", articleHref: "https://example.com/blogs/news", linkLabel: "Read the story" }, defaultVariant: "brand", variants: [{ id: "brand", label: "Brand" }], fields: { heading: text4("Heading"), articleTitle: text4("Article title"), excerpt: text4("Excerpt", { control: "textarea" }), articleHref: httpsUrl("Article URL"), linkLabel: text4("Link label") }, render: { web: BrandedBlogBlock, editor: BrandedBlogEditor } }
|
|
2213
|
+
], ["besttrack.branded.announcement", "besttrack.branded.tracking-experience"]);
|
|
2214
|
+
var brandedDefaultBlockTypes = brandedBlocks.filter((block) => !["besttrack.branded.query", "besttrack.branded.order-items"].includes(block.type)).map((block) => block.type);
|
|
2215
|
+
var brandedTemplatePolicy = defineTemplatePolicy(
|
|
2216
|
+
"besttrack.branded",
|
|
2217
|
+
"Branded",
|
|
2218
|
+
brandedDefaultBlockTypes,
|
|
2219
|
+
["besttrack.branded.announcement", "besttrack.branded.tracking-experience"]
|
|
2220
|
+
);
|
|
945
2221
|
function createBrandedTemplate() {
|
|
946
|
-
const templateBlocks = brandedBlocks.filter((block) =>
|
|
2222
|
+
const templateBlocks = brandedBlocks.filter((block) => brandedDefaultBlockTypes.includes(block.type));
|
|
947
2223
|
return { id: "besttrack.branded", version: 1, name: "Branded", target: "web", source: "built-in", requiredBlocks: templateBlocks.map((block) => block.type), theme: { "color.primary": "#000000", "color.background": "#fffdf0", "color.surface": "#ffffff", "color.text": "#0a0a0a", "color.muted": "#6b6b6b", "color.border": "#e7e7e7", "font.family": "Arial, Helvetica, sans-serif", radius: "10px", spacing: "24px" }, create: () => createPageDocument2({ pageId: "besttrack-branded", target: "web", templateId: "besttrack.branded", templateVersion: 1, settings: { locale: "en", seoTitle: "Track your order" }, blocks: templateBlocks.map((block, index) => ({ id: "branded-" + (index + 1), type: block.type, version: block.version, props: block.defaultProps, variant: block.defaultVariant, style: {} })) }) };
|
|
948
2224
|
}
|
|
949
|
-
var bestTrackBrandedExtension = Object.freeze({ name: "besttrack.branded", version: "0.
|
|
2225
|
+
var bestTrackBrandedExtension = Object.freeze({ name: "besttrack.branded", version: "0.8.0", fields: [{ type: "besttrack.branded.text", component: BrandedTextField }], blocks: brandedBlocks, templates: [createBrandedTemplate()] });
|
|
950
2226
|
|
|
951
2227
|
// src/sales-definition.ts
|
|
952
2228
|
import { createPageDocument as createPageDocument3 } from "@standhigher/puck-page-builder/runtime";
|
|
953
2229
|
|
|
954
2230
|
// src/sales.tsx
|
|
955
|
-
import { createContext as createContext3, useCallback as useCallback3, useContext as useContext3,
|
|
956
|
-
import { Fragment as
|
|
2231
|
+
import { createContext as createContext3, useCallback as useCallback3, useContext as useContext3, useMemo as useMemo3, useRef as useRef4, useState as useState5 } from "react";
|
|
2232
|
+
import { Fragment as Fragment3, jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
957
2233
|
var initialRuntime3 = { phase: "idle", async query() {
|
|
958
2234
|
return void 0;
|
|
959
2235
|
} };
|
|
@@ -962,80 +2238,60 @@ var contentWidth3 = { boxSizing: "border-box", width: "min(1120px, calc(100% - 3
|
|
|
962
2238
|
var sectionStyle = { ...contentWidth3, marginTop: "clamp(32px, 6vw, 72px)", color: "var(--pb-color-text)", fontFamily: "var(--pb-font-family)" };
|
|
963
2239
|
var panelStyle = { boxSizing: "border-box", border: "1px solid var(--pb-color-border)", borderRadius: "var(--pb-radius)", padding: "clamp(20px, 3vw, 32px)", background: "var(--pb-color-surface)", color: "var(--pb-color-text)", overflowWrap: "anywhere" };
|
|
964
2240
|
var gridStyle = { display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(min(100%, 220px), 1fr))", gap: "clamp(16px, 2vw, 24px)" };
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
const
|
|
968
|
-
const
|
|
969
|
-
const query = useCallback3(async (trackingNumber) => {
|
|
2241
|
+
function SalesRuntimeProvider({ children, query: injectedQuery, watermark, resourceResolution }) {
|
|
2242
|
+
const [state, setState] = useState5({ phase: "idle" });
|
|
2243
|
+
const requestId = useRef4(0);
|
|
2244
|
+
const query = useCallback3(async (request) => {
|
|
970
2245
|
const currentRequestId = ++requestId.current;
|
|
971
2246
|
setState({ phase: "loading" });
|
|
972
2247
|
try {
|
|
973
|
-
|
|
2248
|
+
if (!injectedQuery) throw new Error("tracking-query-not-configured");
|
|
2249
|
+
const result = await injectedQuery(request);
|
|
974
2250
|
if (currentRequestId !== requestId.current) return;
|
|
975
2251
|
setState({ phase: isEmptyTrackingPageResult(result) ? "empty" : "success", result });
|
|
976
2252
|
} catch {
|
|
977
2253
|
if (currentRequestId !== requestId.current) return;
|
|
978
2254
|
setState({ phase: "error" });
|
|
979
2255
|
}
|
|
980
|
-
}, [
|
|
981
|
-
const value = useMemo3(() => ({ ...state, query }), [query, state]);
|
|
982
|
-
return /* @__PURE__ */
|
|
2256
|
+
}, [injectedQuery]);
|
|
2257
|
+
const value = useMemo3(() => ({ ...state, query, watermark, resourceResolution }), [query, resourceResolution, state, watermark]);
|
|
2258
|
+
return /* @__PURE__ */ jsx6(SalesRuntimeContext.Provider, { value, children });
|
|
983
2259
|
}
|
|
984
2260
|
function useSalesRuntime() {
|
|
985
2261
|
return useContext3(SalesRuntimeContext);
|
|
986
2262
|
}
|
|
2263
|
+
function RuntimeWatermark3({ watermark }) {
|
|
2264
|
+
return watermark?.visible ? /* @__PURE__ */ jsx6("small", { style: { display: "block", marginTop: 14, color: "var(--pb-color-muted)", fontSize: 11, textAlign: "right" }, children: watermark.label || "Powered by BestTrack" }) : null;
|
|
2265
|
+
}
|
|
987
2266
|
function text5(props, key, fallback) {
|
|
988
2267
|
const value = props[key];
|
|
989
2268
|
return typeof value === "string" && value.trim() ? value.trim() : fallback;
|
|
990
2269
|
}
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
}
|
|
994
|
-
function safeHref3(value) {
|
|
995
|
-
if (typeof value !== "string") return void 0;
|
|
996
|
-
if (value.startsWith("/") && !value.startsWith("//") && !value.startsWith("/\\") && !value.includes("\\") && !hasControlCharacter(value)) return value;
|
|
997
|
-
try {
|
|
998
|
-
const url = new URL(value);
|
|
999
|
-
return url.protocol === "https:" ? url.toString() : void 0;
|
|
1000
|
-
} catch {
|
|
1001
|
-
return void 0;
|
|
1002
|
-
}
|
|
1003
|
-
}
|
|
1004
|
-
function safeImageUrl3(value) {
|
|
1005
|
-
if (typeof value !== "string") return void 0;
|
|
1006
|
-
try {
|
|
1007
|
-
const url = new URL(value);
|
|
1008
|
-
return url.protocol === "https:" ? url.toString() : void 0;
|
|
1009
|
-
} catch {
|
|
1010
|
-
return void 0;
|
|
1011
|
-
}
|
|
1012
|
-
}
|
|
1013
|
-
function resourceState(value) {
|
|
1014
|
-
return typeof value !== "string" ? "invalid" : value.trim() ? "ready" : "empty";
|
|
1015
|
-
}
|
|
2270
|
+
var safeHref3 = safeTrackingPageUrl;
|
|
2271
|
+
var safeImageUrl3 = safeTrackingPageUrl;
|
|
1016
2272
|
function Status({ children, alert = false }) {
|
|
1017
|
-
return /* @__PURE__ */
|
|
2273
|
+
return /* @__PURE__ */ jsx6("p", { role: alert ? "alert" : "status", "aria-live": alert ? "assertive" : "polite", style: { margin: "16px 0 0", color: alert ? "#a61b1b" : "var(--pb-color-muted)" }, children });
|
|
1018
2274
|
}
|
|
1019
2275
|
function Section({ title, children, busy = false }) {
|
|
1020
|
-
return /* @__PURE__ */
|
|
1021
|
-
/* @__PURE__ */
|
|
2276
|
+
return /* @__PURE__ */ jsx6("section", { "aria-label": title, "aria-busy": busy || void 0, style: sectionStyle, children: /* @__PURE__ */ jsxs6("div", { style: panelStyle, children: [
|
|
2277
|
+
/* @__PURE__ */ jsx6("h2", { style: { margin: "0 0 20px", fontSize: "clamp(24px, 3vw, 34px)", lineHeight: 1.15 }, children: title }),
|
|
1022
2278
|
children
|
|
1023
2279
|
] }) });
|
|
1024
2280
|
}
|
|
1025
2281
|
function ProductImage3({ src, alt }) {
|
|
1026
|
-
const [failed, setFailed] =
|
|
2282
|
+
const [failed, setFailed] = useState5(false);
|
|
1027
2283
|
const safeSrc = safeImageUrl3(src);
|
|
1028
|
-
if (!safeSrc || failed) return /* @__PURE__ */
|
|
1029
|
-
return /* @__PURE__ */
|
|
2284
|
+
if (!safeSrc || failed) return /* @__PURE__ */ jsx6("span", { "aria-label": `${alt} image unavailable`, role: "img", style: { display: "grid", placeItems: "center", width: 76, height: 76, flex: "0 0 auto", border: "1px solid var(--pb-color-border)", borderRadius: "calc(var(--pb-radius) / 1.5)", background: "var(--pb-color-background)", color: "var(--pb-color-muted)", fontWeight: 700 }, children: alt.slice(0, 1).toUpperCase() });
|
|
2285
|
+
return /* @__PURE__ */ jsx6("img", { src: safeSrc, alt, onError: () => setFailed(true), style: { width: 76, height: 76, flex: "0 0 auto", borderRadius: "calc(var(--pb-radius) / 1.5)", objectFit: "cover", background: "var(--pb-color-background)" } });
|
|
1030
2286
|
}
|
|
1031
2287
|
function HeroAsset({ src }) {
|
|
1032
|
-
const [failed, setFailed] =
|
|
2288
|
+
const [failed, setFailed] = useState5(false);
|
|
1033
2289
|
const safeSrc = safeImageUrl3(src);
|
|
1034
2290
|
if (!safeSrc || failed) return null;
|
|
1035
|
-
return /* @__PURE__ */
|
|
2291
|
+
return /* @__PURE__ */ jsx6("img", { "data-sales-hero-image": true, src: safeSrc, alt: "", "aria-hidden": "true", onError: () => setFailed(true), style: { position: "absolute", inset: 0, width: "100%", height: "100%", objectFit: "cover", opacity: 0.62 } });
|
|
1036
2292
|
}
|
|
1037
2293
|
function SalesTextField({ value, onChange }) {
|
|
1038
|
-
return /* @__PURE__ */
|
|
2294
|
+
return /* @__PURE__ */ jsx6("input", { "aria-label": "Sales text", value: typeof value === "string" ? value : "", onChange: (event) => onChange(event.target.value) });
|
|
1039
2295
|
}
|
|
1040
2296
|
var editorSurfaceStyle = { boxSizing: "border-box", border: "1px solid #dfddd7", borderRadius: 10, padding: 24, background: "#ffffff", color: "#0a0a0a", fontFamily: "Arial, Helvetica, sans-serif" };
|
|
1041
2297
|
var editorCardStyle = { boxSizing: "border-box", padding: 18, border: "1px solid #dfddd7", borderRadius: 7, background: "#f7f5f0" };
|
|
@@ -1044,212 +2300,341 @@ function editorText(block, name, fallback) {
|
|
|
1044
2300
|
}
|
|
1045
2301
|
function SalesInlineText({ block, name, fallback, style }) {
|
|
1046
2302
|
const value = editorText(block, name, fallback);
|
|
1047
|
-
if (!block.selected) return /* @__PURE__ */
|
|
1048
|
-
return /* @__PURE__ */
|
|
2303
|
+
if (!block.selected) return /* @__PURE__ */ jsx6("span", { "data-sales-editor-field": name, style, children: value });
|
|
2304
|
+
return /* @__PURE__ */ jsx6("input", { "aria-label": `Canvas ${name}`, "data-sales-editor-field": name, value, onMouseDown: (event) => event.stopPropagation(), onClick: (event) => event.stopPropagation(), onChange: (event) => block.onPropsChange({ [name]: event.currentTarget.value }), style: {
|
|
2305
|
+
boxSizing: "border-box",
|
|
2306
|
+
width: "100%",
|
|
2307
|
+
/* border: "1px dashed currentColor", */
|
|
2308
|
+
border: "none",
|
|
2309
|
+
borderRadius: 3,
|
|
2310
|
+
padding: "2px 5px",
|
|
2311
|
+
background: "transparent",
|
|
2312
|
+
color: "inherit",
|
|
2313
|
+
font: "inherit",
|
|
2314
|
+
fontWeight: "inherit",
|
|
2315
|
+
lineHeight: "inherit",
|
|
2316
|
+
textAlign: "inherit",
|
|
2317
|
+
...style
|
|
2318
|
+
} });
|
|
1049
2319
|
}
|
|
1050
2320
|
function SalesEditorSurface({ block, children }) {
|
|
1051
|
-
return /* @__PURE__ */
|
|
2321
|
+
return /* @__PURE__ */ jsx6("section", { "aria-label": "Sales editor preview", style: { ...editorSurfaceStyle, outline: block.selected ? "2px solid #2563eb" : void 0, outlineOffset: -2 }, children });
|
|
1052
2322
|
}
|
|
1053
2323
|
function SalesAnnouncementEditor(block) {
|
|
1054
|
-
return /* @__PURE__ */
|
|
2324
|
+
return /* @__PURE__ */ jsx6("section", { "aria-label": "Sales announcement editor", style: { display: "grid", minHeight: 38, placeItems: "center", boxSizing: "border-box", padding: "10px 16px", borderBottom: "1px solid #dfddd7", background: "#f7f5f0", color: "#0a0a0a", fontFamily: "Arial, Helvetica, sans-serif", fontSize: 13, fontWeight: 700, textAlign: "center" }, children: /* @__PURE__ */ jsx6(SalesInlineText, { block, name: "message", fallback: "Free delivery on orders over $50" }) });
|
|
1055
2325
|
}
|
|
1056
2326
|
function SalesQueryEditor(block) {
|
|
1057
2327
|
const imageUrl = safeImageUrl3(block.heroImageUrl);
|
|
1058
2328
|
const trackingNumber = editorText(block, "defaultTrackingNumber", "BT-2048-DEMO");
|
|
1059
|
-
return /* @__PURE__ */
|
|
1060
|
-
imageUrl ? /* @__PURE__ */
|
|
1061
|
-
/* @__PURE__ */
|
|
1062
|
-
/* @__PURE__ */
|
|
1063
|
-
/* @__PURE__ */
|
|
1064
|
-
/* @__PURE__ */
|
|
1065
|
-
/* @__PURE__ */
|
|
1066
|
-
/* @__PURE__ */
|
|
2329
|
+
return /* @__PURE__ */ jsxs6("section", { "aria-label": "Sales Hero query editor", style: { position: "relative", display: "grid", minHeight: "clamp(460px, 52vw, 620px)", placeItems: "center", boxSizing: "border-box", overflow: "hidden", padding: "clamp(28px, 6vw, 72px) 16px", background: "#0a0a0a", fontFamily: "Arial, Helvetica, sans-serif" }, children: [
|
|
2330
|
+
imageUrl ? /* @__PURE__ */ jsx6("img", { src: imageUrl, alt: "", "aria-hidden": "true", style: { position: "absolute", inset: 0, width: "100%", height: "100%", objectFit: "cover", opacity: 0.62 } }) : null,
|
|
2331
|
+
/* @__PURE__ */ jsx6("div", { "aria-hidden": "true", style: { position: "absolute", inset: 0, background: "rgb(0 0 0 / 42%)" } }),
|
|
2332
|
+
/* @__PURE__ */ jsxs6("div", { style: { position: "relative", zIndex: 1, boxSizing: "border-box", width: "min(560px, 100%)", padding: "clamp(28px, 5vw, 48px)", borderRadius: 10, background: "#ffffff", color: "#0a0a0a", boxShadow: "0 20px 56px rgb(0 0 0 / 28%)" }, children: [
|
|
2333
|
+
/* @__PURE__ */ jsx6("h1", { style: { margin: "0 0 28px", fontSize: "clamp(32px, 5vw, 48px)", fontWeight: 800, letterSpacing: "-0.035em", lineHeight: 1.02, textAlign: "center" }, children: /* @__PURE__ */ jsx6(SalesInlineText, { block, name: "heading", fallback: "Track your order" }) }),
|
|
2334
|
+
/* @__PURE__ */ jsx6("input", { "aria-label": "Canvas default tracking number", readOnly: !block.selected, value: trackingNumber, onMouseDown: (event) => block.selected && event.stopPropagation(), onClick: (event) => block.selected && event.stopPropagation(), onChange: (event) => block.onPropsChange({ defaultTrackingNumber: event.currentTarget.value }), style: { boxSizing: "border-box", width: "100%", minHeight: 58, padding: "12px 16px", border: "1px solid #dfddd7", borderRadius: 8, background: "#ffffff", color: "#0a0a0a", font: "inherit", fontSize: 17 } }),
|
|
2335
|
+
/* @__PURE__ */ jsx6("div", { style: { display: "grid", minHeight: 58, placeItems: "center", marginTop: 14, padding: "12px 18px", borderRadius: 8, background: "#0a0a0a", color: "#ffffff", fontSize: 16, fontWeight: 700 }, children: /* @__PURE__ */ jsx6(SalesInlineText, { block, name: "submitLabel", fallback: "Track order" }) }),
|
|
2336
|
+
/* @__PURE__ */ jsx6("small", { style: { display: "block", marginTop: 14, color: "#6b6b6b", fontSize: 11, textAlign: "right" }, children: "Powered by BestTrack" })
|
|
1067
2337
|
] })
|
|
1068
2338
|
] });
|
|
1069
2339
|
}
|
|
1070
2340
|
function SalesOrderItemsEditor(block) {
|
|
1071
|
-
return /* @__PURE__ */
|
|
1072
|
-
/* @__PURE__ */
|
|
1073
|
-
/* @__PURE__ */
|
|
1074
|
-
/* @__PURE__ */
|
|
1075
|
-
/* @__PURE__ */
|
|
1076
|
-
/* @__PURE__ */
|
|
1077
|
-
/* @__PURE__ */
|
|
1078
|
-
/* @__PURE__ */
|
|
2341
|
+
return /* @__PURE__ */ jsxs6(SalesEditorSurface, { block, children: [
|
|
2342
|
+
/* @__PURE__ */ jsx6("h2", { style: { margin: "0 0 20px" }, children: /* @__PURE__ */ jsx6(SalesInlineText, { block, name: "heading", fallback: "Items in your order" }) }),
|
|
2343
|
+
/* @__PURE__ */ jsxs6("article", { style: { ...editorCardStyle, display: "flex", alignItems: "center", gap: 14 }, children: [
|
|
2344
|
+
/* @__PURE__ */ jsx6("span", { "aria-hidden": "true", style: { width: 68, height: 68, borderRadius: 7, background: "#dfddd7" } }),
|
|
2345
|
+
/* @__PURE__ */ jsxs6("span", { children: [
|
|
2346
|
+
/* @__PURE__ */ jsx6("strong", { children: "Order item" }),
|
|
2347
|
+
/* @__PURE__ */ jsx6("br", {}),
|
|
2348
|
+
/* @__PURE__ */ jsx6("small", { style: { color: "#6b6b6b" }, children: "Items appear after a successful tracking query." })
|
|
1079
2349
|
] })
|
|
1080
2350
|
] })
|
|
1081
2351
|
] });
|
|
1082
2352
|
}
|
|
1083
2353
|
function SalesOtherTrackingEditor(block) {
|
|
1084
|
-
return /* @__PURE__ */
|
|
1085
|
-
/* @__PURE__ */
|
|
1086
|
-
/* @__PURE__ */
|
|
2354
|
+
return /* @__PURE__ */ jsxs6(SalesEditorSurface, { block, children: [
|
|
2355
|
+
/* @__PURE__ */ jsx6("h2", { style: { margin: "0 0 20px" }, children: /* @__PURE__ */ jsx6(SalesInlineText, { block, name: "heading", fallback: "Other shipments" }) }),
|
|
2356
|
+
/* @__PURE__ */ jsx6("p", { style: { margin: 0, color: "#6b6b6b" }, children: /* @__PURE__ */ jsx6(SalesInlineText, { block, name: "emptyMessage", fallback: "No other shipments are linked to this order." }) })
|
|
1087
2357
|
] });
|
|
1088
2358
|
}
|
|
1089
2359
|
function SalesServiceCardsEditor(block) {
|
|
1090
|
-
return /* @__PURE__ */
|
|
1091
|
-
/* @__PURE__ */
|
|
1092
|
-
/* @__PURE__ */
|
|
1093
|
-
/* @__PURE__ */
|
|
1094
|
-
/* @__PURE__ */
|
|
1095
|
-
/* @__PURE__ */
|
|
2360
|
+
return /* @__PURE__ */ jsxs6(SalesEditorSurface, { block, children: [
|
|
2361
|
+
/* @__PURE__ */ jsx6("h2", { style: { margin: "0 0 20px" }, children: /* @__PURE__ */ jsx6(SalesInlineText, { block, name: "heading", fallback: "Shop with confidence" }) }),
|
|
2362
|
+
/* @__PURE__ */ jsxs6("div", { style: { display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(min(100%, 180px), 1fr))", gap: 14 }, children: [
|
|
2363
|
+
/* @__PURE__ */ jsxs6("article", { style: editorCardStyle, children: [
|
|
2364
|
+
/* @__PURE__ */ jsx6("strong", { children: /* @__PURE__ */ jsx6(SalesInlineText, { block, name: "firstTitle", fallback: "Easy returns" }) }),
|
|
2365
|
+
/* @__PURE__ */ jsx6("p", { style: { marginBottom: 0, color: "#6b6b6b" }, children: /* @__PURE__ */ jsx6(SalesInlineText, { block, name: "firstDescription", fallback: "Simple support when plans change." }) })
|
|
1096
2366
|
] }),
|
|
1097
|
-
/* @__PURE__ */
|
|
1098
|
-
/* @__PURE__ */
|
|
1099
|
-
/* @__PURE__ */
|
|
2367
|
+
/* @__PURE__ */ jsxs6("article", { style: editorCardStyle, children: [
|
|
2368
|
+
/* @__PURE__ */ jsx6("strong", { children: /* @__PURE__ */ jsx6(SalesInlineText, { block, name: "secondTitle", fallback: "Secure delivery" }) }),
|
|
2369
|
+
/* @__PURE__ */ jsx6("p", { style: { marginBottom: 0, color: "#6b6b6b" }, children: /* @__PURE__ */ jsx6(SalesInlineText, { block, name: "secondDescription", fallback: "Follow every milestone in one place." }) })
|
|
1100
2370
|
] })
|
|
1101
2371
|
] })
|
|
1102
2372
|
] });
|
|
1103
2373
|
}
|
|
1104
2374
|
function SalesProductCategoriesEditor(block) {
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
/* @__PURE__ */
|
|
1108
|
-
|
|
1109
|
-
/* @__PURE__ */
|
|
2375
|
+
const collection = isShopifyResourceReference(block.collection, "collection") ? block.collection : void 0;
|
|
2376
|
+
return /* @__PURE__ */ jsxs6(SalesEditorSurface, { block, children: [
|
|
2377
|
+
/* @__PURE__ */ jsx6("h2", { style: { margin: "0 0 20px" }, children: /* @__PURE__ */ jsx6(SalesInlineText, { block, name: "heading", fallback: "Shop by category" }) }),
|
|
2378
|
+
/* @__PURE__ */ jsxs6("div", { style: { ...editorCardStyle, display: "flex", justifyContent: "space-between", fontWeight: 700 }, children: [
|
|
2379
|
+
/* @__PURE__ */ jsx6("span", { children: collection?.title ?? "Choose a collection in the inspector" }),
|
|
2380
|
+
/* @__PURE__ */ jsx6("span", { "aria-hidden": "true", children: "\u2192" })
|
|
1110
2381
|
] })
|
|
1111
2382
|
] });
|
|
1112
2383
|
}
|
|
2384
|
+
function SalesFeaturedProductEditor(block) {
|
|
2385
|
+
const product = isShopifyResourceReference(block.product, "product") ? block.product : void 0;
|
|
2386
|
+
return /* @__PURE__ */ jsxs6(SalesEditorSurface, { block, children: [
|
|
2387
|
+
/* @__PURE__ */ jsx6("h2", { style: { margin: "0 0 20px" }, children: /* @__PURE__ */ jsx6(SalesInlineText, { block, name: "heading", fallback: "Featured product" }) }),
|
|
2388
|
+
/* @__PURE__ */ jsxs6("div", { style: { ...editorCardStyle, display: "flex", justifyContent: "space-between", fontWeight: 700 }, children: [
|
|
2389
|
+
/* @__PURE__ */ jsx6("span", { children: product?.title ?? "Choose a product in the inspector" }),
|
|
2390
|
+
/* @__PURE__ */ jsx6("span", { "aria-hidden": "true", children: "\u2192" })
|
|
2391
|
+
] }),
|
|
2392
|
+
/* @__PURE__ */ jsx6("small", { style: { display: "block", marginTop: 10, color: "#6b6b6b" }, children: "Availability is supplied by the authorized runtime." })
|
|
2393
|
+
] });
|
|
2394
|
+
}
|
|
1113
2395
|
function SalesRecommendationsEditor(block) {
|
|
1114
|
-
return /* @__PURE__ */
|
|
1115
|
-
/* @__PURE__ */
|
|
1116
|
-
/* @__PURE__ */
|
|
2396
|
+
return /* @__PURE__ */ jsxs6(SalesEditorSurface, { block, children: [
|
|
2397
|
+
/* @__PURE__ */ jsx6("h2", { style: { margin: "0 0 20px" }, children: /* @__PURE__ */ jsx6(SalesInlineText, { block, name: "heading", fallback: "Complete your order" }) }),
|
|
2398
|
+
/* @__PURE__ */ jsx6("div", { style: { ...editorCardStyle, color: "#6b6b6b" }, children: "Recommended products appear after a successful tracking query." })
|
|
1117
2399
|
] });
|
|
1118
2400
|
}
|
|
1119
2401
|
function SalesAnnouncementBlock(props) {
|
|
1120
|
-
return /* @__PURE__ */
|
|
2402
|
+
return /* @__PURE__ */ jsx6("section", { "aria-label": "Sales announcement", "data-sales-announcement": true, style: { display: "grid", minHeight: 38, placeItems: "center", boxSizing: "border-box", padding: "10px 16px", borderBottom: "1px solid var(--pb-color-border)", background: "var(--pb-color-background)", color: "var(--pb-color-text)", fontFamily: "var(--pb-font-family)", fontSize: 13, textAlign: "center" }, children: /* @__PURE__ */ jsx6("strong", { children: text5(props, "message", "Free delivery on orders over $50") }) });
|
|
1121
2403
|
}
|
|
1122
2404
|
function SalesQueryBlock(props) {
|
|
1123
2405
|
const runtime = useSalesRuntime();
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
] })
|
|
2406
|
+
return /* @__PURE__ */ jsxs6("section", { "aria-label": "Sales tracking query", "aria-busy": runtime.phase === "loading" || void 0, "data-sales-hero": true, style: { position: "relative", display: "grid", minHeight: "clamp(460px, 52vw, 620px)", boxSizing: "border-box", overflow: "hidden", padding: "clamp(28px, 6vw, 72px) 16px", background: "var(--pb-color-text)", color: "var(--pb-color-surface)", fontFamily: "var(--pb-font-family)" }, children: [
|
|
2407
|
+
/* @__PURE__ */ jsx6(HeroAsset, { src: props.heroImageUrl }),
|
|
2408
|
+
/* @__PURE__ */ jsx6("div", { "aria-hidden": "true", style: { position: "absolute", inset: 0, background: "rgb(0 0 0 / 42%)" } }),
|
|
2409
|
+
/* @__PURE__ */ jsx6("div", { style: { ...contentWidth3, position: "relative", zIndex: 1, display: "grid", alignItems: "center", width: "100%", minWidth: 0 }, children: /* @__PURE__ */ jsx6(
|
|
2410
|
+
TrackingQueryCard,
|
|
2411
|
+
{
|
|
2412
|
+
phase: runtime.phase,
|
|
2413
|
+
onQuery: runtime.query,
|
|
2414
|
+
heading: text5(props, "heading", "Track an order"),
|
|
2415
|
+
submitLabel: text5(props, "submitLabel", "Track order"),
|
|
2416
|
+
initialTrackingNumber: text5(props, "defaultTrackingNumber", "BT-2048-DEMO"),
|
|
2417
|
+
initialOrderNumber: text5(props, "defaultOrderNumber", ""),
|
|
2418
|
+
loadingLabel: "Checking...",
|
|
2419
|
+
loadingMessage: "Checking your order\u2026",
|
|
2420
|
+
emptyMessage: "We couldn\u2019t find an order for that number.",
|
|
2421
|
+
errorMessage: "We couldn\u2019t retrieve this order right now. Please try again later.",
|
|
2422
|
+
trackingInputLabel: "Sales tracking number",
|
|
2423
|
+
orderInputLabel: "Sales order number",
|
|
2424
|
+
emailInputLabel: "Sales order email",
|
|
2425
|
+
cardDataAttribute: "data-sales-query-card",
|
|
2426
|
+
resultDataAttribute: "data-sales-query-result",
|
|
2427
|
+
resultTestId: "sales-result",
|
|
2428
|
+
cardStyle: { boxSizing: "border-box", width: "min(560px, 100%)", maxHeight: "min(560px, calc(100dvh - 32px))", marginLeft: "auto", padding: "clamp(28px, 5vw, 48px)", borderRadius: "var(--pb-radius)", background: "var(--pb-color-surface)", color: "var(--pb-color-text)", boxShadow: "0 20px 56px rgb(0 0 0 / 28%)" },
|
|
2429
|
+
headingStyle: { color: "var(--pb-color-text)", fontSize: "clamp(32px, 5vw, 48px)", fontWeight: 800, letterSpacing: "-0.035em", lineHeight: 1.02 },
|
|
2430
|
+
tabListStyle: { borderBottomColor: "var(--pb-color-border)" },
|
|
2431
|
+
formStyle: { gap: 14 },
|
|
2432
|
+
inputStyle: { boxSizing: "border-box", width: "100%", minHeight: 58, padding: "12px 16px", border: "1px solid var(--pb-color-border)", borderRadius: "calc(var(--pb-radius) / 1.25)", background: "var(--pb-color-surface)", color: "var(--pb-color-text)", font: "inherit", fontSize: 17 },
|
|
2433
|
+
submitStyle: (loading) => ({ width: "100%", minHeight: 58, padding: "12px 18px", border: 0, borderRadius: "calc(var(--pb-radius) / 1.25)", background: loading ? "#64748b" : "var(--pb-color-text)", color: "var(--pb-color-surface)", font: "inherit", fontSize: 16, fontWeight: 700, cursor: loading ? "wait" : "pointer" }),
|
|
2434
|
+
result: runtime.result ? /* @__PURE__ */ jsx6(TrackingQueryResultDetails, { result: runtime.result }) : null,
|
|
2435
|
+
resultStyle: { padding: 16, border: "1px solid var(--pb-color-border)", borderRadius: "calc(var(--pb-radius) / 1.25)", background: "var(--pb-color-background)" },
|
|
2436
|
+
watermark: /* @__PURE__ */ jsx6(RuntimeWatermark3, { watermark: runtime.watermark })
|
|
2437
|
+
}
|
|
2438
|
+
) })
|
|
1158
2439
|
] });
|
|
1159
2440
|
}
|
|
1160
2441
|
function SalesOrderItemsBlock(props) {
|
|
1161
2442
|
const runtime = useSalesRuntime();
|
|
1162
2443
|
const title = text5(props, "heading", "Items in your order");
|
|
1163
2444
|
const items = runtime.result?.orderItems ?? [];
|
|
1164
|
-
return /* @__PURE__ */
|
|
2445
|
+
return /* @__PURE__ */ jsx6(Section, { title, busy: runtime.phase === "loading", children: runtime.phase === "error" ? /* @__PURE__ */ jsx6(Status, { alert: true, children: "Order items are temporarily unavailable." }) : runtime.phase === "empty" ? /* @__PURE__ */ jsx6(Status, { children: "No order items are available for that number." }) : runtime.phase === "success" && items.length ? /* @__PURE__ */ jsx6("ul", { style: { display: "grid", gap: 12, margin: 0, padding: 0, listStyle: "none" }, children: items.map((item) => {
|
|
1165
2446
|
const href = safeHref3(item.href);
|
|
1166
2447
|
const itemTitle = text5(item, "title", "Order item");
|
|
1167
|
-
const itemContent = href ? /* @__PURE__ */
|
|
1168
|
-
return /* @__PURE__ */
|
|
1169
|
-
/* @__PURE__ */
|
|
1170
|
-
/* @__PURE__ */
|
|
1171
|
-
/* @__PURE__ */
|
|
1172
|
-
/* @__PURE__ */
|
|
1173
|
-
/* @__PURE__ */
|
|
2448
|
+
const itemContent = href ? /* @__PURE__ */ jsx6("a", { href, style: { color: "inherit" }, children: itemTitle }) : itemTitle;
|
|
2449
|
+
return /* @__PURE__ */ jsxs6("li", { style: { display: "flex", alignItems: "center", gap: 16, minWidth: 0, padding: 14, border: "1px solid var(--pb-color-border)", borderRadius: "calc(var(--pb-radius) / 1.5)", background: "var(--pb-color-background)" }, children: [
|
|
2450
|
+
/* @__PURE__ */ jsx6(ProductImage3, { src: item.imageUrl, alt: itemTitle }),
|
|
2451
|
+
/* @__PURE__ */ jsxs6("span", { style: { minWidth: 0 }, children: [
|
|
2452
|
+
/* @__PURE__ */ jsx6("strong", { children: itemContent }),
|
|
2453
|
+
/* @__PURE__ */ jsx6("br", {}),
|
|
2454
|
+
/* @__PURE__ */ jsxs6("small", { style: { color: "var(--pb-color-muted)" }, children: [
|
|
1174
2455
|
"Qty ",
|
|
1175
2456
|
Number.isFinite(item.quantity) && item.quantity > 0 ? item.quantity : 1
|
|
1176
2457
|
] }),
|
|
1177
|
-
item.description ? /* @__PURE__ */
|
|
1178
|
-
/* @__PURE__ */
|
|
1179
|
-
/* @__PURE__ */
|
|
2458
|
+
item.description ? /* @__PURE__ */ jsxs6(Fragment3, { children: [
|
|
2459
|
+
/* @__PURE__ */ jsx6("br", {}),
|
|
2460
|
+
/* @__PURE__ */ jsx6("small", { style: { color: "var(--pb-color-muted)" }, children: item.description })
|
|
1180
2461
|
] }) : null
|
|
1181
2462
|
] })
|
|
1182
2463
|
] }, item.id);
|
|
1183
|
-
}) }) : /* @__PURE__ */
|
|
2464
|
+
}) }) : /* @__PURE__ */ jsx6(Status, { children: runtime.phase === "loading" ? "Loading order items\u2026" : "Order items appear after a successful query." }) });
|
|
1184
2465
|
}
|
|
1185
2466
|
function SalesOtherTrackingBlock(props) {
|
|
1186
2467
|
const runtime = useSalesRuntime();
|
|
1187
2468
|
const title = text5(props, "heading", "Other shipments");
|
|
1188
2469
|
const shipments = (runtime.result?.shipments ?? []).filter((shipment) => shipment.trackingNumber !== runtime.result?.trackingNumber);
|
|
1189
|
-
return /* @__PURE__ */
|
|
1190
|
-
/* @__PURE__ */
|
|
1191
|
-
shipment.status ? /* @__PURE__ */
|
|
1192
|
-
shipment.trackingNumber ? /* @__PURE__ */
|
|
1193
|
-
] }, shipment.id)) }) : runtime.phase === "success" ? /* @__PURE__ */
|
|
2470
|
+
return /* @__PURE__ */ jsx6(Section, { title, busy: runtime.phase === "loading", children: runtime.phase === "error" ? /* @__PURE__ */ jsx6(Status, { alert: true, children: "Additional shipments are unavailable." }) : runtime.phase === "empty" ? /* @__PURE__ */ jsx6(Status, { children: "No additional shipments are available for that number." }) : runtime.phase === "success" && shipments.length ? /* @__PURE__ */ jsx6("ul", { style: { display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(min(100%, 220px), 1fr))", gap: 12, margin: 0, padding: 0, listStyle: "none" }, children: shipments.map((shipment) => /* @__PURE__ */ jsxs6("li", { style: { padding: 16, border: "1px solid var(--pb-color-border)", borderRadius: "calc(var(--pb-radius) / 1.5)", background: "var(--pb-color-background)" }, children: [
|
|
2471
|
+
/* @__PURE__ */ jsx6("strong", { children: text5(shipment, "label", "Shipment") }),
|
|
2472
|
+
shipment.status ? /* @__PURE__ */ jsx6("p", { style: { margin: "8px 0 0", color: "var(--pb-color-muted)" }, children: shipment.status }) : null,
|
|
2473
|
+
shipment.trackingNumber ? /* @__PURE__ */ jsx6("small", { style: { display: "block", marginTop: 8, color: "var(--pb-color-muted)" }, children: shipment.trackingNumber }) : null
|
|
2474
|
+
] }, shipment.id)) }) : runtime.phase === "success" ? /* @__PURE__ */ jsx6(Status, { children: text5(props, "emptyMessage", "No other shipments are linked to this order.") }) : /* @__PURE__ */ jsx6(Status, { children: runtime.phase === "loading" ? "Loading other shipments\u2026" : "Other tracking numbers appear with your order result." }) });
|
|
1194
2475
|
}
|
|
1195
2476
|
function SalesServiceCardsBlock(props) {
|
|
1196
2477
|
const title = text5(props, "heading", "Shop with confidence");
|
|
1197
|
-
return /* @__PURE__ */
|
|
1198
|
-
/* @__PURE__ */
|
|
1199
|
-
/* @__PURE__ */
|
|
1200
|
-
/* @__PURE__ */
|
|
2478
|
+
return /* @__PURE__ */ jsx6(Section, { title, children: /* @__PURE__ */ jsxs6("div", { style: gridStyle, children: [
|
|
2479
|
+
/* @__PURE__ */ jsxs6("article", { style: { padding: 20, border: "1px solid var(--pb-color-border)", borderRadius: "calc(var(--pb-radius) / 1.5)", background: "var(--pb-color-background)" }, children: [
|
|
2480
|
+
/* @__PURE__ */ jsx6("strong", { children: text5(props, "firstTitle", "Easy returns") }),
|
|
2481
|
+
/* @__PURE__ */ jsx6("p", { style: { marginBottom: 0, color: "var(--pb-color-muted)" }, children: text5(props, "firstDescription", "Simple support when plans change.") })
|
|
1201
2482
|
] }),
|
|
1202
|
-
/* @__PURE__ */
|
|
1203
|
-
/* @__PURE__ */
|
|
1204
|
-
/* @__PURE__ */
|
|
2483
|
+
/* @__PURE__ */ jsxs6("article", { style: { padding: 20, border: "1px solid var(--pb-color-border)", borderRadius: "calc(var(--pb-radius) / 1.5)", background: "var(--pb-color-background)" }, children: [
|
|
2484
|
+
/* @__PURE__ */ jsx6("strong", { children: text5(props, "secondTitle", "Secure delivery") }),
|
|
2485
|
+
/* @__PURE__ */ jsx6("p", { style: { marginBottom: 0, color: "var(--pb-color-muted)" }, children: text5(props, "secondDescription", "Follow every milestone in one place.") })
|
|
1205
2486
|
] })
|
|
1206
2487
|
] }) });
|
|
1207
2488
|
}
|
|
1208
2489
|
function SalesProductCategoriesBlock(props) {
|
|
1209
2490
|
const title = text5(props, "heading", "Shop by category");
|
|
1210
|
-
const
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
2491
|
+
const runtime = useSalesRuntime();
|
|
2492
|
+
if (props.collection !== void 0 && props.collection !== null && !isShopifyResourceReference(props.collection, "collection")) return /* @__PURE__ */ jsx6(Section, { title, children: /* @__PURE__ */ jsx6(Status, { alert: true, children: "Collection reference is invalid." }) });
|
|
2493
|
+
const collection = isShopifyResourceReference(props.collection, "collection") ? props.collection : void 0;
|
|
2494
|
+
if (!collection) return /* @__PURE__ */ jsx6(Section, { title, children: /* @__PURE__ */ jsx6(Status, { children: "No collection selected. Choose a collection through an authorized resource integration." }) });
|
|
2495
|
+
const resolved = getResolvedShopifyResource(collection, runtime.resourceResolution);
|
|
2496
|
+
const error = getShopifyResourceResolutionError(collection, runtime.resourceResolution);
|
|
2497
|
+
if (error) return /* @__PURE__ */ jsx6(Section, { title, children: /* @__PURE__ */ jsx6(Status, { alert: true, children: error.code === "missing" ? "This collection is no longer available." : "Collection details are temporarily unavailable." }) });
|
|
2498
|
+
if (!resolved) return /* @__PURE__ */ jsx6(Section, { title, children: /* @__PURE__ */ jsx6(Status, { children: "Collection details are resolved by the authorized runtime." }) });
|
|
2499
|
+
const content = /* @__PURE__ */ jsxs6(Fragment3, { children: [
|
|
2500
|
+
/* @__PURE__ */ jsx6("span", { children: resolved.title }),
|
|
2501
|
+
/* @__PURE__ */ jsx6("span", { "aria-hidden": "true", children: "\u2192" })
|
|
2502
|
+
] });
|
|
2503
|
+
const style = { display: "flex", minHeight: 72, alignItems: "center", justifyContent: "space-between", gap: 16, padding: 18, border: "1px solid var(--pb-color-border)", borderRadius: "calc(var(--pb-radius) / 1.5)", background: "var(--pb-color-background)", color: "inherit", fontWeight: 700, textDecoration: "none" };
|
|
2504
|
+
return /* @__PURE__ */ jsx6(Section, { title, children: resolved.href ? /* @__PURE__ */ jsx6("a", { href: resolved.href, style, children: content }) : /* @__PURE__ */ jsx6("div", { style, children: content }) });
|
|
2505
|
+
}
|
|
2506
|
+
function SalesFeaturedProductBlock(props) {
|
|
2507
|
+
const runtime = useSalesRuntime();
|
|
2508
|
+
const title = text5(props, "heading", "Featured product");
|
|
2509
|
+
if (props.product !== void 0 && props.product !== null && !isShopifyResourceReference(props.product, "product")) return /* @__PURE__ */ jsx6(Section, { title, children: /* @__PURE__ */ jsx6(Status, { alert: true, children: "Product reference is invalid." }) });
|
|
2510
|
+
const product = isShopifyResourceReference(props.product, "product") ? props.product : void 0;
|
|
2511
|
+
if (!product) return /* @__PURE__ */ jsx6(Section, { title, children: /* @__PURE__ */ jsx6(Status, { children: "No product selected. Choose a product through an authorized resource integration." }) });
|
|
2512
|
+
const resolved = getResolvedShopifyResource(product, runtime.resourceResolution);
|
|
2513
|
+
const error = getShopifyResourceResolutionError(product, runtime.resourceResolution);
|
|
2514
|
+
if (error) return /* @__PURE__ */ jsx6(Section, { title, children: /* @__PURE__ */ jsx6(Status, { alert: true, children: error.code === "missing" ? "This product is no longer available." : "Product details are temporarily unavailable." }) });
|
|
2515
|
+
if (!resolved) return /* @__PURE__ */ jsx6(Section, { title, children: /* @__PURE__ */ jsx6(Status, { children: "Product details and availability are resolved by the authorized runtime." }) });
|
|
2516
|
+
const available = resolved.availability === "available";
|
|
2517
|
+
const body = /* @__PURE__ */ jsxs6(Fragment3, { children: [
|
|
2518
|
+
/* @__PURE__ */ jsx6(ProductImage3, { src: resolved.imageUrl, alt: resolved.title }),
|
|
2519
|
+
/* @__PURE__ */ jsxs6("span", { style: { minWidth: 0, flex: 1 }, children: [
|
|
2520
|
+
/* @__PURE__ */ jsx6("strong", { children: resolved.title }),
|
|
2521
|
+
/* @__PURE__ */ jsx6("br", {}),
|
|
2522
|
+
/* @__PURE__ */ jsx6("small", { style: { color: "var(--pb-color-muted)" }, children: available ? "Available" : resolved.availability === "sold-out" ? "Sold out" : "Unavailable" })
|
|
2523
|
+
] })
|
|
2524
|
+
] });
|
|
2525
|
+
const style = { display: "flex", alignItems: "center", gap: 16, padding: 14, border: "1px solid var(--pb-color-border)", borderRadius: "calc(var(--pb-radius) / 1.5)", background: "var(--pb-color-background)", color: "inherit", textDecoration: "none" };
|
|
2526
|
+
return /* @__PURE__ */ jsx6(Section, { title, children: available && resolved.href ? /* @__PURE__ */ jsx6("a", { href: resolved.href, style, children: body }) : /* @__PURE__ */ jsx6("div", { style, children: body }) });
|
|
1216
2527
|
}
|
|
1217
2528
|
function SalesRecommendationsBlock(props) {
|
|
1218
2529
|
const runtime = useSalesRuntime();
|
|
1219
2530
|
const title = text5(props, "heading", "Complete your order");
|
|
1220
2531
|
const recommendations = runtime.result?.recommendations ?? [];
|
|
1221
|
-
return /* @__PURE__ */
|
|
2532
|
+
return /* @__PURE__ */ jsx6(Section, { title, busy: runtime.phase === "loading", children: runtime.phase === "error" ? /* @__PURE__ */ jsx6(Status, { alert: true, children: "Recommendations are temporarily unavailable." }) : runtime.phase === "empty" ? /* @__PURE__ */ jsx6(Status, { children: "No recommendations are available for that number." }) : runtime.phase === "success" && recommendations.length ? /* @__PURE__ */ jsx6("div", { style: gridStyle, children: recommendations.map((item) => {
|
|
1222
2533
|
const href = safeHref3(item.href);
|
|
1223
2534
|
const itemTitle = text5(item, "title", "Recommended product");
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
/* @__PURE__ */
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
2535
|
+
const price = item.price ? formatTrackingPageMoney(item.price) : void 0;
|
|
2536
|
+
return /* @__PURE__ */ jsxs6("article", { style: { display: "grid", gap: 14, minWidth: 0, padding: 18, border: "1px solid var(--pb-color-border)", borderRadius: "calc(var(--pb-radius) / 1.5)", background: "var(--pb-color-background)" }, children: [
|
|
2537
|
+
/* @__PURE__ */ jsx6(ProductImage3, { src: item.imageUrl, alt: itemTitle }),
|
|
2538
|
+
/* @__PURE__ */ jsxs6("div", { children: [
|
|
2539
|
+
/* @__PURE__ */ jsx6("strong", { children: href ? /* @__PURE__ */ jsx6("a", { href, style: { color: "inherit" }, children: itemTitle }) : itemTitle }),
|
|
2540
|
+
price?.amount ? /* @__PURE__ */ jsx6("small", { style: { display: "block", marginTop: 5, color: "var(--pb-color-muted)" }, children: price.amount }) : null,
|
|
2541
|
+
item.description ? /* @__PURE__ */ jsx6("p", { style: { marginBottom: 0, color: "var(--pb-color-muted)" }, children: item.description }) : null
|
|
1230
2542
|
] })
|
|
1231
2543
|
] }, item.id);
|
|
1232
|
-
}) }) : /* @__PURE__ */
|
|
2544
|
+
}) }) : /* @__PURE__ */ jsx6(Status, { children: runtime.phase === "success" ? "No recommendations are available for this order." : runtime.phase === "loading" ? "Loading recommendations\u2026" : "Recommended products appear with your order result." }) });
|
|
2545
|
+
}
|
|
2546
|
+
|
|
2547
|
+
// src/shopify-resources.tsx
|
|
2548
|
+
import { createContext as createContext4, useCallback as useCallback4, useContext as useContext4, useState as useState6 } from "react";
|
|
2549
|
+
import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
2550
|
+
var ShopifyResourceBrowserContext = createContext4(void 0);
|
|
2551
|
+
function ShopifyResourcePickerProvider({ browser, children }) {
|
|
2552
|
+
return /* @__PURE__ */ jsx7(ShopifyResourceBrowserContext.Provider, { value: browser, children });
|
|
2553
|
+
}
|
|
2554
|
+
var pickerSurface = { marginTop: 8, padding: 12, border: "1px solid #c9cccf", borderRadius: 8, background: "#fff", color: "#202223" };
|
|
2555
|
+
var pickerButton = { minHeight: 32, padding: "6px 10px", border: "1px solid #8c9196", borderRadius: 6, background: "#fff", color: "#202223", font: "inherit", cursor: "pointer" };
|
|
2556
|
+
function ResourceField({ value, onChange, kind }) {
|
|
2557
|
+
const browser = useContext4(ShopifyResourceBrowserContext);
|
|
2558
|
+
const selected = isShopifyResourceReference(value, kind) ? value : void 0;
|
|
2559
|
+
const [open, setOpen] = useState6(false);
|
|
2560
|
+
const [query, setQuery] = useState6("");
|
|
2561
|
+
const [items, setItems] = useState6([]);
|
|
2562
|
+
const [cursor, setCursor] = useState6();
|
|
2563
|
+
const [state, setState] = useState6("idle");
|
|
2564
|
+
const search = useCallback4(async (nextQuery, nextCursor, append = false) => {
|
|
2565
|
+
if (!browser) return;
|
|
2566
|
+
setState("loading");
|
|
2567
|
+
try {
|
|
2568
|
+
const page = await browser.search({ kinds: [kind], query: nextQuery.trim(), ...nextCursor ? { cursor: nextCursor } : {}, limit: 20 });
|
|
2569
|
+
const validItems = page.items.filter((item) => isShopifyResourceReference(item, kind));
|
|
2570
|
+
setItems((current) => append ? [...current, ...validItems.filter((item) => !current.some((existing) => existing.id === item.id))] : validItems);
|
|
2571
|
+
setCursor(page.nextCursor);
|
|
2572
|
+
setState("idle");
|
|
2573
|
+
} catch {
|
|
2574
|
+
setState("error");
|
|
2575
|
+
}
|
|
2576
|
+
}, [browser, kind]);
|
|
2577
|
+
const name = kind === "product" ? "product" : "collection";
|
|
2578
|
+
return /* @__PURE__ */ jsxs7("div", { "data-shopify-resource-field": kind, children: [
|
|
2579
|
+
selected ? /* @__PURE__ */ jsxs7("p", { style: { margin: "0 0 8px" }, children: [
|
|
2580
|
+
/* @__PURE__ */ jsx7("strong", { children: selected.title }),
|
|
2581
|
+
/* @__PURE__ */ jsx7("br", {}),
|
|
2582
|
+
/* @__PURE__ */ jsx7("small", { children: selected.id })
|
|
2583
|
+
] }) : /* @__PURE__ */ jsxs7("p", { style: { margin: "0 0 8px" }, children: [
|
|
2584
|
+
"No ",
|
|
2585
|
+
name,
|
|
2586
|
+
" selected."
|
|
2587
|
+
] }),
|
|
2588
|
+
/* @__PURE__ */ jsx7("button", { type: "button", style: pickerButton, onClick: () => {
|
|
2589
|
+
if (open) {
|
|
2590
|
+
setOpen(false);
|
|
2591
|
+
return;
|
|
2592
|
+
}
|
|
2593
|
+
setOpen(true);
|
|
2594
|
+
if (browser) void search("");
|
|
2595
|
+
else setState("error");
|
|
2596
|
+
}, children: open ? "Close selector" : `Select ${name}` }),
|
|
2597
|
+
open ? /* @__PURE__ */ jsxs7("div", { role: "dialog", "aria-label": `Select Shopify ${name}`, style: pickerSurface, children: [
|
|
2598
|
+
/* @__PURE__ */ jsxs7("form", { onSubmit: (event) => {
|
|
2599
|
+
event.preventDefault();
|
|
2600
|
+
void search(query);
|
|
2601
|
+
}, children: [
|
|
2602
|
+
/* @__PURE__ */ jsxs7("label", { style: { display: "block" }, children: [
|
|
2603
|
+
"Search ",
|
|
2604
|
+
name,
|
|
2605
|
+
"s",
|
|
2606
|
+
/* @__PURE__ */ jsx7("input", { "aria-label": `Search ${name}s`, value: query, onChange: (event) => setQuery(event.currentTarget.value), style: { boxSizing: "border-box", display: "block", width: "100%", minHeight: 32, marginTop: 4, padding: "6px 8px" } })
|
|
2607
|
+
] }),
|
|
2608
|
+
/* @__PURE__ */ jsx7("button", { type: "submit", disabled: state === "loading", style: { ...pickerButton, marginTop: 8 }, children: state === "loading" ? "Searching\u2026" : "Search" })
|
|
2609
|
+
] }),
|
|
2610
|
+
state === "error" ? /* @__PURE__ */ jsx7("p", { role: "alert", children: "The authorized resource service is unavailable. Try again later." }) : null,
|
|
2611
|
+
state === "idle" && !items.length ? /* @__PURE__ */ jsxs7("p", { role: "status", children: [
|
|
2612
|
+
"No ",
|
|
2613
|
+
name,
|
|
2614
|
+
"s found."
|
|
2615
|
+
] }) : null,
|
|
2616
|
+
items.length ? /* @__PURE__ */ jsx7("ul", { style: { display: "grid", gap: 6, margin: "12px 0", padding: 0, listStyle: "none" }, children: items.map((item) => /* @__PURE__ */ jsx7("li", { children: /* @__PURE__ */ jsxs7("button", { type: "button", style: { ...pickerButton, width: "100%", textAlign: "left" }, onClick: () => {
|
|
2617
|
+
onChange(item);
|
|
2618
|
+
setOpen(false);
|
|
2619
|
+
}, children: [
|
|
2620
|
+
/* @__PURE__ */ jsx7("strong", { children: item.title }),
|
|
2621
|
+
item.handle ? /* @__PURE__ */ jsx7("small", { style: { display: "block" }, children: item.handle }) : null
|
|
2622
|
+
] }) }, item.id)) }) : null,
|
|
2623
|
+
cursor ? /* @__PURE__ */ jsx7("button", { type: "button", disabled: state === "loading", style: pickerButton, onClick: () => void search(query, cursor, true), children: "Load more" }) : null
|
|
2624
|
+
] }) : null
|
|
2625
|
+
] });
|
|
2626
|
+
}
|
|
2627
|
+
function ShopifyProductResourceField(props) {
|
|
2628
|
+
return /* @__PURE__ */ jsx7(ResourceField, { ...props, kind: "product" });
|
|
2629
|
+
}
|
|
2630
|
+
function ShopifyCollectionResourceField(props) {
|
|
2631
|
+
return /* @__PURE__ */ jsx7(ResourceField, { ...props, kind: "collection" });
|
|
1233
2632
|
}
|
|
1234
2633
|
|
|
1235
2634
|
// src/sales-definition.ts
|
|
1236
|
-
var trackingNumberPattern2 = /^[A-Za-z0-9-]{4,64}$/;
|
|
1237
2635
|
var text6 = (label, options = {}) => ({ field: "besttrack.sales.text", label, control: "text", required: true, ...options });
|
|
1238
2636
|
var shortText = (label, description) => text6(label, { description, group: "Content" });
|
|
1239
2637
|
var longText = (label, description) => text6(label, { control: "textarea", description, group: "Content" });
|
|
1240
|
-
var link = (label, description) => text6(label, { control: "url", description: description ?? "Use a site-relative path or HTTPS URL.", group: "Links" });
|
|
1241
|
-
function safeLink(value) {
|
|
1242
|
-
if (typeof value !== "string") return false;
|
|
1243
|
-
if (value.startsWith("/") && !value.startsWith("//") && !value.startsWith("/\\") && !value.includes("\\") && !hasControlCharacter2(value)) return true;
|
|
1244
|
-
try {
|
|
1245
|
-
return new URL(value).protocol === "https:";
|
|
1246
|
-
} catch {
|
|
1247
|
-
return false;
|
|
1248
|
-
}
|
|
1249
|
-
}
|
|
1250
|
-
function hasControlCharacter2(value) {
|
|
1251
|
-
return [...value].some((character) => character.charCodeAt(0) < 32);
|
|
1252
|
-
}
|
|
1253
2638
|
function requiredString(props, key, issues, maxLength = 160) {
|
|
1254
2639
|
const value = props[key];
|
|
1255
2640
|
if (typeof value !== "string" || !value.trim()) issues.push({ path: `props.${key}`, message: "A non-empty value is required." });
|
|
@@ -1265,45 +2650,88 @@ function textProps(keys) {
|
|
|
1265
2650
|
function validateQuery(props) {
|
|
1266
2651
|
const issues = textProps([["heading", 120], ["submitLabel", 80]])(props);
|
|
1267
2652
|
const trackingNumber = props.defaultTrackingNumber;
|
|
1268
|
-
if (typeof trackingNumber !== "string" || !
|
|
2653
|
+
if (typeof trackingNumber !== "string" || !isValidTrackingNumber(trackingNumber)) issues.push({ path: "props.defaultTrackingNumber", message: "Use 6\u201364 letters, numbers, hyphens, or underscores. Use a non-sensitive preview placeholder only." });
|
|
1269
2654
|
if (props.heroImageUrl !== void 0 && !safeImage(props.heroImageUrl)) issues.push({ path: "props.heroImageUrl", message: "Use an HTTPS URL for the merchant-configured hero image." });
|
|
1270
2655
|
return issues;
|
|
1271
2656
|
}
|
|
1272
2657
|
function safeImage(value) {
|
|
1273
|
-
|
|
1274
|
-
try {
|
|
1275
|
-
return new URL(value).protocol === "https:";
|
|
1276
|
-
} catch {
|
|
1277
|
-
return false;
|
|
1278
|
-
}
|
|
2658
|
+
return isSafeTrackingPageUrl(value);
|
|
1279
2659
|
}
|
|
1280
2660
|
function validateCategories(props) {
|
|
1281
|
-
const issues = textProps([["heading", 120]
|
|
1282
|
-
if (!
|
|
2661
|
+
const issues = textProps([["heading", 120]])(props);
|
|
2662
|
+
if (!isShopifyResourceReference(props.collection, "collection")) issues.push({ path: "props.collection", message: "Select a Shopify collection through an authorized resource integration." });
|
|
2663
|
+
return issues;
|
|
2664
|
+
}
|
|
2665
|
+
function validateFeaturedProduct(props) {
|
|
2666
|
+
const issues = textProps([["heading", 120]])(props);
|
|
2667
|
+
if (!isShopifyResourceReference(props.product, "product")) issues.push({ path: "props.product", message: "Select a Shopify product through an authorized resource integration." });
|
|
1283
2668
|
return issues;
|
|
1284
2669
|
}
|
|
1285
|
-
|
|
2670
|
+
function withTemplatePolicy3(blocks, protectedBlocks) {
|
|
2671
|
+
return blocks.map((block) => ({ ...block, policy: { singleton: true, ...protectedBlocks.includes(block.type) ? { required: true, allowDelete: false } : {} } }));
|
|
2672
|
+
}
|
|
2673
|
+
var salesBlocks = withTemplatePolicy3([
|
|
1286
2674
|
{ type: "besttrack.sales.announcement", version: 1, label: "Announcement", category: "BestTrack Sales", targets: ["web"], defaultProps: { message: "Free delivery on orders over $50" }, defaultVariant: "hero", variants: [{ id: "hero", label: "Sales Hero" }, { id: "commerce", label: "Commerce" }, { id: "minimal", label: "Minimal", theme: { "color.primary": "#202223" } }], fields: { message: longText("Announcement", "Short, customer-facing promotion copy.") }, validate: textProps([["message", 280]]), render: { web: SalesAnnouncementBlock, editor: SalesAnnouncementEditor } },
|
|
1287
|
-
{ type: "besttrack.sales.query", version: 1, label: "Order query", category: "BestTrack Sales", targets: ["web"], defaultProps: { heading: "Track your order", submitLabel: "Track order", defaultTrackingNumber: "BT-2048-DEMO", heroImageUrl: "https://images.unsplash.com/photo-1556742049-0cfed4f6a45d?auto=format&fit=crop&w=1800&q=85" }, defaultVariant: "hero", variants: [{ id: "hero", label: "Sales Hero" }, { id: "commerce", label: "Commerce" }, { id: "compact", label: "Compact", theme: { spacing: "12px" } }], fields: { heading: shortText("Heading"), submitLabel: shortText("Button label"), defaultTrackingNumber: text6("Default tracking number", { group: "Tracking settings", description: "Preview-only placeholder; never save a customer's tracking number." }), heroImageUrl: text6("Hero image URL", { control: "url", group: "Hero asset", description: "Merchant-configured HTTPS image. It is rendered as an image element, never as CSS." }) }, validate: validateQuery, render: { web: SalesQueryBlock, editor: SalesQueryEditor } },
|
|
2675
|
+
{ type: "besttrack.sales.query", version: 1, label: "Order query", category: "BestTrack Sales", targets: ["web"], defaultProps: { heading: "Track your order", submitLabel: "Track order", defaultTrackingNumber: "BT-2048-DEMO", defaultOrderNumber: "", heroImageUrl: "https://images.unsplash.com/photo-1556742049-0cfed4f6a45d?auto=format&fit=crop&w=1800&q=85" }, defaultVariant: "hero", variants: [{ id: "hero", label: "Sales Hero" }, { id: "commerce", label: "Commerce" }, { id: "compact", label: "Compact", theme: { spacing: "12px" } }], fields: { heading: shortText("Heading"), submitLabel: shortText("Button label"), defaultTrackingNumber: text6("Default tracking number", { group: "Tracking settings", description: "Preview-only placeholder; never save a customer's tracking number." }), defaultOrderNumber: text6("Default order number", { group: "Tracking settings", description: "Preview-only placeholder; never save a customer's order number." }), heroImageUrl: text6("Hero image URL", { control: "url", group: "Hero asset", description: "Merchant-configured HTTPS image. It is rendered as an image element, never as CSS.", validation: { allowRelativeUrl: false, allowedUrlProtocols: ["https:"], allowLocalhost: true } }) }, validate: validateQuery, render: { web: SalesQueryBlock, editor: SalesQueryEditor } },
|
|
1288
2676
|
{ type: "besttrack.sales.order-items", version: 1, label: "Order items", category: "BestTrack Sales", targets: ["web"], defaultProps: { heading: "Items in your order" }, defaultVariant: "hero", variants: [{ id: "hero", label: "Sales Hero" }, { id: "commerce", label: "Commerce" }], fields: { heading: shortText("Heading") }, validate: textProps([["heading", 120]]), render: { web: SalesOrderItemsBlock, editor: SalesOrderItemsEditor } },
|
|
1289
2677
|
{ type: "besttrack.sales.other-tracking", version: 1, label: "Other tracking", category: "BestTrack Sales", targets: ["web"], defaultProps: { heading: "Other shipments", emptyMessage: "No other shipments are linked to this order." }, defaultVariant: "hero", variants: [{ id: "hero", label: "Sales Hero" }, { id: "commerce", label: "Commerce" }], fields: { heading: shortText("Heading"), emptyMessage: longText("Empty message") }, validate: textProps([["heading", 120], ["emptyMessage", 280]]), render: { web: SalesOtherTrackingBlock, editor: SalesOtherTrackingEditor } },
|
|
1290
2678
|
{ type: "besttrack.sales.service-cards", version: 1, label: "Service cards", category: "BestTrack Sales", targets: ["web"], defaultProps: { heading: "Shop with confidence", firstTitle: "Easy returns", firstDescription: "Simple support when plans change.", secondTitle: "Secure delivery", secondDescription: "Follow every milestone in one place." }, defaultVariant: "hero", variants: [{ id: "hero", label: "Sales Hero" }, { id: "commerce", label: "Commerce" }], fields: { heading: shortText("Heading"), firstTitle: shortText("First card title"), firstDescription: longText("First card description"), secondTitle: shortText("Second card title"), secondDescription: longText("Second card description") }, validate: textProps([["heading", 120], ["firstTitle", 120], ["firstDescription", 280], ["secondTitle", 120], ["secondDescription", 280]]), render: { web: SalesServiceCardsBlock, editor: SalesServiceCardsEditor } },
|
|
1291
|
-
{ type: "besttrack.sales.product-categories", version:
|
|
2679
|
+
{ type: "besttrack.sales.product-categories", version: 3, label: "Product categories", category: "BestTrack Sales", targets: ["web"], defaultProps: { heading: "Shop by category", collection: { id: "gid://shopify/Collection/1", kind: "collection", title: "Featured collection", handle: "featured" } }, defaultVariant: "hero", variants: [{ id: "hero", label: "Sales Hero" }, { id: "commerce", label: "Commerce" }, { id: "grid", label: "Grid", theme: { "color.surface": "#f8fafc" } }], fields: { heading: shortText("Heading"), collection: { field: "besttrack.shopify.collection", label: "Collection", group: "Resource", description: "Browse through an authorized host integration. Only a stable ID and minimal display copy are saved." } }, validate: validateCategories, render: { web: SalesProductCategoriesBlock, editor: SalesProductCategoriesEditor } },
|
|
2680
|
+
{ type: "besttrack.sales.featured-product", version: 1, label: "Featured product", category: "BestTrack Sales", targets: ["web"], defaultProps: { heading: "Featured product", product: { id: "gid://shopify/Product/1", kind: "product", title: "Featured product", handle: "featured-product" } }, defaultVariant: "hero", variants: [{ id: "hero", label: "Sales Hero" }, { id: "commerce", label: "Commerce" }], fields: { heading: shortText("Heading"), product: { field: "besttrack.shopify.product", label: "Product", group: "Resource", description: "Browse through an authorized host integration. Current availability is resolved only at runtime." } }, validate: validateFeaturedProduct, render: { web: SalesFeaturedProductBlock, editor: SalesFeaturedProductEditor } },
|
|
1292
2681
|
{ type: "besttrack.sales.recommendations", version: 1, label: "Recommended products", category: "BestTrack Sales", targets: ["web"], defaultProps: { heading: "Complete your order" }, defaultVariant: "hero", variants: [{ id: "hero", label: "Sales Hero" }, { id: "commerce", label: "Commerce" }, { id: "grid", label: "Product grid", theme: { "color.surface": "#f8fafc" } }], fields: { heading: shortText("Heading") }, validate: textProps([["heading", 120]]), render: { web: SalesRecommendationsBlock, editor: SalesRecommendationsEditor } }
|
|
1293
|
-
];
|
|
2682
|
+
], ["besttrack.sales.announcement", "besttrack.sales.query"]);
|
|
2683
|
+
var salesTemplatePolicy = defineTemplatePolicy(
|
|
2684
|
+
"besttrack.sales",
|
|
2685
|
+
"Sales",
|
|
2686
|
+
salesBlocks.map((block) => block.type),
|
|
2687
|
+
["besttrack.sales.announcement", "besttrack.sales.query"]
|
|
2688
|
+
);
|
|
1294
2689
|
function createSalesTemplate() {
|
|
1295
|
-
return { id: "besttrack.sales", version:
|
|
2690
|
+
return { id: "besttrack.sales", version: 3, name: "Sales", target: "web", source: "built-in", requiredBlocks: salesBlocks.map((block) => block.type), theme: { "color.primary": "#000000", "color.background": "#f7f5f0", "color.surface": "#ffffff", "color.text": "#0a0a0a", "color.muted": "#6b6b6b", "color.border": "#dfddd7", "font.family": "Arial, Helvetica, sans-serif", radius: "10px", spacing: "24px" }, create: () => createPageDocument3({ pageId: "besttrack-sales", target: "web", templateId: "besttrack.sales", templateVersion: 3, settings: { locale: "en", seoTitle: "Shop and track your order" }, blocks: salesBlocks.map((block, index) => ({ id: "sales-" + (index + 1), type: block.type, version: block.version, props: block.defaultProps, variant: block.defaultVariant, style: {} })) }) };
|
|
1296
2691
|
}
|
|
1297
|
-
var bestTrackSalesExtension = Object.freeze({ name: "besttrack.sales", version: "0.
|
|
2692
|
+
var bestTrackSalesExtension = Object.freeze({ name: "besttrack.sales", version: "0.8.0", fields: [{ type: "besttrack.sales.text", component: SalesTextField }, { type: "besttrack.shopify.collection", component: ShopifyCollectionResourceField }, { type: "besttrack.shopify.product", component: ShopifyProductResourceField }], blocks: salesBlocks, templates: [createSalesTemplate()] });
|
|
1298
2693
|
export {
|
|
1299
2694
|
BrandedRuntimeProvider,
|
|
1300
2695
|
ReadyToGoRuntimeProvider,
|
|
2696
|
+
SHOPIFY_RECOMMEND_PATH,
|
|
2697
|
+
SHOPIFY_TRACK_QUERY_PATH,
|
|
1301
2698
|
SalesRuntimeProvider,
|
|
2699
|
+
ShopifyCollectionResourceField,
|
|
2700
|
+
ShopifyProductResourceField,
|
|
2701
|
+
ShopifyResourcePickerProvider,
|
|
1302
2702
|
bestTrackBrandedExtension,
|
|
1303
2703
|
bestTrackPageExtension,
|
|
1304
2704
|
bestTrackSalesExtension,
|
|
2705
|
+
brandedTemplatePolicy,
|
|
2706
|
+
buildShopifyRecommendPayload,
|
|
2707
|
+
buildShopifyTrackQueryPayload,
|
|
1305
2708
|
createBrandedTemplate,
|
|
1306
2709
|
createReadyToGoTemplate,
|
|
1307
2710
|
createSalesTemplate,
|
|
1308
|
-
|
|
2711
|
+
createShopifyRecommendationsQuery,
|
|
2712
|
+
createShopifyTrackQuery,
|
|
2713
|
+
formatTrackingPageMoney,
|
|
2714
|
+
getResolvedShopifyResource,
|
|
2715
|
+
getShopifyResourceResolutionError,
|
|
2716
|
+
isEmptyTrackingPageResult,
|
|
2717
|
+
isSafeTrackingPageUrl,
|
|
2718
|
+
isShopifyResourceReference,
|
|
2719
|
+
isTrackingPageResourceReference,
|
|
2720
|
+
isValidOrderEmail,
|
|
2721
|
+
isValidOrderNumber,
|
|
2722
|
+
isValidTrackingNumber,
|
|
2723
|
+
mapShopifyRecommendationsResponse,
|
|
2724
|
+
mapShopifyTrackQueryResponse,
|
|
2725
|
+
readTrackingQueryFromLocation,
|
|
2726
|
+
readTrackingQueryLocationState,
|
|
2727
|
+
readyToGoTemplatePolicy,
|
|
2728
|
+
resolveInitialLocale,
|
|
2729
|
+
resolveShopifyResources,
|
|
2730
|
+
resolveShopifyTrackQueryLocale,
|
|
2731
|
+
safeTrackingPageUrl,
|
|
2732
|
+
salesTemplatePolicy,
|
|
2733
|
+
shouldHidePoweredBy,
|
|
2734
|
+
syncTrackingQueryToUrl,
|
|
2735
|
+
withShopifyAppProxyPrefix,
|
|
2736
|
+
withShopifyTrackCacheBust
|
|
1309
2737
|
};
|