@o2vend/theme-cli 1.0.32

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 (116) hide show
  1. package/README.md +425 -0
  2. package/assets/Logo_o2vend.png +0 -0
  3. package/assets/favicon.png +0 -0
  4. package/assets/logo-white.png +0 -0
  5. package/bin/o2vend +42 -0
  6. package/config/widget-map.json +50 -0
  7. package/lib/commands/check.js +201 -0
  8. package/lib/commands/generate.js +33 -0
  9. package/lib/commands/init.js +214 -0
  10. package/lib/commands/optimize.js +216 -0
  11. package/lib/commands/package.js +208 -0
  12. package/lib/commands/serve.js +105 -0
  13. package/lib/commands/validate.js +191 -0
  14. package/lib/lib/api-client.js +357 -0
  15. package/lib/lib/dev-server.js +2618 -0
  16. package/lib/lib/file-watcher.js +80 -0
  17. package/lib/lib/hot-reload.js +106 -0
  18. package/lib/lib/liquid-engine.js +822 -0
  19. package/lib/lib/liquid-filters.js +671 -0
  20. package/lib/lib/mock-api-server.js +989 -0
  21. package/lib/lib/mock-data.js +1468 -0
  22. package/lib/lib/widget-service.js +321 -0
  23. package/package.json +70 -0
  24. package/test-theme/README.md +27 -0
  25. package/test-theme/assets/async-sections.js +446 -0
  26. package/test-theme/assets/cart-drawer.js +463 -0
  27. package/test-theme/assets/cart-manager.js +223 -0
  28. package/test-theme/assets/checkout-price-handler.js +368 -0
  29. package/test-theme/assets/components.css +4629 -0
  30. package/test-theme/assets/delivery-zone.css +299 -0
  31. package/test-theme/assets/delivery-zone.js +396 -0
  32. package/test-theme/assets/logo.png +0 -0
  33. package/test-theme/assets/sections.css +48 -0
  34. package/test-theme/assets/theme.css +3500 -0
  35. package/test-theme/assets/theme.js +3745 -0
  36. package/test-theme/config/settings_data.json +292 -0
  37. package/test-theme/config/settings_schema.json +1050 -0
  38. package/test-theme/layout/theme.liquid +195 -0
  39. package/test-theme/locales/en.default.json +260 -0
  40. package/test-theme/sections/content-fallback.liquid +53 -0
  41. package/test-theme/sections/content.liquid +57 -0
  42. package/test-theme/sections/footer-fallback.liquid +328 -0
  43. package/test-theme/sections/footer.liquid +278 -0
  44. package/test-theme/sections/header-fallback.liquid +1805 -0
  45. package/test-theme/sections/header.liquid +1145 -0
  46. package/test-theme/sections/hero-fallback.liquid +212 -0
  47. package/test-theme/sections/hero.liquid +136 -0
  48. package/test-theme/snippets/account-sidebar.liquid +200 -0
  49. package/test-theme/snippets/add-to-cart-modal.liquid +484 -0
  50. package/test-theme/snippets/breadcrumbs.liquid +134 -0
  51. package/test-theme/snippets/cart-drawer.liquid +467 -0
  52. package/test-theme/snippets/delivery-zone-city-selector.liquid +79 -0
  53. package/test-theme/snippets/delivery-zone-modal.liquid +337 -0
  54. package/test-theme/snippets/delivery-zone-search.liquid +78 -0
  55. package/test-theme/snippets/icon.liquid +105 -0
  56. package/test-theme/snippets/login-modal.liquid +346 -0
  57. package/test-theme/snippets/mega-menu.liquid +812 -0
  58. package/test-theme/snippets/news-thumbnail.liquid +187 -0
  59. package/test-theme/snippets/pagination.liquid +120 -0
  60. package/test-theme/snippets/price.liquid +92 -0
  61. package/test-theme/snippets/product-card-related.liquid +78 -0
  62. package/test-theme/snippets/product-card-simple.liquid +41 -0
  63. package/test-theme/snippets/product-card.liquid +697 -0
  64. package/test-theme/snippets/rating.liquid +85 -0
  65. package/test-theme/snippets/skeleton-collection-grid.liquid +114 -0
  66. package/test-theme/snippets/skeleton-product-card.liquid +124 -0
  67. package/test-theme/snippets/skeleton-product-grid.liquid +34 -0
  68. package/test-theme/snippets/social-sharing.liquid +185 -0
  69. package/test-theme/templates/account/dashboard.liquid +401 -0
  70. package/test-theme/templates/account/loyalty-redemption.liquid +405 -0
  71. package/test-theme/templates/account/loyalty.liquid +588 -0
  72. package/test-theme/templates/account/order-detail.liquid +230 -0
  73. package/test-theme/templates/account/orders.liquid +349 -0
  74. package/test-theme/templates/account/profile.liquid +758 -0
  75. package/test-theme/templates/account/register.liquid +232 -0
  76. package/test-theme/templates/account/return-orders.liquid +348 -0
  77. package/test-theme/templates/account/store-credit.liquid +464 -0
  78. package/test-theme/templates/account/subscriptions.liquid +601 -0
  79. package/test-theme/templates/account/wishlist.liquid +419 -0
  80. package/test-theme/templates/address-book.liquid +1092 -0
  81. package/test-theme/templates/categories.liquid +452 -0
  82. package/test-theme/templates/checkout.liquid +4511 -0
  83. package/test-theme/templates/error.liquid +384 -0
  84. package/test-theme/templates/index.liquid +11 -0
  85. package/test-theme/templates/login.liquid +185 -0
  86. package/test-theme/templates/order-confirmation.liquid +720 -0
  87. package/test-theme/templates/page.liquid +297 -0
  88. package/test-theme/templates/product-detail.liquid +4363 -0
  89. package/test-theme/templates/products.liquid +518 -0
  90. package/test-theme/templates/search.liquid +922 -0
  91. package/test-theme/theme.json.example +19 -0
  92. package/test-theme/widgets/brand-carousel.liquid +676 -0
  93. package/test-theme/widgets/brand.liquid +245 -0
  94. package/test-theme/widgets/carousel.liquid +843 -0
  95. package/test-theme/widgets/category-list-carousel.liquid +656 -0
  96. package/test-theme/widgets/category-list.liquid +340 -0
  97. package/test-theme/widgets/category.liquid +475 -0
  98. package/test-theme/widgets/discount-time.liquid +176 -0
  99. package/test-theme/widgets/footer-menu.liquid +695 -0
  100. package/test-theme/widgets/footer.liquid +179 -0
  101. package/test-theme/widgets/gallery.liquid +271 -0
  102. package/test-theme/widgets/header-menu.liquid +932 -0
  103. package/test-theme/widgets/header.liquid +159 -0
  104. package/test-theme/widgets/html.liquid +214 -0
  105. package/test-theme/widgets/news.liquid +217 -0
  106. package/test-theme/widgets/product-canvas.liquid +235 -0
  107. package/test-theme/widgets/product-carousel.liquid +502 -0
  108. package/test-theme/widgets/product.liquid +45 -0
  109. package/test-theme/widgets/recently-viewed.liquid +26 -0
  110. package/test-theme/widgets/shared/product-grid.liquid +339 -0
  111. package/test-theme/widgets/simple-product.liquid +42 -0
  112. package/test-theme/widgets/single-product.liquid +610 -0
  113. package/test-theme/widgets/spacebar-carousel.liquid +663 -0
  114. package/test-theme/widgets/spacebar.liquid +279 -0
  115. package/test-theme/widgets/splash.liquid +378 -0
  116. package/test-theme/widgets/testimonial-carousel.liquid +709 -0
@@ -0,0 +1,720 @@
1
+ {% layout 'layout/theme' %}
2
+
3
+ <section class="order-confirmation-page">
4
+ <div class="container">
5
+
6
+ <!-- Header -->
7
+ <div class="confirmation-header">
8
+ <div class="confirmation-icon"><i class="fas fa-check-circle"></i></div>
9
+ <h1 class="confirmation-title">Order{% if orders.size > 1 %}s{% endif %} Confirmed!</h1>
10
+ <p class="confirmation-subtitle">Thank you for your purchase</p>
11
+
12
+ {% if orders.size > 1 %}
13
+ <div class="multiple-orders-badge">
14
+ <i class="fas fa-shopping-bag"></i>
15
+ <span>{{ orders.size }} Orders Placed</span>
16
+ </div>
17
+ {% else %}
18
+ <div class="order-number">
19
+ <span>Order Number:</span>
20
+ <strong>#{{ order.orderNumber }}</strong>
21
+ </div>
22
+ <div class="order-info">
23
+ <div><i class="far fa-calendar"></i> {{ order.createdAt | date: '%d-%m-%Y %H:%M' }}</div>
24
+ <div><span class="status-badge status-{{ order.status | downcase | replace: ' ', '-' }}">{{ order.status }}</span></div>
25
+ </div>
26
+ {% endif %}
27
+ </div>
28
+
29
+ <!-- Multiple Orders Layout -->
30
+ {% if orders.size > 1 %}
31
+ {% for orderItem in orders %}
32
+ <div class="order-wrapper">
33
+ <div class="order-header-bar">
34
+ <div class="order-header-info">
35
+ <h3>Order #{{ orderItem.orderNumber }}</h3>
36
+ <div class="order-meta">
37
+ <span><i class="far fa-calendar"></i> {{ orderItem.createdAt | date: '%d-%m-%Y %H:%M' }}</span>
38
+ <span class="status-badge status-{{ orderItem.status | downcase | replace: ' ', '-' }}">{{ orderItem.status }}</span>
39
+ </div>
40
+ </div>
41
+ <div class="order-total-badge">
42
+ {{ orderItem.total | money_with_settings: shop.settings }}
43
+ </div>
44
+ </div>
45
+
46
+ <div class="content-grid">
47
+ <!-- Main Content -->
48
+ <div class="main-content">
49
+ <!-- Items -->
50
+ <div class="section-card">
51
+ <h2>Order Items ({{ orderItem.items.size }})</h2>
52
+ <div class="items-list">
53
+ {% for item in orderItem.items %}
54
+ <div class="order-item">
55
+ <div class="item-image">
56
+ {% if item.productImageUrl %}
57
+ <img src="{{ item.productImageUrl }}" alt="{{ item.productName }}">
58
+ {% else %}
59
+ <i class="fas fa-image"></i>
60
+ {% endif %}
61
+ </div>
62
+ <div class="item-info">
63
+ <h3>{{ item.productName }}</h3>
64
+ <div>{{ item.productPrice | money_with_settings: shop.settings }} × {{ item.quantity }}</div>
65
+ {% if item.discountAmount > 0 %}
66
+ <div>Discount: {{ item.discountAmount | money_with_settings: shop.settings }}</div>
67
+ {% endif %}
68
+ </div>
69
+ <div class="item-total">{{ item.total | money_with_settings: shop.settings }}</div>
70
+ </div>
71
+ {% endfor %}
72
+ </div>
73
+ </div>
74
+
75
+ <!-- Addresses -->
76
+ <div class="section-card">
77
+ <h2>Delivery Information</h2>
78
+ <div class="address-grid">
79
+ {% if orderItem.shippingAddress %}
80
+ <div class="address-box">
81
+ <h6>Shipping Address</h6>
82
+ <p>{{ orderItem.shippingAddress.contactName }}</p>
83
+ <p>{{ orderItem.shippingAddress.addressLine1 }}</p>
84
+ {% if orderItem.shippingAddress.addressLine2 %}<p>{{ orderItem.shippingAddress.addressLine2 }}</p>{% endif %}
85
+ <p>{{ orderItem.shippingAddress.city }}, {{ orderItem.shippingAddress.stateOrProvinceName }} {{ orderItem.shippingAddress.zipCode }}</p>
86
+ <p>{{ orderItem.shippingAddress.countryName }}</p>
87
+ {% if orderItem.shippingAddress.phone %}<p>📞 {{ orderItem.shippingAddress.phone }}</p>{% endif %}
88
+ </div>
89
+ {% endif %}
90
+
91
+ {% if orderItem.billingAddress %}
92
+ <div class="address-box">
93
+ <h6>Billing Address</h6>
94
+ <p>{{ orderItem.billingAddress.contactName }}</p>
95
+ <p>{{ orderItem.billingAddress.addressLine1 }}</p>
96
+ {% if orderItem.billingAddress.addressLine2 %}<p>{{ orderItem.billingAddress.addressLine2 }}</p>{% endif %}
97
+ <p>{{ orderItem.billingAddress.city }}, {{ orderItem.billingAddress.stateOrProvinceName }} {{ orderItem.billingAddress.zipCode }}</p>
98
+ <p>{{ orderItem.billingAddress.countryName }}</p>
99
+ {% if orderItem.billingAddress.phone %}<p>📞 {{ orderItem.billingAddress.phone }}</p>{% endif %}
100
+ </div>
101
+ {% endif %}
102
+ </div>
103
+ </div>
104
+
105
+ {% if orderItem.note %}
106
+ <div class="section-card">
107
+ <h2>Order Note</h2>
108
+ <p>{{ orderItem.note }}</p>
109
+ </div>
110
+ {% endif %}
111
+ </div>
112
+
113
+ <!-- Sidebar -->
114
+ <aside class="sidebar">
115
+ <div class="section-card">
116
+ <h2>Order Summary</h2>
117
+ <div class="summary-content">
118
+ <div class="summary-row"><span>Subtotal</span><span>{{ orderItem.subtotal | money_with_settings: shop.settings }}</span></div>
119
+ {% if orderItem.discount > 0 %}
120
+ <div class="summary-row"><span>Discount{% if orderItem.couponCode %} ({{ orderItem.couponCode }}){% endif %}</span><span>-{{ orderItem.discount | money_with_settings: shop.settings }}</span></div>
121
+ {% endif %}
122
+ <div class="summary-row"><span>Shipping</span><span>{% if orderItem.shipping > 0 %}{{ orderItem.shipping | money_with_settings: shop.settings }}{% else %}FREE{% endif %}</span></div>
123
+ <div class="summary-row"><span>Tax</span><span>{{ orderItem.tax | money_with_settings: shop.settings }}</span></div>
124
+ <div class="summary-row total-row"><strong>Total</strong><strong>{{ orderItem.total | money_with_settings: shop.settings }}</strong></div>
125
+ </div>
126
+ <div class="payment-method"><span>Payment:</span> <strong>{{ orderItem.paymentMethod | default: 'Online Payment' }}</strong></div>
127
+ </div>
128
+ </aside>
129
+ </div>
130
+ </div>
131
+ {% endfor %}
132
+
133
+ <!-- Combined Grand Total for Multiple Orders -->
134
+ <div class="grand-total-card">
135
+ <div class="grand-total-content">
136
+ <span class="grand-total-label">Grand Total ({{ orders.size }} Orders)</span>
137
+ <span class="grand-total-amount">
138
+ {% assign grandTotal = 0 %}
139
+ {% for orderItem in orders %}
140
+ {% assign grandTotal = grandTotal | plus: orderItem.total %}
141
+ {% endfor %}
142
+ {{ grandTotal | money_with_settings: shop.settings }}
143
+ </span>
144
+ </div>
145
+ </div>
146
+
147
+ {% else %}
148
+ <!-- Single Order Layout (Original) -->
149
+ <div class="content-grid">
150
+ <!-- Main -->
151
+ <div class="main-content">
152
+ <!-- Items -->
153
+ <div class="section-card">
154
+ <h2>Order Items ({{ order.items.size }})</h2>
155
+ <div class="items-list">
156
+ {% for item in order.items %}
157
+ <div class="order-item">
158
+ <div class="item-image">
159
+ {% if item.productImageUrl %}
160
+ <img src="{{ item.productImageUrl }}" alt="{{ item.productName }}">
161
+ {% else %}
162
+ <i class="fas fa-image"></i>
163
+ {% endif %}
164
+ </div>
165
+ <div class="item-info">
166
+ <h3>{{ item.productName }}</h3>
167
+ <div>{{ item.productPrice | money_with_settings: shop.settings }} × {{ item.quantity }}</div>
168
+ {% if item.discountAmount > 0 %}
169
+ <div>Discount: {{ item.discountAmount | money_with_settings: shop.settings }}</div>
170
+ {% endif %}
171
+ </div>
172
+ <div class="item-total">{{ item.total | money_with_settings: shop.settings }}</div>
173
+ </div>
174
+ {% endfor %}
175
+ </div>
176
+ </div>
177
+
178
+ <!-- Addresses -->
179
+ <div class="section-card">
180
+ <h2>Delivery Information</h2>
181
+ <div class="address-grid">
182
+ {% if order.shippingAddress %}
183
+ <div class="address-box">
184
+ <h6>Shipping Address</h6>
185
+ <p>{{ order.shippingAddress.contactName }}</p>
186
+ <p>{{ order.shippingAddress.addressLine1 }}</p>
187
+ {% if order.shippingAddress.addressLine2 %}<p>{{ order.shippingAddress.addressLine2 }}</p>{% endif %}
188
+ <p>{{ order.shippingAddress.city }}, {{ order.shippingAddress.stateOrProvinceName }} {{ order.shippingAddress.zipCode }}</p>
189
+ <p>{{ order.shippingAddress.countryName }}</p>
190
+ {% if order.shippingAddress.phone %}<p>📞 {{ order.shippingAddress.phone }}</p>{% endif %}
191
+ </div>
192
+ {% endif %}
193
+
194
+ {% if order.billingAddress %}
195
+ <div class="address-box">
196
+ <h6>Billing Address</h6>
197
+ <p>{{ order.billingAddress.contactName }}</p>
198
+ <p>{{ order.billingAddress.addressLine1 }}</p>
199
+ {% if order.billingAddress.addressLine2 %}<p>{{ order.billingAddress.addressLine2 }}</p>{% endif %}
200
+ <p>{{ order.billingAddress.city }}, {{ order.billingAddress.stateOrProvinceName }} {{ order.billingAddress.zipCode }}</p>
201
+ <p>{{ order.billingAddress.countryName }}</p>
202
+ {% if order.billingAddress.phone %}<p>📞 {{ order.billingAddress.phone }}</p>{% endif %}
203
+ </div>
204
+ {% endif %}
205
+ </div>
206
+ </div>
207
+
208
+ {% if order.note %}
209
+ <div class="section-card">
210
+ <h2>Order Note</h2>
211
+ <p>{{ order.note }}</p>
212
+ </div>
213
+ {% endif %}
214
+
215
+
216
+
217
+ <!-- Related Products -->
218
+ {% if relatedProducts and relatedProducts.size > 0 %}
219
+ <div class="section-card">
220
+ <h2>You Might Also Like</h2>
221
+ <div class="products-grid">
222
+ {% for product in relatedProducts limit:4 %}
223
+ {% include 'snippets/product-card', product: product %}
224
+ {% endfor %}
225
+ </div>
226
+ </div>
227
+ {% endif %}
228
+ </div>
229
+
230
+ <!-- Sidebar -->
231
+ <aside class="sidebar">
232
+ <div class="section-card">
233
+ <h2>Order Summary</h2>
234
+ <div class="summary-content">
235
+ <div class="summary-row"><span>Subtotal</span><span>{{ order.subtotal | money_with_settings: shop.settings }}</span></div>
236
+ {% if order.discount > 0 %}
237
+ <div class="summary-row"><span>Discount{% if order.couponCode %} ({{ order.couponCode }}){% endif %}</span><span>-{{ order.discount | money_with_settings: shop.settings }}</span></div>
238
+ {% endif %}
239
+ <div class="summary-row"><span>Shipping</span><span>{% if order.shipping > 0 %}{{ order.shipping | money_with_settings: shop.settings }}{% else %}FREE{% endif %}</span></div>
240
+ <div class="summary-row"><span>Tax</span><span>{{ order.tax | money_with_settings: shop.settings }}</span></div>
241
+ <div class="summary-row total-row"><strong>Total</strong><strong>{{ order.total | money_with_settings: shop.settings }}</strong></div>
242
+ </div>
243
+ <div class="payment-method"><span>Payment:</span> <strong>{{ order.paymentMethod | default: 'Online Payment' }}</strong></div>
244
+ </div>
245
+ </aside>
246
+ </div>
247
+ {% endif %}
248
+
249
+ <!-- Action Buttons (shown for both single and multiple orders) -->
250
+ <div class="action-buttons">
251
+ <a href="/orders" class="btn btn-primary">View My Orders</a>
252
+ <a href="/products" class="btn btn-secondary">Continue Shopping</a>
253
+ </div>
254
+
255
+ <!-- Related Products (shown for both) -->
256
+ {% if relatedProducts and relatedProducts.size > 0 %}
257
+ <div class="section-card">
258
+ <h2>You Might Also Like</h2>
259
+ <div class="products-grid">
260
+ {% for product in relatedProducts limit:4 %}
261
+ {% include 'snippets/product-card', product: product %}
262
+ {% endfor %}
263
+ </div>
264
+ </div>
265
+ {% endif %}
266
+ </div>
267
+ </section>
268
+
269
+ <style>/* =========================================================
270
+ Base & Reset
271
+ ========================================================= */
272
+ * {
273
+ box-sizing: border-box;
274
+ }
275
+
276
+ body {
277
+ margin: 0;
278
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif;
279
+ font-size: 15px;
280
+ line-height: 1.6;
281
+ color: #333;
282
+ background: #f8f9fa;
283
+ }
284
+
285
+ /* =========================================================
286
+ Page Layout
287
+ ========================================================= */
288
+ .order-confirmation-page {
289
+ padding: 20px 20px;
290
+ min-height: 100vh;
291
+ }
292
+
293
+ .container {
294
+ max-width: 1200px;
295
+ margin: 0 auto;
296
+ }
297
+
298
+ /* =========================================================
299
+ Header
300
+ ========================================================= */
301
+ .confirmation-header {
302
+ background: #fff;
303
+ padding: 17px 10px;
304
+ border-radius: 12px;
305
+ text-align: center;
306
+ box-shadow: 0 2px 8px rgba(0,0,0,0.08);
307
+ margin-bottom: 20px;
308
+ }
309
+
310
+ .confirmation-icon i {
311
+ font-size: 56px;
312
+ color: #10b981;
313
+ margin-bottom: 16px;
314
+ }
315
+
316
+ .confirmation-title {
317
+ font-size: 28px;
318
+ font-weight: 700;
319
+ color: #111;
320
+ margin: 0 0 6px;
321
+ }
322
+
323
+ .confirmation-subtitle {
324
+ font-size: 16px;
325
+ color: #6b7280;
326
+ margin-bottom: 20px;
327
+ }
328
+
329
+ .multiple-orders-badge {
330
+ display: inline-flex;
331
+ align-items: center;
332
+ gap: 10px;
333
+ padding: 12px 24px;
334
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
335
+ color: #fff;
336
+ border-radius: 30px;
337
+ font-size: 16px;
338
+ font-weight: 600;
339
+ box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
340
+ }
341
+
342
+ .multiple-orders-badge i {
343
+ font-size: 18px;
344
+ }
345
+
346
+ .order-number {
347
+ display: inline-flex;
348
+ gap: 10px;
349
+ padding: 10px 20px;
350
+ background: #f9fafb;
351
+ border: 1px solid #e5e7eb;
352
+ border-radius: 8px;
353
+ margin-bottom: 16px;
354
+ font-size: 14px;
355
+ }
356
+
357
+ .order-number strong {
358
+ font-family: monospace;
359
+ font-size: 15px;
360
+ }
361
+
362
+ .order-info {
363
+ display: flex;
364
+ justify-content: center;
365
+ gap: 20px;
366
+ flex-wrap: wrap;
367
+ font-size: 14px;
368
+ color: #6b7280;
369
+ }
370
+
371
+ /* =========================================================
372
+ Multiple Orders Wrapper
373
+ ========================================================= */
374
+ .order-wrapper {
375
+ background: #fff;
376
+ border-radius: 12px;
377
+ padding: 0;
378
+ box-shadow: 0 2px 8px rgba(0,0,0,0.08);
379
+ margin-bottom: 30px;
380
+ overflow: hidden;
381
+ }
382
+
383
+ .order-header-bar {
384
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
385
+ color: #fff;
386
+ padding: 20px 24px;
387
+ display: flex;
388
+ justify-content: space-between;
389
+ align-items: center;
390
+ flex-wrap: wrap;
391
+ gap: 16px;
392
+ }
393
+
394
+ .order-header-info h3 {
395
+ margin: 0 0 8px;
396
+ font-size: 20px;
397
+ font-weight: 700;
398
+ }
399
+
400
+ .order-meta {
401
+ display: flex;
402
+ gap: 16px;
403
+ flex-wrap: wrap;
404
+ align-items: center;
405
+ font-size: 14px;
406
+ }
407
+
408
+ .order-meta span i {
409
+ margin-right: 6px;
410
+ }
411
+
412
+ .order-total-badge {
413
+ font-size: 24px;
414
+ font-weight: 700;
415
+ background: rgba(255,255,255,0.2);
416
+ padding: 10px 20px;
417
+ border-radius: 8px;
418
+ backdrop-filter: blur(10px);
419
+ }
420
+
421
+ .order-wrapper .content-grid {
422
+ padding: 24px;
423
+ }
424
+
425
+ /* =========================================================
426
+ Grand Total Card
427
+ ========================================================= */
428
+ .grand-total-card {
429
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
430
+ border-radius: 12px;
431
+ padding: 24px;
432
+ box-shadow: 0 4px 16px rgba(102, 126, 234, 0.4);
433
+ margin-bottom: 30px;
434
+ }
435
+
436
+ .grand-total-content {
437
+ display: flex;
438
+ justify-content: space-between;
439
+ align-items: center;
440
+ color: #fff;
441
+ }
442
+
443
+ .grand-total-label {
444
+ font-size: 20px;
445
+ font-weight: 600;
446
+ }
447
+
448
+ .grand-total-amount {
449
+ font-size: 32px;
450
+ font-weight: 700;
451
+ }
452
+
453
+ /* =========================================================
454
+ Status Badge
455
+ ========================================================= */
456
+ .status-badge {
457
+ padding: 5px 14px;
458
+ border-radius: 20px;
459
+ font-size: 13px;
460
+ font-weight: 600;
461
+ text-transform: capitalize;
462
+ }
463
+
464
+ .order-header-bar .status-badge {
465
+ background: rgba(255,255,255,0.25);
466
+ color: #fff;
467
+ border: 1px solid rgba(255,255,255,0.3);
468
+ }
469
+
470
+ .status-new { background: #dbeafe; color: #1e40af; }
471
+ .status-processing { background: #fef3c7; color: #92400e; }
472
+ .status-shipped { background: #e0e7ff; color: #4338ca; }
473
+ .status-delivered,
474
+ .status-completed { background: #d1fae5; color: #065f46; }
475
+
476
+ /* =========================================================
477
+ Main Grid
478
+ ========================================================= */
479
+ .content-grid {
480
+ display: grid;
481
+ grid-template-columns: 1fr 310px;
482
+ gap: 15px;
483
+ align-items: start;
484
+ }
485
+
486
+ /* =========================================================
487
+ Cards
488
+ ========================================================= */
489
+ .section-card {
490
+ background: #fff;
491
+ border-radius: 12px;
492
+ padding: 20px;
493
+ box-shadow: 0 2px 8px rgba(0,0,0,0.08);
494
+ margin-bottom: 24px;
495
+ }
496
+
497
+ .section-card h2 {
498
+ font-size: 18px;
499
+ font-weight: 600;
500
+ color: #111;
501
+ margin-bottom: 16px;
502
+ }
503
+
504
+ /* =========================================================
505
+ Order Items
506
+ ========================================================= */
507
+ .items-list {
508
+ display: flex;
509
+ flex-direction: column;
510
+ gap: 16px;
511
+ }
512
+
513
+ .order-item {
514
+ display: grid;
515
+ grid-template-columns: 80px 1fr auto;
516
+ gap: 16px;
517
+ background: #f9fafb;
518
+ padding: 16px;
519
+ border-radius: 8px;
520
+ }
521
+
522
+ .item-image {
523
+ width: 80px;
524
+ height: 80px;
525
+ border-radius: 8px;
526
+ overflow: hidden;
527
+ background: #fff;
528
+ border: 1px solid #e5e7eb;
529
+ display: flex;
530
+ align-items: center;
531
+ justify-content: center;
532
+ }
533
+
534
+ .item-image img {
535
+ width: 100%;
536
+ height: 100%;
537
+ object-fit: cover;
538
+ }
539
+
540
+ .item-image i {
541
+ font-size: 32px;
542
+ color: #d1d5db;
543
+ }
544
+
545
+ .item-info h3 {
546
+ font-size: 15px;
547
+ font-weight: 600;
548
+ margin: 0 0 6px;
549
+ color: #111;
550
+ }
551
+
552
+ .item-info div {
553
+ font-size: 14px;
554
+ color: #6b7280;
555
+ }
556
+
557
+ .item-total {
558
+ display: flex;
559
+ align-items: center;
560
+ font-size: 15px;
561
+ font-weight: 700;
562
+ color: #111;
563
+ }
564
+
565
+ /* =========================================================
566
+ Addresses
567
+ ========================================================= */
568
+ .address-grid {
569
+ display: grid;
570
+ grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
571
+ gap: 16px;
572
+ }
573
+
574
+ .address-box {
575
+ background: #f9fafb;
576
+ border: 1px solid #e5e7eb;
577
+ border-radius: 8px;
578
+ padding: 16px;
579
+ font-size: 14px;
580
+ }
581
+
582
+ .address-box h6 {
583
+ font-size: 14px;
584
+ font-weight: 600;
585
+ margin-bottom: 10px;
586
+ color: #111;
587
+ }
588
+
589
+ .address-box p {
590
+ margin: 0 0 6px;
591
+ color: #6b7280;
592
+ }
593
+
594
+ /* =========================================================
595
+ Order Summary (Sidebar)
596
+ ========================================================= */
597
+ .sidebar {
598
+ position: sticky;
599
+ top: 20px;
600
+ }
601
+
602
+ .summary-content {
603
+ font-size: 14px;
604
+ }
605
+
606
+ .summary-row {
607
+ display: flex;
608
+ justify-content: space-between;
609
+ margin-bottom: 12px;
610
+ }
611
+
612
+ .summary-row span:last-child,
613
+ .summary-row strong {
614
+ font-weight: 600;
615
+ color: #111;
616
+ }
617
+
618
+ .total-row {
619
+ font-size: 17px;
620
+ margin-top: 8px;
621
+ padding-top: 12px;
622
+ border-top: 2px solid #e5e7eb;
623
+ }
624
+
625
+ .payment-method {
626
+ margin-top: 14px;
627
+ padding: 12px;
628
+ background: #f9fafb;
629
+ border-radius: 8px;
630
+ font-size: 14px;
631
+ display: flex;
632
+ justify-content: space-between;
633
+ }
634
+
635
+ /* =========================================================
636
+ Buttons
637
+ ========================================================= */
638
+ .action-buttons {
639
+ display: flex;
640
+ gap: 16px;
641
+ margin: 32px 0;
642
+ }
643
+
644
+ .btn {
645
+ flex: 1;
646
+ padding: 14px;
647
+ border-radius: 8px;
648
+ font-size: 15px;
649
+ font-weight: 600;
650
+ text-align: center;
651
+ text-decoration: none;
652
+ cursor: pointer;
653
+ transition: 0.2s ease;
654
+ }
655
+
656
+ .btn-primary {
657
+ background: #111;
658
+ color: #fff;
659
+ }
660
+
661
+ .btn-primary:hover {
662
+ background: #000;
663
+ }
664
+
665
+ .btn-secondary {
666
+ background: #fff;
667
+ color: #111;
668
+ border: 2px solid #e5e7eb;
669
+ }
670
+
671
+ .btn-secondary:hover {
672
+ background: #f9fafb;
673
+ }
674
+
675
+ /* =========================================================
676
+ Responsive
677
+ ========================================================= */
678
+ @media (max-width: 992px) {
679
+ .content-grid {
680
+ grid-template-columns: 1fr;
681
+ }
682
+ .sidebar {
683
+ position: static;
684
+ }
685
+ .order-header-bar {
686
+ flex-direction: column;
687
+ align-items: flex-start;
688
+ }
689
+ .order-total-badge {
690
+ align-self: stretch;
691
+ text-align: center;
692
+ }
693
+ }
694
+
695
+ @media (max-width: 768px) {
696
+ .order-item {
697
+ grid-template-columns: 60px 1fr;
698
+ }
699
+ .item-total {
700
+ grid-column: 2;
701
+ margin-top: 6px;
702
+ justify-content: flex-start;
703
+ }
704
+ .action-buttons {
705
+ flex-direction: column;
706
+ }
707
+ .grand-total-content {
708
+ flex-direction: column;
709
+ gap: 12px;
710
+ text-align: center;
711
+ }
712
+ .confirmation-title {
713
+ font-size: 24px;
714
+ }
715
+ .multiple-orders-badge {
716
+ font-size: 14px;
717
+ padding: 10px 20px;
718
+ }
719
+ }
720
+ </style>