@sc-360-v2/storefront-cms-library 0.5.64 → 0.5.65

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.
@@ -48,6 +48,12 @@ $dividerValues: (
48
48
  // padding: var(--_lt-pg);
49
49
  // width: var(--_ctm-lt-wh, var(--_tst-lt-wh));
50
50
  // width: var(--_sf-nw-wh, var(--_tst-lt-wh));
51
+ // Size bounds for the whole countdown. 480px is the narrowest the widget lays out
52
+ // cleanly — below it the counters and the title start fighting for the same space
53
+ // — and 600px keeps it from stretching so wide that the two sit far apart. The
54
+ // Width control still applies between the two.
55
+ // min-width: 480px !important;
56
+ min-width: 600px !important;
51
57
  width: var(
52
58
  --_sf-el-wh-st-mx,
53
59
  calc(
@@ -292,6 +298,10 @@ $dividerValues: (
292
298
  display: flex;
293
299
  flex-direction: column;
294
300
  position: relative;
301
+ // Same reasoning as `.countdown`: without this the title's own width acts as a
302
+ // floor, so the text column refuses to give ground and squeezes the counters
303
+ // out of the widget instead of the two sharing what space there is.
304
+ min-width: 0;
295
305
 
296
306
  background-color: var(
297
307
  --_ctm-mob-dn-cn-wt-tt-cr-dn-bd-cr,
@@ -318,13 +328,20 @@ $dividerValues: (
318
328
  );
319
329
  h1 {
320
330
  white-space: nowrap;
331
+ // The title is deliberately kept on one line, so once the column is narrower
332
+ // than the words it has to be cut off rather than bleed across the counters
333
+ // beside it — which is what "SESSIO" running under the digits was.
334
+ overflow: hidden;
335
+ text-overflow: ellipsis;
321
336
  }
322
337
  }
323
338
 
324
339
  .content__container {
325
340
  display: flex;
326
341
  flex-direction: column;
327
- width: 100%;
342
+ // Text Container Width, from the widget's text-container layout. 100% is what
343
+ // was hardcoded here, so an untouched countdown is unchanged.
344
+ width: prepareMediaVariable(--_ctm-dn-cn-wt-tt-cr-lt-tt-cr-wh, 100%);
328
345
  gap: #{prepareMediaVariable(--_ctm-dn-cn-wt-tt-cr-lt-te-ad-dn-sg)};
329
346
 
330
347
  h1 {
@@ -534,11 +551,24 @@ $dividerValues: (
534
551
  width: 100%;
535
552
  display: grid;
536
553
  grid-auto-flow: column;
554
+ // Counters and dividers on one centre line. Grid items stretch by default, so
555
+ // each column filled the row height and its contents settled wherever their own
556
+ // box put them — which is why the dividers never lined up with the digits.
557
+ align-items: center;
558
+ // And centred along the row. Auto tracks absorb the widget's spare width, but
559
+ // `.countdown__element` is `width: max-content`, so a counter cannot stretch
560
+ // and was left sitting at the START of its track — while a divider, having no
561
+ // width of its own, did stretch and centred its icon in the middle of its own
562
+ // track. The two settled to different places, so a divider never landed
563
+ // halfway between the counters either side of it.
564
+ justify-items: center;
537
565
  column-gap: 4px;
538
566
  text-align: center;
539
567
 
540
- overflow-x: auto;
541
- scrollbar-width: none;
568
+ // No scrolling here: the element carries a 480px floor (see the min-width on
569
+ // the root below), which is enough to lay the counters out in full, so there
570
+ // is nothing to scroll to. The counters keep their natural minimum size and
571
+ // the text column beside them gives way first.
542
572
  &[data-text-align="left"] {
543
573
  .countdown__element .countdown__digits {
544
574
  justify-content: flex-start;
@@ -802,14 +832,27 @@ $dividerValues: (
802
832
  );
803
833
  }
804
834
  }
835
+ // The divider between two counters. `.countdown` is a column grid, so this is a
836
+ // grid item sitting beside the `.countdown__element` boxes.
837
+ //
838
+ // `align-self: center` matters: grid items stretch by default, so the separator
839
+ // filled the row's full height and the icon inside it centred against that,
840
+ // rather than against the digits it sits between. The `margin-top: 6px` that
841
+ // used to nudge it back was a guess at one particular counter height and threw
842
+ // the alignment out again at any other size.
805
843
  .separator {
806
844
  display: flex;
807
845
  align-items: center;
808
846
  justify-content: center;
847
+ align-self: center;
848
+ // Kills the inline-SVG baseline gap, which otherwise adds a few pixels under
849
+ // the glyph and reads as the icon sitting high.
850
+ line-height: 0;
851
+ flex-shrink: 0;
809
852
  svg {
810
853
  width: prepareMediaVariable(--_ctm-dn-dr-se-in-se);
811
854
  height: prepareMediaVariable(--_ctm-dn-dr-se-in-se);
812
- margin-top: 6px;
855
+ display: block;
813
856
 
814
857
  path {
815
858
  stroke: prepareMediaVariable(--_ctm-dn-dr-se-in-c1);
package/dist/filters.scss CHANGED
@@ -205,6 +205,21 @@ $resizeActive: '[data-cms-element-resizer="true"]';
205
205
  --_ctm-mob-dn-cr-al-tt-dt-se-bd-cr,
206
206
  var(--_ctm-tab-dn-cr-al-tt-dt-se-bd-cr, var(--_ctm-dn-cr-al-tt-dt-se-bd-cr))
207
207
  );
208
+ // Border of the Clear All button. The section has carried border colour,
209
+ // style, width and the Show Border toggle all along, but this rule read
210
+ // none of them, so the whole Border tab did nothing.
211
+ border-color: prepareMediaVariable(--_ctm-dn-cr-al-tt-dt-se-br-cr, transparent);
212
+ border-style: prepareMediaVariable(--_ctm-dn-cr-al-tt-dt-se-br-se, solid);
213
+ border-width: prepareMediaVariable(--_ctm-dn-cr-al-tt-dt-se-br-wh, 0);
214
+ &[data-clear-all-text-border="false"] {
215
+ border: none;
216
+ }
217
+ // Text Overflow clamps to N lines; the renderer adds the class and
218
+ // publishes the count as --_sf-line-clamp.
219
+ &.flex__overflow {
220
+ white-space: normal;
221
+ @include restrictToLinesShow(#{var(--_sf-line-clamp, 1)});
222
+ }
208
223
  border-radius: var(
209
224
  --_ctm-mob-dn-cr-al-tt-dt-se-br-rs,
210
225
  var(--_ctm-tab-dn-cr-al-tt-dt-se-br-rs, var(--_ctm-dn-cr-al-tt-dt-se-br-rs))
@@ -369,6 +384,15 @@ $resizeActive: '[data-cms-element-resizer="true"]';
369
384
  align-items: center;
370
385
  gap: 10px;
371
386
  flex-wrap: wrap;
387
+
388
+ // Selected Items View. "Wrap" is the flowing row above — the default and
389
+ // what this has always been. "Vertical" stacks one chip per line, each
390
+ // sized to its own text rather than stretched across the column.
391
+ &[data-selected-items-view="Vertical"] {
392
+ flex-direction: column;
393
+ flex-wrap: nowrap;
394
+ align-items: flex-start;
395
+ }
372
396
  // .selected_item {
373
397
  // display: flex;
374
398
  // gap: 8px;
@@ -802,49 +826,182 @@ $resizeActive: '[data-cms-element-resizer="true"]';
802
826
  transition: all 400ms ease-in-out;
803
827
  }
804
828
  }
829
+ // Search Bar. Until now only Border, Border Radius and Padding reached
830
+ // CSS from here, which is why Background Color, the text properties and
831
+ // Box Shadow all looked dead — nothing read their variables.
832
+ //
833
+ // The section carries Default / Focus states now, so everything reads
834
+ // `sh-br-dt-se-*` (searchBar.defaultState). The old flat `sh-br-*` name is
835
+ // kept as the fallback on the three that were live before the split, so a
836
+ // bar styled on an already-published page does not jump.
805
837
  .filter__search {
806
838
  display: flex;
807
839
  align-items: center;
808
- // padding: 6px 10px;
809
- padding: var(
810
- --_sf-hr-sd-im-pg,
811
- var(--_ctm-mob-dn-sh-br-pg, var(--_ctm-tab-dn-sh-br-pg, var(--_ctm-dn-sh-br-pg)))
840
+ width: 100%;
841
+
842
+ padding: prepareMediaVariable(
843
+ --_ctm-dn-sh-br-dt-se-pg,
844
+ prepareMediaVariable(--_ctm-dn-sh-br-pg)
812
845
  );
813
- // border: 1px solid var(--_gray-300);
814
- border-color: var(
815
- --_sf-hr-br-cr,
816
- var(
817
- --_ctm-mob-dn-sh-br-br-cr,
818
- var(--_ctm-tab-dn-sh-br-br-cr, var(--_ctm-dn-sh-br-br-cr))
819
- )
846
+ background-color: prepareMediaVariable(--_ctm-dn-sh-br-dt-se-bd-cr);
847
+ border-color: prepareMediaVariable(
848
+ --_ctm-dn-sh-br-dt-se-br-cr,
849
+ prepareMediaVariable(--_ctm-dn-sh-br-br-cr)
820
850
  );
821
- border-style: var(
822
- --_sf-hr-br-st,
823
- var(
824
- --_ctm-mob-dn-sh-br-br-se,
825
- var(--_ctm-tab-dn-sh-br-br-se, var(--_ctm-dn-sh-br-br-se))
826
- )
851
+ border-style: prepareMediaVariable(
852
+ --_ctm-dn-sh-br-dt-se-br-se,
853
+ prepareMediaVariable(--_ctm-dn-sh-br-br-se)
827
854
  );
828
- border-width: var(
829
- --_sf-hr-br-wh,
830
- var(
831
- --_ctm-mob-dn-sh-br-br-wh,
832
- var(--_ctm-tab-dn-sh-br-br-wh, var(--_ctm-dn-sh-br-br-wh))
833
- )
855
+ border-width: prepareMediaVariable(
856
+ --_ctm-dn-sh-br-dt-se-br-wh,
857
+ prepareMediaVariable(--_ctm-dn-sh-br-br-wh)
858
+ );
859
+ border-radius: prepareMediaVariable(
860
+ --_ctm-dn-sh-br-dt-se-br-rs,
861
+ prepareMediaVariable(--_ctm-dn-sh-br-br-rs)
834
862
  );
835
- // border-radius: 6px;
836
- border-radius: prepareMediaVariable(--_ctm-dn-sh-br-br-rs);
837
- width: 100%;
838
863
 
864
+ // Opt-in, like every other Show Shadow in this element: the bar has
865
+ // never cast one, so it only appears once the toggle is on.
866
+ box-shadow: none;
867
+ &[data-show-shadow="true"] {
868
+ box-shadow: prepareMediaVariable(--_ctm-dn-sh-br-dt-se-sw-ae, 0 0)
869
+ prepareMediaVariable(--_ctm-dn-sh-br-dt-se-sw-br, 0)
870
+ prepareMediaVariable(--_ctm-dn-sh-br-dt-se-sw-sd, 0)
871
+ prepareMediaVariable(--_ctm-dn-sh-br-dt-se-sw-cr, transparent);
872
+ }
873
+ &[data-show-border="false"] {
874
+ border: none;
875
+ }
876
+
877
+ // Text properties apply to the input and its placeholder, which is the
878
+ // only text this section owns.
879
+ input[type="text"] {
880
+ padding-left: 6px;
881
+ background-color: transparent;
882
+ color: prepareMediaVariable(--_ctm-dn-sh-br-dt-se-cr);
883
+ font-family: prepareMediaVariable(--_ctm-dn-sh-br-dt-se-ft-fy);
884
+ font-size: prepareMediaVariable(--_ctm-dn-sh-br-dt-se-ft-se);
885
+ font-weight: prepareMediaVariable(--_ctm-dn-sh-br-dt-se-ft-wt);
886
+ font-style: prepareMediaVariable(--_ctm-dn-sh-br-dt-se-ft-se-ic);
887
+ text-align: prepareMediaVariable(--_ctm-dn-sh-br-dt-se-tt-an);
888
+ letter-spacing: prepareMediaVariable(--_ctm-dn-sh-br-dt-se-lr-sg);
889
+ line-height: prepareMediaVariable(--_ctm-dn-sh-br-dt-se-le-ht);
890
+ text-decoration: prepareMediaVariable(--_ctm-dn-sh-br-dt-se-ue);
891
+ text-transform: prepareMediaVariable(--_ctm-dn-sh-br-dt-se-tt-tm);
892
+ word-wrap: prepareMediaVariable(--_ctm-dn-sh-br-dt-se-wd-wp);
893
+ word-break: prepareMediaVariable(--_ctm-dn-sh-br-dt-se-wd-bk);
894
+
895
+ &::placeholder {
896
+ color: prepareMediaVariable(--_ctm-dn-sh-br-dt-se-cr);
897
+ }
898
+ }
899
+
900
+ // The magnifier. Size and colour come from the Icon tab; `showIcon`
901
+ // hides it without removing the button from the flow.
839
902
  button {
840
903
  display: flex;
841
904
  svg {
842
- width: 18px;
843
- height: 18px;
905
+ width: prepareMediaVariable(--_ctm-dn-sh-br-dt-se-in-se, 18px);
906
+ height: prepareMediaVariable(--_ctm-dn-sh-br-dt-se-in-se, 18px);
907
+
908
+ // A library glyph paints with `stroke` on its paths while an
909
+ // uploaded one may use `fill`, or set either on the root.
910
+ &[stroke]:not([stroke="none"]),
911
+ [stroke]:not([stroke="none"]) {
912
+ stroke: prepareMediaVariable(--_ctm-dn-sh-br-dt-se-in-c1);
913
+ }
914
+ &[fill]:not([fill="none"]),
915
+ [fill]:not([fill="none"]) {
916
+ fill: prepareMediaVariable(--_ctm-dn-sh-br-dt-se-in-c1);
917
+ }
918
+ stroke-width: prepareMediaVariable(--_ctm-dn-sh-br-dt-se-se-wh);
919
+ }
920
+ &[data-show-icon="false"] {
921
+ display: none;
844
922
  }
845
923
  }
846
- input[type="text"] {
847
- padding-left: 6px;
924
+
925
+ // Focus State. `:focus-within` rather than `:focus`, because the focus
926
+ // lands on the input while the styling belongs to the bar around it.
927
+ // Each property falls back to its own default-state value, so a focus
928
+ // style nobody has set is simply the default one.
929
+ &:focus-within {
930
+ padding: prepareMediaVariable(
931
+ --_ctm-dn-sh-br-fs-se-pg,
932
+ prepareMediaVariable(--_ctm-dn-sh-br-dt-se-pg)
933
+ );
934
+ background-color: prepareMediaVariable(
935
+ --_ctm-dn-sh-br-fs-se-bd-cr,
936
+ prepareMediaVariable(--_ctm-dn-sh-br-dt-se-bd-cr)
937
+ );
938
+ border-color: prepareMediaVariable(
939
+ --_ctm-dn-sh-br-fs-se-br-cr,
940
+ prepareMediaVariable(--_ctm-dn-sh-br-dt-se-br-cr)
941
+ );
942
+ border-style: prepareMediaVariable(
943
+ --_ctm-dn-sh-br-fs-se-br-se,
944
+ prepareMediaVariable(--_ctm-dn-sh-br-dt-se-br-se)
945
+ );
946
+ border-width: prepareMediaVariable(
947
+ --_ctm-dn-sh-br-fs-se-br-wh,
948
+ prepareMediaVariable(--_ctm-dn-sh-br-dt-se-br-wh)
949
+ );
950
+ border-radius: prepareMediaVariable(
951
+ --_ctm-dn-sh-br-fs-se-br-rs,
952
+ prepareMediaVariable(--_ctm-dn-sh-br-dt-se-br-rs)
953
+ );
954
+
955
+ &[data-focus-show-shadow="true"] {
956
+ box-shadow: prepareMediaVariable(--_ctm-dn-sh-br-fs-se-sw-ae, 0 0)
957
+ prepareMediaVariable(--_ctm-dn-sh-br-fs-se-sw-br, 0)
958
+ prepareMediaVariable(--_ctm-dn-sh-br-fs-se-sw-sd, 0)
959
+ prepareMediaVariable(--_ctm-dn-sh-br-fs-se-sw-cr, transparent);
960
+ }
961
+
962
+ input[type="text"] {
963
+ color: prepareMediaVariable(
964
+ --_ctm-dn-sh-br-fs-se-cr,
965
+ prepareMediaVariable(--_ctm-dn-sh-br-dt-se-cr)
966
+ );
967
+ font-size: prepareMediaVariable(
968
+ --_ctm-dn-sh-br-fs-se-ft-se,
969
+ prepareMediaVariable(--_ctm-dn-sh-br-dt-se-ft-se)
970
+ );
971
+ font-weight: prepareMediaVariable(
972
+ --_ctm-dn-sh-br-fs-se-ft-wt,
973
+ prepareMediaVariable(--_ctm-dn-sh-br-dt-se-ft-wt)
974
+ );
975
+ text-transform: prepareMediaVariable(
976
+ --_ctm-dn-sh-br-fs-se-tt-tm,
977
+ prepareMediaVariable(--_ctm-dn-sh-br-dt-se-tt-tm)
978
+ );
979
+ }
980
+
981
+ button svg {
982
+ width: prepareMediaVariable(
983
+ --_ctm-dn-sh-br-fs-se-in-se,
984
+ prepareMediaVariable(--_ctm-dn-sh-br-dt-se-in-se, 18px)
985
+ );
986
+ height: prepareMediaVariable(
987
+ --_ctm-dn-sh-br-fs-se-in-se,
988
+ prepareMediaVariable(--_ctm-dn-sh-br-dt-se-in-se, 18px)
989
+ );
990
+ &[stroke]:not([stroke="none"]),
991
+ [stroke]:not([stroke="none"]) {
992
+ stroke: prepareMediaVariable(
993
+ --_ctm-dn-sh-br-fs-se-in-c1,
994
+ prepareMediaVariable(--_ctm-dn-sh-br-dt-se-in-c1)
995
+ );
996
+ }
997
+ &[fill]:not([fill="none"]),
998
+ [fill]:not([fill="none"]) {
999
+ fill: prepareMediaVariable(
1000
+ --_ctm-dn-sh-br-fs-se-in-c1,
1001
+ prepareMediaVariable(--_ctm-dn-sh-br-dt-se-in-c1)
1002
+ );
1003
+ }
1004
+ }
848
1005
  }
849
1006
  }
850
1007
  }
@@ -915,6 +1072,15 @@ $resizeActive: '[data-cms-element-resizer="true"]';
915
1072
  }
916
1073
  }
917
1074
  .more__button {
1075
+ // Padding of the More Button. The key was in the schema and the panel
1076
+ // rendered it under Border Radius, but nothing here read it.
1077
+ padding: prepareMediaVariable(--_ctm-dn-me-bn-dt-se-pg, 0);
1078
+ &:hover {
1079
+ padding: prepareMediaVariable(
1080
+ --_ctm-dn-me-bn-hr-se-pg,
1081
+ prepareMediaVariable(--_ctm-dn-me-bn-dt-se-pg, 0)
1082
+ );
1083
+ }
918
1084
  // font-size: 12px;
919
1085
  // text-transform: uppercase;
920
1086
  // font-weight: var(--_fw-500);
@@ -1581,7 +1747,11 @@ $resizeActive: '[data-cms-element-resizer="true"]';
1581
1747
  // Input checkbox Starts
1582
1748
  .checkbox__radio {
1583
1749
  display: flex;
1584
- align-items: center;
1750
+ // `flex-start`, not `center`: once the box can be resized or padded it is often
1751
+ // taller than one line of label text, and centring made a wrapped label sit
1752
+ // visibly off its box. Starting both at the top keeps the box level with the
1753
+ // label's first line at any size.
1754
+ align-items: flex-start;
1585
1755
  gap: 8px;
1586
1756
  position: relative;
1587
1757
  // margin-bottom: 12px;
@@ -1679,8 +1849,34 @@ $resizeActive: '[data-cms-element-resizer="true"]';
1679
1849
  }
1680
1850
 
1681
1851
  .checkmark {
1682
- height: 18px;
1683
- width: 18px;
1852
+ // Layout Options of the Checkbox Unchecked / Checked sections. These were
1853
+ // hardcoded, so Width, Height and Padding wrote variables no rule read. 18px
1854
+ // is the schema default and what was hardcoded here, so an untouched checkbox
1855
+ // is unchanged. `box-sizing` keeps the configured Width the outer size once a
1856
+ // padding or a border is added, and `flex-shrink: 0` stops a long option label
1857
+ // squashing a box that has been made bigger — the row stays aligned.
1858
+ box-sizing: border-box;
1859
+ flex-shrink: 0;
1860
+ width: prepareMediaVariable(--_ctm-dn-cx-ud-se-dt-se-wh, 18px);
1861
+ height: prepareMediaVariable(--_ctm-dn-cx-ud-se-dt-se-ht, 18px);
1862
+ padding: prepareMediaVariable(--_ctm-dn-cx-ud-se-dt-se-pg, 0);
1863
+
1864
+ // Unchecked hover. The checkbox variant had no hover rule at all, so the
1865
+ // Hover state of Checkbox Unchecked Style reached nothing here.
1866
+ &:hover {
1867
+ width: prepareMediaVariable(
1868
+ --_ctm-dn-cx-ud-se-hr-se-wh,
1869
+ prepareMediaVariable(--_ctm-dn-cx-ud-se-dt-se-wh, 18px)
1870
+ );
1871
+ height: prepareMediaVariable(
1872
+ --_ctm-dn-cx-ud-se-hr-se-ht,
1873
+ prepareMediaVariable(--_ctm-dn-cx-ud-se-dt-se-ht, 18px)
1874
+ );
1875
+ padding: prepareMediaVariable(
1876
+ --_ctm-dn-cx-ud-se-hr-se-pg,
1877
+ prepareMediaVariable(--_ctm-dn-cx-ud-se-dt-se-pg, 0)
1878
+ );
1879
+ }
1684
1880
  // border: 1px solid var(--_gray-500);
1685
1881
  // background-color: var(--_base-white);
1686
1882
  display: flex;
@@ -1820,6 +2016,20 @@ $resizeActive: '[data-cms-element-resizer="true"]';
1820
2016
  }
1821
2017
 
1822
2018
  .checkbox__radio input:checked ~ .checkmark {
2019
+ // Checked has its own Layout Options, falling back to the unchecked ones so a
2020
+ // box that is only sized on one of the two sections stays a square.
2021
+ width: prepareMediaVariable(
2022
+ --_ctm-dn-cx-cd-se-dt-se-wh,
2023
+ prepareMediaVariable(--_ctm-dn-cx-ud-se-dt-se-wh, 18px)
2024
+ );
2025
+ height: prepareMediaVariable(
2026
+ --_ctm-dn-cx-cd-se-dt-se-ht,
2027
+ prepareMediaVariable(--_ctm-dn-cx-ud-se-dt-se-ht, 18px)
2028
+ );
2029
+ padding: prepareMediaVariable(
2030
+ --_ctm-dn-cx-cd-se-dt-se-pg,
2031
+ prepareMediaVariable(--_ctm-dn-cx-ud-se-dt-se-pg, 0)
2032
+ );
1823
2033
  background-color: var(
1824
2034
  --_ctm-mob-dn-cx-cd-se-dt-se-bd-cr,
1825
2035
  var(--_ctm-tab-dn-cx-cd-se-dt-se-bd-cr, var(--_ctm-dn-cx-cd-se-dt-se-bd-cr))
@@ -1876,6 +2086,20 @@ $resizeActive: '[data-cms-element-resizer="true"]';
1876
2086
  }
1877
2087
 
1878
2088
  &:hover {
2089
+ // Hover carries its own Layout Options, each falling back to the default
2090
+ // state so a box only sized on Default keeps that size on hover.
2091
+ width: prepareMediaVariable(
2092
+ --_ctm-dn-cx-cd-se-hr-se-wh,
2093
+ prepareMediaVariable(--_ctm-dn-cx-cd-se-dt-se-wh, 18px)
2094
+ );
2095
+ height: prepareMediaVariable(
2096
+ --_ctm-dn-cx-cd-se-hr-se-ht,
2097
+ prepareMediaVariable(--_ctm-dn-cx-cd-se-dt-se-ht, 18px)
2098
+ );
2099
+ padding: prepareMediaVariable(
2100
+ --_ctm-dn-cx-cd-se-hr-se-pg,
2101
+ prepareMediaVariable(--_ctm-dn-cx-cd-se-dt-se-pg, 0)
2102
+ );
1879
2103
  background-color: var(
1880
2104
  --_ctm-mob-dn-cx-cd-se-hr-se-bd-cr,
1881
2105
  var(--_ctm-tab-dn-cx-cd-se-hr-se-bd-cr, var(--_ctm-dn-cx-cd-se-hr-se-bd-cr))
@@ -1941,15 +2165,16 @@ $resizeActive: '[data-cms-element-resizer="true"]';
1941
2165
  justify-content: center;
1942
2166
  }
1943
2167
  svg {
1944
- // width: 13px;
1945
- // height: 13px;
1946
- width: var(
1947
- --_ctm-mob-dn-cx-cd-se-hr-se-se,
1948
- var(--_ctm-tab-dn-cx-cd-se-hr-se-se, var(--_ctm-dn-cx-cd-se-hr-se-se))
2168
+ // Icon Size of the hover state. These read a plain `-se`, a name nothing
2169
+ // emits — iconSize becomes `in-se`. Falls back to the default state's
2170
+ // size so an icon only sized on Default keeps that size on hover.
2171
+ width: prepareMediaVariable(
2172
+ --_ctm-dn-cx-cd-se-hr-se-in-se,
2173
+ prepareMediaVariable(--_ctm-dn-cx-cd-se-dt-se-in-se, 13px)
1949
2174
  );
1950
- height: var(
1951
- --_ctm-mob-dn-cx-cd-se-hr-se-se,
1952
- var(--_ctm-tab-dn-cx-cd-se-hr-se-se, var(--_ctm-dn-cx-cd-se-hr-se-se))
2175
+ height: prepareMediaVariable(
2176
+ --_ctm-dn-cx-cd-se-hr-se-in-se,
2177
+ prepareMediaVariable(--_ctm-dn-cx-cd-se-dt-se-in-se, 13px)
1953
2178
  );
1954
2179
  path {
1955
2180
  // stroke: var(--_base-white);
@@ -1981,16 +2206,11 @@ $resizeActive: '[data-cms-element-resizer="true"]';
1981
2206
  display: none;
1982
2207
  }
1983
2208
  svg {
1984
- // width: 13px;
1985
- // height: 13px;
1986
- width: var(
1987
- --_ctm-mob-dn-cx-cd-se-dt-se-se,
1988
- var(--_ctm-tab-dn-cx-cd-se-dt-se-se, var(--_ctm-dn-cx-cd-se-dt-se-se))
1989
- );
1990
- height: var(
1991
- --_ctm-mob-dn-cx-cd-se-dt-se-se,
1992
- var(--_ctm-tab-dn-cx-cd-se-dt-se-se, var(--_ctm-dn-cx-cd-se-dt-se-se))
1993
- );
2209
+ // Icon Size. `iconSize` carries `property: "iconSize"`, which
2210
+ // splitCamelCaseAndJoin turns into `in-se` — these read plain `-se`, a
2211
+ // name nothing emits, so the control moved a variable no rule used.
2212
+ width: prepareMediaVariable(--_ctm-dn-cx-cd-se-dt-se-in-se, 13px);
2213
+ height: prepareMediaVariable(--_ctm-dn-cx-cd-se-dt-se-in-se, 13px);
1994
2214
  path {
1995
2215
  // stroke: var(--_base-white);
1996
2216
  stroke: var(
@@ -2025,7 +2245,9 @@ $resizeActive: '[data-cms-element-resizer="true"]';
2025
2245
 
2026
2246
  .filter__checkbox__radio {
2027
2247
  display: flex;
2028
- align-items: center;
2248
+ // Same reasoning as .checkbox__radio above.
2249
+ align-items: flex-start;
2250
+ gap: 8px;
2029
2251
  cursor: pointer;
2030
2252
  position: relative;
2031
2253
 
@@ -2038,9 +2260,17 @@ $resizeActive: '[data-cms-element-resizer="true"]';
2038
2260
  }
2039
2261
 
2040
2262
  .filter__checkmark {
2263
+ // The radio variant — what Selection Type "Single Select" renders, and the
2264
+ // element's default. Its size was hardcoded, so the Checkbox sections' Layout
2265
+ // Options only ever moved the checkbox variant. Same variables, same 18px
2266
+ // fallback, and `flex-shrink: 0` so a resized box is not squeezed by a long
2267
+ // option label beside it.
2268
+ box-sizing: border-box;
2269
+ flex-shrink: 0;
2270
+ width: prepareMediaVariable(--_ctm-dn-cx-ud-se-dt-se-wh, 18px);
2271
+ height: prepareMediaVariable(--_ctm-dn-cx-ud-se-dt-se-ht, 18px);
2272
+ padding: prepareMediaVariable(--_ctm-dn-cx-ud-se-dt-se-pg, 0);
2041
2273
  display: inline-block;
2042
- height: 18px;
2043
- width: 18px;
2044
2274
  // border: 2px solid #ccc;
2045
2275
  // background-color: #fff;
2046
2276
  position: relative;
@@ -2100,6 +2330,19 @@ $resizeActive: '[data-cms-element-resizer="true"]';
2100
2330
  );
2101
2331
  }
2102
2332
  &:hover {
2333
+ // Layout Options of the hover state, falling back to the default state.
2334
+ width: prepareMediaVariable(
2335
+ --_ctm-dn-cx-ud-se-hr-se-wh,
2336
+ prepareMediaVariable(--_ctm-dn-cx-ud-se-dt-se-wh, 18px)
2337
+ );
2338
+ height: prepareMediaVariable(
2339
+ --_ctm-dn-cx-ud-se-hr-se-ht,
2340
+ prepareMediaVariable(--_ctm-dn-cx-ud-se-dt-se-ht, 18px)
2341
+ );
2342
+ padding: prepareMediaVariable(
2343
+ --_ctm-dn-cx-ud-se-hr-se-pg,
2344
+ prepareMediaVariable(--_ctm-dn-cx-ud-se-dt-se-pg, 0)
2345
+ );
2103
2346
  &[data-show-hover-unchecked-border="true"] {
2104
2347
  border-color: var(
2105
2348
  --_sf-hr-br-cr,
@@ -2180,6 +2423,20 @@ $resizeActive: '[data-cms-element-resizer="true"]';
2180
2423
  }
2181
2424
 
2182
2425
  input[type="radio"]:checked ~ .filter__checkmark {
2426
+ // Checked carries its own Layout Options, falling back to the unchecked ones
2427
+ // so a radio sized on only one of the two sections stays round.
2428
+ width: prepareMediaVariable(
2429
+ --_ctm-dn-cx-cd-se-dt-se-wh,
2430
+ prepareMediaVariable(--_ctm-dn-cx-ud-se-dt-se-wh, 18px)
2431
+ );
2432
+ height: prepareMediaVariable(
2433
+ --_ctm-dn-cx-cd-se-dt-se-ht,
2434
+ prepareMediaVariable(--_ctm-dn-cx-ud-se-dt-se-ht, 18px)
2435
+ );
2436
+ padding: prepareMediaVariable(
2437
+ --_ctm-dn-cx-cd-se-dt-se-pg,
2438
+ prepareMediaVariable(--_ctm-dn-cx-ud-se-dt-se-pg, 0)
2439
+ );
2183
2440
  // border-color: #007bff;
2184
2441
  &[data-show-default-checked-shadow="true"] {
2185
2442
  box-shadow: var(
@@ -2283,15 +2540,14 @@ $resizeActive: '[data-cms-element-resizer="true"]';
2283
2540
  display: block;
2284
2541
  }
2285
2542
  svg {
2286
- // width: 13px;
2287
- // height: 13px;
2288
- width: var(
2289
- --_ctm-mob-dn-cx-cd-se-hr-se-se,
2290
- var(--_ctm-tab-dn-cx-cd-se-hr-se-se, var(--_ctm-dn-cx-cd-se-hr-se-se))
2543
+ // Same `-se` / `in-se` mix-up as the checkbox copy above.
2544
+ width: prepareMediaVariable(
2545
+ --_ctm-dn-cx-cd-se-hr-se-in-se,
2546
+ prepareMediaVariable(--_ctm-dn-cx-cd-se-dt-se-in-se, 13px)
2291
2547
  );
2292
- height: var(
2293
- --_ctm-mob-dn-cx-cd-se-hr-se-se,
2294
- var(--_ctm-tab-dn-cx-cd-se-hr-se-se, var(--_ctm-dn-cx-cd-se-hr-se-se))
2548
+ height: prepareMediaVariable(
2549
+ --_ctm-dn-cx-cd-se-hr-se-in-se,
2550
+ prepareMediaVariable(--_ctm-dn-cx-cd-se-dt-se-in-se, 13px)
2295
2551
  );
2296
2552
  path {
2297
2553
  // stroke: var(--_base-white);
@@ -2428,7 +2684,10 @@ $resizeActive: '[data-cms-element-resizer="true"]';
2428
2684
  position: relative;
2429
2685
  width: 100%;
2430
2686
  height: 5px;
2431
- margin: 16px 0 30px 0px;
2687
+ // The 30px bottom used to reserve room for the two values, which hung off the
2688
+ // track absolutely. They sit under it in normal flow now, so the track only
2689
+ // needs its own breathing room.
2690
+ margin: 16px 0 0 0;
2432
2691
  // background-color: var(--_primary-400);
2433
2692
  // background: linear-gradient(
2434
2693
  // to right,
@@ -2601,13 +2860,26 @@ $resizeActive: '[data-cms-element-resizer="true"]';
2601
2860
  text-align: center;
2602
2861
  }
2603
2862
 
2863
+ // The two price values under the slider. They used to be absolutely positioned
2864
+ // off the track at hardcoded offsets (left: 42px / right: 45px with a 50%
2865
+ // translate), so at narrow widths they drifted over each other and over the
2866
+ // thumbs, and neither sat at its end of the track. They are a flex row now, one
2867
+ // value pinned to each end.
2868
+ .range-values {
2869
+ display: flex;
2870
+ justify-content: space-between;
2871
+ align-items: center;
2872
+ gap: 8px;
2873
+ width: 100%;
2874
+ margin-top: 8px;
2875
+ }
2876
+
2604
2877
  .min-tooltip,
2605
2878
  .max-tooltip {
2606
- position: absolute;
2607
- top: -35px;
2879
+ display: flex;
2880
+ align-items: center;
2608
2881
  font-size: 12px;
2609
2882
  color: var(--_thm-cs-be-se-1);
2610
- // background-color: #fff;
2611
2883
  border: 1px solid var(--_thm-cs-be-se-3);
2612
2884
  border-radius: 5px;
2613
2885
  white-space: nowrap;
@@ -2620,30 +2892,19 @@ $resizeActive: '[data-cms-element-resizer="true"]';
2620
2892
  }
2621
2893
  }
2622
2894
  }
2623
- &:focus-within {
2624
- outline: 2px solid var(--_gray-200);
2625
- border: 1px solid var(--_gray-300);
2626
- }
2627
- }
2628
-
2629
- .min-tooltip {
2630
- left: 42px;
2631
- top: 20px;
2632
- transform: translateX(-50%);
2633
2895
  input {
2634
2896
  padding-left: 0px !important;
2635
2897
  text-align: left !important;
2636
2898
  }
2899
+ &:focus-within {
2900
+ outline: 2px solid var(--_gray-200);
2901
+ border: 1px solid var(--_gray-300);
2902
+ }
2637
2903
  }
2638
2904
 
2905
+ // The max value reads right-to-left against the end of the track.
2639
2906
  .max-tooltip {
2640
- right: 45px;
2641
- top: 20px;
2642
- transform: translateX(50%);
2643
- input {
2644
- padding-left: 0px !important;
2645
- text-align: left !important;
2646
- }
2907
+ justify-content: flex-end;
2647
2908
  }
2648
2909
 
2649
2910
  .price-range-container {