@sc-360-v2/storefront-cms-library 0.5.53 → 0.5.55

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 (106) hide show
  1. package/dist/add-products-tab-details.scss +3 -0
  2. package/dist/allocation-header-quota-details.scss +520 -0
  3. package/dist/allocationDetails.scss +617 -644
  4. package/dist/allocations-quota-details.scss +454 -0
  5. package/dist/allocations.scss +8 -0
  6. package/dist/amount-estimator.scss +1088 -1083
  7. package/dist/badge.scss +396 -388
  8. package/dist/breadcrumbs.scss +17 -0
  9. package/dist/builder.js +1 -1
  10. package/dist/bulk-variant-picker.scss +4 -0
  11. package/dist/bundle copy.scss +26 -0
  12. package/dist/bundle.scss +10 -0
  13. package/dist/bundleDetails.scss +14 -0
  14. package/dist/button copy.scss +2 -0
  15. package/dist/button.scss +2 -0
  16. package/dist/buyForHeaders.scss +19 -0
  17. package/dist/cart-details.scss +101 -18
  18. package/dist/cart-summary.scss +18 -0
  19. package/dist/cart.scss +2 -0
  20. package/dist/cartAttributes.scss +4 -0
  21. package/dist/category-groups-quota-details.scss +124 -38
  22. package/dist/checkout.scss +6 -0
  23. package/dist/countdown.scss +2 -0
  24. package/dist/coupon.scss +8 -0
  25. package/dist/embroidery.scss +2 -0
  26. package/dist/employee-bulk-order.scss +5 -0
  27. package/dist/faq.scss +9 -0
  28. package/dist/filters.scss +2 -0
  29. package/dist/form-zindex-module.scss +24 -24
  30. package/dist/gallery-slider-temp.scss +205 -14
  31. package/dist/hotspot.scss +5 -1
  32. package/dist/icon-list.scss +2 -0
  33. package/dist/kitDetails.scss +2 -0
  34. package/dist/kits.scss +2 -0
  35. package/dist/language-selector.scss +2 -0
  36. package/dist/last-x-orders.scss +5 -0
  37. package/dist/login.scss +63 -9
  38. package/dist/map.scss +6 -0
  39. package/dist/mega-menu.scss +41 -0
  40. package/dist/menu-v2.scss +83 -6
  41. package/dist/order-status.scss +228 -136
  42. package/dist/past-orders.scss +989 -975
  43. package/dist/pickup-locations.scss +1172 -1167
  44. package/dist/product-image-allocation.scss +59 -0
  45. package/dist/product-inventory.scss +1381 -1378
  46. package/dist/product-promotions.scss +2768 -2759
  47. package/dist/product-sizechart.scss +4 -0
  48. package/dist/profile.scss +8 -0
  49. package/dist/quantity-selector.scss +4 -0
  50. package/dist/quick-inventory-check.scss +5 -0
  51. package/dist/quick-order-pad.scss +5 -0
  52. package/dist/quota-details.scss +99 -15
  53. package/dist/repeater copy.scss +3 -0
  54. package/dist/repeater-grid-toggle.scss +2 -0
  55. package/dist/repeater.scss +2 -0
  56. package/dist/rfqs.scss +10 -0
  57. package/dist/scroll.scss +46 -0
  58. package/dist/search.scss +4 -0
  59. package/dist/shipping-payments.scss +4 -0
  60. package/dist/social.scss +5 -0
  61. package/dist/store-locations.scss +1402 -1398
  62. package/dist/tab-v2.scss +2 -0
  63. package/dist/table-common.scss +509 -506
  64. package/dist/table.scss +687 -685
  65. package/dist/types/builder/tools/element-edit/addProductsTab.d.ts +28 -0
  66. package/dist/types/builder/tools/element-edit/allocationDetails.d.ts +5 -0
  67. package/dist/types/builder/tools/element-edit/allocations.d.ts +1 -0
  68. package/dist/types/builder/tools/element-edit/breadcrumbs.d.ts +5 -0
  69. package/dist/types/builder/tools/element-edit/bundle.d.ts +40 -0
  70. package/dist/types/builder/tools/element-edit/bundleDetails.d.ts +20 -0
  71. package/dist/types/builder/tools/element-edit/buttonInstance.d.ts +18 -0
  72. package/dist/types/builder/tools/element-edit/buyForWithTab.d.ts +1 -0
  73. package/dist/types/builder/tools/element-edit/cartAttributes.d.ts +9 -0
  74. package/dist/types/builder/tools/element-edit/cartDetails.d.ts +79 -1
  75. package/dist/types/builder/tools/element-edit/cartSummary.d.ts +259 -0
  76. package/dist/types/builder/tools/element-edit/categoryGroups.d.ts +28 -0
  77. package/dist/types/builder/tools/element-edit/checkout.d.ts +1 -0
  78. package/dist/types/builder/tools/element-edit/common.d.ts +23 -0
  79. package/dist/types/builder/tools/element-edit/countdown.d.ts +1 -0
  80. package/dist/types/builder/tools/element-edit/coupon.d.ts +19 -0
  81. package/dist/types/builder/tools/element-edit/embroidery.d.ts +9 -0
  82. package/dist/types/builder/tools/element-edit/filterResults.d.ts +10 -0
  83. package/dist/types/builder/tools/element-edit/gallery-slider.d.ts +19 -0
  84. package/dist/types/builder/tools/element-edit/icon-list.d.ts +31 -0
  85. package/dist/types/builder/tools/element-edit/iconInstace.d.ts +1 -0
  86. package/dist/types/builder/tools/element-edit/iconLibrary.d.ts +2 -7
  87. package/dist/types/builder/tools/element-edit/kitDetails.d.ts +19 -0
  88. package/dist/types/builder/tools/element-edit/kits.d.ts +9 -0
  89. package/dist/types/builder/tools/element-edit/language-menu.d.ts +0 -1
  90. package/dist/types/builder/tools/element-edit/orderStatus.d.ts +320 -168
  91. package/dist/types/builder/tools/element-edit/quickLinks.d.ts +10 -0
  92. package/dist/types/builder/tools/element-edit/quotaDetails.d.ts +1 -0
  93. package/dist/types/builder/tools/element-edit/rfqs.d.ts +5 -0
  94. package/dist/types/builder/tools/element-edit/scroll.d.ts +1 -0
  95. package/dist/types/builder/tools/element-edit/shipping-payments.d.ts +2 -0
  96. package/dist/types/builder/tools/element-edit/social.d.ts +1 -0
  97. package/dist/types/builder/tools/element-edit/table.d.ts +1 -0
  98. package/dist/types/builder/tools/element-edit/tabs.d.ts +18 -0
  99. package/dist/types/builder/tools/element-edit/tabsV2.d.ts +17 -0
  100. package/dist/types/builder/tools/element-edit/userElements.d.ts +197 -7
  101. package/dist/types/builder/tools/element-edit/video.d.ts +2 -0
  102. package/dist/user-elements.scss +263 -221
  103. package/dist/variant-picker.scss +2 -0
  104. package/dist/video.scss +2 -0
  105. package/dist/volume-pricing.scss +3 -0
  106. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- @use "sass:map";
1
+ @use "sass:map";
2
2
  @use "sass:list";
3
3
  @use "./functions.scss" as *;
4
4
  $overflowSelector: ".flex__overflow";
@@ -12,7 +12,7 @@ $defaultValues: (
12
12
  );
13
13
  // ---------------------------------------------------------------------------
14
14
  // Tree view (Allocations View = "Tree"). Generated CSS-var bases for
15
- // design.sidebarDesign.* the path shortcodes come from splitCamelCaseAndJoin.
15
+ // design.sidebarDesign.* — the path shortcodes come from splitCamelCaseAndJoin.
16
16
  // The rules below are the Category Groups sidebar rules, kept deliberately
17
17
  // identical so the two trees look and behave the same; only the var bases and
18
18
  // class prefix differ.
@@ -24,8 +24,11 @@ $ad-tree: "--_ctm-dn-sr-dn-pe-rw"; // sidebarDesign.profileRow
24
24
  $ad-tree-icon: "--_ctm-dn-sr-dn-pe-te-in"; // sidebarDesign.profileTreeIcon
25
25
  $ad-subtree: "--_ctm-dn-sr-dn-an-rw"; // sidebarDesign.allocationRow
26
26
  $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
27
+ $ad-slider-arrows: "--_ctm-dn-sr-pn-as"; // design.slider.paginationArrows
27
28
 
28
- @mixin ad-font($base, $color, $size, $weight: 600) {
29
+ // $transform is the fallback for Text Transform, so a row that already rendered
30
+ // uppercase keeps doing so on elements saved before the control existed.
31
+ @mixin ad-font($base, $color, $size, $weight: 600, $transform: none) {
29
32
  color: prepareMediaVariable(#{$base}-cr, $color);
30
33
  font-family: prepareMediaVariable(#{$base}-ft-fy, ("Inter", sans-serif));
31
34
  font-size: prepareMediaVariable(#{$base}-ft-se, $size);
@@ -35,6 +38,83 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
35
38
  letter-spacing: prepareMediaVariable(#{$base}-lr-sg);
36
39
  line-height: prepareMediaVariable(#{$base}-le-ht);
37
40
  text-decoration: prepareMediaVariable(#{$base}-ue);
41
+ text-transform: prepareMediaVariable(#{$base}-tt-tm, $transform);
42
+ word-wrap: prepareMediaVariable(#{$base}-wd-wp, normal);
43
+ word-break: prepareMediaVariable(#{$base}-wd-bk, normal);
44
+ }
45
+
46
+ // Text Transform and the word wrap/break pair the typography panel groups with it.
47
+ // $suffix is "-dc" for the sections whose Value block writes the *Desc keys.
48
+ @mixin ad-text-transform($base, $suffix: "", $transform: none) {
49
+ text-transform: prepareMediaVariable(#{$base}-tt-tm#{$suffix}, $transform);
50
+ word-wrap: prepareMediaVariable(#{$base}-wd-wp#{$suffix}, normal);
51
+ word-break: prepareMediaVariable(#{$base}-wd-bk#{$suffix}, normal);
52
+ }
53
+
54
+ // Text Overflow: the renderer adds `.flex__overflow` and publishes the line count,
55
+ // so the clamp only applies once the toggle is on. `white-space: normal` undoes any
56
+ // `nowrap` above it — the text has to wrap before it can be restricted to N lines.
57
+ @mixin ad-text-overflow($clampVar: --_sf-line-clamp) {
58
+ &#{$overflowSelector} {
59
+ white-space: normal;
60
+ @include restrictToLinesShow(#{var($clampVar, 1)});
61
+ }
62
+ }
63
+
64
+ // Container box for the sections whose schema has always carried Padding, Fill,
65
+ // Border, Border Radius and Shadow but which only ever rendered their font — the
66
+ // controls were there and did nothing (Brand, Code).
67
+ //
68
+ // Every fallback is the neutral value, not `prepareMediaVariable`'s `inherit`
69
+ // default: these boxes had no such rule at all until now, so an untouched card has
70
+ // to keep rendering byte for byte as it did. `inherit` would quietly hand them the
71
+ // parent's padding and fill, and a non-zero radius default would round every card
72
+ // nobody had styled.
73
+ @mixin ad-section-box($base) {
74
+ padding: prepareMediaVariable(#{$base}-pg, 0);
75
+ background-color: prepareMediaVariable(#{$base}-bd-cr, transparent);
76
+ border-color: prepareMediaVariable(#{$base}-br-cr, transparent);
77
+ border-style: prepareMediaVariable(#{$base}-br-se, solid);
78
+ border-width: prepareMediaVariable(#{$base}-br-wh, 0);
79
+ border-radius: prepareMediaVariable(#{$base}-br-rs, 0);
80
+ box-shadow: var(
81
+ --_show-shadow,
82
+ prepareMediaVariable(#{$base}-sw-ae, 0 0) prepareMediaVariable(#{$base}-sw-br, 0)
83
+ prepareMediaVariable(#{$base}-sw-sd, 0) prepareMediaVariable(#{$base}-sw-cr, transparent)
84
+ );
85
+ }
86
+
87
+ // The icon a Brand / Code block can carry in front of its value. Sized and coloured
88
+ // from the section's own Icon settings, and told to hold its width so a long value
89
+ // wrapping beside it cannot squeeze the glyph.
90
+ @mixin ad-section-icon($base) {
91
+ display: flex;
92
+ align-items: center;
93
+ justify-content: center;
94
+ flex-shrink: 0;
95
+ color: prepareMediaVariable(#{$base}-in-c1, currentColor);
96
+
97
+ svg {
98
+ width: prepareMediaVariable(#{$base}-in-se, 16px);
99
+ height: prepareMediaVariable(#{$base}-in-se, 16px);
100
+
101
+ // Apply the configured colour even when the fetched SVG hardcodes its own
102
+ // stroke/fill (parts explicitly set to "none" are left alone).
103
+ &[stroke]:not([stroke="none"]),
104
+ [stroke]:not([stroke="none"]) {
105
+ stroke: prepareMediaVariable(#{$base}-in-c1, currentColor);
106
+ }
107
+ &[fill]:not([fill="none"]),
108
+ [fill]:not([fill="none"]) {
109
+ fill: prepareMediaVariable(#{$base}-in-c1, currentColor);
110
+ }
111
+ }
112
+
113
+ img {
114
+ width: prepareMediaVariable(#{$base}-in-se, 16px);
115
+ height: prepareMediaVariable(#{$base}-in-se, 16px);
116
+ object-fit: contain;
117
+ }
38
118
  }
39
119
 
40
120
  @mixin ad-design($base) {
@@ -86,6 +166,80 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
86
166
  #{$base}-#{$state}-ue,
87
167
  prepareMediaVariable(#{$base}-dt-se-ue)
88
168
  );
169
+ text-transform: prepareMediaVariable(
170
+ #{$base}-#{$state}-tt-tm,
171
+ prepareMediaVariable(#{$base}-dt-se-tt-tm, none)
172
+ );
173
+ word-wrap: prepareMediaVariable(
174
+ #{$base}-#{$state}-wd-wp,
175
+ prepareMediaVariable(#{$base}-dt-se-wd-wp, normal)
176
+ );
177
+ word-break: prepareMediaVariable(
178
+ #{$base}-#{$state}-wd-bk,
179
+ prepareMediaVariable(#{$base}-dt-se-wd-bk, normal)
180
+ );
181
+ }
182
+
183
+ // Padding, and the icon-to-label gap on the profile row, per interaction state.
184
+ // Same default-state fallback as ad-design-state; kept separate because only the
185
+ // profile row has an item gap — the allocation row is a lone label with nothing to
186
+ // space, so $gap is left out there rather than emitting a gap it never uses.
187
+ @mixin ad-layout-state($base, $state, $padding, $gap: null) {
188
+ padding: prepareMediaVariable(
189
+ #{$base}-#{$state}-pg,
190
+ prepareMediaVariable(#{$base}-dt-se-pg, $padding)
191
+ );
192
+ @if $gap != null {
193
+ gap: prepareMediaVariable(
194
+ #{$base}-#{$state}-im-gp,
195
+ prepareMediaVariable(#{$base}-dt-se-im-gp, $gap)
196
+ );
197
+ }
198
+ }
199
+
200
+ // One key of the profile tree icon, resolved for an interaction state.
201
+ //
202
+ // $state is the state segment ("dt-se" | "hr-se" | "sd-se") and $key the icon key
203
+ // ("in-se" / "in-c1" for the collapsed icon, "in-se-ed" / "in-cr-ed" for the
204
+ // expanded one). Hover and selected fall back to the default state, so editing
205
+ // Default still cascades — the same rule the rows either side of the icon follow.
206
+ // The innermost fallback is the stateless variable this section used before it had
207
+ // states, which is what keeps trees saved back then rendering unchanged.
208
+ @function ad-tree-icon-var($state, $key, $fallback) {
209
+ $legacy: prepareMediaVariable(#{$ad-tree-icon}-#{$key}, $fallback);
210
+
211
+ @if $state == "dt-se" {
212
+ @return prepareMediaVariable(#{$ad-tree-icon}-dt-se-#{$key}, $legacy);
213
+ }
214
+
215
+ @return prepareMediaVariable(
216
+ #{$ad-tree-icon}-#{$state}-#{$key},
217
+ prepareMediaVariable(#{$ad-tree-icon}-dt-se-#{$key}, $legacy)
218
+ );
219
+ }
220
+
221
+ // Size + colour of the tree icon for one state. The colour is applied to the
222
+ // element and to the fetched SVG's own stroke/fill, since a custom icon may
223
+ // hardcode them (parts explicitly set to "none" are left alone).
224
+ @mixin ad-tree-icon($state, $sizeKey, $colorKey, $fallbackSize: 20px, $fallbackColor: #002a4e) {
225
+ $size: ad-tree-icon-var($state, $sizeKey, $fallbackSize);
226
+ $color: ad-tree-icon-var($state, $colorKey, $fallbackColor);
227
+
228
+ color: $color;
229
+
230
+ svg {
231
+ width: $size;
232
+ height: $size;
233
+
234
+ &[stroke]:not([stroke="none"]),
235
+ [stroke]:not([stroke="none"]) {
236
+ stroke: $color;
237
+ }
238
+ &[fill]:not([fill="none"]),
239
+ [fill]:not([fill="none"]) {
240
+ fill: $color;
241
+ }
242
+ }
89
243
  }
90
244
 
91
245
  @mixin ad-design-state($base, $state) {
@@ -271,6 +425,8 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
271
425
  );
272
426
  text-decoration: var(--_ctm-mob-dn-te-ue, var(--_ctm-tab-dn-te-ue, var(--_ctm-dn-te-ue)));
273
427
  padding: prepareMediaVariable(--_ctm-dn-te-pg);
428
+ @include ad-text-transform(--_ctm-dn-te);
429
+ @include ad-text-overflow;
274
430
  }
275
431
  }
276
432
 
@@ -301,13 +457,23 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
301
457
  .allocation__item {
302
458
  @import "./product-image-allocation.scss";
303
459
 
460
+ // The configured Width must NOT go into flex-basis. In grid view the card
461
+ // is a column flex container, where basis is the main axis — the HEIGHT —
462
+ // so putting the width there silently overrode the Height (px) the import
463
+ // above sets, and the control looked dead. `auto` lets Width and Height
464
+ // each land on their own axis in both views; `0 0` still keeps the image
465
+ // from shrinking, which is the only thing the explicit basis was for.
304
466
  .product__image_element {
305
- flex: 0 0 prepareMediaVariable(--_ctm-dn-ie-lt-wh);
467
+ flex: 0 0 auto;
306
468
  }
307
469
 
308
470
  display: flex;
309
471
  flex-direction: column;
310
- gap: 10px;
472
+ // Allocation > Item Gap. Spaces the header from the card grid below it;
473
+ // the same value spaces the header's own two parts (see `.showcase__title`),
474
+ // so name -> quota details -> cards keep one rhythm. 10px is what was
475
+ // hardcoded here before, so an untouched element does not move.
476
+ gap: prepareMediaVariable(--_ctm-dn-an-im-gp, 10px);
311
477
  background-color: var(
312
478
  --_ctm-mob-dn-an-an-im-bd-cr,
313
479
  var(--_ctm-tab-dn-an-an-im-bd-cr, var(--_ctm-dn-an-an-im-bd-cr))
@@ -357,214 +523,32 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
357
523
  var(--_ctm-tab-dn-an-an-im-pg, var(--_ctm-dn-an-an-im-pg))
358
524
  );
359
525
 
360
- .quota__left {
361
- background-color: var(
362
- --_ctm-mob-dn-an-qa-lt-bd-cr,
363
- var(--_ctm-tab-dn-an-qa-lt-bd-cr, var(--_ctm-dn-an-qa-lt-bd-cr))
364
- );
365
-
366
- border-color: var(
367
- --_ctm-mob-dn-an-qa-lt-br-cr,
368
- var(--_ctm-tab-dn-an-qa-lt-br-cr, var(--_ctm-dn-an-qa-lt-br-cr))
369
- );
370
-
371
- border-style: var(
372
- --_ctm-mob-dn-an-qa-lt-br-se,
373
- var(--_ctm-tab-dn-an-qa-lt-br-se, var(--_ctm-dn-an-qa-lt-br-se))
374
- );
375
-
376
- border-width: var(
377
- --_ctm-mob-dn-an-qa-lt-br-wh,
378
- var(--_ctm-tab-dn-an-qa-lt-br-wh, var(--_ctm-dn-an-qa-lt-br-wh))
379
- );
380
-
381
- border-radius: var(
382
- --_ctm-mob-dn-an-qa-lt-br-rs,
383
- var(--_ctm-tab-dn-an-qa-lt-br-rs, var(--_ctm-dn-an-qa-lt-br-rs))
384
- );
385
-
386
- box-shadow: var(
387
- --_show-shadow,
388
- var(
389
- --_ctm-mob-dn-an-qa-lt-sw-ae,
390
- var(--_ctm-tab-dn-an-qa-lt-sw-ae, var(--_ctm-dn-an-qa-lt-sw-ae))
391
- )
392
- var(
393
- --_ctm-mob-dn-an-qa-lt-sw-br,
394
- var(--_ctm-tab-dn-an-qa-lt-sw-br, var(--_ctm-dn-an-qa-lt-sw-br))
395
- )
396
- var(
397
- --_ctm-mob-dn-an-qa-lt-sw-sd,
398
- var(--_ctm-tab-dn-an-qa-lt-sw-sd, var(--_ctm-dn-an-qa-lt-sw-sd))
399
- )
400
- var(
401
- --_ctm-mob-dn-an-qa-lt-sw-cr,
402
- var(--_ctm-tab-dn-an-qa-lt-sw-cr, var(--_ctm-dn-an-qa-lt-sw-cr))
403
- )
404
- );
405
- white-space: nowrap;
406
-
407
- height: 100%;
408
-
409
- padding: prepareMediaVariable(--_ctm-dn-an-qa-lt-pg);
410
- .label {
411
- color: var(
412
- --_ctm-mob-dn-an-qa-lt-cr,
413
- var(--_ctm-tab-dn-an-qa-lt-cr, var(--_ctm-dn-an-qa-lt-cr))
414
- );
415
- font-family: var(
416
- --_ctm-mob-dn-an-qa-lt-ft-fy,
417
- var(--_ctm-tab-dn-an-qa-lt-ft-fy, var(--_ctm-dn-an-qa-lt-ft-fy))
418
- );
419
- font-size: var(
420
- --_ctm-mob-dn-an-qa-lt-ft-se,
421
- var(--_ctm-tab-dn-an-qa-lt-ft-se, var(--_ctm-dn-an-qa-lt-ft-se))
422
- );
423
- font-weight: var(
424
- --_ctm-mob-dn-an-qa-lt-ft-wt,
425
- var(--_ctm-tab-dn-an-qa-lt-ft-wt, var(--_ctm-dn-an-qa-lt-ft-wt))
426
- );
427
- font-style: var(
428
- --_ctm-mob-dn-an-qa-lt-ft-se-ic,
429
- var(--_ctm-tab-dn-an-qa-lt-ft-se-ic, var(--_ctm-dn-an-qa-lt-ft-se-ic))
430
- );
431
- text-align: var(
432
- --_ctm-mob-dn-an-qa-lt-tt-an,
433
- var(--_ctm-tab-dn-an-qa-lt-tt-an, var(--_ctm-dn-an-qa-lt-tt-an))
434
- );
435
- letter-spacing: var(
436
- --_ctm-mob-dn-an-qa-lt-lr-sg,
437
- var(--_ctm-tab-dn-an-qa-lt-lr-sg, var(--_ctm-dn-an-qa-lt-lr-sg))
438
- );
439
- line-height: var(
440
- --_ctm-mob-dn-an-qa-lt-le-ht,
441
- var(--_ctm-tab-dn-an-qa-lt-le-ht, var(--_ctm-dn-an-qa-lt-le-ht))
442
- );
443
- text-decoration: var(
444
- --_ctm-mob-dn-an-qa-lt-ue,
445
- var(--_ctm-tab-dn-an-qa-lt-ue, var(--_ctm-dn-an-qa-lt-ue))
446
- );
447
- }
448
- .value {
449
- // padding-block-end: var(--_sf-dc-pd-bt);
526
+ // Quota details in the allocation header. It renders the same embedded
527
+ // Quota Details element the cards do, from its own copy of the settings,
528
+ // so the rules come from a rebound copy of the card stylesheet rather than
529
+ // being written out again here.
530
+ .showcase__title {
531
+ // A row now, because the view switcher sits in this header beside the
532
+ // name and quota rather than up in `.main__header`. `flex-start` lets the
533
+ // switcher's own Vertical Alignment decide where it sits against the
534
+ // taller text column — in a row, align-self IS the vertical axis, which
535
+ // is what Top / Center / Bottom means.
536
+ display: flex;
537
+ align-items: flex-start;
538
+ justify-content: space-between;
539
+ gap: prepareMediaVariable(--_ctm-dn-an-im-gp, 10px);
450
540
 
451
- color: var(
452
- --_ctm-mob-dn-an-qa-lt-cr-dc,
453
- var(--_ctm-tab-dn-an-qa-lt-cr-dc, var(--_ctm-dn-an-qa-lt-cr-dc))
454
- );
455
- font-family: var(
456
- --_ctm-mob-dn-an-qa-lt-ft-fy-dc,
457
- var(--_ctm-tab-dn-an-qa-lt-ft-fy-dc, var(--_ctm-dn-an-qa-lt-ft-fy-dc))
458
- );
459
- font-size: var(
460
- --_ctm-mob-dn-an-qa-lt-ft-se-dc,
461
- var(--_ctm-tab-dn-an-qa-lt-ft-se-dc, var(--_ctm-dn-an-qa-lt-ft-se-dc))
462
- );
463
- font-weight: var(
464
- --_ctm-mob-dn-an-qa-lt-ft-wt-dc,
465
- var(--_ctm-tab-dn-an-qa-lt-ft-wt-dc, var(--_ctm-dn-an-qa-lt-ft-wt-dc))
466
- );
467
- font-style: var(
468
- --_ctm-mob-dn-an-qa-lt-ft-se-ic-dc,
469
- var(--_ctm-tab-dn-an-qa-lt-ft-se-ic-dc, var(--_ctm-dn-an-qa-lt-ft-se-ic-dc))
470
- );
471
- text-align: var(
472
- --_ctm-mob-dn-an-qa-lt-tt-an-dc,
473
- var(--_ctm-tab-dn-an-qa-lt-tt-an-dc, var(--_ctm-dn-an-qa-lt-tt-an-dc))
474
- );
475
- letter-spacing: var(
476
- --_ctm-mob-dn-an-qa-lt-lr-sg-dc,
477
- var(--_ctm-tab-dn-an-qa-lt-lr-sg-dc, var(--_ctm-dn-an-qa-lt-lr-sg-dc))
478
- );
479
- line-height: var(
480
- --_ctm-mob-dn-an-qa-lt-le-ht-dc,
481
- var(--_ctm-tab-dn-an-qa-lt-le-ht-dc, var(--_ctm-dn-an-qa-lt-le-ht-dc))
482
- );
483
- text-decoration: var(
484
- --_ctm-mob-dn-an-qa-lt-ue-dc,
485
- var(--_ctm-tab-dn-an-qa-lt-ue-dc, var(--_ctm-dn-an-qa-lt-ue-dc))
486
- );
487
- }
488
- }
489
- .days__left {
490
- .label {
491
- color: var(
492
- --_ctm-mob-dn-an-es-in-cr,
493
- var(--_ctm-tab-dn-an-es-in-cr, var(--_ctm-dn-an-es-in-cr))
494
- );
495
- font-family: var(
496
- --_ctm-mob-dn-an-es-in-ft-fy,
497
- var(--_ctm-tab-dn-an-es-in-ft-fy, var(--_ctm-dn-an-es-in-ft-fy))
498
- );
499
- font-size: var(
500
- --_ctm-mob-dn-an-es-in-ft-se,
501
- var(--_ctm-tab-dn-an-es-in-ft-se, var(--_ctm-dn-an-es-in-ft-se))
502
- );
503
- font-weight: var(
504
- --_ctm-mob-dn-an-es-in-ft-wt,
505
- var(--_ctm-tab-dn-an-es-in-ft-wt, var(--_ctm-dn-an-es-in-ft-wt))
506
- );
507
- font-style: var(
508
- --_ctm-mob-dn-an-es-in-ft-se-ic,
509
- var(--_ctm-tab-dn-an-es-in-ft-se-ic, var(--_ctm-dn-an-es-in-ft-se-ic))
510
- );
511
- text-align: var(
512
- --_ctm-mob-dn-an-es-in-tt-an,
513
- var(--_ctm-tab-dn-an-es-in-tt-an, var(--_ctm-dn-an-es-in-tt-an))
514
- );
515
- letter-spacing: var(
516
- --_ctm-mob-dn-an-es-in-lr-sg,
517
- var(--_ctm-tab-dn-an-es-in-lr-sg, var(--_ctm-dn-an-es-in-lr-sg))
518
- );
519
- line-height: var(
520
- --_ctm-mob-dn-an-es-in-le-ht,
521
- var(--_ctm-tab-dn-an-es-in-le-ht, var(--_ctm-dn-an-es-in-le-ht))
522
- );
523
- text-decoration: var(
524
- --_ctm-mob-dn-an-es-in-ue,
525
- var(--_ctm-tab-dn-an-es-in-ue, var(--_ctm-dn-an-es-in-ue))
526
- );
541
+ // The name and quota keep their own column, so Allocation > Item Gap goes
542
+ // on spacing those two rather than pushing the switcher around.
543
+ .showcase__title__info {
544
+ display: flex;
545
+ flex-direction: column;
546
+ gap: prepareMediaVariable(--_ctm-dn-an-im-gp, 10px);
547
+ flex: 1;
548
+ min-width: 0;
527
549
  }
528
- .value {
529
- // padding-block-end: var(--_sf-dc-pd-bt);
530
550
 
531
- color: var(
532
- --_ctm-mob-dn-an-es-in-cr-dc,
533
- var(--_ctm-tab-dn-an-es-in-cr-dc, var(--_ctm-dn-an-es-in-cr-dc))
534
- );
535
- font-family: var(
536
- --_ctm-mob-dn-an-es-in-ft-fy-dc,
537
- var(--_ctm-tab-dn-an-es-in-ft-fy-dc, var(--_ctm-dn-an-es-in-ft-fy-dc))
538
- );
539
- font-size: var(
540
- --_ctm-mob-dn-an-es-in-ft-se-dc,
541
- var(--_ctm-tab-dn-an-es-in-ft-se-dc, var(--_ctm-dn-an-es-in-ft-se-dc))
542
- );
543
- font-weight: var(
544
- --_ctm-mob-dn-an-es-in-ft-wt-dc,
545
- var(--_ctm-tab-dn-an-es-in-ft-wt-dc, var(--_ctm-dn-an-es-in-ft-wt-dc))
546
- );
547
- font-style: var(
548
- --_ctm-mob-dn-an-es-in-ft-se-ic-dc,
549
- var(--_ctm-tab-dn-an-es-in-ft-se-ic-dc, var(--_ctm-dn-an-es-in-ft-se-ic-dc))
550
- );
551
- text-align: var(
552
- --_ctm-mob-dn-an-es-in-tt-an-dc,
553
- var(--_ctm-tab-dn-an-es-in-tt-an-dc, var(--_ctm-dn-an-es-in-tt-an-dc))
554
- );
555
- letter-spacing: var(
556
- --_ctm-mob-dn-an-es-in-lr-sg-dc,
557
- var(--_ctm-tab-dn-an-es-in-lr-sg-dc, var(--_ctm-dn-an-es-in-lr-sg-dc))
558
- );
559
- line-height: var(
560
- --_ctm-mob-dn-an-es-in-le-ht-dc,
561
- var(--_ctm-tab-dn-an-es-in-le-ht-dc, var(--_ctm-dn-an-es-in-le-ht-dc))
562
- );
563
- text-decoration: var(
564
- --_ctm-mob-dn-an-es-in-ue-dc,
565
- var(--_ctm-tab-dn-an-es-in-ue-dc, var(--_ctm-dn-an-es-in-ue-dc))
566
- );
567
- }
551
+ @import "./allocation-header-quota-details.scss";
568
552
  }
569
553
 
570
554
  .allocation__name {
@@ -651,6 +635,8 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
651
635
  var(--_ctm-tab-dn-an-an-ne-ue, var(--_ctm-dn-an-an-ne-ue))
652
636
  );
653
637
  padding: prepareMediaVariable(--_ctm-dn-an-an-ne-pg);
638
+ @include ad-text-transform(--_ctm-dn-an-an-ne);
639
+ @include ad-text-overflow;
654
640
  }
655
641
  }
656
642
 
@@ -707,107 +693,191 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
707
693
  }
708
694
  }
709
695
  }
710
- .button__group {
711
- display: flex;
712
- gap: 12px;
713
- margin-left: auto;
696
+ }
697
+
698
+ // The view switcher lives in the allocation header (`.showcase__title`), not
699
+ // in `.main__header` where it started, so its rules sit at showcase level and
700
+ // reach it wherever it is nested.
701
+ .button__group {
702
+ display: flex;
703
+ gap: 12px;
704
+ margin-left: auto;
705
+ // Grid View Control Style > Layout Style > Vertical Alignment. The
706
+ // renderer publishes the stored word (top / center / bottom); those are
707
+ // not align-self keywords, so the mapping is done here rather than
708
+ // written into every saved element.
709
+ align-self: center;
710
+ &[data-vertical-align="top"] {
711
+ align-self: flex-start;
714
712
  }
715
- .product__views {
716
- display: flex;
717
- // background-color: #fff;
718
- // border: 1px solid var(--_gray-300);
719
- border-radius: 4px;
720
- border-style: prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-lt-se-br-se, solid);
721
- border-width: prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-lt-se-br-wh, 1px);
722
- border-color: prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-lt-se-br-cr, var(--_gray-200));
723
- background-color: prepareMediaVariable(
724
- --_ctm-dn-gd-vw-cl-se-lt-se-bd-cr,
725
- var(--_base-white)
726
- );
727
- // height: 40px;
728
- // overflow: hidden;
713
+ &[data-vertical-align="center"] {
714
+ align-self: center;
715
+ }
716
+ &[data-vertical-align="bottom"] {
717
+ align-self: flex-end;
718
+ }
719
+ }
720
+ .product__views {
721
+ display: flex;
722
+ // background-color: #fff;
723
+ // border: 1px solid var(--_gray-300);
724
+ border-radius: 4px;
725
+ border-style: prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-lt-se-br-se, solid);
726
+ border-width: prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-lt-se-br-wh, 1px);
727
+ border-color: prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-lt-se-br-cr, var(--_gray-200));
728
+ background-color: prepareMediaVariable(
729
+ --_ctm-dn-gd-vw-cl-se-lt-se-bd-cr,
730
+ var(--_base-white)
731
+ );
732
+ // height: 40px;
733
+ // overflow: hidden;
734
+
735
+ // Hoisted out of `.btn` so the "Icon + Text" rules further down can size
736
+ // themselves off the same icon measurement.
737
+ $size: #{var(
738
+ --_sf-at-btn-size,
739
+ #{prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-bn-dt-se-in-se, var(--_width-20))}
740
+ )};
741
+
742
+ .btn {
743
+ // display: inline-block;
744
+ // // padding: 8px;
745
+ // display: flex;
746
+ // align-items: center;
747
+ // justify-content: center;
729
748
 
730
- .btn {
731
- // display: inline-block;
732
- // // padding: 8px;
733
- // display: flex;
734
- // align-items: center;
735
- // justify-content: center;
736
-
737
- display: var(--_d-flex);
738
- padding: 0px;
739
- --_width-20: 20px;
740
- // $size: var(--_width-40);
741
- $size: #{var(
742
- --_sf-at-btn-size,
743
- #{prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-bn-dt-se-in-se, var(--_width-20))}
744
- )};
745
- width: calc(#{$size} * 2);
746
- height: calc(#{$size} * 2);
749
+ display: var(--_d-flex);
750
+ --_width-20: 20px;
751
+ // $size: var(--_width-40);
752
+ // The 2x cell is now a floor rather than a fixed size: Padding is
753
+ // configurable, so the button grows past it once the padding needs more
754
+ // room than the icon left over. Untouched elements have no padding and
755
+ // stay exactly 2x, as they always were.
756
+ min-width: calc(#{$size} * 2);
757
+ min-height: calc(#{$size} * 2);
758
+ box-sizing: border-box;
759
+ padding: var(
760
+ --_sf-at-btn-pg,
761
+ #{prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-bn-dt-se-pg, 0)}
762
+ );
763
+ align-items: center;
764
+ justify-content: center;
765
+ background: var(
766
+ --_sf-at-btn-bd,
767
+ #{prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-bn-dt-se-bd-cr)}
768
+ );
769
+ box-shadow: var(
770
+ --_sf-at-btn-sw,
771
+ #{prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-bn-dt-se-sw-ae, 0 0)}
772
+ #{prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-bn-dt-se-sw-br, 0)}
773
+ #{prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-bn-dt-se-sw-sd, 0)}
774
+ #{prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-bn-dt-se-sw-cr, transparent)}
775
+ );
776
+
777
+ // The renderer reads Show Shadow off whichever state the button is in,
778
+ // so one attribute covers both.
779
+ &[data-show-shadow="false"] {
780
+ box-shadow: none;
781
+ }
782
+
783
+ cursor: pointer;
784
+ button {
785
+ display: flex;
786
+ // Until these are cleared the button keeps the browser's own
787
+ // padding and border, which pushed the glyph off the centre of its
788
+ // cell — that is what made the Grid and List icons sit unevenly
789
+ // beside each other. Filling the cell and centring here keeps them
790
+ // on one baseline at every icon size.
747
791
  align-items: center;
748
792
  justify-content: center;
749
- background: var(
750
- --_sf-at-btn-bd,
751
- #{prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-bn-dt-se-bd-cr)}
752
- );
793
+ width: 100%;
794
+ height: 100%;
795
+ padding: 0;
796
+ border: none;
797
+ background: transparent;
798
+ }
753
799
 
754
- cursor: pointer;
755
- button {
756
- display: flex;
757
- }
758
- // &:hover {
759
- // background-color: var(--_gray-100);
760
- // }
800
+ // The glyph gets its own flex box so the svg sits centred without the
801
+ // inline-baseline gap a bare `dangerouslySetInnerHTML` span would add.
802
+ .btn__icon {
803
+ display: flex;
804
+ align-items: center;
805
+ justify-content: center;
806
+ flex-shrink: 0;
761
807
 
762
- &.active {
763
- // --_sf-at-pt-cl: var(--_gray-700);
764
- --_sf-at-btn-size: #{prepareMediaVariable(
765
- --_ctm-dn-gd-vw-cl-se-bn-sd-se-in-se,
766
- var(--_width-20)
767
- )};
768
- --_sf-at-pt-cl: #{prepareMediaVariable(
769
- --_ctm-dn-gd-vw-cl-se-bn-sd-se-in-c1,
770
- var(--_gray-700)
771
- )};
772
- --_sf-at-btn-bd: #{prepareMediaVariable(
773
- --_ctm-dn-gd-vw-cl-se-bn-sd-se-bd-cr,
774
- var(--_gray-200)
775
- )};
776
- // background: var(--_gray-200);
777
- }
778
- // &.active {
779
- // background-color: #ced4f6;
780
- // button {
781
- // svg {
782
- // path {
783
- // stroke: var(--_primary-500);
784
- // }
785
- // }
786
- // }
787
- // }
788
- // &:first-child {
789
- // border-right: 1px solid var(--_gray-200);
790
- // }
791
-
792
- svg {
808
+ // An uploaded icon comes through as an <img> sized to its box, so the
809
+ // box needs a size of its own — the svg rule further down only reaches
810
+ // library icons, and a percentage inside a shrink-to-fit parent would
811
+ // otherwise resolve to nothing.
812
+ img {
793
813
  width: calc(#{$size} * 1);
794
814
  height: calc(#{$size} * 1);
795
-
796
- path {
797
- stroke: var(
798
- --_sf-at-pt-cl,
799
- #{prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-bn-dt-se-in-c1, var(--_gray-500))}
800
- );
801
- }
815
+ object-fit: contain;
802
816
  }
817
+ }
803
818
 
804
- &:first-of-type {
805
- border-radius: 4px 0 0 4px;
806
- }
807
- &:last-of-type {
808
- border-radius: 0 4px 4px 0;
819
+ // &:hover {
820
+ // background-color: var(--_gray-100);
821
+ // }
822
+
823
+ &.active {
824
+ // --_sf-at-pt-cl: var(--_gray-700);
825
+ --_sf-at-btn-size: #{prepareMediaVariable(
826
+ --_ctm-dn-gd-vw-cl-se-bn-sd-se-in-se,
827
+ var(--_width-20)
828
+ )};
829
+ --_sf-at-pt-cl: #{prepareMediaVariable(
830
+ --_ctm-dn-gd-vw-cl-se-bn-sd-se-in-c1,
831
+ var(--_gray-700)
832
+ )};
833
+ --_sf-at-btn-bd: #{prepareMediaVariable(
834
+ --_ctm-dn-gd-vw-cl-se-bn-sd-se-bd-cr,
835
+ var(--_gray-200)
836
+ )};
837
+ // Same re-pointing trick as the icon vars above: the padding and
838
+ // shadow declarations stay written once and simply re-resolve
839
+ // against the selected state's values.
840
+ --_sf-at-btn-pg: #{prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-bn-sd-se-pg, 0)};
841
+ --_sf-at-btn-sw: #{prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-bn-sd-se-sw-ae, 0 0)}
842
+ #{prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-bn-sd-se-sw-br, 0)}
843
+ #{prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-bn-sd-se-sw-sd, 0)}
844
+ #{prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-bn-sd-se-sw-cr, transparent)};
845
+ // background: var(--_gray-200);
846
+ }
847
+ // &.active {
848
+ // background-color: #ced4f6;
849
+ // button {
850
+ // svg {
851
+ // path {
852
+ // stroke: var(--_primary-500);
853
+ // }
854
+ // }
855
+ // }
856
+ // }
857
+ // &:first-child {
858
+ // border-right: 1px solid var(--_gray-200);
859
+ // }
860
+
861
+ svg {
862
+ width: calc(#{$size} * 1);
863
+ height: calc(#{$size} * 1);
864
+
865
+ path {
866
+ stroke: var(
867
+ --_sf-at-pt-cl,
868
+ #{prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-bn-dt-se-in-c1, var(--_gray-500))}
869
+ );
870
+ // Overrides the stroke-width presentation attribute baked into the icon markup.
871
+ stroke-width: prepareMediaVariable(--_ctm-dn-gd-vw-cl-se-bn-dt-se-se-wh, 1.25);
809
872
  }
810
873
  }
874
+
875
+ &:first-of-type {
876
+ border-radius: 4px 0 0 4px;
877
+ }
878
+ &:last-of-type {
879
+ border-radius: 0 4px 4px 0;
880
+ }
811
881
  }
812
882
  }
813
883
  // products header styles
@@ -906,7 +976,12 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
906
976
  // 1fr
907
977
  // );
908
978
  --_sf-cl-count: #{prepareMediaVariable(--_ctm-dn-an-an-im-is-pr-rw, 1)};
909
- --_sf-cl-gp: #{prepareMediaVariable(--_ctm-dn-an-an-im-im-gp, 0px)};
979
+ // The column width has to be worked out from the COLUMN gap alone — it is
980
+ // the only one that eats into the row's width.
981
+ --_sf-cl-gp: #{prepareMediaVariable(
982
+ --_ctm-dn-an-an-im-cn-gp,
983
+ prepareMediaVariable(--_ctm-dn-an-an-im-im-gp, 0px)
984
+ )};
910
985
  grid-template-columns: getRepeatColWidth(--_sf-cl-count, --_sf-cl-gp);
911
986
  // gap: 24px;
912
987
  .product__card {
@@ -929,15 +1004,24 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
929
1004
  }
930
1005
  }
931
1006
  display: grid;
932
- gap: var(
933
- --_ctm-mob-dn-an-an-im-im-gp,
934
- var(--_ctm-tab-dn-an-an-im-im-gp, var(--_ctm-dn-an-an-im-im-gp, 0px))
1007
+ // Gap BETWEEN the item cards, now one control per axis. Both fall back to
1008
+ // the single `itemGap` this section used to carry, so a grid spaced before
1009
+ // the split keeps its spacing until either axis is touched.
1010
+ row-gap: prepareMediaVariable(
1011
+ --_ctm-dn-an-an-im-rw-gp,
1012
+ prepareMediaVariable(--_ctm-dn-an-an-im-im-gp, 0px)
1013
+ );
1014
+ column-gap: prepareMediaVariable(
1015
+ --_ctm-dn-an-an-im-cn-gp,
1016
+ prepareMediaVariable(--_ctm-dn-an-an-im-im-gp, 0px)
935
1017
  );
936
1018
 
937
1019
  .product__card {
938
1020
  // product card styles
939
1021
  display: flex;
940
- gap: 12px;
1022
+ // Item Card > Item Gap: image container <-> details container. 12px is
1023
+ // what was hardcoded here, so an untouched card does not move.
1024
+ gap: prepareMediaVariable(--_ctm-dn-im-cd-im-gp, 12px);
941
1025
 
942
1026
  background-color: var(
943
1027
  --_ctm-mob-dn-im-cd-bd-cr,
@@ -1089,13 +1173,11 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
1089
1173
  var(--_ctm-tab-dn-ne-ue, var(--_ctm-dn-ne-ue))
1090
1174
  );
1091
1175
  padding: prepareMediaVariable(--_ctm-dn-ne-pg);
1092
- text-transform: prepareMediaVariable(--_ctm-dn-ne-tt-tm);
1176
+ @include ad-text-transform(--_ctm-dn-ne);
1093
1177
 
1094
1178
  & > span {
1095
1179
  width: 100%;
1096
- &#{$overflowSelector} {
1097
- @include restrictToLinesShow(#{var(--_sf-line-clamp, 1)});
1098
- }
1180
+ @include ad-text-overflow;
1099
1181
  }
1100
1182
  &[data-has-link="true"] {
1101
1183
  cursor: pointer;
@@ -1111,6 +1193,15 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
1111
1193
  gap: 8px;
1112
1194
  color: var(--_gray-600);
1113
1195
  font-weight: 500;
1196
+
1197
+ // Item Card > Brand & Code Direction. Horizontal is the original
1198
+ // side-by-side row; vertical stacks the two blocks and lets each
1199
+ // start at the left rather than being centred against the other.
1200
+ &[data-direction="vertical"] {
1201
+ flex-direction: column;
1202
+ align-items: flex-start;
1203
+ flex-wrap: nowrap;
1204
+ }
1114
1205
  }
1115
1206
  }
1116
1207
 
@@ -1118,6 +1209,11 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
1118
1209
  display: flex;
1119
1210
  align-items: center;
1120
1211
  gap: 6px;
1212
+ @include ad-section-box(--_ctm-dn-bd);
1213
+
1214
+ .brand__icon {
1215
+ @include ad-section-icon(--_ctm-dn-bd);
1216
+ }
1121
1217
 
1122
1218
  .value {
1123
1219
  // padding-block-end: var(--_sf-dc-pd-bt);
@@ -1158,6 +1254,8 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
1158
1254
  --_ctm-mob-dn-bd-ue-dc,
1159
1255
  var(--_ctm-tab-dn-bd-ue-dc, var(--_ctm-dn-bd-ue-dc))
1160
1256
  );
1257
+ @include ad-text-transform(--_ctm-dn-bd, "-dc");
1258
+ @include ad-text-overflow(--_sf-line-clamp-desc);
1161
1259
  }
1162
1260
  .label {
1163
1261
  color: var(--_ctm-mob-dn-bd-cr, var(--_ctm-tab-dn-bd-cr, var(--_ctm-dn-bd-cr)));
@@ -1193,12 +1291,19 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
1193
1291
  --_ctm-mob-dn-bd-ue,
1194
1292
  var(--_ctm-tab-dn-bd-ue, var(--_ctm-dn-bd-ue))
1195
1293
  );
1294
+ @include ad-text-transform(--_ctm-dn-bd);
1295
+ @include ad-text-overflow;
1196
1296
  }
1197
1297
  }
1198
1298
  .code {
1199
1299
  display: flex;
1200
1300
  align-items: center;
1201
1301
  gap: 6px;
1302
+ @include ad-section-box(--_ctm-dn-ce);
1303
+
1304
+ .code__icon {
1305
+ @include ad-section-icon(--_ctm-dn-ce);
1306
+ }
1202
1307
 
1203
1308
  .value {
1204
1309
  // padding-block-end: var(--_sf-dc-pd-bt);
@@ -1239,6 +1344,8 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
1239
1344
  --_ctm-mob-dn-ce-ue-dc,
1240
1345
  var(--_ctm-tab-dn-ce-ue-dc, var(--_ctm-dn-ce-ue-dc))
1241
1346
  );
1347
+ @include ad-text-transform(--_ctm-dn-ce, "-dc");
1348
+ @include ad-text-overflow(--_sf-line-clamp-desc);
1242
1349
  }
1243
1350
  .label {
1244
1351
  color: var(--_ctm-mob-dn-ce-cr, var(--_ctm-tab-dn-ce-cr, var(--_ctm-dn-ce-cr)));
@@ -1274,6 +1381,8 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
1274
1381
  --_ctm-mob-dn-ce-ue,
1275
1382
  var(--_ctm-tab-dn-ce-ue, var(--_ctm-dn-ce-ue))
1276
1383
  );
1384
+ @include ad-text-transform(--_ctm-dn-ce);
1385
+ @include ad-text-overflow;
1277
1386
  }
1278
1387
  }
1279
1388
  .price {
@@ -1347,251 +1456,14 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
1347
1456
  var(--_ctm-tab-dn-pe-ue, var(--_ctm-dn-pe-ue))
1348
1457
  );
1349
1458
  padding: prepareMediaVariable(--_ctm-dn-pe-pg);
1459
+ @include ad-text-transform(--_ctm-dn-pe);
1460
+ @include ad-text-overflow;
1350
1461
  }
1351
1462
  }
1352
1463
 
1353
- .quota__details__element {
1354
- background-color: var(
1355
- --_ctm-mob-dn-qa-ds-wt-se-bd-cr,
1356
- var(--_ctm-tab-dn-qa-ds-wt-se-bd-cr, var(--_ctm-dn-qa-ds-wt-se-bd-cr))
1357
- );
1358
- padding: var(
1359
- --_ctm-mob-dn-qa-ds-wt-se-pg,
1360
- var(--_ctm-tab-dn-qa-ds-wt-se-pg, var(--_ctm-dn-qa-ds-wt-se-pg))
1361
- );
1362
- display: flex;
1363
- flex-direction: column;
1364
- --_sf-gp: var(
1365
- --_ctm-mob-dn-qa-ds-wt-se-im-sg,
1366
- var(
1367
- --_ctm-tab-dn-qa-ds-wt-se-im-sg,
1368
- var(--_ctm-dn-qa-ds-wt-se-im-sg, var(--_ctm-dn-qa-ds-wt-se-im-sg), 16px)
1369
- )
1370
- );
1371
- --_sf-cd-gp: calc(var(--_sf-gp) * 0.5);
1372
- row-gap: var(--_sf-gp);
1373
- width: 100%;
1374
- height: 100%;
1375
- border-color: var(
1376
- --_ctm-mob-dn-qa-ds-wt-se-br-cr,
1377
- var(--_ctm-tab-dn-qa-ds-wt-se-br-cr, var(--_ctm-dn-qa-ds-wt-se-br-cr))
1378
- );
1379
- border-style: var(
1380
- --_ctm-mob-dn-qa-ds-wt-se-br-se,
1381
- var(--_ctm-tab-dn-qa-ds-wt-se-br-se, var(--_ctm-dn-qa-ds-wt-se-br-se))
1382
- );
1383
- border-width: var(
1384
- --_ctm-mob-dn-qa-ds-wt-se-br-wh,
1385
- var(--_ctm-tab-dn-qa-ds-wt-se-br-wh, var(--_ctm-dn-qa-ds-wt-se-br-wh))
1386
- );
1387
- border-radius: var(
1388
- --_ctm-mob-dn-qa-ds-wt-se-br-rs,
1389
- var(--_ctm-tab-dn-qa-ds-wt-se-br-rs, var(--_ctm-dn-qa-ds-wt-se-br-rs))
1390
- );
1391
- box-shadow: var(
1392
- --_show-shadow,
1393
- var(
1394
- --_ctm-mob-dn-qa-ds-wt-se-sw-ae,
1395
- var(--_ctm-tab-dn-qa-ds-wt-se-sw-ae, var(--_ctm-dn-qa-ds-wt-se-sw-ae))
1396
- )
1397
- var(
1398
- --_ctm-mob-dn-qa-ds-wt-se-sw-br,
1399
- var(--_ctm-tab-dn-qa-ds-wt-se-sw-br, var(--_ctm-dn-qa-ds-wt-se-sw-br))
1400
- )
1401
- var(
1402
- --_ctm-mob-dn-qa-ds-wt-se-sw-sd,
1403
- var(--_ctm-tab-dn-qa-ds-wt-se-sw-sd, var(--_ctm-dn-qa-ds-wt-se-sw-sd))
1404
- )
1405
- var(
1406
- --_ctm-mob-dn-qa-ds-wt-se-sw-cr,
1407
- var(--_ctm-tab-dn-qa-ds-wt-se-sw-cr, var(--_ctm-dn-qa-ds-wt-se-sw-cr))
1408
- )
1409
- );
1410
-
1411
- .product__hilights {
1412
- display: flex;
1413
- align-items: var(
1414
- --_ctm-mob-dn-qa-ds-wt-se-wt-at,
1415
- var(--_ctm-tab-dn-qa-ds-wt-se-wt-at, var(--_ctm-dn-qa-ds-wt-se-wt-at))
1416
- );
1417
- justify-content: var(
1418
- --_ctm-mob-dn-qa-ds-wt-se-hl-at,
1419
- var(--_ctm-tab-dn-qa-ds-wt-se-hl-at, var(--_ctm-dn-qa-ds-wt-se-hl-at))
1420
- );
1421
- gap: var(
1422
- --_ctm-mob-dn-qa-ds-wt-se-im-sg,
1423
- var(--_ctm-tab-dn-qa-ds-wt-se-im-sg, var(--_ctm-dn-qa-ds-wt-se-im-sg))
1424
- );
1425
- width: 100%;
1426
-
1427
- height: 100%;
1428
-
1429
- &[data-show-dividers="true"] {
1430
- .product__list__item {
1431
- position: relative;
1432
- &:not(:last-child)::after {
1433
- content: "";
1434
- width: var(
1435
- --_ctm-mob-dn-qa-ds-dr-dr-wh,
1436
- var(--_ctm-tab-dn-qa-ds-dr-dr-wh, var(--_ctm-dn-qa-ds-dr-dr-wh))
1437
- );
1438
- height: 100%;
1439
- position: absolute;
1440
- right: calc(
1441
- (
1442
- -1 *
1443
- var(
1444
- --_ctm-mob-dn-qa-ds-wt-se-im-sg,
1445
- var(--_ctm-tab-dn-qa-ds-wt-se-im-sg, var(--_ctm-dn-qa-ds-wt-se-im-sg))
1446
- ) /
1447
- 2
1448
- ) -
1449
- (
1450
- var(
1451
- --_ctm-mob-dn-qa-ds-dr-dr-wh,
1452
- var(--_ctm-tab-dn-qa-ds-dr-dr-wh, var(--_ctm-dn-qa-ds-dr-dr-wh))
1453
- ) /
1454
- 2
1455
- )
1456
- );
1457
- background-color: var(
1458
- --_ctm-mob-dn-qa-ds-dr-dr-cr,
1459
- var(--_ctm-tab-dn-qa-ds-dr-dr-cr, var(--_ctm-dn-qa-ds-dr-dr-cr))
1460
- );
1461
- }
1462
- }
1463
- }
1464
- .product__list__item {
1465
- display: flex;
1466
- align-items: center;
1467
- gap: 4px;
1468
-
1469
- .svg_icon {
1470
- display: flex;
1471
- }
1472
- }
1473
- .quota__left {
1474
- .count {
1475
- // padding-inline: var(--_sf-cd-gp);
1476
- color: var(
1477
- --_ctm-mob-dn-qa-ds-qa-lt-cr,
1478
- var(--_ctm-tab-dn-qa-ds-qa-lt-cr, var(--_ctm-dn-qa-ds-qa-lt-cr))
1479
- );
1480
- font-family: var(
1481
- --_ctm-mob-dn-qa-ds-qa-lt-ft-fy,
1482
- var(--_ctm-tab-dn-qa-ds-qa-lt-ft-fy, var(--_ctm-dn-qa-ds-qa-lt-ft-fy))
1483
- );
1484
- font-size: var(
1485
- --_ctm-mob-dn-qa-ds-qa-lt-ft-se,
1486
- var(--_ctm-tab-dn-qa-ds-qa-lt-ft-se, var(--_ctm-dn-qa-ds-qa-lt-ft-se))
1487
- );
1488
- font-weight: var(
1489
- --_ctm-mob-dn-qa-ds-qa-lt-ft-wt,
1490
- var(--_ctm-tab-dn-qa-ds-qa-lt-ft-wt, var(--_ctm-dn-qa-ds-qa-lt-ft-wt))
1491
- );
1492
- font-style: var(
1493
- --_ctm-mob-dn-qa-ds-qa-lt-ft-se-ic,
1494
- var(--_ctm-tab-dn-qa-ds-qa-lt-ft-se-ic, var(--_ctm-dn-qa-ds-qa-lt-ft-se-ic))
1495
- );
1496
- text-align: var(
1497
- --_ctm-mob-dn-qa-ds-qa-lt-tt-an,
1498
- var(--_ctm-tab-dn-qa-ds-qa-lt-tt-an, var(--_ctm-dn-qa-ds-qa-lt-tt-an))
1499
- );
1500
- letter-spacing: var(
1501
- --_ctm-mob-dn-qa-ds-qa-lt-lr-sg,
1502
- var(--_ctm-tab-dn-qa-ds-qa-lt-lr-sg, var(--_ctm-dn-qa-ds-qa-lt-lr-sg))
1503
- );
1504
- line-height: var(
1505
- --_ctm-mob-dn-qa-ds-qa-lt-le-ht,
1506
- var(--_ctm-tab-dn-qa-ds-qa-lt-le-ht, var(--_ctm-dn-qa-ds-qa-lt-le-ht-dc))
1507
- );
1508
- text-decoration: var(
1509
- --_ctm-mob-dn-qa-ds-qa-lt-ue,
1510
- var(--_ctm-tab-dn-qa-ds-qa-lt-ue, var(--_ctm-dn-qa-ds-qa-lt-ue))
1511
- );
1512
- }
1513
- .icon {
1514
- display: var(--_sf-show-icon-ff, flex);
1515
- svg {
1516
- width: var(
1517
- --_ctm-mab-dn-qa-lt-in-se,
1518
- var(--_ctm-tab-dn-qa-ds-qa-lt-in-se, var(--_ctm-dn-qa-ds-qa-lt-in-se))
1519
- );
1520
- height: var(
1521
- --_ctm-mob-dn-qa-ds-qa-lt-in-se,
1522
- var(--_ctm-tab-dn-qa-ds-qa-lt-in-se, var(--_ctm-dn-qa-ds-qa-lt-in-se))
1523
- );
1524
- path {
1525
- stroke: var(
1526
- --_ctm-mob-dn-qa-ds-qa-lt-in-c1,
1527
- var(--_ctm-tab-dn-qa-ds-qa-lt-in-c1, var(--_ctm-dn-qa-ds-qa-lt-in-c1))
1528
- );
1529
- }
1530
- }
1531
- }
1532
- }
1533
- .days__left {
1534
- .count {
1535
- // padding-inline: var(--_sf-cd-gp);
1536
- color: var(
1537
- --_ctm-mob-dn-qa-ds-ds-lt-cr,
1538
- var(--_ctm-tab-dn-qa-ds-ds-lt-cr, var(--_ctm-dn-qa-ds-ds-lt-cr))
1539
- );
1540
- font-family: var(
1541
- --_ctm-mob-dn-qa-ds-ds-lt-ft-fy,
1542
- var(--_ctm-tab-dn-qa-ds-ds-lt-ft-fy, var(--_ctm-dn-qa-ds-ds-lt-ft-fy))
1543
- );
1544
- font-size: var(
1545
- --_ctm-mob-dn-qa-ds-ds-lt-ft-se,
1546
- var(--_ctm-tab-dn-qa-ds-ds-lt-ft-se, var(--_ctm-dn-qa-ds-ds-lt-ft-se))
1547
- );
1548
- font-weight: var(
1549
- --_ctm-mob-dn-qa-ds-ds-lt-ft-wt,
1550
- var(--_ctm-tab-dn-qa-ds-ds-lt-ft-wt, var(--_ctm-dn-qa-ds-ds-lt-ft-wt))
1551
- );
1552
- font-style: var(
1553
- --_ctm-mob-dn-qa-ds-ds-lt-ft-se-ic,
1554
- var(--_ctm-tab-dn-qa-ds-ds-lt-ft-se-ic, var(--_ctm-dn-qa-ds-ds-lt-ft-se-ic))
1555
- );
1556
- text-align: var(
1557
- --_ctm-mob-dn-qa-ds-ds-lt-tt-an,
1558
- var(--_ctm-tab-dn-qa-ds-ds-lt-tt-an, var(--_ctm-dn-qa-ds-ds-lt-tt-an))
1559
- );
1560
- letter-spacing: var(
1561
- --_ctm-mob-dn-qa-ds-ds-lt-lr-sg,
1562
- var(--_ctm-tab-dn-qa-ds-ds-lt-lr-sg, var(--_ctm-dn-qa-ds-ds-lt-lr-sg))
1563
- );
1564
- line-height: var(
1565
- --_ctm-mob-dn-qa-ds-ds-lt-le-ht,
1566
- var(--_ctm-tab-dn-qa-ds-ds-lt-le-ht, var(--_ctm-dn-qa-ds-ds-lt-le-ht-dc))
1567
- );
1568
- text-decoration: var(
1569
- --_ctm-mob-dn-qa-ds-ds-lt-ue,
1570
- var(--_ctm-tab-dn-qa-ds-ds-lt-ue, var(--_ctm-dn-qa-ds-ds-lt-ue))
1571
- );
1572
- }
1573
- .icon {
1574
- display: var(--_sf-show-icon-ff, flex);
1575
- svg {
1576
- width: var(
1577
- --_ctm-mab-dn-ds-lt-in-se,
1578
- var(--_ctm-tab-dn-qa-ds-ds-lt-in-se, var(--_ctm-dn-qa-ds-ds-lt-in-se))
1579
- );
1580
- height: var(
1581
- --_ctm-mob-dn-qa-ds-ds-lt-in-se,
1582
- var(--_ctm-tab-dn-qa-ds-ds-lt-in-se, var(--_ctm-dn-qa-ds-ds-lt-in-se))
1583
- );
1584
- path {
1585
- stroke: var(
1586
- --_ctm-mob-dn-qa-ds-ds-lt-in-c1,
1587
- var(--_ctm-tab-dn-qa-ds-ds-lt-in-c1, var(--_ctm-dn-qa-ds-ds-lt-in-c1))
1588
- );
1589
- }
1590
- }
1591
- }
1592
- }
1593
- }
1594
- }
1464
+ // Quota details styling for the embedded QuotaDetailsContent, rebound to
1465
+ // the Allocations quotaDetails CSS-variable paths.
1466
+ @import "./allocations-quota-details.scss";
1595
1467
  }
1596
1468
  }
1597
1469
 
@@ -1743,6 +1615,18 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
1743
1615
  --_ctm-mob-dn-sr-tb-hr-se-le-ht,
1744
1616
  var(--_ctm-tab-dn-sr-tb-hr-se-le-ht, var(--_ctm-dn-sr-tb-hr-se-le-ht))
1745
1617
  );
1618
+ --_sf-hr-tt-tm: var(
1619
+ --_ctm-mob-dn-sr-tb-hr-se-tt-tm,
1620
+ var(--_ctm-tab-dn-sr-tb-hr-se-tt-tm, var(--_ctm-dn-sr-tb-hr-se-tt-tm))
1621
+ );
1622
+ --_sf-hr-wd-wp: var(
1623
+ --_ctm-mob-dn-sr-tb-hr-se-wd-wp,
1624
+ var(--_ctm-tab-dn-sr-tb-hr-se-wd-wp, var(--_ctm-dn-sr-tb-hr-se-wd-wp))
1625
+ );
1626
+ --_sf-hr-wd-bk: var(
1627
+ --_ctm-mob-dn-sr-tb-hr-se-wd-bk,
1628
+ var(--_ctm-tab-dn-sr-tb-hr-se-wd-bk, var(--_ctm-dn-sr-tb-hr-se-wd-bk))
1629
+ );
1746
1630
 
1747
1631
  --_sf-hr-in-se: var(
1748
1632
  --_ctm-mob-dn-sr-tb-hr-se-in-se,
@@ -1824,6 +1708,21 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
1824
1708
 
1825
1709
  text-decoration: var(--_sf-hr-ue, prepareMediaVariable(--_ctm-dn-dt-ue));
1826
1710
 
1711
+ // Same shape as the font rules above: the base value is the default
1712
+ // state, and the `&:hover` block below re-points --_sf-hr-* at the hover
1713
+ // state so this declaration re-resolves without being repeated.
1714
+ text-transform: var(
1715
+ --_sf-hr-tt-tm,
1716
+ prepareMediaVariable(--_ctm-dn-sr-tb-dt-se-tt-tm, none)
1717
+ );
1718
+
1719
+ word-wrap: var(--_sf-hr-wd-wp, prepareMediaVariable(--_ctm-dn-sr-tb-dt-se-wd-wp, normal));
1720
+
1721
+ word-break: var(
1722
+ --_sf-hr-wd-bk,
1723
+ prepareMediaVariable(--_ctm-dn-sr-tb-dt-se-wd-bk, normal)
1724
+ );
1725
+
1827
1726
  [data-element-style="Text"] {
1828
1727
  display: inline-block;
1829
1728
  width: 100%;
@@ -1911,6 +1810,18 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
1911
1810
  --_ctm-mob-dn-sr-tb-sd-se-le-ht,
1912
1811
  var(--_ctm-tab-dn-sr-tb-sd-se-le-ht, var(--_ctm-dn-sr-tb-sd-se-le-ht))
1913
1812
  );
1813
+ --_sf-sd-tt-tm: var(
1814
+ --_ctm-mob-dn-sr-tb-sd-se-tt-tm,
1815
+ var(--_ctm-tab-dn-sr-tb-sd-se-tt-tm, var(--_ctm-dn-sr-tb-sd-se-tt-tm))
1816
+ );
1817
+ --_sf-sd-wd-wp: var(
1818
+ --_ctm-mob-dn-sr-tb-sd-se-wd-wp,
1819
+ var(--_ctm-tab-dn-sr-tb-sd-se-wd-wp, var(--_ctm-dn-sr-tb-sd-se-wd-wp))
1820
+ );
1821
+ --_sf-sd-wd-bk: var(
1822
+ --_ctm-mob-dn-sr-tb-sd-se-wd-bk,
1823
+ var(--_ctm-tab-dn-sr-tb-sd-se-wd-bk, var(--_ctm-dn-sr-tb-sd-se-wd-bk))
1824
+ );
1914
1825
 
1915
1826
  --_sf-sd-in-se: var(
1916
1827
  --_ctm-mob-dn-sr-tb-sd-se-in-se,
@@ -1997,6 +1908,21 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
1997
1908
 
1998
1909
  text-decoration: var(--_sf-sd-ue, prepareMediaVariable(--_ctm-dn-dt-ue));
1999
1910
 
1911
+ text-transform: var(
1912
+ --_sf-sd-tt-tm,
1913
+ prepareMediaVariable(--_ctm-dn-sr-tb-dt-se-tt-tm, none)
1914
+ );
1915
+
1916
+ word-wrap: var(
1917
+ --_sf-sd-wd-wp,
1918
+ prepareMediaVariable(--_ctm-dn-sr-tb-dt-se-wd-wp, normal)
1919
+ );
1920
+
1921
+ word-break: var(
1922
+ --_sf-sd-wd-bk,
1923
+ prepareMediaVariable(--_ctm-dn-sr-tb-dt-se-wd-bk, normal)
1924
+ );
1925
+
2000
1926
  [data-element-style="Text"] {
2001
1927
  display: inline-block;
2002
1928
  width: 100%;
@@ -2119,65 +2045,67 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
2119
2045
  margin-top: 10px;
2120
2046
  }
2121
2047
  }
2048
+ // Profiles Slider > Pagination Arrows. These rules used to read
2049
+ // `--_ctm-dn-pn-as-*`, a `design.paginationArrows` node that does not exist
2050
+ // on this element — so every one of them fell through to its hardcoded
2051
+ // default and the panel could not reach the strip's arrows at all. They now
2052
+ // read design.slider.paginationArrows, and each fallback is the value that
2053
+ // was hardcoded, so an untouched strip renders exactly as before.
2122
2054
  &[data-control-type="Side"] {
2123
2055
  .left-button,
2124
2056
  .right-button {
2125
- background-color: transparent;
2057
+ background-color: prepareMediaVariable(#{$ad-slider-arrows}-bd-cr, transparent);
2126
2058
  }
2127
2059
  }
2128
2060
  &[data-background-shape="Round"] {
2129
2061
  .left-button,
2130
2062
  .right-button {
2131
- background-color: #f2f5f5;
2063
+ background-color: prepareMediaVariable(#{$ad-slider-arrows}-bd-cr, #f2f5f5);
2132
2064
  box-sizing: 0 4px 8px rgba(0, 0, 0, 0.1);
2133
2065
  }
2134
2066
  }
2135
- .left-button {
2136
- padding: 10px;
2137
- border-radius: 50%;
2138
- border: none;
2139
- width: var(
2140
- --_ctm-mob-dn-pn-as-aw-se,
2141
- var(--_ctm-tab-dn-pn-as-aw-se, var(--_ctm-dn-pn-as-aw-se))
2142
- );
2143
- height: var(
2144
- --_ctm-mob-dn-pn-as-aw-se,
2145
- var(--_ctm-tab-dn-pn-as-aw-se, var(--_ctm-dn-pn-as-aw-se))
2146
- );
2067
+ .left-button,
2068
+ .right-button {
2069
+ padding: prepareMediaVariable(#{$ad-slider-arrows}-pg, 10px);
2070
+ border-color: prepareMediaVariable(#{$ad-slider-arrows}-br-cr, transparent);
2071
+ border-style: prepareMediaVariable(#{$ad-slider-arrows}-br-se, solid);
2072
+ border-width: prepareMediaVariable(#{$ad-slider-arrows}-br-wh, 0);
2073
+ // 50%, not prepareMediaVariable's `inherit` tail: an arrow with no
2074
+ // configured radius has always been a circle.
2075
+ border-radius: prepareMediaVariable(#{$ad-slider-arrows}-br-rs, 50%);
2076
+ // 20px, not prepareMediaVariable's `inherit` tail — inheriting the strip's
2077
+ // width here would blow the buttons out. 20 is also the schema default, so
2078
+ // a strip saved before this node existed matches a fresh one.
2079
+ width: prepareMediaVariable(#{$ad-slider-arrows}-aw-se, 20px);
2080
+ height: prepareMediaVariable(#{$ad-slider-arrows}-aw-se, 20px);
2081
+ // Opt-in, like the gallery's: these arrows have never cast a shadow.
2082
+ box-shadow: none;
2083
+
2084
+ &[data-show-shadow="true"] {
2085
+ box-shadow: prepareMediaVariable(#{$ad-slider-arrows}-sw-ae, 0 0)
2086
+ prepareMediaVariable(#{$ad-slider-arrows}-sw-br, 0)
2087
+ prepareMediaVariable(#{$ad-slider-arrows}-sw-sd, 0)
2088
+ prepareMediaVariable(#{$ad-slider-arrows}-sw-cr, transparent);
2089
+ }
2147
2090
 
2148
2091
  display: flex;
2149
2092
  align-items: center;
2150
2093
  justify-content: center;
2151
2094
  cursor: pointer;
2152
2095
  outline: none;
2153
- margin-left: 12px;
2154
- &:disabled {
2155
- & svg {
2156
- path {
2157
- stroke: #c3b7b7;
2158
- }
2159
- }
2096
+
2097
+ &[data-show-border="false"] {
2098
+ border: none;
2160
2099
  }
2161
- }
2162
- .right-button {
2163
- border-radius: 50%;
2164
- border: none;
2165
- width: var(
2166
- --_ctm-mob-dn-pn-as-aw-se,
2167
- var(--_ctm-tab-dn-pn-as-aw-se, var(--_ctm-dn-pn-as-aw-se))
2168
- );
2169
- height: var(
2170
- --_ctm-mob-dn-pn-as-aw-se,
2171
- var(--_ctm-tab-dn-pn-as-aw-se, var(--_ctm-dn-pn-as-aw-se))
2172
- );
2173
2100
 
2174
- display: flex;
2175
- align-items: center;
2176
- justify-content: center;
2177
- cursor: pointer;
2178
- outline: none;
2179
- margin-right: 12px;
2180
- padding: 10px;
2101
+ // Background Shape overrides the configured radius when it names one;
2102
+ // "None" leaves the radius alone.
2103
+ &[data-background-shape="Round"] {
2104
+ border-radius: 50%;
2105
+ }
2106
+ &[data-background-shape="Square"] {
2107
+ border-radius: 0;
2108
+ }
2181
2109
 
2182
2110
  &:disabled {
2183
2111
  & svg {
@@ -2187,27 +2115,30 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
2187
2115
  }
2188
2116
  }
2189
2117
  }
2118
+ .left-button {
2119
+ margin-left: 12px;
2120
+ }
2121
+ .right-button {
2122
+ margin-right: 12px;
2123
+ }
2190
2124
  .icon {
2191
2125
  display: flex;
2192
2126
 
2193
2127
  svg {
2194
- width: calc(
2195
- var(
2196
- --_ctm-mob-dn-pn-as-aw-se,
2197
- var(--_ctm-tab-dn-pn-as-aw-se, var(--_ctm-dn-pn-as-aw-se))
2198
- ) *
2199
- 0.5
2200
- );
2201
- height: calc(
2202
- var(
2203
- --_ctm-mob-dn-pn-as-aw-se,
2204
- var(--_ctm-tab-dn-pn-as-aw-se, var(--_ctm-dn-pn-as-aw-se))
2205
- ) *
2206
- 0.5
2207
- );
2208
-
2209
- path {
2210
- stroke: #514949;
2128
+ width: calc(#{prepareMediaVariable(#{$ad-slider-arrows}-aw-se, 20px)} * 0.5);
2129
+ height: calc(#{prepareMediaVariable(#{$ad-slider-arrows}-aw-se, 20px)} * 0.5);
2130
+
2131
+ // Arrow Color. `path { stroke }` alone was too narrow — it matched the
2132
+ // built-in chevrons and nothing else. Cover the svg itself and any
2133
+ // descendant carrying a stroke or a fill, leaving parts explicitly set
2134
+ // to "none" alone so an unfilled shape stays unfilled.
2135
+ &[stroke]:not([stroke="none"]),
2136
+ [stroke]:not([stroke="none"]) {
2137
+ stroke: prepareMediaVariable(#{$ad-slider-arrows}-aw-cr, #514949);
2138
+ }
2139
+ &[fill]:not([fill="none"]),
2140
+ [fill]:not([fill="none"]) {
2141
+ fill: prepareMediaVariable(#{$ad-slider-arrows}-aw-cr, #514949);
2211
2142
  }
2212
2143
  }
2213
2144
  }
@@ -2432,7 +2363,7 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
2432
2363
  .ad_sidebar {
2433
2364
  display: flex;
2434
2365
  flex-direction: column;
2435
- // Sidebar Container gap (heading tree) + padding.
2366
+ // Sidebar Container → gap (heading ↔ tree) + padding.
2436
2367
  gap: prepareMediaVariable(#{$ad-sidebar}-im-gp, 12px);
2437
2368
  padding: prepareMediaVariable(#{$ad-sidebar}-pg, 0);
2438
2369
  width: 260px;
@@ -2444,15 +2375,17 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
2444
2375
  .ad_sidebar_heading {
2445
2376
  white-space: nowrap;
2446
2377
  margin: 0;
2447
- text-transform: uppercase;
2448
2378
  line-height: 1.25;
2449
- @include ad-font($ad-heading, #002a4e, 16px, 400);
2379
+ // `uppercase` is the fallback, not a hardcoded rule, so Text Transform can
2380
+ // override it while untouched elements keep the look they always had.
2381
+ @include ad-font($ad-heading, #002a4e, 16px, 400, uppercase);
2382
+ @include ad-text-overflow;
2450
2383
  }
2451
2384
 
2452
2385
  .ad_allocation_tree {
2453
2386
  display: flex;
2454
2387
  flex-direction: column;
2455
- // Gap BETWEEN profile rows (Sidebar Container Profile Gap).
2388
+ // Gap BETWEEN profile rows (Sidebar Container → Profile Gap).
2456
2389
  gap: prepareMediaVariable(#{$ad-sidebar}-pe-gp, 8px);
2457
2390
  width: 100%;
2458
2391
  }
@@ -2460,7 +2393,7 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
2460
2393
  .ad_tree_node {
2461
2394
  display: flex;
2462
2395
  align-items: center;
2463
- // Profile Row item gap (icon label).
2396
+ // Profile Row → item gap (icon ↔ label).
2464
2397
  gap: prepareMediaVariable(#{$ad-tree}-dt-se-im-gp, 4px);
2465
2398
  padding: prepareMediaVariable(#{$ad-tree}-dt-se-pg, 4px 0);
2466
2399
  cursor: pointer;
@@ -2474,7 +2407,7 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
2474
2407
  width: 24px;
2475
2408
  height: 24px;
2476
2409
  flex-shrink: 0;
2477
- color: prepareMediaVariable(#{$ad-tree-icon}-in-c1, #002a4e);
2410
+ color: ad-tree-icon-var("dt-se", "in-c1", #002a4e);
2478
2411
  }
2479
2412
 
2480
2413
  .ad_chevron {
@@ -2482,69 +2415,105 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
2482
2415
  align-items: center;
2483
2416
  justify-content: center;
2484
2417
  transition: transform 0.15s ease;
2485
- color: prepareMediaVariable(#{$ad-tree-icon}-in-c1, #002a4e);
2486
-
2487
- svg {
2488
- width: prepareMediaVariable(#{$ad-tree-icon}-in-se, 20px);
2489
- height: prepareMediaVariable(#{$ad-tree-icon}-in-se, 20px);
2490
- // Apply the configured colour even when the fetched SVG hardcodes its own
2491
- // stroke/fill (skip parts explicitly set to "none").
2492
- &[stroke]:not([stroke="none"]),
2493
- [stroke]:not([stroke="none"]) {
2494
- stroke: prepareMediaVariable(#{$ad-tree-icon}-in-c1, #002a4e);
2495
- }
2496
- &[fill]:not([fill="none"]),
2497
- [fill]:not([fill="none"]) {
2498
- fill: prepareMediaVariable(#{$ad-tree-icon}-in-c1, #002a4e);
2499
- }
2500
- }
2418
+ @include ad-tree-icon("dt-se", "in-se", "in-c1");
2501
2419
  }
2502
2420
 
2503
2421
  .ad_chevron.is-open {
2504
2422
  transform: rotate(90deg);
2505
2423
  }
2506
2424
 
2425
+ // Show / hide of the icon, per interaction state. `aria-expanded` picks which of
2426
+ // the two switches applies: the Collapsed Icon's while the profile is closed,
2427
+ // the Expanded Icon's while it is open.
2428
+ //
2429
+ // Each state emits BOTH outcomes, not just the hidden one — a state that shows
2430
+ // the icon has to be able to bring it back when the state beneath it hid it
2431
+ // (Default off, Hover on). Hover and Selected carry one extra selector each, so
2432
+ // they already outrank Default; Selected is written last so it wins over Hover
2433
+ // on a row that is both.
2434
+ .ad_tree_node[aria-expanded="false"][data-show-icon="false"] .ad_tree_node_icon,
2435
+ .ad_tree_node[aria-expanded="true"][data-show-icon-expanded="false"] .ad_tree_node_icon {
2436
+ display: none;
2437
+ }
2438
+
2439
+ .ad_tree_node[aria-expanded="false"]:hover[data-hover-show-icon="false"] .ad_tree_node_icon,
2440
+ .ad_tree_node[aria-expanded="true"]:hover[data-hover-show-icon-expanded="false"]
2441
+ .ad_tree_node_icon {
2442
+ display: none;
2443
+ }
2444
+ .ad_tree_node[aria-expanded="false"]:hover[data-hover-show-icon="true"] .ad_tree_node_icon,
2445
+ .ad_tree_node[aria-expanded="true"]:hover[data-hover-show-icon-expanded="true"]
2446
+ .ad_tree_node_icon {
2447
+ display: flex;
2448
+ }
2449
+
2450
+ .ad_tree_node[aria-expanded="false"].is-active[data-selected-show-icon="false"]
2451
+ .ad_tree_node_icon,
2452
+ .ad_tree_node[aria-expanded="true"].is-active[data-selected-show-icon-expanded="false"]
2453
+ .ad_tree_node_icon {
2454
+ display: none;
2455
+ }
2456
+ .ad_tree_node[aria-expanded="false"].is-active[data-selected-show-icon="true"]
2457
+ .ad_tree_node_icon,
2458
+ .ad_tree_node[aria-expanded="true"].is-active[data-selected-show-icon-expanded="true"]
2459
+ .ad_tree_node_icon {
2460
+ display: flex;
2461
+ }
2462
+
2507
2463
  // The expanded icon has its own size/colour vars so it is independent of the
2508
2464
  // collapsed one.
2509
2465
  .ad_chevron.is-expanded {
2510
- color: prepareMediaVariable(#{$ad-tree-icon}-in-cr-ed, #002a4e);
2511
-
2512
- svg {
2513
- width: prepareMediaVariable(#{$ad-tree-icon}-in-se-ed, 20px);
2514
- height: prepareMediaVariable(#{$ad-tree-icon}-in-se-ed, 20px);
2515
- &[stroke]:not([stroke="none"]),
2516
- [stroke]:not([stroke="none"]) {
2517
- stroke: prepareMediaVariable(#{$ad-tree-icon}-in-cr-ed, #002a4e);
2518
- }
2519
- &[fill]:not([fill="none"]),
2520
- [fill]:not([fill="none"]) {
2521
- fill: prepareMediaVariable(#{$ad-tree-icon}-in-cr-ed, #002a4e);
2522
- }
2523
- }
2466
+ @include ad-tree-icon("dt-se", "in-se-ed", "in-cr-ed");
2524
2467
  }
2525
2468
 
2526
2469
  .ad_tree_node_label {
2527
2470
  flex: 1;
2471
+ min-width: 0;
2528
2472
  @include ad-font(#{$ad-tree}-dt-se, #002a4e, 14px, 600);
2473
+ @include ad-text-overflow;
2529
2474
  }
2530
2475
 
2531
2476
  .ad_tree_node:hover {
2532
2477
  @include ad-design-state($ad-tree, hr-se);
2478
+ @include ad-layout-state($ad-tree, hr-se, 4px 0, 4px);
2533
2479
  }
2534
2480
  .ad_tree_node:hover .ad_tree_node_label {
2535
2481
  @include ad-font-state($ad-tree, hr-se, #002a4e, 14px, 600);
2536
2482
  }
2483
+ // The icon follows the row it sits in. `.is-expanded` is listed after the plain
2484
+ // rule in each block on purpose: it is the more specific selector, so the
2485
+ // expanded icon keeps its own size/colour instead of inheriting the collapsed
2486
+ // one's while the row is hovered or active.
2487
+ .ad_tree_node:hover .ad_tree_node_icon {
2488
+ color: ad-tree-icon-var("hr-se", "in-c1", #002a4e);
2489
+ }
2490
+ .ad_tree_node:hover .ad_chevron {
2491
+ @include ad-tree-icon("hr-se", "in-se", "in-c1");
2492
+ }
2493
+ .ad_tree_node:hover .ad_chevron.is-expanded {
2494
+ @include ad-tree-icon("hr-se", "in-se-ed", "in-cr-ed");
2495
+ }
2537
2496
  .ad_tree_node.is-active {
2538
2497
  @include ad-design-state($ad-tree, sd-se);
2498
+ @include ad-layout-state($ad-tree, sd-se, 4px 0, 4px);
2539
2499
  }
2540
2500
  .ad_tree_node.is-active .ad_tree_node_label {
2541
2501
  @include ad-font-state($ad-tree, sd-se, #002a4e, 14px, 600);
2542
2502
  }
2503
+ .ad_tree_node.is-active .ad_tree_node_icon {
2504
+ color: ad-tree-icon-var("sd-se", "in-c1", #002a4e);
2505
+ }
2506
+ .ad_tree_node.is-active .ad_chevron {
2507
+ @include ad-tree-icon("sd-se", "in-se", "in-c1");
2508
+ }
2509
+ .ad_tree_node.is-active .ad_chevron.is-expanded {
2510
+ @include ad-tree-icon("sd-se", "in-se-ed", "in-cr-ed");
2511
+ }
2543
2512
 
2544
2513
  .ad_subtree {
2545
2514
  display: flex;
2546
2515
  flex-direction: column;
2547
- // Gap BETWEEN allocation rows (Sidebar Container Allocation Gap).
2516
+ // Gap BETWEEN allocation rows (Sidebar Container → Allocation Gap).
2548
2517
  gap: prepareMediaVariable(#{$ad-sidebar}-an-gp, 8px);
2549
2518
  padding-left: 31px;
2550
2519
  width: 100%;
@@ -2558,17 +2527,21 @@ $ad-widget: "--_ctm-dn-wt-se"; // design.widgetStyle (divider)
2558
2527
 
2559
2528
  .ad_subtree_node_label {
2560
2529
  letter-spacing: -0.28px;
2530
+ min-width: 0;
2561
2531
  @include ad-font(#{$ad-subtree}-dt-se, #1d1b1c, 14px, 400);
2532
+ @include ad-text-overflow;
2562
2533
  }
2563
2534
 
2564
2535
  .ad_subtree_node:hover {
2565
2536
  @include ad-design-state($ad-subtree, hr-se);
2537
+ @include ad-layout-state($ad-subtree, hr-se, 4px 0);
2566
2538
  }
2567
2539
  .ad_subtree_node:hover .ad_subtree_node_label {
2568
2540
  @include ad-font-state($ad-subtree, hr-se, #1d1b1c, 14px, 400);
2569
2541
  }
2570
2542
  .ad_subtree_node.is-active {
2571
2543
  @include ad-design-state($ad-subtree, sd-se);
2544
+ @include ad-layout-state($ad-subtree, sd-se, 4px 0);
2572
2545
  }
2573
2546
  .ad_subtree_node.is-active .ad_subtree_node_label {
2574
2547
  @include ad-font-state($ad-subtree, sd-se, #1d1b1c, 14px, 400);