@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,230 @@
1
+ {% layout 'layout/theme' %}
2
+
3
+ <section class="account-page">
4
+ <div class="container">
5
+ <div class="account-header">
6
+ <h1 class="account-title display-2">Order Details</h1>
7
+ {% if order %}
8
+ <p class="account-subtitle">Order #{{ order.orderNumber }}</p>
9
+ {% endif %}
10
+ </div>
11
+
12
+ <div class="account-layout">
13
+ <!-- Sidebar -->
14
+ <aside class="account-sidebar">
15
+ {% render 'snippets/account-sidebar' %}
16
+ </aside>
17
+
18
+ <!-- Content -->
19
+ <div class="account-content">
20
+ {% if order %}
21
+ <div class="account-section-header">
22
+ <h2 class="account-section-title">Order #{{ order.orderNumber }}</h2>
23
+ </div>
24
+
25
+ <div class="order-detail">
26
+
27
+ <!-- ORDER INFO -->
28
+ <div class="order-detail-summary">
29
+ <p><strong>Date:</strong> {{ order.createdOn | date: '%d-%m-%Y %H:%M' }}</p>
30
+ <p><strong>Status:</strong> {{ order.orderStatus }}</p>
31
+ {% if order.couponCode %}
32
+ <p><strong>Coupon:</strong> {{ order.couponCode }}</p>
33
+ {% endif %}
34
+ </div>
35
+
36
+ <!-- PAYMENT DETAILS -->
37
+ <div class="payment-details">
38
+ <h5>Payment Details</h5>
39
+
40
+ <div class="payment-row">
41
+ <span>Subtotal</span>
42
+ <span>{{ order.subTotal | money_with_settings: shop.settings }}</span>
43
+ </div>
44
+
45
+ <div class="payment-row">
46
+ <span>Tax Amount</span>
47
+ <span>{{ order.taxAmount | money_with_settings: shop.settings }}</span>
48
+ </div>
49
+
50
+ <div class="payment-row">
51
+ <span>Discount</span>
52
+ <span>- {{ order.discountAmount | money_with_settings: shop.settings }}</span>
53
+ </div>
54
+
55
+ <div class="payment-row">
56
+ <span>Payment Fee</span>
57
+ <span>{{ order.paymentFeeAmount | money_with_settings: shop.settings }}</span>
58
+ </div>
59
+
60
+ <div class="payment-row payment-total">
61
+ <span>Order Total</span>
62
+ <span>{{ order.orderTotal | money_with_settings: shop.settings }}</span>
63
+ </div>
64
+ </div>
65
+
66
+ <!-- ITEMS -->
67
+ <div class="order-items">
68
+ <h5>Items</h5>
69
+ {% if order.items and order.items.size > 0 %}
70
+ <table class="order-items-table">
71
+ <thead>
72
+ <tr>
73
+ <th>Product</th>
74
+ <th>Qty</th>
75
+ <th>Price</th>
76
+ <th>Total</th>
77
+ </tr>
78
+ </thead>
79
+ <tbody>
80
+ {% for item in order.items %}
81
+ <tr>
82
+ <td>{{ item.productName }}</td>
83
+ <td>{{ item.quantity }}</td>
84
+ <td>{{ item.productPrice | money_with_settings: shop.settings }}</td>
85
+ <td>{{ item.total | money_with_settings: shop.settings }}</td>
86
+ </tr>
87
+ {% endfor %}
88
+ </tbody>
89
+ </table>
90
+ {% else %}
91
+ <p>No items found.</p>
92
+ {% endif %}
93
+ </div>
94
+
95
+ <!-- ADDRESSES -->
96
+ {% if order.billingAddress %}
97
+ <div class="order-detail-addresses">
98
+ <div class="order-address">
99
+ <h6>Billing Address</h6>
100
+ <p>{{ order.billingAddress.contactName }}</p>
101
+ <p>{{ order.billingAddress.addressLine1 }}</p>
102
+ <p>{{ order.billingAddress.addressLine2 }}</p>
103
+ <p>{{ order.billingAddress.city }},
104
+ {{ order.billingAddress.stateOrProvinceName }}
105
+ {{ order.billingAddress.zipCode }}</p>
106
+ <p>{{ order.billingAddress.countryName }}</p>
107
+ <p>Phone: {{ order.billingAddress.phone }}</p>
108
+ </div>
109
+
110
+ {% if order.shippingAddress %}
111
+ <div class="order-address">
112
+ <h6>Shipping Address</h6>
113
+ <p>{{ order.shippingAddress.contactName }}</p>
114
+ <p>{{ order.shippingAddress.addressLine1 }}</p>
115
+ <p>{{ order.shippingAddress.addressLine2 }}</p>
116
+ <p>{{ order.shippingAddress.city }},
117
+ {{ order.shippingAddress.stateOrProvinceName }}
118
+ {{ order.shippingAddress.zipCode }}</p>
119
+ <p>{{ order.shippingAddress.countryName }}</p>
120
+ <p>Phone: {{ order.shippingAddress.phone }}</p>
121
+ </div>
122
+ {% endif %}
123
+ </div>
124
+ {% endif %}
125
+
126
+ </div>
127
+ {% else %}
128
+ <div class="empty-state">
129
+ <p>Order not found.</p>
130
+ <a href="/orders" class="btn btn-primary">Back to Orders</a>
131
+ </div>
132
+ {% endif %}
133
+ </div>
134
+ </div>
135
+ </div>
136
+ </section>
137
+
138
+ <style>
139
+ :root {
140
+ --color-primary:#2563eb;
141
+ --color-border:#e5e7eb;
142
+ --color-border-light:#f3f4f6;
143
+ --color-text:#1f2937;
144
+ --color-text-light:#6b7280;
145
+ --color-bg:#f9fafb;
146
+ --card:#fff;
147
+ --radius:0.6rem;
148
+ }
149
+
150
+ /* Layout */
151
+ .account-page { background:var(--color-bg); padding:3rem 1rem; }
152
+ .container { max-width:1200px; margin:auto; }
153
+ .account-layout { display:grid; grid-template-columns:280px 1fr; gap:2rem; }
154
+ .account-sidebar, .account-content { background:var(--card); border-radius:var(--radius); padding:1.5rem; border:1px solid var(--color-border); }
155
+
156
+ /* Summary */
157
+ .order-detail-summary {
158
+ display:grid;
159
+ grid-template-columns:repeat(auto-fit,minmax(220px,1fr));
160
+ gap:1rem;
161
+ background:var(--color-border-light);
162
+ padding:1rem;
163
+ border-radius:var(--radius);
164
+ font-size:1.1rem;
165
+ }
166
+
167
+ /* Payment */
168
+ .payment-details {
169
+ max-width:500px;
170
+ border:1px solid var(--color-border);
171
+ border-radius:var(--radius);
172
+ padding:1rem;
173
+ }
174
+
175
+ .payment-details h5 {
176
+ font-size:1.3rem;
177
+ margin-bottom:1rem;
178
+ }
179
+
180
+ .payment-row {
181
+ display:flex;
182
+ justify-content:space-between;
183
+ padding:.6rem 0;
184
+ border-bottom:1px dashed var(--color-border);
185
+ font-size:1.15rem;
186
+ }
187
+
188
+ .payment-row:last-child { border:none; }
189
+
190
+ .payment-total {
191
+ font-size:1.3rem;
192
+ font-weight:700;
193
+ color:var(--color-primary);
194
+ }
195
+
196
+ /* Table */
197
+ .order-items-table {
198
+ width:100%;
199
+ border-collapse:collapse;
200
+ margin-top:1rem;
201
+ }
202
+
203
+ .order-items-table th,
204
+ .order-items-table td {
205
+ padding:.8rem;
206
+ border-bottom:1px solid var(--color-border);
207
+ }
208
+
209
+ .order-items-table th { background:var(--color-border-light); }
210
+
211
+ /* Addresses */
212
+ .order-detail-addresses {
213
+ display:grid;
214
+ grid-template-columns:1fr 1fr;
215
+ gap:1.5rem;
216
+ }
217
+
218
+ .order-address {
219
+ background:var(--color-border-light);
220
+ padding:1rem;
221
+ border-radius:var(--radius);
222
+ }
223
+
224
+ /* Responsive */
225
+ @media(max-width:768px){
226
+ .account-layout { grid-template-columns:1fr; }
227
+ .order-detail-addresses { grid-template-columns:1fr; }
228
+ }
229
+
230
+ </style>
@@ -0,0 +1,349 @@
1
+ {% layout 'layout/theme' %}
2
+
3
+ <section class="account-page">
4
+ <div class="container">
5
+
6
+ <!-- Page Header -->
7
+ <header class="account-header">
8
+ <h1 class="account-title display-2">My Orders</h1>
9
+ <p class="account-subtitle">View and manage your orders</p>
10
+ </header>
11
+
12
+ <div class="account-layout">
13
+
14
+ <!-- Sidebar -->
15
+ <aside class="account-sidebar">
16
+ {% render 'snippets/account-sidebar' %}
17
+ </aside>
18
+
19
+ <!-- Orders Content -->
20
+ <main class="account-content">
21
+ {% hook 'account_orders_before' %}
22
+
23
+ <div class="account-section-header">
24
+ <h2 class="account-section-title">Order History</h2>
25
+ </div>
26
+
27
+ <div class="orders-list">
28
+ {% assign orderItems = orders.items | default: orders.orders | default: orders %}
29
+
30
+ {% if orderItems and orderItems.size > 0 %}
31
+ {% for order in orderItems %}
32
+ {% hook 'account_order_before' %}
33
+
34
+ <article class="order-card">
35
+ <div class="order-card-left">
36
+ <h3 class="order-number">
37
+ Order #{{ order.orderNumber }}
38
+ </h3>
39
+
40
+ <div class="order-meta">
41
+ <span class="order-date">
42
+ {{ order.createdOn | date: ' %d, %Y' }}
43
+ </span>
44
+ <span class="order-items">
45
+ {{ order.itemCount }} item{{ order.itemCount | pluralize }}
46
+ </span>
47
+ </div>
48
+ </div>
49
+
50
+ <div class="order-card-center">
51
+ <span class="status-badge status-{{ order.orderStatus | downcase }}">
52
+ {{ order.orderStatus }}
53
+ </span>
54
+ </div>
55
+
56
+ <div class="order-card-right">
57
+ <div class="order-total">
58
+ {{ order.orderTotal | money_with_settings: shop.settings }}
59
+ </div>
60
+
61
+ <a
62
+ href="/orders/{{ order.id }}"
63
+ class="btn btn-sm btn-outline"
64
+ aria-label="View order {{ order.orderNumber }}"
65
+ >
66
+ View Details
67
+ </a>
68
+ </div>
69
+ </article>
70
+
71
+ {% hook 'account_order_after' %}
72
+ {% endfor %}
73
+ {% else %}
74
+ <div class="empty-state">
75
+ <h3>No orders yet</h3>
76
+ <p>You haven’t placed any orders.</p>
77
+ <a href="/products" class="btn btn-primary">
78
+ Start Shopping
79
+ </a>
80
+ </div>
81
+ {% endif %}
82
+ <!-- Pagination -->
83
+ {% include 'snippets/pagination', pagination: pagination %}
84
+ </div>
85
+
86
+ {% hook 'account_orders_after' %}
87
+ </main>
88
+
89
+ </div>
90
+ </div>
91
+
92
+ </section>
93
+ <style>/* ===============================
94
+ ACCOUNT PAGE BASE
95
+ =============================== */
96
+
97
+ :root {
98
+ --color-primary: #1f2937;
99
+ --color-primary-hover: #1d4ed8;
100
+ --color-primary-light: #dbeafe;
101
+ --color-success: #10b981;
102
+ --color-success-light: #d1fae5;
103
+ --color-success-dark: #065f46;
104
+ --color-warning: #f59e0b;
105
+ --color-warning-light: #fef3c7;
106
+ --color-warning-dark: #92400e;
107
+ --color-danger: #ef4444;
108
+ --color-danger-light: #fee2e2;
109
+ --color-danger-dark: #991b1b;
110
+ --color-info: #3b82f6;
111
+ --color-info-light: #dbeafe;
112
+ --color-info-dark: #1e40af;
113
+ --color-text: #1f2937;
114
+ --color-text-light: #6b7280;
115
+ --color-background: #f9fafb;
116
+ --color-card-bg: #ffffff;
117
+ --color-border: #e5e7eb;
118
+ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
119
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
120
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
121
+ --radius-md: 0.5rem;
122
+ --radius-lg: 0.75rem;
123
+ --spacing-sm: 1rem;
124
+ --spacing-md: 1.5rem;
125
+ --spacing-lg: 2rem;
126
+ --spacing-xl: 3rem;
127
+ }
128
+
129
+ .account-page {
130
+ padding: var(--spacing-xl) var(--spacing-sm);
131
+ background: var(--color-background);
132
+ min-height: 100vh;
133
+ }
134
+
135
+ .container {
136
+ max-width: 1200px;
137
+ margin: 0 auto;
138
+ padding: 0 var(--spacing-sm);
139
+ }
140
+
141
+ .account-header {
142
+ text-align: center;
143
+ margin-bottom: var(--spacing-xl);
144
+
145
+ }
146
+
147
+ .account-title {
148
+ font-size: 2.5rem;
149
+ font-weight: 700;
150
+ color: var(--color-text);
151
+ margin: 0 0 0.5rem 0;
152
+ letter-spacing: -0.025em;
153
+ }
154
+
155
+ .account-subtitle {
156
+ font-size: 1.125rem;
157
+ color: var(--color-text-light);
158
+ margin: 0;
159
+ }
160
+
161
+ /* Two-column layout on desktop */
162
+ .account-layout {
163
+ display: grid;
164
+ grid-template-columns: 280px minmax(0, 1fr);
165
+ gap: var(--spacing-lg);
166
+ align-items: flex-start;
167
+ }
168
+
169
+ /* Sidebar */
170
+ .account-sidebar {
171
+ position: sticky;
172
+ top: var(--spacing-lg);
173
+ background: var(--color-card-bg);
174
+ border-radius: var(--radius-lg);
175
+ padding: var(--spacing-md);
176
+ box-shadow: var(--shadow-md);
177
+ border: 1px solid var(--color-border);
178
+ }
179
+
180
+ /* Main content */
181
+ .account-content {
182
+ background: var(--color-card-bg);
183
+ border-radius: var(--radius-lg);
184
+ padding: var(--spacing-lg);
185
+ box-shadow: var(--shadow-md);
186
+ border: 1px solid var(--color-border);
187
+ /*max-height: calc(109vh - 200px);*/ /* optional: control inner scroll area */
188
+ overflow-y: auto;
189
+ }
190
+ .pagination {
191
+ display: flex;
192
+ justify-content: flex-end;
193
+ align-items: center;
194
+ }
195
+ .account-section-header {
196
+ margin-bottom: var(--spacing-lg);
197
+ padding-bottom: var(--spacing-md);
198
+ border-bottom: 1px solid var(--color-border);
199
+ }
200
+
201
+ .account-section-title {
202
+ font-size: 1.75rem;
203
+ font-weight: 600;
204
+ color: var(--color-text);
205
+ margin: 0;
206
+ }
207
+
208
+ /* ===============================
209
+ ORDERS LIST
210
+ =============================== */
211
+
212
+ .orders-list {
213
+ display: flex;
214
+ flex-direction: column;
215
+ gap: 1rem;
216
+ }
217
+
218
+ /* Order Card */
219
+ .order-card {
220
+ display: grid;
221
+ grid-template-columns: 1fr 1fr 1fr;
222
+ gap: 1.5rem;
223
+ align-items: center;
224
+ padding: 1.25rem 1.5rem;
225
+ border-radius: 12px;
226
+ border: 1px solid rgba(0, 0, 0, 0.08);
227
+ box-sizing: border-box;
228
+ }
229
+
230
+ .order-card-left {
231
+ display: flex;
232
+ flex-direction: column;
233
+ gap: 0.4rem;
234
+ }
235
+
236
+ .order-number {
237
+ margin: 0;
238
+ font-size: 1.4rem;
239
+ font-weight: 600;
240
+ }
241
+
242
+ .order-meta {
243
+ display: flex;
244
+ gap: 1rem;
245
+ font-size: 1.4rem;
246
+ opacity: 0.85;
247
+ }
248
+
249
+ .order-card-center {
250
+ display: flex;
251
+ justify-content: center;
252
+ }
253
+
254
+ .order-card-right {
255
+ display: flex;
256
+ flex-direction: column;
257
+ align-items: flex-end;
258
+ gap: 0.6rem;
259
+ }
260
+
261
+ .order-total {
262
+ font-size: 1.4rem;
263
+ font-weight: 600;
264
+ }
265
+
266
+ /* ===============================
267
+ EMPTY STATE
268
+ =============================== */
269
+
270
+ .empty-state {
271
+ text-align: center;
272
+ padding: 3rem 1rem;
273
+ }
274
+
275
+ .empty-state h3 {
276
+ margin-bottom: 0.5rem;
277
+ }
278
+
279
+ /* ===============================
280
+ RESPONSIVE
281
+ =============================== */
282
+
283
+ /* Tablet and below: stack sidebar on top */
284
+ @media (max-width: 1024px) {
285
+ .account-layout {
286
+ grid-template-columns: 1fr;
287
+ }
288
+
289
+ .account-sidebar {
290
+ position: static;
291
+ width: 100%;
292
+ }
293
+
294
+ .account-content {
295
+ max-height: none;
296
+ overflow: visible;
297
+ }
298
+ }
299
+
300
+ /* Mobile */
301
+ @media (max-width: 768px) {
302
+ .account-title {
303
+ font-size: 2rem;
304
+ }
305
+
306
+ .order-card {
307
+ grid-template-columns: 1fr 1fr 1fr;
308
+ padding: 1rem;
309
+ gap: 1rem;
310
+ }
311
+
312
+ .order-card-left,
313
+ .order-card-center,
314
+ .order-card-right {
315
+ align-items: flex-start;
316
+ }
317
+
318
+ .order-card-right {
319
+ width: 100%;
320
+ flex-direction: row;
321
+ justify-content: space-between;
322
+ align-items: center;
323
+ }
324
+
325
+ .btn {
326
+ min-height: 42px;
327
+ padding: 0.5rem 1rem;
328
+ }
329
+ }
330
+
331
+ /* Small phones */
332
+ @media (max-width: 480px) {
333
+ .order-meta {
334
+ flex-direction: column;
335
+ gap: 0.25rem;
336
+ }
337
+
338
+ .btn {
339
+ width: 100%;
340
+ text-align: center;
341
+ }
342
+
343
+ .order-card-right {
344
+ flex-direction: column;
345
+ align-items: stretch;
346
+ }
347
+ }
348
+
349
+ </style>