@o2vend/theme-cli 1.0.36 → 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 (90) hide show
  1. package/README.md +4 -0
  2. package/lib/lib/dev-server.js +344 -48
  3. package/lib/lib/liquid-engine.js +3 -1
  4. package/lib/lib/mock-data.js +473 -119
  5. package/lib/lib/widget-service.js +12 -4
  6. package/package.json +2 -2
  7. package/test-theme/assets/async-sections.js +32 -24
  8. package/test-theme/assets/cart-drawer.js +20 -22
  9. package/test-theme/assets/cart-manager.js +1 -15
  10. package/test-theme/assets/checkout-price-handler.js +12 -11
  11. package/test-theme/assets/checkout.css +1415 -0
  12. package/test-theme/assets/checkout.js +3174 -0
  13. package/test-theme/assets/components.css +178 -29
  14. package/test-theme/assets/delivery-zone.js +1 -1
  15. package/test-theme/assets/product-detail.css +1050 -0
  16. package/test-theme/assets/product-detail.js +2940 -0
  17. package/test-theme/assets/theme.css +95 -120
  18. package/test-theme/assets/theme.js +781 -186
  19. package/test-theme/layout/theme.liquid +91 -17
  20. package/test-theme/sections/content.liquid +64 -57
  21. package/test-theme/sections/footer-fallback.liquid +57 -7
  22. package/test-theme/sections/footer.liquid +63 -12
  23. package/test-theme/sections/header-fallback.liquid +41 -41
  24. package/test-theme/sections/header.liquid +41 -51
  25. package/test-theme/sections/hero-fallback.liquid +1 -1
  26. package/test-theme/sections/hero.liquid +159 -136
  27. package/test-theme/snippets/account-sidebar.liquid +121 -29
  28. package/test-theme/snippets/add-to-cart-modal.liquid +258 -206
  29. package/test-theme/snippets/breadcrumbs.liquid +98 -11
  30. package/test-theme/snippets/cart-drawer.liquid +93 -0
  31. package/test-theme/snippets/delivery-zone-city-selector.liquid +101 -15
  32. package/test-theme/snippets/delivery-zone-modal.liquid +529 -84
  33. package/test-theme/snippets/delivery-zone-search.liquid +104 -18
  34. package/test-theme/snippets/login-modal.liquid +269 -82
  35. package/test-theme/snippets/mega-menu.liquid +130 -43
  36. package/test-theme/snippets/news-thumbnail.liquid +120 -28
  37. package/test-theme/snippets/pagination.liquid +1 -1
  38. package/test-theme/snippets/price.liquid +100 -9
  39. package/test-theme/snippets/product-card-related.liquid +22 -4
  40. package/test-theme/snippets/product-card-simple.liquid +521 -25
  41. package/test-theme/snippets/product-card.liquid +145 -232
  42. package/test-theme/snippets/rating.liquid +100 -9
  43. package/test-theme/snippets/skeleton-collection-grid.liquid +94 -8
  44. package/test-theme/snippets/skeleton-product-card.liquid +102 -16
  45. package/test-theme/snippets/skeleton-product-grid.liquid +87 -1
  46. package/test-theme/snippets/social-sharing.liquid +133 -32
  47. package/test-theme/templates/account/dashboard.liquid +30 -0
  48. package/test-theme/templates/account/loyalty-redemption.liquid +29 -28
  49. package/test-theme/templates/account/loyalty.liquid +45 -43
  50. package/test-theme/templates/account/order-detail.liquid +15 -8
  51. package/test-theme/templates/account/orders.liquid +189 -35
  52. package/test-theme/templates/account/profile.liquid +509 -114
  53. package/test-theme/templates/account/register.liquid +18 -8
  54. package/test-theme/templates/account/return-orders.liquid +31 -30
  55. package/test-theme/templates/account/store-credit.liquid +27 -26
  56. package/test-theme/templates/account/subscriptions.liquid +22 -5
  57. package/test-theme/templates/account/wishlist.liquid +88 -19
  58. package/test-theme/templates/address-book.liquid +166 -69
  59. package/test-theme/templates/categories.liquid +90 -30
  60. package/test-theme/templates/checkout.liquid +137 -3834
  61. package/test-theme/templates/error.liquid +23 -21
  62. package/test-theme/templates/index.liquid +29 -0
  63. package/test-theme/templates/login.liquid +33 -6
  64. package/test-theme/templates/order-confirmation.liquid +67 -9
  65. package/test-theme/templates/page.liquid +418 -206
  66. package/test-theme/templates/product-detail.liquid +124 -3878
  67. package/test-theme/templates/products.liquid +155 -30
  68. package/test-theme/templates/search.liquid +739 -225
  69. package/test-theme/widgets/brand-carousel.liquid +102 -82
  70. package/test-theme/widgets/brand.liquid +78 -50
  71. package/test-theme/widgets/carousel.liquid +253 -121
  72. package/test-theme/widgets/category-list-carousel.liquid +32 -8
  73. package/test-theme/widgets/category-list.liquid +21 -6
  74. package/test-theme/widgets/category.liquid +104 -37
  75. package/test-theme/widgets/discount-time.liquid +326 -119
  76. package/test-theme/widgets/footer-menu.liquid +115 -23
  77. package/test-theme/widgets/footer.liquid +118 -5
  78. package/test-theme/widgets/gallery.liquid +29 -5
  79. package/test-theme/widgets/header-menu.liquid +25 -13
  80. package/test-theme/widgets/header.liquid +64 -26
  81. package/test-theme/widgets/html.liquid +29 -6
  82. package/test-theme/widgets/news.liquid +6 -0
  83. package/test-theme/widgets/product-canvas.liquid +20 -12
  84. package/test-theme/widgets/product-carousel.liquid +118 -56
  85. package/test-theme/widgets/shared/product-grid.liquid +12 -0
  86. package/test-theme/widgets/single-product.liquid +688 -250
  87. package/test-theme/widgets/spacebar-carousel.liquid +39 -10
  88. package/test-theme/widgets/spacebar.liquid +77 -6
  89. package/test-theme/widgets/splash.liquid +40 -30
  90. package/test-theme/widgets/testimonial-carousel.liquid +111 -67
@@ -74,6 +74,93 @@
74
74
  </div>
75
75
 
76
76
  <style>
77
+ :root {
78
+ --color-primary: {{ settings.color_primary | default: '#000000' }};
79
+ --color-primary-hover: {{ settings.color_primary_dark | default: '#333333' }};
80
+ --color-primary-light: {{ settings.color_primary_light | default: '#666666' }};
81
+ --color-success: {{ settings.color_success | default: '#22c55e' }};
82
+ --color-success-light: {{ settings.color_success | default: '#22c55e' }};
83
+ --color-success-dark: {{ settings.color_success | default: '#22c55e' }};
84
+ --color-danger: {{ settings.color_error | default: '#ef4444' }};
85
+ --color-danger-light: {{ settings.color_error | default: '#ef4444' }};
86
+ --color-danger-dark: {{ settings.color_error | default: '#ef4444' }};
87
+ --color-text: {{ settings.color_text | default: '#000000' }};
88
+ --color-text-light: {{ settings.color_text_light | default: '#999999' }};
89
+ --color-text-muted: {{ settings.color_text_muted | default: '#666666' }};
90
+ --color-background: {{ settings.color_background | default: '#ffffff' }};
91
+ --color-card-bg: {{ settings.color_surface | default: '#f5f5f5' }};
92
+ --color-border: {{ settings.color_border | default: '#cccccc' }};
93
+ --color-border-light: {{ settings.color_surface | default: '#f5f5f5' }};
94
+ --color-white: #ffffff;
95
+ --color-black: {{ settings.color_primary_dark | default: '#333333' }};
96
+ --color-gray-25: {{ settings.color_background | default: '#ffffff' }};
97
+ --color-gray-50: {{ settings.color_surface | default: '#f5f5f5' }};
98
+ --color-gray-100: {{ settings.color_surface | default: '#f5f5f5' }};
99
+ --color-gray-200: {{ settings.color_border | default: '#cccccc' }};
100
+ --color-gray-300: {{ settings.color_border | default: '#cccccc' }};
101
+ --color-gray-400: {{ settings.color_text_muted | default: '#666666' }};
102
+ --color-gray-500: {{ settings.color_text_muted | default: '#666666' }};
103
+ --color-gray-600: {{ settings.color_text_muted | default: '#666666' }};
104
+ --color-gray-700: {{ settings.color_text | default: '#000000' }};
105
+ --color-gray-800: {{ settings.color_text | default: '#000000' }};
106
+ --color-gray-900: {{ settings.color_text | default: '#000000' }};
107
+ /* Shadow variables - mapped from settings */
108
+ --shadow-opacity: {{ settings.shadow_opacity | default: 0.1 }};
109
+ --shadow-blur: {{ settings.shadow_blur | default: 8 }}px;
110
+ --shadow-spread: {{ settings.shadow_spread | default: 0 }}px;
111
+
112
+ /* Border radius - mapped from settings */
113
+ --radius-sm: {{ settings.border_radius_small | default: 6 }}px;
114
+ --radius-md: {{ settings.border_radius_medium | default: 10 }}px;
115
+ --radius-lg: {{ settings.border_radius_large | default: 16 }}px;
116
+ --radius-xl: 24px;
117
+ --radius-2xl: 32px;
118
+ --radius-full: 9999px;
119
+
120
+ /* Spacing - mapped from settings */
121
+ --spacing-xs: {{ settings.spacing_xsmall | default: 4 }}px;
122
+ --spacing-sm: {{ settings.spacing_small | default: 8 }}px;
123
+ --spacing-md: {{ settings.spacing_element | default: 16 }}px;
124
+ --spacing-lg: {{ settings.spacing_component | default: 24 }}px;
125
+ --spacing-xl: {{ settings.spacing_large | default: 32 }}px;
126
+
127
+ /* Typography - mapped from settings */
128
+ --font-primary: {{ settings.font_primary | default: '' }}, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;
129
+
130
+ /* Text sizes - based on font_size_base from settings */
131
+ --text-xs: 12px;
132
+ --text-sm: {{ settings.font_size_base | default: 14 }}px;
133
+ --text-base: {{ settings.font_size_base | default: 14 }}px;
134
+ --text-lg: 16px;
135
+ --text-xl: 18px;
136
+ --text-2xl: 21px;
137
+
138
+ /* Transitions - mapped from settings */
139
+ --transition-fast: 133ms cubic-bezier(0, 0, 0.2, 1);
140
+ --transition: {{ settings.button_transition_speed | default: 200 }}ms cubic-bezier(0, 0, 0.2, 1);
141
+ --transition-slow: 300ms cubic-bezier(0, 0, 0.2, 1);
142
+ --duration-150: 150ms;
143
+ --duration-300: 300ms;
144
+ --ease-out: cubic-bezier(0, 0, 0.2, 1);
145
+ --ease-in: cubic-bezier(0.4, 0, 1, 1);
146
+ --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
147
+
148
+ /* Z-index values */
149
+ --z-10: 10;
150
+ --z-modal: 1050;
151
+ --z-dropdown: 1000;
152
+ --font-heading: {{ settings.font_heading | default: '' }}, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;
153
+ --font-display: {{ settings.font_display | default: '' }}, 'Georgia', 'Times New Roman', serif;
154
+ --font-body: {{ settings.font_body | default: '' }}, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;
155
+ --font-weight-bold: {{ settings.font_weight_bold | default: 700 }};
156
+ --font-weight-medium: {{ settings.font_weight_medium | default: 500 }};
157
+ --line-height-heading: {{ settings.line_height_heading | default: 1.2 }};
158
+ --leading-none: var(--leading-none);
159
+ --leading-normal: var(--leading-normal);
160
+ --leading-snug: var(--leading-snug);
161
+ --tracking-wider: var(--tracking-wider);
162
+ }
163
+
77
164
  /* Menu Navigation Styles */
78
165
  .header-menu-nav {
79
166
  flex: 1 1 auto;
@@ -92,16 +179,16 @@
92
179
 
93
180
  .header-menu-nav__loading,
94
181
  .header-menu-nav__error {
95
- padding: 0.5rem 0;
96
- color: #000;
97
- font-size: 1rem;
182
+ padding: var(--space-2) 0;
183
+ color: var(--color-black);
184
+ font-size: var(--text-base);
98
185
  opacity: 0.6;
99
186
  }
100
187
 
101
188
  .header-menu-nav__list {
102
189
  display: flex;
103
190
  align-items: center;
104
- gap: 1.5rem;
191
+ gap: var(--space-5);
105
192
  list-style: none;
106
193
  margin: 0;
107
194
  padding: 0;
@@ -129,7 +216,7 @@
129
216
  }
130
217
 
131
218
  .header-menu-nav__link:hover {
132
- color: #333;
219
+ color: var(--color-gray-700);
133
220
  }
134
221
 
135
222
  .header-menu-nav__item.has-children .header-menu-nav__link::after {
@@ -137,26 +224,26 @@
137
224
  display: inline-block;
138
225
  width: 0;
139
226
  height: 0;
140
- border-left: 0.25rem solid transparent;
141
- border-right: 0.25rem solid transparent;
142
- border-top: 0.3125rem solid #000;
143
- margin-left: 0.25rem;
227
+ border-left: var(--space-1) solid transparent;
228
+ border-right: var(--space-1) solid transparent;
229
+ border-top: 0.3125rem solid var(--color-black);
230
+ margin-left: var(--space-1);
144
231
  }
145
232
 
146
233
  .header-menu-nav__submenu {
147
234
  position: absolute;
148
- top: calc(100% + 0.5rem);
235
+ top: 100%;
149
236
  left: 0;
150
237
  display: none;
151
238
  flex-direction: column;
152
- background: #fff;
153
- padding: 0.5rem 0;
154
- border-radius: 8px;
155
- box-shadow: 0 1rem 1.5rem rgba(0, 0, 0, 0.1);
239
+ background: var(--color-white);
240
+ padding: var(--space-2) 0;
241
+ border-radius: var(--radius-md);
242
+ box-shadow: var(--shadow-md);
156
243
  min-width: 12.5rem;
157
244
  list-style: none;
158
245
  margin: 0;
159
- z-index: 100;
246
+ z-index: var(--z-dropdown);
160
247
  border: 0.125rem solid rgba(0, 0, 0, 0.08);
161
248
  }
162
249
 
@@ -167,10 +254,10 @@
167
254
  .header-menu-nav__submenu-link {
168
255
  display: block;
169
256
  padding: 0.625rem 1.25rem;
170
- color: #000;
257
+ color: var(--color-black);
171
258
  text-decoration: none;
172
- font-size: 0.875rem;
173
- transition: background-color 150ms ease;
259
+ font-size: var(--text-sm);
260
+ transition: background-color var(--duration-150) var(--ease-out);
174
261
  }
175
262
 
176
263
  .header-menu-nav__submenu-link:hover {
@@ -190,13 +277,13 @@
190
277
  width: 100% !important;
191
278
  height: 100vh !important;
192
279
  background-color: rgba(0, 0, 0, 0.5);
193
- backdrop-filter: blur(2px);
194
- z-index: 9999 !important;
280
+ backdrop-filter: blur(var(--space-0-5));
281
+ z-index: var(--z-modal) !important;
195
282
  pointer-events: none;
196
283
  display: block !important;
197
284
  opacity: 0;
198
285
  visibility: hidden;
199
- transition: opacity 300ms ease, visibility 300ms ease;
286
+ transition: opacity var(--duration-300) var(--ease-out), visibility var(--duration-300) var(--ease-out);
200
287
  margin: 0 !important;
201
288
  padding: 0 !important;
202
289
  }
@@ -221,12 +308,12 @@
221
308
  width: 280px !important;
222
309
  max-width: 85vw !important;
223
310
  height: 100% !important;
224
- background-color: #fff !important;
225
- padding: 1.5rem !important;
311
+ background-color: var(--color-white) !important;
312
+ padding: var(--space-6) !important;
226
313
  overflow-y: auto !important;
227
314
  transform: translateX(-100%);
228
- transition: transform 300ms ease;
229
- box-shadow: 0.125rem 0 0.5rem rgba(0, 0, 0, 0.15);
315
+ transition: transform var(--duration-300) var(--ease-out);
316
+ box-shadow: var(--shadow-md);
230
317
  display: flex !important;
231
318
  flex-direction: column !important;
232
319
  margin: 0 !important;
@@ -240,13 +327,13 @@
240
327
  display: flex;
241
328
  align-items: center;
242
329
  justify-content: space-between;
243
- margin-bottom: 1.5rem;
244
- padding-bottom: 0.75rem;
330
+ margin-bottom: var(--space-6);
331
+ padding-bottom: var(--space-3);
245
332
  border-bottom: 0.125rem solid rgba(0, 0, 0, 0.08);
246
333
  }
247
334
 
248
335
  .header-menu-nav__mobile-drawer-title {
249
- font-size: 1.125rem;
336
+ font-size: var(--text-2xl);
250
337
  font-weight: 600;
251
338
  margin: 0;
252
339
  }
@@ -260,7 +347,7 @@
260
347
  background: none;
261
348
  border: none;
262
349
  cursor: pointer;
263
- border-radius: 0.25rem;
350
+ border-radius: var(--radius);
264
351
  }
265
352
 
266
353
  .header-menu-nav__mobile-drawer-close:hover {
@@ -284,17 +371,17 @@
284
371
 
285
372
  .header-menu-nav__mobile-drawer-link {
286
373
  display: block;
287
- padding: 1rem 0;
288
- color: #000;
374
+ padding: var(--spacing-sm) 0;
375
+ color: var(--color-black);
289
376
  text-decoration: none;
290
377
  font-weight: 500;
291
- font-size: 1.2rem;
378
+ font-size: var(--text-lg);
292
379
  }
293
380
 
294
381
  .header-menu-nav__mobile-drawer-sublist {
295
382
  list-style: none;
296
383
  margin: 0;
297
- padding: 0 0 0 1rem;
384
+ padding: 0 0 0 var(--spacing-sm);
298
385
  border-left: 0.125rem solid rgba(0, 0, 0, 0.08);
299
386
  display: none;
300
387
  }
@@ -305,10 +392,10 @@
305
392
 
306
393
  .header-menu-nav__mobile-drawer-sublink {
307
394
  display: block;
308
- padding: 0.75rem 0;
309
- color: #000;
395
+ padding: var(--space-3) 0;
396
+ color: var(--color-black);
310
397
  text-decoration: none;
311
- font-size: 0.875rem;
398
+ font-size: var(--text-sm);
312
399
  }
313
400
  }
314
401
 
@@ -321,7 +408,7 @@
321
408
  </style>
322
409
 
323
410
  <script>
324
- (function() {
411
+ (() => {
325
412
  'use strict';
326
413
 
327
414
  // Prevent multiple initializations
@@ -395,7 +482,7 @@
395
482
  toggle.dataset.menuListenerAttached = 'true';
396
483
 
397
484
  // Toggle button click handler (only on mobile)
398
- toggle.addEventListener('click', function(e) {
485
+ toggle.addEventListener('click', (e) => {
399
486
  // Double check we're on mobile
400
487
  if (window.innerWidth > 768) {
401
488
  console.log('[HeaderMenu] Ignoring toggle click on desktop');
@@ -420,7 +507,7 @@
420
507
 
421
508
  // Close button handler
422
509
  if (drawerClose) {
423
- drawerClose.addEventListener('click', function(e) {
510
+ drawerClose.addEventListener('click', (e) => {
424
511
  e.preventDefault();
425
512
  e.stopPropagation();
426
513
  console.log('[HeaderMenu] Close button clicked');
@@ -433,7 +520,7 @@
433
520
 
434
521
  // Close on Escape key (only add once)
435
522
  if (!window.__headerMenuEscapeHandler) {
436
- window.__headerMenuEscapeHandler = function(e) {
523
+ window.__headerMenuEscapeHandler = (e) => {
437
524
  if (e.key === 'Escape' && window.innerWidth <= 768) {
438
525
  const currentDrawer = document.getElementById('header-menu-mobile-drawer');
439
526
  if (currentDrawer && currentDrawer.classList.contains('active')) {
@@ -447,7 +534,7 @@
447
534
 
448
535
  // Close on outside click (only add once)
449
536
  if (!window.__headerMenuOverlayHandler) {
450
- window.__headerMenuOverlayHandler = function(e) {
537
+ window.__headerMenuOverlayHandler = (e) => {
451
538
  if (window.innerWidth > 768) return;
452
539
  const currentDrawer = document.getElementById('header-menu-mobile-drawer');
453
540
  if (currentDrawer && currentDrawer.classList.contains('active')) {
@@ -743,7 +830,7 @@
743
830
  const newLink = link.cloneNode(true);
744
831
  link.parentNode.replaceChild(newLink, link);
745
832
 
746
- newLink.addEventListener('click', function(e) {
833
+ newLink.addEventListener('click', (e) => {
747
834
  const submenu = item.querySelector('.header-menu-nav__mobile-drawer-sublist');
748
835
  if (submenu) {
749
836
  e.preventDefault();
@@ -800,7 +887,7 @@
800
887
  }
801
888
 
802
889
  if (document.readyState === 'loading') {
803
- document.addEventListener('DOMContentLoaded', function() {
890
+ document.addEventListener('DOMContentLoaded', () => {
804
891
  init();
805
892
  normalizeServerRenderedLinks();
806
893
  });
@@ -33,7 +33,7 @@
33
33
  {% assign news_category = news_item.category | default: news_item.Category %}
34
34
 
35
35
  <div class="news-thumbnail">
36
- <a href="/news/{{ news_slug }}" class="news-thumbnail__link">
36
+ <a href="/{{ news_slug }}" class="news-thumbnail__link">
37
37
  {% if news_image and news_image != blank %}
38
38
  <div class="news-thumbnail__image">
39
39
  {% if news_image contains 'http://' or news_image contains 'https://' %}
@@ -76,19 +76,111 @@
76
76
  </div>
77
77
 
78
78
  <style>
79
+ :root {
80
+ --color-primary: {{ settings.color_primary | default: '#000000' }};
81
+ --color-primary-hover: {{ settings.color_primary_dark | default: '#333333' }};
82
+ --color-primary-light: {{ settings.color_primary_light | default: '#666666' }};
83
+ --color-success: {{ settings.color_success | default: '#22c55e' }};
84
+ --color-success-light: {{ settings.color_success | default: '#22c55e' }};
85
+ --color-success-dark: {{ settings.color_success | default: '#22c55e' }};
86
+ --color-danger: {{ settings.color_error | default: '#ef4444' }};
87
+ --color-danger-light: {{ settings.color_error | default: '#ef4444' }};
88
+ --color-danger-dark: {{ settings.color_error | default: '#ef4444' }};
89
+ --color-text: {{ settings.color_text | default: '#000000' }};
90
+ --color-text-light: {{ settings.color_text_light | default: '#999999' }};
91
+ --color-text-muted: {{ settings.color_text_muted | default: '#666666' }};
92
+ --color-background: {{ settings.color_background | default: '#ffffff' }};
93
+ --color-card-bg: {{ settings.color_surface | default: '#f5f5f5' }};
94
+ --color-border: {{ settings.color_border | default: '#cccccc' }};
95
+ --color-border-light: {{ settings.color_surface | default: '#f5f5f5' }};
96
+ --color-white: #ffffff;
97
+ --color-black: {{ settings.color_primary_dark | default: '#333333' }};
98
+ --color-gray-25: {{ settings.color_background | default: '#ffffff' }};
99
+ --color-gray-50: {{ settings.color_surface | default: '#f5f5f5' }};
100
+ --color-gray-100: {{ settings.color_surface | default: '#f5f5f5' }};
101
+ --color-gray-200: {{ settings.color_border | default: '#cccccc' }};
102
+ --color-gray-300: {{ settings.color_border | default: '#cccccc' }};
103
+ --color-gray-400: {{ settings.color_text_muted | default: '#666666' }};
104
+ --color-gray-500: {{ settings.color_text_muted | default: '#666666' }};
105
+ --color-gray-600: {{ settings.color_text_muted | default: '#666666' }};
106
+ --color-gray-700: {{ settings.color_text | default: '#000000' }};
107
+ --color-gray-800: {{ settings.color_text | default: '#000000' }};
108
+ --color-gray-900: {{ settings.color_text | default: '#000000' }};
109
+ --shadow-sm: var(--shadow-sm);
110
+ --shadow-md: var(--shadow-md);
111
+ --shadow-lg: var(--shadow-lg);
112
+ /* Shadow variables - mapped from settings */
113
+ --shadow-opacity: {{ settings.shadow_opacity | default: 0.1 }};
114
+ --shadow-blur: {{ settings.shadow_blur | default: 8 }}px;
115
+ --shadow-spread: {{ settings.shadow_spread | default: 0 }}px;
116
+
117
+ /* Border radius - mapped from settings */
118
+ --radius-sm: {{ settings.border_radius_small | default: 6 }}px;
119
+ --radius-md: {{ settings.border_radius_medium | default: 10 }}px;
120
+ --radius-lg: {{ settings.border_radius_large | default: 16 }}px;
121
+ --radius-xl: 24px;
122
+ --radius-2xl: 32px;
123
+ --radius-full: 9999px;
124
+
125
+ /* Spacing - mapped from settings */
126
+ --spacing-xs: {{ settings.spacing_xsmall | default: 4 }}px;
127
+ --spacing-sm: {{ settings.spacing_small | default: 8 }}px;
128
+ --spacing-md: {{ settings.spacing_element | default: 16 }}px;
129
+ --spacing-lg: {{ settings.spacing_component | default: 24 }}px;
130
+ --spacing-xl: {{ settings.spacing_large | default: 32 }}px;
131
+
132
+ /* Typography - mapped from settings */
133
+ --font-primary: {{ settings.font_primary | default: '' }}, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;
134
+ --font-heading: {{ settings.font_heading | default: '' }}, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;
135
+ --font-display: {{ settings.font_display | default: '' }}, 'Georgia', 'Times New Roman', serif;
136
+ --font-body: {{ settings.font_body | default: '' }}, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;
137
+ --font-weight-bold: {{ settings.font_weight_bold | default: 700 }};
138
+ --font-weight-medium: {{ settings.font_weight_medium | default: 500 }};
139
+ --line-height-heading: {{ settings.line_height_heading | default: 1.2 }};
140
+
141
+ /* Text sizes - based on font_size_base from settings */
142
+ --text-xs: 12px;
143
+ --text-sm: {{ settings.font_size_base | default: 14 }}px;
144
+ --text-base: {{ settings.font_size_base | default: 14 }}px;
145
+ --text-lg: 16px;
146
+ --text-xl: 18px;
147
+ --text-2xl: 21px;
148
+
149
+ /* Transitions - mapped from settings */
150
+ --transition-fast: 133ms cubic-bezier(0, 0, 0.2, 1);
151
+ --transition: {{ settings.button_transition_speed | default: 200 }}ms cubic-bezier(0, 0, 0.2, 1);
152
+ --transition-slow: 300ms cubic-bezier(0, 0, 0.2, 1);
153
+ --duration-150: 150ms;
154
+ --duration-300: 300ms;
155
+ --ease-out: cubic-bezier(0, 0, 0.2, 1);
156
+ --ease-in: cubic-bezier(0.4, 0, 1, 1);
157
+ --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
158
+
159
+ /* Z-index values */
160
+ --z-10: 10;
161
+ --z-modal: 1050;
162
+ --z-dropdown: 1000;
163
+
164
+ /* Line heights - mapped from settings */
165
+ --leading-none: 1;
166
+ --leading-normal: {{ settings.line_height_base | default: 1.6 }};
167
+ --leading-snug: 1.375;
168
+ --tracking-wider: var(--tracking-wider);
169
+ }
170
+
79
171
  .news-thumbnail {
80
172
  width: 100%;
81
173
  height: 100%;
82
- background: #fff;
83
- border-radius: 8px;
174
+ background: var(--color-white);
175
+ border-radius: var(--radius-md);
84
176
  overflow: hidden;
85
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
86
- transition: transform 0.2s ease, box-shadow 0.2s ease;
177
+ box-shadow: var(--shadow-sm);
178
+ transition: transform var(--transition), box-shadow var(--transition);
87
179
  }
88
180
 
89
181
  .news-thumbnail:hover {
90
- transform: translateY(-4px);
91
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
182
+ transform: translateY(calc(-1 * var(--space-1)));
183
+ box-shadow: var(--shadow-md);
92
184
  }
93
185
 
94
186
  .news-thumbnail__link {
@@ -103,7 +195,7 @@
103
195
  width: 100%;
104
196
  aspect-ratio: 16 / 9;
105
197
  overflow: hidden;
106
- background: #f5f5f5;
198
+ background: var(--color-gray-50);
107
199
  }
108
200
 
109
201
  .news-thumbnail__image img {
@@ -119,32 +211,32 @@
119
211
  display: flex;
120
212
  align-items: center;
121
213
  justify-content: center;
122
- background: #f5f5f5;
123
- color: #999;
214
+ background: var(--color-gray-50);
215
+ color: var(--color-gray-400);
124
216
  }
125
217
 
126
218
  .news-thumbnail__content {
127
- padding: 16px;
219
+ padding: var(--spacing-element);
128
220
  flex: 1;
129
221
  display: flex;
130
222
  flex-direction: column;
131
- gap: 8px;
223
+ gap: var(--space-2);
132
224
  }
133
225
 
134
226
  .news-thumbnail__category {
135
- font-size: 12px;
136
- font-weight: 600;
227
+ font-size: var(--text-xs);
228
+ font-weight: var(--font-weight-bold);
137
229
  text-transform: uppercase;
138
- letter-spacing: 0.05em;
139
- color: #666;
230
+ letter-spacing: var(--tracking-wider);
231
+ color: var(--color-gray-400);
140
232
  }
141
233
 
142
234
  .news-thumbnail__title {
143
- font-size: 16px;
144
- font-weight: 600;
145
- line-height: 1.4;
235
+ font-size: var(--text-base);
236
+ font-weight: var(--font-weight-bold);
237
+ line-height: var(--leading-tight);
146
238
  margin: 0;
147
- color: #111;
239
+ color: var(--color-gray-900);
148
240
  display: -webkit-box;
149
241
  -webkit-line-clamp: 2;
150
242
  -webkit-box-orient: vertical;
@@ -152,9 +244,9 @@
152
244
  }
153
245
 
154
246
  .news-thumbnail__excerpt {
155
- font-size: 14px;
156
- line-height: 1.6;
157
- color: #666;
247
+ font-size: var(--text-sm);
248
+ line-height: var(--leading-normal);
249
+ color: var(--color-gray-400);
158
250
  margin: 0;
159
251
  display: -webkit-box;
160
252
  -webkit-line-clamp: 3;
@@ -164,22 +256,22 @@
164
256
  }
165
257
 
166
258
  .news-thumbnail__date {
167
- font-size: 12px;
168
- color: #999;
259
+ font-size: var(--text-xs);
260
+ color: var(--color-gray-400);
169
261
  margin-top: auto;
170
262
  }
171
263
 
172
264
  @media (max-width: 768px) {
173
265
  .news-thumbnail__content {
174
- padding: 12px;
266
+ padding: var(--space-3);
175
267
  }
176
268
 
177
269
  .news-thumbnail__title {
178
- font-size: 14px;
270
+ font-size: var(--text-sm);
179
271
  }
180
272
 
181
273
  .news-thumbnail__excerpt {
182
- font-size: 13px;
274
+ font-size: var(--text-sm);
183
275
  -webkit-line-clamp: 2;
184
276
  }
185
277
  }
@@ -88,7 +88,7 @@
88
88
 
89
89
  <script>
90
90
  // Preserve URL parameters when navigating pagination
91
- (function() {
91
+ (() => {
92
92
  'use strict';
93
93
 
94
94
  const paginationContainer = document.getElementById('pagination-container');