@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
package/dist/scroll.scss CHANGED
@@ -1,414 +1,414 @@
1
- @use "sass:map";
2
- @use "sass:list";
3
- @use "./functions.scss" as *;
4
-
5
- $max-items: 20;
6
-
7
- [data-div-type="element"] {
8
- &[data-element-type="scroll"] {
9
- // width: var(--_sf-nw-wh, var(--_tst-lt-wh));
10
- width: var(
11
- --_sf-el-wh-st-mx,
12
- calc(
13
- 1% * var(--_ctm-mob-ele-nw-wh-vl, var(--_ctm-tab-ele-nw-wh-vl, var(--_ctm-ele-nw-wh-vl)))
14
- )
15
- );
16
- margin: var(--_ctm-mob-lt-mn, var(--_ctm-tab-lt-mn, var(--_ctm-lt-mn)));
17
- aspect-ratio: 1 / var(--_sf-aspect-ratio);
18
-
19
- & > .wrapper {
20
- width: var(--_ctm-mob-lt-wh, var(--_ctm-tab-lt-wh, var(--_ctm-lt-wh)));
21
- // height: var(--_ctm-mob-lt-ht, var(--_ctm-tab-lt-ht, var(--_ctm-lt-ht)));
22
-
23
- overflow: hidden;
24
- white-space: nowrap;
25
-
26
- // The Scroll Container's shadow used to be painted here as well as on
27
- // `.scroll__container` below. This wrapper is a separate, square box that sits
28
- // outside the container, so the second copy was drawn around the wrapper with
29
- // square corners — the shadow appearing "outside the element" and ignoring the
30
- // corner radius. Only `.scroll__container` paints it now, and it carries the
31
- // matching border-radius.
32
- //
33
- // The wrapper clips (`overflow: hidden`), so it needs the same radius or its
34
- // square clip cuts the container's rounded corners back off — and the shadow
35
- // below, which is painted here, then follows the rounded shape too.
36
- border-radius: var(
37
- --_ctm-mob-dn-sl-cr-br-rs,
38
- var(--_ctm-tab-dn-sl-cr-br-rs, var(--_ctm-dn-sl-cr-br-rs))
39
- );
40
-
41
- &[data-widget-shadow="true"] {
42
- box-shadow: var(
43
- --_ctm-mob-dn-sl-cr-sw-ae,
44
- var(--_ctm-tab-dn-sl-cr-sw-ae, var(--_ctm-dn-sl-cr-sw-ae))
45
- )
46
- var(--_ctm-mob-dn-sl-cr-sw-br, var(--_ctm-tab-dn-sl-cr-sw-br, var(--_ctm-dn-sl-cr-sw-br)))
47
- var(--_ctm-mob-dn-sl-cr-sw-sd, var(--_ctm-tab-dn-sl-cr-sw-sd, var(--_ctm-dn-sl-cr-sw-sd)))
48
- var(--_ctm-mob-dn-sl-cr-sw-cr, var(--_ctm-tab-dn-sl-cr-sw-cr, var(--_ctm-dn-sl-cr-sw-cr)));
49
- }
50
-
51
- // .scroll__container {
52
- @for $i from 1 through $max-items {
53
- .scroll-item[data-index="i#{$i}"] {
54
- display: flex;
55
- padding: prepareMediaVariable(
56
- --_ctm-dn-i#{$i}-pg,
57
- #{prepareMediaVariable(--_ctm-dn-i1-pg)}
58
- );
59
- gap: prepareMediaVariable(
60
- --_ctm-dn-i#{$i}-im-gp,
61
- #{prepareMediaVariable(--_ctm-dn-i1-im-gp)}
62
- );
63
- background-color: prepareMediaVariable(
64
- --_ctm-dn-i#{$i}-bd-cr,
65
- #{prepareMediaVariable(--_ctm-dn-i1-bd-cr)}
66
- );
67
- border-color: prepareMediaVariable(
68
- --_ctm-dn-i#{$i}-br-cr,
69
- #{prepareMediaVariable(--_ctm-dn-i1-br-cr)}
70
- );
71
- border-style: prepareMediaVariable(
72
- --_ctm-dn-i#{$i}-br-se,
73
- #{prepareMediaVariable(--_ctm-dn-i1-br-se)}
74
- );
75
- border-width: prepareMediaVariable(
76
- --_ctm-dn-i#{$i}-br-wh,
77
- #{prepareMediaVariable(--_ctm-dn-i1-br-wh)}
78
- );
79
- border-radius: prepareMediaVariable(
80
- --_ctm-dn-i#{$i}-br-rs,
81
- #{prepareMediaVariable(--_ctm-dn-i1-br-rs)}
82
- );
83
- // Each item's schema has carried showShadow/shadowColor/angle/spread/blur all
84
- // along, but nothing ever read them — the only box-shadow declarations in this
85
- // file were the container's. `--_show-item-shadow` is set to `none` by the
86
- // item's own Show Shadow switch below.
87
- box-shadow: var(
88
- --_show-item-shadow,
89
- prepareMediaVariable(
90
- --_ctm-dn-i#{$i}-sw-ae,
91
- #{prepareMediaVariable(--_ctm-dn-i1-sw-ae)}
92
- )
93
- prepareMediaVariable(
94
- --_ctm-dn-i#{$i}-sw-br,
95
- #{prepareMediaVariable(--_ctm-dn-i1-sw-br)}
96
- )
97
- prepareMediaVariable(
98
- --_ctm-dn-i#{$i}-sw-sd,
99
- #{prepareMediaVariable(--_ctm-dn-i1-sw-sd)}
100
- )
101
- prepareMediaVariable(
102
- --_ctm-dn-i#{$i}-sw-cr,
103
- #{prepareMediaVariable(--_ctm-dn-i1-sw-cr)}
104
- )
105
- );
106
- &[data-item-shadow="false"] {
107
- --_show-item-shadow: none;
108
- }
109
- color: prepareMediaVariable(
110
- --_ctm-dn-i#{$i}-cr,
111
- #{prepareMediaVariable(--_ctm-dn-i1-cr)}
112
- );
113
- font-family: prepareMediaVariable(
114
- --_ctm-dn-i#{$i}-ft-fy,
115
- #{prepareMediaVariable(--_ctm-dn-i1-ft-fy)}
116
- );
117
- &.flex__overflow {
118
- white-space: normal;
119
- @include restrictToLinesShow(#{var(--_sf-line-clamp, 1)});
120
- }
121
- font-size: prepareMediaVariable(
122
- --_ctm-dn-i#{$i}-ft-se,
123
- #{prepareMediaVariable(--_ctm-dn-i1-ft-se)}
124
- );
125
- font-weight: prepareMediaVariable(
126
- --_ctm-dn-i#{$i}-ft-wt,
127
- #{prepareMediaVariable(--_ctm-dn-i1-ft-wt)}
128
- );
129
- font-style: prepareMediaVariable(
130
- --_ctm-dn-i#{$i}-ft-se-ic,
131
- #{prepareMediaVariable(--_ctm-dn-i1-ft-se-ic)}
132
- );
133
- text-align: prepareMediaVariable(
134
- --_ctm-dn-i#{$i}-tt-an,
135
- #{prepareMediaVariable(--_ctm-dn-i1-tt-an)}
136
- );
137
- letter-spacing: prepareMediaVariable(
138
- --_ctm-dn-i#{$i}-lr-sg,
139
- #{prepareMediaVariable(--_ctm-dn-i1-lr-sg)}
140
- );
141
- line-height: prepareMediaVariable(
142
- --_ctm-dn-i#{$i}-le-ht,
143
- #{prepareMediaVariable(--_ctm-dn-i1-le-ht)}
144
- );
145
- text-decoration: prepareMediaVariable(
146
- --_ctm-dn-i#{$i}-ue,
147
- #{prepareMediaVariable(--_ctm-dn-i1-ue)}
148
- );
149
- // All three inherit, so setting them on the item is enough for the text node
150
- // (and the `.scroll-item__text` span the clamp uses) to pick them up.
151
- text-transform: prepareMediaVariable(
152
- --_ctm-dn-i#{$i}-tt-tm,
153
- #{prepareMediaVariable(--_ctm-dn-i1-tt-tm)}
154
- );
155
- word-wrap: prepareMediaVariable(
156
- --_ctm-dn-i#{$i}-wd-wr,
157
- #{prepareMediaVariable(--_ctm-dn-i1-wd-wr)}
158
- );
159
- word-break: prepareMediaVariable(
160
- --_ctm-dn-i#{$i}-wd-bk,
161
- #{prepareMediaVariable(--_ctm-dn-i1-wd-bk)}
162
- );
163
-
164
- .icon {
165
- svg {
166
- width: prepareMediaVariable(
167
- --_ctm-dn-i#{$i}-in-se,
168
- #{prepareMediaVariable(--_ctm-dn-i1-in-se)}
169
- );
170
- height: prepareMediaVariable(
171
- --_ctm-dn-i#{$i}-in-se,
172
- #{prepareMediaVariable(--_ctm-dn-i1-in-se)}
173
- );
174
- path {
175
- stroke: prepareMediaVariable(
176
- --_ctm-dn-i#{$i}-in-c1,
177
- #{prepareMediaVariable(--_ctm-dn-i1-in-c1)}
178
- );
179
- // Overrides the stroke-width presentation attribute baked into the icon markup.
180
- stroke-width: prepareMediaVariable(
181
- --_ctm-dn-i#{$i}-se-wh,
182
- #{prepareMediaVariable(--_ctm-dn-i1-se-wh)}
183
- );
184
- }
185
- }
186
- }
187
- }
188
- }
189
-
190
- &[data-pause-on-hover="true"] .scrolling {
191
- &:hover {
192
- animation-play-state: paused;
193
- }
194
- }
195
-
196
- &[data-scroll-direction="leftToRight"] .scrolling {
197
- animation-direction: normal;
198
- }
199
-
200
- &[data-scroll-direction="rightToLeft"] .scrolling {
201
- animation-direction: reverse;
202
- }
203
-
204
- // Vertical scroll. The horizontal marquee translates on X and lays the items out
205
- // in a row; both have to flip for a vertical run, so the two vertical directions
206
- // share this block and only differ by `animation-direction` below.
207
- &[data-scroll-direction="topToBottom"],
208
- &[data-scroll-direction="bottomToTop"] {
209
- // `nowrap` is what keeps the horizontal run on one line; it fights a column stack.
210
- white-space: normal;
211
-
212
- .scrolling {
213
- flex-direction: column;
214
- // Full width so the items have room to sit left, centre or right inside the
215
- // container. Left to size itself, the track is only as wide as its widest
216
- // item and Horizontal Alignment would have no space to move anything in.
217
- width: 100%;
218
- animation-name: marquee-vertical;
219
- padding-right: 0;
220
- padding-bottom: 10px;
221
- }
222
-
223
- // Horizontal Alignment. The track is a column here, so its cross axis is the
224
- // horizontal one and `align-items` is what places the items across it.
225
- &[data-horizontal-alignment="left"] .scrolling {
226
- align-items: flex-start;
227
- }
228
-
229
- &[data-horizontal-alignment="center"] .scrolling {
230
- align-items: center;
231
- }
232
-
233
- &[data-horizontal-alignment="right"] .scrolling {
234
- align-items: flex-end;
235
- }
236
-
237
- // The container is sized with `min-height`, which is right for a row (content
238
- // never exceeds it) but wrong for a column: the stack would simply grow the box,
239
- // nothing would overflow, and the marquee would look frozen. Pin the height.
240
- .scroll__container {
241
- height: var(--_ctm-mob-lt-ht, var(--_ctm-tab-lt-ht, var(--_ctm-lt-ht)));
242
- align-items: flex-start;
243
- }
244
- }
245
-
246
- // `marquee-vertical` translates upward, which reads as bottom-to-top on screen —
247
- // so that is the `normal` case and top-to-bottom is the reversed one. Same trick
248
- // as the horizontal pair above.
249
- &[data-scroll-direction="bottomToTop"] .scrolling {
250
- animation-direction: normal;
251
- }
252
-
253
- &[data-scroll-direction="topToBottom"] .scrolling {
254
- animation-direction: reverse;
255
- }
256
-
257
- &[data-scroll-speed="0.5x"] .scrolling {
258
- animation-duration: 40s;
259
- }
260
- &[data-scroll-speed="1x"] .scrolling {
261
- animation-duration: 20s;
262
- }
263
- &[data-scroll-speed="2x"] .scrolling {
264
- animation-duration: 10s;
265
- }
266
- &[data-scroll-speed="4x"] .scrolling {
267
- animation-duration: 5s;
268
- }
269
-
270
- &[data-repeat-elements="true"] .scrolling {
271
- animation-iteration-count: infinite;
272
- }
273
- &[data-repeat-elements="false"] .scrolling {
274
- animation-iteration-count: 1;
275
- }
276
- }
277
-
278
- // The Scroll Container's shadow is painted on `.wrapper` rather than on
279
- // `.scroll__container`: the container fills the wrapper, and the wrapper clips
280
- // (`overflow: hidden`), so a shadow on the container would be clipped away. An
281
- // element's own box-shadow is never clipped by its own overflow, so the wrapper is
282
- // the right box for it — and it carries the matching border-radius (see above) so
283
- // the shadow follows the rounded shape instead of drawing a square glow.
284
- //
285
- // These were previously written as `&[data-widget-shadow=...]`, which targets the
286
- // element root, but the attribute is emitted on `.wrapper` (unlike
287
- // `data-widget-border`, which is on the root) — so neither rule ever matched.
288
- & > .wrapper[data-widget-shadow="false"] {
289
- box-shadow: none;
290
- }
291
-
292
- &[data-widget-border="true"] {
293
- .scroll__container {
294
- border-color: var(
295
- --_ctm-mob-dn-sl-cr-br-cr,
296
- var(--_ctm-tab-dn-sl-cr-br-cr, var(--_ctm-dn-sl-cr-br-cr))
297
- );
298
- border-style: var(
299
- --_ctm-mob-dn-sl-cr-br-se,
300
- var(--_ctm-tab-dn-sl-cr-br-se, var(--_ctm-dn-sl-cr-br-se))
301
- );
302
- border-width: var(
303
- --_ctm-mob-dn-sl-cr-br-wh,
304
- var(--_ctm-tab-dn-sl-cr-br-wh, var(--_ctm-dn-sl-cr-br-wh))
305
- );
306
- }
307
- }
308
-
309
- .scroll__container {
310
- width: 100%;
311
- // height: 100%;
312
- min-height: var(--_ctm-mob-lt-ht, var(--_ctm-tab-lt-ht, var(--_ctm-lt-ht)));
313
- padding: var(--_ctm-mob-lt-pg, var(--_ctm-tab-lt-pg, var(--_ctm-lt-pg)));
314
- overflow: hidden;
315
- white-space: nowrap;
316
- display: flex;
317
- justify-content: flex-start;
318
- align-items: center;
319
- background-color: var(
320
- --_ctm-mob-dn-sl-cr-bd-cr,
321
- var(--_ctm-tab-dn-sl-cr-bd-cr, var(--_ctm-dn-sl-cr-bd-cr))
322
- );
323
- border-radius: var(
324
- --_ctm-mob-dn-sl-cr-br-rs,
325
- var(--_ctm-tab-dn-sl-cr-br-rs, var(--_ctm-dn-sl-cr-br-rs))
326
- );
327
-
328
- .scrolling {
329
- display: flex;
330
- flex-direction: row;
331
- justify-content: flex-start;
332
- align-items: center;
333
- flex-shrink: 0;
334
- gap: var(--_ctm-mob-lt-im-sg, var(--_ctm-tab-lt-im-sg, var(--_ctm-lt-im-sg)));
335
- padding-right: 10px;
336
- animation-name: marquee;
337
- animation-timing-function: linear;
338
- }
339
-
340
- // Text Overflow. The item's text sits in its own span so the clamp gets a block
341
- // box of its own — clamping `.scroll-item` itself would swap its `display: flex`
342
- // for `-webkit-box` and break the icon/text row. `white-space` has to be reset
343
- // because `.wrapper` sets `nowrap`, and a clamp on a non-wrapping node can only
344
- // ever show one line.
345
- .scroll-item__text.flex__overflow {
346
- @include restrictToLinesShow(#{var(--_sf-line-clamp, 1)});
347
- white-space: normal;
348
- }
349
-
350
- .divider {
351
- background-color: var(
352
- --_ctm-mob-dn-dr-se-bd-cr,
353
- var(--_ctm-tab-dn-dr-se-bd-cr, var(--_ctm-dn-dr-se-bd-cr))
354
- );
355
- padding: 3px;
356
- font-size: var(
357
- --_ctm-mob-dn-dr-se-se,
358
- var(--_ctm-tab-dn-dr-se-se, var(--_ctm-dn-dr-se-se))
359
- );
360
- color: var(
361
- --_ctm-mob-dn-dr-se-dr-cr,
362
- var(--_ctm-tab-dn-dr-se-dr-cr, var(--_ctm-dn-dr-se-dr-cr))
363
- );
364
- }
365
-
366
- .icon {
367
- background-color: var(
368
- --_ctm-mob-dn-dr-se-bd-cr,
369
- var(--_ctm-tab-dn-dr-se-bd-cr, var(--_ctm-dn-dr-se-bd-cr))
370
- );
371
- padding: 3px;
372
-
373
- svg {
374
- width: var(--_ctm-mob-dn-dr-se-se, var(--_ctm-tab-dn-dr-se-se, var(--_ctm-dn-dr-se-se)));
375
- height: var(--_ctm-mob-dn-dr-se-se, var(--_ctm-tab-dn-dr-se-se, var(--_ctm-dn-dr-se-se)));
376
-
377
- path {
378
- stroke: var(
379
- --_ctm-mob-dn-dr-se-dr-cr,
380
- var(--_ctm-tab-dn-dr-se-dr-cr, var(--_ctm-dn-dr-se-dr-cr))
381
- );
382
- }
383
- }
384
- }
385
-
386
- // Divider Style > Stroke Width. Scoped to the dividers, which sit as direct
387
- // children of the track — the items' own icons carry the same `.icon` class, so
388
- // declaring this in the block above would let the divider's setting retune every
389
- // item icon too. The value overrides the stroke-width baked into the icon markup;
390
- // 1.25 matches the schema default.
391
- > .scrolling > .icon svg path {
392
- stroke-width: prepareMediaVariable(--_ctm-dn-dr-se-se-wh, 1.25);
393
- }
394
-
395
- @keyframes marquee {
396
- 0% {
397
- transform: translateX(0);
398
- }
399
- 100% {
400
- transform: translateX(var(--_marquee-tx, -50%));
401
- }
402
- }
403
-
404
- @keyframes marquee-vertical {
405
- 0% {
406
- transform: translateY(0);
407
- }
408
- 100% {
409
- transform: translateY(var(--_marquee-ty, -50%));
410
- }
411
- }
412
- }
413
- }
414
- }
1
+ @use "sass:map";
2
+ @use "sass:list";
3
+ @use "./functions.scss" as *;
4
+
5
+ $max-items: 20;
6
+
7
+ [data-div-type="element"] {
8
+ &[data-element-type="scroll"] {
9
+ // width: var(--_sf-nw-wh, var(--_tst-lt-wh));
10
+ width: var(
11
+ --_sf-el-wh-st-mx,
12
+ calc(
13
+ 1% * var(--_ctm-mob-ele-nw-wh-vl, var(--_ctm-tab-ele-nw-wh-vl, var(--_ctm-ele-nw-wh-vl)))
14
+ )
15
+ );
16
+ margin: var(--_ctm-mob-lt-mn, var(--_ctm-tab-lt-mn, var(--_ctm-lt-mn)));
17
+ aspect-ratio: 1 / var(--_sf-aspect-ratio);
18
+
19
+ & > .wrapper {
20
+ width: var(--_ctm-mob-lt-wh, var(--_ctm-tab-lt-wh, var(--_ctm-lt-wh)));
21
+ // height: var(--_ctm-mob-lt-ht, var(--_ctm-tab-lt-ht, var(--_ctm-lt-ht)));
22
+
23
+ overflow: hidden;
24
+ white-space: nowrap;
25
+
26
+ // The Scroll Container's shadow used to be painted here as well as on
27
+ // `.scroll__container` below. This wrapper is a separate, square box that sits
28
+ // outside the container, so the second copy was drawn around the wrapper with
29
+ // square corners — the shadow appearing "outside the element" and ignoring the
30
+ // corner radius. Only `.scroll__container` paints it now, and it carries the
31
+ // matching border-radius.
32
+ //
33
+ // The wrapper clips (`overflow: hidden`), so it needs the same radius or its
34
+ // square clip cuts the container's rounded corners back off — and the shadow
35
+ // below, which is painted here, then follows the rounded shape too.
36
+ border-radius: var(
37
+ --_ctm-mob-dn-sl-cr-br-rs,
38
+ var(--_ctm-tab-dn-sl-cr-br-rs, var(--_ctm-dn-sl-cr-br-rs))
39
+ );
40
+
41
+ &[data-widget-shadow="true"] {
42
+ box-shadow: var(
43
+ --_ctm-mob-dn-sl-cr-sw-ae,
44
+ var(--_ctm-tab-dn-sl-cr-sw-ae, var(--_ctm-dn-sl-cr-sw-ae))
45
+ )
46
+ var(--_ctm-mob-dn-sl-cr-sw-br, var(--_ctm-tab-dn-sl-cr-sw-br, var(--_ctm-dn-sl-cr-sw-br)))
47
+ var(--_ctm-mob-dn-sl-cr-sw-sd, var(--_ctm-tab-dn-sl-cr-sw-sd, var(--_ctm-dn-sl-cr-sw-sd)))
48
+ var(--_ctm-mob-dn-sl-cr-sw-cr, var(--_ctm-tab-dn-sl-cr-sw-cr, var(--_ctm-dn-sl-cr-sw-cr)));
49
+ }
50
+
51
+ // .scroll__container {
52
+ @for $i from 1 through $max-items {
53
+ .scroll-item[data-index="i#{$i}"] {
54
+ display: flex;
55
+ padding: prepareMediaVariable(
56
+ --_ctm-dn-i#{$i}-pg,
57
+ #{prepareMediaVariable(--_ctm-dn-i1-pg)}
58
+ );
59
+ gap: prepareMediaVariable(
60
+ --_ctm-dn-i#{$i}-im-gp,
61
+ #{prepareMediaVariable(--_ctm-dn-i1-im-gp)}
62
+ );
63
+ background-color: prepareMediaVariable(
64
+ --_ctm-dn-i#{$i}-bd-cr,
65
+ #{prepareMediaVariable(--_ctm-dn-i1-bd-cr)}
66
+ );
67
+ border-color: prepareMediaVariable(
68
+ --_ctm-dn-i#{$i}-br-cr,
69
+ #{prepareMediaVariable(--_ctm-dn-i1-br-cr)}
70
+ );
71
+ border-style: prepareMediaVariable(
72
+ --_ctm-dn-i#{$i}-br-se,
73
+ #{prepareMediaVariable(--_ctm-dn-i1-br-se)}
74
+ );
75
+ border-width: prepareMediaVariable(
76
+ --_ctm-dn-i#{$i}-br-wh,
77
+ #{prepareMediaVariable(--_ctm-dn-i1-br-wh)}
78
+ );
79
+ border-radius: prepareMediaVariable(
80
+ --_ctm-dn-i#{$i}-br-rs,
81
+ #{prepareMediaVariable(--_ctm-dn-i1-br-rs)}
82
+ );
83
+ // Each item's schema has carried showShadow/shadowColor/angle/spread/blur all
84
+ // along, but nothing ever read them — the only box-shadow declarations in this
85
+ // file were the container's. `--_show-item-shadow` is set to `none` by the
86
+ // item's own Show Shadow switch below.
87
+ box-shadow: var(
88
+ --_show-item-shadow,
89
+ prepareMediaVariable(
90
+ --_ctm-dn-i#{$i}-sw-ae,
91
+ #{prepareMediaVariable(--_ctm-dn-i1-sw-ae)}
92
+ )
93
+ prepareMediaVariable(
94
+ --_ctm-dn-i#{$i}-sw-br,
95
+ #{prepareMediaVariable(--_ctm-dn-i1-sw-br)}
96
+ )
97
+ prepareMediaVariable(
98
+ --_ctm-dn-i#{$i}-sw-sd,
99
+ #{prepareMediaVariable(--_ctm-dn-i1-sw-sd)}
100
+ )
101
+ prepareMediaVariable(
102
+ --_ctm-dn-i#{$i}-sw-cr,
103
+ #{prepareMediaVariable(--_ctm-dn-i1-sw-cr)}
104
+ )
105
+ );
106
+ &[data-item-shadow="false"] {
107
+ --_show-item-shadow: none;
108
+ }
109
+ color: prepareMediaVariable(
110
+ --_ctm-dn-i#{$i}-cr,
111
+ #{prepareMediaVariable(--_ctm-dn-i1-cr)}
112
+ );
113
+ font-family: prepareMediaVariable(
114
+ --_ctm-dn-i#{$i}-ft-fy,
115
+ #{prepareMediaVariable(--_ctm-dn-i1-ft-fy)}
116
+ );
117
+ &.flex__overflow {
118
+ white-space: normal;
119
+ @include restrictToLinesShow(#{var(--_sf-line-clamp, 1)});
120
+ }
121
+ font-size: prepareMediaVariable(
122
+ --_ctm-dn-i#{$i}-ft-se,
123
+ #{prepareMediaVariable(--_ctm-dn-i1-ft-se)}
124
+ );
125
+ font-weight: prepareMediaVariable(
126
+ --_ctm-dn-i#{$i}-ft-wt,
127
+ #{prepareMediaVariable(--_ctm-dn-i1-ft-wt)}
128
+ );
129
+ font-style: prepareMediaVariable(
130
+ --_ctm-dn-i#{$i}-ft-se-ic,
131
+ #{prepareMediaVariable(--_ctm-dn-i1-ft-se-ic)}
132
+ );
133
+ text-align: prepareMediaVariable(
134
+ --_ctm-dn-i#{$i}-tt-an,
135
+ #{prepareMediaVariable(--_ctm-dn-i1-tt-an)}
136
+ );
137
+ letter-spacing: prepareMediaVariable(
138
+ --_ctm-dn-i#{$i}-lr-sg,
139
+ #{prepareMediaVariable(--_ctm-dn-i1-lr-sg)}
140
+ );
141
+ line-height: prepareMediaVariable(
142
+ --_ctm-dn-i#{$i}-le-ht,
143
+ #{prepareMediaVariable(--_ctm-dn-i1-le-ht)}
144
+ );
145
+ text-decoration: prepareMediaVariable(
146
+ --_ctm-dn-i#{$i}-ue,
147
+ #{prepareMediaVariable(--_ctm-dn-i1-ue)}
148
+ );
149
+ // All three inherit, so setting them on the item is enough for the text node
150
+ // (and the `.scroll-item__text` span the clamp uses) to pick them up.
151
+ text-transform: prepareMediaVariable(
152
+ --_ctm-dn-i#{$i}-tt-tm,
153
+ #{prepareMediaVariable(--_ctm-dn-i1-tt-tm)}
154
+ );
155
+ word-wrap: prepareMediaVariable(
156
+ --_ctm-dn-i#{$i}-wd-wr,
157
+ #{prepareMediaVariable(--_ctm-dn-i1-wd-wr)}
158
+ );
159
+ word-break: prepareMediaVariable(
160
+ --_ctm-dn-i#{$i}-wd-bk,
161
+ #{prepareMediaVariable(--_ctm-dn-i1-wd-bk)}
162
+ );
163
+
164
+ .icon {
165
+ svg {
166
+ width: prepareMediaVariable(
167
+ --_ctm-dn-i#{$i}-in-se,
168
+ #{prepareMediaVariable(--_ctm-dn-i1-in-se)}
169
+ );
170
+ height: prepareMediaVariable(
171
+ --_ctm-dn-i#{$i}-in-se,
172
+ #{prepareMediaVariable(--_ctm-dn-i1-in-se)}
173
+ );
174
+ path {
175
+ stroke: prepareMediaVariable(
176
+ --_ctm-dn-i#{$i}-in-c1,
177
+ #{prepareMediaVariable(--_ctm-dn-i1-in-c1)}
178
+ );
179
+ // Overrides the stroke-width presentation attribute baked into the icon markup.
180
+ stroke-width: prepareMediaVariable(
181
+ --_ctm-dn-i#{$i}-se-wh,
182
+ #{prepareMediaVariable(--_ctm-dn-i1-se-wh)}
183
+ );
184
+ }
185
+ }
186
+ }
187
+ }
188
+ }
189
+
190
+ &[data-pause-on-hover="true"] .scrolling {
191
+ &:hover {
192
+ animation-play-state: paused;
193
+ }
194
+ }
195
+
196
+ &[data-scroll-direction="leftToRight"] .scrolling {
197
+ animation-direction: normal;
198
+ }
199
+
200
+ &[data-scroll-direction="rightToLeft"] .scrolling {
201
+ animation-direction: reverse;
202
+ }
203
+
204
+ // Vertical scroll. The horizontal marquee translates on X and lays the items out
205
+ // in a row; both have to flip for a vertical run, so the two vertical directions
206
+ // share this block and only differ by `animation-direction` below.
207
+ &[data-scroll-direction="topToBottom"],
208
+ &[data-scroll-direction="bottomToTop"] {
209
+ // `nowrap` is what keeps the horizontal run on one line; it fights a column stack.
210
+ white-space: normal;
211
+
212
+ .scrolling {
213
+ flex-direction: column;
214
+ // Full width so the items have room to sit left, centre or right inside the
215
+ // container. Left to size itself, the track is only as wide as its widest
216
+ // item and Horizontal Alignment would have no space to move anything in.
217
+ width: 100%;
218
+ animation-name: marquee-vertical;
219
+ padding-right: 0;
220
+ padding-bottom: 10px;
221
+ }
222
+
223
+ // Horizontal Alignment. The track is a column here, so its cross axis is the
224
+ // horizontal one and `align-items` is what places the items across it.
225
+ &[data-horizontal-alignment="left"] .scrolling {
226
+ align-items: flex-start;
227
+ }
228
+
229
+ &[data-horizontal-alignment="center"] .scrolling {
230
+ align-items: center;
231
+ }
232
+
233
+ &[data-horizontal-alignment="right"] .scrolling {
234
+ align-items: flex-end;
235
+ }
236
+
237
+ // The container is sized with `min-height`, which is right for a row (content
238
+ // never exceeds it) but wrong for a column: the stack would simply grow the box,
239
+ // nothing would overflow, and the marquee would look frozen. Pin the height.
240
+ .scroll__container {
241
+ height: var(--_ctm-mob-lt-ht, var(--_ctm-tab-lt-ht, var(--_ctm-lt-ht)));
242
+ align-items: flex-start;
243
+ }
244
+ }
245
+
246
+ // `marquee-vertical` translates upward, which reads as bottom-to-top on screen —
247
+ // so that is the `normal` case and top-to-bottom is the reversed one. Same trick
248
+ // as the horizontal pair above.
249
+ &[data-scroll-direction="bottomToTop"] .scrolling {
250
+ animation-direction: normal;
251
+ }
252
+
253
+ &[data-scroll-direction="topToBottom"] .scrolling {
254
+ animation-direction: reverse;
255
+ }
256
+
257
+ &[data-scroll-speed="0.5x"] .scrolling {
258
+ animation-duration: 40s;
259
+ }
260
+ &[data-scroll-speed="1x"] .scrolling {
261
+ animation-duration: 20s;
262
+ }
263
+ &[data-scroll-speed="2x"] .scrolling {
264
+ animation-duration: 10s;
265
+ }
266
+ &[data-scroll-speed="4x"] .scrolling {
267
+ animation-duration: 5s;
268
+ }
269
+
270
+ &[data-repeat-elements="true"] .scrolling {
271
+ animation-iteration-count: infinite;
272
+ }
273
+ &[data-repeat-elements="false"] .scrolling {
274
+ animation-iteration-count: 1;
275
+ }
276
+ }
277
+
278
+ // The Scroll Container's shadow is painted on `.wrapper` rather than on
279
+ // `.scroll__container`: the container fills the wrapper, and the wrapper clips
280
+ // (`overflow: hidden`), so a shadow on the container would be clipped away. An
281
+ // element's own box-shadow is never clipped by its own overflow, so the wrapper is
282
+ // the right box for it — and it carries the matching border-radius (see above) so
283
+ // the shadow follows the rounded shape instead of drawing a square glow.
284
+ //
285
+ // These were previously written as `&[data-widget-shadow=...]`, which targets the
286
+ // element root, but the attribute is emitted on `.wrapper` (unlike
287
+ // `data-widget-border`, which is on the root) — so neither rule ever matched.
288
+ & > .wrapper[data-widget-shadow="false"] {
289
+ box-shadow: none;
290
+ }
291
+
292
+ &[data-widget-border="true"] {
293
+ .scroll__container {
294
+ border-color: var(
295
+ --_ctm-mob-dn-sl-cr-br-cr,
296
+ var(--_ctm-tab-dn-sl-cr-br-cr, var(--_ctm-dn-sl-cr-br-cr))
297
+ );
298
+ border-style: var(
299
+ --_ctm-mob-dn-sl-cr-br-se,
300
+ var(--_ctm-tab-dn-sl-cr-br-se, var(--_ctm-dn-sl-cr-br-se))
301
+ );
302
+ border-width: var(
303
+ --_ctm-mob-dn-sl-cr-br-wh,
304
+ var(--_ctm-tab-dn-sl-cr-br-wh, var(--_ctm-dn-sl-cr-br-wh))
305
+ );
306
+ }
307
+ }
308
+
309
+ .scroll__container {
310
+ width: 100%;
311
+ // height: 100%;
312
+ min-height: var(--_ctm-mob-lt-ht, var(--_ctm-tab-lt-ht, var(--_ctm-lt-ht)));
313
+ padding: var(--_ctm-mob-lt-pg, var(--_ctm-tab-lt-pg, var(--_ctm-lt-pg)));
314
+ overflow: hidden;
315
+ white-space: nowrap;
316
+ display: flex;
317
+ justify-content: flex-start;
318
+ align-items: center;
319
+ background-color: var(
320
+ --_ctm-mob-dn-sl-cr-bd-cr,
321
+ var(--_ctm-tab-dn-sl-cr-bd-cr, var(--_ctm-dn-sl-cr-bd-cr))
322
+ );
323
+ border-radius: var(
324
+ --_ctm-mob-dn-sl-cr-br-rs,
325
+ var(--_ctm-tab-dn-sl-cr-br-rs, var(--_ctm-dn-sl-cr-br-rs))
326
+ );
327
+
328
+ .scrolling {
329
+ display: flex;
330
+ flex-direction: row;
331
+ justify-content: flex-start;
332
+ align-items: center;
333
+ flex-shrink: 0;
334
+ gap: var(--_ctm-mob-lt-im-sg, var(--_ctm-tab-lt-im-sg, var(--_ctm-lt-im-sg)));
335
+ padding-right: 10px;
336
+ animation-name: marquee;
337
+ animation-timing-function: linear;
338
+ }
339
+
340
+ // Text Overflow. The item's text sits in its own span so the clamp gets a block
341
+ // box of its own — clamping `.scroll-item` itself would swap its `display: flex`
342
+ // for `-webkit-box` and break the icon/text row. `white-space` has to be reset
343
+ // because `.wrapper` sets `nowrap`, and a clamp on a non-wrapping node can only
344
+ // ever show one line.
345
+ .scroll-item__text.flex__overflow {
346
+ @include restrictToLinesShow(#{var(--_sf-line-clamp, 1)});
347
+ white-space: normal;
348
+ }
349
+
350
+ .divider {
351
+ background-color: var(
352
+ --_ctm-mob-dn-dr-se-bd-cr,
353
+ var(--_ctm-tab-dn-dr-se-bd-cr, var(--_ctm-dn-dr-se-bd-cr))
354
+ );
355
+ padding: 3px;
356
+ font-size: var(
357
+ --_ctm-mob-dn-dr-se-se,
358
+ var(--_ctm-tab-dn-dr-se-se, var(--_ctm-dn-dr-se-se))
359
+ );
360
+ color: var(
361
+ --_ctm-mob-dn-dr-se-dr-cr,
362
+ var(--_ctm-tab-dn-dr-se-dr-cr, var(--_ctm-dn-dr-se-dr-cr))
363
+ );
364
+ }
365
+
366
+ .icon {
367
+ background-color: var(
368
+ --_ctm-mob-dn-dr-se-bd-cr,
369
+ var(--_ctm-tab-dn-dr-se-bd-cr, var(--_ctm-dn-dr-se-bd-cr))
370
+ );
371
+ padding: 3px;
372
+
373
+ svg {
374
+ width: var(--_ctm-mob-dn-dr-se-se, var(--_ctm-tab-dn-dr-se-se, var(--_ctm-dn-dr-se-se)));
375
+ height: var(--_ctm-mob-dn-dr-se-se, var(--_ctm-tab-dn-dr-se-se, var(--_ctm-dn-dr-se-se)));
376
+
377
+ path {
378
+ stroke: var(
379
+ --_ctm-mob-dn-dr-se-dr-cr,
380
+ var(--_ctm-tab-dn-dr-se-dr-cr, var(--_ctm-dn-dr-se-dr-cr))
381
+ );
382
+ }
383
+ }
384
+ }
385
+
386
+ // Divider Style > Stroke Width. Scoped to the dividers, which sit as direct
387
+ // children of the track — the items' own icons carry the same `.icon` class, so
388
+ // declaring this in the block above would let the divider's setting retune every
389
+ // item icon too. The value overrides the stroke-width baked into the icon markup;
390
+ // 1.25 matches the schema default.
391
+ > .scrolling > .icon svg path {
392
+ stroke-width: prepareMediaVariable(--_ctm-dn-dr-se-se-wh, 1.25);
393
+ }
394
+
395
+ @keyframes marquee {
396
+ 0% {
397
+ transform: translateX(0);
398
+ }
399
+ 100% {
400
+ transform: translateX(var(--_marquee-tx, -50%));
401
+ }
402
+ }
403
+
404
+ @keyframes marquee-vertical {
405
+ 0% {
406
+ transform: translateY(0);
407
+ }
408
+ 100% {
409
+ transform: translateY(var(--_marquee-ty, -50%));
410
+ }
411
+ }
412
+ }
413
+ }
414
+ }