@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
@@ -30,6 +30,10 @@
30
30
  assign background_color = widget_settings.backgroundColor
31
31
  assign text_color = widget_settings.textColor
32
32
  %}
33
+ {% assign is_hero_priority_widget = false %}
34
+ {% if is_hero_first == true or is_hero_first == 'true' or is_hero_first == 1 or is_hero_first == '1' %}
35
+ {% assign is_hero_priority_widget = true %}
36
+ {% endif %}
33
37
 
34
38
  <section class="widget widget-category-carousel" data-widget-id="{{ widget.id }}" data-category-carousel{% if background_color and background_color != blank and background_color != 'null' %} style="background-color: {{ background_color }};"{% endif %}>
35
39
  <div class="category-carousel-container">
@@ -114,7 +118,10 @@
114
118
  <a href="{{ cat_url }}" class="category-carousel-item">
115
119
  <div class="category-carousel-item__media">
116
120
  {% if cat_image != blank and cat_image != nil and cat_image != 'null' %}
117
- <img src="{{ cat_image }}" alt="{{ cat_name }}" width="300" height="300" loading="lazy" onerror="this.style.display='none'; this.nextElementSibling.style.display='flex';">
121
+ {% if forloop.first and is_hero_priority_widget %}
122
+ <link rel="preload" as="image" href="{{ cat_image }}" fetchpriority="high">
123
+ {% endif %}
124
+ <img src="{{ cat_image }}" alt="{{ cat_name }}" width="300" height="300" loading="{% if forloop.first %}eager{% else %}lazy{% endif %}" {% if forloop.first and is_hero_priority_widget %}fetchpriority="high"{% endif %} data-img-fallback="next" data-img-fallback-display="flex">
118
125
  <span class="category-carousel-item__placeholder category-carousel-item__placeholder--fallback" style="display: none;">
119
126
  <svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
120
127
  <path d="M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4zM14 14h6v6h-6z"/>
@@ -157,6 +164,27 @@
157
164
  </div>
158
165
 
159
166
  <style>
167
+ :root {
168
+ --category-carousel-white: var(--color-white);
169
+ --category-carousel-text: var(--color-text);
170
+ --category-carousel-text-muted: var(--color-text-muted);
171
+ --category-carousel-border: var(--color-border);
172
+ --category-carousel-spacing-section: var(--spacing-section);
173
+ --category-carousel-spacing-large: var(--spacing-large);
174
+ --category-carousel-spacing-component: var(--spacing-component);
175
+ --category-carousel-spacing-element: var(--spacing-element);
176
+ --category-carousel-spacing-small: var(--spacing-small);
177
+ --category-carousel-spacing-xsmall: var(--spacing-xsmall);
178
+ --category-carousel-container-padding: var(--container-padding);
179
+ --category-carousel-radius-xl: var(--radius-xl);
180
+ --category-carousel-radius-lg: var(--radius-lg);
181
+ --category-carousel-radius: var(--radius);
182
+ --category-carousel-radius-full: var(--radius-full);
183
+ --category-carousel-transition-fast: var(--transition-fast);
184
+ --category-carousel-text-sm: var(--text-sm);
185
+ --category-carousel-text-xs: var(--text-xs);
186
+ }
187
+
160
188
  /* Category Carousel - True Carousel Behavior */
161
189
  .widget-category-carousel {
162
190
  padding: 48px 0;
@@ -249,7 +277,6 @@
249
277
  border-radius: 50%;
250
278
  border: none;
251
279
  background: #fff;
252
- box-shadow: 0 2px 12px rgba(0, 0, 0, 0.12);
253
280
  align-items: center;
254
281
  justify-content: center;
255
282
  cursor: pointer;
@@ -310,15 +337,13 @@
310
337
  background: #fff;
311
338
  border-radius: 12px;
312
339
  overflow: hidden;
313
- box-shadow: 0 4px 12px rgba(15, 23, 42, 0.08);
314
340
  text-decoration: none;
315
341
  color: inherit;
316
- transition: transform 0.25s ease, box-shadow 0.25s ease;
342
+ transition: transform 0.25s ease;
317
343
  }
318
344
 
319
345
  .widget-category-carousel .category-carousel-item:hover {
320
346
  transform: translateY(-4px);
321
- box-shadow: 0 12px 24px rgba(15, 23, 42, 0.12);
322
347
  }
323
348
 
324
349
  .widget-category-carousel .category-carousel-item__media {
@@ -330,8 +355,7 @@
330
355
 
331
356
  .widget-category-carousel .category-carousel-item__media img {
332
357
  width: 100%;
333
- height: 100%;
334
- object-fit: cover;
358
+ object-fit: contain;
335
359
  transition: transform 0.3s ease;
336
360
  }
337
361
 
@@ -504,7 +528,7 @@
504
528
  </style>
505
529
 
506
530
  <script>
507
- (function() {
531
+ (() => {
508
532
  // Wait for DOM
509
533
  if (document.readyState === 'loading') {
510
534
  document.addEventListener('DOMContentLoaded', initCategoryCarousel);
@@ -95,7 +95,7 @@
95
95
  <a href="{{ cat_url }}" class="widget-category-list__link">
96
96
  <div class="widget-category-list__media">
97
97
  {% if cat_image != blank and cat_image != nil and cat_image != 'null' %}
98
- <img src="{{ cat_image }}" alt="{{ cat_name }}" width="300" height="300" loading="lazy" onerror="this.style.display='none'; this.nextElementSibling.style.display='flex';">
98
+ <img src="{{ cat_image }}" alt="{{ cat_name }}" width="300" height="300" loading="lazy" data-img-fallback="next" data-img-fallback-display="flex">
99
99
  <span class="widget-category-list__placeholder widget-category-list__placeholder--fallback" style="display: none;" aria-hidden="true">
100
100
  <svg width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
101
101
  <path d="M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4zM14 14h6v6h-6z"/>
@@ -129,6 +129,24 @@
129
129
  </div>
130
130
 
131
131
  <style>
132
+ :root {
133
+ --category-list-white: var(--color-white);
134
+ --category-list-text: var(--color-text);
135
+ --category-list-text-muted: var(--color-text-muted);
136
+ --category-list-spacing-section: var(--spacing-section);
137
+ --category-list-spacing-large: var(--spacing-large);
138
+ --category-list-spacing-component: var(--spacing-component);
139
+ --category-list-spacing-element: var(--spacing-element);
140
+ --category-list-spacing-small: var(--spacing-small);
141
+ --category-list-spacing-xsmall: var(--spacing-xsmall);
142
+ --category-list-container-padding: var(--container-padding);
143
+ --category-list-radius-xl: var(--radius-xl);
144
+ --category-list-radius-lg: var(--radius-lg);
145
+ --category-list-transition: var(--transition);
146
+ --category-list-text-sm: var(--text-sm);
147
+ --category-list-text-xs: var(--text-xs);
148
+ }
149
+
132
150
  .widget-category-list {
133
151
  padding: 48px 0;
134
152
  background: transparent;
@@ -178,13 +196,11 @@
178
196
  background: #fff;
179
197
  border-radius: 12px;
180
198
  overflow: hidden;
181
- box-shadow: 0 4px 12px rgba(15, 23, 42, 0.08);
182
- transition: transform 0.25s ease, box-shadow 0.25s ease;
199
+ transition: transform 0.25s ease;
183
200
  }
184
201
 
185
202
  .widget-category-list__item:hover {
186
203
  transform: translateY(-4px);
187
- box-shadow: 0 12px 24px rgba(15, 23, 42, 0.12);
188
204
  }
189
205
 
190
206
  .widget-category-list__link {
@@ -202,8 +218,7 @@
202
218
 
203
219
  .widget-category-list__media img {
204
220
  width: 100%;
205
- height: 100%;
206
- object-fit: cover;
221
+ object-fit: contain;
207
222
  transition: transform 0.3s ease;
208
223
  }
209
224
 
@@ -12,10 +12,45 @@
12
12
  Dynamic Widget: Category comes from widget_data.category (enriched by WidgetService)
13
13
  Settings come from widget_settings
14
14
  endcomment
15
+ assign heading = widget_settings.title | default: widget.Title | default: widget.title
16
+ assign subtitle = widget_settings.subtitle | default: widget.Subtitle | default: widget.subtitle
15
17
  assign background_color = widget_settings.backgroundColor
16
18
  assign text_color = widget_settings.textColor | default: '#ffffff'
17
- assign show_container = widget_settings.showContainer
18
- assign show_bottom_margin = widget_settings.showWidgetBottomMargin
19
+ assign show_container_raw = widget_settings.showContainer | default: widget_settings.ShowContainer | default: true
20
+ if show_container_raw == null or show_container_raw == blank or show_container_raw == 'null'
21
+ assign show_container = true
22
+ else
23
+ if show_container_raw == 'Yes' or show_container_raw == true or show_container_raw == 'true' or show_container_raw == 1 or show_container_raw == '1'
24
+ assign show_container = true
25
+ else
26
+ assign show_container = false
27
+ endif
28
+ endif
29
+ assign show_bottom_margin_raw = widget_settings.showWidgetBottomMargin | default: widget_settings.ShowWidgetBottomMargin | default: true
30
+ if show_bottom_margin_raw == null or show_bottom_margin_raw == blank or show_bottom_margin_raw == 'null'
31
+ assign show_bottom_margin = true
32
+ else
33
+ if show_bottom_margin_raw == 'Yes' or show_bottom_margin_raw == true or show_bottom_margin_raw == 'true' or show_bottom_margin_raw == 1 or show_bottom_margin_raw == '1'
34
+ assign show_bottom_margin = true
35
+ else
36
+ assign show_bottom_margin = false
37
+ endif
38
+ endif
39
+ assign show_widget_title_raw = widget_settings.showWidgetTitle | default: widget_settings.ShowWidgetTitle | default: true
40
+ if show_widget_title_raw == null or show_widget_title_raw == blank or show_widget_title_raw == 'null'
41
+ assign show_widget_title = true
42
+ else
43
+ if show_widget_title_raw == 'Yes' or show_widget_title_raw == true or show_widget_title_raw == 'true' or show_widget_title_raw == 1 or show_widget_title_raw == '1'
44
+ assign show_widget_title = true
45
+ else
46
+ assign show_widget_title = false
47
+ endif
48
+ endif
49
+ assign widget_title_alignment_raw = widget_settings.widgetTitleAlignment | default: widget_settings.WidgetTitleAlignment | default: 'left'
50
+ assign widget_title_alignment = widget_title_alignment_raw | downcase
51
+ if widget_title_alignment != 'left' and widget_title_alignment != 'right' and widget_title_alignment != 'center'
52
+ assign widget_title_alignment = 'left'
53
+ endif
19
54
 
20
55
 
21
56
  assign category_slug = category.slug | default: category.Slug | default: category.handle
@@ -59,6 +94,19 @@
59
94
 
60
95
  {% if category %}
61
96
  <section class="widget widget-category-banner" data-widget-id="{{ widget.id }}">
97
+ {% if show_widget_title %}
98
+ {% if heading or subtitle %}
99
+ <header class="widget-header" style="text-align: {{ widget_title_alignment }};">
100
+ {% if heading and heading != blank %}
101
+ <h2 class="widget-title">{{ heading }}</h2>
102
+ {% endif %}
103
+ {% if subtitle and subtitle != blank %}
104
+ <p class="widget-subtitle">{{ subtitle }}</p>
105
+ {% endif %}
106
+ </header>
107
+ {% endif %}
108
+ {% endif %}
109
+
62
110
  <a href="{{ category_url }}" class="category-banner{% unless category_image %} category-banner--no-image{% endunless %}">
63
111
 
64
112
  {% if category_image %}
@@ -69,7 +117,7 @@
69
117
  width="1400"
70
118
  height="400"
71
119
  loading="lazy"
72
- onerror="this.style.display='none';">
120
+ data-img-fallback="hide">
73
121
  </div>
74
122
  <div class="category-banner__overlay"></div>
75
123
  <div class="category-banner__content category-banner__content--overlay">
@@ -114,36 +162,62 @@
114
162
  </a>
115
163
 
116
164
  <style>
165
+ :root {
166
+ --category-banner-white: var(--color-white);
167
+ --category-banner-text: var(--color-text);
168
+ --category-banner-spacing-component: var(--spacing-component);
169
+ --category-banner-spacing-element: var(--spacing-element);
170
+ --category-banner-spacing-small: var(--spacing-small);
171
+ --category-banner-spacing-xsmall: var(--spacing-xsmall);
172
+ --category-banner-container-padding: var(--container-padding);
173
+ --category-banner-transition: var(--transition);
174
+ --category-banner-transition-fast: var(--transition-fast);
175
+ }
176
+
117
177
  .widget-category-banner {
118
178
  width: 100%;
119
- padding: 0 {{ settings.container_padding }}px;
120
- {% if show_bottom_margin == 'Yes' %}
121
- margin-bottom: {{ settings.spacing_large }}px;
122
- {% elsif show_bottom_margin == 'No' %}
123
- margin-bottom: 0;
179
+ padding: 0 {{ settings.container_padding | default: 16 }}px;
180
+ {% if show_bottom_margin %}
181
+ margin-bottom: {{ settings.spacing_large | default: 32 }}px;
124
182
  {% else %}
125
- margin-bottom: {{ settings.spacing_component }}px;
183
+ margin-bottom: 0;
126
184
  {% endif %}
127
185
  }
186
+
187
+ .widget-category-banner .widget-header {
188
+ margin-bottom: 16px;
189
+ }
190
+
191
+ .widget-category-banner .widget-title {
192
+ font-size: 1.4rem;
193
+ font-weight: 500;
194
+ line-height: 1.3;
195
+ margin: 0 0 6px 0;
196
+ color: #111;
197
+ }
198
+
199
+ .widget-category-banner .widget-subtitle {
200
+ font-size: 14px;
201
+ margin: 0;
202
+ color: #6b7280;
203
+ }
128
204
 
129
205
  /* ===== WITH IMAGE: Full Banner ===== */
130
206
  .category-banner {
131
207
  display: block;
132
208
  position: relative;
133
209
  width: 100%;
134
- max-width: {{ settings.container_width }}px;
210
+ max-width: {{ settings.container_width | default: 1200 }}px;
135
211
  margin: 0 auto;
136
212
  height: 280px;
137
213
  overflow: hidden;
138
214
  text-decoration: none;
139
- color: {{ settings.color_background }};
140
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);
141
- transition: box-shadow 0.3s ease, transform 0.3s ease;
215
+ color: {{ settings.color_background | default: '#ffffff' }};
216
+ transition: transform var(--category-banner-transition);
142
217
  border-radius: var(--border-radius-medium);
143
218
  }
144
219
 
145
220
  .category-banner:hover {
146
- box-shadow: 0 12px 48px rgba(0, 0, 0, 0.18);
147
221
  transform: translateY(-2px);
148
222
  }
149
223
 
@@ -165,7 +239,7 @@
165
239
  height: 100%;
166
240
  object-fit: cover;
167
241
  object-position: center;
168
- transition: transform 0.6s ease;
242
+ transition: transform var(--category-banner-transition);
169
243
  }
170
244
 
171
245
  {% comment %}
@@ -201,8 +275,7 @@
201
275
  margin: 0 0 16px 0;
202
276
  line-height: 1.15;
203
277
  letter-spacing: -0.025em;
204
- text-shadow: 0 2px 12px rgba(0, 0, 0, 0.4);
205
- color: #fff;
278
+ color: var(--category-banner-white);
206
279
  }
207
280
 
208
281
  .category-banner__content--overlay .category-banner__description {
@@ -211,8 +284,7 @@
211
284
  margin: 0 0 28px 0;
212
285
  opacity: 0.95;
213
286
  max-width: 500px;
214
- text-shadow: 0 1px 6px rgba(0, 0, 0, 0.3);
215
- color: #fff;
287
+ color: var(--category-banner-white);
216
288
  }
217
289
 
218
290
  .category-banner__cta {
@@ -224,20 +296,19 @@
224
296
  text-transform: uppercase;
225
297
  letter-spacing: 0.1em;
226
298
  padding: 14px 32px;
227
- background: {{ settings.color_background }};
228
- color: {{ settings.color_text }};
229
- transition: all 0.3s ease;
230
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2);
299
+ background: {{ settings.color_background | default: '#ffffff' }};
300
+ color: {{ settings.color_text | default: '#000000' }};
301
+ transition: all var(--category-banner-transition);
231
302
  border-radius: var(--border-radius-medium);
232
303
  }
233
304
 
234
305
  .category-banner:hover .category-banner__cta {
235
- background: {{ settings.color_text }};
236
- color: {{ settings.color_background }};
306
+ background: {{ settings.color_text | default: '#000000' }};
307
+ color: {{ settings.color_background | default: '#ffffff' }};
237
308
  }
238
309
 
239
310
  .category-banner__cta svg {
240
- transition: transform 0.3s ease;
311
+ transition: transform var(--category-banner-transition);
241
312
  }
242
313
 
243
314
  .category-banner:hover .category-banner__cta svg {
@@ -293,14 +364,13 @@
293
364
 
294
365
  .category-banner__cta--solid {
295
366
  flex-shrink: 0;
296
- background: #fff;
367
+ background: var(--category-banner-white);
297
368
  color: #764ba2;
298
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
299
369
  }
300
370
 
301
371
  .category-banner--no-image:hover .category-banner__cta--solid {
302
- background: #111;
303
- color: #fff;
372
+ background: var(--category-banner-text);
373
+ color: var(--category-banner-white);
304
374
  }
305
375
 
306
376
  /* ===== Tablet ===== */
@@ -356,9 +426,6 @@
356
426
  height: 200px;
357
427
  }
358
428
 
359
-
360
- }
361
-
362
429
  .category-banner__content--overlay {
363
430
  height: 200px;
364
431
  padding: 24px;
@@ -460,14 +527,14 @@
460
527
  </section>
461
528
  {% else %}
462
529
  <section class="widget widget-category-banner widget-category-banner--empty" data-widget-id="{{ widget.id }}">
463
- <div style="max-width: {{ settings.container_width }}px; margin: 0 auto; padding: 0 {{ settings.container_padding }}px;">
464
- <div style="padding: {{ settings.spacing_component | times: 2 }}px; text-align: center;">
465
- <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="{{ settings.color_text_muted }}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: {{ settings.spacing_element }}px;">
530
+ <div style="max-width: {{ settings.container_width | default: 1200 }}px; margin: 0 auto; padding: 0 {{ settings.container_padding | default: 16 }}px;">
531
+ <div style="padding: {{ settings.spacing_component | default: 24 | times: 2 }}px; text-align: center;">
532
+ <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="{{ settings.color_text_muted | default: '#666666' }}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: {{ settings.spacing_element | default: 16 }}px;">
466
533
  <path d="M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z"></path>
467
534
  <line x1="3" y1="6" x2="21" y2="6"></line>
468
535
  <path d="M16 10a4 4 0 0 1-8 0"></path>
469
536
  </svg>
470
- <p style="color: {{ settings.color_text_muted }}; margin: 0; font-size: {{ settings.font_size_base | plus: 1 }}px;">{{ widget_settings.empty_state | default: 'Category not found. Please configure a valid CategoryId.' }}</p>
537
+ <p style="color: {{ settings.color_text_muted | default: '#666666' }}; margin: 0; font-size: {{ settings.font_size_base | default: 14 | plus: 1 }}px;">{{ widget_settings.empty_state | default: 'Category not found. Please configure a valid CategoryId.' }}</p>
471
538
  </div>
472
539
  </div>
473
540
  </section>