@sc-360-v2/storefront-cms-library 0.5.70 → 0.5.72

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.
Files changed (141) hide show
  1. package/dist/add-existing-form.scss +68 -68
  2. package/dist/add-products-tab-details.scss +4071 -4071
  3. package/dist/add-products-tab-uom-details.scss +1106 -1106
  4. package/dist/add-products-tab.scss +2377 -2377
  5. package/dist/allocation-header-quota-details.scss +609 -609
  6. package/dist/allocations-quota-details.scss +525 -525
  7. package/dist/amount-estimator.scss +1192 -1192
  8. package/dist/animation-control.scss +23 -23
  9. package/dist/badge.scss +408 -408
  10. package/dist/brand-basic-elements.scss +387 -387
  11. package/dist/brand.scss +142 -142
  12. package/dist/breadcrumbs.scss +966 -966
  13. package/dist/builder.js +1 -1
  14. package/dist/bulk-order-pad.scss +692 -692
  15. package/dist/bundleDetails.scss +6189 -6189
  16. package/dist/buy-for-tab-container.scss +141 -141
  17. package/dist/buy-for-tab.scss +649 -649
  18. package/dist/buy-for-tabs-container-item.scss +80 -80
  19. package/dist/buyForPopup.scss +339 -339
  20. package/dist/cart-details.scss +3986 -3986
  21. package/dist/cart-products-sidebar.scss +211 -211
  22. package/dist/cart-wrapper.scss +127 -127
  23. package/dist/cartDropdownOverlay.scss +653 -653
  24. package/dist/cartGrouping.scss +89 -89
  25. package/dist/category-groups-element.scss +739 -739
  26. package/dist/category-groups-quota-details.scss +626 -626
  27. package/dist/category.scss +137 -137
  28. package/dist/categoryDetails.scss +61 -61
  29. package/dist/categoryWidget.scss +34 -34
  30. package/dist/checkbox-radio.scss +124 -124
  31. package/dist/code-temp.scss +59 -59
  32. package/dist/colorpicker_v2.scss +62 -62
  33. package/dist/common-element.scss +35 -35
  34. package/dist/confirm-modal.scss +370 -370
  35. package/dist/confirmationModal.scss +139 -139
  36. package/dist/contact-us.scss +105 -105
  37. package/dist/container.scss +168 -168
  38. package/dist/custom-fonts.scss +100 -100
  39. package/dist/customization-tree.scss +162 -162
  40. package/dist/default-dropdown.scss +259 -259
  41. package/dist/dropdownTemplate.scss +699 -699
  42. package/dist/editCartItem.scss +110 -110
  43. package/dist/embed-temp.scss +73 -73
  44. package/dist/embroider-preview-element.scss +94 -94
  45. package/dist/embroider-template-1-v2.scss +1105 -1105
  46. package/dist/embroider-template-1.scss +501 -501
  47. package/dist/embroidery.scss +247 -247
  48. package/dist/employee-bulk-order.scss +4060 -4060
  49. package/dist/emtpy-templates.scss +165 -165
  50. package/dist/faq.scss +696 -696
  51. package/dist/fb-dropdown.scss +135 -135
  52. package/dist/filter-results.scss +361 -361
  53. package/dist/flex-text-editor.scss +271 -271
  54. package/dist/form-preview.scss +530 -530
  55. package/dist/global-styles.scss +198 -198
  56. package/dist/grid.scss +169 -169
  57. package/dist/icon-library.scss +78 -78
  58. package/dist/image-for-product.scss +21 -21
  59. package/dist/image-temp.scss +203 -203
  60. package/dist/item-stock.scss +93 -93
  61. package/dist/kitDetails.scss +5739 -5739
  62. package/dist/kits.scss +305 -305
  63. package/dist/language-selector.scss +948 -948
  64. package/dist/last-x-orders.scss +285 -285
  65. package/dist/layouter-item.scss +141 -141
  66. package/dist/layouter-pro-item.scss +139 -139
  67. package/dist/layouter-pro.scss +134 -134
  68. package/dist/layouter.scss +491 -491
  69. package/dist/light-box-v2.scss +155 -155
  70. package/dist/lightbox.scss +78 -78
  71. package/dist/loader.scss +37 -37
  72. package/dist/login.scss +29 -11
  73. package/dist/marchandiserSets.scss +141 -141
  74. package/dist/mega-menu-container.scss +152 -152
  75. package/dist/menu-item.scss +19 -19
  76. package/dist/menu-v2.scss +999 -999
  77. package/dist/menu.scss +174 -174
  78. package/dist/multi-select-dropdown.scss +316 -316
  79. package/dist/my-templates.scss +477 -477
  80. package/dist/my-wishlist.scss +27 -27
  81. package/dist/option-bar.scss +886 -886
  82. package/dist/order-processing.scss +61 -61
  83. package/dist/order-status.scss +74 -0
  84. package/dist/overflow-module.scss +63 -63
  85. package/dist/past-orders.scss +1039 -1039
  86. package/dist/payment-methods.scss +307 -307
  87. package/dist/phone-input.scss +208 -208
  88. package/dist/pickup-locations.scss +1359 -1359
  89. package/dist/position-module.scss +95 -95
  90. package/dist/prefix-list.scss +86 -86
  91. package/dist/product-actions.scss +2872 -2872
  92. package/dist/product-basic-elements.scss +600 -600
  93. package/dist/product-customizations.scss +155 -155
  94. package/dist/product-inventory.scss +1621 -1621
  95. package/dist/product-labels.scss +265 -265
  96. package/dist/product-price.scss +3392 -3392
  97. package/dist/product-promotions.scss +3224 -3224
  98. package/dist/product-sizechart.scss +1921 -1921
  99. package/dist/product.scss +140 -140
  100. package/dist/profile.scss +824 -824
  101. package/dist/quantity-selector.scss +1074 -1074
  102. package/dist/quick-inventory-check.scss +285 -285
  103. package/dist/quick-links.scss +627 -627
  104. package/dist/quota-details.scss +526 -526
  105. package/dist/repeater-embla-controls.scss +211 -211
  106. package/dist/repeater-grid-toggle.scss +206 -206
  107. package/dist/repeater-item.scss +152 -152
  108. package/dist/repeater.scss +946 -946
  109. package/dist/request-for-quotes.scss +841 -841
  110. package/dist/responsive-behaviour.scss +29 -29
  111. package/dist/rfqs.scss +861 -861
  112. package/dist/scroll.scss +414 -414
  113. package/dist/search.scss +689 -689
  114. package/dist/section.scss +276 -276
  115. package/dist/shareCartSideBar.scss +254 -254
  116. package/dist/shipping-estimator.scss +41 -41
  117. package/dist/shipping-payments.scss +2518 -2518
  118. package/dist/simple-list.scss +338 -338
  119. package/dist/skeleton.scss +64 -64
  120. package/dist/sort.scss +176 -176
  121. package/dist/spotlight.scss +1706 -1706
  122. package/dist/stack.scss +171 -171
  123. package/dist/static-global.scss +292 -292
  124. package/dist/static-text.scss +52 -52
  125. package/dist/stockStatus.scss +70 -70
  126. package/dist/store-locations.scss +1592 -1592
  127. package/dist/sub-category.scss +74 -74
  128. package/dist/submit-quote.scss +275 -275
  129. package/dist/tab-container-item.scss +80 -80
  130. package/dist/tab-container.scss +141 -141
  131. package/dist/table.scss +9 -0
  132. package/dist/tabs.scss +440 -440
  133. package/dist/text-temp.scss +109 -109
  134. package/dist/theme-classes.scss +421 -421
  135. package/dist/toaster.scss +392 -392
  136. package/dist/toggle-button.scss +32 -32
  137. package/dist/transform-properties-module.scss +20 -20
  138. package/dist/types/builder/tools/element-edit/login.d.ts +1 -0
  139. package/dist/types/builder/tools/element-edit/resetPassword.d.ts +1 -0
  140. package/dist/wishlist-overlay.scss +48 -48
  141. package/package.json +1 -1
@@ -1,739 +1,739 @@
1
- @use "sass:map";
2
- @use "sass:list";
3
- @use "./functions.scss" as *;
4
- $activeElementSelector: "[data-has-clicked='true']";
5
- $resizerId: "[data-cms-tool='cms-element-resizer']";
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
- // 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)
34
-
35
- @mixin cg-font($base, $color, $size, $weight: 600) {
36
- color: prepareMediaVariable(#{$base}-cr, $color);
37
- font-family: prepareMediaVariable(#{$base}-ft-fy, ("Inter", sans-serif));
38
- text-transform: prepareMediaVariable(#{$base}-tt-tm, ("Inter", sans-serif));
39
- word-wrap: prepareMediaVariable(#{$base}-wd-wp, ("Inter", sans-serif));
40
- word-break: prepareMediaVariable(#{$base}-wd-bk, ("Inter", sans-serif));
41
- font-size: prepareMediaVariable(#{$base}-ft-se, $size);
42
- font-weight: prepareMediaVariable(#{$base}-ft-wt, $weight);
43
- // Remaining typography states (only apply when set in the design panel).
44
- font-style: prepareMediaVariable(#{$base}-ft-se-ic);
45
- text-align: prepareMediaVariable(#{$base}-tt-an);
46
- letter-spacing: prepareMediaVariable(#{$base}-lr-sg);
47
- line-height: prepareMediaVariable(#{$base}-le-ht);
48
- text-decoration: prepareMediaVariable(#{$base}-ue);
49
- }
50
-
51
- // Container fill / border / radius / shadow for a given state base
52
- // (e.g. `$cg-tree-dt-se`). Shadow stays invisible until set in the panel.
53
- @mixin cg-design($base) {
54
- background-color: prepareMediaVariable(#{$base}-bd-cr, transparent);
55
- border-color: prepareMediaVariable(#{$base}-br-cr, transparent);
56
- border-style: prepareMediaVariable(#{$base}-br-se, solid);
57
- border-width: prepareMediaVariable(#{$base}-br-wh, 0);
58
- border-radius: prepareMediaVariable(#{$base}-br-rs, 4px);
59
- box-shadow: prepareMediaVariable(#{$base}-sw-ae, 0 0) prepareMediaVariable(#{$base}-sw-br, 0)
60
- prepareMediaVariable(#{$base}-sw-sd, 0) prepareMediaVariable(#{$base}-sw-cr, transparent);
61
- }
62
-
63
- // Interactive-state typography ($state = "hr-se" | "sd-se"): the state's own
64
- // vars fall back to the DEFAULT state (dt-se), then the Figma value — so Figma
65
- // only seeds the default state and edits to the default cascade to every state.
66
- @mixin cg-font-state($base, $state, $color, $size, $weight: 600) {
67
- color: prepareMediaVariable(
68
- #{$base}-#{$state}-cr,
69
- prepareMediaVariable(#{$base}-dt-se-cr, $color)
70
- );
71
- font-family: prepareMediaVariable(
72
- #{$base}-#{$state}-ft-fy,
73
- prepareMediaVariable(#{$base}-dt-se-ft-fy, ("Inter", sans-serif))
74
- );
75
- text-transform: prepareMediaVariable(
76
- #{$base}-#{$state}-tt-tm,
77
- prepareMediaVariable(#{$base}-dt-se-tt-tm, ("Inter", sans-serif))
78
- );
79
- word-wrap: prepareMediaVariable(
80
- #{$base}-#{$state}-wd-wp,
81
- prepareMediaVariable(#{$base}-dt-se-wd-wp, ("Inter", sans-serif))
82
- );
83
- word-break: prepareMediaVariable(
84
- #{$base}-#{$state}-wd-bk,
85
- prepareMediaVariable(#{$base}-dt-se-wd-bk, ("Inter", sans-serif))
86
- );
87
- font-size: prepareMediaVariable(
88
- #{$base}-#{$state}-ft-se,
89
- prepareMediaVariable(#{$base}-dt-se-ft-se, $size)
90
- );
91
- font-weight: prepareMediaVariable(
92
- #{$base}-#{$state}-ft-wt,
93
- prepareMediaVariable(#{$base}-dt-se-ft-wt, $weight)
94
- );
95
- font-style: prepareMediaVariable(
96
- #{$base}-#{$state}-ft-se-ic,
97
- prepareMediaVariable(#{$base}-dt-se-ft-se-ic)
98
- );
99
- text-align: prepareMediaVariable(
100
- #{$base}-#{$state}-tt-an,
101
- prepareMediaVariable(#{$base}-dt-se-tt-an)
102
- );
103
- letter-spacing: prepareMediaVariable(
104
- #{$base}-#{$state}-lr-sg,
105
- prepareMediaVariable(#{$base}-dt-se-lr-sg)
106
- );
107
- line-height: prepareMediaVariable(
108
- #{$base}-#{$state}-le-ht,
109
- prepareMediaVariable(#{$base}-dt-se-le-ht)
110
- );
111
- text-decoration: prepareMediaVariable(
112
- #{$base}-#{$state}-ue,
113
- prepareMediaVariable(#{$base}-dt-se-ue)
114
- );
115
- }
116
-
117
- // Interactive-state container design, falling back to the DEFAULT state.
118
- @mixin cg-design-state($base, $state) {
119
- background-color: prepareMediaVariable(
120
- #{$base}-#{$state}-bd-cr,
121
- prepareMediaVariable(#{$base}-dt-se-bd-cr, transparent)
122
- );
123
- border-color: prepareMediaVariable(
124
- #{$base}-#{$state}-br-cr,
125
- prepareMediaVariable(#{$base}-dt-se-br-cr, transparent)
126
- );
127
- border-style: prepareMediaVariable(
128
- #{$base}-#{$state}-br-se,
129
- prepareMediaVariable(#{$base}-dt-se-br-se, solid)
130
- );
131
- border-width: prepareMediaVariable(
132
- #{$base}-#{$state}-br-wh,
133
- prepareMediaVariable(#{$base}-dt-se-br-wh, 0)
134
- );
135
- border-radius: prepareMediaVariable(
136
- #{$base}-#{$state}-br-rs,
137
- prepareMediaVariable(#{$base}-dt-se-br-rs, 4px)
138
- );
139
- box-shadow: prepareMediaVariable(
140
- #{$base}-#{$state}-sw-ae,
141
- prepareMediaVariable(#{$base}-dt-se-sw-ae, 0 0)
142
- )
143
- prepareMediaVariable(#{$base}-#{$state}-sw-br, prepareMediaVariable(#{$base}-dt-se-sw-br, 0))
144
- prepareMediaVariable(#{$base}-#{$state}-sw-sd, prepareMediaVariable(#{$base}-dt-se-sw-sd, 0))
145
- prepareMediaVariable(
146
- #{$base}-#{$state}-sw-cr,
147
- prepareMediaVariable(#{$base}-dt-se-sw-cr, transparent)
148
- );
149
- }
150
-
151
- [data-div-type="element"] {
152
- &[data-element-type="categoryGroups"] {
153
- width: calc(
154
- 1% *
155
- var(
156
- --_ctm-mob-catego-ele-nw-wh-vl,
157
- var(--_ctm-tab-catego-ele-nw-wh-vl, var(--_ctm-catego-ele-nw-wh-vl, auto))
158
- )
159
- );
160
- margin: var(
161
- --_ctm-mob-catego-lt-mn,
162
- var(--_ctm-tab-catego-lt-mn, var(--_ctm-catego-lt-mn, var(--_ctm-lt-mn)))
163
- );
164
-
165
- &[data-view-state="full"] {
166
- & > .wrapper {
167
- grid-template-rows: auto !important;
168
- }
169
- }
170
- & > div {
171
- &.wrapper {
172
- width: 100%;
173
- min-height: prepareMediaVariable(--_ctm-catego-lt-mn-ht);
174
- padding: var(
175
- --_ctm-mob-catego-lt-pg,
176
- var(--_ctm-tab-catego-lt-pg, var(--_ctm-catego-lt-pg))
177
- );
178
-
179
- background-color: prepareMediaVariable(#{$cg-widget}-bd-cr, transparent);
180
- border-color: prepareMediaVariable(#{$cg-widget}-br-cr, transparent);
181
- border-style: prepareMediaVariable(#{$cg-widget}-br-se, solid);
182
- border-width: prepareMediaVariable(#{$cg-widget}-br-wh, 0);
183
- border-radius: prepareMediaVariable(#{$cg-widget}-br-rs, 0);
184
- box-shadow: prepareMediaVariable(#{$cg-widget}-sw-ae, 0 0)
185
- prepareMediaVariable(#{$cg-widget}-sw-br, 0) prepareMediaVariable(#{$cg-widget}-sw-sd, 0)
186
- prepareMediaVariable(#{$cg-widget}-sw-cr, transparent);
187
- }
188
- }
189
- // The modal-tree wrapper re-applies the element data-attrs (so the scoped
190
- // tree styles reach it through the portal), which makes it also match the
191
- // element-level box rules (margin/width). Target it on the SAME element
192
- // (`&.`) to override those — a descendant selector wouldn't match it.
193
- &.cg_category_modal_tree {
194
- width: 100%;
195
- margin: 0;
196
- padding: 4px;
197
- }
198
- // -------------------------------------------------------------------
199
- // Fixed two-column layout. Figma tokens are the prepareMediaVariable
200
- // fallbacks so the design renders correctly before any panel edits.
201
- // -------------------------------------------------------------------
202
- .category__groups__element__container {
203
- display: flex;
204
- // Widget Style → gap between the left sidebar and the right main section.
205
- gap: prepareMediaVariable(#{$cg-widget}-im-gp, 36px);
206
- align-items: flex-start;
207
- width: 100%;
208
- }
209
-
210
- // ---- Mobile (fixed layout): the sidebar tree is replaced by a selector
211
- // that opens the CategoryTree in a modal; everything stacks vertically.
212
- .category__groups__element__container.is-mobile {
213
- flex-direction: column;
214
- gap: prepareMediaVariable(#{$cg-main}-im-gp, 12px);
215
-
216
- .cg_main {
217
- width: 100%;
218
- }
219
- }
220
- .cg_mobile_category_select {
221
- display: flex;
222
- flex-direction: row;
223
- align-items: center;
224
- justify-content: space-between;
225
- gap: 12px;
226
- width: 100%;
227
- cursor: pointer;
228
- }
229
- // Mobile Select-category button (rendered by the shared ButtonComponent as
230
- // `.btn__with__text`). Styled from the `selectButton` design block — which
231
- // uses the standard button property suffixes — via the cg-design / cg-font
232
- // mixins (default + hover), plus the button-specific layout vars.
233
- .btn__with__text[data-btn-name="selectButton"] {
234
- display: flex;
235
- align-items: center;
236
- flex-direction: var(--_sf-fd-bn, row);
237
- cursor: pointer;
238
- width: prepareMediaVariable(#{$cg-select-btn}-dt-se-wh, auto);
239
- padding: prepareMediaVariable(#{$cg-select-btn}-dt-se-pg, 8px 12px);
240
- gap: prepareMediaVariable(#{$cg-select-btn}-dt-se-gp, 8px);
241
- justify-content: prepareMediaVariable(#{$cg-select-btn}-dt-se-at, space-between);
242
- @include cg-design(#{$cg-select-btn}-dt-se);
243
-
244
- &[data-icon-position="right"] {
245
- --_sf-fd-bn: row-reverse;
246
- }
247
- &[data-icon-position="left"],
248
- &[data-icon-position="center"] {
249
- --_sf-fd-bn: row;
250
- }
251
-
252
- .txt {
253
- // flex: 1;
254
- min-width: 0;
255
- overflow: hidden;
256
- text-overflow: ellipsis;
257
- white-space: nowrap;
258
- @include cg-font(#{$cg-select-btn}-dt-se, #002a4e, 14px, 400);
259
- }
260
-
261
- .icon {
262
- display: flex;
263
- flex-shrink: 0;
264
- svg {
265
- width: prepareMediaVariable(#{$cg-select-btn}-dt-se-in-se, 16px);
266
- height: prepareMediaVariable(#{$cg-select-btn}-dt-se-in-se, 16px);
267
- path {
268
- stroke: prepareMediaVariable(#{$cg-select-btn}-dt-se-in-c1, currentColor);
269
- }
270
- }
271
- }
272
- .icon--hover {
273
- display: none;
274
- }
275
-
276
- &:hover {
277
- @include cg-design-state($cg-select-btn, hr-se);
278
- .txt {
279
- @include cg-font-state($cg-select-btn, hr-se, #002a4e, 14px, 400);
280
- }
281
- .icon--hover {
282
- display: flex;
283
- }
284
- }
285
- // Swap to the hover icon only when one is configured.
286
- &:hover:has(.icon--hover) .icon--default {
287
- display: none;
288
- }
289
- }
290
- // Tree rendered inside the (portaled) category modal.
291
-
292
- // ---- Left sidebar -------------------------------------------------
293
- .cg_sidebar {
294
- display: flex;
295
- flex-direction: column;
296
- // Sidebar Container → gap (heading ↔ tree) + padding.
297
- gap: prepareMediaVariable(#{$cg-sidebar}-im-gp, 12px);
298
- padding: prepareMediaVariable(#{$cg-sidebar}-pg, 0);
299
- width: 260px;
300
- flex-shrink: 0;
301
- background-color: prepareMediaVariable(#{$cg-sidebar}-bd-cr, transparent);
302
- border-color: prepareMediaVariable(#{$cg-sidebar}-br-cr, transparent);
303
- border-style: prepareMediaVariable(#{$cg-sidebar}-br-se, solid);
304
- border-width: prepareMediaVariable(#{$cg-sidebar}-br-wh, 0);
305
- border-radius: prepareMediaVariable(#{$cg-sidebar}-br-rs, 0);
306
- box-shadow: prepareMediaVariable(#{$cg-sidebar}-sw-ae, 0 0)
307
- prepareMediaVariable(#{$cg-sidebar}-sw-br, 0) prepareMediaVariable(#{$cg-sidebar}-sw-sd, 0)
308
- prepareMediaVariable(#{$cg-sidebar}-sw-cr, transparent);
309
- }
310
-
311
- .cg_sidebar_heading {
312
- white-space: nowrap;
313
- margin: 0;
314
- text-transform: uppercase;
315
- line-height: 1.25;
316
- @include cg-font($cg-cat-heading, #002a4e, 16px, 400);
317
- }
318
- .cg_all_products_heading {
319
- margin: 0;
320
- text-transform: uppercase;
321
- line-height: 1.25;
322
- @include cg-font($cg-allprod-heading, #002a4e, 24px, 400);
323
- }
324
- .cg_subcategory_title {
325
- margin: 0;
326
- font-family: "Inter", sans-serif;
327
- color: #002a4e;
328
- text-transform: uppercase;
329
- line-height: 1.25;
330
- font-size: 16px;
331
- }
332
-
333
- .cg_sidebar_divider,
334
- .cg_main_divider {
335
- display: block;
336
- width: 100%;
337
- // Widget Style → Divider (show toggle + colour + thickness).
338
- height: prepareMediaVariable(#{$cg-widget}-dr-wh, 1px);
339
- background: prepareMediaVariable(#{$cg-widget}-dr-cr, #e5e7eb);
340
- }
341
- &[data-show-dividers="false"] {
342
- .cg_sidebar_divider,
343
- .cg_main_divider,
344
- .cg_subcategory_divider {
345
- display: none;
346
- }
347
- }
348
-
349
- .cg_category_tree {
350
- display: flex;
351
- flex-direction: column;
352
- // Gap BETWEEN category rows (Sidebar Container → Category Tree Gap).
353
- gap: prepareMediaVariable(#{$cg-sidebar}-cy-te-gp, 8px);
354
- width: 100%;
355
- }
356
-
357
- .cg_tree_node {
358
- display: flex;
359
- align-items: center;
360
- // Category Tree Item → item gap (icon ↔ label).
361
- gap: prepareMediaVariable(#{$cg-tree}-dt-se-im-gp, 4px);
362
- // Category Tree Item → Layout padding.
363
- padding: prepareMediaVariable(#{$cg-tree}-dt-se-pg, 4px 0);
364
- cursor: pointer;
365
- @include cg-design(#{$cg-tree}-dt-se);
366
- }
367
- .cg_tree_node_icon {
368
- display: flex;
369
- align-items: center;
370
- justify-content: center;
371
- width: 24px;
372
- height: 24px;
373
- flex-shrink: 0;
374
- // Configurable expand/collapse icon colour (inherited by the SVG below).
375
- color: prepareMediaVariable(#{$cg-tree-icon}-in-c1, #002a4e);
376
- }
377
- .cg_chevron {
378
- display: flex;
379
- align-items: center;
380
- justify-content: center;
381
- transition: transform 0.15s ease;
382
- color: prepareMediaVariable(#{$cg-tree-icon}-in-c1, #002a4e);
383
- svg {
384
- width: prepareMediaVariable(#{$cg-tree-icon}-in-se, 20px);
385
- height: prepareMediaVariable(#{$cg-tree-icon}-in-se, 20px);
386
- // Apply the configured colour even when the fetched SVG hardcodes its
387
- // own stroke/fill (skip parts explicitly set to "none").
388
- &[stroke]:not([stroke="none"]),
389
- [stroke]:not([stroke="none"]) {
390
- stroke: prepareMediaVariable(#{$cg-tree-icon}-in-c1, #002a4e);
391
- }
392
- &[fill]:not([fill="none"]),
393
- [fill]:not([fill="none"]) {
394
- fill: prepareMediaVariable(#{$cg-tree-icon}-in-c1, #002a4e);
395
- }
396
- }
397
- }
398
- .cg_chevron.is-open {
399
- transform: rotate(90deg);
400
- }
401
- // Expanded icon uses its own size/colour vars (iconSizeExpanded /
402
- // iconColorExpanded) so it is independent of the collapsed icon.
403
- .cg_chevron.is-expanded {
404
- color: prepareMediaVariable(#{$cg-tree-icon}-in-cr-ed, #002a4e);
405
- svg {
406
- width: prepareMediaVariable(#{$cg-tree-icon}-in-se-ed, 20px);
407
- height: prepareMediaVariable(#{$cg-tree-icon}-in-se-ed, 20px);
408
- &[stroke]:not([stroke="none"]),
409
- [stroke]:not([stroke="none"]) {
410
- stroke: prepareMediaVariable(#{$cg-tree-icon}-in-cr-ed, #002a4e);
411
- }
412
- &[fill]:not([fill="none"]),
413
- [fill]:not([fill="none"]) {
414
- fill: prepareMediaVariable(#{$cg-tree-icon}-in-cr-ed, #002a4e);
415
- }
416
- }
417
- }
418
- .cg_tree_node_label {
419
- flex: 1;
420
- @include cg-font(#{$cg-tree}-dt-se, #002a4e, 14px, 600);
421
- }
422
- .cg_tree_node:hover {
423
- @include cg-design-state($cg-tree, hr-se);
424
- }
425
- .cg_tree_node:hover .cg_tree_node_label {
426
- @include cg-font-state($cg-tree, hr-se, #002a4e, 14px, 600);
427
- }
428
- .cg_tree_node.is-active {
429
- @include cg-design-state($cg-tree, sd-se);
430
- }
431
- .cg_tree_node.is-active .cg_tree_node_label {
432
- @include cg-font-state($cg-tree, sd-se, #002a4e, 14px, 600);
433
- }
434
-
435
- .cg_subtree {
436
- display: flex;
437
- flex-direction: column;
438
- // Gap BETWEEN sub-category rows (Sidebar Container → Sub Category Gap).
439
- gap: prepareMediaVariable(#{$cg-sidebar}-sb-cy-gp, 8px);
440
- padding-left: 31px;
441
- width: 100%;
442
- }
443
- .cg_subtree_node {
444
- // Sub Category Tree Item → Layout padding.
445
- padding: prepareMediaVariable(#{$cg-subtree}-dt-se-pg, 4px 0);
446
- cursor: pointer;
447
- @include cg-design(#{$cg-subtree}-dt-se);
448
- }
449
- .cg_subtree_node_label {
450
- letter-spacing: -0.28px;
451
- @include cg-font(#{$cg-subtree}-dt-se, #1d1b1c, 14px, 400);
452
- }
453
- .cg_subtree_node:hover {
454
- @include cg-design-state($cg-subtree, hr-se);
455
- }
456
- .cg_subtree_node:hover .cg_subtree_node_label {
457
- @include cg-font-state($cg-subtree, hr-se, #1d1b1c, 14px, 400);
458
- }
459
- .cg_subtree_node.is-active {
460
- @include cg-design-state($cg-subtree, sd-se);
461
- }
462
- .cg_subtree_node.is-active .cg_subtree_node_label {
463
- @include cg-font-state($cg-subtree, sd-se, #1d1b1c, 14px, 400);
464
- }
465
-
466
- // ---- Right main ---------------------------------------------------
467
- // mainSection: container fill/border + gap between heading, breadcrumb,
468
- // sub-categories and the product grid.
469
- .cg_main {
470
- display: flex;
471
- flex-direction: column;
472
- gap: prepareMediaVariable(#{$cg-main}-im-gp, 12px);
473
- padding: prepareMediaVariable(#{$cg-main}-pg, 0);
474
- flex: 1 0 0;
475
- min-width: 0;
476
- @include cg-design($cg-main);
477
- }
478
-
479
- // Drill-down breadcrumb (reuses the Breadcrumbs element DOM classes), styled
480
- // from the breadcrumbDesign panel: breadcrumbItem (default/hover/selected) +
481
- // separatorIcon. Selected state = the current (last) crumb.
482
- .cg_breadcrumb {
483
- width: 100%;
484
- .horizontal_breadcrumb_wrapper {
485
- display: inline-flex;
486
- align-items: center;
487
- width: 100%;
488
- // flex-wrap: wrap;
489
- overflow-x: auto;
490
- gap: 6px;
491
- }
492
- .breadcrumb_item {
493
- padding: 0 4px;
494
- display: flex;
495
- align-items: center;
496
- gap: 8px;
497
- white-space: nowrap;
498
- @include cg-design(#{$cg-bc-item}-dt-se);
499
- @include cg-font(#{$cg-bc-item}-dt-se, #4b4546, 14px, 400);
500
- &[data-show-cursor="true"] {
501
- cursor: pointer;
502
- }
503
- &[data-show-cursor="true"]:hover {
504
- @include cg-design-state($cg-bc-item, hr-se);
505
- @include cg-font-state($cg-bc-item, hr-se, #4b4546, 14px, 400);
506
- }
507
- &:last-of-type {
508
- @include cg-design-state($cg-bc-item, sd-se);
509
- @include cg-font-state($cg-bc-item, sd-se, #1d1b1c, 14px, 600);
510
- }
511
- }
512
- // Collapse ("…") button shown when the trail is too deep.
513
- .collapse_btn {
514
- display: flex;
515
- align-items: center;
516
- padding: 0 4px;
517
- border: none;
518
- background: transparent;
519
- cursor: pointer;
520
- line-height: 1;
521
- @include cg-font(#{$cg-bc-item}-dt-se, #4b4546, 16px, 600);
522
- }
523
- .separator .icon {
524
- display: flex;
525
- svg {
526
- width: prepareMediaVariable(#{$cg-bc-sep}-in-se, 16px);
527
- height: prepareMediaVariable(#{$cg-bc-sep}-in-se, 16px);
528
- path {
529
- stroke: prepareMediaVariable(#{$cg-bc-sep}-in-c1, #8a8a8a);
530
- }
531
- }
532
- }
533
- }
534
-
535
- // Breadcrumb (top) + chip row (bottom) stack vertically.
536
- .cg_subcategory_scroller {
537
- display: flex;
538
- flex-direction: column;
539
- align-items: stretch;
540
- // Same gap as the main section so breadcrumb ↔ sub-categories spacing
541
- // follows the Main Section item gap.
542
- gap: prepareMediaVariable(#{$cg-main}-im-gp, 12px);
543
- width: 100%;
544
- }
545
- // The horizontal chip row: left arrow + scrolling rail + right arrow.
546
- .cg_subcategory_row {
547
- display: flex;
548
- align-items: center;
549
- gap: 12px;
550
- width: 100%;
551
- }
552
- .cg_subcategory_divider {
553
- width: 100%;
554
- // Widget Style → Divider (colour + thickness), same as the other dividers.
555
- height: prepareMediaVariable(#{$cg-widget}-dr-wh, 1px);
556
- background: prepareMediaVariable(#{$cg-widget}-dr-cr, #cbd5e1);
557
- flex-shrink: 0;
558
- }
559
- .cg_scroller_arrow {
560
- display: flex;
561
- align-items: center;
562
- justify-content: center;
563
- padding: prepareMediaVariable(#{$cg-arrow}-dt-se-pg, 0);
564
- cursor: pointer;
565
- flex-shrink: 0;
566
- // Default state: fill / border / radius / shadow.
567
- @include cg-design(#{$cg-arrow}-dt-se);
568
- // Icon colour (in-c1) drives the SVG `currentColor` stroke.
569
- color: prepareMediaVariable(#{$cg-arrow}-dt-se-in-c1, #002a4e);
570
- svg {
571
- width: prepareMediaVariable(#{$cg-arrow}-dt-se-in-se, 20px);
572
- height: prepareMediaVariable(#{$cg-arrow}-dt-se-in-se, 20px);
573
- }
574
- &:hover {
575
- @include cg-design-state($cg-arrow, hr-se);
576
- color: prepareMediaVariable(
577
- #{$cg-arrow}-hr-se-in-c1,
578
- prepareMediaVariable(#{$cg-arrow}-dt-se-in-c1, #002a4e)
579
- );
580
- }
581
- }
582
- .cg_chip_rail {
583
- display: flex;
584
- align-items: center;
585
- gap: prepareMediaVariable(#{$cg-scroller-design}-im-gp, 16px);
586
- flex: 1 0 0;
587
- min-width: 0;
588
- overflow-x: auto;
589
- scrollbar-width: none;
590
- &::-webkit-scrollbar {
591
- display: none;
592
- }
593
- }
594
- .cg_chip {
595
- display: flex;
596
- align-items: center;
597
- // Spacing between the chip image and its label (Sub Category Chip item gap).
598
- gap: prepareMediaVariable(#{$cg-chip}-dt-se-im-gp, 8px);
599
- cursor: pointer;
600
- flex-shrink: 0;
601
- padding: 0;
602
- @include cg-design(#{$cg-chip}-dt-se);
603
- }
604
- .cg_chip_icon {
605
- display: flex;
606
- align-items: center;
607
- justify-content: center;
608
- width: prepareMediaVariable(#{$cg-chip-image}-wh, 36px);
609
- height: prepareMediaVariable(#{$cg-chip-image}-ht, 36px);
610
- padding: prepareMediaVariable(#{$cg-chip-image}-pg, 0);
611
- flex-shrink: 0;
612
- overflow: hidden;
613
- color: #002a4e;
614
- // Sub Category Image design controls (fill / border / radius / shadow).
615
- @include cg-design($cg-chip-image);
616
- img {
617
- width: 100%;
618
- height: 100%;
619
- object-fit: cover;
620
- transition: transform 0.3s ease-in-out;
621
- }
622
- // Image Settings -> On Hover (zoom).
623
- &[data-on-hover="Zoom In"]:hover img {
624
- transform: scale(1.08);
625
- }
626
- &[data-on-hover="Zoom Out"]:hover img {
627
- transform: scale(0.92);
628
- }
629
- }
630
- .cg_chip_label {
631
- padding: 4px 12px;
632
- white-space: nowrap;
633
- @include cg-font(#{$cg-chip}-dt-se, #002a4e, 14px, 400);
634
- }
635
- .cg_chip:hover {
636
- @include cg-design-state($cg-chip, hr-se);
637
- }
638
- .cg_chip:hover .cg_chip_label {
639
- @include cg-font-state($cg-chip, hr-se, #002a4e, 14px, 400);
640
- }
641
- .cg_chip.is-active {
642
- @include cg-design-state($cg-chip, sd-se);
643
- }
644
- .cg_chip.is-active .cg_chip_label {
645
- @include cg-font-state($cg-chip, sd-se, #002a4e, 14px, 400);
646
- }
647
-
648
- // ---- Product grid -------------------------------------------------
649
- // Container box only. Display modes (grid / cards / slider) + gaps live in
650
- // category-groups-product-grid.scss (imported below).
651
- .cg_product_grid {
652
- width: 100%;
653
- position: relative;
654
- padding: prepareMediaVariable(#{$cg-grid}-lt-pg, 0);
655
- // Grid container fill / border / radius / shadow.
656
- @include cg-design(#{$cg-grid}-lt);
657
- }
658
- // Display styles (Grid / Cards / Slider) for the product grid.
659
- @import "./category-groups-product-grid.scss";
660
- .cg_product_card {
661
- display: flex;
662
- flex-direction: column;
663
- gap: prepareMediaVariable(#{$cg-card}-dt-se-im-gp, 16px);
664
- padding: prepareMediaVariable(#{$cg-card}-dt-se-pg, 0);
665
- position: relative;
666
- min-width: 0;
667
- @include cg-design(#{$cg-card}-dt-se);
668
- }
669
- .cg_product_card:hover {
670
- @include cg-design-state($cg-card, hr-se);
671
- }
672
- .cg_product_image_wrapper {
673
- position: relative;
674
- width: 100%;
675
- overflow: hidden;
676
-
677
- // Gallery / zoom / thumbnail styling for the embedded ProductImageContent,
678
- // rebound to the Category Groups productImage CSS-variable paths.
679
- @import "./category-groups-product-image.scss";
680
- }
681
- // Fallback image (rendered only when the Product Image setting is absent).
682
- .cg_product_image {
683
- display: block;
684
- width: 100%;
685
- height: 400px;
686
- object-fit: cover;
687
- }
688
- .cg_product_info {
689
- display: flex;
690
- flex-direction: column;
691
- // Product Card → content gap (between brand / name / price / options).
692
- gap: prepareMediaVariable(#{$cg-card}-dt-se-ct-gp, 12px);
693
- }
694
- .cg_brand_name {
695
- margin: 0;
696
- @include cg-font($cg-brand, #737373, 14px, 400);
697
- // Text overflow toggle + max lines (Brand Name design controls).
698
- &.flex__overflow {
699
- @include restrictToLinesShow(#{var(--_sf-line-clamp, 1)});
700
- }
701
- }
702
- .cg_product_name {
703
- margin: 0;
704
- letter-spacing: -0.32px;
705
- @include cg-font($cg-name, #0a3355, 16px, 600);
706
- // Text overflow toggle + max lines (Product Name design controls).
707
- &.flex__overflow {
708
- @include restrictToLinesShow(#{var(--_sf-line-clamp, 1)});
709
- }
710
- }
711
- .cg_product_price {
712
- margin: 0;
713
- display: flex;
714
- align-items: center;
715
- gap: 6px;
716
- @include cg-font($cg-price, #000, 16px, 800);
717
- }
718
- .cg_variants_text {
719
- margin: 0;
720
- @include cg-font($cg-variants, #737373, 14px, 400);
721
- }
722
-
723
- @import "./category-groups-product-options.scss";
724
-
725
- // Price styling for the embedded ProductPriceContent, rebound to the Category
726
- // Groups productPrice CSS-variable paths.
727
- @import "./category-groups-product-price.scss";
728
-
729
- // Quota details styling for the embedded QuotaDetailsContent, rebound to the
730
- // Category Groups quotaDetails CSS-variable paths.
731
- @import "./category-groups-quota-details.scss";
732
-
733
- .loading_view {
734
- width: 100%;
735
- display: flex;
736
- justify-content: center;
737
- }
738
- }
739
- }
1
+ @use "sass:map";
2
+ @use "sass:list";
3
+ @use "./functions.scss" as *;
4
+ $activeElementSelector: "[data-has-clicked='true']";
5
+ $resizerId: "[data-cms-tool='cms-element-resizer']";
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
+ // 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)
34
+
35
+ @mixin cg-font($base, $color, $size, $weight: 600) {
36
+ color: prepareMediaVariable(#{$base}-cr, $color);
37
+ font-family: prepareMediaVariable(#{$base}-ft-fy, ("Inter", sans-serif));
38
+ text-transform: prepareMediaVariable(#{$base}-tt-tm, ("Inter", sans-serif));
39
+ word-wrap: prepareMediaVariable(#{$base}-wd-wp, ("Inter", sans-serif));
40
+ word-break: prepareMediaVariable(#{$base}-wd-bk, ("Inter", sans-serif));
41
+ font-size: prepareMediaVariable(#{$base}-ft-se, $size);
42
+ font-weight: prepareMediaVariable(#{$base}-ft-wt, $weight);
43
+ // Remaining typography states (only apply when set in the design panel).
44
+ font-style: prepareMediaVariable(#{$base}-ft-se-ic);
45
+ text-align: prepareMediaVariable(#{$base}-tt-an);
46
+ letter-spacing: prepareMediaVariable(#{$base}-lr-sg);
47
+ line-height: prepareMediaVariable(#{$base}-le-ht);
48
+ text-decoration: prepareMediaVariable(#{$base}-ue);
49
+ }
50
+
51
+ // Container fill / border / radius / shadow for a given state base
52
+ // (e.g. `$cg-tree-dt-se`). Shadow stays invisible until set in the panel.
53
+ @mixin cg-design($base) {
54
+ background-color: prepareMediaVariable(#{$base}-bd-cr, transparent);
55
+ border-color: prepareMediaVariable(#{$base}-br-cr, transparent);
56
+ border-style: prepareMediaVariable(#{$base}-br-se, solid);
57
+ border-width: prepareMediaVariable(#{$base}-br-wh, 0);
58
+ border-radius: prepareMediaVariable(#{$base}-br-rs, 4px);
59
+ box-shadow: prepareMediaVariable(#{$base}-sw-ae, 0 0) prepareMediaVariable(#{$base}-sw-br, 0)
60
+ prepareMediaVariable(#{$base}-sw-sd, 0) prepareMediaVariable(#{$base}-sw-cr, transparent);
61
+ }
62
+
63
+ // Interactive-state typography ($state = "hr-se" | "sd-se"): the state's own
64
+ // vars fall back to the DEFAULT state (dt-se), then the Figma value — so Figma
65
+ // only seeds the default state and edits to the default cascade to every state.
66
+ @mixin cg-font-state($base, $state, $color, $size, $weight: 600) {
67
+ color: prepareMediaVariable(
68
+ #{$base}-#{$state}-cr,
69
+ prepareMediaVariable(#{$base}-dt-se-cr, $color)
70
+ );
71
+ font-family: prepareMediaVariable(
72
+ #{$base}-#{$state}-ft-fy,
73
+ prepareMediaVariable(#{$base}-dt-se-ft-fy, ("Inter", sans-serif))
74
+ );
75
+ text-transform: prepareMediaVariable(
76
+ #{$base}-#{$state}-tt-tm,
77
+ prepareMediaVariable(#{$base}-dt-se-tt-tm, ("Inter", sans-serif))
78
+ );
79
+ word-wrap: prepareMediaVariable(
80
+ #{$base}-#{$state}-wd-wp,
81
+ prepareMediaVariable(#{$base}-dt-se-wd-wp, ("Inter", sans-serif))
82
+ );
83
+ word-break: prepareMediaVariable(
84
+ #{$base}-#{$state}-wd-bk,
85
+ prepareMediaVariable(#{$base}-dt-se-wd-bk, ("Inter", sans-serif))
86
+ );
87
+ font-size: prepareMediaVariable(
88
+ #{$base}-#{$state}-ft-se,
89
+ prepareMediaVariable(#{$base}-dt-se-ft-se, $size)
90
+ );
91
+ font-weight: prepareMediaVariable(
92
+ #{$base}-#{$state}-ft-wt,
93
+ prepareMediaVariable(#{$base}-dt-se-ft-wt, $weight)
94
+ );
95
+ font-style: prepareMediaVariable(
96
+ #{$base}-#{$state}-ft-se-ic,
97
+ prepareMediaVariable(#{$base}-dt-se-ft-se-ic)
98
+ );
99
+ text-align: prepareMediaVariable(
100
+ #{$base}-#{$state}-tt-an,
101
+ prepareMediaVariable(#{$base}-dt-se-tt-an)
102
+ );
103
+ letter-spacing: prepareMediaVariable(
104
+ #{$base}-#{$state}-lr-sg,
105
+ prepareMediaVariable(#{$base}-dt-se-lr-sg)
106
+ );
107
+ line-height: prepareMediaVariable(
108
+ #{$base}-#{$state}-le-ht,
109
+ prepareMediaVariable(#{$base}-dt-se-le-ht)
110
+ );
111
+ text-decoration: prepareMediaVariable(
112
+ #{$base}-#{$state}-ue,
113
+ prepareMediaVariable(#{$base}-dt-se-ue)
114
+ );
115
+ }
116
+
117
+ // Interactive-state container design, falling back to the DEFAULT state.
118
+ @mixin cg-design-state($base, $state) {
119
+ background-color: prepareMediaVariable(
120
+ #{$base}-#{$state}-bd-cr,
121
+ prepareMediaVariable(#{$base}-dt-se-bd-cr, transparent)
122
+ );
123
+ border-color: prepareMediaVariable(
124
+ #{$base}-#{$state}-br-cr,
125
+ prepareMediaVariable(#{$base}-dt-se-br-cr, transparent)
126
+ );
127
+ border-style: prepareMediaVariable(
128
+ #{$base}-#{$state}-br-se,
129
+ prepareMediaVariable(#{$base}-dt-se-br-se, solid)
130
+ );
131
+ border-width: prepareMediaVariable(
132
+ #{$base}-#{$state}-br-wh,
133
+ prepareMediaVariable(#{$base}-dt-se-br-wh, 0)
134
+ );
135
+ border-radius: prepareMediaVariable(
136
+ #{$base}-#{$state}-br-rs,
137
+ prepareMediaVariable(#{$base}-dt-se-br-rs, 4px)
138
+ );
139
+ box-shadow: prepareMediaVariable(
140
+ #{$base}-#{$state}-sw-ae,
141
+ prepareMediaVariable(#{$base}-dt-se-sw-ae, 0 0)
142
+ )
143
+ prepareMediaVariable(#{$base}-#{$state}-sw-br, prepareMediaVariable(#{$base}-dt-se-sw-br, 0))
144
+ prepareMediaVariable(#{$base}-#{$state}-sw-sd, prepareMediaVariable(#{$base}-dt-se-sw-sd, 0))
145
+ prepareMediaVariable(
146
+ #{$base}-#{$state}-sw-cr,
147
+ prepareMediaVariable(#{$base}-dt-se-sw-cr, transparent)
148
+ );
149
+ }
150
+
151
+ [data-div-type="element"] {
152
+ &[data-element-type="categoryGroups"] {
153
+ width: calc(
154
+ 1% *
155
+ var(
156
+ --_ctm-mob-catego-ele-nw-wh-vl,
157
+ var(--_ctm-tab-catego-ele-nw-wh-vl, var(--_ctm-catego-ele-nw-wh-vl, auto))
158
+ )
159
+ );
160
+ margin: var(
161
+ --_ctm-mob-catego-lt-mn,
162
+ var(--_ctm-tab-catego-lt-mn, var(--_ctm-catego-lt-mn, var(--_ctm-lt-mn)))
163
+ );
164
+
165
+ &[data-view-state="full"] {
166
+ & > .wrapper {
167
+ grid-template-rows: auto !important;
168
+ }
169
+ }
170
+ & > div {
171
+ &.wrapper {
172
+ width: 100%;
173
+ min-height: prepareMediaVariable(--_ctm-catego-lt-mn-ht);
174
+ padding: var(
175
+ --_ctm-mob-catego-lt-pg,
176
+ var(--_ctm-tab-catego-lt-pg, var(--_ctm-catego-lt-pg))
177
+ );
178
+
179
+ background-color: prepareMediaVariable(#{$cg-widget}-bd-cr, transparent);
180
+ border-color: prepareMediaVariable(#{$cg-widget}-br-cr, transparent);
181
+ border-style: prepareMediaVariable(#{$cg-widget}-br-se, solid);
182
+ border-width: prepareMediaVariable(#{$cg-widget}-br-wh, 0);
183
+ border-radius: prepareMediaVariable(#{$cg-widget}-br-rs, 0);
184
+ box-shadow: prepareMediaVariable(#{$cg-widget}-sw-ae, 0 0)
185
+ prepareMediaVariable(#{$cg-widget}-sw-br, 0) prepareMediaVariable(#{$cg-widget}-sw-sd, 0)
186
+ prepareMediaVariable(#{$cg-widget}-sw-cr, transparent);
187
+ }
188
+ }
189
+ // The modal-tree wrapper re-applies the element data-attrs (so the scoped
190
+ // tree styles reach it through the portal), which makes it also match the
191
+ // element-level box rules (margin/width). Target it on the SAME element
192
+ // (`&.`) to override those — a descendant selector wouldn't match it.
193
+ &.cg_category_modal_tree {
194
+ width: 100%;
195
+ margin: 0;
196
+ padding: 4px;
197
+ }
198
+ // -------------------------------------------------------------------
199
+ // Fixed two-column layout. Figma tokens are the prepareMediaVariable
200
+ // fallbacks so the design renders correctly before any panel edits.
201
+ // -------------------------------------------------------------------
202
+ .category__groups__element__container {
203
+ display: flex;
204
+ // Widget Style → gap between the left sidebar and the right main section.
205
+ gap: prepareMediaVariable(#{$cg-widget}-im-gp, 36px);
206
+ align-items: flex-start;
207
+ width: 100%;
208
+ }
209
+
210
+ // ---- Mobile (fixed layout): the sidebar tree is replaced by a selector
211
+ // that opens the CategoryTree in a modal; everything stacks vertically.
212
+ .category__groups__element__container.is-mobile {
213
+ flex-direction: column;
214
+ gap: prepareMediaVariable(#{$cg-main}-im-gp, 12px);
215
+
216
+ .cg_main {
217
+ width: 100%;
218
+ }
219
+ }
220
+ .cg_mobile_category_select {
221
+ display: flex;
222
+ flex-direction: row;
223
+ align-items: center;
224
+ justify-content: space-between;
225
+ gap: 12px;
226
+ width: 100%;
227
+ cursor: pointer;
228
+ }
229
+ // Mobile Select-category button (rendered by the shared ButtonComponent as
230
+ // `.btn__with__text`). Styled from the `selectButton` design block — which
231
+ // uses the standard button property suffixes — via the cg-design / cg-font
232
+ // mixins (default + hover), plus the button-specific layout vars.
233
+ .btn__with__text[data-btn-name="selectButton"] {
234
+ display: flex;
235
+ align-items: center;
236
+ flex-direction: var(--_sf-fd-bn, row);
237
+ cursor: pointer;
238
+ width: prepareMediaVariable(#{$cg-select-btn}-dt-se-wh, auto);
239
+ padding: prepareMediaVariable(#{$cg-select-btn}-dt-se-pg, 8px 12px);
240
+ gap: prepareMediaVariable(#{$cg-select-btn}-dt-se-gp, 8px);
241
+ justify-content: prepareMediaVariable(#{$cg-select-btn}-dt-se-at, space-between);
242
+ @include cg-design(#{$cg-select-btn}-dt-se);
243
+
244
+ &[data-icon-position="right"] {
245
+ --_sf-fd-bn: row-reverse;
246
+ }
247
+ &[data-icon-position="left"],
248
+ &[data-icon-position="center"] {
249
+ --_sf-fd-bn: row;
250
+ }
251
+
252
+ .txt {
253
+ // flex: 1;
254
+ min-width: 0;
255
+ overflow: hidden;
256
+ text-overflow: ellipsis;
257
+ white-space: nowrap;
258
+ @include cg-font(#{$cg-select-btn}-dt-se, #002a4e, 14px, 400);
259
+ }
260
+
261
+ .icon {
262
+ display: flex;
263
+ flex-shrink: 0;
264
+ svg {
265
+ width: prepareMediaVariable(#{$cg-select-btn}-dt-se-in-se, 16px);
266
+ height: prepareMediaVariable(#{$cg-select-btn}-dt-se-in-se, 16px);
267
+ path {
268
+ stroke: prepareMediaVariable(#{$cg-select-btn}-dt-se-in-c1, currentColor);
269
+ }
270
+ }
271
+ }
272
+ .icon--hover {
273
+ display: none;
274
+ }
275
+
276
+ &:hover {
277
+ @include cg-design-state($cg-select-btn, hr-se);
278
+ .txt {
279
+ @include cg-font-state($cg-select-btn, hr-se, #002a4e, 14px, 400);
280
+ }
281
+ .icon--hover {
282
+ display: flex;
283
+ }
284
+ }
285
+ // Swap to the hover icon only when one is configured.
286
+ &:hover:has(.icon--hover) .icon--default {
287
+ display: none;
288
+ }
289
+ }
290
+ // Tree rendered inside the (portaled) category modal.
291
+
292
+ // ---- Left sidebar -------------------------------------------------
293
+ .cg_sidebar {
294
+ display: flex;
295
+ flex-direction: column;
296
+ // Sidebar Container → gap (heading ↔ tree) + padding.
297
+ gap: prepareMediaVariable(#{$cg-sidebar}-im-gp, 12px);
298
+ padding: prepareMediaVariable(#{$cg-sidebar}-pg, 0);
299
+ width: 260px;
300
+ flex-shrink: 0;
301
+ background-color: prepareMediaVariable(#{$cg-sidebar}-bd-cr, transparent);
302
+ border-color: prepareMediaVariable(#{$cg-sidebar}-br-cr, transparent);
303
+ border-style: prepareMediaVariable(#{$cg-sidebar}-br-se, solid);
304
+ border-width: prepareMediaVariable(#{$cg-sidebar}-br-wh, 0);
305
+ border-radius: prepareMediaVariable(#{$cg-sidebar}-br-rs, 0);
306
+ box-shadow: prepareMediaVariable(#{$cg-sidebar}-sw-ae, 0 0)
307
+ prepareMediaVariable(#{$cg-sidebar}-sw-br, 0) prepareMediaVariable(#{$cg-sidebar}-sw-sd, 0)
308
+ prepareMediaVariable(#{$cg-sidebar}-sw-cr, transparent);
309
+ }
310
+
311
+ .cg_sidebar_heading {
312
+ white-space: nowrap;
313
+ margin: 0;
314
+ text-transform: uppercase;
315
+ line-height: 1.25;
316
+ @include cg-font($cg-cat-heading, #002a4e, 16px, 400);
317
+ }
318
+ .cg_all_products_heading {
319
+ margin: 0;
320
+ text-transform: uppercase;
321
+ line-height: 1.25;
322
+ @include cg-font($cg-allprod-heading, #002a4e, 24px, 400);
323
+ }
324
+ .cg_subcategory_title {
325
+ margin: 0;
326
+ font-family: "Inter", sans-serif;
327
+ color: #002a4e;
328
+ text-transform: uppercase;
329
+ line-height: 1.25;
330
+ font-size: 16px;
331
+ }
332
+
333
+ .cg_sidebar_divider,
334
+ .cg_main_divider {
335
+ display: block;
336
+ width: 100%;
337
+ // Widget Style → Divider (show toggle + colour + thickness).
338
+ height: prepareMediaVariable(#{$cg-widget}-dr-wh, 1px);
339
+ background: prepareMediaVariable(#{$cg-widget}-dr-cr, #e5e7eb);
340
+ }
341
+ &[data-show-dividers="false"] {
342
+ .cg_sidebar_divider,
343
+ .cg_main_divider,
344
+ .cg_subcategory_divider {
345
+ display: none;
346
+ }
347
+ }
348
+
349
+ .cg_category_tree {
350
+ display: flex;
351
+ flex-direction: column;
352
+ // Gap BETWEEN category rows (Sidebar Container → Category Tree Gap).
353
+ gap: prepareMediaVariable(#{$cg-sidebar}-cy-te-gp, 8px);
354
+ width: 100%;
355
+ }
356
+
357
+ .cg_tree_node {
358
+ display: flex;
359
+ align-items: center;
360
+ // Category Tree Item → item gap (icon ↔ label).
361
+ gap: prepareMediaVariable(#{$cg-tree}-dt-se-im-gp, 4px);
362
+ // Category Tree Item → Layout padding.
363
+ padding: prepareMediaVariable(#{$cg-tree}-dt-se-pg, 4px 0);
364
+ cursor: pointer;
365
+ @include cg-design(#{$cg-tree}-dt-se);
366
+ }
367
+ .cg_tree_node_icon {
368
+ display: flex;
369
+ align-items: center;
370
+ justify-content: center;
371
+ width: 24px;
372
+ height: 24px;
373
+ flex-shrink: 0;
374
+ // Configurable expand/collapse icon colour (inherited by the SVG below).
375
+ color: prepareMediaVariable(#{$cg-tree-icon}-in-c1, #002a4e);
376
+ }
377
+ .cg_chevron {
378
+ display: flex;
379
+ align-items: center;
380
+ justify-content: center;
381
+ transition: transform 0.15s ease;
382
+ color: prepareMediaVariable(#{$cg-tree-icon}-in-c1, #002a4e);
383
+ svg {
384
+ width: prepareMediaVariable(#{$cg-tree-icon}-in-se, 20px);
385
+ height: prepareMediaVariable(#{$cg-tree-icon}-in-se, 20px);
386
+ // Apply the configured colour even when the fetched SVG hardcodes its
387
+ // own stroke/fill (skip parts explicitly set to "none").
388
+ &[stroke]:not([stroke="none"]),
389
+ [stroke]:not([stroke="none"]) {
390
+ stroke: prepareMediaVariable(#{$cg-tree-icon}-in-c1, #002a4e);
391
+ }
392
+ &[fill]:not([fill="none"]),
393
+ [fill]:not([fill="none"]) {
394
+ fill: prepareMediaVariable(#{$cg-tree-icon}-in-c1, #002a4e);
395
+ }
396
+ }
397
+ }
398
+ .cg_chevron.is-open {
399
+ transform: rotate(90deg);
400
+ }
401
+ // Expanded icon uses its own size/colour vars (iconSizeExpanded /
402
+ // iconColorExpanded) so it is independent of the collapsed icon.
403
+ .cg_chevron.is-expanded {
404
+ color: prepareMediaVariable(#{$cg-tree-icon}-in-cr-ed, #002a4e);
405
+ svg {
406
+ width: prepareMediaVariable(#{$cg-tree-icon}-in-se-ed, 20px);
407
+ height: prepareMediaVariable(#{$cg-tree-icon}-in-se-ed, 20px);
408
+ &[stroke]:not([stroke="none"]),
409
+ [stroke]:not([stroke="none"]) {
410
+ stroke: prepareMediaVariable(#{$cg-tree-icon}-in-cr-ed, #002a4e);
411
+ }
412
+ &[fill]:not([fill="none"]),
413
+ [fill]:not([fill="none"]) {
414
+ fill: prepareMediaVariable(#{$cg-tree-icon}-in-cr-ed, #002a4e);
415
+ }
416
+ }
417
+ }
418
+ .cg_tree_node_label {
419
+ flex: 1;
420
+ @include cg-font(#{$cg-tree}-dt-se, #002a4e, 14px, 600);
421
+ }
422
+ .cg_tree_node:hover {
423
+ @include cg-design-state($cg-tree, hr-se);
424
+ }
425
+ .cg_tree_node:hover .cg_tree_node_label {
426
+ @include cg-font-state($cg-tree, hr-se, #002a4e, 14px, 600);
427
+ }
428
+ .cg_tree_node.is-active {
429
+ @include cg-design-state($cg-tree, sd-se);
430
+ }
431
+ .cg_tree_node.is-active .cg_tree_node_label {
432
+ @include cg-font-state($cg-tree, sd-se, #002a4e, 14px, 600);
433
+ }
434
+
435
+ .cg_subtree {
436
+ display: flex;
437
+ flex-direction: column;
438
+ // Gap BETWEEN sub-category rows (Sidebar Container → Sub Category Gap).
439
+ gap: prepareMediaVariable(#{$cg-sidebar}-sb-cy-gp, 8px);
440
+ padding-left: 31px;
441
+ width: 100%;
442
+ }
443
+ .cg_subtree_node {
444
+ // Sub Category Tree Item → Layout padding.
445
+ padding: prepareMediaVariable(#{$cg-subtree}-dt-se-pg, 4px 0);
446
+ cursor: pointer;
447
+ @include cg-design(#{$cg-subtree}-dt-se);
448
+ }
449
+ .cg_subtree_node_label {
450
+ letter-spacing: -0.28px;
451
+ @include cg-font(#{$cg-subtree}-dt-se, #1d1b1c, 14px, 400);
452
+ }
453
+ .cg_subtree_node:hover {
454
+ @include cg-design-state($cg-subtree, hr-se);
455
+ }
456
+ .cg_subtree_node:hover .cg_subtree_node_label {
457
+ @include cg-font-state($cg-subtree, hr-se, #1d1b1c, 14px, 400);
458
+ }
459
+ .cg_subtree_node.is-active {
460
+ @include cg-design-state($cg-subtree, sd-se);
461
+ }
462
+ .cg_subtree_node.is-active .cg_subtree_node_label {
463
+ @include cg-font-state($cg-subtree, sd-se, #1d1b1c, 14px, 400);
464
+ }
465
+
466
+ // ---- Right main ---------------------------------------------------
467
+ // mainSection: container fill/border + gap between heading, breadcrumb,
468
+ // sub-categories and the product grid.
469
+ .cg_main {
470
+ display: flex;
471
+ flex-direction: column;
472
+ gap: prepareMediaVariable(#{$cg-main}-im-gp, 12px);
473
+ padding: prepareMediaVariable(#{$cg-main}-pg, 0);
474
+ flex: 1 0 0;
475
+ min-width: 0;
476
+ @include cg-design($cg-main);
477
+ }
478
+
479
+ // Drill-down breadcrumb (reuses the Breadcrumbs element DOM classes), styled
480
+ // from the breadcrumbDesign panel: breadcrumbItem (default/hover/selected) +
481
+ // separatorIcon. Selected state = the current (last) crumb.
482
+ .cg_breadcrumb {
483
+ width: 100%;
484
+ .horizontal_breadcrumb_wrapper {
485
+ display: inline-flex;
486
+ align-items: center;
487
+ width: 100%;
488
+ // flex-wrap: wrap;
489
+ overflow-x: auto;
490
+ gap: 6px;
491
+ }
492
+ .breadcrumb_item {
493
+ padding: 0 4px;
494
+ display: flex;
495
+ align-items: center;
496
+ gap: 8px;
497
+ white-space: nowrap;
498
+ @include cg-design(#{$cg-bc-item}-dt-se);
499
+ @include cg-font(#{$cg-bc-item}-dt-se, #4b4546, 14px, 400);
500
+ &[data-show-cursor="true"] {
501
+ cursor: pointer;
502
+ }
503
+ &[data-show-cursor="true"]:hover {
504
+ @include cg-design-state($cg-bc-item, hr-se);
505
+ @include cg-font-state($cg-bc-item, hr-se, #4b4546, 14px, 400);
506
+ }
507
+ &:last-of-type {
508
+ @include cg-design-state($cg-bc-item, sd-se);
509
+ @include cg-font-state($cg-bc-item, sd-se, #1d1b1c, 14px, 600);
510
+ }
511
+ }
512
+ // Collapse ("…") button shown when the trail is too deep.
513
+ .collapse_btn {
514
+ display: flex;
515
+ align-items: center;
516
+ padding: 0 4px;
517
+ border: none;
518
+ background: transparent;
519
+ cursor: pointer;
520
+ line-height: 1;
521
+ @include cg-font(#{$cg-bc-item}-dt-se, #4b4546, 16px, 600);
522
+ }
523
+ .separator .icon {
524
+ display: flex;
525
+ svg {
526
+ width: prepareMediaVariable(#{$cg-bc-sep}-in-se, 16px);
527
+ height: prepareMediaVariable(#{$cg-bc-sep}-in-se, 16px);
528
+ path {
529
+ stroke: prepareMediaVariable(#{$cg-bc-sep}-in-c1, #8a8a8a);
530
+ }
531
+ }
532
+ }
533
+ }
534
+
535
+ // Breadcrumb (top) + chip row (bottom) stack vertically.
536
+ .cg_subcategory_scroller {
537
+ display: flex;
538
+ flex-direction: column;
539
+ align-items: stretch;
540
+ // Same gap as the main section so breadcrumb ↔ sub-categories spacing
541
+ // follows the Main Section item gap.
542
+ gap: prepareMediaVariable(#{$cg-main}-im-gp, 12px);
543
+ width: 100%;
544
+ }
545
+ // The horizontal chip row: left arrow + scrolling rail + right arrow.
546
+ .cg_subcategory_row {
547
+ display: flex;
548
+ align-items: center;
549
+ gap: 12px;
550
+ width: 100%;
551
+ }
552
+ .cg_subcategory_divider {
553
+ width: 100%;
554
+ // Widget Style → Divider (colour + thickness), same as the other dividers.
555
+ height: prepareMediaVariable(#{$cg-widget}-dr-wh, 1px);
556
+ background: prepareMediaVariable(#{$cg-widget}-dr-cr, #cbd5e1);
557
+ flex-shrink: 0;
558
+ }
559
+ .cg_scroller_arrow {
560
+ display: flex;
561
+ align-items: center;
562
+ justify-content: center;
563
+ padding: prepareMediaVariable(#{$cg-arrow}-dt-se-pg, 0);
564
+ cursor: pointer;
565
+ flex-shrink: 0;
566
+ // Default state: fill / border / radius / shadow.
567
+ @include cg-design(#{$cg-arrow}-dt-se);
568
+ // Icon colour (in-c1) drives the SVG `currentColor` stroke.
569
+ color: prepareMediaVariable(#{$cg-arrow}-dt-se-in-c1, #002a4e);
570
+ svg {
571
+ width: prepareMediaVariable(#{$cg-arrow}-dt-se-in-se, 20px);
572
+ height: prepareMediaVariable(#{$cg-arrow}-dt-se-in-se, 20px);
573
+ }
574
+ &:hover {
575
+ @include cg-design-state($cg-arrow, hr-se);
576
+ color: prepareMediaVariable(
577
+ #{$cg-arrow}-hr-se-in-c1,
578
+ prepareMediaVariable(#{$cg-arrow}-dt-se-in-c1, #002a4e)
579
+ );
580
+ }
581
+ }
582
+ .cg_chip_rail {
583
+ display: flex;
584
+ align-items: center;
585
+ gap: prepareMediaVariable(#{$cg-scroller-design}-im-gp, 16px);
586
+ flex: 1 0 0;
587
+ min-width: 0;
588
+ overflow-x: auto;
589
+ scrollbar-width: none;
590
+ &::-webkit-scrollbar {
591
+ display: none;
592
+ }
593
+ }
594
+ .cg_chip {
595
+ display: flex;
596
+ align-items: center;
597
+ // Spacing between the chip image and its label (Sub Category Chip item gap).
598
+ gap: prepareMediaVariable(#{$cg-chip}-dt-se-im-gp, 8px);
599
+ cursor: pointer;
600
+ flex-shrink: 0;
601
+ padding: 0;
602
+ @include cg-design(#{$cg-chip}-dt-se);
603
+ }
604
+ .cg_chip_icon {
605
+ display: flex;
606
+ align-items: center;
607
+ justify-content: center;
608
+ width: prepareMediaVariable(#{$cg-chip-image}-wh, 36px);
609
+ height: prepareMediaVariable(#{$cg-chip-image}-ht, 36px);
610
+ padding: prepareMediaVariable(#{$cg-chip-image}-pg, 0);
611
+ flex-shrink: 0;
612
+ overflow: hidden;
613
+ color: #002a4e;
614
+ // Sub Category Image design controls (fill / border / radius / shadow).
615
+ @include cg-design($cg-chip-image);
616
+ img {
617
+ width: 100%;
618
+ height: 100%;
619
+ object-fit: cover;
620
+ transition: transform 0.3s ease-in-out;
621
+ }
622
+ // Image Settings -> On Hover (zoom).
623
+ &[data-on-hover="Zoom In"]:hover img {
624
+ transform: scale(1.08);
625
+ }
626
+ &[data-on-hover="Zoom Out"]:hover img {
627
+ transform: scale(0.92);
628
+ }
629
+ }
630
+ .cg_chip_label {
631
+ padding: 4px 12px;
632
+ white-space: nowrap;
633
+ @include cg-font(#{$cg-chip}-dt-se, #002a4e, 14px, 400);
634
+ }
635
+ .cg_chip:hover {
636
+ @include cg-design-state($cg-chip, hr-se);
637
+ }
638
+ .cg_chip:hover .cg_chip_label {
639
+ @include cg-font-state($cg-chip, hr-se, #002a4e, 14px, 400);
640
+ }
641
+ .cg_chip.is-active {
642
+ @include cg-design-state($cg-chip, sd-se);
643
+ }
644
+ .cg_chip.is-active .cg_chip_label {
645
+ @include cg-font-state($cg-chip, sd-se, #002a4e, 14px, 400);
646
+ }
647
+
648
+ // ---- Product grid -------------------------------------------------
649
+ // Container box only. Display modes (grid / cards / slider) + gaps live in
650
+ // category-groups-product-grid.scss (imported below).
651
+ .cg_product_grid {
652
+ width: 100%;
653
+ position: relative;
654
+ padding: prepareMediaVariable(#{$cg-grid}-lt-pg, 0);
655
+ // Grid container fill / border / radius / shadow.
656
+ @include cg-design(#{$cg-grid}-lt);
657
+ }
658
+ // Display styles (Grid / Cards / Slider) for the product grid.
659
+ @import "./category-groups-product-grid.scss";
660
+ .cg_product_card {
661
+ display: flex;
662
+ flex-direction: column;
663
+ gap: prepareMediaVariable(#{$cg-card}-dt-se-im-gp, 16px);
664
+ padding: prepareMediaVariable(#{$cg-card}-dt-se-pg, 0);
665
+ position: relative;
666
+ min-width: 0;
667
+ @include cg-design(#{$cg-card}-dt-se);
668
+ }
669
+ .cg_product_card:hover {
670
+ @include cg-design-state($cg-card, hr-se);
671
+ }
672
+ .cg_product_image_wrapper {
673
+ position: relative;
674
+ width: 100%;
675
+ overflow: hidden;
676
+
677
+ // Gallery / zoom / thumbnail styling for the embedded ProductImageContent,
678
+ // rebound to the Category Groups productImage CSS-variable paths.
679
+ @import "./category-groups-product-image.scss";
680
+ }
681
+ // Fallback image (rendered only when the Product Image setting is absent).
682
+ .cg_product_image {
683
+ display: block;
684
+ width: 100%;
685
+ height: 400px;
686
+ object-fit: cover;
687
+ }
688
+ .cg_product_info {
689
+ display: flex;
690
+ flex-direction: column;
691
+ // Product Card → content gap (between brand / name / price / options).
692
+ gap: prepareMediaVariable(#{$cg-card}-dt-se-ct-gp, 12px);
693
+ }
694
+ .cg_brand_name {
695
+ margin: 0;
696
+ @include cg-font($cg-brand, #737373, 14px, 400);
697
+ // Text overflow toggle + max lines (Brand Name design controls).
698
+ &.flex__overflow {
699
+ @include restrictToLinesShow(#{var(--_sf-line-clamp, 1)});
700
+ }
701
+ }
702
+ .cg_product_name {
703
+ margin: 0;
704
+ letter-spacing: -0.32px;
705
+ @include cg-font($cg-name, #0a3355, 16px, 600);
706
+ // Text overflow toggle + max lines (Product Name design controls).
707
+ &.flex__overflow {
708
+ @include restrictToLinesShow(#{var(--_sf-line-clamp, 1)});
709
+ }
710
+ }
711
+ .cg_product_price {
712
+ margin: 0;
713
+ display: flex;
714
+ align-items: center;
715
+ gap: 6px;
716
+ @include cg-font($cg-price, #000, 16px, 800);
717
+ }
718
+ .cg_variants_text {
719
+ margin: 0;
720
+ @include cg-font($cg-variants, #737373, 14px, 400);
721
+ }
722
+
723
+ @import "./category-groups-product-options.scss";
724
+
725
+ // Price styling for the embedded ProductPriceContent, rebound to the Category
726
+ // Groups productPrice CSS-variable paths.
727
+ @import "./category-groups-product-price.scss";
728
+
729
+ // Quota details styling for the embedded QuotaDetailsContent, rebound to the
730
+ // Category Groups quotaDetails CSS-variable paths.
731
+ @import "./category-groups-quota-details.scss";
732
+
733
+ .loading_view {
734
+ width: 100%;
735
+ display: flex;
736
+ justify-content: center;
737
+ }
738
+ }
739
+ }