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

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.
@@ -4,21 +4,131 @@
4
4
  $activeElementSelector: "[data-has-clicked='true']";
5
5
  $resizerId: "[data-cms-tool='cms-element-resizer']";
6
6
  $resizeActive: '[data-cms-element-resizer="true"]';
7
+
8
+ // Generated CSS-var bases (prefix `catego`; path = design-key shortcodes via
9
+ // splitCamelCaseAndJoin). Edits in the design panel write these; the second arg
10
+ // to prepareMediaVariable keeps the Figma default when a var is unset.
11
+ $cg-widget: "--_ctm-catego-dn-wt-se"; // design.widgetStyle
12
+ $cg-sidebar: "--_ctm-catego-dn-sr-dn-sr-cr"; // sidebarDesign.sidebarContainer
13
+ $cg-cat-heading: "--_ctm-catego-dn-sr-dn-cs-hg"; // sidebarDesign.categoriesHeading
14
+ $cg-tree: "--_ctm-catego-dn-sr-dn-cy-te-im"; // sidebarDesign.categoryTreeItem
15
+ $cg-tree-icon: "--_ctm-catego-dn-sr-dn-cy-te-in"; // sidebarDesign.categoryTreeIcon
16
+ $cg-subtree: "--_ctm-catego-dn-sr-dn-sb-cy-te-im"; // sidebarDesign.subCategoryTreeItem
17
+ $cg-chip: "--_ctm-catego-dn-sb-cy-sr-dn-sb-cy-cp"; // subCategoryScrollerDesign.subCategoryChip
18
+ $cg-arrow: "--_ctm-catego-dn-sb-cy-sr-dn-sr-aw"; // subCategoryScrollerDesign.scrollerArrow
19
+ $cg-chip-image: "--_ctm-catego-dn-sb-cy-sr-dn-sb-cy-ie"; // subCategoryScrollerDesign.subCategoryImage
20
+ $cg-bc-item: "--_ctm-catego-dn-bb-dn-bb-im"; // breadcrumbDesign.breadcrumbItem
21
+ $cg-bc-sep: "--_ctm-catego-dn-bb-dn-sr-in"; // breadcrumbDesign.separatorIcon
22
+ $cg-allprod-heading: "--_ctm-catego-dn-pt-gd-dn-al-ps-hg"; // productGridDesign.allProductsHeading
23
+ $cg-card: "--_ctm-catego-dn-pt-gd-dn-pt-cd"; // productGridDesign.productCard
24
+ $cg-brand: "--_ctm-catego-dn-pt-gd-dn-bd-ne"; // productGridDesign.brandName
25
+ $cg-name: "--_ctm-catego-dn-pt-gd-dn-pt-ne"; // productGridDesign.productName
26
+ $cg-price: "--_ctm-catego-dn-pt-gd-dn-pt-pe"; // productGridDesign.productPrice
27
+ $cg-variants: "--_ctm-catego-dn-pt-gd-dn-vs-tt"; // productGridDesign.variantsText
28
+
29
+ @mixin cg-font($base, $color, $size, $weight: 600) {
30
+ color: prepareMediaVariable(#{$base}-cr, $color);
31
+ font-family: prepareMediaVariable(#{$base}-ft-fy, ("Inter", sans-serif));
32
+ font-size: prepareMediaVariable(#{$base}-ft-se, $size);
33
+ font-weight: prepareMediaVariable(#{$base}-ft-wt, $weight);
34
+ // Remaining typography states (only apply when set in the design panel).
35
+ font-style: prepareMediaVariable(#{$base}-ft-se-ic);
36
+ text-align: prepareMediaVariable(#{$base}-tt-an);
37
+ letter-spacing: prepareMediaVariable(#{$base}-lr-sg);
38
+ line-height: prepareMediaVariable(#{$base}-le-ht);
39
+ text-decoration: prepareMediaVariable(#{$base}-ue);
40
+ }
41
+
42
+ // Container fill / border / radius / shadow for a given state base
43
+ // (e.g. `$cg-tree-dt-se`). Shadow stays invisible until set in the panel.
44
+ @mixin cg-design($base) {
45
+ background-color: prepareMediaVariable(#{$base}-bd-cr, transparent);
46
+ border-color: prepareMediaVariable(#{$base}-br-cr, transparent);
47
+ border-style: prepareMediaVariable(#{$base}-br-se, solid);
48
+ border-width: prepareMediaVariable(#{$base}-br-wh, 0);
49
+ border-radius: prepareMediaVariable(#{$base}-br-rs, 4px);
50
+ box-shadow: prepareMediaVariable(#{$base}-sw-ae, 0 0) prepareMediaVariable(#{$base}-sw-br, 0)
51
+ prepareMediaVariable(#{$base}-sw-sd, 0) prepareMediaVariable(#{$base}-sw-cr, transparent);
52
+ }
53
+
54
+ // Interactive-state typography ($state = "hr-se" | "sd-se"): the state's own
55
+ // vars fall back to the DEFAULT state (dt-se), then the Figma value — so Figma
56
+ // only seeds the default state and edits to the default cascade to every state.
57
+ @mixin cg-font-state($base, $state, $color, $size, $weight: 600) {
58
+ color: prepareMediaVariable(
59
+ #{$base}-#{$state}-cr,
60
+ prepareMediaVariable(#{$base}-dt-se-cr, $color)
61
+ );
62
+ font-family: prepareMediaVariable(
63
+ #{$base}-#{$state}-ft-fy,
64
+ prepareMediaVariable(#{$base}-dt-se-ft-fy, ("Inter", sans-serif))
65
+ );
66
+ font-size: prepareMediaVariable(
67
+ #{$base}-#{$state}-ft-se,
68
+ prepareMediaVariable(#{$base}-dt-se-ft-se, $size)
69
+ );
70
+ font-weight: prepareMediaVariable(
71
+ #{$base}-#{$state}-ft-wt,
72
+ prepareMediaVariable(#{$base}-dt-se-ft-wt, $weight)
73
+ );
74
+ font-style: prepareMediaVariable(
75
+ #{$base}-#{$state}-ft-se-ic,
76
+ prepareMediaVariable(#{$base}-dt-se-ft-se-ic)
77
+ );
78
+ text-align: prepareMediaVariable(
79
+ #{$base}-#{$state}-tt-an,
80
+ prepareMediaVariable(#{$base}-dt-se-tt-an)
81
+ );
82
+ letter-spacing: prepareMediaVariable(
83
+ #{$base}-#{$state}-lr-sg,
84
+ prepareMediaVariable(#{$base}-dt-se-lr-sg)
85
+ );
86
+ line-height: prepareMediaVariable(
87
+ #{$base}-#{$state}-le-ht,
88
+ prepareMediaVariable(#{$base}-dt-se-le-ht)
89
+ );
90
+ text-decoration: prepareMediaVariable(
91
+ #{$base}-#{$state}-ue,
92
+ prepareMediaVariable(#{$base}-dt-se-ue)
93
+ );
94
+ }
95
+
96
+ // Interactive-state container design, falling back to the DEFAULT state.
97
+ @mixin cg-design-state($base, $state) {
98
+ background-color: prepareMediaVariable(
99
+ #{$base}-#{$state}-bd-cr,
100
+ prepareMediaVariable(#{$base}-dt-se-bd-cr, transparent)
101
+ );
102
+ border-color: prepareMediaVariable(
103
+ #{$base}-#{$state}-br-cr,
104
+ prepareMediaVariable(#{$base}-dt-se-br-cr, transparent)
105
+ );
106
+ border-style: prepareMediaVariable(
107
+ #{$base}-#{$state}-br-se,
108
+ prepareMediaVariable(#{$base}-dt-se-br-se, solid)
109
+ );
110
+ border-width: prepareMediaVariable(
111
+ #{$base}-#{$state}-br-wh,
112
+ prepareMediaVariable(#{$base}-dt-se-br-wh, 0)
113
+ );
114
+ border-radius: prepareMediaVariable(
115
+ #{$base}-#{$state}-br-rs,
116
+ prepareMediaVariable(#{$base}-dt-se-br-rs, 4px)
117
+ );
118
+ box-shadow: prepareMediaVariable(
119
+ #{$base}-#{$state}-sw-ae,
120
+ prepareMediaVariable(#{$base}-dt-se-sw-ae, 0 0)
121
+ )
122
+ prepareMediaVariable(#{$base}-#{$state}-sw-br, prepareMediaVariable(#{$base}-dt-se-sw-br, 0))
123
+ prepareMediaVariable(#{$base}-#{$state}-sw-sd, prepareMediaVariable(#{$base}-dt-se-sw-sd, 0))
124
+ prepareMediaVariable(
125
+ #{$base}-#{$state}-sw-cr,
126
+ prepareMediaVariable(#{$base}-dt-se-sw-cr, transparent)
127
+ );
128
+ }
129
+
7
130
  [data-div-type="element"] {
8
131
  &[data-element-type="categoryGroups"] {
9
- // width: var(--_sf-catego-nw-wh);
10
- // width: var(--_sf-el-wh-st-mx, calc(1% * var(--_ctm-ele-nw-wh-vl, var(--_sf-nw-wh))));
11
- // width: calc(
12
- // 1% *
13
- // var(
14
- // --_ctm-mob-catego-ele-nw-wh-vl,
15
- // var(--_ctm-tab-catego-ele-nw-wh-vl, var(--_ctm-catego-ele-nw-wh-vl)),
16
- // auto
17
- // )
18
- // );
19
- // width: 100%;
20
- // height: var(--_ctm-catego-lt-ht);
21
-
22
132
  width: calc(
23
133
  1% *
24
134
  var(
@@ -45,94 +155,404 @@ $resizeActive: '[data-cms-element-resizer="true"]';
45
155
  var(--_ctm-tab-catego-lt-pg, var(--_ctm-catego-lt-pg))
46
156
  );
47
157
 
48
- background-color: var(
49
- --_ctm-mob-catego-dn-bd-cr,
50
- var(--_ctm-tab-catego-dn-bd-cr, var(--_ctm-catego-dn-bd-cr))
51
- );
52
- background-image: var(
53
- --_ctm-mob-catego-dn-bd-ie,
54
- var(--_ctm-tab-catego-dn-bd-ie, var(--_ctm-catego-dn-bd-ie))
55
- );
56
- background-attachment: var(
57
- --_ctm-mob-catego-dn-bd-at,
58
- var(--_ctm-tab-catego-dn-bd-at, var(--_ctm-catego-dn-bd-at))
59
- );
60
- background-position: var(
61
- --_ctm-mob-catego-dn-bd-pn,
62
- var(--_ctm-tab-catego-dn-bd-pn, var(--_ctm-catego-dn-bd-pn))
63
- );
64
- background-repeat: var(
65
- --_ctm-mob-catego-dn-bd-rt,
66
- var(--_ctm-tab-catego-dn-bd-rt, var(--_ctm-catego-dn-bd-rt))
67
- );
68
- background-size: var(
69
- --_ctm-mob-catego-dn-bd-se,
70
- var(--_ctm-tab-catego-dn-bd-se, var(--_ctm-catego-dn-bd-se))
71
- );
72
- border-radius: var(
73
- --_ctm-mob-catego-dn-br-rs,
74
- var(--_ctm-tab-catego-dn-br-rs, var(--_ctm-catego-dn-br-rs))
75
- );
76
- border-color: var(
77
- --_ctm-mob-catego-dn-br-cr,
78
- var(--_ctm-tab-catego-dn-br-cr, var(--_ctm-catego-dn-br-cr))
79
- );
80
- border-style: var(
81
- --_ctm-mob-catego-dn-br-se,
82
- var(--_ctm-tab-catego-dn-br-se, var(--_ctm-catego-dn-br-se))
83
- );
84
- border-width: var(
85
- --_ctm-mob-catego-dn-br-wh,
86
- var(--_ctm-tab-catego-dn-br-wh, var(--_ctm-catego-dn-br-wh))
87
- );
88
- box-shadow: var(
89
- --_hover-show-shadow,
90
- var(
91
- --_sf-hr-bx-sw,
92
- var(
93
- --_show-shadow,
94
- var(
95
- --_ctm-mob-catego-dn-sw-ae,
96
- var(--_ctm-tab-catego-dn-sw-ae, var(--_ctm-catego-dn-sw-ae))
97
- )
98
- var(
99
- --_ctm-mob-catego-dn-sw-br,
100
- var(--_ctm-tab-catego-dn-sw-br, var(--_ctm-catego-dn-sw-br))
101
- )
102
- var(
103
- --_ctm-mob-catego-dn-sw-sd,
104
- var(--_ctm-tab-catego-dn-sw-sd, var(--_ctm-catego-dn-sw-sd))
105
- )
106
- var(
107
- --_ctm-mob-catego-dn-sw-cr,
108
- var(--_ctm-tab-catego-dn-sw-cr, var(--_ctm-catego-dn-sw-cr))
109
- )
110
- )
111
- )
112
- );
158
+ background-color: prepareMediaVariable(#{$cg-widget}-bd-cr, transparent);
159
+ border-color: prepareMediaVariable(#{$cg-widget}-br-cr, transparent);
160
+ border-style: prepareMediaVariable(#{$cg-widget}-br-se, solid);
161
+ border-width: prepareMediaVariable(#{$cg-widget}-br-wh, 0);
162
+ border-radius: prepareMediaVariable(#{$cg-widget}-br-rs, 0);
113
163
  }
114
164
  }
115
165
 
116
- .loading_view {
166
+ // -------------------------------------------------------------------
167
+ // Fixed two-column layout. Figma tokens are the prepareMediaVariable
168
+ // fallbacks so the design renders correctly before any panel edits.
169
+ // -------------------------------------------------------------------
170
+ .category__groups__element__container {
171
+ display: flex;
172
+ gap: 36px;
173
+ align-items: flex-start;
174
+ width: 100%;
175
+ }
176
+
177
+ // ---- Left sidebar -------------------------------------------------
178
+ .cg_sidebar {
179
+ display: flex;
180
+ flex-direction: column;
181
+ gap: 12px;
182
+ width: 260px;
183
+ flex-shrink: 0;
184
+ background-color: prepareMediaVariable(#{$cg-sidebar}-bd-cr, transparent);
185
+ border-color: prepareMediaVariable(#{$cg-sidebar}-br-cr, transparent);
186
+ border-style: prepareMediaVariable(#{$cg-sidebar}-br-se, solid);
187
+ border-width: prepareMediaVariable(#{$cg-sidebar}-br-wh, 0);
188
+ border-radius: prepareMediaVariable(#{$cg-sidebar}-br-rs, 0);
189
+ }
190
+
191
+ .cg_sidebar_heading {
192
+ margin: 0;
193
+ text-transform: uppercase;
194
+ line-height: 1.25;
195
+ @include cg-font($cg-cat-heading, #002a4e, 16px, 400);
196
+ }
197
+ .cg_all_products_heading {
198
+ margin: 0;
199
+ text-transform: uppercase;
200
+ line-height: 1.25;
201
+ @include cg-font($cg-allprod-heading, #002a4e, 24px, 400);
202
+ }
203
+ .cg_subcategory_title {
204
+ margin: 0;
205
+ font-family: "Inter", sans-serif;
206
+ color: #002a4e;
207
+ text-transform: uppercase;
208
+ line-height: 1.25;
209
+ font-size: 16px;
210
+ }
211
+
212
+ .cg_sidebar_divider,
213
+ .cg_main_divider {
214
+ display: block;
215
+ width: 100%;
216
+ // Widget Style → Divider (show toggle + colour + thickness).
217
+ height: prepareMediaVariable(#{$cg-widget}-dr-wh, 1px);
218
+ background: prepareMediaVariable(#{$cg-widget}-dr-cr, #e5e7eb);
219
+ }
220
+ &[data-show-dividers="false"] {
221
+ .cg_sidebar_divider,
222
+ .cg_main_divider,
223
+ .cg_subcategory_divider {
224
+ display: none;
225
+ }
226
+ }
227
+
228
+ .cg_category_tree {
229
+ display: flex;
230
+ flex-direction: column;
231
+ gap: 8px;
232
+ width: 100%;
233
+ }
234
+
235
+ .cg_tree_node {
236
+ display: flex;
237
+ align-items: center;
238
+ gap: 4px;
239
+ padding: 4px 0;
240
+ cursor: pointer;
241
+ @include cg-design(#{$cg-tree}-dt-se);
242
+ }
243
+ .cg_tree_node_icon {
244
+ display: flex;
245
+ align-items: center;
246
+ justify-content: center;
247
+ width: 24px;
248
+ height: 24px;
249
+ flex-shrink: 0;
250
+ // Configurable expand/collapse icon colour (currentColor stroke).
251
+ color: prepareMediaVariable(#{$cg-tree-icon}-in-c1, #002a4e);
252
+ }
253
+ .cg_chevron {
254
+ display: flex;
255
+ transition: transform 0.15s ease;
256
+ svg {
257
+ width: prepareMediaVariable(#{$cg-tree-icon}-in-se, 20px);
258
+ height: prepareMediaVariable(#{$cg-tree-icon}-in-se, 20px);
259
+ }
260
+ }
261
+ .cg_chevron.is-open {
262
+ transform: rotate(90deg);
263
+ }
264
+ .cg_tree_node_label {
265
+ flex: 1;
266
+ @include cg-font(#{$cg-tree}-dt-se, #002a4e, 14px, 600);
267
+ }
268
+ .cg_tree_node:hover {
269
+ @include cg-design-state($cg-tree, hr-se);
270
+ }
271
+ .cg_tree_node:hover .cg_tree_node_label {
272
+ @include cg-font-state($cg-tree, hr-se, #002a4e, 14px, 600);
273
+ }
274
+ .cg_tree_node.is-active {
275
+ @include cg-design-state($cg-tree, sd-se);
276
+ }
277
+ .cg_tree_node.is-active .cg_tree_node_label {
278
+ @include cg-font-state($cg-tree, sd-se, #002a4e, 14px, 600);
279
+ }
280
+
281
+ .cg_subtree {
282
+ display: flex;
283
+ flex-direction: column;
284
+ gap: 8px;
285
+ padding-left: 31px;
286
+ width: 100%;
287
+ }
288
+ .cg_subtree_node {
289
+ padding: 4px 0;
290
+ cursor: pointer;
291
+ @include cg-design(#{$cg-subtree}-dt-se);
292
+ }
293
+ .cg_subtree_node_label {
294
+ letter-spacing: -0.28px;
295
+ @include cg-font(#{$cg-subtree}-dt-se, #1d1b1c, 14px, 400);
296
+ }
297
+ .cg_subtree_node:hover {
298
+ @include cg-design-state($cg-subtree, hr-se);
299
+ }
300
+ .cg_subtree_node:hover .cg_subtree_node_label {
301
+ @include cg-font-state($cg-subtree, hr-se, #1d1b1c, 14px, 400);
302
+ }
303
+ .cg_subtree_node.is-active {
304
+ @include cg-design-state($cg-subtree, sd-se);
305
+ }
306
+ .cg_subtree_node.is-active .cg_subtree_node_label {
307
+ @include cg-font-state($cg-subtree, sd-se, #1d1b1c, 14px, 400);
308
+ }
309
+
310
+ // ---- Right main ---------------------------------------------------
311
+ .cg_main {
312
+ display: flex;
313
+ flex-direction: column;
314
+ gap: 12px;
315
+ flex: 1 0 0;
316
+ min-width: 0;
317
+ }
318
+
319
+ // Drill-down breadcrumb (reuses the Breadcrumbs element DOM classes), styled
320
+ // from the breadcrumbDesign panel: breadcrumbItem (default/hover/selected) +
321
+ // separatorIcon. Selected state = the current (last) crumb.
322
+ .cg_breadcrumb {
117
323
  width: 100%;
324
+ .horizontal_breadcrumb_wrapper {
325
+ display: inline-flex;
326
+ align-items: center;
327
+ flex-wrap: wrap;
328
+ gap: 6px;
329
+ }
330
+ .breadcrumb_item {
331
+ padding: 0 4px;
332
+ display: flex;
333
+ align-items: center;
334
+ gap: 8px;
335
+ white-space: nowrap;
336
+ @include cg-design(#{$cg-bc-item}-dt-se);
337
+ @include cg-font(#{$cg-bc-item}-dt-se, #4b4546, 14px, 400);
338
+ &[data-show-cursor="true"] {
339
+ cursor: pointer;
340
+ }
341
+ &[data-show-cursor="true"]:hover {
342
+ @include cg-design-state($cg-bc-item, hr-se);
343
+ @include cg-font-state($cg-bc-item, hr-se, #4b4546, 14px, 400);
344
+ }
345
+ &:last-of-type {
346
+ @include cg-design-state($cg-bc-item, sd-se);
347
+ @include cg-font-state($cg-bc-item, sd-se, #1d1b1c, 14px, 600);
348
+ }
349
+ }
350
+ // Collapse ("…") button shown when the trail is too deep.
351
+ .collapse_btn {
352
+ display: flex;
353
+ align-items: center;
354
+ padding: 0 4px;
355
+ border: none;
356
+ background: transparent;
357
+ cursor: pointer;
358
+ line-height: 1;
359
+ @include cg-font(#{$cg-bc-item}-dt-se, #4b4546, 16px, 600);
360
+ }
361
+ .separator .icon {
362
+ display: flex;
363
+ svg {
364
+ width: prepareMediaVariable(#{$cg-bc-sep}-in-se, 16px);
365
+ height: prepareMediaVariable(#{$cg-bc-sep}-in-se, 16px);
366
+ path {
367
+ stroke: prepareMediaVariable(#{$cg-bc-sep}-in-c1, #8a8a8a);
368
+ }
369
+ }
370
+ }
371
+ }
372
+
373
+ // Breadcrumb (top) + chip row (bottom) stack vertically.
374
+ .cg_subcategory_scroller {
118
375
  display: flex;
376
+ flex-direction: column;
377
+ align-items: stretch;
378
+ gap: 12px;
379
+ width: 100%;
380
+ }
381
+ // The horizontal chip row: left arrow + scrolling rail + right arrow.
382
+ .cg_subcategory_row {
383
+ display: flex;
384
+ align-items: center;
385
+ gap: 12px;
386
+ width: 100%;
387
+ }
388
+ .cg_subcategory_divider {
389
+ width: 100%;
390
+ // Widget Style → Divider (colour + thickness), same as the other dividers.
391
+ height: prepareMediaVariable(#{$cg-widget}-dr-wh, 1px);
392
+ background: prepareMediaVariable(#{$cg-widget}-dr-cr, #cbd5e1);
393
+ flex-shrink: 0;
394
+ }
395
+ .cg_scroller_arrow {
396
+ display: flex;
397
+ align-items: center;
119
398
  justify-content: center;
399
+ padding: 0;
400
+ border: none;
401
+ background: transparent;
402
+ cursor: pointer;
403
+ flex-shrink: 0;
404
+ // Icon colour (property `iconColor1` -> `in-c1`) drives the SVG `currentColor` stroke.
405
+ color: prepareMediaVariable(#{$cg-arrow}-in-c1, #002a4e);
406
+ svg {
407
+ width: prepareMediaVariable(#{$cg-arrow}-in-se, 20px);
408
+ height: prepareMediaVariable(#{$cg-arrow}-in-se, 20px);
409
+ }
410
+ }
411
+ .cg_chip_rail {
412
+ display: flex;
413
+ align-items: center;
414
+ gap: 16px;
415
+ flex: 1 0 0;
416
+ min-width: 0;
417
+ overflow-x: auto;
418
+ scrollbar-width: none;
419
+ &::-webkit-scrollbar {
420
+ display: none;
421
+ }
120
422
  }
423
+ .cg_chip {
424
+ display: flex;
425
+ align-items: center;
426
+ cursor: pointer;
427
+ flex-shrink: 0;
428
+ padding: 0;
429
+ @include cg-design(#{$cg-chip}-dt-se);
430
+ }
431
+ .cg_chip_icon {
432
+ display: flex;
433
+ align-items: center;
434
+ justify-content: center;
435
+ width: prepareMediaVariable(#{$cg-chip-image}-wh, 36px);
436
+ height: prepareMediaVariable(#{$cg-chip-image}-ht, 36px);
437
+ padding: prepareMediaVariable(#{$cg-chip-image}-pg, 0);
438
+ flex-shrink: 0;
439
+ overflow: hidden;
440
+ color: #002a4e;
441
+ // Sub Category Image design controls (fill / border / radius / shadow).
442
+ @include cg-design($cg-chip-image);
443
+ img {
444
+ width: 100%;
445
+ height: 100%;
446
+ object-fit: cover;
447
+ transition: transform 0.3s ease-in-out;
448
+ }
449
+ // Image Settings -> On Hover (zoom).
450
+ &[data-on-hover="Zoom In"]:hover img {
451
+ transform: scale(1.08);
452
+ }
453
+ &[data-on-hover="Zoom Out"]:hover img {
454
+ transform: scale(0.92);
455
+ }
456
+ }
457
+ .cg_chip_label {
458
+ padding: 4px 12px;
459
+ white-space: nowrap;
460
+ @include cg-font(#{$cg-chip}-dt-se, #002a4e, 14px, 400);
461
+ }
462
+ .cg_chip:hover {
463
+ @include cg-design-state($cg-chip, hr-se);
464
+ }
465
+ .cg_chip:hover .cg_chip_label {
466
+ @include cg-font-state($cg-chip, hr-se, #002a4e, 14px, 400);
467
+ }
468
+ .cg_chip.is-active {
469
+ @include cg-design-state($cg-chip, sd-se);
470
+ }
471
+ .cg_chip.is-active .cg_chip_label {
472
+ @include cg-font-state($cg-chip, sd-se, #002a4e, 14px, 400);
473
+ }
474
+
475
+ // ---- Product grid -------------------------------------------------
476
+ .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
+ width: 100%;
482
+ }
483
+ .cg_product_card {
484
+ display: flex;
485
+ flex-direction: column;
486
+ gap: prepareMediaVariable(#{$cg-card}-dt-se-im-gp, 16px);
487
+ padding: prepareMediaVariable(#{$cg-card}-dt-se-pg, 0);
488
+ position: relative;
489
+ min-width: 0;
490
+ background-color: prepareMediaVariable(#{$cg-card}-dt-se-bd-cr, transparent);
491
+ border-color: prepareMediaVariable(#{$cg-card}-dt-se-br-cr, transparent);
492
+ border-style: prepareMediaVariable(#{$cg-card}-dt-se-br-se, solid);
493
+ border-width: prepareMediaVariable(#{$cg-card}-dt-se-br-wh, 0);
494
+ border-radius: prepareMediaVariable(#{$cg-card}-dt-se-br-rs, 0);
495
+ }
496
+ .cg_product_card:hover {
497
+ background-color: prepareMediaVariable(#{$cg-card}-hr-se-bd-cr, transparent);
498
+ border-color: prepareMediaVariable(#{$cg-card}-hr-se-br-cr, transparent);
499
+ }
500
+ .cg_product_image_wrapper {
501
+ position: relative;
502
+ width: 100%;
503
+ overflow: hidden;
504
+
505
+ // Gallery / zoom / thumbnail styling for the embedded ProductImageContent,
506
+ // rebound to the Category Groups productImage CSS-variable paths.
507
+ @import "./category-groups-product-image.scss";
508
+ }
509
+ // Fallback image (rendered only when the Product Image setting is absent).
510
+ .cg_product_image {
511
+ display: block;
512
+ width: 100%;
513
+ height: 400px;
514
+ object-fit: cover;
515
+ }
516
+ .cg_product_info {
517
+ display: flex;
518
+ flex-direction: column;
519
+ gap: 12px;
520
+ }
521
+ .cg_brand_name {
522
+ margin: 0;
523
+ @include cg-font($cg-brand, #737373, 14px, 400);
524
+ }
525
+ .cg_product_name {
526
+ margin: 0;
527
+ letter-spacing: -0.32px;
528
+ @include cg-font($cg-name, #0a3355, 16px, 600);
529
+ // Text overflow toggle + max lines (Product Name design controls).
530
+ &.flex__overflow {
531
+ @include restrictToLinesShow(#{var(--_sf-line-clamp, 1)});
532
+ }
533
+ }
534
+ .cg_product_price {
535
+ margin: 0;
536
+ display: flex;
537
+ align-items: center;
538
+ gap: 6px;
539
+ @include cg-font($cg-price, #000, 16px, 800);
540
+ }
541
+ .cg_variants_text {
542
+ margin: 0;
543
+ @include cg-font($cg-variants, #737373, 14px, 400);
544
+ }
545
+
546
+ @import "./category-groups-product-options.scss";
121
547
 
122
- // &[data-view-state="full"] {
123
- // width: auto;
124
- // margin: 0;
125
- // justify-self: stretch !important;
126
- // align-self: stretch !important;
127
- // cursor: auto;
128
- // &:is(#{$activeElementSelector}) {
129
- // & > div {
130
- // &[data-div-type="wrapper__layer"] {
131
- // --_sf-vt-zz: visible;
132
- // --_sf-op-zz: 1;
133
- // }
134
- // }
135
- // }
136
- // }
548
+ // Price styling for the embedded ProductPriceContent, rebound to the Category
549
+ // Groups productPrice CSS-variable paths.
550
+ @import "./category-groups-product-price.scss";
551
+
552
+ .loading_view {
553
+ width: 100%;
554
+ display: flex;
555
+ justify-content: center;
556
+ }
137
557
  }
138
558
  }