@sc-360-v2/storefront-cms-library 0.5.61 → 0.5.63
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/builder.js +1 -1
- package/dist/builderLite.js +1 -1
- package/dist/bundle.scss +12 -0
- package/dist/bundleCategories.scss +301 -301
- package/dist/button.scss +10 -0
- package/dist/gallery-slider-temp.scss +6 -0
- package/dist/types/builder/enums/index.d.ts +1 -1
- package/dist/types/builder/index.d.ts +1 -2
- package/dist/types/builder/tools/element-edit/button.d.ts +0 -1
- package/dist/types/builder/tools/element-edit/index.d.ts +1 -2
- package/dist/types/builder/tools/element-edit/productPrice.d.ts +0 -1
- package/dist/website.js +1 -1
- package/dist/widget.scss +1 -0
- package/package.json +1 -1
- package/dist/types/builder/elements/bundle-categories/index.d.ts +0 -30
- package/dist/types/builder/tools/element-edit/bundleCategories.d.ts +0 -115
|
@@ -1,301 +1,301 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bundle Categories — the category strip above a bundle's product list.
|
|
3
|
-
*
|
|
4
|
-
* Mirrors the category tabs in the Bundle Details element: a horizontal row of
|
|
5
|
-
* cards, each with the category's image, its name, how many products it holds
|
|
6
|
-
* and how many are selected. The row is an Embla carousel, so the slides are
|
|
7
|
-
* laid out by the carousel and only the card itself is styled here.
|
|
8
|
-
*/
|
|
9
|
-
[data-div-type="element"] {
|
|
10
|
-
&[data-element-type="bundleCategories"] {
|
|
11
|
-
// The builder writes width/height/margin/padding as --_ctm-* custom properties
|
|
12
|
-
// rather than as plain CSS. Without consuming them the Layout panel appears to
|
|
13
|
-
// do nothing — which is exactly how this element behaved.
|
|
14
|
-
//
|
|
15
|
-
// `--_sf-nw-wh` closes the chain: it is the width the element emits itself
|
|
16
|
-
// while a resize drag is in flight, before the percentage is committed.
|
|
17
|
-
width: var(
|
|
18
|
-
--_sf-el-wh-st-mx,
|
|
19
|
-
calc(
|
|
20
|
-
1% *
|
|
21
|
-
var(
|
|
22
|
-
--_ctm-mob-ele-nw-wh-vl,
|
|
23
|
-
var(--_ctm-tab-ele-nw-wh-vl, var(--_ctm-ele-nw-wh-vl, var(--_sf-nw-wh)))
|
|
24
|
-
)
|
|
25
|
-
)
|
|
26
|
-
);
|
|
27
|
-
margin: var(--_ctm-mob-lt-mn, var(--_ctm-tab-lt-mn, var(--_ctm-lt-mn, 0)));
|
|
28
|
-
padding: var(--_ctm-mob-lt-pg, var(--_ctm-tab-lt-pg, var(--_ctm-lt-pg, 0)));
|
|
29
|
-
|
|
30
|
-
// Show Border / Show Shadow are CONTROLS, not CSS, so the builder never turns
|
|
31
|
-
// them into `--_ctm-*` variables — the element surfaces them as data
|
|
32
|
-
// attributes and the gates below read those.
|
|
33
|
-
&[data-show-border="false"] > .wrapper {
|
|
34
|
-
border-style: none;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// A gate of its own rather than the shared `--_show-shadow`: custom properties
|
|
38
|
-
// inherit, so a parent whose shadow is switched off would silently clear this
|
|
39
|
-
// element's too.
|
|
40
|
-
&[data-show-shadow="false"] {
|
|
41
|
-
--_sf-bc-show-shadow: none;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// Background type is chosen in the Design tab and written onto the element as
|
|
45
|
-
// `data-background-type`; gradients add `data-gradient-type`. Both are gated
|
|
46
|
-
// exactly as the repeater item gates them, and like it the painted surface is
|
|
47
|
-
// the wrapper rather than the root — the root carries the builder's own
|
|
48
|
-
// `#<id>` rule and cannot be overridden from this stylesheet.
|
|
49
|
-
&[data-background-type="color"] > .wrapper {
|
|
50
|
-
background-color: var(--_ctm-mob-dn-bd-cr, var(--_ctm-tab-dn-bd-cr, var(--_ctm-dn-bd-cr)));
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
&[data-background-type="image"] > .wrapper {
|
|
54
|
-
background-image: var(--_ctm-mob-dn-bd-ie, var(--_ctm-tab-dn-bd-ie, var(--_ctm-dn-bd-ie)));
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
&[data-background-type="gradient"] > .wrapper {
|
|
58
|
-
--_sf-bc-gradient-angle: calc(
|
|
59
|
-
var(--_ctm-mob-dn-gt-ae, var(--_ctm-tab-dn-gt-ae, var(--_ctm-dn-gt-ae, 90))) * 1deg
|
|
60
|
-
);
|
|
61
|
-
--_sf-bc-gradient-start-color: var(
|
|
62
|
-
--_ctm-mob-dn-gt-st-cr,
|
|
63
|
-
var(--_ctm-tab-dn-gt-st-cr, var(--_ctm-dn-gt-st-cr, transparent))
|
|
64
|
-
);
|
|
65
|
-
--_sf-bc-gradient-start-position: calc(
|
|
66
|
-
var(--_ctm-mob-dn-gt-st-pn, var(--_ctm-tab-dn-gt-st-pn, var(--_ctm-dn-gt-st-pn, 0))) * 1%
|
|
67
|
-
);
|
|
68
|
-
--_sf-bc-gradient-end-color: var(
|
|
69
|
-
--_ctm-mob-dn-gt-ed-cr,
|
|
70
|
-
var(--_ctm-tab-dn-gt-ed-cr, var(--_ctm-dn-gt-ed-cr, transparent))
|
|
71
|
-
);
|
|
72
|
-
--_sf-bc-gradient-end-position: calc(
|
|
73
|
-
var(--_ctm-mob-dn-gt-ed-pn, var(--_ctm-tab-dn-gt-ed-pn, var(--_ctm-dn-gt-ed-pn, 100))) * 1%
|
|
74
|
-
);
|
|
75
|
-
--_sf-bc-gradient-position: var(
|
|
76
|
-
--_ctm-mob-dn-gt-pn,
|
|
77
|
-
var(--_ctm-tab-dn-gt-pn, var(--_ctm-dn-gt-pn, center))
|
|
78
|
-
);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
&[data-gradient-type="Linear Gradient"] > .wrapper {
|
|
82
|
-
background-image: linear-gradient(
|
|
83
|
-
var(--_sf-bc-gradient-angle),
|
|
84
|
-
var(--_sf-bc-gradient-start-color) var(--_sf-bc-gradient-start-position),
|
|
85
|
-
var(--_sf-bc-gradient-end-color) var(--_sf-bc-gradient-end-position)
|
|
86
|
-
);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
&[data-gradient-type="Radial Gradient"] > .wrapper {
|
|
90
|
-
background-image: radial-gradient(
|
|
91
|
-
circle at var(--_sf-bc-gradient-position),
|
|
92
|
-
var(--_sf-bc-gradient-start-color) var(--_sf-bc-gradient-start-position),
|
|
93
|
-
var(--_sf-bc-gradient-end-color) var(--_sf-bc-gradient-end-position)
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
background-position: var(--_ctm-mob-dn-bd-pn, var(--_ctm-tab-dn-bd-pn, var(--_ctm-dn-bd-pn)));
|
|
97
|
-
background-repeat: var(--_ctm-mob-dn-bd-rt, var(--_ctm-tab-dn-bd-rt, var(--_ctm-dn-bd-rt)));
|
|
98
|
-
background-size: var(--_ctm-mob-dn-bd-se, var(--_ctm-tab-dn-bd-se, var(--_ctm-dn-bd-se)));
|
|
99
|
-
|
|
100
|
-
border-color: var(--_ctm-mob-dn-br-cr, var(--_ctm-tab-dn-br-cr, var(--_ctm-dn-br-cr)));
|
|
101
|
-
border-style: var(--_ctm-mob-dn-br-se, var(--_ctm-tab-dn-br-se, var(--_ctm-dn-br-se)));
|
|
102
|
-
border-width: var(--_ctm-mob-dn-br-wh, var(--_ctm-tab-dn-br-wh, var(--_ctm-dn-br-wh)));
|
|
103
|
-
border-radius: var(--_ctm-mob-dn-br-rs, var(--_ctm-tab-dn-br-rs, var(--_ctm-dn-br-rs)));
|
|
104
|
-
|
|
105
|
-
// Show Border / Show Shadow are CONTROLS, not CSS, so they never become
|
|
106
|
-
// variables — the element surfaces them as data attributes instead.
|
|
107
|
-
&[data-show-border="false"] {
|
|
108
|
-
border-style: none;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// A gate of its own rather than the shared `--_show-shadow`: custom properties
|
|
112
|
-
// inherit, so a parent whose shadow is switched off would silently clear this
|
|
113
|
-
// element's too.
|
|
114
|
-
&[data-show-shadow="false"] {
|
|
115
|
-
--_sf-bc-show-shadow: none;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// Per-part fallbacks: without them one unset part invalidates the whole
|
|
119
|
-
// `box-shadow` at computed-value time and it resolves to `none`.
|
|
120
|
-
box-shadow: var(
|
|
121
|
-
--_sf-bc-show-shadow,
|
|
122
|
-
var(--_ctm-mob-dn-sw-ae, var(--_ctm-tab-dn-sw-ae, var(--_ctm-dn-sw-ae, 0)))
|
|
123
|
-
var(--_ctm-mob-dn-sw-br, var(--_ctm-tab-dn-sw-br, var(--_ctm-dn-sw-br, 0)))
|
|
124
|
-
var(--_ctm-mob-dn-sw-sd, var(--_ctm-tab-dn-sw-sd, var(--_ctm-dn-sw-sd, 0)))
|
|
125
|
-
var(--_ctm-mob-dn-sw-cr, var(--_ctm-tab-dn-sw-cr, var(--_ctm-dn-sw-cr, transparent)))
|
|
126
|
-
);
|
|
127
|
-
|
|
128
|
-
// Height goes on the wrapper, not here: the builder emits the element's own
|
|
129
|
-
// default styles as `#<id>{ height: auto }`, and an id selector outranks this
|
|
130
|
-
// stylesheet — so a height set here could never win and the top/bottom resize
|
|
131
|
-
// handles moved nothing. The wrapper is outside that rule's reach.
|
|
132
|
-
> .wrapper {
|
|
133
|
-
width: 100%;
|
|
134
|
-
height: var(--_ctm-mob-lt-ht, var(--_ctm-tab-lt-ht, var(--_ctm-lt-ht, 100%))) !important;
|
|
135
|
-
|
|
136
|
-
// Border, radius and shadow ride on the wrapper alongside the background so
|
|
137
|
-
// the whole painted surface is one box.
|
|
138
|
-
border-color: var(--_ctm-mob-dn-br-cr, var(--_ctm-tab-dn-br-cr, var(--_ctm-dn-br-cr)));
|
|
139
|
-
border-style: var(--_ctm-mob-dn-br-se, var(--_ctm-tab-dn-br-se, var(--_ctm-dn-br-se)));
|
|
140
|
-
border-width: var(--_ctm-mob-dn-br-wh, var(--_ctm-tab-dn-br-wh, var(--_ctm-dn-br-wh)));
|
|
141
|
-
border-radius: var(--_ctm-mob-dn-br-rs, var(--_ctm-tab-dn-br-rs, var(--_ctm-dn-br-rs)));
|
|
142
|
-
|
|
143
|
-
background-repeat: var(--_ctm-mob-dn-bd-rt, var(--_ctm-tab-dn-bd-rt, var(--_ctm-dn-bd-rt)));
|
|
144
|
-
background-size: var(--_ctm-mob-dn-bd-se, var(--_ctm-tab-dn-bd-se, var(--_ctm-dn-bd-se)));
|
|
145
|
-
background-attachment: var(
|
|
146
|
-
--_ctm-mob-dn-bd-at,
|
|
147
|
-
var(--_ctm-tab-dn-bd-at, var(--_ctm-dn-bd-at))
|
|
148
|
-
);
|
|
149
|
-
// Position is stored as separate X and Y values, not one shorthand.
|
|
150
|
-
background-position: var(
|
|
151
|
-
--_ctm-mob-dn-bd-pn-x,
|
|
152
|
-
var(--_ctm-tab-dn-bd-pn-x, var(--_ctm-dn-bd-pn-x, center))
|
|
153
|
-
)
|
|
154
|
-
var(--_ctm-mob-dn-bd-pn-y, var(--_ctm-tab-dn-bd-pn-y, var(--_ctm-dn-bd-pn-y, center)));
|
|
155
|
-
|
|
156
|
-
// Per-part fallbacks: without them one unset part invalidates the whole
|
|
157
|
-
// `box-shadow` at computed-value time and it resolves to `none`.
|
|
158
|
-
box-shadow: var(
|
|
159
|
-
--_sf-bc-show-shadow,
|
|
160
|
-
var(--_ctm-mob-dn-sw-ae, var(--_ctm-tab-dn-sw-ae, var(--_ctm-dn-sw-ae, 0)))
|
|
161
|
-
var(--_ctm-mob-dn-sw-br, var(--_ctm-tab-dn-sw-br, var(--_ctm-dn-sw-br, 0)))
|
|
162
|
-
var(--_ctm-mob-dn-sw-sd, var(--_ctm-tab-dn-sw-sd, var(--_ctm-dn-sw-sd, 0)))
|
|
163
|
-
var(--_ctm-mob-dn-sw-cr, var(--_ctm-tab-dn-sw-cr, var(--_ctm-dn-sw-cr, transparent)))
|
|
164
|
-
);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// Bundle name above the strip, matching the heading Bundle Details prints.
|
|
168
|
-
.bundle__name {
|
|
169
|
-
margin: 0 0 12px;
|
|
170
|
-
font-size: 18px;
|
|
171
|
-
font-weight: 600;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
.bundle__categories {
|
|
175
|
-
width: 100%;
|
|
176
|
-
|
|
177
|
-
// Embla's own classes. The container has to be an explicit row — otherwise
|
|
178
|
-
// the slides stack — and each slide needs a width of its own, or it
|
|
179
|
-
// collapses to the widest word and the labels wrap per character.
|
|
180
|
-
.embla__container {
|
|
181
|
-
display: flex;
|
|
182
|
-
flex-direction: row;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
.embla__slide {
|
|
186
|
-
flex: 0 0 auto;
|
|
187
|
-
min-width: 240px;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
// Arrow placement is driven by the carousel's control position, which the
|
|
191
|
-
// shared EmblaCarouselBasic stamps onto `.embla` as `data-control-type`.
|
|
192
|
-
// In "Side" mode — the default this element passes — it renders the two
|
|
193
|
-
// buttons as bare children of `.embla` with no wrapper, so an earlier rule
|
|
194
|
-
// written against an `.arrow-navigation` wrapper never matched and the
|
|
195
|
-
// arrows stacked above and below the strip.
|
|
196
|
-
//
|
|
197
|
-
// Keyed and sized exactly as bundleDetails does it: the viewport gives up
|
|
198
|
-
// 120px so the absolutely-placed arrows sit beside the cards rather than
|
|
199
|
-
// on top of them.
|
|
200
|
-
.embla {
|
|
201
|
-
position: relative;
|
|
202
|
-
|
|
203
|
-
&[data-control-type="Side"] {
|
|
204
|
-
.embla__viewport {
|
|
205
|
-
width: calc(100% - 120px);
|
|
206
|
-
margin-inline: auto;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
.left-button,
|
|
210
|
-
.right-button {
|
|
211
|
-
position: absolute;
|
|
212
|
-
top: 50%;
|
|
213
|
-
transform: translateY(-50%);
|
|
214
|
-
z-index: 2;
|
|
215
|
-
display: flex;
|
|
216
|
-
align-items: center;
|
|
217
|
-
justify-content: center;
|
|
218
|
-
cursor: pointer;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
.left-button {
|
|
222
|
-
left: 0;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
.right-button {
|
|
226
|
-
right: 0;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
.bundle__category {
|
|
233
|
-
display: flex;
|
|
234
|
-
align-items: center;
|
|
235
|
-
gap: 12px;
|
|
236
|
-
padding: 8px 12px;
|
|
237
|
-
background: transparent;
|
|
238
|
-
border: 1px solid transparent;
|
|
239
|
-
border-radius: 4px;
|
|
240
|
-
cursor: pointer;
|
|
241
|
-
font: inherit;
|
|
242
|
-
text-align: left;
|
|
243
|
-
width: 100%;
|
|
244
|
-
min-width: 240px;
|
|
245
|
-
white-space: nowrap;
|
|
246
|
-
|
|
247
|
-
// The open tab. Kept to a border rather than a fill so the strip stays quiet
|
|
248
|
-
// against the product list below it.
|
|
249
|
-
&[data-is-active="true"] {
|
|
250
|
-
border-color: #1f1f1f;
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
.bundle__category__image {
|
|
255
|
-
flex: 0 0 auto;
|
|
256
|
-
width: 56px;
|
|
257
|
-
height: 56px;
|
|
258
|
-
overflow: hidden;
|
|
259
|
-
border-radius: 2px;
|
|
260
|
-
|
|
261
|
-
img {
|
|
262
|
-
width: 100%;
|
|
263
|
-
height: 100%;
|
|
264
|
-
object-fit: cover;
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
.bundle__category__text {
|
|
269
|
-
display: flex;
|
|
270
|
-
flex-direction: column;
|
|
271
|
-
gap: 2px;
|
|
272
|
-
min-width: 0;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
.bundle__category__name {
|
|
276
|
-
display: flex;
|
|
277
|
-
align-items: center;
|
|
278
|
-
gap: 6px;
|
|
279
|
-
font-weight: 600;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
.bundle__category__tick {
|
|
283
|
-
color: #2e7d32;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
.bundle__category__count,
|
|
287
|
-
.bundle__category__selected {
|
|
288
|
-
font-size: 12px;
|
|
289
|
-
opacity: 0.75;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// Validation message for this category, shown after a failed add to cart.
|
|
293
|
-
// `white-space: normal` because the card itself is nowrap.
|
|
294
|
-
.bundle__category__error {
|
|
295
|
-
margin-top: 4px;
|
|
296
|
-
font-size: 12px;
|
|
297
|
-
color: #c62828;
|
|
298
|
-
white-space: normal;
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Bundle Categories — the category strip above a bundle's product list.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the category tabs in the Bundle Details element: a horizontal row of
|
|
5
|
+
* cards, each with the category's image, its name, how many products it holds
|
|
6
|
+
* and how many are selected. The row is an Embla carousel, so the slides are
|
|
7
|
+
* laid out by the carousel and only the card itself is styled here.
|
|
8
|
+
*/
|
|
9
|
+
[data-div-type="element"] {
|
|
10
|
+
&[data-element-type="bundleCategories"] {
|
|
11
|
+
// The builder writes width/height/margin/padding as --_ctm-* custom properties
|
|
12
|
+
// rather than as plain CSS. Without consuming them the Layout panel appears to
|
|
13
|
+
// do nothing — which is exactly how this element behaved.
|
|
14
|
+
//
|
|
15
|
+
// `--_sf-nw-wh` closes the chain: it is the width the element emits itself
|
|
16
|
+
// while a resize drag is in flight, before the percentage is committed.
|
|
17
|
+
width: var(
|
|
18
|
+
--_sf-el-wh-st-mx,
|
|
19
|
+
calc(
|
|
20
|
+
1% *
|
|
21
|
+
var(
|
|
22
|
+
--_ctm-mob-ele-nw-wh-vl,
|
|
23
|
+
var(--_ctm-tab-ele-nw-wh-vl, var(--_ctm-ele-nw-wh-vl, var(--_sf-nw-wh)))
|
|
24
|
+
)
|
|
25
|
+
)
|
|
26
|
+
);
|
|
27
|
+
margin: var(--_ctm-mob-lt-mn, var(--_ctm-tab-lt-mn, var(--_ctm-lt-mn, 0)));
|
|
28
|
+
padding: var(--_ctm-mob-lt-pg, var(--_ctm-tab-lt-pg, var(--_ctm-lt-pg, 0)));
|
|
29
|
+
|
|
30
|
+
// Show Border / Show Shadow are CONTROLS, not CSS, so the builder never turns
|
|
31
|
+
// them into `--_ctm-*` variables — the element surfaces them as data
|
|
32
|
+
// attributes and the gates below read those.
|
|
33
|
+
&[data-show-border="false"] > .wrapper {
|
|
34
|
+
border-style: none;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// A gate of its own rather than the shared `--_show-shadow`: custom properties
|
|
38
|
+
// inherit, so a parent whose shadow is switched off would silently clear this
|
|
39
|
+
// element's too.
|
|
40
|
+
&[data-show-shadow="false"] {
|
|
41
|
+
--_sf-bc-show-shadow: none;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Background type is chosen in the Design tab and written onto the element as
|
|
45
|
+
// `data-background-type`; gradients add `data-gradient-type`. Both are gated
|
|
46
|
+
// exactly as the repeater item gates them, and like it the painted surface is
|
|
47
|
+
// the wrapper rather than the root — the root carries the builder's own
|
|
48
|
+
// `#<id>` rule and cannot be overridden from this stylesheet.
|
|
49
|
+
&[data-background-type="color"] > .wrapper {
|
|
50
|
+
background-color: var(--_ctm-mob-dn-bd-cr, var(--_ctm-tab-dn-bd-cr, var(--_ctm-dn-bd-cr)));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
&[data-background-type="image"] > .wrapper {
|
|
54
|
+
background-image: var(--_ctm-mob-dn-bd-ie, var(--_ctm-tab-dn-bd-ie, var(--_ctm-dn-bd-ie)));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
&[data-background-type="gradient"] > .wrapper {
|
|
58
|
+
--_sf-bc-gradient-angle: calc(
|
|
59
|
+
var(--_ctm-mob-dn-gt-ae, var(--_ctm-tab-dn-gt-ae, var(--_ctm-dn-gt-ae, 90))) * 1deg
|
|
60
|
+
);
|
|
61
|
+
--_sf-bc-gradient-start-color: var(
|
|
62
|
+
--_ctm-mob-dn-gt-st-cr,
|
|
63
|
+
var(--_ctm-tab-dn-gt-st-cr, var(--_ctm-dn-gt-st-cr, transparent))
|
|
64
|
+
);
|
|
65
|
+
--_sf-bc-gradient-start-position: calc(
|
|
66
|
+
var(--_ctm-mob-dn-gt-st-pn, var(--_ctm-tab-dn-gt-st-pn, var(--_ctm-dn-gt-st-pn, 0))) * 1%
|
|
67
|
+
);
|
|
68
|
+
--_sf-bc-gradient-end-color: var(
|
|
69
|
+
--_ctm-mob-dn-gt-ed-cr,
|
|
70
|
+
var(--_ctm-tab-dn-gt-ed-cr, var(--_ctm-dn-gt-ed-cr, transparent))
|
|
71
|
+
);
|
|
72
|
+
--_sf-bc-gradient-end-position: calc(
|
|
73
|
+
var(--_ctm-mob-dn-gt-ed-pn, var(--_ctm-tab-dn-gt-ed-pn, var(--_ctm-dn-gt-ed-pn, 100))) * 1%
|
|
74
|
+
);
|
|
75
|
+
--_sf-bc-gradient-position: var(
|
|
76
|
+
--_ctm-mob-dn-gt-pn,
|
|
77
|
+
var(--_ctm-tab-dn-gt-pn, var(--_ctm-dn-gt-pn, center))
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
&[data-gradient-type="Linear Gradient"] > .wrapper {
|
|
82
|
+
background-image: linear-gradient(
|
|
83
|
+
var(--_sf-bc-gradient-angle),
|
|
84
|
+
var(--_sf-bc-gradient-start-color) var(--_sf-bc-gradient-start-position),
|
|
85
|
+
var(--_sf-bc-gradient-end-color) var(--_sf-bc-gradient-end-position)
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
&[data-gradient-type="Radial Gradient"] > .wrapper {
|
|
90
|
+
background-image: radial-gradient(
|
|
91
|
+
circle at var(--_sf-bc-gradient-position),
|
|
92
|
+
var(--_sf-bc-gradient-start-color) var(--_sf-bc-gradient-start-position),
|
|
93
|
+
var(--_sf-bc-gradient-end-color) var(--_sf-bc-gradient-end-position)
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
background-position: var(--_ctm-mob-dn-bd-pn, var(--_ctm-tab-dn-bd-pn, var(--_ctm-dn-bd-pn)));
|
|
97
|
+
background-repeat: var(--_ctm-mob-dn-bd-rt, var(--_ctm-tab-dn-bd-rt, var(--_ctm-dn-bd-rt)));
|
|
98
|
+
background-size: var(--_ctm-mob-dn-bd-se, var(--_ctm-tab-dn-bd-se, var(--_ctm-dn-bd-se)));
|
|
99
|
+
|
|
100
|
+
border-color: var(--_ctm-mob-dn-br-cr, var(--_ctm-tab-dn-br-cr, var(--_ctm-dn-br-cr)));
|
|
101
|
+
border-style: var(--_ctm-mob-dn-br-se, var(--_ctm-tab-dn-br-se, var(--_ctm-dn-br-se)));
|
|
102
|
+
border-width: var(--_ctm-mob-dn-br-wh, var(--_ctm-tab-dn-br-wh, var(--_ctm-dn-br-wh)));
|
|
103
|
+
border-radius: var(--_ctm-mob-dn-br-rs, var(--_ctm-tab-dn-br-rs, var(--_ctm-dn-br-rs)));
|
|
104
|
+
|
|
105
|
+
// Show Border / Show Shadow are CONTROLS, not CSS, so they never become
|
|
106
|
+
// variables — the element surfaces them as data attributes instead.
|
|
107
|
+
&[data-show-border="false"] {
|
|
108
|
+
border-style: none;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// A gate of its own rather than the shared `--_show-shadow`: custom properties
|
|
112
|
+
// inherit, so a parent whose shadow is switched off would silently clear this
|
|
113
|
+
// element's too.
|
|
114
|
+
&[data-show-shadow="false"] {
|
|
115
|
+
--_sf-bc-show-shadow: none;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Per-part fallbacks: without them one unset part invalidates the whole
|
|
119
|
+
// `box-shadow` at computed-value time and it resolves to `none`.
|
|
120
|
+
box-shadow: var(
|
|
121
|
+
--_sf-bc-show-shadow,
|
|
122
|
+
var(--_ctm-mob-dn-sw-ae, var(--_ctm-tab-dn-sw-ae, var(--_ctm-dn-sw-ae, 0)))
|
|
123
|
+
var(--_ctm-mob-dn-sw-br, var(--_ctm-tab-dn-sw-br, var(--_ctm-dn-sw-br, 0)))
|
|
124
|
+
var(--_ctm-mob-dn-sw-sd, var(--_ctm-tab-dn-sw-sd, var(--_ctm-dn-sw-sd, 0)))
|
|
125
|
+
var(--_ctm-mob-dn-sw-cr, var(--_ctm-tab-dn-sw-cr, var(--_ctm-dn-sw-cr, transparent)))
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
// Height goes on the wrapper, not here: the builder emits the element's own
|
|
129
|
+
// default styles as `#<id>{ height: auto }`, and an id selector outranks this
|
|
130
|
+
// stylesheet — so a height set here could never win and the top/bottom resize
|
|
131
|
+
// handles moved nothing. The wrapper is outside that rule's reach.
|
|
132
|
+
> .wrapper {
|
|
133
|
+
width: 100%;
|
|
134
|
+
height: var(--_ctm-mob-lt-ht, var(--_ctm-tab-lt-ht, var(--_ctm-lt-ht, 100%))) !important;
|
|
135
|
+
|
|
136
|
+
// Border, radius and shadow ride on the wrapper alongside the background so
|
|
137
|
+
// the whole painted surface is one box.
|
|
138
|
+
border-color: var(--_ctm-mob-dn-br-cr, var(--_ctm-tab-dn-br-cr, var(--_ctm-dn-br-cr)));
|
|
139
|
+
border-style: var(--_ctm-mob-dn-br-se, var(--_ctm-tab-dn-br-se, var(--_ctm-dn-br-se)));
|
|
140
|
+
border-width: var(--_ctm-mob-dn-br-wh, var(--_ctm-tab-dn-br-wh, var(--_ctm-dn-br-wh)));
|
|
141
|
+
border-radius: var(--_ctm-mob-dn-br-rs, var(--_ctm-tab-dn-br-rs, var(--_ctm-dn-br-rs)));
|
|
142
|
+
|
|
143
|
+
background-repeat: var(--_ctm-mob-dn-bd-rt, var(--_ctm-tab-dn-bd-rt, var(--_ctm-dn-bd-rt)));
|
|
144
|
+
background-size: var(--_ctm-mob-dn-bd-se, var(--_ctm-tab-dn-bd-se, var(--_ctm-dn-bd-se)));
|
|
145
|
+
background-attachment: var(
|
|
146
|
+
--_ctm-mob-dn-bd-at,
|
|
147
|
+
var(--_ctm-tab-dn-bd-at, var(--_ctm-dn-bd-at))
|
|
148
|
+
);
|
|
149
|
+
// Position is stored as separate X and Y values, not one shorthand.
|
|
150
|
+
background-position: var(
|
|
151
|
+
--_ctm-mob-dn-bd-pn-x,
|
|
152
|
+
var(--_ctm-tab-dn-bd-pn-x, var(--_ctm-dn-bd-pn-x, center))
|
|
153
|
+
)
|
|
154
|
+
var(--_ctm-mob-dn-bd-pn-y, var(--_ctm-tab-dn-bd-pn-y, var(--_ctm-dn-bd-pn-y, center)));
|
|
155
|
+
|
|
156
|
+
// Per-part fallbacks: without them one unset part invalidates the whole
|
|
157
|
+
// `box-shadow` at computed-value time and it resolves to `none`.
|
|
158
|
+
box-shadow: var(
|
|
159
|
+
--_sf-bc-show-shadow,
|
|
160
|
+
var(--_ctm-mob-dn-sw-ae, var(--_ctm-tab-dn-sw-ae, var(--_ctm-dn-sw-ae, 0)))
|
|
161
|
+
var(--_ctm-mob-dn-sw-br, var(--_ctm-tab-dn-sw-br, var(--_ctm-dn-sw-br, 0)))
|
|
162
|
+
var(--_ctm-mob-dn-sw-sd, var(--_ctm-tab-dn-sw-sd, var(--_ctm-dn-sw-sd, 0)))
|
|
163
|
+
var(--_ctm-mob-dn-sw-cr, var(--_ctm-tab-dn-sw-cr, var(--_ctm-dn-sw-cr, transparent)))
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Bundle name above the strip, matching the heading Bundle Details prints.
|
|
168
|
+
.bundle__name {
|
|
169
|
+
margin: 0 0 12px;
|
|
170
|
+
font-size: 18px;
|
|
171
|
+
font-weight: 600;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.bundle__categories {
|
|
175
|
+
width: 100%;
|
|
176
|
+
|
|
177
|
+
// Embla's own classes. The container has to be an explicit row — otherwise
|
|
178
|
+
// the slides stack — and each slide needs a width of its own, or it
|
|
179
|
+
// collapses to the widest word and the labels wrap per character.
|
|
180
|
+
.embla__container {
|
|
181
|
+
display: flex;
|
|
182
|
+
flex-direction: row;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.embla__slide {
|
|
186
|
+
flex: 0 0 auto;
|
|
187
|
+
min-width: 240px;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Arrow placement is driven by the carousel's control position, which the
|
|
191
|
+
// shared EmblaCarouselBasic stamps onto `.embla` as `data-control-type`.
|
|
192
|
+
// In "Side" mode — the default this element passes — it renders the two
|
|
193
|
+
// buttons as bare children of `.embla` with no wrapper, so an earlier rule
|
|
194
|
+
// written against an `.arrow-navigation` wrapper never matched and the
|
|
195
|
+
// arrows stacked above and below the strip.
|
|
196
|
+
//
|
|
197
|
+
// Keyed and sized exactly as bundleDetails does it: the viewport gives up
|
|
198
|
+
// 120px so the absolutely-placed arrows sit beside the cards rather than
|
|
199
|
+
// on top of them.
|
|
200
|
+
.embla {
|
|
201
|
+
position: relative;
|
|
202
|
+
|
|
203
|
+
&[data-control-type="Side"] {
|
|
204
|
+
.embla__viewport {
|
|
205
|
+
width: calc(100% - 120px);
|
|
206
|
+
margin-inline: auto;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
.left-button,
|
|
210
|
+
.right-button {
|
|
211
|
+
position: absolute;
|
|
212
|
+
top: 50%;
|
|
213
|
+
transform: translateY(-50%);
|
|
214
|
+
z-index: 2;
|
|
215
|
+
display: flex;
|
|
216
|
+
align-items: center;
|
|
217
|
+
justify-content: center;
|
|
218
|
+
cursor: pointer;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.left-button {
|
|
222
|
+
left: 0;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.right-button {
|
|
226
|
+
right: 0;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.bundle__category {
|
|
233
|
+
display: flex;
|
|
234
|
+
align-items: center;
|
|
235
|
+
gap: 12px;
|
|
236
|
+
padding: 8px 12px;
|
|
237
|
+
background: transparent;
|
|
238
|
+
border: 1px solid transparent;
|
|
239
|
+
border-radius: 4px;
|
|
240
|
+
cursor: pointer;
|
|
241
|
+
font: inherit;
|
|
242
|
+
text-align: left;
|
|
243
|
+
width: 100%;
|
|
244
|
+
min-width: 240px;
|
|
245
|
+
white-space: nowrap;
|
|
246
|
+
|
|
247
|
+
// The open tab. Kept to a border rather than a fill so the strip stays quiet
|
|
248
|
+
// against the product list below it.
|
|
249
|
+
&[data-is-active="true"] {
|
|
250
|
+
border-color: #1f1f1f;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
.bundle__category__image {
|
|
255
|
+
flex: 0 0 auto;
|
|
256
|
+
width: 56px;
|
|
257
|
+
height: 56px;
|
|
258
|
+
overflow: hidden;
|
|
259
|
+
border-radius: 2px;
|
|
260
|
+
|
|
261
|
+
img {
|
|
262
|
+
width: 100%;
|
|
263
|
+
height: 100%;
|
|
264
|
+
object-fit: cover;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
.bundle__category__text {
|
|
269
|
+
display: flex;
|
|
270
|
+
flex-direction: column;
|
|
271
|
+
gap: 2px;
|
|
272
|
+
min-width: 0;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
.bundle__category__name {
|
|
276
|
+
display: flex;
|
|
277
|
+
align-items: center;
|
|
278
|
+
gap: 6px;
|
|
279
|
+
font-weight: 600;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
.bundle__category__tick {
|
|
283
|
+
color: #2e7d32;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
.bundle__category__count,
|
|
287
|
+
.bundle__category__selected {
|
|
288
|
+
font-size: 12px;
|
|
289
|
+
opacity: 0.75;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// Validation message for this category, shown after a failed add to cart.
|
|
293
|
+
// `white-space: normal` because the card itself is nowrap.
|
|
294
|
+
.bundle__category__error {
|
|
295
|
+
margin-top: 4px;
|
|
296
|
+
font-size: 12px;
|
|
297
|
+
color: #c62828;
|
|
298
|
+
white-space: normal;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
package/dist/button.scss
CHANGED
|
@@ -3,6 +3,16 @@
|
|
|
3
3
|
|
|
4
4
|
@use "./functions.scss" as *;
|
|
5
5
|
|
|
6
|
+
|
|
7
|
+
// Validation message for a bundle product, printed under its Select button —
|
|
8
|
+
// the one element rendered per product, so it is where the message belongs.
|
|
9
|
+
.bundle__product__error {
|
|
10
|
+
display: block;
|
|
11
|
+
margin-top: 6px;
|
|
12
|
+
font-size: 12px;
|
|
13
|
+
color: #c62828;
|
|
14
|
+
white-space: normal;
|
|
15
|
+
}
|
|
6
16
|
[data-div-type="element"] {
|
|
7
17
|
&[data-element-type="button"] {
|
|
8
18
|
min-height: 24px !important;
|
|
@@ -1336,6 +1336,12 @@ $overflowSelector: ".flex__overflow";
|
|
|
1336
1336
|
}
|
|
1337
1337
|
|
|
1338
1338
|
.gallery__slide {
|
|
1339
|
+
// Containing block for the item header. With text position "On Image" that header
|
|
1340
|
+
// is `position: absolute`; without this it resolved against `.embla__viewport`, so
|
|
1341
|
+
// `width: 100%` spanned the whole slider and it sat centred across every slide
|
|
1342
|
+
// instead of over its own image. It also puts the slide back in the containing
|
|
1343
|
+
// block chain, so the `overflow: hidden` below actually clips the header.
|
|
1344
|
+
position: relative;
|
|
1339
1345
|
width: 100%;
|
|
1340
1346
|
height: 100%;
|
|
1341
1347
|
display: flex;
|
|
@@ -327,7 +327,6 @@ export declare const CMSElementsListEnum: {
|
|
|
327
327
|
TOASTER: string;
|
|
328
328
|
SPOTLIGHT: string;
|
|
329
329
|
BUNDLE_DETAILS: string;
|
|
330
|
-
BUNDLE_CATEGORIES: string;
|
|
331
330
|
PRODUCT_CUSTOMIZATIONS: string;
|
|
332
331
|
ICON_LIST: string;
|
|
333
332
|
MENU_V2: string;
|
|
@@ -364,6 +363,7 @@ export declare const CMSElementsListEnum: {
|
|
|
364
363
|
STOCK_STATUS: string;
|
|
365
364
|
KIT_DETAILS: string;
|
|
366
365
|
KITS: string;
|
|
366
|
+
BUNDLE_CATEGORIES: string;
|
|
367
367
|
};
|
|
368
368
|
export declare enum CMSResponsiveModeEnums {
|
|
369
369
|
DESKTOP = "desktop",
|