@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/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
- if (typeof value !== "string") return "#";
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
- if (typeof value !== "string") return "";
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 jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
167
- var initialRuntime = { phase: "idle", async query() {
168
- return void 0;
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
- deliveryAddress: "Demo recipient \xB7 Shanghai",
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: "$9.00" },
188
- { id: "delivery-alerts", title: "Delivery alerts", description: "Receive an update at every milestone.", price: "$4.00" }
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(trackingNumber) {
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, queryTracking = queryMockReadyToGoTracking }) {
1038
+ function ReadyToGoRuntimeProvider({ children, query: injectedQuery, queryRecommendations, transport, autoQueryFromUrl, watermark }) {
196
1039
  const [state, setState] = useState2({ phase: "idle" });
197
- const query = useCallback(async (trackingNumber) => {
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
- setState({ phase: "success", result: await queryTracking(trackingNumber) });
201
- } catch (error) {
202
- setState({ phase: "error", error: error instanceof Error ? error.message : "tracking-query-failed" });
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
- }, [queryTracking]);
205
- const value = useMemo(() => ({ ...state, query }), [query, state]);
206
- return /* @__PURE__ */ jsx2(ReadyToGoRuntimeContext.Provider, { value, children });
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__ */ jsx2("input", { "aria-label": "Ready-to-go text", value: typeof value === "string" ? value : "", onChange: (event) => onChange(event.target.value) });
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__ */ jsx2("span", { "data-ready-to-go-editor-field": name, children: value });
271
- return /* @__PURE__ */ jsx2(
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: { display: "inline-block", width: "100%", minWidth: "5ch", boxSizing: "border-box", border: "1px dashed currentColor", borderRadius: 3, padding: "2px 5px", background: "transparent", color: "inherit", font: "inherit", fontWeight: "inherit", lineHeight: "inherit", letterSpacing: "inherit", textAlign: "inherit" }
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__ */ jsxs2(Fragment, { children: [
292
- /* @__PURE__ */ jsxs2("p", { style: { margin: 0, fontSize: 20, lineHeight: 1.4, color: "#000" }, children: [
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__ */ jsx2("h2", { style: { margin: "48px 0 0", fontSize: 32, lineHeight: "40px", fontWeight: 700, color: "#303030" }, children: result.status }),
297
- showEstimatedDelivery && result.estimatedDelivery ? /* @__PURE__ */ jsxs2("div", { style: { margin: "16px auto 0", maxWidth: 720, borderRadius: 10, background: "#eaf4ff", padding: "20px 22px 18px", textAlign: "left" }, children: [
298
- /* @__PURE__ */ jsx2("p", { style: { margin: 0, fontSize: 13, fontWeight: 700, color: "#202124" }, children: "Estimated delivery" }),
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__ */ jsxs2("div", { style: { ...contentWidth, display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(min(100%, 280px), 500px))", gap: 40, justifyContent: "center", alignItems: "start" }, children: [
306
- /* @__PURE__ */ jsxs2("div", { children: [
307
- /* @__PURE__ */ jsx2("h3", { style: { margin: 0, fontSize: 20, lineHeight: "20px", fontWeight: 700 }, children: heading }),
308
- /* @__PURE__ */ jsx2(ShippingTimeline, { events: eventsFrom(result) })
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__ */ jsxs2("div", { style: { display: "flex", flexDirection: "column", gap: 24 }, children: [
311
- /* @__PURE__ */ jsxs2("div", { children: [
312
- /* @__PURE__ */ jsx2("h3", { style: { margin: "0 0 12px", fontSize: 18, fontWeight: 700 }, children: contentsHeading }),
313
- /* @__PURE__ */ jsx2(PackageContents, { items: result.orderItems ?? [] })
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__ */ jsxs2("div", { children: [
316
- /* @__PURE__ */ jsx2("h3", { style: { margin: "0 0 12px", fontSize: 18, fontWeight: 700 }, children: carrierHeading }),
317
- /* @__PURE__ */ jsx2("p", { style: { margin: 0, fontSize: 14, fontWeight: 600, color: "#1e293b" }, children: result.carrier ?? "Not available" }),
318
- /* @__PURE__ */ jsx2("p", { style: { margin: "8px 0 0", fontSize: 14, color: "#64748b" }, children: result.deliveryAddress ?? "Delivery details are not available." })
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__ */ jsx2("section", { "aria-label": "Ready-to-go query editor", style: heroStyle, children: /* @__PURE__ */ jsxs2("div", { role: "region", "aria-label": "Ready-to-go tracking query", style: formCardStyle, children: [
325
- /* @__PURE__ */ jsx2("h1", { style: { margin: "0 0 24px", textAlign: "center", fontSize: 28, lineHeight: 1.15 }, children: /* @__PURE__ */ jsx2(InlineText, { block, name: "heading", fallback: "Track your order" }) }),
326
- /* @__PURE__ */ jsxs2("div", { style: { display: "flex", width: "100%", borderBottom: "1px solid #cbd5e1" }, children: [
327
- /* @__PURE__ */ jsx2("div", { style: { ...tabStyle(true), display: "flex", alignItems: "center", justifyContent: "center", cursor: "default" }, children: /* @__PURE__ */ jsx2(InlineText, { block, name: "trackingTabLabel", fallback: "Tracking Number" }) }),
328
- /* @__PURE__ */ jsx2("div", { style: { ...tabStyle(false), display: "flex", alignItems: "center", justifyContent: "center", cursor: "default" }, children: /* @__PURE__ */ jsx2(InlineText, { block, name: "orderTabLabel", fallback: "Order Number" }) })
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__ */ jsxs2("div", { style: { marginTop: 24, display: "flex", flexDirection: "column", gap: 16, flex: 1 }, children: [
331
- /* @__PURE__ */ jsx2(
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: { ...inputStyle, border: block.selected ? "1px dashed #111" : inputStyle.border }
1249
+ style: {
1250
+ ...inputStyle
1251
+ /* , border: block.selected ? "1px dashed #111" : inputStyle.border */
1252
+ }
341
1253
  }
342
1254
  ),
343
- /* @__PURE__ */ jsx2("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__ */ jsx2(InlineText, { block, name: "submitLabel", fallback: "Track Your Order" }) })
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__ */ jsx2("p", { style: { marginTop: "auto", paddingTop: 28, textAlign: "center", fontSize: 12, lineHeight: "17px", fontStyle: "italic", color: "#b8b8b8" }, children: "Powered by BestTrack" })
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__ */ jsx2("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__ */ jsx2("div", { style: { ...contentWidth, textAlign: "center", width: "min(1248px, 100%)" }, children: /* @__PURE__ */ jsx2(ProgressResult, { showEstimatedDelivery: false, result: previewReadyToGoTracking() }) }) });
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__ */ jsx2("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__ */ jsx2(
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__ */ jsx2(InlineText, { block, name: "heading", fallback: "Shipping Details" }),
356
- contentsHeading: /* @__PURE__ */ jsx2(InlineText, { block, name: "contentsHeading", fallback: "Package Contents" }),
357
- carrierHeading: /* @__PURE__ */ jsx2(InlineText, { block, name: "carrierHeading", fallback: "Carrier" }),
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__ */ jsx2("section", { "aria-label": "Ready-to-go recommendations editor", style: { ...pageFont, background: "var(--pb-color-background, #fff)", color: "var(--pb-color-text, #0f172a)" }, children: /* @__PURE__ */ jsxs2("div", { style: { ...contentWidth, padding: "48px 24px" }, children: [
365
- /* @__PURE__ */ jsx2("h3", { style: { margin: 0, textAlign: "center", fontSize: 20, lineHeight: "20px", fontWeight: 700 }, children: /* @__PURE__ */ jsx2(InlineText, { block, name: "heading", fallback: "You may also like..." }) }),
366
- /* @__PURE__ */ jsx2("div", { style: { marginTop: 24 }, children: /* @__PURE__ */ jsx2(RecommendationCards, { items: preview.recommendations ?? [] }) })
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 [mode, setMode] = useState2(text(props, "defaultQueryMode", "tracking") === "order" ? "order" : "tracking");
372
- const [trackingNumber, setTrackingNumber] = useState2(text(props, "defaultTrackingNumber", "BT-2048-DEMO"));
373
- const [orderNumber, setOrderNumber] = useState2(text(props, "defaultOrderNumber", ""));
374
- const [email, setEmail] = useState2("");
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("Enter an order number and email.");
1305
+ setLocalError("Please enter your order number and email address");
386
1306
  return;
387
1307
  }
388
- void runtime.query(orderNumber.trim());
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
- void runtime.query(trackingNumber.trim());
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__ */ jsx2("section", { style: heroStyle, children: /* @__PURE__ */ jsxs2("div", { role: "region", "aria-label": "Ready-to-go tracking query", style: formCardStyle, children: [
395
- heading ? /* @__PURE__ */ jsx2("h1", { style: { margin: "0 0 24px", textAlign: "center", fontSize: 28, lineHeight: 1.15 }, children: heading }) : null,
396
- /* @__PURE__ */ jsxs2("div", { role: "tablist", "aria-label": "Tracking method", style: { display: "flex", width: "100%", borderBottom: "1px solid #cbd5e1" }, children: [
397
- /* @__PURE__ */ jsx2("button", { type: "button", role: "tab", "aria-selected": mode === "tracking", onClick: () => {
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__ */ jsx2("button", { type: "button", role: "tab", "aria-selected": mode === "order", onClick: () => {
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__ */ jsxs2("form", { onSubmit: submit, style: { marginTop: 24, display: "flex", flexDirection: "column", gap: 16, flex: 1 }, children: [
407
- mode === "order" ? /* @__PURE__ */ jsxs2(Fragment, { children: [
408
- /* @__PURE__ */ jsx2("label", { htmlFor: "ready-to-go-order-number", style: { position: "absolute", width: 1, height: 1, overflow: "hidden", clipPath: "inset(50%)" }, children: "Order number" }),
409
- /* @__PURE__ */ jsx2("input", { id: "ready-to-go-order-number", "aria-label": "Order number", value: orderNumber, onChange: (event) => setOrderNumber(event.target.value), required: true, minLength: 4, maxLength: 64, placeholder: "Enter your order number", style: inputStyle }),
410
- /* @__PURE__ */ jsx2("label", { htmlFor: "ready-to-go-email", style: { position: "absolute", width: 1, height: 1, overflow: "hidden", clipPath: "inset(50%)" }, children: "Email" }),
411
- /* @__PURE__ */ jsx2("input", { id: "ready-to-go-email", "aria-label": "Email", type: "email", value: email, onChange: (event) => setEmail(event.target.value), required: true, placeholder: "Enter your email", style: inputStyle })
412
- ] }) : /* @__PURE__ */ jsxs2(Fragment, { children: [
413
- /* @__PURE__ */ jsx2("label", { htmlFor: "ready-to-go-tracking-number", style: { position: "absolute", width: 1, height: 1, overflow: "hidden", clipPath: "inset(50%)" }, children: "Tracking number" }),
414
- /* @__PURE__ */ jsx2("input", { id: "ready-to-go-tracking-number", "aria-label": "Tracking number", value: trackingNumber, onChange: (event) => setTrackingNumber(event.target.value), required: true, minLength: 4, maxLength: 64, placeholder: "Enter your tracking number", style: inputStyle })
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__ */ jsx2("p", { style: { margin: 0, textAlign: "center", fontSize: 12, color: "#f43f5e" }, children: localError }) : null,
417
- /* @__PURE__ */ jsx2("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\u2026" : submitLabel }),
418
- runtime.phase === "error" ? /* @__PURE__ */ jsx2("p", { role: "alert", style: { margin: 0, textAlign: "center", fontSize: 12, color: "#f43f5e" }, children: runtime.error }) : null
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__ */ jsx2("p", { style: { marginTop: "auto", paddingTop: 28, textAlign: "center", fontSize: 12, lineHeight: "17px", fontStyle: "italic", color: "#b8b8b8" }, children: "Powered by BestTrack" })
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
- return /* @__PURE__ */ jsx2(SectionShell, { title: "Shipment progress", children: /* @__PURE__ */ jsxs2("div", { style: { ...contentWidth, textAlign: "center", width: "min(1248px, 100%)" }, children: [
427
- runtime.phase === "loading" ? /* @__PURE__ */ jsxs2("div", { "aria-label": "Loading shipment progress", children: [
428
- /* @__PURE__ */ jsx2(IdleMessage, { children: "Loading shipment progress\u2026" }),
429
- /* @__PURE__ */ jsx2(SkeletonRow, {})
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__ */ jsx2("p", { style: { margin: 0, color: "#b42318" }, children: "Shipment progress is temporarily unavailable." }) : null,
432
- runtime.phase === "idle" ? /* @__PURE__ */ jsx2(IdleMessage, { children: "Enter a tracking number to see shipment progress." }) : null,
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__ */ jsx2(SectionShell, { title: heading, children: runtime.phase === "success" && result ? /* @__PURE__ */ jsx2(DeliveryResult, { heading, contentsHeading, carrierHeading, result }) : /* @__PURE__ */ jsx2("div", { style: { ...contentWidth, display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(min(100%, 280px), 500px))", gap: 40, justifyContent: "center", alignItems: "start" }, children: /* @__PURE__ */ jsxs2("div", { children: [
443
- /* @__PURE__ */ jsx2("h3", { style: { margin: 0, fontSize: 20, lineHeight: "20px", fontWeight: 700 }, children: heading }),
444
- runtime.phase === "loading" ? /* @__PURE__ */ jsx2(IdleMessage, { children: "Loading delivery details\u2026" }) : null,
445
- runtime.phase === "error" ? /* @__PURE__ */ jsx2("p", { style: { margin: "16px 0 0", color: "#b42318" }, children: "Delivery details are temporarily unavailable." }) : null,
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__ */ jsx2(SectionShell, { title: heading, bordered: false, children: /* @__PURE__ */ jsxs2("div", { style: { ...contentWidth, padding: "48px 24px" }, children: [
454
- /* @__PURE__ */ jsx2("h3", { style: { margin: 0, textAlign: "center", fontSize: 20, lineHeight: "20px", fontWeight: 700 }, children: heading }),
455
- /* @__PURE__ */ jsxs2("div", { style: { marginTop: 24 }, children: [
456
- runtime.phase === "loading" ? /* @__PURE__ */ jsx2(IdleMessage, { children: "Loading recommendations\u2026" }) : null,
457
- runtime.phase === "error" ? /* @__PURE__ */ jsx2("p", { style: { margin: 0, textAlign: "center", color: "#b42318" }, children: "Recommendations are temporarily unavailable." }) : null,
458
- runtime.phase === "idle" ? /* @__PURE__ */ jsx2(IdleMessage, { children: "Recommendations appear with your shipment result." }) : null,
459
- runtime.phase === "success" && recommendations.length ? /* @__PURE__ */ jsx2(RecommendationCards, { items: recommendations }) : null,
460
- runtime.phase === "success" && !recommendations.length ? /* @__PURE__ */ jsx2(IdleMessage, { children: "No recommendations are available for this shipment." }) : null
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
- var readyToGoBlocks = [
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 useState3 } from "react";
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-page-runtime.ts
583
- function isEmptyTrackingPageResult(result) {
584
- return result.outcome === "empty";
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 jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
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, queryTracking }) {
606
- const [state, setState] = useState3({ phase: "idle" });
607
- const [selectedShipmentId, setSelectedShipmentId] = useState3(null);
608
- const requestId = useRef(0);
609
- const query = useCallback2(async (trackingNumber) => {
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
- const result = await queryTracking(trackingNumber);
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
- }, [queryTracking]);
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__ */ jsx3(BrandedRuntimeContext.Provider, { value, children });
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
- function safeHref2(value) {
648
- if (typeof value !== "string") return "#";
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] = useState3(false);
1949
+ const [failed, setFailed] = useState4(false);
671
1950
  const safeSrc = safeImageUrl2(src);
672
1951
  if (!safeSrc || failed) {
673
- return /* @__PURE__ */ jsx3("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() });
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__ */ jsx3("img", { src: safeSrc, alt, onError: () => setFailed(true), style: { width: 72, height: 72, flex: "0 0 auto", borderRadius: 6, objectFit: "cover", background: "#f2f2f2" } });
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__ */ jsx3("div", { "aria-label": "Shipment switcher", style: { ...contentWidth2, minHeight: 56, display: "flex", alignItems: "center", gap: 8, overflowX: "auto", whiteSpace: "nowrap" }, children: shipments.map((shipment, index) => {
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__ */ jsx3("button", { type: "button", onClick: () => runtime.selectShipment(shipment.id), "aria-pressed": selected, style: { minWidth: 92, minHeight: 36, 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);
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 [trackingNumber, setTrackingNumber] = useState3(text3(props, "defaultTrackingNumber", "DEMO-YQTRACK9999"));
690
- const [mode, setMode] = useState3(text3(props, "defaultQueryMode", "tracking") === "order" ? "order" : "tracking");
691
- const [heroImageFailed, setHeroImageFailed] = useState3(false);
692
- const submit = (event) => {
693
- event.preventDefault();
694
- void runtime.query(trackingNumber);
695
- };
696
- return /* @__PURE__ */ jsxs3("div", { style: { position: "relative", minHeight: "clamp(520px, 44vw, 560px)", display: "grid", placeItems: "center", overflow: "hidden", background: "linear-gradient(135deg, #dedbd4, #b9b3aa)" }, children: [
697
- !heroImageFailed && safeImageUrl2(props.heroImageUrl) ? /* @__PURE__ */ jsx3("img", { src: safeImageUrl2(props.heroImageUrl), alt: "", onError: () => setHeroImageFailed(true), style: { position: "absolute", inset: 0, width: "100%", height: "100%", objectFit: "cover" } }) : null,
698
- /* @__PURE__ */ jsx3("div", { "aria-hidden": "true", style: { position: "absolute", inset: 0, background: "rgba(255,255,255,0.12)" } }),
699
- /* @__PURE__ */ jsxs3("div", { style: { ...cardStyle, position: "relative", zIndex: 1, width: "min(560px, calc(100% - 32px))", padding: "clamp(24px, 5vw, 48px)", boxSizing: "border-box", boxShadow: "0 16px 40px rgb(0 0 0 / 8%)" }, children: [
700
- /* @__PURE__ */ jsx3("h1", { style: { margin: "0 0 36px", textAlign: "center", fontSize: "clamp(28px, 3vw, 32px)", lineHeight: 1.15 }, children: text3(props, "heading", "Track your order") }),
701
- /* @__PURE__ */ jsxs3("div", { role: "tablist", "aria-label": "Tracking method", style: { display: "grid", gridTemplateColumns: "1fr 1fr", borderBottom: "1px solid #e7e7e7", marginBottom: 24 }, children: [
702
- /* @__PURE__ */ jsx3("button", { type: "button", role: "tab", "aria-selected": mode === "order", onClick: () => setMode("order"), style: { minHeight: 40, border: 0, borderBottom: mode === "order" ? "2px solid #0a0a0a" : "2px solid transparent", background: "transparent", fontWeight: mode === "order" ? 700 : 400, cursor: "pointer" }, children: "Order Number" }),
703
- /* @__PURE__ */ jsx3("button", { type: "button", role: "tab", "aria-selected": mode === "tracking", onClick: () => setMode("tracking"), style: { minHeight: 40, border: 0, borderBottom: mode === "tracking" ? "2px solid #0a0a0a" : "2px solid transparent", background: "transparent", fontWeight: mode === "tracking" ? 700 : 400, cursor: "pointer" }, children: "Tracking Number" })
704
- ] }),
705
- /* @__PURE__ */ jsxs3("form", { onSubmit: submit, children: [
706
- /* @__PURE__ */ jsx3("label", { htmlFor: "branded-tracking-number", style: { position: "absolute", width: 1, height: 1, overflow: "hidden", clipPath: "inset(50%)" }, children: mode === "order" ? "Order number" : "Tracking number" }),
707
- /* @__PURE__ */ jsx3("input", { id: "branded-tracking-number", "aria-label": mode === "order" ? "Order number" : "Tracking number", value: trackingNumber, onChange: (event) => setTrackingNumber(event.target.value), required: true, minLength: 4, maxLength: 64, placeholder: mode === "order" ? "Enter your order number" : "Enter your tracking number", style: { width: "100%", height: 48, padding: "0 16px", boxSizing: "border-box", border: "1px solid #e2e2e2", borderRadius: 10, font: "inherit" } }),
708
- /* @__PURE__ */ jsx3("button", { type: "submit", disabled: runtime.phase === "loading", style: { width: "100%", minHeight: 48, marginTop: 24, border: 0, borderRadius: 10, background: runtime.phase === "loading" ? "#6b6b6b" : "#000", color: "#fff", font: "inherit", cursor: runtime.phase === "loading" ? "wait" : "pointer" }, children: runtime.phase === "loading" ? "Tracking\u2026" : text3(props, "submitLabel", "Track") })
709
- ] }),
710
- runtime.phase === "empty" ? /* @__PURE__ */ jsx3("p", { role: "status", style: { marginBottom: 0, color: "#6b6b6b" }, children: "We couldn\u2019t find an order for that number." }) : null,
711
- runtime.phase === "error" ? /* @__PURE__ */ jsx3("p", { role: "alert", style: { marginBottom: 0, color: "#b42318" }, children: "We couldn\u2019t retrieve this order right now. Please try again later." }) : null,
712
- /* @__PURE__ */ jsx3("small", { style: { display: "block", marginTop: 10, color: "#8a8a8a", fontSize: 8, textAlign: "right" }, children: "Powered by BestTrack" })
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__ */ jsx3("p", { style: { margin: 0, color: "#6b6b6b" }, children: "Package contents are not available for this shipment." });
743
- return /* @__PURE__ */ jsx3("div", { style: { display: "grid", gap: 16 }, children: items.map((item) => /* @__PURE__ */ jsxs3("article", { style: { display: "flex", alignItems: "flex-start", gap: 14 }, children: [
744
- /* @__PURE__ */ jsx3(ProductImage2, { src: item.imageUrl, alt: item.title }),
745
- /* @__PURE__ */ jsxs3("div", { children: [
746
- /* @__PURE__ */ jsx3("strong", { children: item.title }),
747
- /* @__PURE__ */ jsx3("p", { style: { margin: "5px 0", color: "#6b6b6b", fontSize: 14 }, children: item.description ?? "Product details are available in your order." }),
748
- /* @__PURE__ */ jsxs3("small", { style: { color: "#6b6b6b" }, children: [
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__ */ jsx3("input", { "aria-label": "Branded text", value: typeof value === "string" ? value : "", onChange: (event) => onChange(event.target.value) });
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__ */ jsx3("span", { "data-branded-editor-field": name, children: value });
791
- return /* @__PURE__ */ jsx3(
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: { display: "inline-block", width: "100%", minWidth: "5ch", boxSizing: "border-box", border: "1px dashed currentColor", borderRadius: 3, padding: "2px 5px", background: "transparent", color: "inherit", font: "inherit", fontWeight: "inherit", lineHeight: "inherit", letterSpacing: "inherit", textAlign: "inherit" }
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__ */ jsx3("section", { "aria-label": "Branded editor preview", style: { ...cardStyle, outline: block.selected ? "2px solid #2563eb" : "1px dashed #cbd5e1", outlineOffset: -2, padding: 24 }, children });
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__ */ jsx3("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__ */ jsx3(InlineText2, { block, name: "message", fallback: "Check out our summer sale" }) });
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__ */ jsxs3("section", { "aria-label": "Branded tracking experience editor", style: { background: "#fffdf0", fontFamily: "var(--pb-font-family)" }, children: [
813
- /* @__PURE__ */ jsx3("div", { style: { ...contentWidth2, minHeight: 56, display: "flex", alignItems: "center", gap: 8, overflowX: "auto" }, children: labels.map((shipment, index) => /* @__PURE__ */ jsx3("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)) }),
814
- /* @__PURE__ */ jsx3("div", { style: { minHeight: 360, display: "grid", placeItems: "center", padding: 16, background: "linear-gradient(135deg, #dedbd4, #b9b3aa)" }, children: /* @__PURE__ */ jsxs3(EditorSurface, { block, children: [
815
- /* @__PURE__ */ jsx3("h1", { style: { margin: "0 0 28px", textAlign: "center", fontSize: 32 }, children: /* @__PURE__ */ jsx3(InlineText2, { block, name: "heading", fallback: "Track your order" }) }),
816
- /* @__PURE__ */ jsxs3("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", borderBottom: "1px solid #e7e7e7", marginBottom: 20, textAlign: "center" }, children: [
817
- /* @__PURE__ */ jsx3("span", { style: { padding: 10 }, children: "Order Number" }),
818
- /* @__PURE__ */ jsx3("strong", { style: { padding: 10, borderBottom: "2px solid #0a0a0a" }, children: "Tracking Number" })
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__ */ jsx3("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: { width: "100%", height: 44, boxSizing: "border-box", padding: "0 12px", border: block.selected ? "1px dashed #0a0a0a" : "1px solid #e2e2e2", borderRadius: 10, background: "#fff", font: "inherit" } }),
821
- /* @__PURE__ */ jsx3("div", { style: { display: "grid", placeItems: "center", minHeight: 46, marginTop: 16, borderRadius: 10, background: "#000", color: "#fff", fontWeight: 700 }, children: /* @__PURE__ */ jsx3(InlineText2, { block, name: "submitLabel", fallback: "Track" }) }),
822
- /* @__PURE__ */ jsx3("small", { style: { display: "block", marginTop: 10, color: "#8a8a8a", fontSize: 9, textAlign: "right" }, children: "Powered by BestTrack" })
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__ */ jsx3(BrandedTrackingExperienceEditor, { ...block });
2088
+ return /* @__PURE__ */ jsx5(BrandedTrackingExperienceEditor, { ...block });
828
2089
  }
829
2090
  function BrandedOrderItemsEditor(block) {
830
- return /* @__PURE__ */ jsxs3(EditorSurface, { block, children: [
831
- /* @__PURE__ */ jsx3("h2", { style: { margin: 0 }, children: /* @__PURE__ */ jsx3(InlineText2, { block, name: "heading", fallback: "What's Inside" }) }),
832
- /* @__PURE__ */ jsx3("p", { style: { color: "#6b6b6b" }, children: "Package contents appear after a consumer tracking query." })
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__ */ jsxs3(EditorSurface, { block, children: [
837
- /* @__PURE__ */ jsx3("h2", { style: { margin: 0, textAlign: "center" }, children: /* @__PURE__ */ jsx3(InlineText2, { block, name: "heading", fallback: "You might also like" }) }),
838
- /* @__PURE__ */ jsx3("p", { style: { color: "#6b6b6b", textAlign: "center" }, children: "Recommendations appear with the active shipment." })
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__ */ jsxs3(EditorSurface, { block, children: [
843
- /* @__PURE__ */ jsx3("h2", { children: /* @__PURE__ */ jsx3(InlineText2, { block, name: "heading", fallback: "Need help?" }) }),
844
- /* @__PURE__ */ jsxs3("div", { style: { display: "flex", gap: 20 }, children: [
845
- /* @__PURE__ */ jsx3(InlineText2, { block, name: "primaryLabel", fallback: "Shipping help" }),
846
- /* @__PURE__ */ jsx3(InlineText2, { block, name: "secondaryLabel", fallback: "Contact us" })
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__ */ jsxs3(EditorSurface, { block, children: [
852
- /* @__PURE__ */ jsx3("h2", { children: /* @__PURE__ */ jsx3(InlineText2, { block, name: "heading", fallback: "From our journal" }) }),
853
- /* @__PURE__ */ jsxs3("article", { children: [
854
- /* @__PURE__ */ jsx3("strong", { children: /* @__PURE__ */ jsx3(InlineText2, { block, name: "articleTitle", fallback: "Delivery tips for every season" }) }),
855
- /* @__PURE__ */ jsx3("p", { children: /* @__PURE__ */ jsx3(InlineText2, { block, name: "excerpt", fallback: "Simple ways to make every delivery feel considered." }) }),
856
- /* @__PURE__ */ jsx3(InlineText2, { block, name: "linkLabel", fallback: "Read the story" })
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__ */ jsx3("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: /* @__PURE__ */ jsx3("a", { href: safeHref2(props.href), style: { color: "inherit", textDecoration: "none" }, children: message }) });
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
- const runtime = useBrandedRuntime();
867
- return /* @__PURE__ */ jsxs3("section", { "aria-label": "Branded tracking experience", style: { background: "#fffdf0", fontFamily: "var(--pb-font-family)" }, children: [
868
- /* @__PURE__ */ jsx3(ShipmentSwitcher, { shipmentLabels: props.shipmentLabels }),
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__ */ jsxs3("section", { "aria-label": "Branded tracking query", style: { background: "#fffdf0", fontFamily: "var(--pb-font-family)" }, children: [
874
- /* @__PURE__ */ jsx3(ShipmentSwitcher, { shipmentLabels: props.shipmentLabels }),
875
- /* @__PURE__ */ jsx3(QueryHero, { ...props })
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__ */ jsx3("section", { "aria-label": title, style: { background: "#fffdf0", color: "#0a0a0a", fontFamily: "var(--pb-font-family)", padding: "clamp(28px, 4vw, 48px) 0" }, children: /* @__PURE__ */ jsxs3("div", { style: contentWidth2, children: [
883
- /* @__PURE__ */ jsxs3("h2", { style: { margin: "0 0 20px", fontSize: 20 }, children: [
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__ */ jsx3(PackageContents2, { items }) : /* @__PURE__ */ jsx3("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." })
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
- return /* @__PURE__ */ jsxs3("article", { style: { overflow: "hidden", borderRadius: 6, background: "#fff", boxShadow: "0 1px 2px rgb(0 0 0 / 8%)" }, children: [
893
- /* @__PURE__ */ jsx3(ProductImage2, { src: item.imageUrl, alt: item.title }),
894
- /* @__PURE__ */ jsxs3("div", { style: { padding: 14 }, children: [
895
- /* @__PURE__ */ jsx3("strong", { children: item.title }),
896
- item.price ? /* @__PURE__ */ jsx3("p", { style: { margin: "6px 0", fontWeight: 700 }, children: item.price }) : null,
897
- /* @__PURE__ */ jsx3("p", { style: { margin: "6px 0", color: "#6b6b6b", fontSize: 13 }, children: item.description }),
898
- href === "#" ? /* @__PURE__ */ jsx3("span", { style: { color: "#6b6b6b", fontSize: 13, fontWeight: 700 }, children: "View product" }) : /* @__PURE__ */ jsx3("a", { href, style: { color: "#0a0a0a", fontSize: 13, fontWeight: 700 }, children: "View product" })
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__ */ jsx3("section", { "aria-label": title, style: { background: "#fffdf0", color: "#0a0a0a", fontFamily: "var(--pb-font-family)", padding: "clamp(28px, 4vw, 48px) 0" }, children: /* @__PURE__ */ jsxs3("div", { style: contentWidth2, children: [
908
- /* @__PURE__ */ jsx3("h2", { style: { margin: "0 0 24px", textAlign: "center", fontSize: 20 }, children: title }),
909
- runtime.phase === "loading" ? /* @__PURE__ */ jsx3("div", { "aria-label": "Loading recommendations", style: { display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(220px, 1fr))", gap: 16 }, children: [0, 1, 2].map((item) => /* @__PURE__ */ jsx3("span", { style: { display: "block", height: 220, borderRadius: 6, background: "#e7e7e7" } }, item)) }) : runtime.phase === "success" && recommendations.length ? /* @__PURE__ */ jsx3("div", { style: { display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(220px, 1fr))", gap: 16 }, children: recommendations.map((item) => /* @__PURE__ */ jsx3(RecommendationCard, { item }, item.id)) }) : /* @__PURE__ */ jsx3("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." })
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
- return /* @__PURE__ */ jsxs3("section", { "aria-label": title, style: { ...cardStyle, margin: "24px auto", maxWidth: 1200, padding: 24 }, children: [
915
- /* @__PURE__ */ jsx3("h2", { children: title }),
916
- /* @__PURE__ */ jsxs3("div", { style: { display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(180px, 1fr))", gap: 16 }, children: [
917
- /* @__PURE__ */ jsx3("a", { href: safeHref2(props.primaryHref), style: { color: "#0a0a0a" }, children: text3(props, "primaryLabel", "Shipping help") }),
918
- /* @__PURE__ */ jsx3("a", { href: safeHref2(props.secondaryHref), style: { color: "#0a0a0a" }, children: text3(props, "secondaryLabel", "Contact us") })
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
- return /* @__PURE__ */ jsxs3("section", { "aria-label": title, style: { ...cardStyle, margin: "24px auto", maxWidth: 1200, padding: 24 }, children: [
925
- /* @__PURE__ */ jsx3("h2", { children: title }),
926
- /* @__PURE__ */ jsxs3("article", { children: [
927
- /* @__PURE__ */ jsx3("strong", { children: text3(props, "articleTitle", "Delivery tips for every season") }),
928
- /* @__PURE__ */ jsx3("p", { children: text3(props, "excerpt", "Simple ways to make every delivery feel considered.") }),
929
- /* @__PURE__ */ jsx3("a", { href: safeHref2(props.articleHref), style: { color: "#0a0a0a" }, children: text3(props, "linkLabel", "Read the story") })
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 brandedBlocks = [
937
- { type: "besttrack.branded.announcement", version: 1, label: "Announcement", category: "BestTrack Branded", targets: ["web"], defaultProps: { message: "Check out our summer sale", href: "/collections/sale" }, defaultVariant: "brand", variants: [{ id: "brand", label: "Brand" }, { id: "minimal", label: "Minimal", theme: { "color.primary": "#202223" } }], fields: { message: text4("Announcement", { control: "textarea" }), href: text4("Announcement URL", { control: "url" }) }, render: { web: BrandedAnnouncementBlock, editor: BrandedAnnouncementEditor } },
938
- { 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", defaultQueryMode: "tracking", 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"), defaultQueryMode: text4("Default query mode"), shipmentLabels: text4("Shipment labels (separate with |)"), heroImageUrl: text4("Hero image URL", { control: "url" }) }, render: { web: BrandedTrackingExperienceBlock, editor: BrandedTrackingExperienceEditor } },
939
- { type: "besttrack.branded.query", version: 1, label: "Order query", category: "BestTrack Branded", targets: ["web"], defaultProps: { heading: "Track your order", submitLabel: "Track", defaultTrackingNumber: "DEMO-YQTRACK9999", defaultQueryMode: "tracking", 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"), defaultQueryMode: text4("Default query mode"), shipmentLabels: text4("Shipment labels (separate with |)"), heroImageUrl: text4("Hero image URL", { control: "url" }) }, render: { web: BrandedQueryBlock, editor: BrandedQueryEditor } },
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: text4("Primary link URL", { control: "url" }), secondaryLabel: text4("Secondary link label"), secondaryHref: text4("Secondary link URL", { control: "url" }) }, render: { web: BrandedQuickLinksBlock, editor: BrandedQuickLinksEditor } },
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: text4("Article URL", { control: "url" }), linkLabel: text4("Link label") }, render: { web: BrandedBlogBlock, editor: BrandedBlogEditor } }
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) => !["besttrack.branded.query", "besttrack.branded.order-items"].includes(block.type));
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.7.1", fields: [{ type: "besttrack.branded.text", component: BrandedTextField }], blocks: brandedBlocks, templates: [createBrandedTemplate()] });
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, useId, useMemo as useMemo3, useRef as useRef2, useState as useState4 } from "react";
956
- import { Fragment as Fragment2, jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
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
- var trackingNumberPattern = /^[A-Za-z0-9-]{4,64}$/;
966
- function SalesRuntimeProvider({ children, queryTracking }) {
967
- const [state, setState] = useState4({ phase: "idle" });
968
- const requestId = useRef2(0);
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
- const result = await queryTracking(trackingNumber);
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
- }, [queryTracking]);
981
- const value = useMemo3(() => ({ ...state, query }), [query, state]);
982
- return /* @__PURE__ */ jsx4(SalesRuntimeContext.Provider, { value, children });
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
- function hasControlCharacter(value) {
992
- return [...value].some((character) => character.charCodeAt(0) < 32);
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__ */ jsx4("p", { role: alert ? "alert" : "status", "aria-live": alert ? "assertive" : "polite", style: { margin: "16px 0 0", color: alert ? "#a61b1b" : "var(--pb-color-muted)" }, children });
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__ */ jsx4("section", { "aria-label": title, "aria-busy": busy || void 0, style: sectionStyle, children: /* @__PURE__ */ jsxs4("div", { style: panelStyle, children: [
1021
- /* @__PURE__ */ jsx4("h2", { style: { margin: "0 0 20px", fontSize: "clamp(24px, 3vw, 34px)", lineHeight: 1.15 }, children: title }),
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] = useState4(false);
2282
+ const [failed, setFailed] = useState5(false);
1027
2283
  const safeSrc = safeImageUrl3(src);
1028
- if (!safeSrc || failed) return /* @__PURE__ */ jsx4("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() });
1029
- return /* @__PURE__ */ jsx4("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)" } });
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] = useState4(false);
2288
+ const [failed, setFailed] = useState5(false);
1033
2289
  const safeSrc = safeImageUrl3(src);
1034
2290
  if (!safeSrc || failed) return null;
1035
- return /* @__PURE__ */ jsx4("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 } });
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__ */ jsx4("input", { "aria-label": "Sales text", value: typeof value === "string" ? value : "", onChange: (event) => onChange(event.target.value) });
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__ */ jsx4("span", { "data-sales-editor-field": name, style, children: value });
1048
- return /* @__PURE__ */ jsx4("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: { boxSizing: "border-box", width: "100%", border: "1px dashed currentColor", borderRadius: 3, padding: "2px 5px", background: "transparent", color: "inherit", font: "inherit", fontWeight: "inherit", lineHeight: "inherit", textAlign: "inherit", ...style } });
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__ */ jsx4("section", { "aria-label": "Sales editor preview", style: { ...editorSurfaceStyle, outline: block.selected ? "2px solid #2563eb" : void 0, outlineOffset: -2 }, children });
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__ */ jsx4("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__ */ jsx4(SalesInlineText, { block, name: "message", fallback: "Free delivery on orders over $50" }) });
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__ */ jsxs4("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: [
1060
- imageUrl ? /* @__PURE__ */ jsx4("img", { src: imageUrl, alt: "", "aria-hidden": "true", style: { position: "absolute", inset: 0, width: "100%", height: "100%", objectFit: "cover", opacity: 0.62 } }) : null,
1061
- /* @__PURE__ */ jsx4("div", { "aria-hidden": "true", style: { position: "absolute", inset: 0, background: "rgb(0 0 0 / 42%)" } }),
1062
- /* @__PURE__ */ jsxs4("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: [
1063
- /* @__PURE__ */ jsx4("h1", { style: { margin: "0 0 28px", fontSize: "clamp(32px, 5vw, 48px)", fontWeight: 800, letterSpacing: "-0.035em", lineHeight: 1.02, textAlign: "center" }, children: /* @__PURE__ */ jsx4(SalesInlineText, { block, name: "heading", fallback: "Track your order" }) }),
1064
- /* @__PURE__ */ jsx4("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 } }),
1065
- /* @__PURE__ */ jsx4("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__ */ jsx4(SalesInlineText, { block, name: "submitLabel", fallback: "Track order" }) }),
1066
- /* @__PURE__ */ jsx4("small", { style: { display: "block", marginTop: 14, color: "#6b6b6b", fontSize: 11, textAlign: "right" }, children: "Powered by BestTrack" })
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__ */ jsxs4(SalesEditorSurface, { block, children: [
1072
- /* @__PURE__ */ jsx4("h2", { style: { margin: "0 0 20px" }, children: /* @__PURE__ */ jsx4(SalesInlineText, { block, name: "heading", fallback: "Items in your order" }) }),
1073
- /* @__PURE__ */ jsxs4("article", { style: { ...editorCardStyle, display: "flex", alignItems: "center", gap: 14 }, children: [
1074
- /* @__PURE__ */ jsx4("span", { "aria-hidden": "true", style: { width: 68, height: 68, borderRadius: 7, background: "#dfddd7" } }),
1075
- /* @__PURE__ */ jsxs4("span", { children: [
1076
- /* @__PURE__ */ jsx4("strong", { children: "Order item" }),
1077
- /* @__PURE__ */ jsx4("br", {}),
1078
- /* @__PURE__ */ jsx4("small", { style: { color: "#6b6b6b" }, children: "Items appear after a successful tracking query." })
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__ */ jsxs4(SalesEditorSurface, { block, children: [
1085
- /* @__PURE__ */ jsx4("h2", { style: { margin: "0 0 20px" }, children: /* @__PURE__ */ jsx4(SalesInlineText, { block, name: "heading", fallback: "Other shipments" }) }),
1086
- /* @__PURE__ */ jsx4("p", { style: { margin: 0, color: "#6b6b6b" }, children: /* @__PURE__ */ jsx4(SalesInlineText, { block, name: "emptyMessage", fallback: "No other shipments are linked to this order." }) })
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__ */ jsxs4(SalesEditorSurface, { block, children: [
1091
- /* @__PURE__ */ jsx4("h2", { style: { margin: "0 0 20px" }, children: /* @__PURE__ */ jsx4(SalesInlineText, { block, name: "heading", fallback: "Shop with confidence" }) }),
1092
- /* @__PURE__ */ jsxs4("div", { style: { display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(min(100%, 180px), 1fr))", gap: 14 }, children: [
1093
- /* @__PURE__ */ jsxs4("article", { style: editorCardStyle, children: [
1094
- /* @__PURE__ */ jsx4("strong", { children: /* @__PURE__ */ jsx4(SalesInlineText, { block, name: "firstTitle", fallback: "Easy returns" }) }),
1095
- /* @__PURE__ */ jsx4("p", { style: { marginBottom: 0, color: "#6b6b6b" }, children: /* @__PURE__ */ jsx4(SalesInlineText, { block, name: "firstDescription", fallback: "Simple support when plans change." }) })
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__ */ jsxs4("article", { style: editorCardStyle, children: [
1098
- /* @__PURE__ */ jsx4("strong", { children: /* @__PURE__ */ jsx4(SalesInlineText, { block, name: "secondTitle", fallback: "Secure delivery" }) }),
1099
- /* @__PURE__ */ jsx4("p", { style: { marginBottom: 0, color: "#6b6b6b" }, children: /* @__PURE__ */ jsx4(SalesInlineText, { block, name: "secondDescription", fallback: "Follow every milestone in one place." }) })
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
- return /* @__PURE__ */ jsxs4(SalesEditorSurface, { block, children: [
1106
- /* @__PURE__ */ jsx4("h2", { style: { margin: "0 0 20px" }, children: /* @__PURE__ */ jsx4(SalesInlineText, { block, name: "heading", fallback: "Shop by category" }) }),
1107
- /* @__PURE__ */ jsxs4("div", { style: { ...editorCardStyle, display: "flex", justifyContent: "space-between", fontWeight: 700 }, children: [
1108
- /* @__PURE__ */ jsx4(SalesInlineText, { block, name: "collectionLabel", fallback: "Featured collection" }),
1109
- /* @__PURE__ */ jsx4("span", { "aria-hidden": "true", children: "\u2192" })
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__ */ jsxs4(SalesEditorSurface, { block, children: [
1115
- /* @__PURE__ */ jsx4("h2", { style: { margin: "0 0 20px" }, children: /* @__PURE__ */ jsx4(SalesInlineText, { block, name: "heading", fallback: "Complete your order" }) }),
1116
- /* @__PURE__ */ jsx4("div", { style: { ...editorCardStyle, color: "#6b6b6b" }, children: "Recommended products appear after a successful tracking query." })
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__ */ jsx4("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__ */ jsx4("strong", { children: text5(props, "message", "Free delivery on orders over $50") }) });
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
- const inputId = useId();
1125
- const errorId = useId();
1126
- const [trackingNumber, setTrackingNumber] = useState4(text5(props, "defaultTrackingNumber", "BT-2048-DEMO"));
1127
- const [inputError, setInputError] = useState4(null);
1128
- const submit = (event) => {
1129
- event.preventDefault();
1130
- const normalizedTrackingNumber = trackingNumber.trim();
1131
- if (!trackingNumberPattern.test(normalizedTrackingNumber)) {
1132
- setInputError("Enter a tracking number using 4\u201364 letters, numbers, or hyphens.");
1133
- return;
1134
- }
1135
- setInputError(null);
1136
- void runtime.query(normalizedTrackingNumber);
1137
- };
1138
- const description = inputError ?? (runtime.phase === "empty" ? "We couldn\u2019t find an order for that number." : runtime.phase === "error" ? "We couldn\u2019t retrieve this order right now. Please try again later." : void 0);
1139
- return /* @__PURE__ */ jsxs4("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)", placeItems: "center", 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: [
1140
- /* @__PURE__ */ jsx4(HeroAsset, { src: props.heroImageUrl }),
1141
- /* @__PURE__ */ jsx4("div", { "aria-hidden": "true", style: { position: "absolute", inset: 0, background: "rgb(0 0 0 / 42%)" } }),
1142
- /* @__PURE__ */ jsxs4("div", { "data-sales-query-card": true, style: { position: "relative", zIndex: 1, boxSizing: "border-box", width: "min(560px, 100%)", 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%)" }, children: [
1143
- /* @__PURE__ */ jsx4("h1", { style: { margin: "0 0 28px", color: "var(--pb-color-text)", fontSize: "clamp(32px, 5vw, 48px)", fontWeight: 800, letterSpacing: "-0.035em", lineHeight: 1.02, textAlign: "center" }, children: text5(props, "heading", "Track an order") }),
1144
- /* @__PURE__ */ jsxs4("form", { noValidate: true, onSubmit: submit, style: { display: "grid", gap: 14 }, children: [
1145
- /* @__PURE__ */ jsx4("label", { htmlFor: inputId, style: { position: "absolute", width: 1, height: 1, padding: 0, margin: -1, overflow: "hidden", clip: "rect(0, 0, 0, 0)", whiteSpace: "nowrap", border: 0 }, children: "Tracking number" }),
1146
- /* @__PURE__ */ jsx4("input", { id: inputId, "aria-describedby": description ? errorId : void 0, "aria-invalid": Boolean(inputError) || void 0, "aria-label": "Sales tracking number", value: trackingNumber, onChange: (event) => {
1147
- setTrackingNumber(event.target.value);
1148
- if (inputError) setInputError(null);
1149
- }, inputMode: "text", autoComplete: "off", pattern: "[A-Za-z0-9-]{4,64}", minLength: 4, maxLength: 64, required: true, placeholder: "Enter your tracking number", style: { 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 } }),
1150
- /* @__PURE__ */ jsx4("button", { type: "submit", disabled: runtime.phase === "loading", style: { width: "100%", minHeight: 58, padding: "12px 18px", border: 0, borderRadius: "calc(var(--pb-radius) / 1.25)", background: "var(--pb-color-text)", color: "var(--pb-color-surface)", font: "inherit", fontSize: 16, fontWeight: 700, cursor: runtime.phase === "loading" ? "wait" : "pointer" }, children: runtime.phase === "loading" ? "Checking\u2026" : text5(props, "submitLabel", "Track order") })
1151
- ] }),
1152
- runtime.phase === "loading" ? /* @__PURE__ */ jsx4(Status, { children: "Checking your order\u2026" }) : null,
1153
- inputError ? /* @__PURE__ */ jsx4("p", { id: errorId, role: "alert", children: inputError }) : null,
1154
- !inputError && runtime.phase === "empty" ? /* @__PURE__ */ jsx4("p", { id: errorId, role: "status", children: "We couldn\u2019t find an order for that number." }) : null,
1155
- !inputError && runtime.phase === "error" ? /* @__PURE__ */ jsx4("p", { id: errorId, role: "alert", children: "We couldn\u2019t retrieve this order right now. Please try again later." }) : null,
1156
- /* @__PURE__ */ jsx4("small", { style: { display: "block", marginTop: 14, color: "var(--pb-color-muted)", fontSize: 11, textAlign: "right" }, children: "Powered by BestTrack" })
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__ */ jsx4(Section, { title, busy: runtime.phase === "loading", children: runtime.phase === "error" ? /* @__PURE__ */ jsx4(Status, { alert: true, children: "Order items are temporarily unavailable." }) : runtime.phase === "empty" ? /* @__PURE__ */ jsx4(Status, { children: "No order items are available for that number." }) : runtime.phase === "success" && items.length ? /* @__PURE__ */ jsx4("ul", { style: { display: "grid", gap: 12, margin: 0, padding: 0, listStyle: "none" }, children: items.map((item) => {
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__ */ jsx4("a", { href, style: { color: "inherit" }, children: itemTitle }) : itemTitle;
1168
- return /* @__PURE__ */ jsxs4("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: [
1169
- /* @__PURE__ */ jsx4(ProductImage3, { src: item.imageUrl, alt: itemTitle }),
1170
- /* @__PURE__ */ jsxs4("span", { style: { minWidth: 0 }, children: [
1171
- /* @__PURE__ */ jsx4("strong", { children: itemContent }),
1172
- /* @__PURE__ */ jsx4("br", {}),
1173
- /* @__PURE__ */ jsxs4("small", { style: { color: "var(--pb-color-muted)" }, children: [
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__ */ jsxs4(Fragment2, { children: [
1178
- /* @__PURE__ */ jsx4("br", {}),
1179
- /* @__PURE__ */ jsx4("small", { style: { color: "var(--pb-color-muted)" }, children: item.description })
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__ */ jsx4(Status, { children: runtime.phase === "loading" ? "Loading order items\u2026" : "Order items appear after a successful query." }) });
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__ */ jsx4(Section, { title, busy: runtime.phase === "loading", children: runtime.phase === "error" ? /* @__PURE__ */ jsx4(Status, { alert: true, children: "Additional shipments are unavailable." }) : runtime.phase === "empty" ? /* @__PURE__ */ jsx4(Status, { children: "No additional shipments are available for that number." }) : runtime.phase === "success" && shipments.length ? /* @__PURE__ */ jsx4("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__ */ jsxs4("li", { style: { padding: 16, border: "1px solid var(--pb-color-border)", borderRadius: "calc(var(--pb-radius) / 1.5)", background: "var(--pb-color-background)" }, children: [
1190
- /* @__PURE__ */ jsx4("strong", { children: text5(shipment, "label", "Shipment") }),
1191
- shipment.status ? /* @__PURE__ */ jsx4("p", { style: { margin: "8px 0 0", color: "var(--pb-color-muted)" }, children: shipment.status }) : null,
1192
- shipment.trackingNumber ? /* @__PURE__ */ jsx4("small", { style: { display: "block", marginTop: 8, color: "var(--pb-color-muted)" }, children: shipment.trackingNumber }) : null
1193
- ] }, shipment.id)) }) : runtime.phase === "success" ? /* @__PURE__ */ jsx4(Status, { children: text5(props, "emptyMessage", "No other shipments are linked to this order.") }) : /* @__PURE__ */ jsx4(Status, { children: runtime.phase === "loading" ? "Loading other shipments\u2026" : "Other tracking numbers appear with your order result." }) });
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__ */ jsx4(Section, { title, children: /* @__PURE__ */ jsxs4("div", { style: gridStyle, children: [
1198
- /* @__PURE__ */ jsxs4("article", { style: { padding: 20, border: "1px solid var(--pb-color-border)", borderRadius: "calc(var(--pb-radius) / 1.5)", background: "var(--pb-color-background)" }, children: [
1199
- /* @__PURE__ */ jsx4("strong", { children: text5(props, "firstTitle", "Easy returns") }),
1200
- /* @__PURE__ */ jsx4("p", { style: { marginBottom: 0, color: "var(--pb-color-muted)" }, children: text5(props, "firstDescription", "Simple support when plans change.") })
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__ */ jsxs4("article", { style: { padding: 20, border: "1px solid var(--pb-color-border)", borderRadius: "calc(var(--pb-radius) / 1.5)", background: "var(--pb-color-background)" }, children: [
1203
- /* @__PURE__ */ jsx4("strong", { children: text5(props, "secondTitle", "Secure delivery") }),
1204
- /* @__PURE__ */ jsx4("p", { style: { marginBottom: 0, color: "var(--pb-color-muted)" }, children: text5(props, "secondDescription", "Follow every milestone in one place.") })
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 state = resourceState(props.collectionId);
1211
- const href = safeHref3(props.collectionHref);
1212
- return /* @__PURE__ */ jsx4(Section, { title, children: state === "invalid" ? /* @__PURE__ */ jsx4(Status, { alert: true, children: "Collection reference is invalid." }) : state === "empty" ? /* @__PURE__ */ jsx4(Status, { children: "No collection selected. Choose a collection through an authorized resource integration." }) : href ? /* @__PURE__ */ jsxs4("a", { href, style: { display: "flex", alignItems: "center", justifyContent: "space-between", minHeight: 74, boxSizing: "border-box", padding: "14px 18px", border: "1px solid var(--pb-color-border)", borderRadius: "calc(var(--pb-radius) / 1.5)", background: "var(--pb-color-background)", color: "var(--pb-color-text)", fontWeight: 700, textDecoration: "none" }, children: [
1213
- /* @__PURE__ */ jsx4("span", { children: text5(props, "collectionLabel", "Featured collection") }),
1214
- /* @__PURE__ */ jsx4("span", { "aria-hidden": "true", children: "\u2192" })
1215
- ] }) : /* @__PURE__ */ jsx4(Status, { alert: true, children: "Collection link is unavailable." }) });
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__ */ jsx4(Section, { title, busy: runtime.phase === "loading", children: runtime.phase === "error" ? /* @__PURE__ */ jsx4(Status, { alert: true, children: "Recommendations are temporarily unavailable." }) : runtime.phase === "empty" ? /* @__PURE__ */ jsx4(Status, { children: "No recommendations are available for that number." }) : runtime.phase === "success" && recommendations.length ? /* @__PURE__ */ jsx4("div", { style: gridStyle, children: recommendations.map((item) => {
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
- return /* @__PURE__ */ jsxs4("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: [
1225
- /* @__PURE__ */ jsx4(ProductImage3, { src: item.imageUrl, alt: itemTitle }),
1226
- /* @__PURE__ */ jsxs4("div", { children: [
1227
- /* @__PURE__ */ jsx4("strong", { children: href ? /* @__PURE__ */ jsx4("a", { href, style: { color: "inherit" }, children: itemTitle }) : itemTitle }),
1228
- item.price ? /* @__PURE__ */ jsx4("small", { style: { display: "block", marginTop: 5, color: "var(--pb-color-muted)" }, children: item.price }) : null,
1229
- item.description ? /* @__PURE__ */ jsx4("p", { style: { marginBottom: 0, color: "var(--pb-color-muted)" }, children: item.description }) : null
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__ */ jsx4(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." }) });
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" || !trackingNumberPattern2.test(trackingNumber)) issues.push({ path: "props.defaultTrackingNumber", message: "Use 4\u201364 letters, numbers, or hyphens. Use a non-sensitive preview placeholder only." });
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
- if (typeof value !== "string") return false;
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], ["collectionId", 256], ["collectionLabel", 120]])(props);
1282
- if (!safeLink(props.collectionHref)) issues.push({ path: "props.collectionHref", message: "Use a site-relative path or HTTPS URL." });
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
- var salesBlocks = [
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: 1, label: "Product categories", category: "BestTrack Sales", targets: ["web"], defaultProps: { heading: "Shop by category", collectionId: "gid://shopify/Collection/featured", collectionLabel: "Featured collection", collectionHref: "/collections/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"), collectionId: text6("Collection ID", { group: "Resource", description: "JSON-only reference selected by an authorized integration." }), collectionLabel: shortText("Collection label"), collectionHref: link("Collection URL") }, validate: validateCategories, render: { web: SalesProductCategoriesBlock, editor: SalesProductCategoriesEditor } },
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: 1, 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: 1, 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: {} })) }) };
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.7.2", fields: [{ type: "besttrack.sales.text", component: SalesTextField }], blocks: salesBlocks, templates: [createSalesTemplate()] });
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
- isEmptyTrackingPageResult
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
  };