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

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.
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);
@@ -2419,7 +2675,7 @@ $resizeActive: '[data-cms-element-resizer="true"]';
2419
2675
  border-radius: 10px;
2420
2676
  // padding: 20px;
2421
2677
  width: 100%;
2422
- max-width: 300px;
2678
+ // max-width: 300px;
2423
2679
  padding-inline: 8px;
2424
2680
  // margin: auto;
2425
2681
  }
@@ -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 {