@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
|
|
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
|
|
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
|
-
|
|
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
|
|
239
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
//
|
|
405
|
-
|
|
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
|
|
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
|
+
}
|