@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.
- package/dist/builder.js +1 -1
- package/dist/category-groups-element.scss +185 -25
- package/dist/category-groups-product-grid.scss +186 -0
- package/dist/icon-list.scss +6 -1
- package/dist/line.scss +257 -166
- package/dist/simple-list.scss +259 -259
- package/dist/styles.css +1 -1
- package/dist/types/builder/tools/element-edit/categoryGroups.d.ts +899 -202
- package/dist/types/builder/tools/element-edit/icon-list.d.ts +10 -0
- package/dist/types/builder/tools/element-edit/line.d.ts +1 -83
- package/dist/upload-media.scss +6 -1
- package/package.json +1 -1
|
@@ -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
|
|
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
|
|
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
|
-
|
|
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
|
|
239
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
//
|
|
405
|
-
|
|
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
|
|
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
|
+
}
|
package/dist/icon-list.scss
CHANGED
|
@@ -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-
|
|
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
|
|