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

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);
@@ -162,23 +168,116 @@ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsTe
162
168
  border-radius: prepareMediaVariable(#{$cg-widget}-br-rs, 0);
163
169
  }
164
170
  }
165
-
171
+ // The modal-tree wrapper re-applies the element data-attrs (so the scoped
172
+ // tree styles reach it through the portal), which makes it also match the
173
+ // element-level box rules (margin/width). Target it on the SAME element
174
+ // (`&.`) to override those — a descendant selector wouldn't match it.
175
+ &.cg_category_modal_tree {
176
+ width: 100%;
177
+ margin: 0;
178
+ padding: 4px;
179
+ }
166
180
  // -------------------------------------------------------------------
167
181
  // Fixed two-column layout. Figma tokens are the prepareMediaVariable
168
182
  // fallbacks so the design renders correctly before any panel edits.
169
183
  // -------------------------------------------------------------------
170
184
  .category__groups__element__container {
171
185
  display: flex;
172
- gap: 36px;
186
+ // Widget Style → gap between the left sidebar and the right main section.
187
+ gap: prepareMediaVariable(#{$cg-widget}-im-gp, 36px);
173
188
  align-items: flex-start;
174
189
  width: 100%;
175
190
  }
176
191
 
192
+ // ---- Mobile (fixed layout): the sidebar tree is replaced by a selector
193
+ // that opens the CategoryTree in a modal; everything stacks vertically.
194
+ .category__groups__element__container.is-mobile {
195
+ flex-direction: column;
196
+ gap: prepareMediaVariable(#{$cg-main}-im-gp, 12px);
197
+
198
+ .cg_main {
199
+ width: 100%;
200
+ }
201
+ }
202
+ .cg_mobile_category_select {
203
+ display: flex;
204
+ flex-direction: row;
205
+ align-items: center;
206
+ justify-content: space-between;
207
+ gap: 12px;
208
+ width: 100%;
209
+ cursor: pointer;
210
+ }
211
+ // Mobile Select-category button (rendered by the shared ButtonComponent as
212
+ // `.btn__with__text`). Styled from the `selectButton` design block — which
213
+ // uses the standard button property suffixes — via the cg-design / cg-font
214
+ // mixins (default + hover), plus the button-specific layout vars.
215
+ .btn__with__text[data-btn-name="selectButton"] {
216
+ display: flex;
217
+ align-items: center;
218
+ flex-direction: var(--_sf-fd-bn, row);
219
+ cursor: pointer;
220
+ width: prepareMediaVariable(#{$cg-select-btn}-dt-se-wh, auto);
221
+ padding: prepareMediaVariable(#{$cg-select-btn}-dt-se-pg, 8px 12px);
222
+ gap: prepareMediaVariable(#{$cg-select-btn}-dt-se-gp, 8px);
223
+ justify-content: prepareMediaVariable(#{$cg-select-btn}-dt-se-at, space-between);
224
+ @include cg-design(#{$cg-select-btn}-dt-se);
225
+
226
+ &[data-icon-position="right"] {
227
+ --_sf-fd-bn: row-reverse;
228
+ }
229
+ &[data-icon-position="left"],
230
+ &[data-icon-position="center"] {
231
+ --_sf-fd-bn: row;
232
+ }
233
+
234
+ .txt {
235
+ flex: 1;
236
+ min-width: 0;
237
+ overflow: hidden;
238
+ text-overflow: ellipsis;
239
+ white-space: nowrap;
240
+ @include cg-font(#{$cg-select-btn}-dt-se, #002a4e, 14px, 400);
241
+ }
242
+
243
+ .icon {
244
+ display: flex;
245
+ flex-shrink: 0;
246
+ svg {
247
+ width: prepareMediaVariable(#{$cg-select-btn}-dt-se-in-se, 16px);
248
+ height: prepareMediaVariable(#{$cg-select-btn}-dt-se-in-se, 16px);
249
+ path {
250
+ stroke: prepareMediaVariable(#{$cg-select-btn}-dt-se-in-c1, currentColor);
251
+ }
252
+ }
253
+ }
254
+ .icon--hover {
255
+ display: none;
256
+ }
257
+
258
+ &:hover {
259
+ @include cg-design-state($cg-select-btn, hr-se);
260
+ .txt {
261
+ @include cg-font-state($cg-select-btn, hr-se, #002a4e, 14px, 400);
262
+ }
263
+ .icon--hover {
264
+ display: flex;
265
+ }
266
+ }
267
+ // Swap to the hover icon only when one is configured.
268
+ &:hover:has(.icon--hover) .icon--default {
269
+ display: none;
270
+ }
271
+ }
272
+ // Tree rendered inside the (portaled) category modal.
273
+
177
274
  // ---- Left sidebar -------------------------------------------------
178
275
  .cg_sidebar {
179
276
  display: flex;
180
277
  flex-direction: column;
181
- gap: 12px;
278
+ // Sidebar Container → gap (heading ↔ tree) + padding.
279
+ gap: prepareMediaVariable(#{$cg-sidebar}-im-gp, 12px);
280
+ padding: prepareMediaVariable(#{$cg-sidebar}-pg, 0);
182
281
  width: 260px;
183
282
  flex-shrink: 0;
184
283
  background-color: prepareMediaVariable(#{$cg-sidebar}-bd-cr, transparent);
@@ -228,15 +327,18 @@ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsTe
228
327
  .cg_category_tree {
229
328
  display: flex;
230
329
  flex-direction: column;
231
- gap: 8px;
330
+ // Gap BETWEEN category rows (Sidebar Container → Category Tree Gap).
331
+ gap: prepareMediaVariable(#{$cg-sidebar}-cy-te-gp, 8px);
232
332
  width: 100%;
233
333
  }
234
334
 
235
335
  .cg_tree_node {
236
336
  display: flex;
237
337
  align-items: center;
238
- gap: 4px;
239
- padding: 4px 0;
338
+ // Category Tree Item → item gap (icon ↔ label).
339
+ gap: prepareMediaVariable(#{$cg-tree}-dt-se-im-gp, 4px);
340
+ // Category Tree Item → Layout padding.
341
+ padding: prepareMediaVariable(#{$cg-tree}-dt-se-pg, 4px 0);
240
342
  cursor: pointer;
241
343
  @include cg-design(#{$cg-tree}-dt-se);
242
344
  }
@@ -247,20 +349,50 @@ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsTe
247
349
  width: 24px;
248
350
  height: 24px;
249
351
  flex-shrink: 0;
250
- // Configurable expand/collapse icon colour (currentColor stroke).
352
+ // Configurable expand/collapse icon colour (inherited by the SVG below).
251
353
  color: prepareMediaVariable(#{$cg-tree-icon}-in-c1, #002a4e);
252
354
  }
253
355
  .cg_chevron {
254
356
  display: flex;
357
+ align-items: center;
358
+ justify-content: center;
255
359
  transition: transform 0.15s ease;
360
+ color: prepareMediaVariable(#{$cg-tree-icon}-in-c1, #002a4e);
256
361
  svg {
257
362
  width: prepareMediaVariable(#{$cg-tree-icon}-in-se, 20px);
258
363
  height: prepareMediaVariable(#{$cg-tree-icon}-in-se, 20px);
364
+ // Apply the configured colour even when the fetched SVG hardcodes its
365
+ // own stroke/fill (skip parts explicitly set to "none").
366
+ &[stroke]:not([stroke="none"]),
367
+ [stroke]:not([stroke="none"]) {
368
+ stroke: prepareMediaVariable(#{$cg-tree-icon}-in-c1, #002a4e);
369
+ }
370
+ &[fill]:not([fill="none"]),
371
+ [fill]:not([fill="none"]) {
372
+ fill: prepareMediaVariable(#{$cg-tree-icon}-in-c1, #002a4e);
373
+ }
259
374
  }
260
375
  }
261
376
  .cg_chevron.is-open {
262
377
  transform: rotate(90deg);
263
378
  }
379
+ // Expanded icon uses its own size/colour vars (iconSizeExpanded /
380
+ // iconColorExpanded) so it is independent of the collapsed icon.
381
+ .cg_chevron.is-expanded {
382
+ color: prepareMediaVariable(#{$cg-tree-icon}-in-cr-ed, #002a4e);
383
+ svg {
384
+ width: prepareMediaVariable(#{$cg-tree-icon}-in-se-ed, 20px);
385
+ height: prepareMediaVariable(#{$cg-tree-icon}-in-se-ed, 20px);
386
+ &[stroke]:not([stroke="none"]),
387
+ [stroke]:not([stroke="none"]) {
388
+ stroke: prepareMediaVariable(#{$cg-tree-icon}-in-cr-ed, #002a4e);
389
+ }
390
+ &[fill]:not([fill="none"]),
391
+ [fill]:not([fill="none"]) {
392
+ fill: prepareMediaVariable(#{$cg-tree-icon}-in-cr-ed, #002a4e);
393
+ }
394
+ }
395
+ }
264
396
  .cg_tree_node_label {
265
397
  flex: 1;
266
398
  @include cg-font(#{$cg-tree}-dt-se, #002a4e, 14px, 600);
@@ -281,12 +413,14 @@ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsTe
281
413
  .cg_subtree {
282
414
  display: flex;
283
415
  flex-direction: column;
284
- gap: 8px;
416
+ // Gap BETWEEN sub-category rows (Sidebar Container → Sub Category Gap).
417
+ gap: prepareMediaVariable(#{$cg-sidebar}-sb-cy-gp, 8px);
285
418
  padding-left: 31px;
286
419
  width: 100%;
287
420
  }
288
421
  .cg_subtree_node {
289
- padding: 4px 0;
422
+ // Sub Category Tree Item → Layout padding.
423
+ padding: prepareMediaVariable(#{$cg-subtree}-dt-se-pg, 4px 0);
290
424
  cursor: pointer;
291
425
  @include cg-design(#{$cg-subtree}-dt-se);
292
426
  }
@@ -308,12 +442,16 @@ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsTe
308
442
  }
309
443
 
310
444
  // ---- Right main ---------------------------------------------------
445
+ // mainSection: container fill/border + gap between heading, breadcrumb,
446
+ // sub-categories and the product grid.
311
447
  .cg_main {
312
448
  display: flex;
313
449
  flex-direction: column;
314
- gap: 12px;
450
+ gap: prepareMediaVariable(#{$cg-main}-im-gp, 12px);
451
+ padding: prepareMediaVariable(#{$cg-main}-pg, 0);
315
452
  flex: 1 0 0;
316
453
  min-width: 0;
454
+ @include cg-design($cg-main);
317
455
  }
318
456
 
319
457
  // Drill-down breadcrumb (reuses the Breadcrumbs element DOM classes), styled
@@ -324,7 +462,9 @@ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsTe
324
462
  .horizontal_breadcrumb_wrapper {
325
463
  display: inline-flex;
326
464
  align-items: center;
327
- flex-wrap: wrap;
465
+ width: 100%;
466
+ // flex-wrap: wrap;
467
+ overflow-x: auto;
328
468
  gap: 6px;
329
469
  }
330
470
  .breadcrumb_item {
@@ -375,7 +515,9 @@ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsTe
375
515
  display: flex;
376
516
  flex-direction: column;
377
517
  align-items: stretch;
378
- gap: 12px;
518
+ // Same gap as the main section so breadcrumb ↔ sub-categories spacing
519
+ // follows the Main Section item gap.
520
+ gap: prepareMediaVariable(#{$cg-main}-im-gp, 12px);
379
521
  width: 100%;
380
522
  }
381
523
  // The horizontal chip row: left arrow + scrolling rail + right arrow.
@@ -396,22 +538,29 @@ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsTe
396
538
  display: flex;
397
539
  align-items: center;
398
540
  justify-content: center;
399
- padding: 0;
400
- border: none;
401
- background: transparent;
541
+ padding: prepareMediaVariable(#{$cg-arrow}-dt-se-pg, 0);
402
542
  cursor: pointer;
403
543
  flex-shrink: 0;
404
- // Icon colour (property `iconColor1` -> `in-c1`) drives the SVG `currentColor` stroke.
405
- color: prepareMediaVariable(#{$cg-arrow}-in-c1, #002a4e);
544
+ // Default state: fill / border / radius / shadow.
545
+ @include cg-design(#{$cg-arrow}-dt-se);
546
+ // Icon colour (in-c1) drives the SVG `currentColor` stroke.
547
+ color: prepareMediaVariable(#{$cg-arrow}-dt-se-in-c1, #002a4e);
406
548
  svg {
407
- width: prepareMediaVariable(#{$cg-arrow}-in-se, 20px);
408
- height: prepareMediaVariable(#{$cg-arrow}-in-se, 20px);
549
+ width: prepareMediaVariable(#{$cg-arrow}-dt-se-in-se, 20px);
550
+ height: prepareMediaVariable(#{$cg-arrow}-dt-se-in-se, 20px);
551
+ }
552
+ &:hover {
553
+ @include cg-design-state($cg-arrow, hr-se);
554
+ color: prepareMediaVariable(
555
+ #{$cg-arrow}-hr-se-in-c1,
556
+ prepareMediaVariable(#{$cg-arrow}-dt-se-in-c1, #002a4e)
557
+ );
409
558
  }
410
559
  }
411
560
  .cg_chip_rail {
412
561
  display: flex;
413
562
  align-items: center;
414
- gap: 16px;
563
+ gap: prepareMediaVariable(#{$cg-scroller-design}-im-gp, 16px);
415
564
  flex: 1 0 0;
416
565
  min-width: 0;
417
566
  overflow-x: auto;
@@ -423,6 +572,8 @@ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsTe
423
572
  .cg_chip {
424
573
  display: flex;
425
574
  align-items: center;
575
+ // Spacing between the chip image and its label (Sub Category Chip item gap).
576
+ gap: prepareMediaVariable(#{$cg-chip}-dt-se-im-gp, 8px);
426
577
  cursor: pointer;
427
578
  flex-shrink: 0;
428
579
  padding: 0;
@@ -473,13 +624,17 @@ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsTe
473
624
  }
474
625
 
475
626
  // ---- Product grid -------------------------------------------------
627
+ // Container box only. Display modes (grid / cards / slider) + gaps live in
628
+ // category-groups-product-grid.scss (imported below).
476
629
  .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
630
  width: 100%;
631
+ position: relative;
632
+ padding: prepareMediaVariable(#{$cg-grid}-lt-pg, 0);
633
+ // Grid container fill / border / radius / shadow.
634
+ @include cg-design(#{$cg-grid}-lt);
482
635
  }
636
+ // Display styles (Grid / Cards / Slider) for the product grid.
637
+ @import "./category-groups-product-grid.scss";
483
638
  .cg_product_card {
484
639
  display: flex;
485
640
  flex-direction: column;
@@ -516,11 +671,16 @@ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsTe
516
671
  .cg_product_info {
517
672
  display: flex;
518
673
  flex-direction: column;
519
- gap: 12px;
674
+ // Product Card → content gap (between brand / name / price / options).
675
+ gap: prepareMediaVariable(#{$cg-card}-dt-se-ct-gp, 12px);
520
676
  }
521
677
  .cg_brand_name {
522
678
  margin: 0;
523
679
  @include cg-font($cg-brand, #737373, 14px, 400);
680
+ // Text overflow toggle + max lines (Brand Name design controls).
681
+ &.flex__overflow {
682
+ @include restrictToLinesShow(#{var(--_sf-line-clamp, 1)});
683
+ }
524
684
  }
525
685
  .cg_product_name {
526
686
  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
+ }
@@ -162,7 +162,8 @@ $pos2: (
162
162
  --_txt-ht-fst: #{prepareMediaVariable(--_ctm-dn-tt-hr-se-ft-se-ic)};
163
163
  --_txt-ht-tl: #{prepareMediaVariable(--_ctm-dn-tt-hr-se-tt-an)};
164
164
  --_txt-ht-ls: #{prepareMediaVariable(--_ctm-dn-tt-hr-se-lr-sg)};
165
- --_txt-ht-lt: #{prepareMediaVariable(--_ctm-dn-tt-dt-se-le-ht)};
165
+ --_txt-ht-lt: #{prepareMediaVariable(--_ctm-dn-tt-hr-se-le-ht)};
166
+ --_txt-ht-tt-tm: #{prepareMediaVariable(--_ctm-dn-tt-hr-se-tt-tm)};
166
167
  }
167
168
 
168
169
  & > span {
@@ -248,6 +249,10 @@ $pos2: (
248
249
  text-align: var(--_txt-ht-tl, prepareMediaVariable(--_ctm-dn-tt-dt-se-tt-an));
249
250
  letter-spacing: var(--_txt-ht-ls, prepareMediaVariable(--_ctm-dn-tt-dt-se-lr-sg));
250
251
  line-height: var(--_txt-ht-lt, prepareMediaVariable(--_ctm-dn-tt-dt-se-le-ht));
252
+ text-transform: var(
253
+ --_txt-ht-tt-tm,
254
+ prepareMediaVariable(--_ctm-dn-tt-dt-se-tt-tm)
255
+ );
251
256
  }
252
257
  }
253
258