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

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 (128) hide show
  1. package/dist/add-existing-form.scss +13 -5
  2. package/dist/add-order.scss +126 -236
  3. package/dist/add-products-tab-details.scss +1048 -2097
  4. package/dist/add-products-tab.scss +666 -1204
  5. package/dist/allocation-header-quota-details.scss +189 -407
  6. package/dist/allocationDetails.scss +1661 -2143
  7. package/dist/allocations-quota-details.scss +159 -323
  8. package/dist/allocations.scss +475 -793
  9. package/dist/amount-estimator.scss +405 -743
  10. package/dist/badge.scss +43 -18
  11. package/dist/brand-basic-elements.scss +76 -124
  12. package/dist/brand.scss +28 -55
  13. package/dist/breadcrumbs.scss +356 -718
  14. package/dist/builder.js +1 -1
  15. package/dist/bulk-variant-picker.scss +1128 -2027
  16. package/dist/bundle.scss +841 -1477
  17. package/dist/bundleCategories.scss +301 -301
  18. package/dist/bundleDetails.scss +3774 -5072
  19. package/dist/button.scss +79 -103
  20. package/dist/buy-for-tab-container.scss +77 -106
  21. package/dist/buyForHeaders.scss +1722 -2976
  22. package/dist/cart-details.scss +481 -1012
  23. package/dist/cart-summary.scss +2234 -2826
  24. package/dist/cart-wrapper.scss +37 -79
  25. package/dist/cart.scss +117 -225
  26. package/dist/cartAttributes.scss +1103 -1422
  27. package/dist/category-groups-element.scss +127 -108
  28. package/dist/category-groups-product-grid.scss +120 -147
  29. package/dist/category-groups-product-image.scss +1162 -1457
  30. package/dist/category-groups-product-options.scss +613 -680
  31. package/dist/category-groups-product-price.scss +1966 -3244
  32. package/dist/category-groups-quota-details.scss +210 -464
  33. package/dist/category.scss +26 -50
  34. package/dist/checkout.scss +24 -16
  35. package/dist/confirm-modal.scss +22 -2
  36. package/dist/container.scss +32 -54
  37. package/dist/countdown.scss +711 -899
  38. package/dist/coupon.scss +1160 -1519
  39. package/dist/default-dropdown.scss +12 -1
  40. package/dist/embroider-template-1-v2.scss +123 -172
  41. package/dist/embroider-template-1.scss +68 -104
  42. package/dist/embroidery.scss +30 -31
  43. package/dist/employee-bulk-order.scss +418 -142
  44. package/dist/faq.scss +228 -408
  45. package/dist/filter-results.scss +125 -265
  46. package/dist/filters.scss +2143 -3040
  47. package/dist/gallery-slider-temp.scss +1458 -1776
  48. package/dist/global-styles.scss +218 -198
  49. package/dist/grid.scss +25 -33
  50. package/dist/hotspot.scss +68 -115
  51. package/dist/image-temp.scss +21 -20
  52. package/dist/item-stock.scss +9 -16
  53. package/dist/kitDetails.scss +2719 -4299
  54. package/dist/kits.scss +24 -19
  55. package/dist/language-selector.scss +211 -361
  56. package/dist/last-x-orders.scss +95 -174
  57. package/dist/layouter-item.scss +75 -103
  58. package/dist/layouter-pro-item.scss +89 -95
  59. package/dist/layouter-pro.scss +87 -92
  60. package/dist/layouter.scss +383 -445
  61. package/dist/light-box-v2.scss +89 -104
  62. package/dist/login.scss +287 -566
  63. package/dist/map.scss +1212 -1359
  64. package/dist/marchandiserSets.scss +95 -104
  65. package/dist/mega-menu-container.scss +96 -109
  66. package/dist/mega-menu.scss +624 -731
  67. package/dist/menu-item.scss +2 -2
  68. package/dist/menu-v2.scss +507 -619
  69. package/dist/multi-select-dropdown.scss +27 -3
  70. package/dist/my-templates.scss +38 -9
  71. package/dist/option-bar.scss +215 -375
  72. package/dist/order-status.scss +1790 -2187
  73. package/dist/overflow-module.scss +6 -7
  74. package/dist/past-orders.scss +118 -149
  75. package/dist/payment-methods.scss +46 -30
  76. package/dist/pickup-locations.scss +558 -1118
  77. package/dist/position-module.scss +20 -17
  78. package/dist/prefix-list.scss +21 -10
  79. package/dist/product-actions.scss +1750 -2055
  80. package/dist/product-basic-elements.scss +108 -169
  81. package/dist/product-highlights.scss +303 -348
  82. package/dist/product-image-allocation.scss +1477 -1477
  83. package/dist/product-image-bundles.scss +337 -642
  84. package/dist/product-inventory.scss +673 -1357
  85. package/dist/product-labels.scss +84 -105
  86. package/dist/product-options.scss +1287 -1444
  87. package/dist/product-price.scss +1283 -2561
  88. package/dist/product-promotions.scss +1388 -2830
  89. package/dist/product-sizechart.scss +516 -905
  90. package/dist/product.scss +28 -61
  91. package/dist/productDetails.scss +19 -39
  92. package/dist/profile.scss +207 -447
  93. package/dist/quantity-selector.scss +837 -1074
  94. package/dist/quick-inventory-check.scss +95 -174
  95. package/dist/quick-links.scss +55 -133
  96. package/dist/quick-order-pad.scss +218 -271
  97. package/dist/quota-details.scss +152 -282
  98. package/dist/quotes.scss +814 -847
  99. package/dist/repeater-embla-controls.scss +35 -15
  100. package/dist/repeater-grid-toggle.scss +156 -166
  101. package/dist/repeater-item.scss +41 -64
  102. package/dist/repeater.scss +671 -814
  103. package/dist/request-for-quotes.scss +66 -16
  104. package/dist/responsive-behaviour.scss +3 -1
  105. package/dist/rfqs.scss +118 -181
  106. package/dist/scroll.scss +93 -172
  107. package/dist/search-results-heading.scss +309 -309
  108. package/dist/search.scss +179 -326
  109. package/dist/section.scss +27 -51
  110. package/dist/shipping-payments.scss +198 -58
  111. package/dist/simple-list.scss +74 -164
  112. package/dist/social.scss +80 -145
  113. package/dist/sort.scss +168 -176
  114. package/dist/stack.scss +23 -34
  115. package/dist/static-global.scss +44 -26
  116. package/dist/stockStatus.scss +11 -19
  117. package/dist/store-locations.scss +577 -1105
  118. package/dist/tab-container.scss +81 -108
  119. package/dist/table-common.scss +217 -408
  120. package/dist/table.scss +271 -502
  121. package/dist/text-temp.scss +8 -7
  122. package/dist/theme-classes.scss +17 -13
  123. package/dist/uom-selector.scss +489 -949
  124. package/dist/user-elements.scss +2588 -2896
  125. package/dist/variant-picker.scss +1281 -2555
  126. package/dist/volume-pricing.scss +541 -1037
  127. package/dist/widget.scss +153 -153
  128. package/package.json +1 -1
package/dist/map.scss CHANGED
@@ -1,1359 +1,1212 @@
1
- @use "sass:map";
2
- @use "sass:list";
3
- @use "./functions.scss" as *;
4
-
5
- // Tooltip tip + placement, ported from the image hotspot (hotspot.scss) so both
6
- // elements anchor their tooltip the same way.
7
- //
8
- // $ics is the tip's border-width: a 5px border with no content box makes a 10px
9
- // triangle whose apex sits at the centre of the 10px box.
10
- $ics: 5px;
11
- $tip: $ics * 2;
12
- $bm: 30px;
13
-
14
- // Gap between the pin's edge and the tooltip. Held in a custom property so it can
15
- // track the pin's real size at runtime (see --_sf-tp-gp below) instead of the flat
16
- // 20px this file used to assume — that offset ignored Pin Size, so the tip drifted
17
- // off the pin as soon as the pin was resized.
18
- $g: var(--_sf-tp-gp);
19
-
20
- $overflowSelector: ".flex__overflow";
21
-
22
- // Each entry places the tooltip relative to the pin's centre, then pins the tip to
23
- // the tooltip edge that faces the pin. Because $g already absorbs the pin's
24
- // half-size, every tip offset below is a constant: the triangle always spans exactly
25
- // the gap, base on the tooltip edge and apex on the pin edge. The previous table did
26
- // this with hand-tuned multipliers (1.25 / 1.75 / 2.05 / 2.7 …) and, in five entries,
27
- // a stray top-level border-color that painted over the tooltip's own border colour.
28
- $data: (
29
- // tooltip to the LEFT — tip on its right edge, pointing right
30
- leftTop: (
31
- transform: translate(calc(-100% - #{$g}), calc(-100% + #{$bm})),
32
- icon: (
33
- right: -#{$tip},
34
- bottom: calc(#{$bm} - #{$ics}),
35
- border-color: transparent transparent transparent var(--_ctm-dn-tp-dn-bd-cr),
36
- ),
37
- ),
38
- leftCenter: (
39
- transform: translate(calc(-100% - #{$g}), -50%),
40
- icon: (
41
- right: -#{$tip},
42
- top: calc(50% - #{$ics}),
43
- border-color: transparent transparent transparent var(--_ctm-dn-tp-dn-bd-cr),
44
- ),
45
- ),
46
- leftBottom: (
47
- transform: translate(calc(-100% - #{$g}), calc(0% - #{$bm})),
48
- icon: (
49
- right: -#{$tip},
50
- top: calc(#{$bm} - #{$ics}),
51
- border-color: transparent transparent transparent var(--_ctm-dn-tp-dn-bd-cr),
52
- ),
53
- ),
54
- // tooltip ABOVE — tip on its bottom edge, pointing down
55
- topLeft: (
56
- transform: translate(calc(-100% + #{$bm}), calc(-100% - #{$g})),
57
- icon: (
58
- bottom: -#{$tip},
59
- right: calc(#{$bm} - #{$ics}),
60
- border-color: var(--_ctm-dn-tp-dn-bd-cr) transparent transparent transparent,
61
- ),
62
- ),
63
- topCenter: (
64
- transform: translate(-50%, calc(-100% - #{$g})),
65
- icon: (
66
- bottom: -#{$tip},
67
- left: calc(50% - #{$ics}),
68
- border-color: var(--_ctm-dn-tp-dn-bd-cr) transparent transparent transparent,
69
- ),
70
- ),
71
- topRight: (
72
- transform: translate(calc(0% - #{$bm}), calc(-100% - #{$g})),
73
- icon: (
74
- bottom: -#{$tip},
75
- left: calc(#{$bm} - #{$ics}),
76
- border-color: var(--_ctm-dn-tp-dn-bd-cr) transparent transparent transparent,
77
- ),
78
- ),
79
- // tooltip to the RIGHT — tip on its left edge, pointing left
80
- rightTop: (
81
- transform: translate(#{$g}, calc(-100% + #{$bm})),
82
- icon: (
83
- left: -#{$tip},
84
- bottom: calc(#{$bm} - #{$ics}),
85
- border-color: transparent var(--_ctm-dn-tp-dn-bd-cr) transparent transparent,
86
- ),
87
- ),
88
- rightCenter: (
89
- transform: translate(#{$g}, -50%),
90
- icon: (
91
- left: -#{$tip},
92
- top: calc(50% - #{$ics}),
93
- border-color: transparent var(--_ctm-dn-tp-dn-bd-cr) transparent transparent,
94
- ),
95
- ),
96
- rightBottom: (
97
- transform: translate(#{$g}, calc(0% - #{$bm})),
98
- icon: (
99
- left: -#{$tip},
100
- top: calc(#{$bm} - #{$ics}),
101
- border-color: transparent var(--_ctm-dn-tp-dn-bd-cr) transparent transparent,
102
- ),
103
- ),
104
- // tooltip BELOW — tip on its top edge, pointing up
105
- bottomLeft: (
106
- transform: translate(calc(-100% + #{$bm}), #{$g}),
107
- icon: (
108
- top: -#{$tip},
109
- right: calc(#{$bm} - #{$ics}),
110
- border-color: transparent transparent var(--_ctm-dn-tp-dn-bd-cr) transparent,
111
- ),
112
- ),
113
- bottomCenter: (
114
- transform: translate(-50%, #{$g}),
115
- icon: (
116
- top: -#{$tip},
117
- left: calc(50% - #{$ics}),
118
- border-color: transparent transparent var(--_ctm-dn-tp-dn-bd-cr) transparent,
119
- ),
120
- ),
121
- bottomRight: (
122
- transform: translate(calc(0% - #{$bm}), #{$g}),
123
- icon: (
124
- top: -#{$tip},
125
- left: calc(#{$bm} - #{$ics}),
126
- border-color: transparent transparent var(--_ctm-dn-tp-dn-bd-cr) transparent,
127
- ),
128
- )
129
- );
130
-
131
- // Tooltip Design > Horizontal Alignment, translated for `text-align`. The control is
132
- // picked from the shared alignment list (flex-start | center | flex-end), and those
133
- // keywords mean nothing to text-align, so the two ends have to be mapped. The last two
134
- // entries are the pre-list values, still stored on pages saved before that fix.
135
- $tooltipTextAlign: (
136
- "flex-start": left,
137
- "center": center,
138
- "flex-end": right,
139
- "left": left,
140
- "right": right,
141
- );
142
-
143
- [data-div-type="element"] {
144
- &[data-element-type="map"] {
145
- // Half the pin as it actually renders, and the gap the tooltip keeps from the
146
- // pin's centre — both driven by the Pin Size control rather than a literal, so
147
- // the tip lands on the pin at any size. Unlike the image hotspot there is no
148
- // icon-only variant to handle: .hotspot is always sized by the pin size here,
149
- // with the icon drawn inside it.
150
- --_sf-ht-hf: calc(#{prepareMediaVariable(--_ctm-dn-pn-se-ht-se, 24px)} / 2);
151
- --_sf-tp-gp: calc(var(--_sf-ht-hf) + #{$ics});
152
-
153
- &[data-hotspot-position] {
154
- @each $key, $value in $data {
155
- &[data-hotspot-position="#{$key}"] {
156
- .hotspot__tooltip {
157
- @each $prop, $val in $value {
158
- @if ($prop != icon) {
159
- #{$prop}: #{$val};
160
- } @else {
161
- @each $key2, $value2 in $val {
162
- &:after {
163
- #{$key2}: #{$value2};
164
- }
165
- }
166
- }
167
- }
168
- }
169
- }
170
- }
171
- }
172
- }
173
- }
174
- [data-div-type="element"] {
175
- &[data-element-type="map"] {
176
- // width: var(--_lt-wh);
177
- // height: var(--_lt-ht);
178
- // margin: var(--_lt-mn);
179
- // padding: var(--_lt-pg);
180
- // width: var(--_ctm-lt-wh, var(--_tst-lt-wh));
181
- width: var(
182
- --_sf-el-wh-st-mx,
183
- calc(
184
- 1% * var(--_ctm-mob-ele-nw-wh-vl, var(--_ctm-tab-ele-nw-wh-vl, var(--_ctm-ele-nw-wh-vl)))
185
- )
186
- );
187
- margin: var(--_ctm-mob-lt-mn, var(--_ctm-tab-lt-mn, var(--_ctm-lt-mn)));
188
-
189
- --_aspect-ratio: calc(
190
- 1 *
191
- (
192
- var(--_ctm-mob-lt-ht, var(--_ctm-tab-lt-ht, var(--_ctm-lt-ht))) /
193
- var(--_ctm-mob-lt-wh, var(--_ctm-tab-lt-wh, var(--_ctm-lt-wh)))
194
- )
195
- );
196
-
197
- & > .wrapper {
198
- width: 100%;
199
- // height: 100%;
200
- }
201
- &[data-show-shadow="false"] {
202
- --_show-shadow: none;
203
- }
204
-
205
- // design > Map Widget Layout — where the title/description block sits relative to
206
- // the map. Top/Bottom stack it (column), Left/Right put it beside the map (row).
207
- &[data-text-container-position="Bottom"] .map-element {
208
- flex-direction: column-reverse;
209
- }
210
- &[data-text-container-position="Left"],
211
- &[data-text-container-position="Right"] {
212
- .map-element {
213
- flex-direction: row;
214
-
215
- // Beside the map the header sizes to its content and the map takes the rest;
216
- // stacked above/below it keeps spanning the full width.
217
- > .gallery-header {
218
- // Text Container Width. `auto` (the default) is the previous behaviour.
219
- width: prepareMediaVariable(--_ctm-dn-mp-wt-lt-tt-cr-wh, auto);
220
- // Shrinkable: the width defaults to 100%, which beside the map is a ceiling —
221
- // without this the header would take the whole row and collapse the map.
222
- flex: 0 1 auto;
223
- }
224
- > .map {
225
- flex: 1 1 auto;
226
- }
227
- }
228
- }
229
- &[data-text-container-position="Right"] .map-element {
230
- flex-direction: row-reverse;
231
- }
232
-
233
- // The alignment control switches between the horizontal list (left/center/right)
234
- // for stacked layouts and the vertical one (top/center/bottom) for side-by-side.
235
- // Stacked: the header spans the full width, so align the text inside it. Side by
236
- // side: align the header on the flex cross axis.
237
- &[data-text-container-alignment="left"] .map-element > .gallery-header {
238
- text-align: left;
239
- }
240
- &[data-text-container-alignment="right"] .map-element > .gallery-header {
241
- text-align: right;
242
- }
243
- &[data-text-container-alignment="top"] .map-element {
244
- align-items: flex-start;
245
- }
246
- &[data-text-container-alignment="bottom"] .map-element {
247
- align-items: flex-end;
248
- }
249
- &[data-text-container-alignment="center"] {
250
- .map-element {
251
- align-items: center;
252
-
253
- > .gallery-header {
254
- text-align: center;
255
- }
256
- }
257
- }
258
-
259
- &[data-hotspot-image-style-show-border="true"] {
260
- .imageHotspot-element {
261
- border-style: var(--_ctm-dn-ie-se-br-se);
262
- border-color: var(--_ctm-dn-ie-se-br-cr);
263
- border-width: var(--_ctm-dn-ie-se-br-wh);
264
- border-radius: var(--_ctm-dn-ie-se-br-rs);
265
- }
266
- }
267
- &[data-hotspot-tooltip-style-show-border="true"] {
268
- .hotspot__tooltip {
269
- border-style: var(--_ctm-dn-tp-dn-br-se);
270
- border-color: var(--_ctm-dn-tp-dn-br-cr);
271
- border-width: var(--_ctm-dn-tp-dn-br-wh);
272
- border-radius: var(--_ctm-dn-tp-dn-br-rs);
273
- }
274
- }
275
- &[data-hotspot-tooltip-style-show-shadow="true"] {
276
- .hotspot__tooltip {
277
- box-shadow: var(--_ctm-dn-tp-dn-sw-ae) var(--_ctm-dn-tp-dn-sw-br) var(--_ctm-dn-tp-dn-sw-sd)
278
- var(--_ctm-dn-tp-dn-sw-cr);
279
- }
280
- }
281
-
282
- // Tooltip Design > Horizontal Alignment, applied to the tooltip text itself.
283
- //
284
- // .text_box re-applies the control as align-items further down, which moves the
285
- // title and the description only while they are narrower than the tooltip. A title
286
- // long enough to wrap fills that wrapper, and a flex container cannot move a child
287
- // that is already full width — which is why the control looked dead on the title
288
- // while the shorter description still followed it.
289
- //
290
- // The value reaches the DOM as a data attribute because align-items keywords are
291
- // not text-align keywords; Map Widget Layout's alignment takes the same route to
292
- // .gallery-header above. The tooltip-level control wins over the per-text Alignment
293
- // in Tooltip Text Design — it is the one that positions the text block.
294
- @each $key, $align in $tooltipTextAlign {
295
- &[data-tooltip-text-alignment="#{$key}"] {
296
- .map-element .hotspot__tooltip .text_box > * {
297
- text-align: $align;
298
- }
299
- }
300
- }
301
- &[data-hotspot-tooltip-image-style-show-border="true"] {
302
- .tooltip__image {
303
- border-style: var(--_ctm-dn-tp-ie-dn-br-se);
304
- border-color: var(--_ctm-dn-tp-ie-dn-br-cr);
305
- border-width: var(--_ctm-dn-tp-ie-dn-br-wh);
306
- border-radius: var(--_ctm-dn-tp-ie-dn-br-rs);
307
- }
308
- }
309
- &[data-hotspot-tooltip-image-style-show-shadow="true"] {
310
- .tooltip__image {
311
- box-shadow: var(
312
- --_show-shadow,
313
- var(--_ctm-dn-tp-ie-dn-sw-ae) var(--_ctm-dn-tp-ie-dn-sw-br) var(--_ctm-dn-tp-ie-dn-sw-sd)
314
- var(--_ctm-dn-tp-ie-dn-sw-cr)
315
- );
316
- }
317
- }
318
- &[data-hotspot-style-show-shadow="true"] {
319
- .hotspot {
320
- box-shadow: var(--_ctm-dn-ht-se-sw-ae) var(--_ctm-dn-ht-se-sw-br) var(--_ctm-dn-ht-se-sw-sd)
321
- var(--_ctm-dn-ht-se-sw-cr);
322
- }
323
- }
324
- &[data-hotspot-style-show-border="true"] {
325
- .hotspot {
326
- border-style: var(--_ctm-dn-ht-se-br-se);
327
- border-color: var(--_ctm-dn-ht-se-br-cr);
328
- border-width: var(--_ctm-dn-ht-se-br-wh);
329
- border-radius: var(--_ctm-dn-ht-se-br-rs);
330
- }
331
- }
332
- .map-element {
333
- --text-high-contrast-rgb-value: 49, 49, 49;
334
- --detail-medium-contrast: rgb(234, 234, 234);
335
- --text-body: rgb(54, 49, 61);
336
-
337
- position: relative;
338
- background-color: var(
339
- --_ctm-mob-dn-mp-wt-bd-cr,
340
- var(--_ctm-tab-dn-mp-wt-bd-cr, var(--_ctm-dn-mp-wt-bd-cr))
341
- );
342
-
343
- padding: var(--_ctm-mob-lt-pg, var(--_ctm-tab-lt-pg, var(--_ctm-lt-pg)));
344
-
345
- display: flex;
346
- flex-direction: column;
347
- --_sf-cd-gp: calc(var(--_sf-gp) * 0.5);
348
-
349
- gap: var(
350
- --_ctm-mob-dn-mp-wt-lt-mp-ad-tt-cr-sg,
351
- var(--_ctm-tab-dn-mp-wt-lt-mp-ad-tt-cr-sg, var(--_ctm-dn-mp-wt-lt-mp-ad-tt-cr-sg))
352
- );
353
- // Alignment comes from the [data-text-container-alignment] rules above. It used to
354
- // read the *spacing* variable here, which is a length and never valid for
355
- // align-content, so the control did nothing.
356
-
357
- width: 100%;
358
- height: var(--_ctm-mob-lt-ht, var(--_ctm-tab-lt-ht, var(--_ctm-lt-ht)));
359
- // Height is a fixed value from layout, so keep the border inside it rather than
360
- // letting it push the widget past the size the user set.
361
- box-sizing: border-box;
362
-
363
- border-color: var(
364
- --_ctm-mob-dn-mp-wt-br-cr,
365
- var(--_ctm-tab-dn-mp-wt-br-cr, var(--_ctm-dn-mp-wt-br-cr))
366
- );
367
-
368
- border-style: var(
369
- --_ctm-mob-dn-mp-wt-br-se,
370
- var(--_ctm-tab-dn-mp-wt-br-se, var(--_ctm-dn-mp-wt-br-se))
371
- );
372
-
373
- border-width: var(
374
- --_ctm-mob-dn-mp-wt-br-wh,
375
- var(--_ctm-tab-dn-mp-wt-br-wh, var(--_ctm-dn-mp-wt-br-wh))
376
- );
377
-
378
- border-radius: var(
379
- --_ctm-mob-dn-mp-wt-br-rs,
380
- var(--_ctm-tab-dn-mp-wt-br-rs, var(--_ctm-dn-mp-wt-br-rs))
381
- );
382
-
383
- box-shadow: var(
384
- --_show-shadow,
385
- var(--_ctm-mob-dn-mp-wt-sw-ae, var(--_ctm-tab-dn-mp-wt-sw-ae, var(--_ctm-dn-mp-wt-sw-ae)))
386
- var(--_ctm-mob-dn-mp-wt-sw-br, var(--_ctm-tab-dn-mp-wt-sw-br, var(--_ctm-dn-mp-wt-sw-br)))
387
- var(--_ctm-mob-dn-mp-wt-sw-sd, var(--_ctm-tab-dn-mp-wt-sw-sd, var(--_ctm-dn-mp-wt-sw-sd)))
388
- var(--_ctm-mob-dn-mp-wt-sw-cr, var(--_ctm-tab-dn-mp-wt-sw-cr, var(--_ctm-dn-mp-wt-sw-cr)))
389
- );
390
-
391
- .gallery-header {
392
- // Text alignment is driven by [data-text-container-alignment] above. The
393
- // gallery variable that used to sit here is never emitted for a map element.
394
- box-sizing: border-box;
395
-
396
- // line-height: var(--_ctm-dn-gy-lt-tt-ad-dn-sg, var(--_tst-dn-gy-lt-tt-ad-dn-sg));
397
- display: flex;
398
- flex-direction: column;
399
-
400
- gap: var(
401
- --_ctm-mob-dn-mp-wt-tt-cr-lt-te-ad-dn-sg,
402
- var(--_ctm-tab-dn-mp-wt-tt-cr-lt-te-ad-dn-sg, var(--_ctm-dn-mp-wt-tt-cr-lt-te-ad-dn-sg))
403
- );
404
- padding-block: var(
405
- --_ctm-mob-dn-mp-wt-tt-cr-lt-tt-vl-pg,
406
- var(--_ctm-tab-dn-mp-wt-tt-cr-lt-tt-vl-pg, var(--_ctm-dn-mp-wt-tt-cr-lt-tt-vl-pg))
407
- );
408
- padding-inline: var(
409
- --_ctm-mob-dn-mp-wt-tt-cr-lt-tt-hl-pg,
410
- var(--_ctm-tab-dn-mp-wt-tt-cr-lt-tt-hl-pg, var(--_ctm-dn-mp-wt-tt-cr-lt-tt-hl-pg))
411
- );
412
- // design > Map Widget Text Container Design. This used to read a
413
- // `...-tt-cr-lt-tt-cr-bd-cr` variable — the Text Container *Layout* prefix with a
414
- // property that section has never had — so the Fill control did nothing.
415
- background-color: var(
416
- --_ctm-mob-dn-mp-wt-tt-cr-dn-bd-cr,
417
- var(--_ctm-tab-dn-mp-wt-tt-cr-dn-bd-cr, var(--_ctm-dn-mp-wt-tt-cr-dn-bd-cr))
418
- );
419
-
420
- // Text Container Width. 100% is the previous behaviour, so an unset width
421
- // still spans the container.
422
- width: prepareMediaVariable(--_ctm-dn-mp-wt-lt-tt-cr-wh, 100%);
423
- // ...but never wider than the widget. The control accepts a percentage of the
424
- // widget and a raw length, and either can be dialled past the widget's own
425
- // width — a percentage over 100, or a length longer than the widget. Both used
426
- // to push the header (and the text painted on it) out over whatever sits to the
427
- // right of the map. Clamping here rather than only capping the control also
428
- // covers pages already saved with an oversized width.
429
- max-width: 100%;
430
- // Lets it shrink to that width beside the map — a flex item defaults to
431
- // min-width:auto and refuses to go below its longest word.
432
- min-width: 0;
433
- // Never shrink below the wrapped text — the map absorbs the remaining height
434
- // instead, so a taller heading does not overflow the widget.
435
- flex: 0 0 auto;
436
- border-color: var(
437
- --_ctm-mob-dn-mp-wt-tt-cr-dn-br-cr,
438
- var(--_ctm-tab-dn-mp-wt-tt-cr-dn-br-cr, var(--_ctm-dn-mp-wt-tt-cr-dn-br-cr))
439
- );
440
- border-style: var(
441
- --_ctm-mob-dn-mp-wt-tt-cr-dn-br-se,
442
- var(--_ctm-tab-dn-mp-wt-tt-cr-dn-br-se, var(--_ctm-dn-mp-wt-tt-cr-dn-br-se))
443
- );
444
- border-width: var(
445
- --_ctm-mob-dn-mp-wt-tt-cr-dn-br-wh,
446
- var(--_ctm-tab-dn-mp-wt-tt-cr-dn-br-wh, var(--_ctm-dn-mp-wt-tt-cr-dn-br-wh))
447
- );
448
- border-radius: var(
449
- --_ctm-mob-dn-mp-wt-tt-cr-dn-br-rs,
450
- var(--_ctm-tab-dn-mp-wt-tt-cr-dn-br-rs, var(--_ctm-dn-mp-wt-tt-cr-dn-br-rs))
451
- );
452
- box-shadow: var(
453
- --_show-shadow,
454
- var(
455
- --_ctm-mob-dn-mp-wt-tt-cr-dn-sw-ae,
456
- var(--_ctm-tab-dn-mp-wt-tt-cr-dn-sw-ae, var(--_ctm-dn-mp-wt-tt-cr-dn-sw-ae))
457
- )
458
- var(
459
- --_ctm-mob-dn-mp-wt-tt-cr-dn-sw-br,
460
- var(--_ctm-tab-dn-mp-wt-tt-cr-dn-sw-br, var(--_ctm-dn-mp-wt-tt-cr-dn-sw-br))
461
- )
462
- var(
463
- --_ctm-mob-dn-mp-wt-tt-cr-dn-sw-sd,
464
- var(--_ctm-tab-dn-mp-wt-tt-cr-dn-sw-sd, var(--_ctm-dn-mp-wt-tt-cr-dn-sw-sd))
465
- )
466
- var(
467
- --_ctm-mob-dn-mp-wt-tt-cr-dn-sw-cr,
468
- var(--_ctm-tab-dn-mp-wt-tt-cr-dn-sw-cr, var(--_ctm-dn-mp-wt-tt-cr-dn-sw-cr))
469
- )
470
- );
471
-
472
- & h3 {
473
- color: var(
474
- --_ctm-mob-dn-mp-wt-cr,
475
- var(--_ctm-tab-dn-mp-wt-cr, var(--_ctm-dn-mp-wt-cr, var(--_tst-dn-mp-wt-cr)))
476
- );
477
- font-family: var(
478
- --_ctm-mob-dn-mp-wt-ft-fy,
479
- var(--_ctm-tab-dn-mp-wt-ft-fy, var(--_ctm-dn-mp-wt-ft-fy, var(--_tst-dn-mp-wt-ft-fy)))
480
- );
481
- text-transform: var(
482
- --_ctm-mob-dn-mp-wt-tt-tm,
483
- var(--_ctm-tab-dn-mp-wt-tt-tm, var(--_ctm-dn-mp-wt-tt-tm, var(--_tst-dn-mp-wt-tt-tm)))
484
- );
485
- word-wrap: var(
486
- --_ctm-mob-dn-mp-wt-wd-wp,
487
- var(--_ctm-tab-dn-mp-wt-wd-wp, var(--_ctm-dn-mp-wt-wd-wp, break-word))
488
- );
489
- word-break: var(
490
- --_ctm-mob-dn-mp-wt-wd-bk,
491
- var(--_ctm-tab-dn-mp-wt-wd-bk, var(--_ctm-dn-mp-wt-wd-bk, var(--_tst-dn-mp-wt-wd-bk)))
492
- );
493
- font-size: var(
494
- --_ctm-mob-dn-mp-wt-ft-se,
495
- var(--_ctm-tab-dn-mp-wt-ft-se, var(--_ctm-dn-mp-wt-ft-se, var(--_tst-dn-mp-wt-ft-se)))
496
- );
497
- font-weight: var(
498
- --_ctm-mob-dn-mp-wt-ft-wt,
499
- var(--_ctm-tab-dn-mp-wt-ft-wt, var(--_ctm-dn-mp-wt-ft-wt, var(--_tst-dn-mp-wt-ft-wt)))
500
- );
501
- font-style: var(
502
- --_ctm-mob-dn-mp-wt-ft-se-ic,
503
- var(
504
- --_ctm-tab-dn-mp-wt-ft-se-ic,
505
- var(--_ctm-dn-mp-wt-ft-se-ic, var(--_tst-dn-mp-wt-ft-se-ic))
506
- )
507
- );
508
- text-align: var(
509
- --_ctm-mob-dn-mp-wt-tt-an,
510
- var(--_ctm-tab-dn-mp-wt-tt-an, var(--_ctm-dn-mp-wt-tt-an, var(--_tst-dn-mp-wt-tt-an)))
511
- );
512
- letter-spacing: var(
513
- --_ctm-mob-dn-mp-wt-lr-sg,
514
- var(--_ctm-tab-dn-mp-wt-lr-sg, var(--_ctm-dn-mp-wt-lr-sg, var(--_tst-dn-mp-wt-lr-sg)))
515
- );
516
- line-height: var(
517
- --_ctm-mob-dn-mp-wt-le-ht,
518
- var(--_ctm-tab-dn-mp-wt-le-ht, var(--_ctm-dn-mp-wt-le-ht, var(--_tst-dn-mp-wt-le-ht)))
519
- );
520
- text-decoration: var(
521
- --_ctm-mob-dn-mp-wt-ue,
522
- var(--_ctm-tab-dn-mp-wt-ue, var(--_ctm-dn-mp-wt-ue, var(--_tst-dn-mp-wt-ue)))
523
- );
524
- }
525
-
526
- & p {
527
- color: var(
528
- --_ctm-mob-dn-mp-wt-cr-dc,
529
- var(--_ctm-tab-dn-mp-wt-cr-dc, var(--_ctm-dn-mp-wt-cr-dc, var(--_tst-dn-mp-wt-cr-dc)))
530
- );
531
- font-family: var(
532
- --_ctm-mob-dn-mp-wt-ft-fy-dc,
533
- var(
534
- --_ctm-tab-dn-mp-wt-ft-fy-dc,
535
- var(--_ctm-dn-mp-wt-ft-fy-dc, var(--_tst-dn-mp-wt-ft-fy-dc))
536
- )
537
- );
538
- text-transform: var(
539
- --_ctm-mob-dn-mp-wt-tt-tm-dc,
540
- var(
541
- --_ctm-tab-dn-mp-wt-tt-tm-dc,
542
- var(--_ctm-dn-mp-wt-tt-tm-dc, var(--_tst-dn-mp-wt-tt-tm-dc))
543
- )
544
- );
545
- word-wrap: var(
546
- --_ctm-mob-dn-mp-wt-wd-wp-dc,
547
- var(--_ctm-tab-dn-mp-wt-wd-wp-dc, var(--_ctm-dn-mp-wt-wd-wp-dc, break-word))
548
- );
549
- word-break: var(
550
- --_ctm-mob-dn-mp-wt-wd-bk-dc,
551
- var(
552
- --_ctm-tab-dn-mp-wt-wd-bk-dc,
553
- var(--_ctm-dn-mp-wt-wd-bk-dc, var(--_tst-dn-mp-wt-wd-bk-dc))
554
- )
555
- );
556
- font-size: var(
557
- --_ctm-mob-dn-mp-wt-ft-se-dc,
558
- var(
559
- --_ctm-tab-dn-mp-wt-ft-se-dc,
560
- var(--_ctm-dn-mp-wt-ft-se-dc, var(--_tst-dn-mp-wt-ft-se-dc))
561
- )
562
- );
563
- font-weight: var(
564
- --_ctm-mob-dn-mp-wt-ft-wt-dc,
565
- var(
566
- --_ctm-tab-dn-mp-wt-ft-wt-dc,
567
- var(--_ctm-dn-mp-wt-ft-wt-dc, var(--_tst-dn-mp-wt-ft-wt-dc))
568
- )
569
- );
570
- font-style: var(
571
- --_ctm-mob-dn-mp-wt-ft-se-ic-dc,
572
- var(
573
- --_ctm-tab-dn-mp-wt-ft-se-ic-dc,
574
- var(--_ctm-dn-mp-wt-ft-se-ic-dc, var(--_tst-dn-mp-wt-ft-se-ic-dc))
575
- )
576
- );
577
- text-align: var(
578
- --_ctm-mob-dn-mp-wt-tt-an-dc,
579
- var(
580
- --_ctm-tab-dn-mp-wt-tt-an-dc,
581
- var(--_ctm-dn-mp-wt-tt-an-dc, var(--_tst-dn-mp-wt-tt-an-dc))
582
- )
583
- );
584
- letter-spacing: var(
585
- --_ctm-mob-dn-mp-wt-lr-sg-dc,
586
- var(
587
- --_ctm-tab-dn-mp-wt-lr-sg-dc,
588
- var(--_ctm-dn-mp-wt-lr-sg-dc, var(--_tst-dn-mp-wt-lr-sg-dc))
589
- )
590
- );
591
- line-height: var(
592
- --_ctm-mob-dn-mp-wt-le-ht-dc,
593
- var(
594
- --_ctm-tab-dn-mp-wt-le-ht-dc,
595
- var(--_ctm-dn-mp-wt-le-ht-dc, var(--_tst-dn-mp-wt-le-ht-dc))
596
- )
597
- );
598
- text-decoration: var(
599
- --_ctm-mob-dn-mp-wt-ue-dc,
600
- var(--_ctm-tab-dn-mp-wt-ue-dc, var(--_ctm-dn-mp-wt-ue-dc, var(--_tst-dn-mp-wt-ue-dc)))
601
- );
602
- }
603
-
604
- // h3 {
605
- // margin-bottom: var(--_mb-4);
606
- // }
607
- }
608
-
609
- .img__overlay {
610
- background: var(
611
- --_ctm-mob-dn-ie-se-oy-cr,
612
- var(--_ctm-tab-dn-ie-se-oy-cr, var(--_ctm-dn-ie-se-oy-cr, var(--_tst-dn-ie-se-oy-cr)))
613
- );
614
-
615
- height: 100%;
616
- width: 100%;
617
- position: absolute;
618
- top: 0;
619
- }
620
- @keyframes scaleInOut {
621
- 0% {
622
- transform: scale(1);
623
- }
624
- 50% {
625
- transform: scale(1.5);
626
- }
627
- 100% {
628
- transform: scale(1);
629
- }
630
- }
631
- // Sonar ripple: each ring fades in at the pin size, expands and fades out.
632
- @keyframes sonar {
633
- 0% {
634
- transform: scale(1);
635
- opacity: 0.6;
636
- }
637
- 100% {
638
- // Expands to ~1.8x the pin — clearly visible motion but still tight to the
639
- // pin (not spreading far, per the earlier "going very long" feedback).
640
- transform: scale(1.8);
641
- opacity: 0;
642
- }
643
- }
644
- .hotspot__container {
645
- position: absolute;
646
- // The marker element is already anchored at the location's lat/lng, so the pin
647
- // and the tooltip both sit at its origin and are placed from there. The 43%/12%
648
- // that used to be here came from the image hotspot's static-image layout and
649
- // means nothing for a marker.
650
- top: 0;
651
- left: 0;
652
- .hotspot__main {
653
- position: relative;
654
-
655
- // Divi Pixel-style sonar: a single bordered ring centred on the pin that
656
- // expands and fades out on a loop. Only the ring animates — the pin/icon is
657
- // static and kept on top via z-index. Rendered in JS only when the animation
658
- // toggle is on. Duration comes from the frequency control (2s if none set), so
659
- // the user's ms value drives the speed.
660
- .svg-sonar-container {
661
- position: absolute;
662
- top: 50%;
663
- left: 50%;
664
- width: prepareMediaVariable(--_ctm-dn-pn-se-ht-se);
665
- height: prepareMediaVariable(--_ctm-dn-pn-se-ht-se);
666
- translate: -50% -50%;
667
- pointer-events: none;
668
- z-index: 1;
669
-
670
- .sonar-circle {
671
- position: absolute;
672
- inset: 0;
673
- border-radius: 50%;
674
- // Ring colour follows the pin's background colour; visible fallback so the
675
- // ripple never renders invisibly if the background var isn't emitted.
676
- border: 1px solid prepareMediaVariable(--_ctm-dn-pn-se-bd-cr, #243dc6);
677
- opacity: 0;
678
- animation: sonar prepareMediaVariable(--_ctm-dn-pn-se-an-fy, 2s) linear infinite;
679
- }
680
-
681
- // Square pins get matching square rings; circle (default) stays 50%.
682
- &[data-hotspot-shape="square"] .sonar-circle {
683
- border-radius: 0;
684
- }
685
- }
686
-
687
- .hotspot {
688
- // background: var(--_ctm-dn-ht-se-bd-cr);
689
- // height: var(--_ctm-dn-tp-tt-dn-ft-se);
690
- // width: var(--_ctm-dn-tp-tt-dn-ft-se);
691
- position: absolute;
692
- // Above the sonar rings (container is z-index 1), so the pin/icon stays on top.
693
- z-index: 2;
694
- cursor: pointer;
695
- // width: var(--_ctm-dn-ht-se-ht-se);
696
- // height: var(--_ctm-dn-ht-se-ht-se);
697
- // background-color: var(--_ctm-dn-ht-se-bd-cr);
698
- width: var(
699
- --_ctm-mob-dn-pn-se-ht-se,
700
- var(--_ctm-tab-dn-pn-se-ht-se, var(--_ctm-dn-pn-se-ht-se))
701
- );
702
- height: var(
703
- --_ctm-mob-dn-pn-se-ht-se,
704
- var(--_ctm-tab-dn-pn-se-ht-se, var(--_ctm-dn-pn-se-ht-se))
705
- );
706
-
707
- height: prepareMediaVariable(--_ctm-dn-pn-se-ht-se);
708
- width: prepareMediaVariable(--_ctm-dn-pn-se-ht-se);
709
-
710
- position: absolute;
711
- cursor: pointer;
712
-
713
- display: flex;
714
- align-items: center;
715
- top: 50%;
716
- left: 50%;
717
-
718
- translate: -50% -50%;
719
- box-sizing: border-box;
720
- justify-content: center;
721
- box-shadow: var(
722
- --_ctm-mob-dn-pn-se-sw-ae,
723
- var(--_ctm-tab-dn-pn-se-sw-ae, var(--_ctm-dn-pn-se-sw-ae))
724
- )
725
- var(
726
- --_ctm-mob-dn-pn-se-sw-br,
727
- var(--_ctm-tab-dn-pn-se-sw-br, var(--_ctm-dn-pn-se-sw-br))
728
- )
729
- var(
730
- --_ctm-mob-dn-pn-se-sw-sd,
731
- var(--_ctm-tab-dn-pn-se-sw-sd, var(--_ctm-dn-pn-se-sw-sd))
732
- )
733
- var(
734
- --_ctm-mob-dn-pn-se-sw-cr,
735
- var(--_ctm-tab-dn-pn-se-sw-cr, var(--_ctm-dn-pn-se-sw-cr))
736
- );
737
-
738
- // Pin corners follow the Shape control only — Circle or Square. There is no
739
- // separate radius control for pins, and this used to be applied as an inline
740
- // style from MarkersComponent, which outranked every rule in this file.
741
- &[data-hotspot-shape="circle"] {
742
- border-radius: 50%;
743
- }
744
- &[data-hotspot-shape="square"] {
745
- border-radius: 0;
746
- }
747
-
748
- svg {
749
- width: prepareMediaVariable(--_ctm-dn-pn-se-in-se);
750
- height: prepareMediaVariable(--_ctm-dn-pn-se-in-se);
751
-
752
- path[fill] {
753
- fill: prepareMediaVariable(--_ctm-dn-pn-se-in-c1);
754
- }
755
- path[stroke] {
756
- stroke: prepareMediaVariable(--_ctm-dn-pn-se-in-c1);
757
- // Overrides the stroke-width presentation attribute baked into the icon markup.
758
- stroke-width: prepareMediaVariable(--_ctm-dn-pn-se-se-wh, 1.25);
759
- }
760
- }
761
-
762
- // One gate for "this pin has a styled box": always true for a shape pin,
763
- // and for an icon pin only while its Background toggle is on. It used to
764
- // also match [data-show-animation="true"], which meant turning the
765
- // background off did nothing as soon as the animation was enabled.
766
- &[data-show-shape-styles="true"] {
767
- background-color: var(
768
- --_ctm-mob-dn-pn-se-bd-cr,
769
- var(--_ctm-tab-dn-pn-se-bd-cr, var(--_ctm-dn-pn-se-bd-cr))
770
- );
771
-
772
- border-style: var(
773
- --_ctm-mob-dn-pn-se-br-se,
774
- var(--_ctm-tab-dn-pn-se-br-se, var(--_ctm-dn-pn-se-br-se))
775
- );
776
- border-color: var(
777
- --_ctm-mob-dn-pn-se-br-cr,
778
- var(--_ctm-tab-dn-pn-se-br-cr, var(--_ctm-dn-pn-se-br-cr))
779
- );
780
- border-width: var(
781
- --_ctm-mob-dn-pn-se-br-wh,
782
- var(--_ctm-tab-dn-pn-se-br-wh, var(--_ctm-dn-pn-se-br-wh))
783
- );
784
- // No border-radius here — it would land after the shape rules above and
785
- // undo Circle. The Shape control is the only thing that rounds a pin.
786
- // box-shadow is applied unconditionally above so it works for all pins,
787
- // independent of this shape/animation gate.
788
- }
789
- }
790
- }
791
- }
792
- .hotspot__tooltip {
793
- --_sf-br-vl: var(--_ctm-dn-tp-dn-br-rs, 0px);
794
- position: absolute;
795
- background: prepareMediaVariable(--_ctm-dn-tp-dn-bd-cr);
796
- z-index: 1000;
797
- // Sizing follows the image hotspot: the user's width/height with a floor under
798
- // them. The caps are viewport-relative on purpose — this element's containing
799
- // block is the Google marker, which is effectively zero-sized, so a percentage
800
- // max-width would resolve to 0 and clamp the tooltip down to its min instead of
801
- // holding the size the user set. The viewport cap still stops a desktop-sized
802
- // tooltip spilling off a phone screen.
803
- width: prepareMediaVariable(--_ctm-dn-tp-dn-tp-wh);
804
- height: prepareMediaVariable(--_ctm-dn-tp-dn-tp-ht);
805
- min-width: 100px;
806
- min-height: 100px;
807
- max-width: calc(100vw - 32px);
808
- max-height: calc(100vh - 32px);
809
- box-sizing: border-box;
810
- // Placement comes from the [data-hotspot-position] transforms above, measured
811
- // from the marker origin.
812
- top: 0;
813
- left: 0;
814
- // No overflow here on purpose. The tip is an ::after sitting 10px outside the
815
- // box, so any overflow value other than visible clips it away — that's what was
816
- // eating the caret. The image hotspot scrolls its inner wrapper instead, and
817
- // .text_box below does the same.
818
- overflow: visible;
819
-
820
- padding: 4px 8px;
821
- display: flex;
822
- justify-content: prepareMediaVariable(--_ctm-dn-tp-dn-hl-at);
823
- align-items: prepareMediaVariable(--_ctm-dn-tp-dn-vl-at);
824
-
825
- &::after {
826
- content: "";
827
- position: absolute;
828
-
829
- border-width: 5px;
830
- border-style: solid;
831
- }
832
- // The scroll container, mirroring .tooltip__image_with_text on the image
833
- // hotspot: long content scrolls in here rather than on the tooltip itself.
834
- .text_box {
835
- overflow-y: auto;
836
- max-width: 100%;
837
- width: 100%;
838
- height: 100%;
839
- // This wrapper fills the tooltip on both axes, so the justify-content /
840
- // align-items set on .hotspot__tooltip above have nothing left to move —
841
- // that is why both alignment controls looked dead. Same trap the image
842
- // hotspot hit with .tooltip__image_with_text (hotspot.scss): the alignment
843
- // has to be re-applied on the box that actually holds the title and the
844
- // description. The stack is a column here, so the *vertical* control drives
845
- // justify-content and the *horizontal* one drives align-items — the opposite
846
- // mapping to the tooltip itself.
847
- display: flex;
848
- flex-direction: column;
849
- justify-content: prepareMediaVariable(--_ctm-dn-tp-dn-vl-at);
850
- align-items: prepareMediaVariable(--_ctm-dn-tp-dn-hl-at);
851
-
852
- // align-items shrinks each child to its content width, so the text still
853
- // needs a cap to wrap against instead of overflowing the tooltip.
854
- > * {
855
- max-width: 100%;
856
- }
857
-
858
- h6 {
859
- font-size: prepareMediaVariable(--_ctm-dn-tp-tt-dn-ft-se);
860
- font-family: prepareMediaVariable(--_ctm-dn-tp-tt-dn-ft-fy);
861
- color: prepareMediaVariable(--_ctm-dn-tp-tt-dn-cr);
862
-
863
- font-weight: prepareMediaVariable(--_ctm-dn-tp-tt-dn-ft-wt);
864
- font-style: prepareMediaVariable(--_ctm-dn-tp-tt-dn-ft-se-ic);
865
- text-align: prepareMediaVariable(--_ctm-dn-tp-tt-dn-tt-an);
866
- letter-spacing: prepareMediaVariable(--_ctm-dn-tp-tt-dn-lr-sg);
867
- line-height: prepareMediaVariable(--_ctm-dn-tp-tt-dn-le-ht);
868
- // Underline and line-through are two independent toggles writing two
869
- // variables, so they have to be composed, not chained. `var(--lh, <ue>)`
870
- // never reaches its fallback: the schema declares linethrough with an
871
- // empty value, and stylesToString emits it as `--…-lh: ;`, which is a
872
- // *defined* empty value rather than a missing one — so var() substitutes
873
- // nothing and the whole declaration is thrown away. Listing both keywords
874
- // on text-decoration-line lets either, both or neither apply; when both
875
- // resolve empty the declaration is invalid and the initial `none` stands,
876
- // which is exactly the both-off case.
877
- text-decoration-line: var(
878
- --_ctm-mob-dn-tp-tt-dn-ue,
879
- var(--_ctm-tab-dn-tp-tt-dn-ue, var(--_ctm-dn-tp-tt-dn-ue,))
880
- )
881
- var(
882
- --_ctm-mob-dn-tp-tt-dn-lh,
883
- var(--_ctm-tab-dn-tp-tt-dn-lh, var(--_ctm-dn-tp-tt-dn-lh,))
884
- );
885
- // Same text properties the text element exposes (see text-temp-v2.scss).
886
- text-transform: prepareMediaVariable(--_ctm-dn-tp-tt-dn-tt-tm, none);
887
- word-wrap: prepareMediaVariable(--_ctm-dn-tp-tt-dn-wd-wp, normal);
888
- word-break: prepareMediaVariable(--_ctm-dn-tp-tt-dn-wd-bk, normal);
889
-
890
- // Text Overflow toggle in the typography panel; the line count rides in on
891
- // --_sf-line-clamp from the element.
892
- &#{$overflowSelector} {
893
- @include restrictToLinesShow(#{var(--_sf-line-clamp, 1)});
894
- }
895
- }
896
- p {
897
- font-size: prepareMediaVariable(--_ctm-dn-tp-tt-dn-ft-se-dc);
898
- color: prepareMediaVariable(--_ctm-dn-tp-tt-dn-cr-dc);
899
- font-family: prepareMediaVariable(--_ctm-dn-tp-tt-dn-ft-fy-dc);
900
- font-weight: prepareMediaVariable(--_ctm-dn-tp-tt-dn-ft-wt-dc);
901
- font-style: prepareMediaVariable(--_ctm-dn-tp-tt-dn-ft-se-ic-dc);
902
- text-align: prepareMediaVariable(--_ctm-dn-tp-tt-dn-tt-an-dc);
903
- letter-spacing: prepareMediaVariable(--_ctm-dn-tp-tt-dn-lr-sg-dc);
904
- line-height: prepareMediaVariable(--_ctm-dn-tp-tt-dn-le-ht-dc);
905
- // Same composition as the title above.
906
- text-decoration-line: var(
907
- --_ctm-mob-dn-tp-tt-dn-ue-dc,
908
- var(--_ctm-tab-dn-tp-tt-dn-ue-dc, var(--_ctm-dn-tp-tt-dn-ue-dc,))
909
- )
910
- var(
911
- --_ctm-mob-dn-tp-tt-dn-lh-dc,
912
- var(--_ctm-tab-dn-tp-tt-dn-lh-dc, var(--_ctm-dn-tp-tt-dn-lh-dc,))
913
- );
914
- text-transform: prepareMediaVariable(--_ctm-dn-tp-tt-dn-tt-tm-dc, none);
915
- word-wrap: prepareMediaVariable(--_ctm-dn-tp-tt-dn-wd-wp-dc, normal);
916
- word-break: prepareMediaVariable(--_ctm-dn-tp-tt-dn-wd-bk-dc, normal);
917
-
918
- &#{$overflowSelector} {
919
- @include restrictToLinesShow(#{var(--_sf-line-clamp-desc, 1)});
920
- }
921
- }
922
- }
923
- .tooltip__image {
924
- width: 100%;
925
- background-color: var(--_ctm-dn-tp-ie-dn-bd-cr);
926
- transition: transform 0.3s ease-in-out;
927
- display: flex;
928
- justify-content: var(--_ctm-dn-tp-ie-dn-hl-at);
929
- align-items: var(--_ctm-dn-tp-ie-dn-vl-at);
930
- img {
931
- object-fit: var(--_ctm-dn-tp-ie-dn-ft-os);
932
- height: -webkit-fill-available;
933
- max-width: 100%;
934
- rotate: calc(var(--_ctm-dn-tp-ie-dn-ud) * 1deg);
935
- scale: var(--_ctm-dn-tp-ie-dn-zm-ie);
936
-
937
- &:hover {
938
- &[data-on-img-hover="Zoom In"] {
939
- transform: scale(1.08);
940
- }
941
- &[data-on-img-hover="Zoom Out"] {
942
- transform: scale(0.92);
943
- }
944
- }
945
- }
946
- }
947
- }
948
- // .hotspot__main {
949
- // position: relative;
950
- // .hotspot {
951
- // background: var(
952
- // --_ctm-mob-dn-pn-se-bd-cr,
953
- // var(--_ctm-tab-dn-pn-se-bd-cr, var(--_ctm-dn-pn-se-bd-cr))
954
- // );
955
- // border-style: var(
956
- // --_ctm-mob-dn-pn-se-br-se,
957
- // var(--_ctm-tab-dn-pn-se-br-se, var(--_ctm-dn-pn-se-br-se))
958
- // );
959
- // border-color: var(
960
- // --_ctm-mob-dn-pn-se-br-cr,
961
- // var(--_ctm-tab-dn-pn-se-br-cr, var(--_ctm-dn-pn-se-br-cr))
962
- // );
963
- // border-width: var(
964
- // --_ctm-mob-dn-pn-se-br-wh,
965
- // var(--_ctm-tab-dn-pn-se-br-wh, var(--_ctm-dn-pn-se-br-wh))
966
- // );
967
- // border-radius: var(
968
- // --_ctm-mob-dn-pn-se-br-rs,
969
- // var(--_ctm-tab-dn-pn-se-br-rs, var(--_ctm-dn-pn-se-br-rs))
970
- // );
971
- // box-shadow: var(
972
- // --_show-shadow,
973
- // var(
974
- // --_ctm-mob-dn-pn-se-sw-ae,
975
- // var(--_ctm-tab-dn-pn-se-sw-ae, var(--_ctm-dn-pn-se-sw-ae))
976
- // )
977
- // var(
978
- // --_ctm-mob-dn-pn-se-sw-br,
979
- // var(--_ctm-tab-dn-pn-se-sw-br, var(--_ctm-dn-pn-se-sw-br))
980
- // )
981
- // var(
982
- // --_ctm-mob-dn-pn-se-sw-sd,
983
- // var(--_ctm-tab-dn-pn-se-sw-sd, var(--_ctm-dn-pn-se-sw-sd))
984
- // )
985
- // var(
986
- // --_ctm-mob-dn-pn-se-sw-cr,
987
- // var(--_ctm-tab-dn-pn-se-sw-cr, var(--_ctm-dn-pn-se-sw-cr))
988
- // )
989
- // );
990
-
991
- // position: absolute;
992
- // cursor: pointer;
993
- // width: var(
994
- // --_ctm-mob-dn-pn-se-ht-se,
995
- // var(--_ctm-tab-dn-pn-se-ht-se, var(--_ctm-dn-pn-se-ht-se))
996
- // );
997
- // height: var(
998
- // --_ctm-mob-dn-pn-se-ht-se,
999
- // var(--_ctm-tab-dn-pn-se-ht-se, var(--_ctm-dn-pn-se-ht-se))
1000
- // );
1001
- // background-color: var(
1002
- // --_ctm-mob-dn-pn-se-bd-cr,
1003
- // var(--_ctm-tab-dn-pn-se-bd-cr, var(--_ctm-dn-pn-se-bd-cr))
1004
- // );
1005
-
1006
- // display: flex;
1007
- // align-items: center;
1008
- // top: 50%;
1009
- // left: 50%;
1010
- // transform: translate(-50%, -50%);
1011
- // justify-content: center;
1012
- // animation: scaleInOut
1013
- // var(
1014
- // --_ctm-mob-dn-pn-se-an-fy,
1015
- // var(--_ctm-tab-dn-pn-se-an-fy, var(--_ctm-dn-pn-se-an-fy))
1016
- // )
1017
- // infinite;
1018
-
1019
- // .icon {
1020
- // display: var(--_sf-show-icon-ff, flex);
1021
-
1022
- // svg {
1023
- // width: var(
1024
- // --_ctm-mob-dn-pn-se-in-se,
1025
- // var(--_ctm-tab-dn-pn-se-in-se, var(--_ctm-dn-pn-se-in-se))
1026
- // );
1027
- // height: var(
1028
- // --_ctm-mob-dn-pn-se-in-se,
1029
- // var(--_ctm-tab-dn-pn-se-in-se, var(--_ctm-dn-pn-se-in-se))
1030
- // );
1031
-
1032
- // path {
1033
- // stroke: var(
1034
- // --_ctm-mob-dn-pn-se-in-c1,
1035
- // var(--_ctm-tab-dn-pn-se-in-c1, var(--_ctm-dn-pn-se-in-c1))
1036
- // );
1037
- // Overrides the stroke-width presentation attribute baked into the icon markup.
1038
- stroke-width: prepareMediaVariable(--_ctm-dn-pn-se-se-wh, 1.25);
1039
- // fill: var(
1040
- // --_ctm-mob-dn-pn-se-in-c1,
1041
- // var(--_ctm-tab-dn-pn-se-in-c1, var(--_ctm-dn-pn-se-in-c1))
1042
- // );
1043
- // }
1044
- // }
1045
- // }
1046
- // }
1047
- // .hotspot__tooltip {
1048
- // position: absolute;
1049
- // background: var(
1050
- // --_ctm-mob-dn-tp-dn-bd-cr,
1051
- // var(--_ctm-tab-dn-tp-dn-bd-cr, var(--_ctm-dn-tp-dn-bd-cr))
1052
- // );
1053
- // border-style: var(
1054
- // --_ctm-mob-dn-tp-dn-br-se,
1055
- // var(--_ctm-tab-dn-tp-dn-br-se, var(--_ctm-dn-tp-dn-br-se))
1056
- // );
1057
- // border-color: var(
1058
- // --_ctm-mob-dn-tp-dn-br-cr,
1059
- // var(--_ctm-tab-dn-tp-dn-br-cr, var(--_ctm-dn-tp-dn-br-cr))
1060
- // );
1061
- // border-width: var(
1062
- // --_ctm-mob-dn-tp-dn-br-wh,
1063
- // var(--_ctm-tab-dn-tp-dn-br-wh, var(--_ctm-dn-tp-dn-br-wh))
1064
- // );
1065
- // border-radius: var(
1066
- // --_ctm-mob-dn-tp-dn-br-rs,
1067
- // var(--_ctm-tab-dn-tp-dn-br-rs, var(--_ctm-dn-tp-dn-br-rs))
1068
- // );
1069
-
1070
- // box-shadow: var(
1071
- // --_show-shadow,
1072
- // var(
1073
- // --_ctm-mob-dn-tp-dn-sw-ae,
1074
- // var(--_ctm-tab-dn-tp-dn-sw-ae, var(--_ctm-dn-tp-dn-sw-ae))
1075
- // )
1076
- // var(
1077
- // --_ctm-mob-dn-tp-dn-sw-br,
1078
- // var(--_ctm-tab-dn-tp-dn-sw-br, var(--_ctm-dn-tp-dn-sw-br))
1079
- // )
1080
- // var(
1081
- // --_ctm-mob-dn-tp-dn-sw-sd,
1082
- // var(--_ctm-tab-dn-tp-dn-sw-sd, var(--_ctm-dn-tp-dn-sw-sd))
1083
- // )
1084
- // var(
1085
- // --_ctm-mob-dn-tp-dn-sw-cr,
1086
- // var(--_ctm-tab-dn-tp-dn-sw-cr, var(--_ctm-dn-tp-dn-sw-cr))
1087
- // )
1088
- // );
1089
-
1090
- // z-index: 1000;
1091
- // min-width: 100px;
1092
- // width: var(
1093
- // --_ctm-mob-dn-tp-dn-tp-wh,
1094
- // var(--_ctm-tab-dn-tp-dn-tp-wh, var(--_ctm-dn-tp-dn-tp-wh))
1095
- // );
1096
- // min-height: 100px;
1097
- // height: var(
1098
- // --_ctm-mob-dn-tp-dn-tp-ht,
1099
- // var(--_ctm-tab-dn-tp-dn-tp-ht, var(--_ctm-dn-tp-dn-tp-ht))
1100
- // );
1101
-
1102
- // // border-radius: 4px;
1103
- // // transform: translate(-10%, -130%);
1104
- // left: -10px;
1105
- // bottom: 7px;
1106
- // padding: 4px 8px;
1107
- // display: flex;
1108
- // justify-content: var(
1109
- // --_ctm-mob-dn-tp-dn-hl-at,
1110
- // var(--_ctm-tab-dn-tp-dn-hl-at, var(--_ctm-dn-tp-dn-hl-at))
1111
- // );
1112
- // align-items: var(
1113
- // --_ctm-mob-dn-tp-dn-vl-at,
1114
- // var(--_ctm-tab-dn-tp-dn-vl-at, var(--_ctm-dn-tp-dn-vl-at))
1115
- // );
1116
-
1117
- // &::after {
1118
- // content: "";
1119
- // position: absolute;
1120
- // top: 100%;
1121
- // left: 20px;
1122
- // margin-left: -5px;
1123
- // border-width: 5px;
1124
- // border-style: solid;
1125
- // border-color: var(
1126
- // --_ctm-mob-dn-tp-dn-bd-cr,
1127
- // var(--_ctm-tab-dn-tp-dn-bd-cr, var(--_ctm-dn-tp-dn-bd-cr))
1128
- // )
1129
- // transparent transparent transparent;
1130
- // }
1131
- // span {
1132
- // svg {
1133
- // width: var(
1134
- // --_ctm-mob-dn-pn-se-in-se,
1135
- // var(--_ctm-tab-dn-pn-se-in-se, var(--_ctm-dn-pn-se-in-se))
1136
- // );
1137
- // height: var(
1138
- // --_ctm-mob-dn-pn-se-in-se,
1139
- // var(--_ctm-tab-dn-pn-se-in-se, var(--_ctm-dn-pn-se-in-se))
1140
- // );
1141
- // path {
1142
- // stroke: var(
1143
- // --_ctm-mob-dn-pn-se-in-c1,
1144
- // var(--_ctm-tab-dn-pn-se-in-c1, var(--_ctm-dn-pn-se-in-c1))
1145
- // );
1146
- // Overrides the stroke-width presentation attribute baked into the icon markup.
1147
- stroke-width: prepareMediaVariable(--_ctm-dn-pn-se-se-wh, 1.25);
1148
- // }
1149
- // }
1150
- // }
1151
-
1152
- // .text_box {
1153
- // h6 {
1154
- // font-size: var(
1155
- // --_ctm-mob-dn-tp-tt-dn-ft-se,
1156
- // var(--_ctm-tab-dn-tp-tt-dn-ft-se, var(--_ctm-dn-tp-tt-dn-ft-se))
1157
- // );
1158
- // font-family: var(
1159
- // --_ctm-mob-dn-tp-tt-dn-ft-fy,
1160
- // var(--_ctm-tab-dn-tp-tt-dn-ft-fy, var(--_ctm-dn-tp-tt-dn-ft-fy))
1161
- // );
1162
- // color: var(
1163
- // --_ctm-mob-dn-tp-tt-dn-cr,
1164
- // var(--_ctm-tab-dn-tp-tt-dn-cr, var(--_ctm-dn-tp-tt-dn-cr))
1165
- // );
1166
-
1167
- // font-weight: var(
1168
- // --_ctm-mob-dn-tp-tt-dn-ft-wt,
1169
- // var(--_ctm-tab-dn-tp-tt-dn-ft-wt, var(--_ctm-dn-tp-tt-dn-ft-wt))
1170
- // );
1171
- // font-style: var(
1172
- // --_ctm-mob-dn-tp-tt-dn-ft-se-ic,
1173
- // var(--_ctm-tab-dn-tp-tt-dn-ft-se-ic, var(--_ctm-dn-tp-tt-dn-ft-se-ic))
1174
- // );
1175
- // text-align: var(
1176
- // --_ctm-mob-dn-tp-tt-dn-tt-an,
1177
- // var(--_ctm-tab-dn-tp-tt-dn-tt-an, var(--_ctm-dn-tp-tt-dn-tt-an))
1178
- // );
1179
- // letter-spacing: var(
1180
- // --_ctm-mob-dn-tp-tt-dn-lr-sg,
1181
- // var(--_ctm-tab-dn-tp-tt-dn-lr-sg, var(--_ctm-dn-tp-tt-dn-lr-sg))
1182
- // );
1183
- // line-height: var(
1184
- // --_ctm-mob-dn-tp-tt-dn-le-ht,
1185
- // var(--_ctm-tab-dn-tp-tt-dn-le-ht, var(--_ctm-dn-tp-tt-dn-le-ht))
1186
- // );
1187
- // text-decoration: var(
1188
- // --_ctm-mob-dn-tp-tt-dn-ue,
1189
- // var(--_ctm-tab-dn-tp-tt-dn-ue, var(--_ctm-dn-tp-tt-dn-ue))
1190
- // );
1191
- // }
1192
-
1193
- // p {
1194
- // font-size: var(
1195
- // --_ctm-mob-dn-tp-tt-dn-ft-se-dc,
1196
- // var(--_ctm-tab-dn-tp-tt-dn-ft-se-dc, var(--_ctm-dn-tp-tt-dn-ft-se-dc))
1197
- // );
1198
- // color: var(
1199
- // --_ctm-mob-dn-tp-tt-dn-cr-dc,
1200
- // var(--_ctm-tab-dn-tp-tt-dn-cr-dc, var(--_ctm-dn-tp-tt-dn-cr-dc))
1201
- // );
1202
- // font-family: var(
1203
- // --_ctm-mob-dn-tp-tt-dn-ft-fy-dc,
1204
- // var(--_ctm-tab-dn-tp-tt-dn-ft-fy-dc, var(--_ctm-dn-tp-tt-dn-ft-fy-dc))
1205
- // );
1206
- // font-weight: var(
1207
- // --_ctm-mob-dn-tp-tt-dn-ft-wt-dc,
1208
- // var(--_ctm-tab-dn-tp-tt-dn-ft-wt-dc, var(--_ctm-dn-tp-tt-dn-ft-wt-dc))
1209
- // );
1210
- // font-style: var(
1211
- // --_ctm-mob-dn-tp-tt-dn-ft-se-ic-dc,
1212
- // var(--_ctm-tab-dn-tp-tt-dn-ft-se-ic-dc, var(--_ctm-dn-tp-tt-dn-ft-se-ic-dc))
1213
- // );
1214
- // text-align: var(
1215
- // --_ctm-mob-dn-tp-tt-dn-tt-an-dc,
1216
- // var(--_ctm-tab-dn-tp-tt-dn-tt-an-dc, var(--_ctm-dn-tp-tt-dn-tt-an-dc))
1217
- // );
1218
- // letter-spacing: var(
1219
- // --_ctm-mob-dn-tp-tt-dn-lr-sg-dc,
1220
- // var(--_ctm-tab-dn-tp-tt-dn-lr-sg-dc, var(--_ctm-dn-tp-tt-dn-lr-sg-dc))
1221
- // );
1222
- // line-height: var(
1223
- // --_ctm-mob-dn-tp-tt-dn-le-ht-dc,
1224
- // var(--_ctm-tab-dn-tp-tt-dn-le-ht-dc, var(--_ctm-dn-tp-tt-dn-le-ht-dc))
1225
- // );
1226
- // text-decoration: var(
1227
- // --_ctm-mob-dn-tp-tt-dn-ue-dc,
1228
- // var(--_ctm-tab-dn-tp-tt-dn-ue-dc, var(--_ctm-dn-tp-tt-dn-ue-dc))
1229
- // );
1230
- // }
1231
- // }
1232
- // .tooltip__image {
1233
- // background-color: var(
1234
- // --_ctm-mob-dn-tp-ie-dn-bd-cr,
1235
- // var(--_ctm-tab-dn-tp-ie-dn-bd-cr, var(--_ctm-dn-tp-ie-dn-bd-cr))
1236
- // );
1237
- // transition: transform 0.3s ease-in-out;
1238
- // border-style: var(
1239
- // --_ctm-mob-dn-tp-ie-dn-br-se,
1240
- // var(--_ctm-tab-dn-tp-ie-dn-br-se, var(--_ctm-dn-tp-ie-dn-br-se))
1241
- // );
1242
- // border-color: var(
1243
- // --_ctm-mob-dn-tp-ie-dn-br-cr,
1244
- // var(--_ctm-tab-dn-tp-ie-dn-br-cr, var(--_ctm-dn-tp-ie-dn-br-cr))
1245
- // );
1246
- // border-width: var(
1247
- // --_ctm-mob-dn-tp-ie-dn-br-wh,
1248
- // var(--_ctm-tab-dn-tp-ie-dn-br-wh, var(--_ctm-dn-tp-ie-dn-br-wh))
1249
- // );
1250
- // border-radius: var(
1251
- // --_ctm-mob-dn-tp-ie-dn-br-rs,
1252
- // var(--_ctm-tab-dn-tp-ie-dn-br-rs, var(--_ctm-dn-tp-ie-dn-br-rs))
1253
- // );
1254
- // box-shadow: var(
1255
- // --_show-shadow,
1256
- // var(
1257
- // --_ctm-mob-dn-tp-ie-dn-sw-ae,
1258
- // var(--_ctm-tab-dn-tp-ie-dn-sw-ae, var(--_ctm-dn-tp-ie-dn-sw-ae))
1259
- // )
1260
- // var(
1261
- // --_ctm-mob-dn-tp-ie-dn-sw-br,
1262
- // var(--_ctm-tab-dn-tp-ie-dn-sw-br, var(--_ctm-dn-tp-ie-dn-sw-br))
1263
- // )
1264
- // var(
1265
- // --_ctm-mob-dn-tp-ie-dn-sw-sd,
1266
- // var(--_ctm-tab-dn-tp-ie-dn-sw-sd, var(--_ctm-dn-tp-ie-dn-sw-sd))
1267
- // )
1268
- // var(
1269
- // --_ctm-mob-dn-tp-ie-dn-sw-cr,
1270
- // var(--_ctm-tab-dn-tp-ie-dn-sw-cr, var(--_ctm-dn-tp-ie-dn-sw-cr))
1271
- // )
1272
- // );
1273
- // display: flex;
1274
- // justify-content: var(
1275
- // --_ctm-mob-dn-tp-ie-dn-hl-at,
1276
- // var(--_ctm-tab-dn-tp-ie-dn-hl-at, var(--_ctm-dn-tp-ie-dn-hl-at))
1277
- // );
1278
- // align-items: var(
1279
- // --_ctm-mob-dn-tp-ie-dn-vl-at,
1280
- // var(--_ctm-tab-dn-tp-ie-dn-vl-at, var(--_ctm-dn-tp-ie-dn-vl-at))
1281
- // );
1282
-
1283
- // img {
1284
- // object-fit: var(
1285
- // --_ctm-mob-dn-tp-ie-dn-ft-os,
1286
- // var(--_ctm-tab-dn-tp-ie-dn-ft-os, var(--_ctm-dn-tp-ie-dn-ft-os))
1287
- // );
1288
- // max-width: 100%;
1289
- // rotate: calc(
1290
- // var(
1291
- // --_ctm-mob-dn-tp-ie-dn-ud,
1292
- // var(--_ctm-tab-dn-tp-ie-dn-ud, var(--_ctm-dn-tp-ie-dn-ud))
1293
- // ) *
1294
- // 1deg
1295
- // );
1296
- // scale: var(
1297
- // --_ctm-mob-dn-tp-ie-dn-zm-ie,
1298
- // var(--_ctm-tab-dn-tp-ie-dn-zm-ie, var(--_ctm-dn-tp-ie-dn-zm-ie))
1299
- // );
1300
- // }
1301
- // }
1302
- // }
1303
- // }
1304
-
1305
- .map {
1306
- width: 100%;
1307
- height: 100%;
1308
- min-width: 0;
1309
- // Yields height to the heading rather than demanding the full 100%.
1310
- flex: 1 1 auto;
1311
- min-height: 0;
1312
- // design > Map Style. The map box paints its own border from that section's
1313
- // scope (`--_ctm-dn-mp-se-*`), independent of the widget's border on
1314
- // `.map-element` and the header's on `.gallery-header`. `overflow: hidden` so a
1315
- // rounded corner actually clips the tiles inside it.
1316
- overflow: hidden;
1317
- border-color: prepareMediaVariable(--_ctm-dn-mp-ie-br-cr);
1318
- border-style: prepareMediaVariable(--_ctm-dn-mp-ie-br-se);
1319
- border-width: prepareMediaVariable(--_ctm-dn-mp-ie-br-wh);
1320
- border-radius: prepareMediaVariable(--_ctm-dn-mp-ie-br-rs);
1321
- img {
1322
- width: 100%;
1323
- height: 100%;
1324
- }
1325
- }
1326
- }
1327
-
1328
- // "Show Border" / "Show Shadow" switches. Each design section paints its box from
1329
- // CSS variables, so the switches reach the stylesheet as data attributes and the
1330
- // matching border-width / box-shadow is zeroed here. Kept at the end of the block
1331
- // and matched to the same selector depth as the rules they override — anywhere
1332
- // earlier and the section rules above would win the tie on source order.
1333
- &[data-map-widget-border="false"] .map-element {
1334
- border-width: 0;
1335
- border-style: none;
1336
- }
1337
- &[data-map-widget-shadow="false"] .map-element {
1338
- box-shadow: none;
1339
- }
1340
- &[data-text-container-border="false"] .map-element > .gallery-header {
1341
- border-width: 0;
1342
- border-style: none;
1343
- }
1344
- &[data-text-container-shadow="false"] .map-element > .gallery-header {
1345
- box-shadow: none;
1346
- }
1347
- &[data-pin-border="false"] .map-element .hotspot__container .hotspot__main .hotspot {
1348
- border-width: 0;
1349
- border-style: none;
1350
- }
1351
- &[data-pin-shadow="false"] .map-element .hotspot__container .hotspot__main .hotspot {
1352
- box-shadow: none;
1353
- }
1354
- &[data-map-border="false"] .map-element .map {
1355
- border-width: 0;
1356
- border-style: none;
1357
- }
1358
- }
1359
- }
1
+ @use "sass:map";
2
+ @use "sass:list";
3
+ @use "./functions.scss" as *;
4
+
5
+ // Tooltip tip + placement, ported from the image hotspot (hotspot.scss) so both
6
+ // elements anchor their tooltip the same way.
7
+ //
8
+ // $ics is the tip's border-width: a 5px border with no content box makes a 10px
9
+ // triangle whose apex sits at the centre of the 10px box.
10
+ $ics: 5px;
11
+ $tip: $ics * 2;
12
+ $bm: 30px;
13
+
14
+ // Gap between the pin's edge and the tooltip. Held in a custom property so it can
15
+ // track the pin's real size at runtime (see --_sf-tp-gp below) instead of the flat
16
+ // 20px this file used to assume — that offset ignored Pin Size, so the tip drifted
17
+ // off the pin as soon as the pin was resized.
18
+ $g: var(--_sf-tp-gp);
19
+
20
+ $overflowSelector: ".flex__overflow";
21
+
22
+ // Each entry places the tooltip relative to the pin's centre, then pins the tip to
23
+ // the tooltip edge that faces the pin. Because $g already absorbs the pin's
24
+ // half-size, every tip offset below is a constant: the triangle always spans exactly
25
+ // the gap, base on the tooltip edge and apex on the pin edge. The previous table did
26
+ // this with hand-tuned multipliers (1.25 / 1.75 / 2.05 / 2.7 …) and, in five entries,
27
+ // a stray top-level border-color that painted over the tooltip's own border colour.
28
+ $data: (
29
+ // tooltip to the LEFT — tip on its right edge, pointing right
30
+ leftTop: (transform: translate(calc(-100% - #{$g}), calc(-100% + #{$bm})),
31
+ icon: (right: -#{$tip},
32
+ bottom: calc(#{$bm} - #{$ics}),
33
+ border-color: transparent transparent transparent var(--_ctm-dn-tp-dn-bd-cr),
34
+ ),
35
+ ),
36
+ leftCenter: (transform: translate(calc(-100% - #{$g}), -50%),
37
+ icon: (right: -#{$tip},
38
+ top: calc(50% - #{$ics}),
39
+ border-color: transparent transparent transparent var(--_ctm-dn-tp-dn-bd-cr),
40
+ ),
41
+ ),
42
+ leftBottom: (transform: translate(calc(-100% - #{$g}), calc(0% - #{$bm})),
43
+ icon: (right: -#{$tip},
44
+ top: calc(#{$bm} - #{$ics}),
45
+ border-color: transparent transparent transparent var(--_ctm-dn-tp-dn-bd-cr),
46
+ ),
47
+ ),
48
+ // tooltip ABOVE — tip on its bottom edge, pointing down
49
+ topLeft: (transform: translate(calc(-100% + #{$bm}), calc(-100% - #{$g})),
50
+ icon: (bottom: -#{$tip},
51
+ right: calc(#{$bm} - #{$ics}),
52
+ border-color: var(--_ctm-dn-tp-dn-bd-cr) transparent transparent transparent,
53
+ ),
54
+ ),
55
+ topCenter: (transform: translate(-50%, calc(-100% - #{$g})),
56
+ icon: (bottom: -#{$tip},
57
+ left: calc(50% - #{$ics}),
58
+ border-color: var(--_ctm-dn-tp-dn-bd-cr) transparent transparent transparent,
59
+ ),
60
+ ),
61
+ topRight: (transform: translate(calc(0% - #{$bm}), calc(-100% - #{$g})),
62
+ icon: (bottom: -#{$tip},
63
+ left: calc(#{$bm} - #{$ics}),
64
+ border-color: var(--_ctm-dn-tp-dn-bd-cr) transparent transparent transparent,
65
+ ),
66
+ ),
67
+ // tooltip to the RIGHT — tip on its left edge, pointing left
68
+ rightTop: (transform: translate(#{$g}, calc(-100% + #{$bm})),
69
+ icon: (left: -#{$tip},
70
+ bottom: calc(#{$bm} - #{$ics}),
71
+ border-color: transparent var(--_ctm-dn-tp-dn-bd-cr) transparent transparent,
72
+ ),
73
+ ),
74
+ rightCenter: (transform: translate(#{$g}, -50%),
75
+ icon: (left: -#{$tip},
76
+ top: calc(50% - #{$ics}),
77
+ border-color: transparent var(--_ctm-dn-tp-dn-bd-cr) transparent transparent,
78
+ ),
79
+ ),
80
+ rightBottom: (transform: translate(#{$g}, calc(0% - #{$bm})),
81
+ icon: (left: -#{$tip},
82
+ top: calc(#{$bm} - #{$ics}),
83
+ border-color: transparent var(--_ctm-dn-tp-dn-bd-cr) transparent transparent,
84
+ ),
85
+ ),
86
+ // tooltip BELOW — tip on its top edge, pointing up
87
+ bottomLeft: (transform: translate(calc(-100% + #{$bm}), #{$g}),
88
+ icon: (top: -#{$tip},
89
+ right: calc(#{$bm} - #{$ics}),
90
+ border-color: transparent transparent var(--_ctm-dn-tp-dn-bd-cr) transparent,
91
+ ),
92
+ ),
93
+ bottomCenter: (transform: translate(-50%, #{$g}),
94
+ icon: (top: -#{$tip},
95
+ left: calc(50% - #{$ics}),
96
+ border-color: transparent transparent var(--_ctm-dn-tp-dn-bd-cr) transparent,
97
+ ),
98
+ ),
99
+ bottomRight: (transform: translate(calc(0% - #{$bm}), #{$g}),
100
+ icon: (top: -#{$tip},
101
+ left: calc(#{$bm} - #{$ics}),
102
+ border-color: transparent transparent var(--_ctm-dn-tp-dn-bd-cr) transparent,
103
+ ),
104
+ )
105
+ );
106
+
107
+ // Tooltip Design > Horizontal Alignment, translated for `text-align`. The control is
108
+ // picked from the shared alignment list (flex-start | center | flex-end), and those
109
+ // keywords mean nothing to text-align, so the two ends have to be mapped. The last two
110
+ // entries are the pre-list values, still stored on pages saved before that fix.
111
+ $tooltipTextAlign: (
112
+ "flex-start": left,
113
+ "center": center,
114
+ "flex-end": right,
115
+ "left": left,
116
+ "right": right,
117
+ );
118
+
119
+ [data-div-type="element"] {
120
+ &[data-element-type="map"] {
121
+ // Half the pin as it actually renders, and the gap the tooltip keeps from the
122
+ // pin's centre — both driven by the Pin Size control rather than a literal, so
123
+ // the tip lands on the pin at any size. Unlike the image hotspot there is no
124
+ // icon-only variant to handle: .hotspot is always sized by the pin size here,
125
+ // with the icon drawn inside it.
126
+ --_sf-ht-hf: calc(#{prepareMediaVariable(--_ctm-dn-pn-se-ht-se, 24px)} / 2);
127
+ --_sf-tp-gp: calc(var(--_sf-ht-hf) + #{$ics});
128
+
129
+ &[data-hotspot-position] {
130
+ @each $key, $value in $data {
131
+ &[data-hotspot-position="#{$key}"] {
132
+ .hotspot__tooltip {
133
+ @each $prop, $val in $value {
134
+ @if ($prop !=icon) {
135
+ #{$prop}: #{$val};
136
+ }
137
+
138
+ @else {
139
+ @each $key2, $value2 in $val {
140
+ &:after {
141
+ #{$key2}: #{$value2};
142
+ }
143
+ }
144
+ }
145
+ }
146
+ }
147
+ }
148
+ }
149
+ }
150
+ }
151
+ }
152
+
153
+ [data-div-type="element"] {
154
+ &[data-element-type="map"] {
155
+ // width: var(--_lt-wh);
156
+ // height: var(--_lt-ht);
157
+ // margin: var(--_lt-mn);
158
+ // padding: var(--_lt-pg);
159
+ // width: var(--_ctm-lt-wh, var(--_tst-lt-wh));
160
+ width: var(--_sf-el-wh-st-mx,
161
+ calc(1% * var(--_ctm-mob-ele-nw-wh-vl, var(--_ctm-tab-ele-nw-wh-vl, var(--_ctm-ele-nw-wh-vl)))));
162
+ margin: var(--_ctm-mob-lt-mn, var(--_ctm-tab-lt-mn, var(--_ctm-lt-mn)));
163
+
164
+ --_aspect-ratio: calc(1 * (var(--_ctm-mob-lt-ht, var(--_ctm-tab-lt-ht, var(--_ctm-lt-ht))) / var(--_ctm-mob-lt-wh, var(--_ctm-tab-lt-wh, var(--_ctm-lt-wh)))));
165
+
166
+ &>.wrapper {
167
+ width: 100%;
168
+ // height: 100%;
169
+ }
170
+
171
+ &[data-show-shadow="false"] {
172
+ --_show-shadow: none;
173
+ }
174
+
175
+ // design > Map Widget Layout — where the title/description block sits relative to
176
+ // the map. Top/Bottom stack it (column), Left/Right put it beside the map (row).
177
+ &[data-text-container-position="Bottom"] .map-element {
178
+ flex-direction: column-reverse;
179
+ }
180
+
181
+ &[data-text-container-position="Left"],
182
+ &[data-text-container-position="Right"] {
183
+ .map-element {
184
+ flex-direction: row;
185
+
186
+ // Beside the map the header sizes to its content and the map takes the rest;
187
+ // stacked above/below it keeps spanning the full width.
188
+ >.gallery-header {
189
+ // Text Container Width. `auto` (the default) is the previous behaviour.
190
+ width: prepareMediaVariable(--_ctm-dn-mp-wt-lt-tt-cr-wh, auto);
191
+ // Shrinkable: the width defaults to 100%, which beside the map is a ceiling —
192
+ // without this the header would take the whole row and collapse the map.
193
+ flex: 0 1 auto;
194
+ }
195
+
196
+ >.map {
197
+ flex: 1 1 auto;
198
+ }
199
+ }
200
+ }
201
+
202
+ &[data-text-container-position="Right"] .map-element {
203
+ flex-direction: row-reverse;
204
+ }
205
+
206
+ // The alignment control switches between the horizontal list (left/center/right)
207
+ // for stacked layouts and the vertical one (top/center/bottom) for side-by-side.
208
+ // Stacked: the header spans the full width, so align the text inside it. Side by
209
+ // side: align the header on the flex cross axis.
210
+ &[data-text-container-alignment="left"] .map-element>.gallery-header {
211
+ text-align: left;
212
+ }
213
+
214
+ &[data-text-container-alignment="right"] .map-element>.gallery-header {
215
+ text-align: right;
216
+ }
217
+
218
+ &[data-text-container-alignment="top"] .map-element {
219
+ align-items: flex-start;
220
+ }
221
+
222
+ &[data-text-container-alignment="bottom"] .map-element {
223
+ align-items: flex-end;
224
+ }
225
+
226
+ &[data-text-container-alignment="center"] {
227
+ .map-element {
228
+ align-items: center;
229
+
230
+ >.gallery-header {
231
+ text-align: center;
232
+ }
233
+ }
234
+ }
235
+
236
+ &[data-hotspot-image-style-show-border="true"] {
237
+ .imageHotspot-element {
238
+ border-style: var(--_ctm-dn-ie-se-br-se);
239
+ border-color: var(--_ctm-dn-ie-se-br-cr);
240
+ border-width: var(--_ctm-dn-ie-se-br-wh);
241
+ border-radius: var(--_ctm-dn-ie-se-br-rs);
242
+ }
243
+ }
244
+
245
+ &[data-hotspot-tooltip-style-show-border="true"] {
246
+ .hotspot__tooltip {
247
+ border-style: var(--_ctm-dn-tp-dn-br-se);
248
+ border-color: var(--_ctm-dn-tp-dn-br-cr);
249
+ border-width: var(--_ctm-dn-tp-dn-br-wh);
250
+ border-radius: var(--_ctm-dn-tp-dn-br-rs);
251
+ }
252
+ }
253
+
254
+ &[data-hotspot-tooltip-style-show-shadow="true"] {
255
+ .hotspot__tooltip {
256
+ box-shadow: var(--_ctm-dn-tp-dn-sw-ae) var(--_ctm-dn-tp-dn-sw-br) var(--_ctm-dn-tp-dn-sw-sd) var(--_ctm-dn-tp-dn-sw-cr);
257
+ }
258
+ }
259
+
260
+ // Tooltip Design > Horizontal Alignment, applied to the tooltip text itself.
261
+ //
262
+ // .text_box re-applies the control as align-items further down, which moves the
263
+ // title and the description only while they are narrower than the tooltip. A title
264
+ // long enough to wrap fills that wrapper, and a flex container cannot move a child
265
+ // that is already full width — which is why the control looked dead on the title
266
+ // while the shorter description still followed it.
267
+ //
268
+ // The value reaches the DOM as a data attribute because align-items keywords are
269
+ // not text-align keywords; Map Widget Layout's alignment takes the same route to
270
+ // .gallery-header above. The tooltip-level control wins over the per-text Alignment
271
+ // in Tooltip Text Design — it is the one that positions the text block.
272
+ @each $key, $align in $tooltipTextAlign {
273
+ &[data-tooltip-text-alignment="#{$key}"] {
274
+ .map-element .hotspot__tooltip .text_box>* {
275
+ text-align: $align;
276
+ }
277
+ }
278
+ }
279
+
280
+ &[data-hotspot-tooltip-image-style-show-border="true"] {
281
+ .tooltip__image {
282
+ border-style: var(--_ctm-dn-tp-ie-dn-br-se);
283
+ border-color: var(--_ctm-dn-tp-ie-dn-br-cr);
284
+ border-width: var(--_ctm-dn-tp-ie-dn-br-wh);
285
+ border-radius: var(--_ctm-dn-tp-ie-dn-br-rs);
286
+ }
287
+ }
288
+
289
+ &[data-hotspot-tooltip-image-style-show-shadow="true"] {
290
+ .tooltip__image {
291
+ box-shadow: var(--_show-shadow,
292
+ var(--_ctm-dn-tp-ie-dn-sw-ae) var(--_ctm-dn-tp-ie-dn-sw-br) var(--_ctm-dn-tp-ie-dn-sw-sd) var(--_ctm-dn-tp-ie-dn-sw-cr));
293
+ }
294
+ }
295
+
296
+ &[data-hotspot-style-show-shadow="true"] {
297
+ .hotspot {
298
+ box-shadow: var(--_ctm-dn-ht-se-sw-ae) var(--_ctm-dn-ht-se-sw-br) var(--_ctm-dn-ht-se-sw-sd) var(--_ctm-dn-ht-se-sw-cr);
299
+ }
300
+ }
301
+
302
+ &[data-hotspot-style-show-border="true"] {
303
+ .hotspot {
304
+ border-style: var(--_ctm-dn-ht-se-br-se);
305
+ border-color: var(--_ctm-dn-ht-se-br-cr);
306
+ border-width: var(--_ctm-dn-ht-se-br-wh);
307
+ border-radius: var(--_ctm-dn-ht-se-br-rs);
308
+ }
309
+ }
310
+
311
+ .map-element {
312
+ --text-high-contrast-rgb-value: 49, 49, 49;
313
+ --detail-medium-contrast: rgb(234, 234, 234);
314
+ --text-body: rgb(54, 49, 61);
315
+
316
+ position: relative;
317
+ background-color: var(--_ctm-mob-dn-mp-wt-bd-cr,
318
+ var(--_ctm-tab-dn-mp-wt-bd-cr, var(--_ctm-dn-mp-wt-bd-cr)));
319
+
320
+ padding: var(--_ctm-mob-lt-pg, var(--_ctm-tab-lt-pg, var(--_ctm-lt-pg)));
321
+
322
+ display: flex;
323
+ flex-direction: column;
324
+ --_sf-cd-gp: calc(var(--_sf-gp) * 0.5);
325
+
326
+ gap: var(--_ctm-mob-dn-mp-wt-lt-mp-ad-tt-cr-sg,
327
+ var(--_ctm-tab-dn-mp-wt-lt-mp-ad-tt-cr-sg, var(--_ctm-dn-mp-wt-lt-mp-ad-tt-cr-sg)));
328
+ // Alignment comes from the [data-text-container-alignment] rules above. It used to
329
+ // read the *spacing* variable here, which is a length and never valid for
330
+ // align-content, so the control did nothing.
331
+
332
+ width: 100%;
333
+ height: var(--_ctm-mob-lt-ht, var(--_ctm-tab-lt-ht, var(--_ctm-lt-ht)));
334
+ // Height is a fixed value from layout, so keep the border inside it rather than
335
+ // letting it push the widget past the size the user set.
336
+ box-sizing: border-box;
337
+
338
+ border-color: var(--_ctm-mob-dn-mp-wt-br-cr,
339
+ var(--_ctm-tab-dn-mp-wt-br-cr, var(--_ctm-dn-mp-wt-br-cr)));
340
+
341
+ border-style: var(--_ctm-mob-dn-mp-wt-br-se,
342
+ var(--_ctm-tab-dn-mp-wt-br-se, var(--_ctm-dn-mp-wt-br-se)));
343
+
344
+ border-width: var(--_ctm-mob-dn-mp-wt-br-wh,
345
+ var(--_ctm-tab-dn-mp-wt-br-wh, var(--_ctm-dn-mp-wt-br-wh)));
346
+
347
+ border-radius: var(--_ctm-mob-dn-mp-wt-br-rs,
348
+ var(--_ctm-tab-dn-mp-wt-br-rs, var(--_ctm-dn-mp-wt-br-rs)));
349
+
350
+ box-shadow: var(--_show-shadow,
351
+ var(--_ctm-mob-dn-mp-wt-sw-ae, var(--_ctm-tab-dn-mp-wt-sw-ae, var(--_ctm-dn-mp-wt-sw-ae))) var(--_ctm-mob-dn-mp-wt-sw-br, var(--_ctm-tab-dn-mp-wt-sw-br, var(--_ctm-dn-mp-wt-sw-br))) var(--_ctm-mob-dn-mp-wt-sw-sd, var(--_ctm-tab-dn-mp-wt-sw-sd, var(--_ctm-dn-mp-wt-sw-sd))) var(--_ctm-mob-dn-mp-wt-sw-cr, var(--_ctm-tab-dn-mp-wt-sw-cr, var(--_ctm-dn-mp-wt-sw-cr))));
352
+
353
+ .gallery-header {
354
+ // Text alignment is driven by [data-text-container-alignment] above. The
355
+ // gallery variable that used to sit here is never emitted for a map element.
356
+ box-sizing: border-box;
357
+
358
+ // line-height: var(--_ctm-dn-gy-lt-tt-ad-dn-sg, var(--_tst-dn-gy-lt-tt-ad-dn-sg));
359
+ display: flex;
360
+ flex-direction: column;
361
+
362
+ gap: var(--_ctm-mob-dn-mp-wt-tt-cr-lt-te-ad-dn-sg,
363
+ var(--_ctm-tab-dn-mp-wt-tt-cr-lt-te-ad-dn-sg, var(--_ctm-dn-mp-wt-tt-cr-lt-te-ad-dn-sg)));
364
+ padding-block: var(--_ctm-mob-dn-mp-wt-tt-cr-lt-tt-vl-pg,
365
+ var(--_ctm-tab-dn-mp-wt-tt-cr-lt-tt-vl-pg, var(--_ctm-dn-mp-wt-tt-cr-lt-tt-vl-pg)));
366
+ padding-inline: var(--_ctm-mob-dn-mp-wt-tt-cr-lt-tt-hl-pg,
367
+ var(--_ctm-tab-dn-mp-wt-tt-cr-lt-tt-hl-pg, var(--_ctm-dn-mp-wt-tt-cr-lt-tt-hl-pg)));
368
+ // design > Map Widget Text Container Design. This used to read a
369
+ // `...-tt-cr-lt-tt-cr-bd-cr` variable — the Text Container *Layout* prefix with a
370
+ // property that section has never had — so the Fill control did nothing.
371
+ background-color: var(--_ctm-mob-dn-mp-wt-tt-cr-dn-bd-cr,
372
+ var(--_ctm-tab-dn-mp-wt-tt-cr-dn-bd-cr, var(--_ctm-dn-mp-wt-tt-cr-dn-bd-cr)));
373
+
374
+ // Text Container Width. 100% is the previous behaviour, so an unset width
375
+ // still spans the container.
376
+ width: prepareMediaVariable(--_ctm-dn-mp-wt-lt-tt-cr-wh, 100%);
377
+ // ...but never wider than the widget. The control accepts a percentage of the
378
+ // widget and a raw length, and either can be dialled past the widget's own
379
+ // width — a percentage over 100, or a length longer than the widget. Both used
380
+ // to push the header (and the text painted on it) out over whatever sits to the
381
+ // right of the map. Clamping here rather than only capping the control also
382
+ // covers pages already saved with an oversized width.
383
+ max-width: 100%;
384
+ // Lets it shrink to that width beside the map — a flex item defaults to
385
+ // min-width:auto and refuses to go below its longest word.
386
+ min-width: 0;
387
+ // Never shrink below the wrapped text — the map absorbs the remaining height
388
+ // instead, so a taller heading does not overflow the widget.
389
+ flex: 0 0 auto;
390
+ border-color: var(--_ctm-mob-dn-mp-wt-tt-cr-dn-br-cr,
391
+ var(--_ctm-tab-dn-mp-wt-tt-cr-dn-br-cr, var(--_ctm-dn-mp-wt-tt-cr-dn-br-cr)));
392
+ border-style: var(--_ctm-mob-dn-mp-wt-tt-cr-dn-br-se,
393
+ var(--_ctm-tab-dn-mp-wt-tt-cr-dn-br-se, var(--_ctm-dn-mp-wt-tt-cr-dn-br-se)));
394
+ border-width: var(--_ctm-mob-dn-mp-wt-tt-cr-dn-br-wh,
395
+ var(--_ctm-tab-dn-mp-wt-tt-cr-dn-br-wh, var(--_ctm-dn-mp-wt-tt-cr-dn-br-wh)));
396
+ border-radius: var(--_ctm-mob-dn-mp-wt-tt-cr-dn-br-rs,
397
+ var(--_ctm-tab-dn-mp-wt-tt-cr-dn-br-rs, var(--_ctm-dn-mp-wt-tt-cr-dn-br-rs)));
398
+ box-shadow: var(--_show-shadow,
399
+ var(--_ctm-mob-dn-mp-wt-tt-cr-dn-sw-ae,
400
+ var(--_ctm-tab-dn-mp-wt-tt-cr-dn-sw-ae, var(--_ctm-dn-mp-wt-tt-cr-dn-sw-ae))) var(--_ctm-mob-dn-mp-wt-tt-cr-dn-sw-br,
401
+ var(--_ctm-tab-dn-mp-wt-tt-cr-dn-sw-br, var(--_ctm-dn-mp-wt-tt-cr-dn-sw-br))) var(--_ctm-mob-dn-mp-wt-tt-cr-dn-sw-sd,
402
+ var(--_ctm-tab-dn-mp-wt-tt-cr-dn-sw-sd, var(--_ctm-dn-mp-wt-tt-cr-dn-sw-sd))) var(--_ctm-mob-dn-mp-wt-tt-cr-dn-sw-cr,
403
+ var(--_ctm-tab-dn-mp-wt-tt-cr-dn-sw-cr, var(--_ctm-dn-mp-wt-tt-cr-dn-sw-cr))));
404
+
405
+ & h3 {
406
+ color: var(--_ctm-mob-dn-mp-wt-cr,
407
+ var(--_ctm-tab-dn-mp-wt-cr, var(--_ctm-dn-mp-wt-cr, var(--_tst-dn-mp-wt-cr))));
408
+ font-family: var(--_ctm-mob-dn-mp-wt-ft-fy,
409
+ var(--_ctm-tab-dn-mp-wt-ft-fy, var(--_ctm-dn-mp-wt-ft-fy, var(--_tst-dn-mp-wt-ft-fy))));
410
+ text-transform: var(--_ctm-mob-dn-mp-wt-tt-tm,
411
+ var(--_ctm-tab-dn-mp-wt-tt-tm, var(--_ctm-dn-mp-wt-tt-tm, var(--_tst-dn-mp-wt-tt-tm))));
412
+ word-wrap: var(--_ctm-mob-dn-mp-wt-wd-wp,
413
+ var(--_ctm-tab-dn-mp-wt-wd-wp, var(--_ctm-dn-mp-wt-wd-wp, break-word)));
414
+ word-break: var(--_ctm-mob-dn-mp-wt-wd-bk,
415
+ var(--_ctm-tab-dn-mp-wt-wd-bk, var(--_ctm-dn-mp-wt-wd-bk, var(--_tst-dn-mp-wt-wd-bk))));
416
+ font-size: var(--_ctm-mob-dn-mp-wt-ft-se,
417
+ var(--_ctm-tab-dn-mp-wt-ft-se, var(--_ctm-dn-mp-wt-ft-se, var(--_tst-dn-mp-wt-ft-se))));
418
+ font-weight: var(--_ctm-mob-dn-mp-wt-ft-wt,
419
+ var(--_ctm-tab-dn-mp-wt-ft-wt, var(--_ctm-dn-mp-wt-ft-wt, var(--_tst-dn-mp-wt-ft-wt))));
420
+ font-style: var(--_ctm-mob-dn-mp-wt-ft-se-ic,
421
+ var(--_ctm-tab-dn-mp-wt-ft-se-ic,
422
+ var(--_ctm-dn-mp-wt-ft-se-ic, var(--_tst-dn-mp-wt-ft-se-ic))));
423
+ text-align: var(--_ctm-mob-dn-mp-wt-tt-an,
424
+ var(--_ctm-tab-dn-mp-wt-tt-an, var(--_ctm-dn-mp-wt-tt-an, var(--_tst-dn-mp-wt-tt-an))));
425
+ letter-spacing: var(--_ctm-mob-dn-mp-wt-lr-sg,
426
+ var(--_ctm-tab-dn-mp-wt-lr-sg, var(--_ctm-dn-mp-wt-lr-sg, var(--_tst-dn-mp-wt-lr-sg))));
427
+ line-height: var(--_ctm-mob-dn-mp-wt-le-ht,
428
+ var(--_ctm-tab-dn-mp-wt-le-ht, var(--_ctm-dn-mp-wt-le-ht, var(--_tst-dn-mp-wt-le-ht))));
429
+ text-decoration: var(--_ctm-mob-dn-mp-wt-ue,
430
+ var(--_ctm-tab-dn-mp-wt-ue, var(--_ctm-dn-mp-wt-ue, var(--_tst-dn-mp-wt-ue))));
431
+ }
432
+
433
+ & p {
434
+ color: var(--_ctm-mob-dn-mp-wt-cr-dc,
435
+ var(--_ctm-tab-dn-mp-wt-cr-dc, var(--_ctm-dn-mp-wt-cr-dc, var(--_tst-dn-mp-wt-cr-dc))));
436
+ font-family: var(--_ctm-mob-dn-mp-wt-ft-fy-dc,
437
+ var(--_ctm-tab-dn-mp-wt-ft-fy-dc,
438
+ var(--_ctm-dn-mp-wt-ft-fy-dc, var(--_tst-dn-mp-wt-ft-fy-dc))));
439
+ text-transform: var(--_ctm-mob-dn-mp-wt-tt-tm-dc,
440
+ var(--_ctm-tab-dn-mp-wt-tt-tm-dc,
441
+ var(--_ctm-dn-mp-wt-tt-tm-dc, var(--_tst-dn-mp-wt-tt-tm-dc))));
442
+ word-wrap: var(--_ctm-mob-dn-mp-wt-wd-wp-dc,
443
+ var(--_ctm-tab-dn-mp-wt-wd-wp-dc, var(--_ctm-dn-mp-wt-wd-wp-dc, break-word)));
444
+ word-break: var(--_ctm-mob-dn-mp-wt-wd-bk-dc,
445
+ var(--_ctm-tab-dn-mp-wt-wd-bk-dc,
446
+ var(--_ctm-dn-mp-wt-wd-bk-dc, var(--_tst-dn-mp-wt-wd-bk-dc))));
447
+ font-size: var(--_ctm-mob-dn-mp-wt-ft-se-dc,
448
+ var(--_ctm-tab-dn-mp-wt-ft-se-dc,
449
+ var(--_ctm-dn-mp-wt-ft-se-dc, var(--_tst-dn-mp-wt-ft-se-dc))));
450
+ font-weight: var(--_ctm-mob-dn-mp-wt-ft-wt-dc,
451
+ var(--_ctm-tab-dn-mp-wt-ft-wt-dc,
452
+ var(--_ctm-dn-mp-wt-ft-wt-dc, var(--_tst-dn-mp-wt-ft-wt-dc))));
453
+ font-style: var(--_ctm-mob-dn-mp-wt-ft-se-ic-dc,
454
+ var(--_ctm-tab-dn-mp-wt-ft-se-ic-dc,
455
+ var(--_ctm-dn-mp-wt-ft-se-ic-dc, var(--_tst-dn-mp-wt-ft-se-ic-dc))));
456
+ text-align: var(--_ctm-mob-dn-mp-wt-tt-an-dc,
457
+ var(--_ctm-tab-dn-mp-wt-tt-an-dc,
458
+ var(--_ctm-dn-mp-wt-tt-an-dc, var(--_tst-dn-mp-wt-tt-an-dc))));
459
+ letter-spacing: var(--_ctm-mob-dn-mp-wt-lr-sg-dc,
460
+ var(--_ctm-tab-dn-mp-wt-lr-sg-dc,
461
+ var(--_ctm-dn-mp-wt-lr-sg-dc, var(--_tst-dn-mp-wt-lr-sg-dc))));
462
+ line-height: var(--_ctm-mob-dn-mp-wt-le-ht-dc,
463
+ var(--_ctm-tab-dn-mp-wt-le-ht-dc,
464
+ var(--_ctm-dn-mp-wt-le-ht-dc, var(--_tst-dn-mp-wt-le-ht-dc))));
465
+ text-decoration: var(--_ctm-mob-dn-mp-wt-ue-dc,
466
+ var(--_ctm-tab-dn-mp-wt-ue-dc, var(--_ctm-dn-mp-wt-ue-dc, var(--_tst-dn-mp-wt-ue-dc))));
467
+ }
468
+
469
+ // h3 {
470
+ // margin-bottom: var(--_mb-4);
471
+ // }
472
+ }
473
+
474
+ .img__overlay {
475
+ background: var(--_ctm-mob-dn-ie-se-oy-cr,
476
+ var(--_ctm-tab-dn-ie-se-oy-cr, var(--_ctm-dn-ie-se-oy-cr, var(--_tst-dn-ie-se-oy-cr))));
477
+
478
+ height: 100%;
479
+ width: 100%;
480
+ position: absolute;
481
+ top: 0;
482
+ }
483
+
484
+ @keyframes scaleInOut {
485
+ 0% {
486
+ transform: scale(1);
487
+ }
488
+
489
+ 50% {
490
+ transform: scale(1.5);
491
+ }
492
+
493
+ 100% {
494
+ transform: scale(1);
495
+ }
496
+ }
497
+
498
+ // Sonar ripple: each ring fades in at the pin size, expands and fades out.
499
+ @keyframes sonar {
500
+ 0% {
501
+ transform: scale(1);
502
+ opacity: 0.6;
503
+ }
504
+
505
+ 100% {
506
+ // Expands to ~1.8x the pin — clearly visible motion but still tight to the
507
+ // pin (not spreading far, per the earlier "going very long" feedback).
508
+ transform: scale(1.8);
509
+ opacity: 0;
510
+ }
511
+ }
512
+
513
+ .hotspot__container {
514
+ position: absolute;
515
+ // The marker element is already anchored at the location's lat/lng, so the pin
516
+ // and the tooltip both sit at its origin and are placed from there. The 43%/12%
517
+ // that used to be here came from the image hotspot's static-image layout and
518
+ // means nothing for a marker.
519
+ top: 0;
520
+ left: 0;
521
+
522
+ .hotspot__main {
523
+ position: relative;
524
+
525
+ // Divi Pixel-style sonar: a single bordered ring centred on the pin that
526
+ // expands and fades out on a loop. Only the ring animates — the pin/icon is
527
+ // static and kept on top via z-index. Rendered in JS only when the animation
528
+ // toggle is on. Duration comes from the frequency control (2s if none set), so
529
+ // the user's ms value drives the speed.
530
+ .svg-sonar-container {
531
+ position: absolute;
532
+ top: 50%;
533
+ left: 50%;
534
+ width: prepareMediaVariable(--_ctm-dn-pn-se-ht-se);
535
+ height: prepareMediaVariable(--_ctm-dn-pn-se-ht-se);
536
+ translate: -50% -50%;
537
+ pointer-events: none;
538
+ z-index: 1;
539
+
540
+ .sonar-circle {
541
+ position: absolute;
542
+ inset: 0;
543
+ border-radius: 50%;
544
+ // Ring colour follows the pin's background colour; visible fallback so the
545
+ // ripple never renders invisibly if the background var isn't emitted.
546
+ border: 1px solid prepareMediaVariable(--_ctm-dn-pn-se-bd-cr, #243dc6);
547
+ opacity: 0;
548
+ animation: sonar prepareMediaVariable(--_ctm-dn-pn-se-an-fy, 2s) linear infinite;
549
+ }
550
+
551
+ // Square pins get matching square rings; circle (default) stays 50%.
552
+ &[data-hotspot-shape="square"] .sonar-circle {
553
+ border-radius: 0;
554
+ }
555
+ }
556
+
557
+ .hotspot {
558
+ // background: var(--_ctm-dn-ht-se-bd-cr);
559
+ // height: var(--_ctm-dn-tp-tt-dn-ft-se);
560
+ // width: var(--_ctm-dn-tp-tt-dn-ft-se);
561
+ position: absolute;
562
+ // Above the sonar rings (container is z-index 1), so the pin/icon stays on top.
563
+ z-index: 2;
564
+ cursor: pointer;
565
+ // width: var(--_ctm-dn-ht-se-ht-se);
566
+ // height: var(--_ctm-dn-ht-se-ht-se);
567
+ // background-color: var(--_ctm-dn-ht-se-bd-cr);
568
+ width: var(--_ctm-mob-dn-pn-se-ht-se,
569
+ var(--_ctm-tab-dn-pn-se-ht-se, var(--_ctm-dn-pn-se-ht-se)));
570
+ height: var(--_ctm-mob-dn-pn-se-ht-se,
571
+ var(--_ctm-tab-dn-pn-se-ht-se, var(--_ctm-dn-pn-se-ht-se)));
572
+
573
+ height: prepareMediaVariable(--_ctm-dn-pn-se-ht-se);
574
+ width: prepareMediaVariable(--_ctm-dn-pn-se-ht-se);
575
+
576
+ position: absolute;
577
+ cursor: pointer;
578
+
579
+ display: flex;
580
+ align-items: center;
581
+ top: 50%;
582
+ left: 50%;
583
+
584
+ translate: -50% -50%;
585
+ box-sizing: border-box;
586
+ justify-content: center;
587
+ box-shadow: var(--_ctm-mob-dn-pn-se-sw-ae,
588
+ var(--_ctm-tab-dn-pn-se-sw-ae, var(--_ctm-dn-pn-se-sw-ae))) var(--_ctm-mob-dn-pn-se-sw-br,
589
+ var(--_ctm-tab-dn-pn-se-sw-br, var(--_ctm-dn-pn-se-sw-br))) var(--_ctm-mob-dn-pn-se-sw-sd,
590
+ var(--_ctm-tab-dn-pn-se-sw-sd, var(--_ctm-dn-pn-se-sw-sd))) var(--_ctm-mob-dn-pn-se-sw-cr,
591
+ var(--_ctm-tab-dn-pn-se-sw-cr, var(--_ctm-dn-pn-se-sw-cr)));
592
+
593
+ // Pin corners follow the Shape control only — Circle or Square. There is no
594
+ // separate radius control for pins, and this used to be applied as an inline
595
+ // style from MarkersComponent, which outranked every rule in this file.
596
+ &[data-hotspot-shape="circle"] {
597
+ border-radius: 50%;
598
+ }
599
+
600
+ &[data-hotspot-shape="square"] {
601
+ border-radius: 0;
602
+ }
603
+
604
+ svg {
605
+ width: prepareMediaVariable(--_ctm-dn-pn-se-in-se);
606
+ height: prepareMediaVariable(--_ctm-dn-pn-se-in-se);
607
+
608
+ path[fill] {
609
+ fill: prepareMediaVariable(--_ctm-dn-pn-se-in-c1);
610
+ }
611
+
612
+ path[stroke] {
613
+ stroke: prepareMediaVariable(--_ctm-dn-pn-se-in-c1);
614
+ // Overrides the stroke-width presentation attribute baked into the icon markup.
615
+ stroke-width: prepareMediaVariable(--_ctm-dn-pn-se-se-wh, 1.25);
616
+ }
617
+ }
618
+
619
+ // One gate for "this pin has a styled box": always true for a shape pin,
620
+ // and for an icon pin only while its Background toggle is on. It used to
621
+ // also match [data-show-animation="true"], which meant turning the
622
+ // background off did nothing as soon as the animation was enabled.
623
+ &[data-show-shape-styles="true"] {
624
+ background-color: var(--_ctm-mob-dn-pn-se-bd-cr,
625
+ var(--_ctm-tab-dn-pn-se-bd-cr, var(--_ctm-dn-pn-se-bd-cr)));
626
+
627
+ border-style: var(--_ctm-mob-dn-pn-se-br-se,
628
+ var(--_ctm-tab-dn-pn-se-br-se, var(--_ctm-dn-pn-se-br-se)));
629
+ border-color: var(--_ctm-mob-dn-pn-se-br-cr,
630
+ var(--_ctm-tab-dn-pn-se-br-cr, var(--_ctm-dn-pn-se-br-cr)));
631
+ border-width: var(--_ctm-mob-dn-pn-se-br-wh,
632
+ var(--_ctm-tab-dn-pn-se-br-wh, var(--_ctm-dn-pn-se-br-wh)));
633
+ // No border-radius here — it would land after the shape rules above and
634
+ // undo Circle. The Shape control is the only thing that rounds a pin.
635
+ // box-shadow is applied unconditionally above so it works for all pins,
636
+ // independent of this shape/animation gate.
637
+ }
638
+ }
639
+ }
640
+ }
641
+
642
+ .hotspot__tooltip {
643
+ --_sf-br-vl: var(--_ctm-dn-tp-dn-br-rs, 0px);
644
+ position: absolute;
645
+ background: prepareMediaVariable(--_ctm-dn-tp-dn-bd-cr);
646
+ z-index: 1000;
647
+ // Sizing follows the image hotspot: the user's width/height with a floor under
648
+ // them. The caps are viewport-relative on purpose this element's containing
649
+ // block is the Google marker, which is effectively zero-sized, so a percentage
650
+ // max-width would resolve to 0 and clamp the tooltip down to its min instead of
651
+ // holding the size the user set. The viewport cap still stops a desktop-sized
652
+ // tooltip spilling off a phone screen.
653
+ width: prepareMediaVariable(--_ctm-dn-tp-dn-tp-wh);
654
+ height: prepareMediaVariable(--_ctm-dn-tp-dn-tp-ht);
655
+ min-width: 100px;
656
+ min-height: 100px;
657
+ max-width: calc(100vw - 32px);
658
+ max-height: calc(100vh - 32px);
659
+ box-sizing: border-box;
660
+ // Placement comes from the [data-hotspot-position] transforms above, measured
661
+ // from the marker origin.
662
+ top: 0;
663
+ left: 0;
664
+ // No overflow here on purpose. The tip is an ::after sitting 10px outside the
665
+ // box, so any overflow value other than visible clips it away — that's what was
666
+ // eating the caret. The image hotspot scrolls its inner wrapper instead, and
667
+ // .text_box below does the same.
668
+ overflow: visible;
669
+
670
+ padding: 4px 8px;
671
+ display: flex;
672
+ justify-content: prepareMediaVariable(--_ctm-dn-tp-dn-hl-at);
673
+ align-items: prepareMediaVariable(--_ctm-dn-tp-dn-vl-at);
674
+
675
+ &::after {
676
+ content: "";
677
+ position: absolute;
678
+
679
+ border-width: 5px;
680
+ border-style: solid;
681
+ }
682
+
683
+ // The scroll container, mirroring .tooltip__image_with_text on the image
684
+ // hotspot: long content scrolls in here rather than on the tooltip itself.
685
+ .text_box {
686
+ overflow-y: auto;
687
+ max-width: 100%;
688
+ width: 100%;
689
+ height: 100%;
690
+ // This wrapper fills the tooltip on both axes, so the justify-content /
691
+ // align-items set on .hotspot__tooltip above have nothing left to move —
692
+ // that is why both alignment controls looked dead. Same trap the image
693
+ // hotspot hit with .tooltip__image_with_text (hotspot.scss): the alignment
694
+ // has to be re-applied on the box that actually holds the title and the
695
+ // description. The stack is a column here, so the *vertical* control drives
696
+ // justify-content and the *horizontal* one drives align-items — the opposite
697
+ // mapping to the tooltip itself.
698
+ display: flex;
699
+ flex-direction: column;
700
+ justify-content: prepareMediaVariable(--_ctm-dn-tp-dn-vl-at);
701
+ align-items: prepareMediaVariable(--_ctm-dn-tp-dn-hl-at);
702
+
703
+ // align-items shrinks each child to its content width, so the text still
704
+ // needs a cap to wrap against instead of overflowing the tooltip.
705
+ >* {
706
+ max-width: 100%;
707
+ }
708
+
709
+ h6 {
710
+ font-size: prepareMediaVariable(--_ctm-dn-tp-tt-dn-ft-se);
711
+ font-family: prepareMediaVariable(--_ctm-dn-tp-tt-dn-ft-fy);
712
+ color: prepareMediaVariable(--_ctm-dn-tp-tt-dn-cr);
713
+
714
+ font-weight: prepareMediaVariable(--_ctm-dn-tp-tt-dn-ft-wt);
715
+ font-style: prepareMediaVariable(--_ctm-dn-tp-tt-dn-ft-se-ic);
716
+ text-align: prepareMediaVariable(--_ctm-dn-tp-tt-dn-tt-an);
717
+ letter-spacing: prepareMediaVariable(--_ctm-dn-tp-tt-dn-lr-sg);
718
+ line-height: prepareMediaVariable(--_ctm-dn-tp-tt-dn-le-ht);
719
+ // Underline and line-through are two independent toggles writing two
720
+ // variables, so they have to be composed, not chained. `var(--lh, <ue>)`
721
+ // never reaches its fallback: the schema declares linethrough with an
722
+ // empty value, and stylesToString emits it as `--…-lh: ;`, which is a
723
+ // *defined* empty value rather than a missing one — so var() substitutes
724
+ // nothing and the whole declaration is thrown away. Listing both keywords
725
+ // on text-decoration-line lets either, both or neither apply; when both
726
+ // resolve empty the declaration is invalid and the initial `none` stands,
727
+ // which is exactly the both-off case.
728
+ text-decoration-line: var(--_ctm-mob-dn-tp-tt-dn-ue,
729
+ var(--_ctm-tab-dn-tp-tt-dn-ue, var(--_ctm-dn-tp-tt-dn-ue, ))) var(--_ctm-mob-dn-tp-tt-dn-lh,
730
+ var(--_ctm-tab-dn-tp-tt-dn-lh, var(--_ctm-dn-tp-tt-dn-lh, )));
731
+ // Same text properties the text element exposes (see text-temp-v2.scss).
732
+ text-transform: prepareMediaVariable(--_ctm-dn-tp-tt-dn-tt-tm, none);
733
+ word-wrap: prepareMediaVariable(--_ctm-dn-tp-tt-dn-wd-wp, normal);
734
+ word-break: prepareMediaVariable(--_ctm-dn-tp-tt-dn-wd-bk, normal);
735
+
736
+ // Text Overflow toggle in the typography panel; the line count rides in on
737
+ // --_sf-line-clamp from the element.
738
+ &#{$overflowSelector} {
739
+ @include restrictToLinesShow(#{var(--_sf-line-clamp, 1)});
740
+ }
741
+ }
742
+
743
+ p {
744
+ font-size: prepareMediaVariable(--_ctm-dn-tp-tt-dn-ft-se-dc);
745
+ color: prepareMediaVariable(--_ctm-dn-tp-tt-dn-cr-dc);
746
+ font-family: prepareMediaVariable(--_ctm-dn-tp-tt-dn-ft-fy-dc);
747
+ font-weight: prepareMediaVariable(--_ctm-dn-tp-tt-dn-ft-wt-dc);
748
+ font-style: prepareMediaVariable(--_ctm-dn-tp-tt-dn-ft-se-ic-dc);
749
+ text-align: prepareMediaVariable(--_ctm-dn-tp-tt-dn-tt-an-dc);
750
+ letter-spacing: prepareMediaVariable(--_ctm-dn-tp-tt-dn-lr-sg-dc);
751
+ line-height: prepareMediaVariable(--_ctm-dn-tp-tt-dn-le-ht-dc);
752
+ // Same composition as the title above.
753
+ text-decoration-line: var(--_ctm-mob-dn-tp-tt-dn-ue-dc,
754
+ var(--_ctm-tab-dn-tp-tt-dn-ue-dc, var(--_ctm-dn-tp-tt-dn-ue-dc, ))) var(--_ctm-mob-dn-tp-tt-dn-lh-dc,
755
+ var(--_ctm-tab-dn-tp-tt-dn-lh-dc, var(--_ctm-dn-tp-tt-dn-lh-dc, )));
756
+ text-transform: prepareMediaVariable(--_ctm-dn-tp-tt-dn-tt-tm-dc, none);
757
+ word-wrap: prepareMediaVariable(--_ctm-dn-tp-tt-dn-wd-wp-dc, normal);
758
+ word-break: prepareMediaVariable(--_ctm-dn-tp-tt-dn-wd-bk-dc, normal);
759
+
760
+ &#{$overflowSelector} {
761
+ @include restrictToLinesShow(#{var(--_sf-line-clamp-desc, 1)});
762
+ }
763
+ }
764
+ }
765
+
766
+ .tooltip__image {
767
+ width: 100%;
768
+ background-color: var(--_ctm-dn-tp-ie-dn-bd-cr);
769
+ transition: transform 0.3s ease-in-out;
770
+ display: flex;
771
+ justify-content: var(--_ctm-dn-tp-ie-dn-hl-at);
772
+ align-items: var(--_ctm-dn-tp-ie-dn-vl-at);
773
+
774
+ img {
775
+ object-fit: var(--_ctm-dn-tp-ie-dn-ft-os);
776
+ height: -webkit-fill-available;
777
+ max-width: 100%;
778
+ rotate: calc(var(--_ctm-dn-tp-ie-dn-ud) * 1deg);
779
+ scale: var(--_ctm-dn-tp-ie-dn-zm-ie);
780
+
781
+ &:hover {
782
+ &[data-on-img-hover="Zoom In"] {
783
+ transform: scale(1.08);
784
+ }
785
+
786
+ &[data-on-img-hover="Zoom Out"] {
787
+ transform: scale(0.92);
788
+ }
789
+ }
790
+ }
791
+ }
792
+ }
793
+
794
+ // .hotspot__main {
795
+ // position: relative;
796
+ // .hotspot {
797
+ // background: var(
798
+ // --_ctm-mob-dn-pn-se-bd-cr,
799
+ // var(--_ctm-tab-dn-pn-se-bd-cr, var(--_ctm-dn-pn-se-bd-cr))
800
+ // );
801
+ // border-style: var(
802
+ // --_ctm-mob-dn-pn-se-br-se,
803
+ // var(--_ctm-tab-dn-pn-se-br-se, var(--_ctm-dn-pn-se-br-se))
804
+ // );
805
+ // border-color: var(
806
+ // --_ctm-mob-dn-pn-se-br-cr,
807
+ // var(--_ctm-tab-dn-pn-se-br-cr, var(--_ctm-dn-pn-se-br-cr))
808
+ // );
809
+ // border-width: var(
810
+ // --_ctm-mob-dn-pn-se-br-wh,
811
+ // var(--_ctm-tab-dn-pn-se-br-wh, var(--_ctm-dn-pn-se-br-wh))
812
+ // );
813
+ // border-radius: var(
814
+ // --_ctm-mob-dn-pn-se-br-rs,
815
+ // var(--_ctm-tab-dn-pn-se-br-rs, var(--_ctm-dn-pn-se-br-rs))
816
+ // );
817
+ // box-shadow: var(
818
+ // --_show-shadow,
819
+ // var(
820
+ // --_ctm-mob-dn-pn-se-sw-ae,
821
+ // var(--_ctm-tab-dn-pn-se-sw-ae, var(--_ctm-dn-pn-se-sw-ae))
822
+ // )
823
+ // var(
824
+ // --_ctm-mob-dn-pn-se-sw-br,
825
+ // var(--_ctm-tab-dn-pn-se-sw-br, var(--_ctm-dn-pn-se-sw-br))
826
+ // )
827
+ // var(
828
+ // --_ctm-mob-dn-pn-se-sw-sd,
829
+ // var(--_ctm-tab-dn-pn-se-sw-sd, var(--_ctm-dn-pn-se-sw-sd))
830
+ // )
831
+ // var(
832
+ // --_ctm-mob-dn-pn-se-sw-cr,
833
+ // var(--_ctm-tab-dn-pn-se-sw-cr, var(--_ctm-dn-pn-se-sw-cr))
834
+ // )
835
+ // );
836
+
837
+ // position: absolute;
838
+ // cursor: pointer;
839
+ // width: var(
840
+ // --_ctm-mob-dn-pn-se-ht-se,
841
+ // var(--_ctm-tab-dn-pn-se-ht-se, var(--_ctm-dn-pn-se-ht-se))
842
+ // );
843
+ // height: var(
844
+ // --_ctm-mob-dn-pn-se-ht-se,
845
+ // var(--_ctm-tab-dn-pn-se-ht-se, var(--_ctm-dn-pn-se-ht-se))
846
+ // );
847
+ // background-color: var(
848
+ // --_ctm-mob-dn-pn-se-bd-cr,
849
+ // var(--_ctm-tab-dn-pn-se-bd-cr, var(--_ctm-dn-pn-se-bd-cr))
850
+ // );
851
+
852
+ // display: flex;
853
+ // align-items: center;
854
+ // top: 50%;
855
+ // left: 50%;
856
+ // transform: translate(-50%, -50%);
857
+ // justify-content: center;
858
+ // animation: scaleInOut
859
+ // var(
860
+ // --_ctm-mob-dn-pn-se-an-fy,
861
+ // var(--_ctm-tab-dn-pn-se-an-fy, var(--_ctm-dn-pn-se-an-fy))
862
+ // )
863
+ // infinite;
864
+
865
+ // .icon {
866
+ // display: var(--_sf-show-icon-ff, flex);
867
+
868
+ // svg {
869
+ // width: var(
870
+ // --_ctm-mob-dn-pn-se-in-se,
871
+ // var(--_ctm-tab-dn-pn-se-in-se, var(--_ctm-dn-pn-se-in-se))
872
+ // );
873
+ // height: var(
874
+ // --_ctm-mob-dn-pn-se-in-se,
875
+ // var(--_ctm-tab-dn-pn-se-in-se, var(--_ctm-dn-pn-se-in-se))
876
+ // );
877
+
878
+ // path {
879
+ // stroke: var(
880
+ // --_ctm-mob-dn-pn-se-in-c1,
881
+ // var(--_ctm-tab-dn-pn-se-in-c1, var(--_ctm-dn-pn-se-in-c1))
882
+ // );
883
+ // Overrides the stroke-width presentation attribute baked into the icon markup.
884
+ stroke-width: prepareMediaVariable(--_ctm-dn-pn-se-se-wh, 1.25);
885
+ // fill: var(
886
+ // --_ctm-mob-dn-pn-se-in-c1,
887
+ // var(--_ctm-tab-dn-pn-se-in-c1, var(--_ctm-dn-pn-se-in-c1))
888
+ // );
889
+ // }
890
+ // }
891
+ // }
892
+ // }
893
+ // .hotspot__tooltip {
894
+ // position: absolute;
895
+ // background: var(
896
+ // --_ctm-mob-dn-tp-dn-bd-cr,
897
+ // var(--_ctm-tab-dn-tp-dn-bd-cr, var(--_ctm-dn-tp-dn-bd-cr))
898
+ // );
899
+ // border-style: var(
900
+ // --_ctm-mob-dn-tp-dn-br-se,
901
+ // var(--_ctm-tab-dn-tp-dn-br-se, var(--_ctm-dn-tp-dn-br-se))
902
+ // );
903
+ // border-color: var(
904
+ // --_ctm-mob-dn-tp-dn-br-cr,
905
+ // var(--_ctm-tab-dn-tp-dn-br-cr, var(--_ctm-dn-tp-dn-br-cr))
906
+ // );
907
+ // border-width: var(
908
+ // --_ctm-mob-dn-tp-dn-br-wh,
909
+ // var(--_ctm-tab-dn-tp-dn-br-wh, var(--_ctm-dn-tp-dn-br-wh))
910
+ // );
911
+ // border-radius: var(
912
+ // --_ctm-mob-dn-tp-dn-br-rs,
913
+ // var(--_ctm-tab-dn-tp-dn-br-rs, var(--_ctm-dn-tp-dn-br-rs))
914
+ // );
915
+
916
+ // box-shadow: var(
917
+ // --_show-shadow,
918
+ // var(
919
+ // --_ctm-mob-dn-tp-dn-sw-ae,
920
+ // var(--_ctm-tab-dn-tp-dn-sw-ae, var(--_ctm-dn-tp-dn-sw-ae))
921
+ // )
922
+ // var(
923
+ // --_ctm-mob-dn-tp-dn-sw-br,
924
+ // var(--_ctm-tab-dn-tp-dn-sw-br, var(--_ctm-dn-tp-dn-sw-br))
925
+ // )
926
+ // var(
927
+ // --_ctm-mob-dn-tp-dn-sw-sd,
928
+ // var(--_ctm-tab-dn-tp-dn-sw-sd, var(--_ctm-dn-tp-dn-sw-sd))
929
+ // )
930
+ // var(
931
+ // --_ctm-mob-dn-tp-dn-sw-cr,
932
+ // var(--_ctm-tab-dn-tp-dn-sw-cr, var(--_ctm-dn-tp-dn-sw-cr))
933
+ // )
934
+ // );
935
+
936
+ // z-index: 1000;
937
+ // min-width: 100px;
938
+ // width: var(
939
+ // --_ctm-mob-dn-tp-dn-tp-wh,
940
+ // var(--_ctm-tab-dn-tp-dn-tp-wh, var(--_ctm-dn-tp-dn-tp-wh))
941
+ // );
942
+ // min-height: 100px;
943
+ // height: var(
944
+ // --_ctm-mob-dn-tp-dn-tp-ht,
945
+ // var(--_ctm-tab-dn-tp-dn-tp-ht, var(--_ctm-dn-tp-dn-tp-ht))
946
+ // );
947
+
948
+ // // border-radius: 4px;
949
+ // // transform: translate(-10%, -130%);
950
+ // left: -10px;
951
+ // bottom: 7px;
952
+ // padding: 4px 8px;
953
+ // display: flex;
954
+ // justify-content: var(
955
+ // --_ctm-mob-dn-tp-dn-hl-at,
956
+ // var(--_ctm-tab-dn-tp-dn-hl-at, var(--_ctm-dn-tp-dn-hl-at))
957
+ // );
958
+ // align-items: var(
959
+ // --_ctm-mob-dn-tp-dn-vl-at,
960
+ // var(--_ctm-tab-dn-tp-dn-vl-at, var(--_ctm-dn-tp-dn-vl-at))
961
+ // );
962
+
963
+ // &::after {
964
+ // content: "";
965
+ // position: absolute;
966
+ // top: 100%;
967
+ // left: 20px;
968
+ // margin-left: -5px;
969
+ // border-width: 5px;
970
+ // border-style: solid;
971
+ // border-color: var(
972
+ // --_ctm-mob-dn-tp-dn-bd-cr,
973
+ // var(--_ctm-tab-dn-tp-dn-bd-cr, var(--_ctm-dn-tp-dn-bd-cr))
974
+ // )
975
+ // transparent transparent transparent;
976
+ // }
977
+ // span {
978
+ // svg {
979
+ // width: var(
980
+ // --_ctm-mob-dn-pn-se-in-se,
981
+ // var(--_ctm-tab-dn-pn-se-in-se, var(--_ctm-dn-pn-se-in-se))
982
+ // );
983
+ // height: var(
984
+ // --_ctm-mob-dn-pn-se-in-se,
985
+ // var(--_ctm-tab-dn-pn-se-in-se, var(--_ctm-dn-pn-se-in-se))
986
+ // );
987
+ // path {
988
+ // stroke: var(
989
+ // --_ctm-mob-dn-pn-se-in-c1,
990
+ // var(--_ctm-tab-dn-pn-se-in-c1, var(--_ctm-dn-pn-se-in-c1))
991
+ // );
992
+ // Overrides the stroke-width presentation attribute baked into the icon markup.
993
+ stroke-width: prepareMediaVariable(--_ctm-dn-pn-se-se-wh, 1.25);
994
+ // }
995
+ // }
996
+ // }
997
+
998
+ // .text_box {
999
+ // h6 {
1000
+ // font-size: var(
1001
+ // --_ctm-mob-dn-tp-tt-dn-ft-se,
1002
+ // var(--_ctm-tab-dn-tp-tt-dn-ft-se, var(--_ctm-dn-tp-tt-dn-ft-se))
1003
+ // );
1004
+ // font-family: var(
1005
+ // --_ctm-mob-dn-tp-tt-dn-ft-fy,
1006
+ // var(--_ctm-tab-dn-tp-tt-dn-ft-fy, var(--_ctm-dn-tp-tt-dn-ft-fy))
1007
+ // );
1008
+ // color: var(
1009
+ // --_ctm-mob-dn-tp-tt-dn-cr,
1010
+ // var(--_ctm-tab-dn-tp-tt-dn-cr, var(--_ctm-dn-tp-tt-dn-cr))
1011
+ // );
1012
+
1013
+ // font-weight: var(
1014
+ // --_ctm-mob-dn-tp-tt-dn-ft-wt,
1015
+ // var(--_ctm-tab-dn-tp-tt-dn-ft-wt, var(--_ctm-dn-tp-tt-dn-ft-wt))
1016
+ // );
1017
+ // font-style: var(
1018
+ // --_ctm-mob-dn-tp-tt-dn-ft-se-ic,
1019
+ // var(--_ctm-tab-dn-tp-tt-dn-ft-se-ic, var(--_ctm-dn-tp-tt-dn-ft-se-ic))
1020
+ // );
1021
+ // text-align: var(
1022
+ // --_ctm-mob-dn-tp-tt-dn-tt-an,
1023
+ // var(--_ctm-tab-dn-tp-tt-dn-tt-an, var(--_ctm-dn-tp-tt-dn-tt-an))
1024
+ // );
1025
+ // letter-spacing: var(
1026
+ // --_ctm-mob-dn-tp-tt-dn-lr-sg,
1027
+ // var(--_ctm-tab-dn-tp-tt-dn-lr-sg, var(--_ctm-dn-tp-tt-dn-lr-sg))
1028
+ // );
1029
+ // line-height: var(
1030
+ // --_ctm-mob-dn-tp-tt-dn-le-ht,
1031
+ // var(--_ctm-tab-dn-tp-tt-dn-le-ht, var(--_ctm-dn-tp-tt-dn-le-ht))
1032
+ // );
1033
+ // text-decoration: var(
1034
+ // --_ctm-mob-dn-tp-tt-dn-ue,
1035
+ // var(--_ctm-tab-dn-tp-tt-dn-ue, var(--_ctm-dn-tp-tt-dn-ue))
1036
+ // );
1037
+ // }
1038
+
1039
+ // p {
1040
+ // font-size: var(
1041
+ // --_ctm-mob-dn-tp-tt-dn-ft-se-dc,
1042
+ // var(--_ctm-tab-dn-tp-tt-dn-ft-se-dc, var(--_ctm-dn-tp-tt-dn-ft-se-dc))
1043
+ // );
1044
+ // color: var(
1045
+ // --_ctm-mob-dn-tp-tt-dn-cr-dc,
1046
+ // var(--_ctm-tab-dn-tp-tt-dn-cr-dc, var(--_ctm-dn-tp-tt-dn-cr-dc))
1047
+ // );
1048
+ // font-family: var(
1049
+ // --_ctm-mob-dn-tp-tt-dn-ft-fy-dc,
1050
+ // var(--_ctm-tab-dn-tp-tt-dn-ft-fy-dc, var(--_ctm-dn-tp-tt-dn-ft-fy-dc))
1051
+ // );
1052
+ // font-weight: var(
1053
+ // --_ctm-mob-dn-tp-tt-dn-ft-wt-dc,
1054
+ // var(--_ctm-tab-dn-tp-tt-dn-ft-wt-dc, var(--_ctm-dn-tp-tt-dn-ft-wt-dc))
1055
+ // );
1056
+ // font-style: var(
1057
+ // --_ctm-mob-dn-tp-tt-dn-ft-se-ic-dc,
1058
+ // var(--_ctm-tab-dn-tp-tt-dn-ft-se-ic-dc, var(--_ctm-dn-tp-tt-dn-ft-se-ic-dc))
1059
+ // );
1060
+ // text-align: var(
1061
+ // --_ctm-mob-dn-tp-tt-dn-tt-an-dc,
1062
+ // var(--_ctm-tab-dn-tp-tt-dn-tt-an-dc, var(--_ctm-dn-tp-tt-dn-tt-an-dc))
1063
+ // );
1064
+ // letter-spacing: var(
1065
+ // --_ctm-mob-dn-tp-tt-dn-lr-sg-dc,
1066
+ // var(--_ctm-tab-dn-tp-tt-dn-lr-sg-dc, var(--_ctm-dn-tp-tt-dn-lr-sg-dc))
1067
+ // );
1068
+ // line-height: var(
1069
+ // --_ctm-mob-dn-tp-tt-dn-le-ht-dc,
1070
+ // var(--_ctm-tab-dn-tp-tt-dn-le-ht-dc, var(--_ctm-dn-tp-tt-dn-le-ht-dc))
1071
+ // );
1072
+ // text-decoration: var(
1073
+ // --_ctm-mob-dn-tp-tt-dn-ue-dc,
1074
+ // var(--_ctm-tab-dn-tp-tt-dn-ue-dc, var(--_ctm-dn-tp-tt-dn-ue-dc))
1075
+ // );
1076
+ // }
1077
+ // }
1078
+ // .tooltip__image {
1079
+ // background-color: var(
1080
+ // --_ctm-mob-dn-tp-ie-dn-bd-cr,
1081
+ // var(--_ctm-tab-dn-tp-ie-dn-bd-cr, var(--_ctm-dn-tp-ie-dn-bd-cr))
1082
+ // );
1083
+ // transition: transform 0.3s ease-in-out;
1084
+ // border-style: var(
1085
+ // --_ctm-mob-dn-tp-ie-dn-br-se,
1086
+ // var(--_ctm-tab-dn-tp-ie-dn-br-se, var(--_ctm-dn-tp-ie-dn-br-se))
1087
+ // );
1088
+ // border-color: var(
1089
+ // --_ctm-mob-dn-tp-ie-dn-br-cr,
1090
+ // var(--_ctm-tab-dn-tp-ie-dn-br-cr, var(--_ctm-dn-tp-ie-dn-br-cr))
1091
+ // );
1092
+ // border-width: var(
1093
+ // --_ctm-mob-dn-tp-ie-dn-br-wh,
1094
+ // var(--_ctm-tab-dn-tp-ie-dn-br-wh, var(--_ctm-dn-tp-ie-dn-br-wh))
1095
+ // );
1096
+ // border-radius: var(
1097
+ // --_ctm-mob-dn-tp-ie-dn-br-rs,
1098
+ // var(--_ctm-tab-dn-tp-ie-dn-br-rs, var(--_ctm-dn-tp-ie-dn-br-rs))
1099
+ // );
1100
+ // box-shadow: var(
1101
+ // --_show-shadow,
1102
+ // var(
1103
+ // --_ctm-mob-dn-tp-ie-dn-sw-ae,
1104
+ // var(--_ctm-tab-dn-tp-ie-dn-sw-ae, var(--_ctm-dn-tp-ie-dn-sw-ae))
1105
+ // )
1106
+ // var(
1107
+ // --_ctm-mob-dn-tp-ie-dn-sw-br,
1108
+ // var(--_ctm-tab-dn-tp-ie-dn-sw-br, var(--_ctm-dn-tp-ie-dn-sw-br))
1109
+ // )
1110
+ // var(
1111
+ // --_ctm-mob-dn-tp-ie-dn-sw-sd,
1112
+ // var(--_ctm-tab-dn-tp-ie-dn-sw-sd, var(--_ctm-dn-tp-ie-dn-sw-sd))
1113
+ // )
1114
+ // var(
1115
+ // --_ctm-mob-dn-tp-ie-dn-sw-cr,
1116
+ // var(--_ctm-tab-dn-tp-ie-dn-sw-cr, var(--_ctm-dn-tp-ie-dn-sw-cr))
1117
+ // )
1118
+ // );
1119
+ // display: flex;
1120
+ // justify-content: var(
1121
+ // --_ctm-mob-dn-tp-ie-dn-hl-at,
1122
+ // var(--_ctm-tab-dn-tp-ie-dn-hl-at, var(--_ctm-dn-tp-ie-dn-hl-at))
1123
+ // );
1124
+ // align-items: var(
1125
+ // --_ctm-mob-dn-tp-ie-dn-vl-at,
1126
+ // var(--_ctm-tab-dn-tp-ie-dn-vl-at, var(--_ctm-dn-tp-ie-dn-vl-at))
1127
+ // );
1128
+
1129
+ // img {
1130
+ // object-fit: var(
1131
+ // --_ctm-mob-dn-tp-ie-dn-ft-os,
1132
+ // var(--_ctm-tab-dn-tp-ie-dn-ft-os, var(--_ctm-dn-tp-ie-dn-ft-os))
1133
+ // );
1134
+ // max-width: 100%;
1135
+ // rotate: calc(
1136
+ // var(
1137
+ // --_ctm-mob-dn-tp-ie-dn-ud,
1138
+ // var(--_ctm-tab-dn-tp-ie-dn-ud, var(--_ctm-dn-tp-ie-dn-ud))
1139
+ // ) *
1140
+ // 1deg
1141
+ // );
1142
+ // scale: var(
1143
+ // --_ctm-mob-dn-tp-ie-dn-zm-ie,
1144
+ // var(--_ctm-tab-dn-tp-ie-dn-zm-ie, var(--_ctm-dn-tp-ie-dn-zm-ie))
1145
+ // );
1146
+ // }
1147
+ // }
1148
+ // }
1149
+ // }
1150
+
1151
+ .map {
1152
+ width: 100%;
1153
+ height: 100%;
1154
+ min-width: 0;
1155
+ // Yields height to the heading rather than demanding the full 100%.
1156
+ flex: 1 1 auto;
1157
+ min-height: 0;
1158
+ // design > Map Style. The map box paints its own border from that section's
1159
+ // scope (`--_ctm-dn-mp-se-*`), independent of the widget's border on
1160
+ // `.map-element` and the header's on `.gallery-header`. `overflow: hidden` so a
1161
+ // rounded corner actually clips the tiles inside it.
1162
+ overflow: hidden;
1163
+ border-color: prepareMediaVariable(--_ctm-dn-mp-ie-br-cr);
1164
+ border-style: prepareMediaVariable(--_ctm-dn-mp-ie-br-se);
1165
+ border-width: prepareMediaVariable(--_ctm-dn-mp-ie-br-wh);
1166
+ border-radius: prepareMediaVariable(--_ctm-dn-mp-ie-br-rs);
1167
+
1168
+ img {
1169
+ width: 100%;
1170
+ height: 100%;
1171
+ }
1172
+ }
1173
+ }
1174
+
1175
+ // "Show Border" / "Show Shadow" switches. Each design section paints its box from
1176
+ // CSS variables, so the switches reach the stylesheet as data attributes and the
1177
+ // matching border-width / box-shadow is zeroed here. Kept at the end of the block
1178
+ // and matched to the same selector depth as the rules they override — anywhere
1179
+ // earlier and the section rules above would win the tie on source order.
1180
+ &[data-map-widget-border="false"] .map-element {
1181
+ border-width: 0;
1182
+ border-style: none;
1183
+ }
1184
+
1185
+ &[data-map-widget-shadow="false"] .map-element {
1186
+ box-shadow: none;
1187
+ }
1188
+
1189
+ &[data-text-container-border="false"] .map-element>.gallery-header {
1190
+ border-width: 0;
1191
+ border-style: none;
1192
+ }
1193
+
1194
+ &[data-text-container-shadow="false"] .map-element>.gallery-header {
1195
+ box-shadow: none;
1196
+ }
1197
+
1198
+ &[data-pin-border="false"] .map-element .hotspot__container .hotspot__main .hotspot {
1199
+ border-width: 0;
1200
+ border-style: none;
1201
+ }
1202
+
1203
+ &[data-pin-shadow="false"] .map-element .hotspot__container .hotspot__main .hotspot {
1204
+ box-shadow: none;
1205
+ }
1206
+
1207
+ &[data-map-border="false"] .map-element .map {
1208
+ border-width: 0;
1209
+ border-style: none;
1210
+ }
1211
+ }
1212
+ }