@sc-360-v2/storefront-cms-library 0.5.16 → 0.5.17

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.
@@ -25,6 +25,12 @@ $cg-brand: "--_ctm-catego-dn-pt-gd-dn-bd-ne"; // productGridDesign.brandName
25
25
  $cg-name: "--_ctm-catego-dn-pt-gd-dn-pt-ne"; // productGridDesign.productName
26
26
  $cg-price: "--_ctm-catego-dn-pt-gd-dn-pt-pe"; // productGridDesign.productPrice
27
27
  $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsText
28
+ // Design-block bases for the section item-gaps.
29
+ $cg-sidebar-design: "--_ctm-catego-dn-sr-dn"; // sidebarDesign (itemGap)
30
+ $cg-scroller-design: "--_ctm-catego-dn-sb-cy-sr-dn"; // subCategoryScrollerDesign (itemGap)
31
+ $cg-grid: "--_ctm-catego-dn-pt-gd-dn"; // productGridDesign (itemGap)
32
+ $cg-main: "--_ctm-catego-dn-mn-sn"; // mainSection (right section container + itemGap)
33
+ $cg-select-btn: "--_ctm-catego-dn-st-bn"; // selectButton (mobile category selector)
28
34
 
29
35
  @mixin cg-font($base, $color, $size, $weight: 600) {
30
36
  color: prepareMediaVariable(#{$base}-cr, $color);
@@ -169,16 +175,105 @@ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsTe
169
175
  // -------------------------------------------------------------------
170
176
  .category__groups__element__container {
171
177
  display: flex;
172
- gap: 36px;
178
+ // Widget Style → gap between the left sidebar and the right main section.
179
+ gap: prepareMediaVariable(#{$cg-widget}-im-gp, 36px);
173
180
  align-items: flex-start;
174
181
  width: 100%;
175
182
  }
176
183
 
184
+ // ---- Mobile (fixed layout): the sidebar tree is replaced by a selector
185
+ // that opens the CategoryTree in a modal; everything stacks vertically.
186
+ .category__groups__element__container.is-mobile {
187
+ flex-direction: column;
188
+ gap: prepareMediaVariable(#{$cg-main}-im-gp, 12px);
189
+
190
+ .cg_main {
191
+ width: 100%;
192
+ }
193
+ }
194
+ .cg_mobile_category_select {
195
+ display: flex;
196
+ flex-direction: row;
197
+ align-items: center;
198
+ justify-content: space-between;
199
+ gap: 12px;
200
+ width: 100%;
201
+ cursor: pointer;
202
+ }
203
+ // Mobile Select-category button (rendered by the shared ButtonComponent as
204
+ // `.btn__with__text`). Styled from the `selectButton` design block — which
205
+ // uses the standard button property suffixes — via the cg-design / cg-font
206
+ // mixins (default + hover), plus the button-specific layout vars.
207
+ .btn__with__text[data-btn-name="selectButton"] {
208
+ display: flex;
209
+ align-items: center;
210
+ flex-direction: var(--_sf-fd-bn, row);
211
+ cursor: pointer;
212
+ width: prepareMediaVariable(#{$cg-select-btn}-dt-se-wh, auto);
213
+ padding: prepareMediaVariable(#{$cg-select-btn}-dt-se-pg, 8px 12px);
214
+ gap: prepareMediaVariable(#{$cg-select-btn}-dt-se-gp, 8px);
215
+ justify-content: prepareMediaVariable(#{$cg-select-btn}-dt-se-at, space-between);
216
+ @include cg-design(#{$cg-select-btn}-dt-se);
217
+
218
+ &[data-icon-position="right"] {
219
+ --_sf-fd-bn: row-reverse;
220
+ }
221
+ &[data-icon-position="left"],
222
+ &[data-icon-position="center"] {
223
+ --_sf-fd-bn: row;
224
+ }
225
+
226
+ .txt {
227
+ flex: 1;
228
+ min-width: 0;
229
+ overflow: hidden;
230
+ text-overflow: ellipsis;
231
+ white-space: nowrap;
232
+ @include cg-font(#{$cg-select-btn}-dt-se, #002a4e, 14px, 400);
233
+ }
234
+
235
+ .icon {
236
+ display: flex;
237
+ flex-shrink: 0;
238
+ svg {
239
+ width: prepareMediaVariable(#{$cg-select-btn}-dt-se-in-se, 16px);
240
+ height: prepareMediaVariable(#{$cg-select-btn}-dt-se-in-se, 16px);
241
+ path {
242
+ stroke: prepareMediaVariable(#{$cg-select-btn}-dt-se-in-c1, currentColor);
243
+ }
244
+ }
245
+ }
246
+ .icon--hover {
247
+ display: none;
248
+ }
249
+
250
+ &:hover {
251
+ @include cg-design-state($cg-select-btn, hr-se);
252
+ .txt {
253
+ @include cg-font-state($cg-select-btn, hr-se, #002a4e, 14px, 400);
254
+ }
255
+ .icon--hover {
256
+ display: flex;
257
+ }
258
+ }
259
+ // Swap to the hover icon only when one is configured.
260
+ &:hover:has(.icon--hover) .icon--default {
261
+ display: none;
262
+ }
263
+ }
264
+ // Tree rendered inside the (portaled) category modal.
265
+ .cg_category_modal_tree {
266
+ width: 100%;
267
+ padding: 4px;
268
+ }
269
+
177
270
  // ---- Left sidebar -------------------------------------------------
178
271
  .cg_sidebar {
179
272
  display: flex;
180
273
  flex-direction: column;
181
- gap: 12px;
274
+ // Sidebar Container → gap (heading ↔ tree) + padding.
275
+ gap: prepareMediaVariable(#{$cg-sidebar}-im-gp, 12px);
276
+ padding: prepareMediaVariable(#{$cg-sidebar}-pg, 0);
182
277
  width: 260px;
183
278
  flex-shrink: 0;
184
279
  background-color: prepareMediaVariable(#{$cg-sidebar}-bd-cr, transparent);
@@ -228,15 +323,18 @@ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsTe
228
323
  .cg_category_tree {
229
324
  display: flex;
230
325
  flex-direction: column;
231
- gap: 8px;
326
+ // Gap BETWEEN category rows (Sidebar Container → Category Tree Gap).
327
+ gap: prepareMediaVariable(#{$cg-sidebar}-cy-te-gp, 8px);
232
328
  width: 100%;
233
329
  }
234
330
 
235
331
  .cg_tree_node {
236
332
  display: flex;
237
333
  align-items: center;
238
- gap: 4px;
239
- padding: 4px 0;
334
+ // Category Tree Item → item gap (icon ↔ label).
335
+ gap: prepareMediaVariable(#{$cg-tree}-dt-se-im-gp, 4px);
336
+ // Category Tree Item → Layout padding.
337
+ padding: prepareMediaVariable(#{$cg-tree}-dt-se-pg, 4px 0);
240
338
  cursor: pointer;
241
339
  @include cg-design(#{$cg-tree}-dt-se);
242
340
  }
@@ -247,20 +345,50 @@ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsTe
247
345
  width: 24px;
248
346
  height: 24px;
249
347
  flex-shrink: 0;
250
- // Configurable expand/collapse icon colour (currentColor stroke).
348
+ // Configurable expand/collapse icon colour (inherited by the SVG below).
251
349
  color: prepareMediaVariable(#{$cg-tree-icon}-in-c1, #002a4e);
252
350
  }
253
351
  .cg_chevron {
254
352
  display: flex;
353
+ align-items: center;
354
+ justify-content: center;
255
355
  transition: transform 0.15s ease;
356
+ color: prepareMediaVariable(#{$cg-tree-icon}-in-c1, #002a4e);
256
357
  svg {
257
358
  width: prepareMediaVariable(#{$cg-tree-icon}-in-se, 20px);
258
359
  height: prepareMediaVariable(#{$cg-tree-icon}-in-se, 20px);
360
+ // Apply the configured colour even when the fetched SVG hardcodes its
361
+ // own stroke/fill (skip parts explicitly set to "none").
362
+ &[stroke]:not([stroke="none"]),
363
+ [stroke]:not([stroke="none"]) {
364
+ stroke: prepareMediaVariable(#{$cg-tree-icon}-in-c1, #002a4e);
365
+ }
366
+ &[fill]:not([fill="none"]),
367
+ [fill]:not([fill="none"]) {
368
+ fill: prepareMediaVariable(#{$cg-tree-icon}-in-c1, #002a4e);
369
+ }
259
370
  }
260
371
  }
261
372
  .cg_chevron.is-open {
262
373
  transform: rotate(90deg);
263
374
  }
375
+ // Expanded icon uses its own size/colour vars (iconSizeExpanded /
376
+ // iconColorExpanded) so it is independent of the collapsed icon.
377
+ .cg_chevron.is-expanded {
378
+ color: prepareMediaVariable(#{$cg-tree-icon}-in-cr-ed, #002a4e);
379
+ svg {
380
+ width: prepareMediaVariable(#{$cg-tree-icon}-in-se-ed, 20px);
381
+ height: prepareMediaVariable(#{$cg-tree-icon}-in-se-ed, 20px);
382
+ &[stroke]:not([stroke="none"]),
383
+ [stroke]:not([stroke="none"]) {
384
+ stroke: prepareMediaVariable(#{$cg-tree-icon}-in-cr-ed, #002a4e);
385
+ }
386
+ &[fill]:not([fill="none"]),
387
+ [fill]:not([fill="none"]) {
388
+ fill: prepareMediaVariable(#{$cg-tree-icon}-in-cr-ed, #002a4e);
389
+ }
390
+ }
391
+ }
264
392
  .cg_tree_node_label {
265
393
  flex: 1;
266
394
  @include cg-font(#{$cg-tree}-dt-se, #002a4e, 14px, 600);
@@ -281,12 +409,14 @@ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsTe
281
409
  .cg_subtree {
282
410
  display: flex;
283
411
  flex-direction: column;
284
- gap: 8px;
412
+ // Gap BETWEEN sub-category rows (Sidebar Container → Sub Category Gap).
413
+ gap: prepareMediaVariable(#{$cg-sidebar}-sb-cy-gp, 8px);
285
414
  padding-left: 31px;
286
415
  width: 100%;
287
416
  }
288
417
  .cg_subtree_node {
289
- padding: 4px 0;
418
+ // Sub Category Tree Item → Layout padding.
419
+ padding: prepareMediaVariable(#{$cg-subtree}-dt-se-pg, 4px 0);
290
420
  cursor: pointer;
291
421
  @include cg-design(#{$cg-subtree}-dt-se);
292
422
  }
@@ -308,12 +438,16 @@ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsTe
308
438
  }
309
439
 
310
440
  // ---- Right main ---------------------------------------------------
441
+ // mainSection: container fill/border + gap between heading, breadcrumb,
442
+ // sub-categories and the product grid.
311
443
  .cg_main {
312
444
  display: flex;
313
445
  flex-direction: column;
314
- gap: 12px;
446
+ gap: prepareMediaVariable(#{$cg-main}-im-gp, 12px);
447
+ padding: prepareMediaVariable(#{$cg-main}-pg, 0);
315
448
  flex: 1 0 0;
316
449
  min-width: 0;
450
+ @include cg-design($cg-main);
317
451
  }
318
452
 
319
453
  // Drill-down breadcrumb (reuses the Breadcrumbs element DOM classes), styled
@@ -375,7 +509,9 @@ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsTe
375
509
  display: flex;
376
510
  flex-direction: column;
377
511
  align-items: stretch;
378
- gap: 12px;
512
+ // Same gap as the main section so breadcrumb ↔ sub-categories spacing
513
+ // follows the Main Section item gap.
514
+ gap: prepareMediaVariable(#{$cg-main}-im-gp, 12px);
379
515
  width: 100%;
380
516
  }
381
517
  // The horizontal chip row: left arrow + scrolling rail + right arrow.
@@ -396,22 +532,29 @@ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsTe
396
532
  display: flex;
397
533
  align-items: center;
398
534
  justify-content: center;
399
- padding: 0;
400
- border: none;
401
- background: transparent;
535
+ padding: prepareMediaVariable(#{$cg-arrow}-dt-se-pg, 0);
402
536
  cursor: pointer;
403
537
  flex-shrink: 0;
404
- // Icon colour (property `iconColor1` -> `in-c1`) drives the SVG `currentColor` stroke.
405
- color: prepareMediaVariable(#{$cg-arrow}-in-c1, #002a4e);
538
+ // Default state: fill / border / radius / shadow.
539
+ @include cg-design(#{$cg-arrow}-dt-se);
540
+ // Icon colour (in-c1) drives the SVG `currentColor` stroke.
541
+ color: prepareMediaVariable(#{$cg-arrow}-dt-se-in-c1, #002a4e);
406
542
  svg {
407
- width: prepareMediaVariable(#{$cg-arrow}-in-se, 20px);
408
- height: prepareMediaVariable(#{$cg-arrow}-in-se, 20px);
543
+ width: prepareMediaVariable(#{$cg-arrow}-dt-se-in-se, 20px);
544
+ height: prepareMediaVariable(#{$cg-arrow}-dt-se-in-se, 20px);
545
+ }
546
+ &:hover {
547
+ @include cg-design-state($cg-arrow, hr-se);
548
+ color: prepareMediaVariable(
549
+ #{$cg-arrow}-hr-se-in-c1,
550
+ prepareMediaVariable(#{$cg-arrow}-dt-se-in-c1, #002a4e)
551
+ );
409
552
  }
410
553
  }
411
554
  .cg_chip_rail {
412
555
  display: flex;
413
556
  align-items: center;
414
- gap: 16px;
557
+ gap: prepareMediaVariable(#{$cg-scroller-design}-im-gp, 16px);
415
558
  flex: 1 0 0;
416
559
  min-width: 0;
417
560
  overflow-x: auto;
@@ -423,6 +566,8 @@ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsTe
423
566
  .cg_chip {
424
567
  display: flex;
425
568
  align-items: center;
569
+ // Spacing between the chip image and its label (Sub Category Chip item gap).
570
+ gap: prepareMediaVariable(#{$cg-chip}-dt-se-im-gp, 8px);
426
571
  cursor: pointer;
427
572
  flex-shrink: 0;
428
573
  padding: 0;
@@ -473,13 +618,17 @@ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsTe
473
618
  }
474
619
 
475
620
  // ---- Product grid -------------------------------------------------
621
+ // Container box only. Display modes (grid / cards / slider) + gaps live in
622
+ // category-groups-product-grid.scss (imported below).
476
623
  .cg_product_grid {
477
- display: grid;
478
- grid-template-columns: repeat(var(--cg-columns, 3), 1fr);
479
- column-gap: 24px;
480
- row-gap: 48px;
481
624
  width: 100%;
625
+ position: relative;
626
+ padding: prepareMediaVariable(#{$cg-grid}-lt-pg, 0);
627
+ // Grid container fill / border / radius / shadow.
628
+ @include cg-design(#{$cg-grid}-lt);
482
629
  }
630
+ // Display styles (Grid / Cards / Slider) for the product grid.
631
+ @import "./category-groups-product-grid.scss";
483
632
  .cg_product_card {
484
633
  display: flex;
485
634
  flex-direction: column;
@@ -516,11 +665,16 @@ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsTe
516
665
  .cg_product_info {
517
666
  display: flex;
518
667
  flex-direction: column;
519
- gap: 12px;
668
+ // Product Card → content gap (between brand / name / price / options).
669
+ gap: prepareMediaVariable(#{$cg-card}-dt-se-ct-gp, 12px);
520
670
  }
521
671
  .cg_brand_name {
522
672
  margin: 0;
523
673
  @include cg-font($cg-brand, #737373, 14px, 400);
674
+ // Text overflow toggle + max lines (Brand Name design controls).
675
+ &.flex__overflow {
676
+ @include restrictToLinesShow(#{var(--_sf-line-clamp, 1)});
677
+ }
524
678
  }
525
679
  .cg_product_name {
526
680
  margin: 0;
@@ -0,0 +1,186 @@
1
+ @use "./functions.scss" as *;
2
+ @use "./repeater-embla-controls.scss" as *;
3
+
4
+ // Category Groups product grid — display styles (Grid / Cards / Slider) ported
5
+ // (light) from the Repeater, rebound to the productGridDesign.layout CSS-variable
6
+ // paths (--_ctm-catego-dn-pt-gd-dn-lt-*). Items-per-row / min-column-width /
7
+ // gaps are responsive (mob/tab/desktop var fallback). The container box
8
+ // (padding + fill/border/radius/shadow) stays on .cg_product_grid in
9
+ // category-groups-element.scss. @imported there within the categoryGroups scope.
10
+ //
11
+ // DOM: .cg_product_grid (root, gets grd|crds|sld + embla + data-control-type)
12
+ // > .cg_product_grid_wrapper (gets embla__container in slider mode)
13
+ // > .cg_product_card (grid / cards)
14
+ // > .embla__slide > .cg_product_card (slider)
15
+ // > slider arrows / dots (slider mode)
16
+ .cg_product_grid {
17
+ // Slider-control intermediate vars consumed by the embla-controls mixin.
18
+ --_sf-ic-sz-nn: var(
19
+ --_ctm-mob-catego-dn-pt-gd-dn-lt-aw-in-se,
20
+ var(--_ctm-tab-catego-dn-pt-gd-dn-lt-aw-in-se, var(--_ctm-catego-dn-pt-gd-dn-lt-aw-in-se, 40px))
21
+ );
22
+ --_sf-ed-vl-sz: var(
23
+ --_ctm-mob-catego-dn-pt-gd-dn-lt-dt-se,
24
+ var(--_ctm-tab-catego-dn-pt-gd-dn-lt-dt-se, var(--_ctm-catego-dn-pt-gd-dn-lt-dt-se, 10px))
25
+ );
26
+
27
+ // ---- Grid mode: auto-fit columns by min column width ----
28
+ &.grd {
29
+ & > .cg_product_grid_wrapper {
30
+ width: 100%;
31
+ display: grid;
32
+ grid-template-columns: repeat(
33
+ auto-fit,
34
+ minmax(
35
+ var(
36
+ --_ctm-mob-catego-dn-pt-gd-dn-lt-mn-cn-wh,
37
+ var(
38
+ --_ctm-tab-catego-dn-pt-gd-dn-lt-mn-cn-wh,
39
+ var(--_ctm-catego-dn-pt-gd-dn-lt-mn-cn-wh, 200px)
40
+ )
41
+ ),
42
+ 1fr
43
+ )
44
+ );
45
+ grid-auto-rows: minmax(
46
+ var(
47
+ --_ctm-mob-catego-dn-pt-gd-dn-lt-mn-rw-ht,
48
+ var(
49
+ --_ctm-tab-catego-dn-pt-gd-dn-lt-mn-rw-ht,
50
+ var(--_ctm-catego-dn-pt-gd-dn-lt-mn-rw-ht, auto)
51
+ )
52
+ ),
53
+ auto
54
+ );
55
+ column-gap: #{prepareMediaVariable(--_ctm-catego-dn-pt-gd-dn-lt-cn-gp, 24px)};
56
+ row-gap: #{prepareMediaVariable(--_ctm-catego-dn-pt-gd-dn-lt-rw-gp, 24px)};
57
+ }
58
+ }
59
+
60
+ // ---- Cards mode: fixed items per row (flex calc) ----
61
+ &.crds {
62
+ & > .cg_product_grid_wrapper {
63
+ display: flex;
64
+ flex-wrap: wrap;
65
+ width: 100%;
66
+ column-gap: #{prepareMediaVariable(--_ctm-catego-dn-pt-gd-dn-lt-cn-gp, 24px)};
67
+ row-gap: #{prepareMediaVariable(--_ctm-catego-dn-pt-gd-dn-lt-rw-gp, 24px)};
68
+ & > .cg_product_card {
69
+ --_col-count: var(
70
+ --_ctm-mob-catego-dn-pt-gd-dn-lt-st-is-pr-rw,
71
+ var(
72
+ --_ctm-tab-catego-dn-pt-gd-dn-lt-st-is-pr-rw,
73
+ var(--_ctm-catego-dn-pt-gd-dn-lt-st-is-pr-rw, 3)
74
+ )
75
+ );
76
+ --_col-gap: #{prepareMediaVariable(--_ctm-catego-dn-pt-gd-dn-lt-cn-gp, 0px)};
77
+ width: calc(
78
+ (100% / var(--_col-count)) -
79
+ (((var(--_col-count) - 1) * var(--_col-gap)) / (var(--_col-count)))
80
+ );
81
+ flex: 0 0
82
+ calc(
83
+ (100% / var(--_col-count)) -
84
+ (((var(--_col-count) - 1) * var(--_col-gap)) / (var(--_col-count)))
85
+ );
86
+ }
87
+ }
88
+ }
89
+
90
+ // ---- Slider mode (Embla) ----
91
+ &.sld {
92
+ position: relative;
93
+ overflow: clip;
94
+ --_sf-sl-ct-ic-dt-at-cl: var(
95
+ --_ctm-mob-catego-dn-pt-gd-dn-lt-cl-ae-cr,
96
+ var(--_ctm-tab-catego-dn-pt-gd-dn-lt-cl-ae-cr, var(--_ctm-catego-dn-pt-gd-dn-lt-cl-ae-cr))
97
+ );
98
+
99
+ @for $i from 1 through 3 {
100
+ &:is([data-control-type="#{$i}"]) {
101
+ @if ($i == 3) {
102
+ overflow-y: visible;
103
+ }
104
+ @include CMSRepeaterEmblaControlStyles($i);
105
+ }
106
+ }
107
+
108
+ // Template 3: place the arrows/dots ABOVE the product list (not over the
109
+ // images). bottom:100% puts the control's bottom edge at the grid's top
110
+ // edge; +8px adds a small gap. overflow-y:visible (set above) lets it
111
+ // show above the grid. (Repeater gets this from a saved template.)
112
+ &:is([data-control-type="3"]) {
113
+ --_sf-rp-ct-t3-top-vl: auto;
114
+ --_sf-rp-ct-t3-bottom-vl: calc(100% + 8px);
115
+ --_sf-rp-ct-t3-right-vl: 0px;
116
+ --_sf-rp-ct-t3-left-vl: auto;
117
+ --_sf-rp-ct-t3-transform-vl: none;
118
+
119
+ // Restyle template-3 pagination from the connected gray bar into
120
+ // separated circular dots + a capsule active indicator.
121
+ .pagination__v1 {
122
+ gap: 6px;
123
+ }
124
+ .pagination__v1 > button.embla__dot {
125
+ width: var(--_sf-ed-vl-sz, 10px);
126
+ height: var(--_sf-ed-vl-sz, 10px);
127
+ border-radius: 50%;
128
+ background: #d6d6d6;
129
+ }
130
+ .pagination__v1 > button.embla__dot.embla__dot--selected {
131
+ width: max(calc(var(--_sf-ed-vl-sz, 10px) * 2), 20px);
132
+ border-radius: 999px;
133
+ background: var(--_sf-sl-ct-ic-dt-at-cl, #7c3aed);
134
+ }
135
+ }
136
+
137
+ // Pagination dots: never compress. With many pages the strip scrolls
138
+ // horizontally (scrollbar hidden) instead of squishing the dots.
139
+ .pagination__v1 {
140
+ flex-wrap: nowrap;
141
+ overflow-x: auto;
142
+ overflow-y: hidden;
143
+ scrollbar-width: none;
144
+ &::-webkit-scrollbar {
145
+ display: none;
146
+ }
147
+ & > button.embla__dot {
148
+ flex-shrink: 0;
149
+ }
150
+ }
151
+
152
+ & > .cg_product_grid_wrapper.embla__container {
153
+ display: flex;
154
+ width: 100%;
155
+ min-height: 100px;
156
+ gap: #{prepareMediaVariable(--_ctm-catego-dn-pt-gd-dn-lt-im-gp, 0px)};
157
+ --_embla-slide-space: var(
158
+ --_ctm-mob-catego-dn-pt-gd-dn-lt-im-gp,
159
+ var(--_ctm-tab-catego-dn-pt-gd-dn-lt-im-gp, var(--_ctm-catego-dn-pt-gd-dn-lt-im-gp, 0px))
160
+ );
161
+ --_embla-col-count: var(
162
+ --_ctm-mob-catego-dn-pt-gd-dn-lt-st-is-pr-se,
163
+ var(
164
+ --_ctm-tab-catego-dn-pt-gd-dn-lt-st-is-pr-se,
165
+ var(--_ctm-catego-dn-pt-gd-dn-lt-st-is-pr-se, 3)
166
+ )
167
+ );
168
+ & > .embla__slide {
169
+ --_sf-cl-vl: calc(
170
+ (100% / var(--_embla-col-count, 3)) -
171
+ (
172
+ ((var(--_embla-col-count, 3) - 1) * (var(--_embla-slide-space, 10px))) /
173
+ (var(--_embla-col-count, 3))
174
+ )
175
+ );
176
+ flex: 0 0 var(--_sf-cl-vl);
177
+ width: var(--_sf-cl-vl);
178
+ grid-template-rows: minmax(50px, auto);
179
+ grid-template-columns: minmax(0px, 1fr);
180
+ img {
181
+ width: 100%;
182
+ }
183
+ }
184
+ }
185
+ }
186
+ }