@infuro/cms-core 1.0.33 → 1.0.35

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.
Files changed (164) hide show
  1. package/README.md +22 -6
  2. package/dist/OrderTrackPage-W3J6WIG2.js +426 -0
  3. package/dist/OrderTrackPage-Z6FCJQYY.cjs +428 -0
  4. package/dist/admin.cjs +34072 -20487
  5. package/dist/admin.d.cts +191 -9
  6. package/dist/admin.d.ts +191 -9
  7. package/dist/admin.js +33913 -20423
  8. package/dist/api.cjs +123 -16508
  9. package/dist/api.d.cts +633 -3
  10. package/dist/api.d.ts +633 -3
  11. package/dist/api.js +14 -16519
  12. package/dist/auth.cjs +196 -955
  13. package/dist/auth.d.cts +201 -42
  14. package/dist/auth.d.ts +201 -42
  15. package/dist/auth.js +4 -888
  16. package/dist/chunk-2XE4X74C.js +29602 -0
  17. package/dist/chunk-3DZRIZOD.cjs +52 -0
  18. package/dist/chunk-3KPNTQBV.cjs +620 -0
  19. package/dist/chunk-46GKADYE.cjs +84 -0
  20. package/dist/chunk-4TRPKBKO.js +589 -0
  21. package/dist/chunk-5ELSW2UP.js +150 -0
  22. package/dist/chunk-6KPQWRFW.js +171 -0
  23. package/dist/chunk-7NMT3GBR.cjs +29 -0
  24. package/dist/chunk-7YIBMQDR.cjs +86 -0
  25. package/dist/chunk-BGJAV67S.cjs +29710 -0
  26. package/dist/chunk-CNTSLED2.cjs +559 -0
  27. package/dist/chunk-CRFV5WJK.js +16 -0
  28. package/dist/chunk-D5FBNKQM.cjs +104 -0
  29. package/dist/chunk-EF2JBPDM.js +114 -0
  30. package/dist/chunk-EQPITOP6.js +543 -0
  31. package/dist/chunk-GO7PPYNU.js +76 -0
  32. package/dist/chunk-HF3L2GIT.cjs +194 -0
  33. package/dist/chunk-J7XHLOLO.js +830 -0
  34. package/dist/chunk-JBRR5UYL.js +87 -0
  35. package/dist/chunk-JC6DLWTE.js +21 -0
  36. package/dist/chunk-JHF4YYRC.cjs +188 -0
  37. package/dist/chunk-JXF23MPG.js +25 -0
  38. package/dist/chunk-MQBT33IV.js +48 -0
  39. package/dist/chunk-N44BJZ4C.cjs +123 -0
  40. package/dist/chunk-OOTLNH63.cjs +18 -0
  41. package/dist/chunk-PAMVINEX.cjs +577 -0
  42. package/dist/chunk-PNOKNSG2.cjs +222 -0
  43. package/dist/chunk-QM733NUK.js +186 -0
  44. package/dist/chunk-R73BKDRO.cjs +90 -0
  45. package/dist/chunk-SHUYVCID.js +4 -0
  46. package/dist/chunk-SYBOCAWB.js +97 -0
  47. package/dist/chunk-TDV6EJHV.js +192 -0
  48. package/dist/chunk-TFUOHI37.cjs +839 -0
  49. package/dist/chunk-TIAEXJLI.cjs +182 -0
  50. package/dist/chunk-UPLVMVRX.cjs +23 -0
  51. package/dist/chunk-USNT2KNT.cjs +6 -0
  52. package/dist/chunk-WEMDMVHQ.js +216 -0
  53. package/dist/chunk-XDSNZUW7.js +564 -0
  54. package/dist/chunk-XQ3QUHWR.cjs +83 -0
  55. package/dist/chunk-XW5ATPRW.cjs +155 -0
  56. package/dist/chunk-ZQ4X6OAU.js +82 -0
  57. package/dist/chunk-ZSVCP6N3.js +83 -0
  58. package/dist/cli.cjs +142 -84
  59. package/dist/cli.js +101 -27
  60. package/dist/email-FKR4FXFI.js +5 -0
  61. package/dist/email-KVKVPNCL.cjs +58 -0
  62. package/dist/email-queue-CGZBVVAS.js +2 -0
  63. package/dist/email-queue-TPZWLTIV.cjs +23 -0
  64. package/dist/erp-config-enabled-CUMQ6N2V.cjs +11 -0
  65. package/dist/erp-config-enabled-T37X7T34.js +2 -0
  66. package/dist/erp-order-invoice-3YISSOWW.js +3 -0
  67. package/dist/erp-order-invoice-ZR5F2KTA.cjs +12 -0
  68. package/dist/event-order-defaults-6E543227.js +2 -0
  69. package/dist/event-order-defaults-DUGDVGJI.cjs +39 -0
  70. package/dist/event-order-notifications-5GSAOYVS.cjs +27 -0
  71. package/dist/event-order-notifications-IIIF23D5.js +10 -0
  72. package/dist/hooks.cjs +259 -132
  73. package/dist/hooks.d.cts +42 -1
  74. package/dist/hooks.d.ts +42 -1
  75. package/dist/hooks.js +234 -91
  76. package/dist/index.cjs +3884 -21070
  77. package/dist/index.d.cts +2255 -749
  78. package/dist/index.d.ts +2255 -749
  79. package/dist/index.js +1925 -19891
  80. package/dist/interpolate-WAKPN56R.cjs +11 -0
  81. package/dist/interpolate-WDUWDF3I.js +2 -0
  82. package/dist/layout-36UFTHC5.cjs +11 -0
  83. package/dist/layout-AOBN26XG.js +2 -0
  84. package/dist/migrations/1778660000004-CreateCustomerAndCustomerContacts.ts +99 -0
  85. package/dist/migrations/1778660000005-AddCustomerIdToVendorCustomers.ts +39 -0
  86. package/dist/migrations/1778660000006-UpdateVendorCustomersContactNullable.ts +36 -0
  87. package/dist/migrations/1778660000007-VendorOwnerCustomerContactsPermission.ts +39 -0
  88. package/dist/migrations/1779300000000-VendorOwnerContactsPermission.ts +39 -0
  89. package/dist/migrations/1779400000000-AddCustomerContactIdToOrders.ts +33 -0
  90. package/dist/migrations/1779400000000-ConvertStatusToEnum.ts +142 -0
  91. package/dist/migrations/1779400000000-SeedDefaultCurrencies.ts +33 -0
  92. package/dist/migrations/1779500000000-VendorRolesAndPermissions.ts +102 -0
  93. package/dist/migrations/1779600000000-VendorRegistrationProfile.ts +52 -0
  94. package/dist/migrations/1779700000000-CollectionIsCatalog.ts +22 -0
  95. package/dist/migrations/1779710000000-CollectionPlatformCatalog.ts +60 -0
  96. package/dist/migrations/1779720000000-ProductCategoryPlatformCatalog.ts +157 -0
  97. package/dist/migrations/1779800000000-EventsAndEventProducts.ts +173 -0
  98. package/dist/migrations/1779810000000-BackfillVendorRoleEventsPermissions.ts +38 -0
  99. package/dist/migrations/1779820000000-FixProductsCategoryForeignKey.ts +70 -0
  100. package/dist/migrations/1779830000000-ProductTitleColumn.ts +32 -0
  101. package/dist/migrations/1779840000000-EventAboutAndVisibilityFields.ts +34 -0
  102. package/dist/migrations/1779850000000-EventCityCountrySplit.ts +43 -0
  103. package/dist/migrations/1779860000000-CreateCombos.ts +140 -0
  104. package/dist/migrations/1780100000000-OrderAttendeesEventId.ts +55 -0
  105. package/dist/migrations/1780110000000-EventContactFormId.ts +49 -0
  106. package/dist/migrations/1780130000000-ProductVariants.ts +54 -0
  107. package/dist/migrations/1780140000000-EventManagementEnhancements.ts +44 -0
  108. package/dist/migrations/1780160000000-EventRegistrationGstProductContactForm.ts +79 -0
  109. package/dist/migrations/1780170000000-ComboCurrencyPrices.ts +20 -0
  110. package/dist/migrations/1781110000000-VendorOwnerCombosPermission.ts +38 -0
  111. package/dist/migrations/1781120000000-RefundPoliciesAndRequests.ts +225 -0
  112. package/dist/migrations/1781130000000-CreateAttendees.ts +44 -0
  113. package/dist/migrations/1781140000000-EventOrderNotifications.ts +29 -0
  114. package/dist/migrations/1781150000000-EventNamedLists.ts +28 -0
  115. package/dist/migrations/1781160000000-RefundPolicyEventTiers.ts +27 -0
  116. package/dist/migrations/1781170000000-EventRefundPolicy.ts +42 -0
  117. package/dist/migrations/1781180000000-RemoveCartItemsUniqueConstraint.ts +15 -0
  118. package/dist/migrations/1781190000000-RenameProductTaxesToProductConfig.ts +84 -0
  119. package/dist/migrations/1781200000000-VendorOwnerProductConfigPermissions.ts +51 -0
  120. package/dist/migrations/1781210000000-VendorRoleProductConfigPermissions.ts +46 -0
  121. package/dist/migrations/helpers/vendor-role-seed.ts +243 -0
  122. package/dist/paid-order-erp-3USEG6WL.js +3 -0
  123. package/dist/paid-order-erp-FSQ3GSXE.cjs +12 -0
  124. package/dist/pg-boss-service-4XF2TQ2E.js +2 -0
  125. package/dist/pg-boss-service-L6MTF4EQ.cjs +15 -0
  126. package/dist/razorpay-KLO2KNCB.js +49 -0
  127. package/dist/razorpay-U23LGY72.cjs +56 -0
  128. package/dist/rbac-debug-db-D7ME7QUY.cjs +35 -0
  129. package/dist/rbac-debug-db-MTCTVNNM.js +33 -0
  130. package/dist/sms-defaults-2NL24H57.js +2 -0
  131. package/dist/sms-defaults-KCOPKQBA.cjs +19 -0
  132. package/dist/stripe-4FD27QVJ.js +51 -0
  133. package/dist/stripe-VU6OEG2D.cjs +57 -0
  134. package/dist/theme.cjs +31 -59
  135. package/dist/theme.d.cts +78 -3
  136. package/dist/theme.d.ts +78 -3
  137. package/dist/theme.js +23 -20
  138. package/dist/vendor-invite-status-77O7ZQ3U.cjs +19 -0
  139. package/dist/vendor-invite-status-PWJ3DE76.js +2 -0
  140. package/dist/whatsapp-queue-3DXA4MXU.js +2 -0
  141. package/dist/whatsapp-queue-KG65MXD5.cjs +15 -0
  142. package/package.json +147 -141
  143. package/dist/admin.cjs.map +0 -1
  144. package/dist/admin.js.map +0 -1
  145. package/dist/api.cjs.map +0 -1
  146. package/dist/api.js.map +0 -1
  147. package/dist/auth.cjs.map +0 -1
  148. package/dist/auth.js.map +0 -1
  149. package/dist/cli.cjs.map +0 -1
  150. package/dist/cli.js.map +0 -1
  151. package/dist/config-DJ5CmQvS.d.cts +0 -8
  152. package/dist/config-DJ5CmQvS.d.ts +0 -8
  153. package/dist/hooks.cjs.map +0 -1
  154. package/dist/hooks.js.map +0 -1
  155. package/dist/index-DWd5Gjc4.d.ts +0 -582
  156. package/dist/index-rZTnpK7y.d.cts +0 -582
  157. package/dist/index.cjs.map +0 -1
  158. package/dist/index.js.map +0 -1
  159. package/dist/theme.cjs.map +0 -1
  160. package/dist/theme.js.map +0 -1
  161. package/dist/types-DCVaXlPV.d.cts +0 -78
  162. package/dist/types-DCVaXlPV.d.ts +0 -78
  163. package/dist/vendor-scope-DTYhJk_I.d.cts +0 -129
  164. package/dist/vendor-scope-DTYhJk_I.d.ts +0 -129
@@ -0,0 +1,428 @@
1
+ 'use strict';
2
+
3
+ var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
4
+
5
+ // src/admin/pages/OrderTrackPage.ts
6
+ function renderOrderTrackingPage(order) {
7
+ const contact = order.contact;
8
+ const items = order.items ?? [];
9
+ const currency = String(order.currency ?? "INR");
10
+ function formatMoney(amount) {
11
+ return new Intl.NumberFormat("en-IN", {
12
+ style: "currency",
13
+ currency,
14
+ minimumFractionDigits: 2
15
+ }).format(Number(amount));
16
+ }
17
+ chunkUSNT2KNT_cjs.__name(formatMoney, "formatMoney");
18
+ function formatDate(dateStr) {
19
+ return new Date(dateStr).toLocaleDateString("en-IN", {
20
+ year: "numeric",
21
+ month: "long",
22
+ day: "numeric"
23
+ });
24
+ }
25
+ chunkUSNT2KNT_cjs.__name(formatDate, "formatDate");
26
+ const statusConfig = {
27
+ pending: {
28
+ label: "Order Placed",
29
+ color: "#f59e0b",
30
+ step: 1
31
+ },
32
+ confirmed: {
33
+ label: "Confirmed",
34
+ color: "#3b82f6",
35
+ step: 2
36
+ },
37
+ processing: {
38
+ label: "Processing",
39
+ color: "#8b5cf6",
40
+ step: 3
41
+ },
42
+ completed: {
43
+ label: "Completed",
44
+ color: "#10b981",
45
+ step: 4
46
+ },
47
+ cancelled: {
48
+ label: "Cancelled",
49
+ color: "#ef4444",
50
+ step: 0
51
+ }
52
+ };
53
+ const status = String(order.status ?? "pending");
54
+ const sc = statusConfig[status] ?? {
55
+ label: status,
56
+ color: "#6b7280",
57
+ step: 1
58
+ };
59
+ const isCancelled = status === "cancelled";
60
+ const steps = [
61
+ {
62
+ label: "Order Placed",
63
+ icon: "\u{1F4CB}"
64
+ },
65
+ {
66
+ label: "Confirmed",
67
+ icon: "\u2705"
68
+ },
69
+ {
70
+ label: "Processing",
71
+ icon: "\u2699\uFE0F"
72
+ },
73
+ {
74
+ label: "Completed",
75
+ icon: "\u{1F389}"
76
+ }
77
+ ];
78
+ const stepsHtml = isCancelled ? `<div class="cancelled-banner">Order Cancelled</div>` : steps.map((s, i) => {
79
+ const stepNum = i + 1;
80
+ const isActive = sc.step === stepNum;
81
+ const isDone = sc.step > stepNum;
82
+ return `
83
+ <div class="step ${isDone ? "done" : ""} ${isActive ? "active" : ""}">
84
+ <div class="step-circle">${isDone ? "\u2713" : s.icon}</div>
85
+ <div class="step-label">${s.label}</div>
86
+ </div>
87
+ ${stepNum < 4 ? `<div class="step-line ${sc.step > stepNum ? "done" : ""}"></div>` : ""}
88
+ `;
89
+ }).join("");
90
+ const itemsHtml = items.map((item) => {
91
+ const name = item.product?.collection?.name ?? item.product?.name ?? `Product #${item.id}`;
92
+ const sku = item.product?.sku ?? "\u2014";
93
+ return `
94
+ <div class="item-row">
95
+ <div class="item-avatar">${name.charAt(0).toUpperCase()}</div>
96
+ <div class="item-info">
97
+ <div class="item-name">${name}</div>
98
+ <div class="item-sku">SKU: ${sku}</div>
99
+ </div>
100
+ <div class="item-qty">\xD7${item.quantity}</div>
101
+ <div class="item-price">${formatMoney(Number(item.unitPrice))}</div>
102
+ </div>
103
+ `;
104
+ }).join("");
105
+ const discountRow = Number(order.discount) > 0 ? `<div class="summary-row discount"><span>Discount</span><span>\u2212${formatMoney(Number(order.discount))}</span></div>` : "";
106
+ const taxRow = Number(order.tax) > 0 ? `<div class="summary-row"><span>Tax</span><span>${formatMoney(Number(order.tax))}</span></div>` : "";
107
+ return `<!DOCTYPE html>
108
+ <html lang="en">
109
+ <head>
110
+ <meta charset="UTF-8">
111
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
112
+ <title>Order ${order.orderNumber} \u2014 Tracking</title>
113
+ <link href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@700&family=DM+Sans:wght@400;500;600&display=swap" rel="stylesheet">
114
+ <style>
115
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
116
+
117
+ :root {
118
+ --accent: ${sc.color};
119
+ --bg: #f8f7f4;
120
+ --card: #ffffff;
121
+ --text: #1a1a2e;
122
+ --muted: #6b7280;
123
+ --border: #e5e7eb;
124
+ --radius: 16px;
125
+ }
126
+
127
+ body {
128
+ font-family: 'DM Sans', sans-serif;
129
+ background: var(--bg);
130
+ color: var(--text);
131
+ min-height: 100vh;
132
+ padding: 24px 16px 48px;
133
+ }
134
+
135
+ .container { max-width: 640px; margin: 0 auto; }
136
+
137
+ /* Header */
138
+ .header {
139
+ text-align: center;
140
+ margin-bottom: 32px;
141
+ animation: fadeDown 0.5s ease both;
142
+ }
143
+ .header-eyebrow {
144
+ font-size: 12px;
145
+ font-weight: 600;
146
+ letter-spacing: 0.15em;
147
+ text-transform: uppercase;
148
+ color: var(--accent);
149
+ margin-bottom: 8px;
150
+ }
151
+ .header h1 {
152
+ font-family: 'Playfair Display', serif;
153
+ font-size: clamp(26px, 6vw, 36px);
154
+ color: var(--text);
155
+ line-height: 1.2;
156
+ }
157
+ .header-meta {
158
+ font-size: 13px;
159
+ color: var(--muted);
160
+ margin-top: 6px;
161
+ }
162
+
163
+ /* Status badge */
164
+ .status-badge {
165
+ display: inline-flex;
166
+ align-items: center;
167
+ gap: 6px;
168
+ background: color-mix(in srgb, var(--accent) 12%, transparent);
169
+ color: var(--accent);
170
+ border: 1.5px solid color-mix(in srgb, var(--accent) 30%, transparent);
171
+ border-radius: 100px;
172
+ padding: 5px 14px;
173
+ font-size: 13px;
174
+ font-weight: 600;
175
+ margin-top: 14px;
176
+ }
177
+ .status-dot {
178
+ width: 7px; height: 7px;
179
+ border-radius: 50%;
180
+ background: var(--accent);
181
+ animation: pulse 2s ease infinite;
182
+ }
183
+
184
+ /* Card */
185
+ .card {
186
+ background: var(--card);
187
+ border-radius: var(--radius);
188
+ border: 1px solid var(--border);
189
+ overflow: hidden;
190
+ margin-bottom: 16px;
191
+ animation: fadeUp 0.5s ease both;
192
+ }
193
+ .card:nth-child(2) { animation-delay: 0.08s; }
194
+ .card:nth-child(3) { animation-delay: 0.16s; }
195
+ .card:nth-child(4) { animation-delay: 0.24s; }
196
+
197
+ .card-header {
198
+ display: flex; align-items: center; gap: 10px;
199
+ padding: 16px 20px;
200
+ border-bottom: 1px solid var(--border);
201
+ background: #fafafa;
202
+ }
203
+ .card-header-icon {
204
+ width: 32px; height: 32px;
205
+ border-radius: 8px;
206
+ background: color-mix(in srgb, var(--accent) 12%, transparent);
207
+ display: flex; align-items: center; justify-content: center;
208
+ font-size: 15px;
209
+ }
210
+ .card-title {
211
+ font-size: 13px;
212
+ font-weight: 600;
213
+ letter-spacing: 0.05em;
214
+ text-transform: uppercase;
215
+ color: var(--muted);
216
+ }
217
+ .card-body { padding: 20px; }
218
+
219
+ /* Progress tracker */
220
+ .progress-track {
221
+ display: flex;
222
+ align-items: flex-start;
223
+ justify-content: space-between;
224
+ padding: 8px 0;
225
+ overflow-x: auto;
226
+ }
227
+ .step {
228
+ display: flex; flex-direction: column; align-items: center;
229
+ gap: 8px; min-width: 60px;
230
+ }
231
+ .step-circle {
232
+ width: 44px; height: 44px;
233
+ border-radius: 50%;
234
+ border: 2px solid var(--border);
235
+ background: white;
236
+ display: flex; align-items: center; justify-content: center;
237
+ font-size: 18px;
238
+ color: var(--muted);
239
+ transition: all 0.3s;
240
+ }
241
+ .step.done .step-circle {
242
+ background: color-mix(in srgb, var(--accent) 15%, white);
243
+ border-color: var(--accent);
244
+ color: var(--accent);
245
+ font-size: 16px;
246
+ font-weight: 700;
247
+ }
248
+ .step.active .step-circle {
249
+ background: var(--accent);
250
+ border-color: var(--accent);
251
+ color: white;
252
+ box-shadow: 0 0 0 5px color-mix(in srgb, var(--accent) 20%, transparent);
253
+ }
254
+ .step-label {
255
+ font-size: 11px; font-weight: 500; color: var(--muted);
256
+ text-align: center; line-height: 1.3;
257
+ }
258
+ .step.active .step-label, .step.done .step-label { color: var(--accent); font-weight: 600; }
259
+ .step-line {
260
+ flex: 1; height: 2px;
261
+ background: var(--border);
262
+ margin-top: 22px; min-width: 20px;
263
+ transition: background 0.3s;
264
+ }
265
+ .step-line.done { background: var(--accent); }
266
+ .cancelled-banner {
267
+ text-align: center; padding: 16px;
268
+ background: #fef2f2; color: #ef4444;
269
+ border-radius: 10px;
270
+ font-weight: 600; font-size: 15px;
271
+ }
272
+
273
+ /* Info grid */
274
+ .info-grid {
275
+ display: grid;
276
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
277
+ gap: 16px;
278
+ }
279
+ .info-item dt {
280
+ font-size: 11px; font-weight: 600;
281
+ text-transform: uppercase; letter-spacing: 0.08em;
282
+ color: var(--muted); margin-bottom: 4px;
283
+ }
284
+ .info-item dd { font-size: 14px; font-weight: 500; color: var(--text); }
285
+
286
+ /* Customer */
287
+ .customer-row {
288
+ display: flex; align-items: center; gap: 14px;
289
+ }
290
+ .customer-avatar {
291
+ width: 46px; height: 46px; border-radius: 50%;
292
+ background: color-mix(in srgb, var(--accent) 15%, #f3f4f6);
293
+ color: var(--accent);
294
+ display: flex; align-items: center; justify-content: center;
295
+ font-family: 'Playfair Display', serif;
296
+ font-size: 18px; font-weight: 700; flex-shrink: 0;
297
+ }
298
+ .customer-name { font-size: 15px; font-weight: 600; }
299
+ .customer-email { font-size: 13px; color: var(--muted); margin-top: 2px; }
300
+
301
+ /* Items */
302
+ .item-row {
303
+ display: flex; align-items: center; gap: 12px;
304
+ padding: 12px 0;
305
+ border-bottom: 1px solid var(--border);
306
+ }
307
+ .item-row:last-child { border-bottom: none; padding-bottom: 0; }
308
+ .item-row:first-child { padding-top: 0; }
309
+ .item-avatar {
310
+ width: 40px; height: 40px; border-radius: 10px;
311
+ background: linear-gradient(135deg, color-mix(in srgb, var(--accent) 20%, #e5e7eb), color-mix(in srgb, var(--accent) 5%, #f9fafb));
312
+ color: var(--accent);
313
+ display: flex; align-items: center; justify-content: center;
314
+ font-size: 16px; font-weight: 700; flex-shrink: 0;
315
+ }
316
+ .item-info { flex: 1; min-width: 0; }
317
+ .item-name { font-size: 14px; font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
318
+ .item-sku { font-size: 12px; color: var(--muted); margin-top: 2px; }
319
+ .item-qty { font-size: 13px; color: var(--muted); min-width: 28px; text-align: center; }
320
+ .item-price { font-size: 14px; font-weight: 600; min-width: 80px; text-align: right; }
321
+
322
+ /* Summary */
323
+ .summary-row {
324
+ display: flex; justify-content: space-between;
325
+ font-size: 14px; padding: 7px 0; color: var(--muted);
326
+ }
327
+ .summary-row.discount { color: #10b981; }
328
+ .summary-row.total {
329
+ font-size: 17px; font-weight: 700; color: var(--text);
330
+ border-top: 2px solid var(--border); margin-top: 6px; padding-top: 14px;
331
+ }
332
+
333
+ /* Footer */
334
+ .footer {
335
+ text-align: center; margin-top: 32px;
336
+ font-size: 12px; color: #9ca3af;
337
+ animation: fadeUp 0.5s ease 0.4s both;
338
+ }
339
+
340
+ /* Animations */
341
+ @keyframes fadeDown {
342
+ from { opacity: 0; transform: translateY(-16px); }
343
+ to { opacity: 1; transform: translateY(0); }
344
+ }
345
+ @keyframes fadeUp {
346
+ from { opacity: 0; transform: translateY(16px); }
347
+ to { opacity: 1; transform: translateY(0); }
348
+ }
349
+ @keyframes pulse {
350
+ 0%, 100% { opacity: 1; }
351
+ 50% { opacity: 0.4; }
352
+ }
353
+ </style>
354
+ </head>
355
+ <body>
356
+ <div class="container">
357
+
358
+ <!-- Header -->
359
+ <div class="header">
360
+ <div class="header-eyebrow">Order Tracking</div>
361
+ <h1>${String(order.orderNumber)}</h1>
362
+ <div class="header-meta">Placed on ${formatDate(String(order.createdAt))}</div>
363
+ <div><span class="status-badge"><span class="status-dot"></span>${sc.label}</span></div>
364
+ </div>
365
+
366
+ <!-- Progress -->
367
+ <div class="card">
368
+ <div class="card-header">
369
+ <div class="card-header-icon">\u{1F69A}</div>
370
+ <div class="card-title">Order Progress</div>
371
+ </div>
372
+ <div class="card-body">
373
+ <div class="progress-track">${stepsHtml}</div>
374
+ </div>
375
+ </div>
376
+
377
+ ${contact ? `
378
+ <!-- Customer -->
379
+ <div class="card">
380
+ <div class="card-header">
381
+ <div class="card-header-icon">\u{1F464}</div>
382
+ <div class="card-title">Customer</div>
383
+ </div>
384
+ <div class="card-body">
385
+ <div class="customer-row">
386
+ <div class="customer-avatar">${String(contact.name ?? "?").charAt(0).toUpperCase()}</div>
387
+ <div>
388
+ <div class="customer-name">${String(contact.name ?? "\u2014")}</div>
389
+ <div class="customer-email">${String(contact.email ?? "\u2014")}</div>
390
+ ${contact.phone ? `<div class="customer-email">${String(contact.phone)}</div>` : ""}
391
+ </div>
392
+ </div>
393
+ </div>
394
+ </div>` : ""}
395
+
396
+ <!-- Items -->
397
+ <div class="card">
398
+ <div class="card-header">
399
+ <div class="card-header-icon">\u{1F4E6}</div>
400
+ <div class="card-title">Items (${items.length})</div>
401
+ </div>
402
+ <div class="card-body">
403
+ ${items.length === 0 ? '<p style="color:var(--muted);font-size:14px;">No items</p>' : itemsHtml}
404
+ </div>
405
+ </div>
406
+
407
+ <!-- Summary -->
408
+ <div class="card">
409
+ <div class="card-header">
410
+ <div class="card-header-icon">\u{1F9FE}</div>
411
+ <div class="card-title">Order Summary</div>
412
+ </div>
413
+ <div class="card-body">
414
+ <div class="summary-row"><span>Subtotal</span><span>${formatMoney(Number(order.subtotal))}</span></div>
415
+ ${discountRow}
416
+ ${taxRow}
417
+ <div class="summary-row total"><span>Total</span><span>${formatMoney(Number(order.total))}</span></div>
418
+ </div>
419
+ </div>
420
+
421
+ <div class="footer">Scan the QR code on your receipt to return to this page.</div>
422
+ </div>
423
+ </body>
424
+ </html>`;
425
+ }
426
+ chunkUSNT2KNT_cjs.__name(renderOrderTrackingPage, "renderOrderTrackingPage");
427
+
428
+ exports.renderOrderTrackingPage = renderOrderTrackingPage;