@sc-360-v2/storefront-cms-library 0.5.70 → 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 (155) 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/image-for-product.scss +21 -21
  66. package/dist/image-temp.scss +203 -203
  67. package/dist/item-stock.scss +93 -93
  68. package/dist/kitDetails.scss +5739 -5739
  69. package/dist/kits.scss +305 -305
  70. package/dist/language-selector.scss +948 -948
  71. package/dist/last-x-orders.scss +285 -285
  72. package/dist/layouter-item.scss +141 -141
  73. package/dist/layouter-pro-item.scss +139 -139
  74. package/dist/layouter-pro.scss +134 -134
  75. package/dist/layouter.scss +491 -491
  76. package/dist/light-box-v2.scss +155 -155
  77. package/dist/lightbox.scss +78 -78
  78. package/dist/loader.scss +37 -37
  79. package/dist/login.scss +29 -11
  80. package/dist/map.scss +1359 -1359
  81. package/dist/marchandiserSets.scss +141 -141
  82. package/dist/mega-menu-container.scss +152 -152
  83. package/dist/menu-item.scss +19 -19
  84. package/dist/menu-v2.scss +999 -999
  85. package/dist/menu.scss +174 -174
  86. package/dist/multi-select-dropdown.scss +316 -316
  87. package/dist/my-templates.scss +477 -477
  88. package/dist/my-wishlist.scss +27 -27
  89. package/dist/option-bar.scss +886 -886
  90. package/dist/order-processing.scss +61 -61
  91. package/dist/order-status.scss +2187 -2187
  92. package/dist/overflow-module.scss +63 -63
  93. package/dist/past-orders.scss +1039 -1039
  94. package/dist/payment-methods.scss +307 -307
  95. package/dist/phone-input.scss +208 -208
  96. package/dist/pickup-locations.scss +1359 -1359
  97. package/dist/position-module.scss +95 -95
  98. package/dist/prefix-list.scss +86 -86
  99. package/dist/product-actions.scss +2872 -2872
  100. package/dist/product-basic-elements.scss +600 -600
  101. package/dist/product-customizations.scss +155 -155
  102. package/dist/product-highlights.scss +348 -348
  103. package/dist/product-image-allocation.scss +1477 -1477
  104. package/dist/product-inventory.scss +1621 -1621
  105. package/dist/product-labels.scss +265 -265
  106. package/dist/product-options.scss +1444 -1444
  107. package/dist/product-price.scss +3392 -3392
  108. package/dist/product-promotions.scss +3224 -3224
  109. package/dist/product-sizechart.scss +1921 -1921
  110. package/dist/product.scss +140 -140
  111. package/dist/profile.scss +824 -824
  112. package/dist/quantity-selector.scss +1074 -1074
  113. package/dist/quick-inventory-check.scss +285 -285
  114. package/dist/quick-links.scss +627 -627
  115. package/dist/quota-details.scss +526 -526
  116. package/dist/quotes.scss +847 -847
  117. package/dist/repeater-embla-controls.scss +211 -211
  118. package/dist/repeater-grid-toggle.scss +206 -206
  119. package/dist/repeater-item.scss +152 -152
  120. package/dist/repeater.scss +946 -946
  121. package/dist/request-for-quotes.scss +841 -841
  122. package/dist/responsive-behaviour.scss +29 -29
  123. package/dist/rfqs.scss +861 -861
  124. package/dist/scroll.scss +414 -414
  125. package/dist/search-results-heading.scss +309 -309
  126. package/dist/search.scss +689 -689
  127. package/dist/section.scss +276 -276
  128. package/dist/shareCartSideBar.scss +254 -254
  129. package/dist/shipping-estimator.scss +41 -41
  130. package/dist/shipping-payments.scss +2518 -2518
  131. package/dist/simple-list.scss +338 -338
  132. package/dist/skeleton.scss +64 -64
  133. package/dist/spotlight.scss +1706 -1706
  134. package/dist/stack.scss +171 -171
  135. package/dist/static-global.scss +292 -292
  136. package/dist/static-text.scss +52 -52
  137. package/dist/stockStatus.scss +70 -70
  138. package/dist/store-locations.scss +1592 -1592
  139. package/dist/sub-category.scss +74 -74
  140. package/dist/submit-quote.scss +275 -275
  141. package/dist/tab-container-item.scss +80 -80
  142. package/dist/tab-container.scss +141 -141
  143. package/dist/table.scss +9 -0
  144. package/dist/tabs.scss +440 -440
  145. package/dist/text-temp.scss +109 -109
  146. package/dist/theme-classes.scss +421 -421
  147. package/dist/toaster.scss +392 -392
  148. package/dist/toggle-button.scss +32 -32
  149. package/dist/transform-properties-module.scss +20 -20
  150. package/dist/types/builder/tools/element-edit/login.d.ts +1 -0
  151. package/dist/types/builder/tools/element-edit/resetPassword.d.ts +1 -0
  152. package/dist/user-elements.scss +2896 -2896
  153. package/dist/widget.scss +153 -153
  154. package/dist/wishlist-overlay.scss +48 -48
  155. 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
+ }