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

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