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

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 (128) hide show
  1. package/dist/add-existing-form.scss +13 -5
  2. package/dist/add-order.scss +126 -236
  3. package/dist/add-products-tab-details.scss +1048 -2097
  4. package/dist/add-products-tab.scss +666 -1204
  5. package/dist/allocation-header-quota-details.scss +189 -407
  6. package/dist/allocationDetails.scss +1661 -2143
  7. package/dist/allocations-quota-details.scss +159 -323
  8. package/dist/allocations.scss +475 -793
  9. package/dist/amount-estimator.scss +405 -743
  10. package/dist/badge.scss +43 -18
  11. package/dist/brand-basic-elements.scss +76 -124
  12. package/dist/brand.scss +28 -55
  13. package/dist/breadcrumbs.scss +356 -718
  14. package/dist/builder.js +1 -1
  15. package/dist/bulk-variant-picker.scss +1128 -2027
  16. package/dist/bundle.scss +841 -1477
  17. package/dist/bundleCategories.scss +301 -301
  18. package/dist/bundleDetails.scss +3774 -5072
  19. package/dist/button.scss +79 -103
  20. package/dist/buy-for-tab-container.scss +77 -106
  21. package/dist/buyForHeaders.scss +1722 -2976
  22. package/dist/cart-details.scss +481 -1012
  23. package/dist/cart-summary.scss +2234 -2826
  24. package/dist/cart-wrapper.scss +37 -79
  25. package/dist/cart.scss +117 -225
  26. package/dist/cartAttributes.scss +1103 -1422
  27. package/dist/category-groups-element.scss +127 -108
  28. package/dist/category-groups-product-grid.scss +120 -147
  29. package/dist/category-groups-product-image.scss +1162 -1457
  30. package/dist/category-groups-product-options.scss +613 -680
  31. package/dist/category-groups-product-price.scss +1966 -3244
  32. package/dist/category-groups-quota-details.scss +210 -464
  33. package/dist/category.scss +26 -50
  34. package/dist/checkout.scss +24 -16
  35. package/dist/confirm-modal.scss +22 -2
  36. package/dist/container.scss +32 -54
  37. package/dist/countdown.scss +711 -899
  38. package/dist/coupon.scss +1160 -1519
  39. package/dist/default-dropdown.scss +12 -1
  40. package/dist/embroider-template-1-v2.scss +123 -172
  41. package/dist/embroider-template-1.scss +68 -104
  42. package/dist/embroidery.scss +30 -31
  43. package/dist/employee-bulk-order.scss +418 -142
  44. package/dist/faq.scss +228 -408
  45. package/dist/filter-results.scss +125 -265
  46. package/dist/filters.scss +2143 -3040
  47. package/dist/gallery-slider-temp.scss +1458 -1776
  48. package/dist/global-styles.scss +218 -198
  49. package/dist/grid.scss +25 -33
  50. package/dist/hotspot.scss +68 -115
  51. package/dist/image-temp.scss +21 -20
  52. package/dist/item-stock.scss +9 -16
  53. package/dist/kitDetails.scss +2719 -4299
  54. package/dist/kits.scss +24 -19
  55. package/dist/language-selector.scss +211 -361
  56. package/dist/last-x-orders.scss +95 -174
  57. package/dist/layouter-item.scss +75 -103
  58. package/dist/layouter-pro-item.scss +89 -95
  59. package/dist/layouter-pro.scss +87 -92
  60. package/dist/layouter.scss +383 -445
  61. package/dist/light-box-v2.scss +89 -104
  62. package/dist/login.scss +287 -566
  63. package/dist/map.scss +1212 -1359
  64. package/dist/marchandiserSets.scss +95 -104
  65. package/dist/mega-menu-container.scss +96 -109
  66. package/dist/mega-menu.scss +624 -731
  67. package/dist/menu-item.scss +2 -2
  68. package/dist/menu-v2.scss +507 -619
  69. package/dist/multi-select-dropdown.scss +27 -3
  70. package/dist/my-templates.scss +38 -9
  71. package/dist/option-bar.scss +215 -375
  72. package/dist/order-status.scss +1790 -2187
  73. package/dist/overflow-module.scss +6 -7
  74. package/dist/past-orders.scss +118 -149
  75. package/dist/payment-methods.scss +46 -30
  76. package/dist/pickup-locations.scss +558 -1118
  77. package/dist/position-module.scss +20 -17
  78. package/dist/prefix-list.scss +21 -10
  79. package/dist/product-actions.scss +1750 -2055
  80. package/dist/product-basic-elements.scss +108 -169
  81. package/dist/product-highlights.scss +303 -348
  82. package/dist/product-image-allocation.scss +1477 -1477
  83. package/dist/product-image-bundles.scss +337 -642
  84. package/dist/product-inventory.scss +673 -1357
  85. package/dist/product-labels.scss +84 -105
  86. package/dist/product-options.scss +1287 -1444
  87. package/dist/product-price.scss +1283 -2561
  88. package/dist/product-promotions.scss +1388 -2830
  89. package/dist/product-sizechart.scss +516 -905
  90. package/dist/product.scss +28 -61
  91. package/dist/productDetails.scss +19 -39
  92. package/dist/profile.scss +207 -447
  93. package/dist/quantity-selector.scss +837 -1074
  94. package/dist/quick-inventory-check.scss +95 -174
  95. package/dist/quick-links.scss +55 -133
  96. package/dist/quick-order-pad.scss +218 -271
  97. package/dist/quota-details.scss +152 -282
  98. package/dist/quotes.scss +814 -847
  99. package/dist/repeater-embla-controls.scss +35 -15
  100. package/dist/repeater-grid-toggle.scss +156 -166
  101. package/dist/repeater-item.scss +41 -64
  102. package/dist/repeater.scss +671 -814
  103. package/dist/request-for-quotes.scss +66 -16
  104. package/dist/responsive-behaviour.scss +3 -1
  105. package/dist/rfqs.scss +118 -181
  106. package/dist/scroll.scss +93 -172
  107. package/dist/search-results-heading.scss +309 -309
  108. package/dist/search.scss +179 -326
  109. package/dist/section.scss +27 -51
  110. package/dist/shipping-payments.scss +198 -58
  111. package/dist/simple-list.scss +74 -164
  112. package/dist/social.scss +80 -145
  113. package/dist/sort.scss +168 -176
  114. package/dist/stack.scss +23 -34
  115. package/dist/static-global.scss +44 -26
  116. package/dist/stockStatus.scss +11 -19
  117. package/dist/store-locations.scss +577 -1105
  118. package/dist/tab-container.scss +81 -108
  119. package/dist/table-common.scss +217 -408
  120. package/dist/table.scss +271 -502
  121. package/dist/text-temp.scss +8 -7
  122. package/dist/theme-classes.scss +17 -13
  123. package/dist/uom-selector.scss +489 -949
  124. package/dist/user-elements.scss +2588 -2896
  125. package/dist/variant-picker.scss +1281 -2555
  126. package/dist/volume-pricing.scss +541 -1037
  127. package/dist/widget.scss +153 -153
  128. package/package.json +1 -1
@@ -1,301 +1,301 @@
1
- /**
2
- * Bundle Categories — the category strip above a bundle's product list.
3
- *
4
- * Mirrors the category tabs in the Bundle Details element: a horizontal row of
5
- * cards, each with the category's image, its name, how many products it holds
6
- * and how many are selected. The row is an Embla carousel, so the slides are
7
- * laid out by the carousel and only the card itself is styled here.
8
- */
9
- [data-div-type="element"] {
10
- &[data-element-type="bundleCategories"] {
11
- // The builder writes width/height/margin/padding as --_ctm-* custom properties
12
- // rather than as plain CSS. Without consuming them the Layout panel appears to
13
- // do nothing — which is exactly how this element behaved.
14
- //
15
- // `--_sf-nw-wh` closes the chain: it is the width the element emits itself
16
- // while a resize drag is in flight, before the percentage is committed.
17
- width: var(
18
- --_sf-el-wh-st-mx,
19
- calc(
20
- 1% *
21
- var(
22
- --_ctm-mob-ele-nw-wh-vl,
23
- var(--_ctm-tab-ele-nw-wh-vl, var(--_ctm-ele-nw-wh-vl, var(--_sf-nw-wh)))
24
- )
25
- )
26
- );
27
- margin: var(--_ctm-mob-lt-mn, var(--_ctm-tab-lt-mn, var(--_ctm-lt-mn, 0)));
28
- padding: var(--_ctm-mob-lt-pg, var(--_ctm-tab-lt-pg, var(--_ctm-lt-pg, 0)));
29
-
30
- // Show Border / Show Shadow are CONTROLS, not CSS, so the builder never turns
31
- // them into `--_ctm-*` variables — the element surfaces them as data
32
- // attributes and the gates below read those.
33
- &[data-show-border="false"] > .wrapper {
34
- border-style: none;
35
- }
36
-
37
- // A gate of its own rather than the shared `--_show-shadow`: custom properties
38
- // inherit, so a parent whose shadow is switched off would silently clear this
39
- // element's too.
40
- &[data-show-shadow="false"] {
41
- --_sf-bc-show-shadow: none;
42
- }
43
-
44
- // Background type is chosen in the Design tab and written onto the element as
45
- // `data-background-type`; gradients add `data-gradient-type`. Both are gated
46
- // exactly as the repeater item gates them, and like it the painted surface is
47
- // the wrapper rather than the root — the root carries the builder's own
48
- // `#<id>` rule and cannot be overridden from this stylesheet.
49
- &[data-background-type="color"] > .wrapper {
50
- background-color: var(--_ctm-mob-dn-bd-cr, var(--_ctm-tab-dn-bd-cr, var(--_ctm-dn-bd-cr)));
51
- }
52
-
53
- &[data-background-type="image"] > .wrapper {
54
- background-image: var(--_ctm-mob-dn-bd-ie, var(--_ctm-tab-dn-bd-ie, var(--_ctm-dn-bd-ie)));
55
- }
56
-
57
- &[data-background-type="gradient"] > .wrapper {
58
- --_sf-bc-gradient-angle: calc(
59
- var(--_ctm-mob-dn-gt-ae, var(--_ctm-tab-dn-gt-ae, var(--_ctm-dn-gt-ae, 90))) * 1deg
60
- );
61
- --_sf-bc-gradient-start-color: var(
62
- --_ctm-mob-dn-gt-st-cr,
63
- var(--_ctm-tab-dn-gt-st-cr, var(--_ctm-dn-gt-st-cr, transparent))
64
- );
65
- --_sf-bc-gradient-start-position: calc(
66
- var(--_ctm-mob-dn-gt-st-pn, var(--_ctm-tab-dn-gt-st-pn, var(--_ctm-dn-gt-st-pn, 0))) * 1%
67
- );
68
- --_sf-bc-gradient-end-color: var(
69
- --_ctm-mob-dn-gt-ed-cr,
70
- var(--_ctm-tab-dn-gt-ed-cr, var(--_ctm-dn-gt-ed-cr, transparent))
71
- );
72
- --_sf-bc-gradient-end-position: calc(
73
- var(--_ctm-mob-dn-gt-ed-pn, var(--_ctm-tab-dn-gt-ed-pn, var(--_ctm-dn-gt-ed-pn, 100))) * 1%
74
- );
75
- --_sf-bc-gradient-position: var(
76
- --_ctm-mob-dn-gt-pn,
77
- var(--_ctm-tab-dn-gt-pn, var(--_ctm-dn-gt-pn, center))
78
- );
79
- }
80
-
81
- &[data-gradient-type="Linear Gradient"] > .wrapper {
82
- background-image: linear-gradient(
83
- var(--_sf-bc-gradient-angle),
84
- var(--_sf-bc-gradient-start-color) var(--_sf-bc-gradient-start-position),
85
- var(--_sf-bc-gradient-end-color) var(--_sf-bc-gradient-end-position)
86
- );
87
- }
88
-
89
- &[data-gradient-type="Radial Gradient"] > .wrapper {
90
- background-image: radial-gradient(
91
- circle at var(--_sf-bc-gradient-position),
92
- var(--_sf-bc-gradient-start-color) var(--_sf-bc-gradient-start-position),
93
- var(--_sf-bc-gradient-end-color) var(--_sf-bc-gradient-end-position)
94
- );
95
- }
96
- background-position: var(--_ctm-mob-dn-bd-pn, var(--_ctm-tab-dn-bd-pn, var(--_ctm-dn-bd-pn)));
97
- background-repeat: var(--_ctm-mob-dn-bd-rt, var(--_ctm-tab-dn-bd-rt, var(--_ctm-dn-bd-rt)));
98
- background-size: var(--_ctm-mob-dn-bd-se, var(--_ctm-tab-dn-bd-se, var(--_ctm-dn-bd-se)));
99
-
100
- border-color: var(--_ctm-mob-dn-br-cr, var(--_ctm-tab-dn-br-cr, var(--_ctm-dn-br-cr)));
101
- border-style: var(--_ctm-mob-dn-br-se, var(--_ctm-tab-dn-br-se, var(--_ctm-dn-br-se)));
102
- border-width: var(--_ctm-mob-dn-br-wh, var(--_ctm-tab-dn-br-wh, var(--_ctm-dn-br-wh)));
103
- border-radius: var(--_ctm-mob-dn-br-rs, var(--_ctm-tab-dn-br-rs, var(--_ctm-dn-br-rs)));
104
-
105
- // Show Border / Show Shadow are CONTROLS, not CSS, so they never become
106
- // variables — the element surfaces them as data attributes instead.
107
- &[data-show-border="false"] {
108
- border-style: none;
109
- }
110
-
111
- // A gate of its own rather than the shared `--_show-shadow`: custom properties
112
- // inherit, so a parent whose shadow is switched off would silently clear this
113
- // element's too.
114
- &[data-show-shadow="false"] {
115
- --_sf-bc-show-shadow: none;
116
- }
117
-
118
- // Per-part fallbacks: without them one unset part invalidates the whole
119
- // `box-shadow` at computed-value time and it resolves to `none`.
120
- box-shadow: var(
121
- --_sf-bc-show-shadow,
122
- var(--_ctm-mob-dn-sw-ae, var(--_ctm-tab-dn-sw-ae, var(--_ctm-dn-sw-ae, 0)))
123
- var(--_ctm-mob-dn-sw-br, var(--_ctm-tab-dn-sw-br, var(--_ctm-dn-sw-br, 0)))
124
- var(--_ctm-mob-dn-sw-sd, var(--_ctm-tab-dn-sw-sd, var(--_ctm-dn-sw-sd, 0)))
125
- var(--_ctm-mob-dn-sw-cr, var(--_ctm-tab-dn-sw-cr, var(--_ctm-dn-sw-cr, transparent)))
126
- );
127
-
128
- // Height goes on the wrapper, not here: the builder emits the element's own
129
- // default styles as `#<id>{ height: auto }`, and an id selector outranks this
130
- // stylesheet — so a height set here could never win and the top/bottom resize
131
- // handles moved nothing. The wrapper is outside that rule's reach.
132
- > .wrapper {
133
- width: 100%;
134
- height: var(--_ctm-mob-lt-ht, var(--_ctm-tab-lt-ht, var(--_ctm-lt-ht, 100%))) !important;
135
-
136
- // Border, radius and shadow ride on the wrapper alongside the background so
137
- // the whole painted surface is one box.
138
- border-color: var(--_ctm-mob-dn-br-cr, var(--_ctm-tab-dn-br-cr, var(--_ctm-dn-br-cr)));
139
- border-style: var(--_ctm-mob-dn-br-se, var(--_ctm-tab-dn-br-se, var(--_ctm-dn-br-se)));
140
- border-width: var(--_ctm-mob-dn-br-wh, var(--_ctm-tab-dn-br-wh, var(--_ctm-dn-br-wh)));
141
- border-radius: var(--_ctm-mob-dn-br-rs, var(--_ctm-tab-dn-br-rs, var(--_ctm-dn-br-rs)));
142
-
143
- background-repeat: var(--_ctm-mob-dn-bd-rt, var(--_ctm-tab-dn-bd-rt, var(--_ctm-dn-bd-rt)));
144
- background-size: var(--_ctm-mob-dn-bd-se, var(--_ctm-tab-dn-bd-se, var(--_ctm-dn-bd-se)));
145
- background-attachment: var(
146
- --_ctm-mob-dn-bd-at,
147
- var(--_ctm-tab-dn-bd-at, var(--_ctm-dn-bd-at))
148
- );
149
- // Position is stored as separate X and Y values, not one shorthand.
150
- background-position: var(
151
- --_ctm-mob-dn-bd-pn-x,
152
- var(--_ctm-tab-dn-bd-pn-x, var(--_ctm-dn-bd-pn-x, center))
153
- )
154
- var(--_ctm-mob-dn-bd-pn-y, var(--_ctm-tab-dn-bd-pn-y, var(--_ctm-dn-bd-pn-y, center)));
155
-
156
- // Per-part fallbacks: without them one unset part invalidates the whole
157
- // `box-shadow` at computed-value time and it resolves to `none`.
158
- box-shadow: var(
159
- --_sf-bc-show-shadow,
160
- var(--_ctm-mob-dn-sw-ae, var(--_ctm-tab-dn-sw-ae, var(--_ctm-dn-sw-ae, 0)))
161
- var(--_ctm-mob-dn-sw-br, var(--_ctm-tab-dn-sw-br, var(--_ctm-dn-sw-br, 0)))
162
- var(--_ctm-mob-dn-sw-sd, var(--_ctm-tab-dn-sw-sd, var(--_ctm-dn-sw-sd, 0)))
163
- var(--_ctm-mob-dn-sw-cr, var(--_ctm-tab-dn-sw-cr, var(--_ctm-dn-sw-cr, transparent)))
164
- );
165
- }
166
-
167
- // Bundle name above the strip, matching the heading Bundle Details prints.
168
- .bundle__name {
169
- margin: 0 0 12px;
170
- font-size: 18px;
171
- font-weight: 600;
172
- }
173
-
174
- .bundle__categories {
175
- width: 100%;
176
-
177
- // Embla's own classes. The container has to be an explicit row — otherwise
178
- // the slides stack — and each slide needs a width of its own, or it
179
- // collapses to the widest word and the labels wrap per character.
180
- .embla__container {
181
- display: flex;
182
- flex-direction: row;
183
- }
184
-
185
- .embla__slide {
186
- flex: 0 0 auto;
187
- min-width: 240px;
188
- }
189
-
190
- // Arrow placement is driven by the carousel's control position, which the
191
- // shared EmblaCarouselBasic stamps onto `.embla` as `data-control-type`.
192
- // In "Side" mode — the default this element passes — it renders the two
193
- // buttons as bare children of `.embla` with no wrapper, so an earlier rule
194
- // written against an `.arrow-navigation` wrapper never matched and the
195
- // arrows stacked above and below the strip.
196
- //
197
- // Keyed and sized exactly as bundleDetails does it: the viewport gives up
198
- // 120px so the absolutely-placed arrows sit beside the cards rather than
199
- // on top of them.
200
- .embla {
201
- position: relative;
202
-
203
- &[data-control-type="Side"] {
204
- .embla__viewport {
205
- width: calc(100% - 120px);
206
- margin-inline: auto;
207
- }
208
-
209
- .left-button,
210
- .right-button {
211
- position: absolute;
212
- top: 50%;
213
- transform: translateY(-50%);
214
- z-index: 2;
215
- display: flex;
216
- align-items: center;
217
- justify-content: center;
218
- cursor: pointer;
219
- }
220
-
221
- .left-button {
222
- left: 0;
223
- }
224
-
225
- .right-button {
226
- right: 0;
227
- }
228
- }
229
- }
230
- }
231
-
232
- .bundle__category {
233
- display: flex;
234
- align-items: center;
235
- gap: 12px;
236
- padding: 8px 12px;
237
- background: transparent;
238
- border: 1px solid transparent;
239
- border-radius: 4px;
240
- cursor: pointer;
241
- font: inherit;
242
- text-align: left;
243
- width: 100%;
244
- min-width: 240px;
245
- white-space: nowrap;
246
-
247
- // The open tab. Kept to a border rather than a fill so the strip stays quiet
248
- // against the product list below it.
249
- &[data-is-active="true"] {
250
- border-color: #1f1f1f;
251
- }
252
- }
253
-
254
- .bundle__category__image {
255
- flex: 0 0 auto;
256
- width: 56px;
257
- height: 56px;
258
- overflow: hidden;
259
- border-radius: 2px;
260
-
261
- img {
262
- width: 100%;
263
- height: 100%;
264
- object-fit: cover;
265
- }
266
- }
267
-
268
- .bundle__category__text {
269
- display: flex;
270
- flex-direction: column;
271
- gap: 2px;
272
- min-width: 0;
273
- }
274
-
275
- .bundle__category__name {
276
- display: flex;
277
- align-items: center;
278
- gap: 6px;
279
- font-weight: 600;
280
- }
281
-
282
- .bundle__category__tick {
283
- color: #2e7d32;
284
- }
285
-
286
- .bundle__category__count,
287
- .bundle__category__selected {
288
- font-size: 12px;
289
- opacity: 0.75;
290
- }
291
-
292
- // Validation message for this category, shown after a failed add to cart.
293
- // `white-space: normal` because the card itself is nowrap.
294
- .bundle__category__error {
295
- margin-top: 4px;
296
- font-size: 12px;
297
- color: #c62828;
298
- white-space: normal;
299
- }
300
- }
301
- }
1
+ /**
2
+ * Bundle Categories — the category strip above a bundle's product list.
3
+ *
4
+ * Mirrors the category tabs in the Bundle Details element: a horizontal row of
5
+ * cards, each with the category's image, its name, how many products it holds
6
+ * and how many are selected. The row is an Embla carousel, so the slides are
7
+ * laid out by the carousel and only the card itself is styled here.
8
+ */
9
+ [data-div-type="element"] {
10
+ &[data-element-type="bundleCategories"] {
11
+ // The builder writes width/height/margin/padding as --_ctm-* custom properties
12
+ // rather than as plain CSS. Without consuming them the Layout panel appears to
13
+ // do nothing — which is exactly how this element behaved.
14
+ //
15
+ // `--_sf-nw-wh` closes the chain: it is the width the element emits itself
16
+ // while a resize drag is in flight, before the percentage is committed.
17
+ width: var(
18
+ --_sf-el-wh-st-mx,
19
+ calc(
20
+ 1% *
21
+ var(
22
+ --_ctm-mob-ele-nw-wh-vl,
23
+ var(--_ctm-tab-ele-nw-wh-vl, var(--_ctm-ele-nw-wh-vl, var(--_sf-nw-wh)))
24
+ )
25
+ )
26
+ );
27
+ margin: var(--_ctm-mob-lt-mn, var(--_ctm-tab-lt-mn, var(--_ctm-lt-mn, 0)));
28
+ padding: var(--_ctm-mob-lt-pg, var(--_ctm-tab-lt-pg, var(--_ctm-lt-pg, 0)));
29
+
30
+ // Show Border / Show Shadow are CONTROLS, not CSS, so the builder never turns
31
+ // them into `--_ctm-*` variables — the element surfaces them as data
32
+ // attributes and the gates below read those.
33
+ &[data-show-border="false"] > .wrapper {
34
+ border-style: none;
35
+ }
36
+
37
+ // A gate of its own rather than the shared `--_show-shadow`: custom properties
38
+ // inherit, so a parent whose shadow is switched off would silently clear this
39
+ // element's too.
40
+ &[data-show-shadow="false"] {
41
+ --_sf-bc-show-shadow: none;
42
+ }
43
+
44
+ // Background type is chosen in the Design tab and written onto the element as
45
+ // `data-background-type`; gradients add `data-gradient-type`. Both are gated
46
+ // exactly as the repeater item gates them, and like it the painted surface is
47
+ // the wrapper rather than the root — the root carries the builder's own
48
+ // `#<id>` rule and cannot be overridden from this stylesheet.
49
+ &[data-background-type="color"] > .wrapper {
50
+ background-color: var(--_ctm-mob-dn-bd-cr, var(--_ctm-tab-dn-bd-cr, var(--_ctm-dn-bd-cr)));
51
+ }
52
+
53
+ &[data-background-type="image"] > .wrapper {
54
+ background-image: var(--_ctm-mob-dn-bd-ie, var(--_ctm-tab-dn-bd-ie, var(--_ctm-dn-bd-ie)));
55
+ }
56
+
57
+ &[data-background-type="gradient"] > .wrapper {
58
+ --_sf-bc-gradient-angle: calc(
59
+ var(--_ctm-mob-dn-gt-ae, var(--_ctm-tab-dn-gt-ae, var(--_ctm-dn-gt-ae, 90))) * 1deg
60
+ );
61
+ --_sf-bc-gradient-start-color: var(
62
+ --_ctm-mob-dn-gt-st-cr,
63
+ var(--_ctm-tab-dn-gt-st-cr, var(--_ctm-dn-gt-st-cr, transparent))
64
+ );
65
+ --_sf-bc-gradient-start-position: calc(
66
+ var(--_ctm-mob-dn-gt-st-pn, var(--_ctm-tab-dn-gt-st-pn, var(--_ctm-dn-gt-st-pn, 0))) * 1%
67
+ );
68
+ --_sf-bc-gradient-end-color: var(
69
+ --_ctm-mob-dn-gt-ed-cr,
70
+ var(--_ctm-tab-dn-gt-ed-cr, var(--_ctm-dn-gt-ed-cr, transparent))
71
+ );
72
+ --_sf-bc-gradient-end-position: calc(
73
+ var(--_ctm-mob-dn-gt-ed-pn, var(--_ctm-tab-dn-gt-ed-pn, var(--_ctm-dn-gt-ed-pn, 100))) * 1%
74
+ );
75
+ --_sf-bc-gradient-position: var(
76
+ --_ctm-mob-dn-gt-pn,
77
+ var(--_ctm-tab-dn-gt-pn, var(--_ctm-dn-gt-pn, center))
78
+ );
79
+ }
80
+
81
+ &[data-gradient-type="Linear Gradient"] > .wrapper {
82
+ background-image: linear-gradient(
83
+ var(--_sf-bc-gradient-angle),
84
+ var(--_sf-bc-gradient-start-color) var(--_sf-bc-gradient-start-position),
85
+ var(--_sf-bc-gradient-end-color) var(--_sf-bc-gradient-end-position)
86
+ );
87
+ }
88
+
89
+ &[data-gradient-type="Radial Gradient"] > .wrapper {
90
+ background-image: radial-gradient(
91
+ circle at var(--_sf-bc-gradient-position),
92
+ var(--_sf-bc-gradient-start-color) var(--_sf-bc-gradient-start-position),
93
+ var(--_sf-bc-gradient-end-color) var(--_sf-bc-gradient-end-position)
94
+ );
95
+ }
96
+ background-position: var(--_ctm-mob-dn-bd-pn, var(--_ctm-tab-dn-bd-pn, var(--_ctm-dn-bd-pn)));
97
+ background-repeat: var(--_ctm-mob-dn-bd-rt, var(--_ctm-tab-dn-bd-rt, var(--_ctm-dn-bd-rt)));
98
+ background-size: var(--_ctm-mob-dn-bd-se, var(--_ctm-tab-dn-bd-se, var(--_ctm-dn-bd-se)));
99
+
100
+ border-color: var(--_ctm-mob-dn-br-cr, var(--_ctm-tab-dn-br-cr, var(--_ctm-dn-br-cr)));
101
+ border-style: var(--_ctm-mob-dn-br-se, var(--_ctm-tab-dn-br-se, var(--_ctm-dn-br-se)));
102
+ border-width: var(--_ctm-mob-dn-br-wh, var(--_ctm-tab-dn-br-wh, var(--_ctm-dn-br-wh)));
103
+ border-radius: var(--_ctm-mob-dn-br-rs, var(--_ctm-tab-dn-br-rs, var(--_ctm-dn-br-rs)));
104
+
105
+ // Show Border / Show Shadow are CONTROLS, not CSS, so they never become
106
+ // variables — the element surfaces them as data attributes instead.
107
+ &[data-show-border="false"] {
108
+ border-style: none;
109
+ }
110
+
111
+ // A gate of its own rather than the shared `--_show-shadow`: custom properties
112
+ // inherit, so a parent whose shadow is switched off would silently clear this
113
+ // element's too.
114
+ &[data-show-shadow="false"] {
115
+ --_sf-bc-show-shadow: none;
116
+ }
117
+
118
+ // Per-part fallbacks: without them one unset part invalidates the whole
119
+ // `box-shadow` at computed-value time and it resolves to `none`.
120
+ box-shadow: var(
121
+ --_sf-bc-show-shadow,
122
+ var(--_ctm-mob-dn-sw-ae, var(--_ctm-tab-dn-sw-ae, var(--_ctm-dn-sw-ae, 0)))
123
+ var(--_ctm-mob-dn-sw-br, var(--_ctm-tab-dn-sw-br, var(--_ctm-dn-sw-br, 0)))
124
+ var(--_ctm-mob-dn-sw-sd, var(--_ctm-tab-dn-sw-sd, var(--_ctm-dn-sw-sd, 0)))
125
+ var(--_ctm-mob-dn-sw-cr, var(--_ctm-tab-dn-sw-cr, var(--_ctm-dn-sw-cr, transparent)))
126
+ );
127
+
128
+ // Height goes on the wrapper, not here: the builder emits the element's own
129
+ // default styles as `#<id>{ height: auto }`, and an id selector outranks this
130
+ // stylesheet — so a height set here could never win and the top/bottom resize
131
+ // handles moved nothing. The wrapper is outside that rule's reach.
132
+ > .wrapper {
133
+ width: 100%;
134
+ height: var(--_ctm-mob-lt-ht, var(--_ctm-tab-lt-ht, var(--_ctm-lt-ht, 100%))) !important;
135
+
136
+ // Border, radius and shadow ride on the wrapper alongside the background so
137
+ // the whole painted surface is one box.
138
+ border-color: var(--_ctm-mob-dn-br-cr, var(--_ctm-tab-dn-br-cr, var(--_ctm-dn-br-cr)));
139
+ border-style: var(--_ctm-mob-dn-br-se, var(--_ctm-tab-dn-br-se, var(--_ctm-dn-br-se)));
140
+ border-width: var(--_ctm-mob-dn-br-wh, var(--_ctm-tab-dn-br-wh, var(--_ctm-dn-br-wh)));
141
+ border-radius: var(--_ctm-mob-dn-br-rs, var(--_ctm-tab-dn-br-rs, var(--_ctm-dn-br-rs)));
142
+
143
+ background-repeat: var(--_ctm-mob-dn-bd-rt, var(--_ctm-tab-dn-bd-rt, var(--_ctm-dn-bd-rt)));
144
+ background-size: var(--_ctm-mob-dn-bd-se, var(--_ctm-tab-dn-bd-se, var(--_ctm-dn-bd-se)));
145
+ background-attachment: var(
146
+ --_ctm-mob-dn-bd-at,
147
+ var(--_ctm-tab-dn-bd-at, var(--_ctm-dn-bd-at))
148
+ );
149
+ // Position is stored as separate X and Y values, not one shorthand.
150
+ background-position: var(
151
+ --_ctm-mob-dn-bd-pn-x,
152
+ var(--_ctm-tab-dn-bd-pn-x, var(--_ctm-dn-bd-pn-x, center))
153
+ )
154
+ var(--_ctm-mob-dn-bd-pn-y, var(--_ctm-tab-dn-bd-pn-y, var(--_ctm-dn-bd-pn-y, center)));
155
+
156
+ // Per-part fallbacks: without them one unset part invalidates the whole
157
+ // `box-shadow` at computed-value time and it resolves to `none`.
158
+ box-shadow: var(
159
+ --_sf-bc-show-shadow,
160
+ var(--_ctm-mob-dn-sw-ae, var(--_ctm-tab-dn-sw-ae, var(--_ctm-dn-sw-ae, 0)))
161
+ var(--_ctm-mob-dn-sw-br, var(--_ctm-tab-dn-sw-br, var(--_ctm-dn-sw-br, 0)))
162
+ var(--_ctm-mob-dn-sw-sd, var(--_ctm-tab-dn-sw-sd, var(--_ctm-dn-sw-sd, 0)))
163
+ var(--_ctm-mob-dn-sw-cr, var(--_ctm-tab-dn-sw-cr, var(--_ctm-dn-sw-cr, transparent)))
164
+ );
165
+ }
166
+
167
+ // Bundle name above the strip, matching the heading Bundle Details prints.
168
+ .bundle__name {
169
+ margin: 0 0 12px;
170
+ font-size: 18px;
171
+ font-weight: 600;
172
+ }
173
+
174
+ .bundle__categories {
175
+ width: 100%;
176
+
177
+ // Embla's own classes. The container has to be an explicit row — otherwise
178
+ // the slides stack — and each slide needs a width of its own, or it
179
+ // collapses to the widest word and the labels wrap per character.
180
+ .embla__container {
181
+ display: flex;
182
+ flex-direction: row;
183
+ }
184
+
185
+ .embla__slide {
186
+ flex: 0 0 auto;
187
+ min-width: 240px;
188
+ }
189
+
190
+ // Arrow placement is driven by the carousel's control position, which the
191
+ // shared EmblaCarouselBasic stamps onto `.embla` as `data-control-type`.
192
+ // In "Side" mode — the default this element passes — it renders the two
193
+ // buttons as bare children of `.embla` with no wrapper, so an earlier rule
194
+ // written against an `.arrow-navigation` wrapper never matched and the
195
+ // arrows stacked above and below the strip.
196
+ //
197
+ // Keyed and sized exactly as bundleDetails does it: the viewport gives up
198
+ // 120px so the absolutely-placed arrows sit beside the cards rather than
199
+ // on top of them.
200
+ .embla {
201
+ position: relative;
202
+
203
+ &[data-control-type="Side"] {
204
+ .embla__viewport {
205
+ width: calc(100% - 120px);
206
+ margin-inline: auto;
207
+ }
208
+
209
+ .left-button,
210
+ .right-button {
211
+ position: absolute;
212
+ top: 50%;
213
+ transform: translateY(-50%);
214
+ z-index: 2;
215
+ display: flex;
216
+ align-items: center;
217
+ justify-content: center;
218
+ cursor: pointer;
219
+ }
220
+
221
+ .left-button {
222
+ left: 0;
223
+ }
224
+
225
+ .right-button {
226
+ right: 0;
227
+ }
228
+ }
229
+ }
230
+ }
231
+
232
+ .bundle__category {
233
+ display: flex;
234
+ align-items: center;
235
+ gap: 12px;
236
+ padding: 8px 12px;
237
+ background: transparent;
238
+ border: 1px solid transparent;
239
+ border-radius: 4px;
240
+ cursor: pointer;
241
+ font: inherit;
242
+ text-align: left;
243
+ width: 100%;
244
+ min-width: 240px;
245
+ white-space: nowrap;
246
+
247
+ // The open tab. Kept to a border rather than a fill so the strip stays quiet
248
+ // against the product list below it.
249
+ &[data-is-active="true"] {
250
+ border-color: #1f1f1f;
251
+ }
252
+ }
253
+
254
+ .bundle__category__image {
255
+ flex: 0 0 auto;
256
+ width: 56px;
257
+ height: 56px;
258
+ overflow: hidden;
259
+ border-radius: 2px;
260
+
261
+ img {
262
+ width: 100%;
263
+ height: 100%;
264
+ object-fit: cover;
265
+ }
266
+ }
267
+
268
+ .bundle__category__text {
269
+ display: flex;
270
+ flex-direction: column;
271
+ gap: 2px;
272
+ min-width: 0;
273
+ }
274
+
275
+ .bundle__category__name {
276
+ display: flex;
277
+ align-items: center;
278
+ gap: 6px;
279
+ font-weight: 600;
280
+ }
281
+
282
+ .bundle__category__tick {
283
+ color: #2e7d32;
284
+ }
285
+
286
+ .bundle__category__count,
287
+ .bundle__category__selected {
288
+ font-size: 12px;
289
+ opacity: 0.75;
290
+ }
291
+
292
+ // Validation message for this category, shown after a failed add to cart.
293
+ // `white-space: normal` because the card itself is nowrap.
294
+ .bundle__category__error {
295
+ margin-top: 4px;
296
+ font-size: 12px;
297
+ color: #c62828;
298
+ white-space: normal;
299
+ }
300
+ }
301
+ }