@o2vend/theme-cli 1.0.37 → 1.0.38

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 (89) hide show
  1. package/lib/lib/dev-server.js +309 -40
  2. package/lib/lib/liquid-engine.js +3 -1
  3. package/lib/lib/mock-data.js +36 -124
  4. package/lib/lib/widget-service.js +12 -4
  5. package/package.json +1 -1
  6. package/test-theme/assets/async-sections.js +32 -24
  7. package/test-theme/assets/cart-drawer.js +20 -22
  8. package/test-theme/assets/cart-manager.js +1 -15
  9. package/test-theme/assets/checkout-price-handler.js +12 -11
  10. package/test-theme/assets/checkout.css +1415 -0
  11. package/test-theme/assets/checkout.js +3174 -0
  12. package/test-theme/assets/components.css +178 -29
  13. package/test-theme/assets/delivery-zone.js +1 -1
  14. package/test-theme/assets/product-detail.css +1050 -0
  15. package/test-theme/assets/product-detail.js +2940 -0
  16. package/test-theme/assets/theme.css +95 -120
  17. package/test-theme/assets/theme.js +781 -186
  18. package/test-theme/layout/theme.liquid +91 -17
  19. package/test-theme/sections/content.liquid +64 -57
  20. package/test-theme/sections/footer-fallback.liquid +57 -7
  21. package/test-theme/sections/footer.liquid +63 -12
  22. package/test-theme/sections/header-fallback.liquid +41 -41
  23. package/test-theme/sections/header.liquid +41 -51
  24. package/test-theme/sections/hero-fallback.liquid +1 -1
  25. package/test-theme/sections/hero.liquid +159 -136
  26. package/test-theme/snippets/account-sidebar.liquid +121 -29
  27. package/test-theme/snippets/add-to-cart-modal.liquid +258 -206
  28. package/test-theme/snippets/breadcrumbs.liquid +98 -11
  29. package/test-theme/snippets/cart-drawer.liquid +93 -0
  30. package/test-theme/snippets/delivery-zone-city-selector.liquid +101 -15
  31. package/test-theme/snippets/delivery-zone-modal.liquid +529 -84
  32. package/test-theme/snippets/delivery-zone-search.liquid +104 -18
  33. package/test-theme/snippets/login-modal.liquid +269 -82
  34. package/test-theme/snippets/mega-menu.liquid +130 -43
  35. package/test-theme/snippets/news-thumbnail.liquid +120 -28
  36. package/test-theme/snippets/pagination.liquid +1 -1
  37. package/test-theme/snippets/price.liquid +100 -9
  38. package/test-theme/snippets/product-card-related.liquid +22 -4
  39. package/test-theme/snippets/product-card-simple.liquid +521 -25
  40. package/test-theme/snippets/product-card.liquid +145 -232
  41. package/test-theme/snippets/rating.liquid +100 -9
  42. package/test-theme/snippets/skeleton-collection-grid.liquid +94 -8
  43. package/test-theme/snippets/skeleton-product-card.liquid +102 -16
  44. package/test-theme/snippets/skeleton-product-grid.liquid +87 -1
  45. package/test-theme/snippets/social-sharing.liquid +133 -32
  46. package/test-theme/templates/account/dashboard.liquid +30 -0
  47. package/test-theme/templates/account/loyalty-redemption.liquid +29 -28
  48. package/test-theme/templates/account/loyalty.liquid +45 -43
  49. package/test-theme/templates/account/order-detail.liquid +15 -8
  50. package/test-theme/templates/account/orders.liquid +189 -35
  51. package/test-theme/templates/account/profile.liquid +509 -114
  52. package/test-theme/templates/account/register.liquid +18 -8
  53. package/test-theme/templates/account/return-orders.liquid +31 -30
  54. package/test-theme/templates/account/store-credit.liquid +27 -26
  55. package/test-theme/templates/account/subscriptions.liquid +22 -5
  56. package/test-theme/templates/account/wishlist.liquid +88 -19
  57. package/test-theme/templates/address-book.liquid +166 -69
  58. package/test-theme/templates/categories.liquid +90 -30
  59. package/test-theme/templates/checkout.liquid +137 -3834
  60. package/test-theme/templates/error.liquid +23 -21
  61. package/test-theme/templates/index.liquid +29 -0
  62. package/test-theme/templates/login.liquid +33 -6
  63. package/test-theme/templates/order-confirmation.liquid +67 -9
  64. package/test-theme/templates/page.liquid +418 -206
  65. package/test-theme/templates/product-detail.liquid +124 -3878
  66. package/test-theme/templates/products.liquid +155 -30
  67. package/test-theme/templates/search.liquid +739 -225
  68. package/test-theme/widgets/brand-carousel.liquid +102 -82
  69. package/test-theme/widgets/brand.liquid +78 -50
  70. package/test-theme/widgets/carousel.liquid +253 -121
  71. package/test-theme/widgets/category-list-carousel.liquid +32 -8
  72. package/test-theme/widgets/category-list.liquid +21 -6
  73. package/test-theme/widgets/category.liquid +104 -37
  74. package/test-theme/widgets/discount-time.liquid +326 -119
  75. package/test-theme/widgets/footer-menu.liquid +115 -23
  76. package/test-theme/widgets/footer.liquid +118 -5
  77. package/test-theme/widgets/gallery.liquid +29 -5
  78. package/test-theme/widgets/header-menu.liquid +25 -13
  79. package/test-theme/widgets/header.liquid +64 -26
  80. package/test-theme/widgets/html.liquid +29 -6
  81. package/test-theme/widgets/news.liquid +6 -0
  82. package/test-theme/widgets/product-canvas.liquid +20 -12
  83. package/test-theme/widgets/product-carousel.liquid +118 -56
  84. package/test-theme/widgets/shared/product-grid.liquid +12 -0
  85. package/test-theme/widgets/single-product.liquid +688 -250
  86. package/test-theme/widgets/spacebar-carousel.liquid +39 -10
  87. package/test-theme/widgets/spacebar.liquid +77 -6
  88. package/test-theme/widgets/splash.liquid +40 -30
  89. package/test-theme/widgets/testimonial-carousel.liquid +111 -67
@@ -101,80 +101,237 @@
101
101
  </div>
102
102
 
103
103
  <style>
104
+ :root {
105
+ --color-primary: {{ settings.color_primary | default: '#000000' }};
106
+ --color-primary-hover: {{ settings.color_primary_dark | default: '#1a1a1a' }};
107
+ --color-primary-light: {{ settings.color_primary_light | default: '#333333' }};
108
+ --color-success: {{ settings.color_success | default: '#000000' }};
109
+ --color-success-light: {{ settings.color_success_light | default: '#4a4a4a' }};
110
+ --color-success-dark: {{ settings.color_success_dark | default: '#000000' }};
111
+ --color-danger: {{ settings.color_error | default: '#000000' }};
112
+ --color-danger-light: {{ settings.color_error_light | default: '#4a4a4a' }};
113
+ --color-danger-dark: {{ settings.color_error_dark | default: '#000000' }};
114
+ --color-text: {{ settings.color_text | default: '#000000' }};
115
+ --color-text-light: {{ settings.color_text_light | default: '#999999' }};
116
+ --color-text-muted: {{ settings.color_text_muted | default: '#666666' }};
117
+ --color-background: {{ settings.color_background | default: '#ffffff' }};
118
+ --color-card-bg: {{ settings.color_surface | default: '#f5f5f5' }};
119
+ --color-border: {{ settings.color_border | default: '#e0e0e0' }};
120
+ --color-border-light: {{ settings.color_border_light | default: '#f0f0f0' }};
121
+ --color-white: #ffffff;
122
+ --color-black: #000000;
123
+ --color-gray-25: {{ settings.color_gray_25 | default: '#fafafa' }};
124
+ --color-gray-50: {{ settings.color_gray_50 | default: '#f7f7f7' }};
125
+ --color-gray-100: {{ settings.color_gray_100 | default: '#f0f0f0' }};
126
+ --color-gray-200: {{ settings.color_gray_200 | default: '#e0e0e0' }};
127
+ --color-gray-300: {{ settings.color_gray_300 | default: '#d0d0d0' }};
128
+ --color-gray-400: {{ settings.color_gray_400 | default: '#a0a0a0' }};
129
+ --color-gray-500: {{ settings.color_gray_500 | default: '#808080' }};
130
+ --color-gray-600: {{ settings.color_gray_600 | default: '#666666' }};
131
+ --color-gray-700: {{ settings.color_gray_700 | default: '#4a4a4a' }};
132
+ --color-gray-800: {{ settings.color_gray_800 | default: '#2a2a2a' }};
133
+ --color-gray-900: {{ settings.color_gray_900 | default: '#000000' }};
134
+ --radius-sm: {{ settings.radius_sm | default: '0.25rem' }};
135
+ --radius-md: {{ settings.radius_md | default: '0.375rem' }};
136
+ --radius-lg: {{ settings.radius_lg | default: '0.5rem' }};
137
+ --radius-xl: {{ settings.radius_xl | default: '0.625rem' }};
138
+ --radius-2xl: {{ settings.radius_2xl | default: '0.75rem' }};
139
+ --radius-full: {{ settings.radius_full | default: '9999px' }};
140
+ --radius-none: 0;
141
+ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
142
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
143
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
144
+ --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
145
+ --shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
146
+ --radius-sm: 0.375rem;
147
+ --radius-md: 0.5rem;
148
+ --radius-lg: 0.75rem;
149
+ --radius-xl: 1rem;
150
+ --radius-2xl: 1.5rem;
151
+ --radius-full: 9999px;
152
+ --radius-none: 0;
153
+ --space-0: 0;
154
+ --space-0-5: 0.125rem;
155
+ --space-1: 0.25rem;
156
+ --space-1-5: 0.375rem;
157
+ --space-2: 0.5rem;
158
+ --space-3: 0.75rem;
159
+ --space-3-5: 0.875rem;
160
+ --space-4: 1rem;
161
+ --space-5: 1.25rem;
162
+ --space-6: 1.5rem;
163
+ --space-8: 2rem;
164
+ --space-10: 2.5rem;
165
+ --space-12: 3rem;
166
+ --text-xs: 0.75rem;
167
+ --text-sm: 0.875rem;
168
+ --text-base: 1rem;
169
+ --text-lg: 1.125rem;
170
+ --text-xl: 1.25rem;
171
+ --text-2xl: 1.5rem;
172
+ --text-3xl: 1.875rem;
173
+ --transition: all 0.2s ease;
174
+ --transition-fast: all 0.15s ease;
175
+ --transition-slow: all 0.3s ease;
176
+ --duration-150: 150ms;
177
+ --duration-300: 300ms;
178
+ --ease-out: cubic-bezier(0, 0, 0.2, 1);
179
+ --ease-in: cubic-bezier(0.4, 0, 1, 1);
180
+ --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
181
+ --z-10: 10;
182
+ --z-modal: 1000;
183
+ --z-dropdown: 100;
184
+ --font-primary: {{ settings.font_primary | default: '' }}, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Helvetica Neue', Arial, sans-serif;
185
+ --font-heading: {{ settings.font_heading | default: '' }}, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Helvetica Neue', Arial, sans-serif;
186
+ --leading-none: 1;
187
+ --leading-tight: 1.25;
188
+ --leading-snug: 1.375;
189
+ --leading-normal: 1.5;
190
+ --leading-relaxed: 1.625;
191
+ --tracking-wider: 0.05em;
192
+ }
193
+
194
+ /* Modal Base */
104
195
  .delivery-zone-modal {
105
196
  position: fixed;
106
197
  inset: 0;
107
- z-index: 9999;
108
- display: none;
198
+ z-index: var(--z-modal);
199
+ display: none;
200
+ opacity: 0;
201
+ transition: opacity var(--duration-300) var(--ease-out);
109
202
  }
110
203
 
111
204
  .delivery-zone-modal.active {
112
205
  display: flex;
113
206
  align-items: center;
114
- justify-content: center;
207
+ justify-content: center;
208
+ opacity: 1;
209
+ animation: fadeIn var(--duration-300) var(--ease-out);
210
+ }
211
+
212
+ @keyframes fadeIn {
213
+ from { opacity: 0; }
214
+ to { opacity: 1; }
115
215
  }
116
216
 
117
217
  .delivery-zone-overlay {
118
218
  position: absolute;
119
219
  inset: 0;
120
- background: rgba(0, 0, 0, 0.5);
121
- backdrop-filter: blur(4px);
220
+ background: rgba(0, 0, 0, 0.6);
221
+ backdrop-filter: blur(8px);
222
+ -webkit-backdrop-filter: blur(8px);
223
+ animation: overlayFade var(--duration-300) var(--ease-out);
224
+ }
225
+
226
+ @keyframes overlayFade {
227
+ from { opacity: 0; }
228
+ to { opacity: 1; }
122
229
  }
123
230
 
124
231
  .delivery-zone-panel {
125
232
  position: relative;
126
- background: white;
127
- border-radius: 16px;
128
- box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
129
- width: 90%;
130
- max-width: 500px;
131
- max-height: 90vh;
233
+ background: var(--color-white);
234
+ border-radius: var(--radius-md);
235
+ border: 1px solid var(--color-border);
236
+ width: 92%;
237
+ max-width: 520px;
238
+ max-height: 92vh;
132
239
  overflow: hidden;
133
240
  display: flex;
134
- flex-direction: column;
241
+ flex-direction: column;
242
+ transform: scale(0.95);
243
+ animation: slideUp var(--duration-300) var(--ease-out) forwards;
135
244
  }
136
245
 
246
+ @keyframes slideUp {
247
+ from {
248
+ transform: scale(0.95) translateY(20px);
249
+ opacity: 0;
250
+ }
251
+ to {
252
+ transform: scale(1) translateY(0);
253
+ opacity: 1;
254
+ }
255
+ }
256
+
257
+ /* Header */
137
258
  .delivery-zone-header {
138
259
  display: flex;
139
260
  align-items: center;
140
261
  justify-content: space-between;
141
- padding: 24px;
142
- border-bottom: 1px solid #e5e7eb;
262
+ padding: var(--space-6) var(--space-6) var(--space-5) var(--space-6);
263
+ border-bottom: 1px solid var(--color-gray-200);
264
+ background: linear-gradient(to bottom, var(--color-white), var(--color-gray-50));
143
265
  }
144
266
 
145
267
  .delivery-zone-title {
146
268
  margin: 0;
147
- font-size: 20px;
148
- font-weight: 600;
149
- color: #111827;
269
+ font-size: clamp(1.125rem, 4vw, 1.375rem);
270
+ font-weight: 700;
271
+ color: var(--color-gray-900);
272
+ letter-spacing: -0.02em;
273
+ line-height: var(--leading-tight);
150
274
  }
151
275
 
152
276
  .delivery-zone-close {
153
- background: none;
277
+ background: var(--color-gray-100);
154
278
  border: none;
155
279
  cursor: pointer;
156
- color: #6b7280;
157
- padding: 4px;
280
+ color: var(--color-gray-600);
281
+ padding: var(--space-2);
158
282
  display: flex;
159
283
  align-items: center;
160
- justify-content: center;
284
+ justify-content: center;
285
+ border-radius: var(--radius-full);
286
+ transition: var(--transition-fast);
287
+ flex-shrink: 0;
288
+ width: 36px;
289
+ height: 36px;
161
290
  }
162
291
 
163
292
  .delivery-zone-close:hover {
164
- color: #111827;
293
+ background: var(--color-gray-200);
294
+ color: var(--color-gray-900);
295
+ transform: rotate(90deg);
296
+ }
297
+
298
+ .delivery-zone-close:active {
299
+ transform: rotate(90deg) scale(0.95);
165
300
  }
166
301
 
302
+ /* Content */
167
303
  .delivery-zone-content {
168
- padding: 24px;
169
- overflow-y: auto;
304
+ padding: var(--space-6);
305
+ overflow-y: auto;
306
+ flex: 1;
307
+ -webkit-overflow-scrolling: touch;
308
+ }
309
+
310
+ .delivery-zone-content::-webkit-scrollbar {
311
+ width: 6px;
312
+ }
313
+
314
+ .delivery-zone-content::-webkit-scrollbar-track {
315
+ background: var(--color-gray-100);
316
+ border-radius: var(--radius-full);
317
+ }
318
+
319
+ .delivery-zone-content::-webkit-scrollbar-thumb {
320
+ background: var(--color-gray-300);
321
+ border-radius: var(--radius-full);
322
+ }
323
+
324
+ .delivery-zone-content::-webkit-scrollbar-thumb:hover {
325
+ background: var(--color-gray-400);
170
326
  }
171
327
 
172
328
  .delivery-zone-form {
173
329
  display: flex;
174
330
  flex-direction: column;
175
- gap: 20px;
331
+ gap: var(--space-5);
176
332
  }
177
333
 
334
+ /* Input Group */
178
335
  .delivery-zone-input-group {
179
336
  position: relative;
180
337
  display: flex;
@@ -183,155 +340,443 @@
183
340
 
184
341
  .delivery-zone-input {
185
342
  width: 100%;
186
- padding: 14px 48px 14px 20px;
187
- border: 2px solid #a78bfa;
188
- border-radius: 12px;
189
- font-size: 16px;
190
- transition: all 0.2s ease;
191
- background: white;
343
+ padding: var(--space-4) 3.25rem var(--space-4) var(--space-5);
344
+ border: 2px solid var(--color-border);
345
+ border-radius: var(--radius-md);
346
+ font-size: clamp(0.9375rem, 3vw, 1rem);
347
+ transition: all var(--duration-300) var(--ease-out);
348
+ background: var(--color-white);
349
+ color: var(--color-text);
350
+ font-weight: 500;
351
+ }
352
+
353
+ .delivery-zone-input::placeholder {
354
+ color: var(--color-gray-400);
355
+ font-weight: 400;
356
+ }
357
+
358
+ .delivery-zone-input:hover {
359
+ border-color: var(--color-primary);
192
360
  }
193
361
 
194
362
  .delivery-zone-input:focus {
195
363
  outline: none;
196
- border-color: #7c3aed;
197
- box-shadow: 0 0 0 3px rgba(124, 58, 237, 0.1);
364
+ border-color: var(--color-primary);
365
+ transform: translateY(-1px);
198
366
  }
199
367
 
200
368
  .delivery-zone-search-icon {
201
369
  position: absolute;
202
- right: 16px;
203
- color: #a78bfa;
204
- pointer-events: none;
370
+ right: var(--space-4);
371
+ color: var(--color-text-muted);
372
+ pointer-events: none;
373
+ transition: var(--transition);
374
+ }
375
+
376
+ .delivery-zone-input:focus ~ .delivery-zone-search-icon {
377
+ color: var(--color-primary);
378
+ transform: scale(1.1);
205
379
  }
206
380
 
381
+ /* AutoDetect Mode */
207
382
  .delivery-zone-autodetect {
208
383
  display: flex;
209
384
  flex-direction: column;
210
- gap: 16px;
385
+ gap: var(--space-5);
211
386
  }
212
387
 
213
388
  .delivery-zone-detect-btn {
214
389
  display: flex;
215
390
  align-items: center;
216
391
  justify-content: center;
217
- gap: 8px;
392
+ gap: var(--space-2);
218
393
  width: 100%;
219
- padding: 14px;
220
- font-size: 16px;
394
+ padding: var(--space-4);
395
+ font-size: clamp(0.9375rem, 3vw, 1rem);
396
+ font-weight: 600;
397
+ background: var(--color-primary);
398
+ border: none;
399
+ border-radius: var(--radius-md);
400
+ color: var(--color-white);
401
+ cursor: pointer;
402
+ transition: var(--transition);
403
+ position: relative;
404
+ overflow: hidden;
405
+ }
406
+
407
+ .delivery-zone-detect-btn::before {
408
+ content: '';
409
+ position: absolute;
410
+ top: 50%;
411
+ left: 50%;
412
+ width: 0;
413
+ height: 0;
414
+ border-radius: var(--radius-full);
415
+ background: rgba(255, 255, 255, 0.2);
416
+ transform: translate(-50%, -50%);
417
+ transition: width 0.6s, height 0.6s;
418
+ }
419
+
420
+ .delivery-zone-detect-btn:hover::before {
421
+ width: 300px;
422
+ height: 300px;
423
+ }
424
+
425
+ .delivery-zone-detect-btn:hover {
426
+ background: var(--color-primary-hover);
427
+ transform: translateY(-2px);
428
+ }
429
+
430
+ .delivery-zone-detect-btn:active {
431
+ transform: translateY(0);
432
+ }
433
+
434
+ .delivery-zone-detect-btn svg {
435
+ position: relative;
436
+ z-index: 1;
437
+ animation: pulse 2s ease-in-out infinite;
438
+ }
439
+
440
+ @keyframes pulse {
441
+ 0%, 100% { transform: scale(1); }
442
+ 50% { transform: scale(1.1); }
221
443
  }
222
444
 
223
445
  .delivery-zone-or-divider {
224
446
  display: flex;
225
447
  align-items: center;
226
- gap: 12px;
448
+ gap: var(--space-3);
227
449
  text-transform: uppercase;
228
- font-size: 12px;
229
- font-weight: 600;
230
- color: #6b7280;
231
- text-align: center;
450
+ font-size: var(--text-xs);
451
+ font-weight: 700;
452
+ color: var(--color-gray-500);
453
+ text-align: center;
454
+ letter-spacing: var(--tracking-wider);
455
+ margin: var(--space-2) 0;
456
+ }
457
+
458
+ .delivery-zone-or-divider span {
459
+ background: var(--color-white);
460
+ padding: 0 var(--space-2);
461
+ position: relative;
462
+ z-index: 1;
232
463
  }
233
464
 
234
465
  .delivery-zone-or-divider::before,
235
466
  .delivery-zone-or-divider::after {
236
467
  content: '';
237
468
  flex: 1;
238
- height: 1px;
239
- background: #e5e7eb;
469
+ height: 2px;
470
+ background: linear-gradient(to right, transparent, var(--color-gray-200), transparent);
240
471
  }
241
472
 
473
+ /* Current Location */
242
474
  .delivery-zone-current {
243
- padding: 16px;
244
- background: #f3f4f6;
245
- border-radius: 8px;
475
+ padding: var(--space-4) var(--space-5);
476
+ background: var(--color-gray-50);
477
+ border: 1px solid var(--color-border);
478
+ border-radius: var(--radius-md);
246
479
  display: flex;
247
480
  flex-direction: column;
248
- gap: 4px;
481
+ gap: var(--space-2);
249
482
  }
250
483
 
251
484
  .delivery-zone-current-label {
252
485
  margin: 0;
253
- font-size: 12px;
254
- color: #6b7280;
486
+ font-size: var(--text-xs);
487
+ color: var(--color-text-muted);
255
488
  text-transform: uppercase;
256
- font-weight: 600;
489
+ font-weight: 700;
490
+ letter-spacing: var(--tracking-wider);
257
491
  }
258
492
 
259
493
  .delivery-zone-current-value {
260
494
  margin: 0;
261
- font-size: 14px;
262
- color: #111827;
495
+ font-size: clamp(0.875rem, 3vw, 0.9375rem);
496
+ color: var(--color-text);
263
497
  font-weight: 600;
264
498
  display: flex;
265
499
  align-items: center;
266
- gap: 8px;
500
+ gap: var(--space-2);
501
+ line-height: var(--leading-snug);
502
+ }
503
+
504
+ .delivery-zone-current-value svg {
505
+ flex-shrink: 0;
506
+ color: var(--color-primary);
267
507
  }
268
508
 
509
+ /* Error Message */
269
510
  .delivery-zone-error {
270
- padding: 12px 16px;
271
- background: #fef2f2;
272
- border: 1px solid #fecaca;
273
- border-radius: 8px;
274
- color: #991b1b;
275
- font-size: 14px;
511
+ padding: var(--space-4) var(--space-5);
512
+ background: var(--color-gray-50);
513
+ border: 1px solid var(--color-border);
514
+ border-radius: var(--radius-md);
515
+ color: var(--color-text);
516
+ font-size: var(--text-sm);
517
+ font-weight: 500;
518
+ display: flex;
519
+ align-items: center;
520
+ gap: var(--space-3);
521
+ animation: shake 0.5s ease;
522
+ }
523
+
524
+ @keyframes shake {
525
+ 0%, 100% { transform: translateX(0); }
526
+ 25% { transform: translateX(-5px); }
527
+ 75% { transform: translateX(5px); }
528
+ }
529
+
530
+ .delivery-zone-error::before {
531
+ content: '⚠';
532
+ font-size: 1.25rem;
533
+ flex-shrink: 0;
276
534
  }
277
535
 
536
+ /* Actions */
278
537
  .delivery-zone-actions {
279
538
  display: flex;
280
- gap: 12px;
539
+ gap: var(--space-3);
540
+ margin-top: var(--space-2);
281
541
  }
282
542
 
283
543
  .delivery-zone-submit {
284
544
  flex: 1;
285
- padding: 14px;
286
- font-size: 16px;
287
- font-weight: 600;
545
+ padding: var(--space-4);
546
+ font-size: clamp(0.9375rem, 3vw, 1rem);
547
+ font-weight: 700;
548
+ background: var(--color-primary);
549
+ border: none;
550
+ border-radius: var(--radius-md);
551
+ color: var(--color-white);
552
+ cursor: pointer;
553
+ transition: var(--transition);
554
+ letter-spacing: 0.02em;
555
+ position: relative;
556
+ overflow: hidden;
557
+ }
558
+
559
+ .delivery-zone-submit::before {
560
+ content: '';
561
+ position: absolute;
562
+ top: 0;
563
+ left: -100%;
564
+ width: 100%;
565
+ height: 100%;
566
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
567
+ transition: left 0.5s;
568
+ }
569
+
570
+ .delivery-zone-submit:hover::before {
571
+ left: 100%;
572
+ }
573
+
574
+ .delivery-zone-submit:hover {
575
+ background: var(--color-primary-hover);
576
+ transform: translateY(-2px);
577
+ }
578
+
579
+ .delivery-zone-submit:active {
580
+ transform: translateY(0);
288
581
  }
289
582
 
583
+ /* Loading State */
290
584
  .delivery-zone-loading {
291
585
  position: absolute;
292
586
  inset: 0;
293
- background: rgba(255, 255, 255, 0.95);
587
+ background: rgba(255, 255, 255, 0.98);
588
+ backdrop-filter: blur(4px);
294
589
  display: flex;
295
590
  flex-direction: column;
296
591
  align-items: center;
297
592
  justify-content: center;
298
- gap: 16px;
593
+ gap: var(--space-4);
594
+ z-index: 10;
595
+ }
596
+
597
+ .delivery-zone-loading p {
598
+ margin: 0;
599
+ color: var(--color-gray-700);
600
+ font-weight: 600;
601
+ font-size: var(--text-base);
299
602
  }
300
603
 
301
604
  .spinner {
302
- width: 40px;
303
- height: 40px;
304
- border: 4px solid #e5e7eb;
305
- border-top-color: #a78bfa;
306
- border-radius: 50%;
307
- animation: spin 0.8s linear infinite;
605
+ width: 3rem;
606
+ height: 3rem;
607
+ border: 3px solid var(--color-border);
608
+ border-top-color: var(--color-primary);
609
+ border-radius: var(--radius-full);
610
+ animation: spin 0.8s linear infinite;
308
611
  }
309
612
 
310
613
  @keyframes spin {
311
614
  to { transform: rotate(360deg); }
312
615
  }
313
616
 
314
- /* Mobile responsive */
315
- @media (max-width: 640px) {
617
+ /* Touch Device Optimizations */
618
+ @media (hover: none) and (pointer: coarse) {
619
+ .delivery-zone-input {
620
+ font-size: 16px; /* Prevents zoom on iOS */
621
+ }
622
+
623
+ .delivery-zone-close:hover {
624
+ transform: none;
625
+ }
626
+
627
+ .delivery-zone-close:active {
628
+ transform: scale(0.95);
629
+ }
630
+ }
631
+
632
+ /* Tablet Responsive (481px - 1024px) */
633
+ @media (min-width: 481px) and (max-width: 1024px) {
634
+ .delivery-zone-panel {
635
+ width: 88%;
636
+ max-width: 540px;
637
+ }
638
+
639
+ .delivery-zone-header {
640
+ padding: var(--space-6);
641
+ }
642
+
643
+ .delivery-zone-content {
644
+ padding: var(--space-6);
645
+ }
646
+ }
647
+
648
+ /* Mobile Responsive (max-width: 480px) */
649
+ @media (max-width: 480px) {
650
+ .delivery-zone-modal.active {
651
+ align-items: flex-end;
652
+ }
653
+
316
654
  .delivery-zone-panel {
317
655
  width: 100%;
318
656
  max-width: 100%;
319
- border-radius: 0;
320
- height: 100%;
321
- max-height: 100%;
657
+ border-radius: var(--radius-md) var(--radius-md) 0 0;
658
+ max-height: 95vh;
659
+ animation: slideUpMobile var(--duration-300) var(--ease-out) forwards;
660
+ }
661
+
662
+ @keyframes slideUpMobile {
663
+ from {
664
+ transform: translateY(100%);
665
+ }
666
+ to {
667
+ transform: translateY(0);
668
+ }
322
669
  }
323
670
 
324
671
  .delivery-zone-header {
325
- padding: 16px;
672
+ padding: var(--space-5) var(--space-5) var(--space-4) var(--space-5);
326
673
  }
327
674
 
328
675
  .delivery-zone-content {
329
- padding: 16px;
676
+ padding: var(--space-5);
330
677
  }
331
678
 
332
679
  .delivery-zone-title {
333
- font-size: 18px;
680
+ font-size: 1.125rem;
681
+ line-height: var(--leading-tight);
682
+ }
683
+
684
+ .delivery-zone-input {
685
+ padding: var(--space-3-5) 3rem var(--space-3-5) var(--space-4);
686
+ font-size: 16px; /* Prevents iOS zoom */
687
+ }
688
+
689
+ .delivery-zone-detect-btn,
690
+ .delivery-zone-submit {
691
+ padding: var(--space-3-5);
692
+ }
693
+
694
+ .delivery-zone-form {
695
+ gap: var(--space-4);
696
+ }
697
+ }
698
+
699
+ /* Extra Small Mobile (max-width: 360px) */
700
+ @media (max-width: 360px) {
701
+ .delivery-zone-header {
702
+ padding: var(--space-4);
703
+ }
704
+
705
+ .delivery-zone-content {
706
+ padding: var(--space-4);
707
+ }
708
+
709
+ .delivery-zone-title {
710
+ font-size: 1rem;
711
+ }
712
+
713
+ .delivery-zone-close {
714
+ width: 32px;
715
+ height: 32px;
716
+ }
717
+
718
+ .delivery-zone-close svg {
719
+ width: 18px;
720
+ height: 18px;
721
+ }
722
+ }
723
+
724
+ /* Landscape Mobile */
725
+ @media (max-height: 500px) and (orientation: landscape) {
726
+ .delivery-zone-panel {
727
+ max-height: 98vh;
728
+ }
729
+
730
+ .delivery-zone-header {
731
+ padding: var(--space-3) var(--space-5);
732
+ }
733
+
734
+ .delivery-zone-content {
735
+ padding: var(--space-4) var(--space-5);
736
+ }
737
+
738
+ .delivery-zone-form {
739
+ gap: var(--space-3);
740
+ }
741
+
742
+ .delivery-zone-title {
743
+ font-size: 1rem;
334
744
  }
335
745
  }
336
- </style>
337
746
 
747
+ /* Reduced Motion */
748
+ @media (prefers-reduced-motion: reduce) {
749
+ .delivery-zone-modal,
750
+ .delivery-zone-overlay,
751
+ .delivery-zone-panel,
752
+ .delivery-zone-input,
753
+ .delivery-zone-close,
754
+ .delivery-zone-detect-btn,
755
+ .delivery-zone-submit,
756
+ .spinner {
757
+ animation: none !important;
758
+ transition: none !important;
759
+ }
760
+ }
761
+
762
+ /* High Contrast Mode */
763
+ @media (prefers-contrast: high) {
764
+ .delivery-zone-input {
765
+ border-width: 3px;
766
+ }
767
+
768
+ .delivery-zone-input:focus {
769
+ border-color: var(--color-black);
770
+ outline: 3px solid var(--color-primary);
771
+ outline-offset: 2px;
772
+ }
773
+ }
774
+
775
+
776
+ /* Print Styles */
777
+ @media print {
778
+ .delivery-zone-modal {
779
+ display: none !important;
780
+ }
781
+ }
782
+ </style>