@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
@@ -1,5 +1,33 @@
1
1
  {% layout 'layout/theme' %}
2
2
 
3
+ <style>
4
+ :root {
5
+ --color-primary: {{ settings.color_primary | default: '#000000' }};
6
+ --color-primary-hover: {{ settings.color_primary_dark | default: '#333333' }};
7
+ --color-primary-light: {{ settings.color_primary_light | default: '#666666' }};
8
+ --color-success: {{ settings.color_success | default: '#22c55e' }};
9
+ --color-success-light: {{ settings.color_success | default: '#22c55e' }};
10
+ --color-danger: {{ settings.color_error | default: '#ef4444' }};
11
+ --color-danger-light: {{ settings.color_error | default: '#ef4444' }};
12
+ --color-text: {{ settings.color_text | default: '#000000' }};
13
+ --color-text-light: {{ settings.color_text_muted | default: '#666666' }};
14
+ --color-background: {{ settings.color_background | default: '#ffffff' }};
15
+ --color-card-bg: {{ settings.color_surface | default: '#f5f5f5' }};
16
+ --color-border: {{ settings.color_border | default: '#cccccc' }};
17
+ --color-border-light: {{ settings.color_surface | default: '#f5f5f5' }};
18
+ --shadow-sm: var(--shadow-sm);
19
+ --shadow-md: var(--shadow-md);
20
+ --shadow-lg: var(--shadow-lg);
21
+ --radius-md: var(--radius-md);
22
+ --radius-lg: var(--radius-lg);
23
+ --spacing-xs: var(--space-3);
24
+ --spacing-sm: var(--space-4);
25
+ --spacing-md: var(--space-6);
26
+ --spacing-lg: var(--space-8);
27
+ --spacing-xl: var(--space-12);
28
+ }
29
+ </style>
30
+
3
31
  <!-- Search Page -->
4
32
  {% hook 'search_before' %}
5
33
  <div class="search-page">
@@ -33,7 +61,7 @@
33
61
  <circle cx="11" cy="11" r="8"></circle>
34
62
  <path d="m21 21-4.35-4.35"></path>
35
63
  </svg>
36
- Search
64
+ <span class="search-button-text">Search</span>
37
65
  </button>
38
66
  </div>
39
67
  </form>
@@ -46,7 +74,7 @@
46
74
  <div class="search-meta">
47
75
  <p class="results-count">
48
76
  {% if search.results_count > 0 %}
49
- Found {{ search.results_count }} result{{ search.results_count | pluralize }} for "{{ search.query }}"
77
+ Found <strong>{{ search.results_count }}</strong> result{{ search.results_count | pluralize }} for "{{ search.query }}"
50
78
  {% else %}
51
79
  No results found for "{{ search.query }}"
52
80
  {% endif %}
@@ -55,33 +83,49 @@
55
83
  {% if search.results_count > 0 %}
56
84
  <div class="search-filters">
57
85
  <div class="filter-group">
58
- <label for="search-type" class="filter-label">Search in:</label>
86
+ <label for="price-min" class="filter-label">Min Price</label>
87
+ <input id="price-min" type="number" min="0" class="filter-select" value="{{ search.filters.price_min | default: '' }}" placeholder="0">
88
+ </div>
89
+
90
+ <div class="filter-group">
91
+ <label for="price-max" class="filter-label">Max Price</label>
92
+ <input id="price-max" type="number" min="0" class="filter-select" value="{{ search.filters.price_max | default: '' }}" placeholder="No limit">
93
+ </div>
94
+
95
+ <div class="filter-group">
96
+ <label for="results-sort" class="filter-label">Sort by</label>
59
97
  <div class="filter-select-wrapper">
60
- <select id="search-type" name="type" class="filter-select">
61
- <option value="all" {% if search.type == 'all' %}selected{% endif %}>All</option>
62
- <option value="products" {% if search.type == 'products' %}selected{% endif %}>Products</option>
63
- <option value="collections" {% if search.type == 'collections' %}selected{% endif %}>Collections</option>
64
- <option value="pages" {% if search.type == 'pages' %}selected{% endif %}>Pages</option>
98
+ <select id="results-sort" class="filter-select">
99
+ <option value="featured" {% if search.sort == 'featured' %}selected{% endif %}>Featured</option>
100
+ <option value="price-asc" {% if search.sort == 'price' and search.order == 'asc' %}selected{% endif %}>Price: Low to High</option>
101
+ <option value="price-desc" {% if search.sort == 'price' and search.order == 'desc' %}selected{% endif %}>Price: High to Low</option>
102
+ <option value="name-asc" {% if search.sort == 'name' and search.order == 'asc' %}selected{% endif %}>Name: A to Z</option>
103
+ <option value="name-desc" {% if search.sort == 'name' and search.order == 'desc' %}selected{% endif %}>Name: Z to A</option>
104
+ <option value="newest" {% if search.sort == 'created' and search.order == 'desc' %}selected{% endif %}>Date: New to Old</option>
65
105
  </select>
66
106
  <svg class="filter-arrow" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
67
107
  <polyline points="6,9 12,15 18,9"></polyline>
68
108
  </svg>
69
109
  </div>
70
110
  </div>
71
-
111
+
72
112
  <div class="filter-group">
73
- <label for="search-sort" class="filter-label">Sort by:</label>
74
- <div class="filter-select-wrapper">
75
- <select id="search-sort" name="sort" class="filter-select">
76
- <option value="relevance" {% if search.sort == 'relevance' %}selected{% endif %}>Relevance</option>
77
- <option value="price-asc" {% if search.sort == 'price-asc' %}selected{% endif %}>Price: Low to High</option>
78
- <option value="price-desc" {% if search.sort == 'price-desc' %}selected{% endif %}>Price: High to Low</option>
79
- <option value="name-asc" {% if search.sort == 'name-asc' %}selected{% endif %}>Name: A to Z</option>
80
- <option value="name-desc" {% if search.sort == 'name-desc' %}selected{% endif %}>Name: Z to A</option>
81
- </select>
82
- <svg class="filter-arrow" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
83
- <polyline points="6,9 12,15 18,9"></polyline>
84
- </svg>
113
+ <label class="filter-label">Availability</label>
114
+ <label class="filter-option">
115
+ <input id="filter-in-stock" type="checkbox" {% if search.filters.in_stock %}checked{% endif %}>
116
+ <span class="filter-option-text">In Stock</span>
117
+ </label>
118
+ <label class="filter-option">
119
+ <input id="filter-on-sale" type="checkbox" {% if search.filters.on_sale %}checked{% endif %}>
120
+ <span class="filter-option-text">On Sale</span>
121
+ </label>
122
+ </div>
123
+
124
+ <div class="filter-group">
125
+ <label class="filter-label">Actions</label>
126
+ <div style="display:flex; gap:8px; flex-wrap:wrap;">
127
+ <button type="button" class="btn btn-primary btn-sm" id="apply-filters">Apply</button>
128
+ <button type="button" class="btn btn-outline btn-sm" id="clear-filters">Clear</button>
85
129
  </div>
86
130
  </div>
87
131
  </div>
@@ -97,7 +141,7 @@
97
141
  <h2 class="section-title">Products</h2>
98
142
  <div class="products-grid">
99
143
  {% for product in search.results.products %}
100
- {% include 'snippets/product-card-simple', product: product %}
144
+ {% render 'snippets/product-card', product: product %}
101
145
  {% endfor %}
102
146
  </div>
103
147
  </section>
@@ -275,15 +319,16 @@
275
319
  <style>
276
320
  /* Search Page Layout */
277
321
  .search-page {
278
- padding: var(--space-16) 0;
322
+ padding: var(--space-2) 0;
279
323
  min-height: 60vh;
324
+ background: linear-gradient(to bottom, var(--color-background) 0%, var(--color-card-bg) 100%);
280
325
  }
281
326
 
282
327
  /* Search Header */
283
328
  .search-header {
284
- background: linear-gradient(135deg, var(--color-gray-50) 0%, var(--color-white) 100%);
285
- padding: var(--space-20) 0;
286
- margin-bottom: var(--space-16);
329
+ background: linear-gradient(135deg, var(--color-card-bg) 0%, var(--color-background) 100%);
330
+ padding: var(--space-8) 0;
331
+ margin-bottom: var(--space-8);
287
332
  position: relative;
288
333
  overflow: hidden;
289
334
  }
@@ -296,7 +341,19 @@
296
341
  right: 0;
297
342
  bottom: 0;
298
343
  background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><defs><pattern id="grain" width="100" height="100" patternUnits="userSpaceOnUse"><circle cx="50" cy="50" r="1" fill="%23000" opacity="0.02"/></pattern></defs><rect width="100" height="100" fill="url(%23grain)"/></svg>');
299
- opacity: 0.3;
344
+ opacity: 0.5;
345
+ pointer-events: none;
346
+ }
347
+
348
+ .search-header::after {
349
+ content: '';
350
+ position: absolute;
351
+ bottom: -2px;
352
+ left: 0;
353
+ right: 0;
354
+ height: 100px;
355
+ background: linear-gradient(to top, var(--color-background), transparent);
356
+ pointer-events: none;
300
357
  }
301
358
 
302
359
  .search-header-content {
@@ -306,33 +363,50 @@
306
363
  max-width: 800px;
307
364
  margin: 0 auto;
308
365
  padding: 0 var(--space-6);
366
+ display: flex;
309
367
  }
310
368
 
311
369
  .page-title {
312
- margin: 0 0 var(--space-8) 0;
313
- color: var(--color-gray-900);
370
+ margin: 0 0 clamp(var(--space-6), 4vw, var(--space-10)) 0;
371
+ color: var(--color-text);
314
372
  line-height: 1.1;
315
- letter-spacing: -0.05em;
373
+ letter-spacing: -0.02em;
374
+ font-size: clamp(2rem, 5vw, 3.5rem);
375
+ font-weight: 700;
376
+ animation: fadeInUp 0.6s ease-out;
377
+ }
378
+
379
+ @keyframes fadeInUp {
380
+ from {
381
+ opacity: 0;
382
+ transform: translateY(20px);
383
+ }
384
+ to {
385
+ opacity: 1;
386
+ transform: translateY(0);
387
+ }
316
388
  }
317
389
 
318
390
  .search-form-container {
319
- max-width: 600px;
391
+ max-width: 700px;
320
392
  margin: 0 auto;
393
+ animation: fadeInUp 0.6s ease-out 0.1s both;
321
394
  }
322
395
 
323
396
  .search-input-group {
324
397
  display: flex;
325
- background: var(--color-white);
326
- border-radius: var(--radius-2xl);
398
+ background: var(--color-background);
399
+ border-radius: var(--radius-lg);
327
400
  overflow: hidden;
328
- box-shadow: var(--shadow-lg);
401
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.08), 0 2px 8px rgba(0, 0, 0, 0.06);
329
402
  border: 2px solid transparent;
330
- transition: all var(--transition-fast);
403
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
331
404
  }
332
405
 
333
406
  .search-input-group:focus-within {
334
- border-color: var(--color-accent);
335
- box-shadow: var(--shadow-primary);
407
+ border-color: var(--color-primary);
408
+ box-shadow: 0 15px 50px rgba(0, 0, 0, 0.12), 0 0 0 4px var(--color-border-light);
409
+ transform: translateY(-2px);
336
410
  }
337
411
 
338
412
  .search-input-wrapper {
@@ -345,45 +419,75 @@
345
419
  .search-input-icon {
346
420
  position: absolute;
347
421
  left: var(--space-4);
348
- color: var(--color-gray-400);
422
+ color: var(--color-text-light);
349
423
  pointer-events: none;
350
424
  z-index: 1;
425
+ transition: all 0.3s ease;
426
+ }
427
+
428
+ .search-input-group:focus-within .search-input-icon {
429
+ color: var(--color-primary);
430
+ transform: scale(1.1);
351
431
  }
352
432
 
353
433
  .search-input {
354
434
  width: 100%;
355
435
  border: none;
356
- padding: var(--space-4) var(--space-4) var(--space-4) var(--space-12);
357
- font-size: var(--text-lg);
436
+ padding: clamp(var(--space-3), 2vw, var(--space-5)) var(--space-4) clamp(var(--space-3), 2vw, var(--space-5)) var(--space-12);
437
+ font-size: clamp(0.95rem, 2vw, 1.125rem);
358
438
  outline: none;
359
439
  background: transparent;
360
- color: var(--color-gray-900);
440
+ color: var(--color-text);
441
+ font-weight: 500;
361
442
  }
362
443
 
363
444
  .search-input::placeholder {
364
- color: var(--color-gray-500);
445
+ color: var(--color-text-light);
446
+ font-weight: 400;
365
447
  }
366
448
 
367
449
  .search-button {
368
- background: var(--color-accent);
369
- color: var(--color-white);
450
+ background: var(--color-primary);
451
+ color: var(--color-background);
370
452
  border: none;
371
- padding: var(--space-4) var(--space-6);
453
+ padding: var(--space-4) clamp(var(--space-4), 3vw, var(--space-8));
372
454
  cursor: pointer;
373
- font-size: var(--text-base);
374
- font-weight: 600;
455
+ font-size: clamp(0.875rem, 1.5vw, 1rem);
456
+ font-weight: 700;
375
457
  display: flex;
376
458
  align-items: center;
377
459
  gap: var(--space-2);
378
- transition: all var(--transition-fast);
460
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
379
461
  text-transform: uppercase;
380
- letter-spacing: var(--tracking-wide);
462
+ letter-spacing: 0.05em;
463
+ white-space: nowrap;
464
+ position: relative;
465
+ overflow: hidden;
466
+ }
467
+
468
+ .search-button::before {
469
+ content: '';
470
+ position: absolute;
471
+ top: 0;
472
+ left: -100%;
473
+ width: 100%;
474
+ height: 100%;
475
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent);
476
+ transition: left 0.5s ease;
477
+ }
478
+
479
+ .search-button:hover::before {
480
+ left: 100%;
381
481
  }
382
482
 
383
483
  .search-button:hover {
384
- background: var(--color-accent-dark);
385
- transform: translateY(-1px);
386
- box-shadow: var(--shadow-lg);
484
+ background: var(--color-primary-hover);
485
+ transform: translateX(-2px);
486
+ box-shadow: 0 8px 20px rgba(0, 0, 0, 0.15);
487
+ }
488
+
489
+ .search-button:active {
490
+ transform: translateX(-2px) scale(0.98);
387
491
  }
388
492
 
389
493
  /* Search Results */
@@ -391,27 +495,29 @@
391
495
  max-width: 1200px;
392
496
  margin: 0 auto;
393
497
  padding: 0 var(--space-6);
498
+ animation: fadeInUp 0.6s ease-out;
394
499
  }
395
500
 
396
501
  .search-meta {
397
- margin-bottom: var(--space-12);
398
- padding: var(--space-8);
399
- background: var(--color-white);
400
- border-radius: var(--radius-xl);
401
- box-shadow: var(--shadow-sm);
402
- border: 1px solid var(--color-gray-200);
502
+
503
+ backdrop-filter: blur(10px);
403
504
  }
404
505
 
405
506
  .results-count {
406
- font-size: var(--text-lg);
407
- color: var(--color-gray-700);
507
+ font-size: clamp(1rem, 2vw, 1.125rem);
508
+ color: var(--color-text);
408
509
  margin-bottom: var(--space-6);
409
510
  font-weight: 500;
410
511
  }
411
512
 
513
+ .results-count strong {
514
+ color: var(--color-primary);
515
+ font-weight: 700;
516
+ }
517
+
412
518
  .search-filters {
413
519
  display: flex;
414
- gap: var(--space-8);
520
+ gap: clamp(var(--space-4), 3vw, var(--space-8));
415
521
  flex-wrap: wrap;
416
522
  }
417
523
 
@@ -419,14 +525,16 @@
419
525
  display: flex;
420
526
  flex-direction: column;
421
527
  gap: var(--space-2);
528
+ flex: 1;
529
+ min-width: 200px;
422
530
  }
423
531
 
424
532
  .filter-label {
425
533
  font-size: var(--text-sm);
426
534
  font-weight: 600;
427
- color: var(--color-gray-700);
535
+ color: var(--color-text);
428
536
  text-transform: uppercase;
429
- letter-spacing: var(--tracking-wide);
537
+ letter-spacing: 0.05em;
430
538
  }
431
539
 
432
540
  .filter-select-wrapper {
@@ -437,35 +545,41 @@
437
545
 
438
546
  .filter-select {
439
547
  appearance: none;
440
- background-color: var(--color-white);
441
- border: 1px solid var(--color-gray-300);
442
- border-radius: var(--radius-lg);
548
+ background-color: var(--color-background);
549
+ border: 2px solid var(--color-border);
550
+ border-radius: var(--radius-md);
443
551
  padding: var(--space-3) var(--space-4);
444
552
  padding-right: var(--space-10);
445
553
  font-size: var(--text-sm);
446
- font-weight: 500;
447
- color: var(--color-gray-700);
554
+ font-weight: 600;
555
+ color: var(--color-text);
448
556
  cursor: pointer;
449
- transition: all var(--transition-fast);
450
- min-width: 180px;
557
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
558
+ width: 100%;
559
+ }
560
+
561
+ .filter-select:hover {
562
+ border-color: var(--color-primary-light);
563
+ background: var(--color-card-bg);
451
564
  }
452
565
 
453
566
  .filter-select:focus {
454
567
  outline: none;
455
- border-color: var(--color-accent);
456
- box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.1);
568
+ border-color: var(--color-primary);
569
+ box-shadow: 0 0 0 3px var(--color-border-light);
457
570
  }
458
571
 
459
572
  .filter-arrow {
460
573
  position: absolute;
461
574
  right: var(--space-3);
462
575
  pointer-events: none;
463
- color: var(--color-gray-500);
464
- transition: transform var(--transition-fast);
576
+ color: var(--color-text-light);
577
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
465
578
  }
466
579
 
467
- .filter-select:focus + .filter-arrow {
580
+ .filter-select:focus ~ .filter-arrow {
468
581
  transform: rotate(180deg);
582
+ color: var(--color-primary);
469
583
  }
470
584
 
471
585
  /* Search Results Content */
@@ -476,20 +590,100 @@
476
590
  }
477
591
 
478
592
  .search-section {
479
- background: var(--color-white);
480
- border-radius: var(--radius-xl);
481
- padding: var(--space-8);
482
- box-shadow: var(--shadow-sm);
483
- border: 1px solid var(--color-gray-200);
593
+ background: var(--color-background);
594
+ border-radius: var(--radius-lg);
595
+ padding: clamp(var(--space-6), 3vw, var(--space-10));
596
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.04);
597
+ border: 1px solid var(--color-border-light);
598
+ transition: all 0.3s ease;
599
+ }
600
+
601
+ .search-section:hover {
602
+ box-shadow: 0 8px 30px rgba(0, 0, 0, 0.08);
484
603
  }
485
604
 
486
605
  .section-title {
487
- font-size: var(--text-2xl);
606
+ font-size: clamp(1.5rem, 3vw, 2rem);
488
607
  margin-bottom: var(--space-8);
489
- color: var(--color-gray-900);
490
- font-weight: 600;
491
- border-bottom: 2px solid var(--color-gray-100);
608
+ color: var(--color-text);
609
+ font-weight: 700;
610
+ border-bottom: 3px solid var(--color-primary);
492
611
  padding-bottom: var(--space-4);
612
+ display: inline-block;
613
+ }
614
+
615
+ /* Collections Grid */
616
+ .collections-grid {
617
+ display: grid;
618
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
619
+ gap: clamp(var(--space-6), 3vw, var(--space-8));
620
+ }
621
+
622
+ .collection-card {
623
+ background: var(--color-card-bg);
624
+ border-radius: var(--radius-md);
625
+ overflow: hidden;
626
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
627
+ border: 2px solid transparent;
628
+ }
629
+
630
+ .collection-card:hover {
631
+ transform: translateY(-6px);
632
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.12);
633
+ border-color: var(--color-primary);
634
+ }
635
+
636
+ .collection-card a {
637
+ text-decoration: none;
638
+ color: inherit;
639
+ display: block;
640
+ }
641
+
642
+ .collection-image {
643
+ width: 100%;
644
+ aspect-ratio: 16 / 9;
645
+ overflow: hidden;
646
+ background: var(--color-border-light);
647
+ position: relative;
648
+ }
649
+
650
+ .collection-image img {
651
+ width: 100%;
652
+ height: 100%;
653
+ object-fit: cover;
654
+ transition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1);
655
+ }
656
+
657
+ .collection-card:hover .collection-image img {
658
+ transform: scale(1.08);
659
+ }
660
+
661
+ .collection-image-placeholder {
662
+ width: 100%;
663
+ height: 100%;
664
+ display: flex;
665
+ align-items: center;
666
+ justify-content: center;
667
+ color: var(--color-text-light);
668
+ background: linear-gradient(135deg, var(--color-card-bg), var(--color-border-light));
669
+ }
670
+
671
+ .collection-info {
672
+ padding: var(--space-6);
673
+ }
674
+
675
+ .collection-info h3 {
676
+ font-size: clamp(1.125rem, 2vw, 1.25rem);
677
+ margin: 0 0 var(--space-2) 0;
678
+ color: var(--color-text);
679
+ font-weight: 700;
680
+ }
681
+
682
+ .collection-info p {
683
+ color: var(--color-text-light);
684
+ margin: 0;
685
+ font-size: var(--text-sm);
686
+ font-weight: 500;
493
687
  }
494
688
 
495
689
  /* Pages List */
@@ -500,17 +694,35 @@
500
694
  }
501
695
 
502
696
  .page-result {
503
- border: 1px solid var(--color-gray-200);
504
- border-radius: var(--radius-lg);
505
- padding: var(--space-6);
506
- transition: all var(--transition-fast);
507
- background: var(--color-white);
697
+ border: 2px solid var(--color-border-light);
698
+ border-radius: var(--radius-md);
699
+ padding: clamp(var(--space-4), 3vw, var(--space-6));
700
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
701
+ background: var(--color-background);
702
+ position: relative;
703
+ overflow: hidden;
704
+ }
705
+
706
+ .page-result::before {
707
+ content: '';
708
+ position: absolute;
709
+ left: 0;
710
+ top: 0;
711
+ bottom: 0;
712
+ width: 4px;
713
+ background: var(--color-primary);
714
+ transform: scaleY(0);
715
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
716
+ }
717
+
718
+ .page-result:hover::before {
719
+ transform: scaleY(1);
508
720
  }
509
721
 
510
722
  .page-result:hover {
511
- border-color: var(--color-accent);
512
- box-shadow: var(--shadow-md);
513
- transform: translateY(-2px);
723
+ border-color: var(--color-primary);
724
+ box-shadow: 0 8px 30px rgba(0, 0, 0, 0.08);
725
+ transform: translateX(4px);
514
726
  }
515
727
 
516
728
  .page-link {
@@ -519,18 +731,23 @@
519
731
  }
520
732
 
521
733
  .page-result .page-title {
522
- font-size: var(--text-xl);
734
+ font-size: clamp(1.125rem, 2.5vw, 1.375rem);
523
735
  margin-bottom: var(--space-3);
524
- color: var(--color-gray-900);
525
- font-weight: 600;
736
+ color: var(--color-text);
737
+ font-weight: 700;
526
738
  line-height: 1.3;
739
+ transition: color 0.3s ease;
740
+ }
741
+
742
+ .page-result:hover .page-title {
743
+ color: var(--color-primary);
527
744
  }
528
745
 
529
746
  .page-excerpt {
530
- color: var(--color-gray-600);
531
- line-height: 1.6;
747
+ color: var(--color-text-light);
748
+ line-height: 1.7;
532
749
  margin: 0;
533
- font-size: var(--text-base);
750
+ font-size: clamp(0.875rem, 1.5vw, 1rem);
534
751
  }
535
752
 
536
753
  /* No Results */
@@ -538,48 +755,66 @@
538
755
  display: flex;
539
756
  justify-content: center;
540
757
  align-items: center;
541
- min-height: 400px;
758
+ min-height: 500px;
542
759
  text-align: center;
760
+ padding: var(--space-12) var(--space-6);
543
761
  }
544
762
 
545
763
  .no-results-content {
546
764
  display: flex;
547
765
  flex-direction: column;
548
766
  align-items: center;
549
- gap: var(--space-8);
550
- max-width: 500px;
767
+ gap: clamp(var(--space-6), 3vw, var(--space-8));
768
+ max-width: 600px;
769
+ animation: fadeInUp 0.6s ease-out;
551
770
  }
552
771
 
553
772
  .no-results-icon {
554
- color: var(--color-gray-400);
773
+ color: var(--color-text-light);
774
+ opacity: 0.4;
775
+ animation: pulse 2s ease-in-out infinite;
776
+ }
777
+
778
+ @keyframes pulse {
779
+ 0%, 100% {
780
+ opacity: 0.4;
781
+ transform: scale(1);
782
+ }
783
+ 50% {
784
+ opacity: 0.6;
785
+ transform: scale(1.05);
786
+ }
555
787
  }
556
788
 
557
789
  .no-results-title {
558
790
  margin: 0;
559
- color: var(--color-gray-900);
560
- font-weight: 600;
791
+ color: var(--color-text);
792
+ font-weight: 700;
793
+ font-size: clamp(1.75rem, 4vw, 2.5rem);
561
794
  }
562
795
 
563
796
  .no-results-description {
564
797
  margin: 0;
565
- color: var(--color-gray-600);
566
- line-height: 1.6;
798
+ color: var(--color-text-light);
799
+ line-height: 1.7;
800
+ font-size: clamp(1rem, 2vw, 1.125rem);
567
801
  }
568
802
 
569
803
  .search-suggestions {
570
804
  text-align: left;
805
+ width: 100%;
571
806
  margin-bottom: var(--space-8);
572
- padding: var(--space-6);
573
- background: var(--color-gray-50);
574
- border-radius: var(--radius-lg);
575
- border: 1px solid var(--color-gray-200);
807
+ padding: clamp(var(--space-4), 3vw, var(--space-6));
808
+ background: var(--color-card-bg);
809
+ border-radius: var(--radius-md);
810
+ border: 2px solid var(--color-border-light);
576
811
  }
577
812
 
578
813
  .suggestions-title {
579
- font-size: var(--text-lg);
814
+ font-size: clamp(1rem, 2vw, 1.125rem);
580
815
  margin-bottom: var(--space-4);
581
- color: var(--color-gray-900);
582
- font-weight: 600;
816
+ color: var(--color-text);
817
+ font-weight: 700;
583
818
  }
584
819
 
585
820
  .suggestions-list {
@@ -590,16 +825,18 @@
590
825
 
591
826
  .suggestions-list li {
592
827
  padding: var(--space-2) 0;
593
- color: var(--color-gray-600);
828
+ color: var(--color-text-light);
594
829
  position: relative;
595
830
  padding-left: var(--space-6);
831
+ line-height: 1.6;
832
+ font-size: clamp(0.875rem, 1.5vw, 1rem);
596
833
  }
597
834
 
598
835
  .suggestions-list li::before {
599
- content: '';
836
+ content: '';
600
837
  position: absolute;
601
838
  left: 0;
602
- color: var(--color-accent);
839
+ color: var(--color-primary);
603
840
  font-weight: bold;
604
841
  font-size: var(--text-lg);
605
842
  }
@@ -609,40 +846,69 @@
609
846
  gap: var(--space-4);
610
847
  justify-content: center;
611
848
  flex-wrap: wrap;
849
+ width: 100%;
612
850
  }
613
851
 
614
852
  .no-results-actions .btn {
615
853
  display: flex;
616
854
  align-items: center;
855
+ justify-content: center;
617
856
  gap: var(--space-2);
618
- padding: var(--space-4) var(--space-6);
619
- font-weight: 600;
857
+ padding: clamp(var(--space-3), 2vw, var(--space-4)) clamp(var(--space-5), 3vw, var(--space-8));
858
+ font-weight: 700;
620
859
  text-decoration: none;
621
- transition: all var(--transition-fast);
860
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
861
+ border-radius: var(--radius-md);
862
+ font-size: clamp(0.875rem, 1.5vw, 1rem);
863
+ letter-spacing: 0.03em;
864
+ position: relative;
865
+ overflow: hidden;
866
+ }
867
+
868
+ .no-results-actions .btn::before {
869
+ content: '';
870
+ position: absolute;
871
+ top: 50%;
872
+ left: 50%;
873
+ width: 0;
874
+ height: 0;
875
+ border-radius: 50%;
876
+ background: rgba(255, 255, 255, 0.2);
877
+ transform: translate(-50%, -50%);
878
+ transition: width 0.6s ease, height 0.6s ease;
879
+ }
880
+
881
+ .no-results-actions .btn:hover::before {
882
+ width: 300px;
883
+ height: 300px;
622
884
  }
623
885
 
624
886
  .no-results-actions .btn-primary {
625
- background-color: var(--color-accent);
626
- color: var(--color-white);
627
- border: none;
628
- box-shadow: var(--shadow-primary);
887
+ background-color: var(--color-primary);
888
+ color: var(--color-background);
889
+ border: 2px solid var(--color-primary);
890
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.15);
629
891
  }
630
892
 
631
893
  .no-results-actions .btn-primary:hover {
632
- background-color: var(--color-accent-dark);
633
- transform: translateY(-2px);
634
- box-shadow: var(--shadow-xl);
894
+ background-color: var(--color-primary-hover);
895
+ border-color: var(--color-primary-hover);
896
+ transform: translateY(-3px);
897
+ box-shadow: 0 8px 25px rgba(0, 0, 0, 0.2);
635
898
  }
636
899
 
637
900
  .no-results-actions .btn-outline {
638
901
  background-color: transparent;
639
- color: var(--color-gray-700);
640
- border: 1px solid var(--color-gray-300);
902
+ color: var(--color-text);
903
+ border: 2px solid var(--color-border);
641
904
  }
642
905
 
643
906
  .no-results-actions .btn-outline:hover {
644
- background-color: var(--color-gray-50);
645
- border-color: var(--color-gray-400);
907
+ background-color: var(--color-card-bg);
908
+ border-color: var(--color-primary);
909
+ color: var(--color-primary);
910
+ transform: translateY(-3px);
911
+ box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
646
912
  }
647
913
 
648
914
  /* Search Landing */
@@ -650,49 +916,82 @@
650
916
  display: flex;
651
917
  justify-content: center;
652
918
  align-items: center;
653
- min-height: 500px;
654
- padding: var(--space-16) 0;
919
+ min-height: 600px;
920
+ padding: clamp(var(--space-12), 6vw, var(--space-20)) 0;
655
921
  }
656
922
 
657
923
  .search-landing-content {
658
924
  text-align: center;
659
- max-width: 800px;
925
+ max-width: 900px;
660
926
  padding: 0 var(--space-6);
927
+ animation: fadeInUp 0.6s ease-out;
661
928
  }
662
929
 
663
930
  .landing-title {
664
- margin: 0 0 var(--space-6) 0;
665
- color: var(--color-gray-900);
931
+ margin: 0 0 clamp(var(--space-4), 3vw, var(--space-6)) 0;
932
+ color: var(--color-text);
666
933
  line-height: 1.1;
667
- letter-spacing: -0.05em;
934
+ letter-spacing: -0.02em;
935
+ font-size: clamp(2rem, 5vw, 3rem);
936
+ font-weight: 800;
668
937
  }
669
938
 
670
939
  .landing-description {
671
- margin: 0 0 var(--space-12) 0;
672
- color: var(--color-gray-600);
673
- line-height: 1.6;
940
+ margin: 0 0 clamp(var(--space-10), 5vw, var(--space-16)) 0;
941
+ color: var(--color-text-light);
942
+ line-height: 1.7;
943
+ font-size: clamp(1rem, 2vw, 1.25rem);
674
944
  }
675
945
 
676
946
  .search-categories {
677
947
  display: grid;
678
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
679
- gap: var(--space-8);
680
- margin-bottom: var(--space-12);
948
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
949
+ gap: clamp(var(--space-6), 3vw, var(--space-8));
950
+ margin-bottom: clamp(var(--space-10), 5vw, var(--space-16));
681
951
  }
682
952
 
683
953
  .category-card {
684
- background: var(--color-white);
685
- border-radius: var(--radius-xl);
686
- padding: var(--space-8);
687
- box-shadow: var(--shadow-sm);
688
- border: 1px solid var(--color-gray-200);
689
- transition: all var(--transition-fast);
954
+ background: var(--color-background);
955
+ border-radius: var(--radius-lg);
956
+ padding: clamp(var(--space-6), 3vw, var(--space-8));
957
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.06);
958
+ border: 2px solid var(--color-border-light);
959
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
960
+ position: relative;
961
+ overflow: hidden;
962
+ }
963
+
964
+ .category-card::before {
965
+ content: '';
966
+ position: absolute;
967
+ top: -50%;
968
+ left: -50%;
969
+ width: 200%;
970
+ height: 200%;
971
+ background: linear-gradient(45deg, transparent, var(--color-border-light), transparent);
972
+ transform: rotate(45deg);
973
+ transition: all 0.6s ease;
974
+ opacity: 0;
975
+ }
976
+
977
+ .category-card:hover::before {
978
+ opacity: 1;
979
+ animation: shimmer 1.5s ease-in-out;
980
+ }
981
+
982
+ @keyframes shimmer {
983
+ 0% {
984
+ transform: translateX(-100%) translateY(-100%) rotate(45deg);
985
+ }
986
+ 100% {
987
+ transform: translateX(100%) translateY(100%) rotate(45deg);
988
+ }
690
989
  }
691
990
 
692
991
  .category-card:hover {
693
- transform: translateY(-4px);
694
- box-shadow: var(--shadow-lg);
695
- border-color: var(--color-accent);
992
+ transform: translateY(-8px);
993
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.12);
994
+ border-color: var(--color-primary);
696
995
  }
697
996
 
698
997
  .category-link {
@@ -701,49 +1000,63 @@
701
1000
  display: flex;
702
1001
  flex-direction: column;
703
1002
  align-items: center;
704
- gap: var(--space-4);
1003
+ gap: clamp(var(--space-3), 2vw, var(--space-4));
1004
+ position: relative;
1005
+ z-index: 1;
705
1006
  }
706
1007
 
707
1008
  .category-icon {
708
- color: var(--color-accent);
1009
+ color: var(--color-primary);
709
1010
  display: flex;
710
1011
  align-items: center;
711
1012
  justify-content: center;
712
- width: 80px;
713
- height: 80px;
714
- background: var(--color-gray-50);
715
- border-radius: var(--radius-xl);
716
- transition: all var(--transition-fast);
1013
+ width: clamp(70px, 10vw, 90px);
1014
+ height: clamp(70px, 10vw, 90px);
1015
+ background: var(--color-card-bg);
1016
+ border-radius: var(--radius-lg);
1017
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
1018
+ border: 2px solid var(--color-border-light);
717
1019
  }
718
1020
 
719
1021
  .category-card:hover .category-icon {
720
- background: var(--color-accent);
721
- color: var(--color-white);
722
- transform: scale(1.1);
1022
+ background: var(--color-primary);
1023
+ color: var(--color-background);
1024
+ transform: scale(1.15) rotate(5deg);
1025
+ border-color: var(--color-primary);
1026
+ box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
723
1027
  }
724
1028
 
725
1029
  .category-title {
726
- font-size: var(--text-xl);
1030
+ font-size: clamp(1.125rem, 2vw, 1.375rem);
727
1031
  margin: 0;
728
- color: var(--color-gray-900);
729
- font-weight: 600;
1032
+ color: var(--color-text);
1033
+ font-weight: 700;
1034
+ transition: color 0.3s ease;
1035
+ }
1036
+
1037
+ .category-card:hover .category-title {
1038
+ color: var(--color-primary);
730
1039
  }
731
1040
 
732
1041
  .category-description {
733
- color: var(--color-gray-600);
1042
+ color: var(--color-text-light);
734
1043
  margin: 0;
735
1044
  text-align: center;
736
- line-height: 1.5;
1045
+ line-height: 1.6;
1046
+ font-size: clamp(0.875rem, 1.5vw, 1rem);
737
1047
  }
738
1048
 
739
1049
  .popular-searches {
740
- margin-top: var(--space-12);
1050
+ margin-top: clamp(var(--space-10), 5vw, var(--space-16));
1051
+ padding-top: var(--space-12);
1052
+ border-top: 2px solid var(--color-border-light);
741
1053
  }
742
1054
 
743
1055
  .popular-title {
744
- margin: 0 0 var(--space-6) 0;
745
- color: var(--color-gray-900);
746
- font-weight: 600;
1056
+ margin: 0 0 clamp(var(--space-4), 3vw, var(--space-6)) 0;
1057
+ color: var(--color-text);
1058
+ font-weight: 700;
1059
+ font-size: clamp(1.125rem, 2vw, 1.25rem);
747
1060
  }
748
1061
 
749
1062
  .search-tags {
@@ -754,39 +1067,74 @@
754
1067
  }
755
1068
 
756
1069
  .search-tag {
757
- background: var(--color-gray-100);
758
- color: var(--color-accent);
759
- padding: var(--space-2) var(--space-4);
760
- border-radius: var(--radius-full);
1070
+ background: var(--color-card-bg);
1071
+ color: var(--color-primary);
1072
+ padding: var(--space-2) clamp(var(--space-4), 2vw, var(--space-5));
1073
+ border-radius: var(--radius-lg);
761
1074
  text-decoration: none;
762
- font-weight: 500;
763
- font-size: var(--text-sm);
764
- transition: all var(--transition-fast);
765
- border: 2px solid transparent;
1075
+ font-weight: 600;
1076
+ font-size: clamp(0.8125rem, 1.5vw, 0.9375rem);
1077
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1078
+ border: 2px solid var(--color-border-light);
766
1079
  text-transform: uppercase;
767
- letter-spacing: var(--tracking-wide);
1080
+ letter-spacing: 0.05em;
1081
+ position: relative;
1082
+ overflow: hidden;
1083
+ }
1084
+
1085
+ .search-tag::after {
1086
+ content: '';
1087
+ position: absolute;
1088
+ bottom: 0;
1089
+ left: 0;
1090
+ width: 100%;
1091
+ height: 2px;
1092
+ background: var(--color-primary);
1093
+ transform: scaleX(0);
1094
+ transition: transform 0.3s ease;
1095
+ }
1096
+
1097
+ .search-tag:hover::after {
1098
+ transform: scaleX(1);
768
1099
  }
769
1100
 
770
1101
  .search-tag:hover {
771
- background: var(--color-accent);
772
- color: var(--color-white);
773
- border-color: var(--color-accent);
774
- transform: translateY(-2px);
775
- box-shadow: var(--shadow-md);
1102
+ background: var(--color-primary);
1103
+ color: var(--color-background);
1104
+ border-color: var(--color-primary);
1105
+ transform: translateY(-3px);
1106
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.12);
1107
+ }
1108
+
1109
+ /* Products Grid */
1110
+ .products-grid {
1111
+ display: grid;
1112
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
1113
+ gap: clamp(var(--space-6), 3vw, var(--space-8));
776
1114
  }
777
1115
 
778
1116
  /* Responsive Design */
1117
+ @media (max-width: 1024px) {
1118
+ .search-page {
1119
+ padding: var(--space-2) 0;
1120
+ }
1121
+
1122
+ .search-categories {
1123
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
1124
+ }
1125
+ }
1126
+
779
1127
  @media (max-width: 768px) {
780
1128
  .search-page {
781
- padding: var(--space-8) 0;
1129
+ padding: var(--space-2) 0;
782
1130
  }
783
1131
 
784
1132
  .search-header {
785
- padding: var(--space-12) 0;
1133
+ padding: var(--space-8) 0;
786
1134
  }
787
1135
 
788
1136
  .page-title {
789
- font-size: var(--text-5xl);
1137
+ font-size: clamp(1.75rem, 6vw, 2.5rem);
790
1138
  }
791
1139
 
792
1140
  .search-filters {
@@ -798,6 +1146,12 @@
798
1146
  flex-direction: row;
799
1147
  align-items: center;
800
1148
  gap: var(--space-4);
1149
+ min-width: auto;
1150
+ }
1151
+
1152
+ .filter-label {
1153
+ white-space: nowrap;
1154
+ min-width: 90px;
801
1155
  }
802
1156
 
803
1157
  .filter-select {
@@ -809,6 +1163,10 @@
809
1163
  gap: var(--space-6);
810
1164
  }
811
1165
 
1166
+ .collections-grid {
1167
+ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
1168
+ }
1169
+
812
1170
  .no-results-actions {
813
1171
  flex-direction: column;
814
1172
  align-items: stretch;
@@ -823,7 +1181,11 @@
823
1181
  }
824
1182
 
825
1183
  .landing-title {
826
- font-size: var(--text-3xl);
1184
+ font-size: clamp(1.75rem, 6vw, 2.5rem);
1185
+ }
1186
+
1187
+ .products-grid {
1188
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
827
1189
  }
828
1190
  }
829
1191
 
@@ -834,11 +1196,21 @@
834
1196
 
835
1197
  .search-input-group {
836
1198
  flex-direction: column;
837
- border-radius: var(--radius-lg);
1199
+ border-radius: var(--radius-md);
1200
+ }
1201
+
1202
+ .search-input {
1203
+ padding: var(--space-4) var(--space-4) var(--space-4) var(--space-12);
838
1204
  }
839
1205
 
840
1206
  .search-button {
841
- border-radius: 0 0 var(--radius-lg) var(--radius-lg);
1207
+ border-radius: 0 0 var(--radius-md) var(--radius-md);
1208
+ justify-content: center;
1209
+ padding: var(--space-4);
1210
+ }
1211
+
1212
+ .search-button-text {
1213
+ display: block;
842
1214
  }
843
1215
 
844
1216
  .search-results-content {
@@ -848,75 +1220,217 @@
848
1220
  .search-section {
849
1221
  padding: var(--space-6);
850
1222
  }
1223
+
1224
+ .filter-group {
1225
+ flex-direction: column;
1226
+ align-items: flex-start;
1227
+ }
1228
+
1229
+ .collections-grid {
1230
+ grid-template-columns: 1fr;
1231
+ }
1232
+
1233
+ .products-grid {
1234
+ grid-template-columns: 1fr;
1235
+ }
1236
+
1237
+ .search-tags {
1238
+ gap: var(--space-2);
1239
+ }
1240
+ }
1241
+
1242
+ /* Loading States */
1243
+ @media (prefers-reduced-motion: no-preference) {
1244
+ .search-section,
1245
+ .category-card,
1246
+ .page-result,
1247
+ .collection-card {
1248
+ animation: fadeInUp 0.6s ease-out backwards;
1249
+ }
1250
+
1251
+ .search-section:nth-child(1) { animation-delay: 0.1s; }
1252
+ .search-section:nth-child(2) { animation-delay: 0.2s; }
1253
+ .search-section:nth-child(3) { animation-delay: 0.3s; }
1254
+
1255
+ .category-card:nth-child(1) { animation-delay: 0.1s; }
1256
+ .category-card:nth-child(2) { animation-delay: 0.2s; }
1257
+ .category-card:nth-child(3) { animation-delay: 0.3s; }
1258
+ }
1259
+
1260
+ /* Print Styles */
1261
+ @media print {
1262
+ .search-header,
1263
+ .search-filters,
1264
+ .no-results-actions,
1265
+ .search-button {
1266
+ display: none;
1267
+ }
1268
+
1269
+ .search-section {
1270
+ box-shadow: none;
1271
+ border: 1px solid var(--color-border);
1272
+ page-break-inside: avoid;
1273
+ }
851
1274
  }
852
1275
  </style>
853
1276
 
854
1277
  <script>
855
- document.addEventListener('DOMContentLoaded', function() {
1278
+ document.addEventListener('DOMContentLoaded', () => {
856
1279
  // Search form enhancement
857
1280
  const searchForm = document.querySelector('.search-form');
858
1281
  const searchInput = document.querySelector('.search-input');
859
1282
 
860
1283
  if (searchForm && searchInput) {
861
- // Auto-focus search input
862
- searchInput.focus();
1284
+ // Auto-focus search input on desktop
1285
+ if (window.innerWidth > 768) {
1286
+ searchInput.focus();
1287
+ }
863
1288
 
864
1289
  // Handle search form submission
865
- searchForm.addEventListener('submit', function(e) {
1290
+ searchForm.addEventListener('submit', (e) => {
866
1291
  const query = searchInput.value.trim();
867
1292
  if (!query) {
868
1293
  e.preventDefault();
869
1294
  searchInput.focus();
1295
+ searchInput.classList.add('error-shake');
1296
+ setTimeout(() => searchInput.classList.remove('error-shake'), 500);
870
1297
  return;
871
1298
  }
872
1299
  });
873
- }
874
-
875
- // Filter change handlers
876
- const searchType = document.getElementById('search-type');
877
- const searchSort = document.getElementById('search-sort');
878
-
879
- if (searchType) {
880
- searchType.addEventListener('change', function() {
881
- updateSearchURL();
882
- });
883
- }
884
-
885
- if (searchSort) {
886
- searchSort.addEventListener('change', function() {
887
- updateSearchURL();
1300
+
1301
+ // Clear search on Escape key
1302
+ searchInput.addEventListener('keydown', (e) => {
1303
+ if (e.key === 'Escape') {
1304
+ this.value = '';
1305
+ this.blur();
1306
+ }
888
1307
  });
889
1308
  }
890
1309
 
891
- function updateSearchURL() {
892
- const url = new URL(window.location);
1310
+ // Filter and sort handlers (aligned with products listing UX)
1311
+ const priceMin = document.getElementById('price-min');
1312
+ const priceMax = document.getElementById('price-max');
1313
+ const filterInStock = document.getElementById('filter-in-stock');
1314
+ const filterOnSale = document.getElementById('filter-on-sale');
1315
+ const resultsSort = document.getElementById('results-sort');
1316
+ const applyFiltersBtn = document.getElementById('apply-filters');
1317
+ const clearFiltersBtn = document.getElementById('clear-filters');
1318
+
1319
+ const applySearchFilters = () => {
1320
+ const url = new URL(window.location.href);
893
1321
  const params = new URLSearchParams(url.search);
894
-
895
- if (searchType && searchType.value !== 'all') {
896
- params.set('type', searchType.value);
897
- } else {
898
- params.delete('type');
1322
+
1323
+ const query = (searchInput?.value || params.get('q') || '').trim();
1324
+ if (query) {
1325
+ params.set('q', query);
899
1326
  }
900
-
901
- if (searchSort && searchSort.value !== 'relevance') {
902
- params.set('sort', searchSort.value);
1327
+
1328
+ if (priceMin && priceMin.value) params.set('price_min', priceMin.value);
1329
+ else params.delete('price_min');
1330
+
1331
+ if (priceMax && priceMax.value) params.set('price_max', priceMax.value);
1332
+ else params.delete('price_max');
1333
+
1334
+ if (filterInStock && filterInStock.checked) params.set('in_stock', 'true');
1335
+ else params.delete('in_stock');
1336
+
1337
+ if (filterOnSale && filterOnSale.checked) params.set('on_sale', 'true');
1338
+ else params.delete('on_sale');
1339
+
1340
+ const selectedSort = resultsSort ? resultsSort.value : 'featured';
1341
+ if (selectedSort === 'price-asc') {
1342
+ params.set('sort', 'price');
1343
+ params.set('order', 'asc');
1344
+ } else if (selectedSort === 'price-desc') {
1345
+ params.set('sort', 'price');
1346
+ params.set('order', 'desc');
1347
+ } else if (selectedSort === 'name-asc') {
1348
+ params.set('sort', 'name');
1349
+ params.set('order', 'asc');
1350
+ } else if (selectedSort === 'name-desc') {
1351
+ params.set('sort', 'name');
1352
+ params.set('order', 'desc');
1353
+ } else if (selectedSort === 'newest') {
1354
+ params.set('sort', 'created');
1355
+ params.set('order', 'desc');
903
1356
  } else {
904
- params.delete('sort');
1357
+ params.set('sort', 'featured');
1358
+ params.set('order', 'desc');
905
1359
  }
906
-
1360
+
1361
+ params.set('page', '1');
907
1362
  url.search = params.toString();
908
1363
  window.location.href = url.toString();
1364
+ };
1365
+
1366
+ if (applyFiltersBtn) {
1367
+ applyFiltersBtn.addEventListener('click', applySearchFilters);
1368
+ }
1369
+
1370
+ if (clearFiltersBtn) {
1371
+ clearFiltersBtn.addEventListener('click', () => {
1372
+ const url = new URL(window.location.href);
1373
+ const params = new URLSearchParams(url.search);
1374
+ const query = params.get('q') || (searchInput?.value || '');
1375
+ params.forEach((_, key) => params.delete(key));
1376
+ if (query) params.set('q', query);
1377
+ window.location.href = `${url.pathname}?${params.toString()}`;
1378
+ });
1379
+ }
1380
+
1381
+ if (resultsSort) {
1382
+ resultsSort.addEventListener('change', applySearchFilters);
909
1383
  }
910
1384
 
911
1385
  // Search suggestions (mock implementation)
1386
+ let suggestionTimeout;
912
1387
  if (searchInput) {
913
- searchInput.addEventListener('input', function() {
914
- const query = this.value.trim();
1388
+ searchInput.addEventListener('input', (e) => {
1389
+ const query = e.target.value.trim();
1390
+ clearTimeout(suggestionTimeout);
1391
+
915
1392
  if (query.length >= 2) {
916
- // In a real implementation, this would fetch suggestions from the API
917
- console.log('Search suggestions for:', query);
1393
+ suggestionTimeout = setTimeout(() => {
1394
+ // In a real implementation, this would fetch suggestions from the API
1395
+ console.log('Search suggestions for:', query);
1396
+ }, 300);
918
1397
  }
919
1398
  });
920
1399
  }
1400
+
1401
+ // Intersection Observer for scroll animations
1402
+ if ('IntersectionObserver' in window) {
1403
+ const observerOptions = {
1404
+ threshold: 0.1,
1405
+ rootMargin: '0px 0px -50px 0px'
1406
+ };
1407
+
1408
+ const observer = new IntersectionObserver((entries) => {
1409
+ entries.forEach(entry => {
1410
+ if (entry.isIntersecting) {
1411
+ entry.target.style.opacity = '1';
1412
+ entry.target.style.transform = 'translateY(0)';
1413
+ }
1414
+ });
1415
+ }, observerOptions);
1416
+
1417
+ document.querySelectorAll('.search-section, .category-card').forEach(el => {
1418
+ el.style.opacity = '0';
1419
+ el.style.transform = 'translateY(20px)';
1420
+ el.style.transition = 'opacity 0.6s ease, transform 0.6s ease';
1421
+ observer.observe(el);
1422
+ });
1423
+ }
1424
+
1425
+ // Add keyboard navigation for search tags
1426
+ const searchTags = document.querySelectorAll('.search-tag');
1427
+ searchTags.forEach(tag => {
1428
+ tag.addEventListener('keypress', (e) => {
1429
+ if (e.key === 'Enter' || e.key === ' ') {
1430
+ e.preventDefault();
1431
+ tag.click();
1432
+ }
1433
+ });
1434
+ });
921
1435
  });
922
1436
  </script>