@sc-360-v2/storefront-cms-library 0.5.69 → 0.5.71

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 (158) 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/bundleCategories.scss +301 -301
  16. package/dist/bundleDetails.scss +6189 -6189
  17. package/dist/buy-for-tab-container.scss +141 -141
  18. package/dist/buy-for-tab.scss +649 -649
  19. package/dist/buy-for-tabs-container-item.scss +80 -80
  20. package/dist/buyForPopup.scss +339 -339
  21. package/dist/cart-details.scss +3986 -3986
  22. package/dist/cart-products-sidebar.scss +211 -211
  23. package/dist/cart-summary.scss +2826 -2826
  24. package/dist/cart-wrapper.scss +127 -127
  25. package/dist/cartAttributes.scss +1422 -1422
  26. package/dist/cartDropdownOverlay.scss +653 -653
  27. package/dist/cartGrouping.scss +89 -89
  28. package/dist/category-groups-element.scss +739 -739
  29. package/dist/category-groups-quota-details.scss +626 -626
  30. package/dist/category.scss +137 -137
  31. package/dist/categoryDetails.scss +61 -61
  32. package/dist/categoryWidget.scss +34 -34
  33. package/dist/checkbox-radio.scss +124 -124
  34. package/dist/code-temp.scss +59 -59
  35. package/dist/colorpicker_v2.scss +62 -62
  36. package/dist/common-element.scss +35 -35
  37. package/dist/confirm-modal.scss +370 -370
  38. package/dist/confirmationModal.scss +139 -139
  39. package/dist/contact-us.scss +105 -105
  40. package/dist/container.scss +168 -168
  41. package/dist/countdown.scss +899 -899
  42. package/dist/coupon.scss +1519 -1519
  43. package/dist/custom-fonts.scss +100 -100
  44. package/dist/customization-tree.scss +162 -162
  45. package/dist/default-dropdown.scss +259 -259
  46. package/dist/dropdownTemplate.scss +699 -699
  47. package/dist/editCartItem.scss +110 -110
  48. package/dist/embed-temp.scss +73 -73
  49. package/dist/embroider-preview-element.scss +94 -94
  50. package/dist/embroider-template-1-v2.scss +1105 -1105
  51. package/dist/embroider-template-1.scss +501 -501
  52. package/dist/embroidery.scss +247 -247
  53. package/dist/employee-bulk-order.scss +4060 -4060
  54. package/dist/emtpy-templates.scss +165 -165
  55. package/dist/faq.scss +696 -696
  56. package/dist/fb-dropdown.scss +135 -135
  57. package/dist/filter-results.scss +361 -361
  58. package/dist/filters.scss +3040 -3040
  59. package/dist/flex-text-editor.scss +271 -271
  60. package/dist/form-preview.scss +530 -530
  61. package/dist/gallery-slider-temp.scss +1776 -1776
  62. package/dist/global-styles.scss +198 -198
  63. package/dist/grid.scss +169 -169
  64. package/dist/icon-library.scss +78 -78
  65. package/dist/icon-list.scss +39 -0
  66. package/dist/image-for-product.scss +21 -21
  67. package/dist/image-temp.scss +203 -203
  68. package/dist/item-stock.scss +93 -93
  69. package/dist/kitDetails.scss +5739 -5739
  70. package/dist/kits.scss +305 -305
  71. package/dist/language-selector.scss +948 -948
  72. package/dist/last-x-orders.scss +285 -285
  73. package/dist/layouter-item.scss +141 -141
  74. package/dist/layouter-pro-item.scss +139 -139
  75. package/dist/layouter-pro.scss +134 -134
  76. package/dist/layouter.scss +491 -491
  77. package/dist/light-box-v2.scss +155 -155
  78. package/dist/lightbox.scss +78 -78
  79. package/dist/loader.scss +37 -37
  80. package/dist/login.scss +29 -11
  81. package/dist/map.scss +1359 -1359
  82. package/dist/marchandiserSets.scss +141 -141
  83. package/dist/mega-menu-container.scss +152 -152
  84. package/dist/menu-item.scss +19 -19
  85. package/dist/menu-v2.scss +999 -999
  86. package/dist/menu.scss +174 -174
  87. package/dist/multi-select-dropdown.scss +316 -316
  88. package/dist/my-templates.scss +477 -477
  89. package/dist/my-wishlist.scss +27 -27
  90. package/dist/option-bar.scss +886 -886
  91. package/dist/order-processing.scss +61 -61
  92. package/dist/order-status.scss +2187 -2187
  93. package/dist/overflow-module.scss +63 -63
  94. package/dist/past-orders.scss +1039 -1039
  95. package/dist/payment-methods.scss +307 -307
  96. package/dist/phone-input.scss +208 -208
  97. package/dist/pickup-locations.scss +1359 -1359
  98. package/dist/position-module.scss +95 -95
  99. package/dist/prefix-list.scss +86 -86
  100. package/dist/product-actions.scss +2872 -2872
  101. package/dist/product-basic-elements.scss +600 -600
  102. package/dist/product-customizations.scss +155 -155
  103. package/dist/product-highlights.scss +348 -348
  104. package/dist/product-image-allocation.scss +1477 -1477
  105. package/dist/product-inventory.scss +1621 -1621
  106. package/dist/product-labels.scss +265 -265
  107. package/dist/product-options.scss +1444 -1444
  108. package/dist/product-price.scss +4 -0
  109. package/dist/product-promotions.scss +3224 -3224
  110. package/dist/product-sizechart.scss +1921 -1921
  111. package/dist/product.scss +140 -140
  112. package/dist/profile.scss +824 -824
  113. package/dist/quantity-selector.scss +1074 -1074
  114. package/dist/quick-inventory-check.scss +285 -285
  115. package/dist/quick-links.scss +627 -627
  116. package/dist/quota-details.scss +526 -526
  117. package/dist/quotes.scss +847 -847
  118. package/dist/repeater-embla-controls.scss +211 -211
  119. package/dist/repeater-grid-toggle.scss +206 -206
  120. package/dist/repeater-item.scss +152 -152
  121. package/dist/repeater.scss +946 -946
  122. package/dist/request-for-quotes.scss +841 -841
  123. package/dist/responsive-behaviour.scss +29 -29
  124. package/dist/rfqs.scss +861 -861
  125. package/dist/scroll.scss +414 -414
  126. package/dist/search-results-heading.scss +309 -309
  127. package/dist/search.scss +689 -689
  128. package/dist/section.scss +276 -276
  129. package/dist/shareCartSideBar.scss +254 -254
  130. package/dist/shipping-estimator.scss +41 -41
  131. package/dist/shipping-payments.scss +2518 -2518
  132. package/dist/simple-list.scss +338 -338
  133. package/dist/skeleton.scss +64 -64
  134. package/dist/spotlight.scss +1706 -1706
  135. package/dist/stack.scss +171 -171
  136. package/dist/static-global.scss +292 -292
  137. package/dist/static-text.scss +52 -52
  138. package/dist/stockStatus.scss +70 -70
  139. package/dist/store-locations.scss +1592 -1592
  140. package/dist/sub-category.scss +74 -74
  141. package/dist/submit-quote.scss +275 -275
  142. package/dist/tab-container-item.scss +80 -80
  143. package/dist/tab-container.scss +141 -141
  144. package/dist/table.scss +9 -0
  145. package/dist/tabs.scss +440 -440
  146. package/dist/text-temp.scss +109 -109
  147. package/dist/theme-classes.scss +421 -421
  148. package/dist/toaster.scss +392 -392
  149. package/dist/toggle-button.scss +32 -32
  150. package/dist/transform-properties-module.scss +20 -20
  151. package/dist/types/builder/tools/element-edit/icon-list.d.ts +5 -0
  152. package/dist/types/builder/tools/element-edit/login.d.ts +1 -0
  153. package/dist/types/builder/tools/element-edit/resetPassword.d.ts +1 -0
  154. package/dist/types/builder/tools/element-edit/userElements.d.ts +99 -0
  155. package/dist/user-elements.scss +2896 -2911
  156. package/dist/widget.scss +153 -153
  157. package/dist/wishlist-overlay.scss +48 -48
  158. 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
+ }