@universityofmaryland/web-elements-library 1.6.16 → 1.7.0
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/README.md +1 -1
- package/dist/atomic/animations/brand/card-stack.js +2 -3
- package/dist/atomic/animations/brand/card-stack.js.map +1 -1
- package/dist/atomic/animations/brand/chevron-flow.d.ts +1 -7
- package/dist/atomic/animations/brand/chevron-flow.d.ts.map +1 -1
- package/dist/atomic/animations/brand/chevron-flow.js +82 -159
- package/dist/atomic/animations/brand/chevron-flow.js.map +1 -1
- package/dist/atomic/animations/brand/chevron-scroll.d.ts +1 -4
- package/dist/atomic/animations/brand/chevron-scroll.d.ts.map +1 -1
- package/dist/atomic/animations/brand/chevron-scroll.js +89 -143
- package/dist/atomic/animations/brand/chevron-scroll.js.map +1 -1
- package/dist/atomic/assets/image/caption.d.ts +9 -0
- package/dist/atomic/assets/image/caption.d.ts.map +1 -0
- package/dist/atomic/assets/image/caption.js +166 -0
- package/dist/atomic/assets/image/caption.js.map +1 -0
- package/dist/atomic/assets/image/gif.d.ts.map +1 -1
- package/dist/atomic/assets/image/gif.js +6 -1
- package/dist/atomic/assets/image/gif.js.map +1 -1
- package/dist/atomic/assets/image/index.d.ts +1 -0
- package/dist/atomic/assets/image/index.d.ts.map +1 -1
- package/dist/atomic/assets/image/index.js +2 -0
- package/dist/atomic/assets/image/index.js.map +1 -1
- package/dist/atomic/assets/video/toggle.d.ts.map +1 -1
- package/dist/atomic/assets/video/toggle.js +9 -2
- package/dist/atomic/assets/video/toggle.js.map +1 -1
- package/dist/atomic/buttons/fullscreen.d.ts +1 -0
- package/dist/atomic/buttons/fullscreen.d.ts.map +1 -1
- package/dist/atomic/buttons/fullscreen.js +35 -3
- package/dist/atomic/buttons/fullscreen.js.map +1 -1
- package/dist/atomic/layout/overlay/modal.d.ts +1 -10
- package/dist/atomic/layout/overlay/modal.d.ts.map +1 -1
- package/dist/atomic/layout/overlay/modal.js +28 -44
- package/dist/atomic/layout/overlay/modal.js.map +1 -1
- package/dist/atomic/layout/person/columns.js +2 -3
- package/dist/atomic/layout/person/columns.js.map +1 -1
- package/dist/atomic/text-lockup/date.d.ts +1 -4
- package/dist/atomic/text-lockup/date.d.ts.map +1 -1
- package/dist/atomic/text-lockup/date.js +42 -75
- package/dist/atomic/text-lockup/date.js.map +1 -1
- package/dist/composite/accordion/item.d.ts +3 -16
- package/dist/composite/accordion/item.d.ts.map +1 -1
- package/dist/composite/accordion/item.js +152 -245
- package/dist/composite/accordion/item.js.map +1 -1
- package/dist/composite/card/block.js +2 -3
- package/dist/composite/card/block.js.map +1 -1
- package/dist/composite/card/event-time.js +2 -3
- package/dist/composite/card/event-time.js.map +1 -1
- package/dist/composite/card/list.js +2 -3
- package/dist/composite/card/list.js.map +1 -1
- package/dist/composite/card/overlay/color.js +3 -3
- package/dist/composite/card/overlay/icon.js +3 -3
- package/dist/composite/card/overlay/image.d.ts.map +1 -1
- package/dist/composite/card/overlay/image.js +9 -12
- package/dist/composite/card/overlay/image.js.map +1 -1
- package/dist/composite/card/video/block.js +4 -3
- package/dist/composite/card/video/block.js.map +1 -1
- package/dist/composite/carousel/cards/index.d.ts +1 -8
- package/dist/composite/carousel/cards/index.d.ts.map +1 -1
- package/dist/composite/carousel/cards/index.js +163 -282
- package/dist/composite/carousel/cards/index.js.map +1 -1
- package/dist/composite/carousel/default/index.d.ts +9 -15
- package/dist/composite/carousel/default/index.d.ts.map +1 -1
- package/dist/composite/carousel/default/index.js +78 -129
- package/dist/composite/carousel/default/index.js.map +1 -1
- package/dist/composite/carousel/elements/equal-width-items.d.ts +37 -0
- package/dist/composite/carousel/elements/equal-width-items.d.ts.map +1 -0
- package/dist/composite/carousel/elements/{blocks.js → equal-width-items.js} +157 -227
- package/dist/composite/carousel/elements/equal-width-items.js.map +1 -0
- package/dist/composite/carousel/elements/full-screen.d.ts +3 -2
- package/dist/composite/carousel/elements/full-screen.d.ts.map +1 -1
- package/dist/composite/carousel/elements/full-screen.js +34 -41
- package/dist/composite/carousel/elements/full-screen.js.map +1 -1
- package/dist/composite/carousel/elements/image.d.ts +15 -2
- package/dist/composite/carousel/elements/image.d.ts.map +1 -1
- package/dist/composite/carousel/elements/image.js +176 -151
- package/dist/composite/carousel/elements/image.js.map +1 -1
- package/dist/composite/carousel/elements/index.d.ts +4 -1
- package/dist/composite/carousel/elements/index.d.ts.map +1 -1
- package/dist/composite/carousel/elements/indicator-wrapper.d.ts +13 -0
- package/dist/composite/carousel/elements/indicator-wrapper.d.ts.map +1 -0
- package/dist/composite/carousel/elements/indicator-wrapper.js +67 -0
- package/dist/composite/carousel/elements/indicator-wrapper.js.map +1 -0
- package/dist/composite/carousel/elements/nav-button.d.ts +82 -0
- package/dist/composite/carousel/elements/nav-button.d.ts.map +1 -0
- package/dist/composite/carousel/elements/nav-button.js +164 -0
- package/dist/composite/carousel/elements/nav-button.js.map +1 -0
- package/dist/composite/carousel/elements/overlay.d.ts +3 -2
- package/dist/composite/carousel/elements/overlay.d.ts.map +1 -1
- package/dist/composite/carousel/elements/overlay.js +85 -55
- package/dist/composite/carousel/elements/overlay.js.map +1 -1
- package/dist/composite/carousel/image/multiple.d.ts +2 -7
- package/dist/composite/carousel/image/multiple.d.ts.map +1 -1
- package/dist/composite/carousel/image/multiple.js +85 -150
- package/dist/composite/carousel/image/multiple.js.map +1 -1
- package/dist/composite/carousel/image/standard.d.ts +2 -7
- package/dist/composite/carousel/image/standard.d.ts.map +1 -1
- package/dist/composite/carousel/image/standard.js +148 -262
- package/dist/composite/carousel/image/standard.js.map +1 -1
- package/dist/composite/carousel/thumbnail/index.d.ts +1 -8
- package/dist/composite/carousel/thumbnail/index.d.ts.map +1 -1
- package/dist/composite/carousel/thumbnail/index.js +72 -113
- package/dist/composite/carousel/thumbnail/index.js.map +1 -1
- package/dist/composite/carousel/wide/container.d.ts +21 -20
- package/dist/composite/carousel/wide/container.d.ts.map +1 -1
- package/dist/composite/carousel/wide/container.js +37 -12
- package/dist/composite/carousel/wide/container.js.map +1 -1
- package/dist/composite/carousel/wide/controls.d.ts +5 -10
- package/dist/composite/carousel/wide/controls.d.ts.map +1 -1
- package/dist/composite/carousel/wide/controls.js +24 -94
- package/dist/composite/carousel/wide/controls.js.map +1 -1
- package/dist/composite/carousel/wide/frames.d.ts +18 -10
- package/dist/composite/carousel/wide/frames.d.ts.map +1 -1
- package/dist/composite/carousel/wide/frames.js +60 -78
- package/dist/composite/carousel/wide/frames.js.map +1 -1
- package/dist/composite/carousel/wide/index.d.ts.map +1 -1
- package/dist/composite/carousel/wide/index.js +11 -19
- package/dist/composite/carousel/wide/index.js.map +1 -1
- package/dist/composite/hero/custom/expand.js +3 -4
- package/dist/composite/hero/custom/expand.js.map +1 -1
- package/dist/composite/hero/custom/grid.js +2 -3
- package/dist/composite/hero/custom/grid.js.map +1 -1
- package/dist/composite/hero/custom/video-arrow.js +4 -3
- package/dist/composite/hero/custom/video-arrow.js.map +1 -1
- package/dist/composite/hero/logo.js +3 -3
- package/dist/composite/hero/minimal.js +3 -3
- package/dist/composite/hero/overlay.js +5 -4
- package/dist/composite/hero/overlay.js.map +1 -1
- package/dist/composite/hero/stacked.js +3 -3
- package/dist/composite/hero/standard.js +4 -3
- package/dist/composite/hero/standard.js.map +1 -1
- package/dist/composite/layout/box/logo.d.ts +1 -4
- package/dist/composite/layout/box/logo.d.ts.map +1 -1
- package/dist/composite/layout/box/logo.js +55 -103
- package/dist/composite/layout/box/logo.js.map +1 -1
- package/dist/composite/layout/image/expand.d.ts +1 -4
- package/dist/composite/layout/image/expand.d.ts.map +1 -1
- package/dist/composite/layout/image/expand.js +136 -243
- package/dist/composite/layout/image/expand.js.map +1 -1
- package/dist/composite/layout/scroll-top/index.d.ts +1 -7
- package/dist/composite/layout/scroll-top/index.d.ts.map +1 -1
- package/dist/composite/layout/scroll-top/index.js +65 -77
- package/dist/composite/layout/scroll-top/index.js.map +1 -1
- package/dist/composite/layout/sticky-columns/index.d.ts +2 -2
- package/dist/composite/layout/sticky-columns/index.d.ts.map +1 -1
- package/dist/composite/layout/sticky-columns/index.js +42 -70
- package/dist/composite/layout/sticky-columns/index.js.map +1 -1
- package/dist/composite/media/elements/gif.js +3 -3
- package/dist/composite/media/inline/caption.d.ts +4 -2
- package/dist/composite/media/inline/caption.d.ts.map +1 -1
- package/dist/composite/media/inline/caption.js +56 -67
- package/dist/composite/media/inline/caption.js.map +1 -1
- package/dist/composite/media/inline/index.d.ts +9 -8
- package/dist/composite/media/inline/index.d.ts.map +1 -1
- package/dist/composite/media/inline/standard.d.ts +1 -4
- package/dist/composite/media/inline/standard.d.ts.map +1 -1
- package/dist/composite/media/inline/standard.js +16 -24
- package/dist/composite/media/inline/standard.js.map +1 -1
- package/dist/composite/media/inline/wrapped.d.ts +4 -2
- package/dist/composite/media/inline/wrapped.d.ts.map +1 -1
- package/dist/composite/media/inline/wrapped.js +80 -83
- package/dist/composite/media/inline/wrapped.js.map +1 -1
- package/dist/composite/navigation/elements/slider/slide-first.d.ts.map +1 -1
- package/dist/composite/navigation/elements/slider/slide-first.js +4 -1
- package/dist/composite/navigation/elements/slider/slide-first.js.map +1 -1
- package/dist/composite/navigation/utility/alert.js +3 -4
- package/dist/composite/navigation/utility/alert.js.map +1 -1
- package/dist/composite/pathway/_common.js +4 -3
- package/dist/composite/pathway/_common.js.map +1 -1
- package/dist/composite/pathway/hero.js +3 -3
- package/dist/composite/person/bio/full.js +3 -3
- package/dist/composite/person/bio/small.js +2 -3
- package/dist/composite/person/bio/small.js.map +1 -1
- package/dist/composite/person/block.js +2 -3
- package/dist/composite/person/block.js.map +1 -1
- package/dist/composite/person/hero.js +3 -3
- package/dist/composite/person/list.js +2 -3
- package/dist/composite/person/list.js.map +1 -1
- package/dist/composite/person/tabular.js +2 -3
- package/dist/composite/person/tabular.js.map +1 -1
- package/dist/composite/slider/events.d.ts +6 -12
- package/dist/composite/slider/events.d.ts.map +1 -1
- package/dist/composite/slider/events.js +304 -428
- package/dist/composite/slider/events.js.map +1 -1
- package/dist/layout/image.d.ts +5 -10
- package/dist/layout/image.d.ts.map +1 -1
- package/dist/layout/image.js +27 -88
- package/dist/layout/image.js.map +1 -1
- package/dist/layout/index.d.ts +1 -1
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/layout.js +2 -2
- package/package.json +5 -5
- package/dist/composite/carousel/elements/blocks.d.ts +0 -42
- package/dist/composite/carousel/elements/blocks.d.ts.map +0 -1
- package/dist/composite/carousel/elements/blocks.js.map +0 -1
- package/dist/composite/carousel/wide/_elementModel.d.ts +0 -18
- package/dist/composite/carousel/wide/_elementModel.d.ts.map +0 -1
- package/dist/composite/carousel/wide/_elementModel.js +0 -29
- package/dist/composite/carousel/wide/_elementModel.js.map +0 -1
|
@@ -14,19 +14,18 @@ import "@universityofmaryland/web-icons-library/files";
|
|
|
14
14
|
import "@universityofmaryland/web-icons-library/brand";
|
|
15
15
|
import "@universityofmaryland/web-icons-library/arrows";
|
|
16
16
|
import "@universityofmaryland/web-utilities-library/performance";
|
|
17
|
-
import "
|
|
17
|
+
import "@universityofmaryland/web-utilities-library/styles";
|
|
18
18
|
import "../../../atomic/animations/brand/card-stack.js";
|
|
19
19
|
import { createImageBackground } from "../../../atomic/assets/image/background.js";
|
|
20
20
|
import "@universityofmaryland/web-utilities-library/accessibility";
|
|
21
21
|
import "@universityofmaryland/web-icons-library/location";
|
|
22
22
|
import "@universityofmaryland/web-icons-library/calendar";
|
|
23
23
|
import "../../../atomic/layout/block/stacked.js";
|
|
24
|
-
import "../../../atomic/layout/overlay/modal.js";
|
|
25
24
|
import "../../../atomic/layout/person/columns.js";
|
|
26
25
|
import "@universityofmaryland/web-icons-library/social";
|
|
27
|
-
import "
|
|
26
|
+
import "@universityofmaryland/web-utilities-library/string";
|
|
27
|
+
import "@universityofmaryland/web-utilities-library/animation";
|
|
28
28
|
import "../../../atomic/text-lockup/small.js";
|
|
29
|
-
import { createElementWithRefs } from "./_elementModel.js";
|
|
30
29
|
import { createControlButton } from "./controls.js";
|
|
31
30
|
const ASPECT_RATIO = "16 / 9";
|
|
32
31
|
const createSlideContent = ({
|
|
@@ -49,8 +48,9 @@ const createSlideContent = ({
|
|
|
49
48
|
lineHeight: 1,
|
|
50
49
|
color: token.color.gray.dark,
|
|
51
50
|
transition: "color 0.2s ease",
|
|
52
|
-
|
|
53
|
-
|
|
51
|
+
display: "none",
|
|
52
|
+
[`@media (${token.media.queries.desktop.min})`]: {
|
|
53
|
+
display: "block"
|
|
54
54
|
},
|
|
55
55
|
"&:hover, &:focus": {
|
|
56
56
|
outline: `2px solid ${token.color.blue}`
|
|
@@ -62,9 +62,11 @@ const createSlideContent = ({
|
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
|
-
}).withModifier((
|
|
66
|
-
|
|
67
|
-
if (contentContainer)
|
|
65
|
+
}).withModifier((element) => {
|
|
66
|
+
element.addEventListener("click", () => {
|
|
67
|
+
if (contentContainer) {
|
|
68
|
+
contentContainer.element.style.display = "none";
|
|
69
|
+
}
|
|
68
70
|
});
|
|
69
71
|
}).build();
|
|
70
72
|
children.push(closeButton);
|
|
@@ -111,10 +113,8 @@ const createSlideContent = ({
|
|
|
111
113
|
backgroundColor: token.color.black,
|
|
112
114
|
border: `1px solid ${token.color.gray.dark}`
|
|
113
115
|
},
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
},
|
|
117
|
-
[`@media (${token.media.queries.tablet.min})`]: {
|
|
116
|
+
borderTop: "none",
|
|
117
|
+
[`@media (${token.media.queries.desktop.min})`]: {
|
|
118
118
|
border: "none",
|
|
119
119
|
boxShadow: "0 0 5px 0 rgba(0, 0, 0, 0.4)",
|
|
120
120
|
maxWidth: "50%",
|
|
@@ -140,15 +140,16 @@ const createMainFrameSlide = (slide, index$1, isThemeDark) => {
|
|
|
140
140
|
imageLoading: "lazy"
|
|
141
141
|
})
|
|
142
142
|
);
|
|
143
|
-
if (slideContentWrapper)
|
|
143
|
+
if (slideContentWrapper) {
|
|
144
|
+
children.push(slideContentWrapper);
|
|
145
|
+
}
|
|
144
146
|
return new ElementBuilder("figure").withClassName("umd-carousel-wide__slide").withAttribute("data-index", `${index$1}`).withStyles({
|
|
145
147
|
element: {
|
|
146
148
|
display: "none",
|
|
147
149
|
opacity: 0,
|
|
148
150
|
transition: "opacity 0.3s ease-in-out, transform 0.5s ease-in-out",
|
|
149
|
-
transform: "translateX(0)",
|
|
150
151
|
aspectRatio: ASPECT_RATIO,
|
|
151
|
-
[`@media (${token.media.queries.
|
|
152
|
+
[`@media (${token.media.queries.desktop.min})`]: {
|
|
152
153
|
position: "absolute",
|
|
153
154
|
width: "100%",
|
|
154
155
|
height: "100%",
|
|
@@ -165,12 +166,10 @@ const createMainFrameSlide = (slide, index$1, isThemeDark) => {
|
|
|
165
166
|
zIndex: 1,
|
|
166
167
|
display: "block",
|
|
167
168
|
opacity: 1,
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
left: 0
|
|
173
|
-
}
|
|
169
|
+
position: "absolute",
|
|
170
|
+
width: "100%",
|
|
171
|
+
top: 0,
|
|
172
|
+
left: 0
|
|
174
173
|
},
|
|
175
174
|
'&[data-direction="left"]': {
|
|
176
175
|
transform: "translateX(-100%)"
|
|
@@ -194,7 +193,7 @@ const createPreviewContainer = (position) => {
|
|
|
194
193
|
display: "none",
|
|
195
194
|
overflow: "hidden",
|
|
196
195
|
position: "relative",
|
|
197
|
-
[`@media (${token.media.queries.
|
|
196
|
+
[`@media (${token.media.queries.desktop.min})`]: {
|
|
198
197
|
display: "flex",
|
|
199
198
|
alignItems: "flex-end",
|
|
200
199
|
height: "100%"
|
|
@@ -214,10 +213,7 @@ const createPreviewContainer = (position) => {
|
|
|
214
213
|
["&:before "]: {
|
|
215
214
|
content: '""',
|
|
216
215
|
position: "absolute",
|
|
217
|
-
|
|
218
|
-
left: "0",
|
|
219
|
-
right: "0",
|
|
220
|
-
bottom: "0",
|
|
216
|
+
inset: 0,
|
|
221
217
|
background: token.color.gray.darker,
|
|
222
218
|
opacity: 0.5,
|
|
223
219
|
zIndex: 1
|
|
@@ -226,64 +222,50 @@ const createPreviewContainer = (position) => {
|
|
|
226
222
|
}
|
|
227
223
|
}).build();
|
|
228
224
|
};
|
|
229
|
-
const createMainContainer = (
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
if (slideElements.length > 0) {
|
|
234
|
-
slideElements[0].element.setAttribute("data-active", "true");
|
|
235
|
-
slideElements[0].element.setAttribute("data-content-visible", "true");
|
|
225
|
+
const createMainContainer = (slideElements) => new ElementBuilder().withClassName("umd-carousel-wide__main-container").withStyles({
|
|
226
|
+
element: {
|
|
227
|
+
position: "relative",
|
|
228
|
+
overflow: "hidden"
|
|
236
229
|
}
|
|
237
|
-
|
|
238
|
-
component: new ElementBuilder().withClassName("umd-carousel-wide__main-container").withStyles({
|
|
239
|
-
element: {
|
|
240
|
-
position: "relative",
|
|
241
|
-
overflow: "hidden"
|
|
242
|
-
}
|
|
243
|
-
}).withChildren(...slideElements).build(),
|
|
244
|
-
refs: slideElements.map((el) => el.element)
|
|
245
|
-
};
|
|
246
|
-
};
|
|
230
|
+
}).withChildren(...slideElements).build();
|
|
247
231
|
const createFramesContainer = (slides, isThemeDark) => {
|
|
248
232
|
const previewLeft = createPreviewContainer("left");
|
|
249
233
|
const previewRight = createPreviewContainer("right");
|
|
250
234
|
const previousButton = createControlButton("prev", isThemeDark);
|
|
251
235
|
const nextButton = createControlButton("next", isThemeDark);
|
|
252
|
-
const
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
[`@media (${token.media.queries.desktop.min})`]: {
|
|
276
|
-
gridTemplateColumns: "15vw 1fr 15vw",
|
|
277
|
-
gridGap: token.spacing.lg
|
|
278
|
-
},
|
|
279
|
-
[`@media (${token.media.queries.highDef.min})`]: {
|
|
280
|
-
gridTemplateColumns: "20vw 1fr 20vw"
|
|
281
|
-
}
|
|
236
|
+
const slideElements = slides.map(
|
|
237
|
+
(slide, index) => createMainFrameSlide(slide, index, isThemeDark)
|
|
238
|
+
);
|
|
239
|
+
if (slideElements.length > 0) {
|
|
240
|
+
slideElements[0].element.setAttribute("data-active", "true");
|
|
241
|
+
slideElements[0].element.setAttribute("data-content-visible", "true");
|
|
242
|
+
}
|
|
243
|
+
const mainContainer = createMainContainer(slideElements);
|
|
244
|
+
const model = new ElementBuilder().withClassName("umd-carousel-wide__frames-container").withStyles({
|
|
245
|
+
element: {
|
|
246
|
+
position: "relative",
|
|
247
|
+
width: "100%",
|
|
248
|
+
padding: `0 ${token.spacing.md} 0`,
|
|
249
|
+
[`@media (${token.media.queries.desktop.min})`]: {
|
|
250
|
+
padding: `0 0 ${token.spacing.md}`,
|
|
251
|
+
display: "grid",
|
|
252
|
+
gridTemplateColumns: "15vw 1fr 15vw",
|
|
253
|
+
gridGap: token.spacing.lg,
|
|
254
|
+
height: "56vw",
|
|
255
|
+
maxHeight: "60vh"
|
|
256
|
+
},
|
|
257
|
+
[`@media (${token.media.queries.highDef.min})`]: {
|
|
258
|
+
gridTemplateColumns: "20vw 1fr 20vw"
|
|
282
259
|
}
|
|
283
|
-
}
|
|
260
|
+
}
|
|
261
|
+
}).withChildren(previewLeft, mainContainer, previewRight).build();
|
|
262
|
+
return {
|
|
263
|
+
element: model.element,
|
|
264
|
+
styles: model.styles,
|
|
265
|
+
buttons: { prev: previousButton, next: nextButton },
|
|
284
266
|
refs: {
|
|
285
|
-
slidesContainer: mainContainer.
|
|
286
|
-
slides:
|
|
267
|
+
slidesContainer: mainContainer.element,
|
|
268
|
+
slides: slideElements.map((el) => el.element),
|
|
287
269
|
previews: {
|
|
288
270
|
left: previewLeft.element,
|
|
289
271
|
right: previewRight.element
|
|
@@ -293,7 +275,7 @@ const createFramesContainer = (slides, isThemeDark) => {
|
|
|
293
275
|
next: nextButton.element
|
|
294
276
|
}
|
|
295
277
|
}
|
|
296
|
-
}
|
|
278
|
+
};
|
|
297
279
|
};
|
|
298
280
|
export {
|
|
299
281
|
createFramesContainer
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frames.js","sources":["../../../../source/composite/carousel/wide/frames.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport * as Styles from '@universityofmaryland/web-styles-library';\nimport { theme } from '@universityofmaryland/web-utilities-library/theme';\nimport { assets } from 'atomic';\nimport { createElementWithRefs } from './_elementModel';\nimport { createControlButton } from './controls';\nimport { type CarouselWideProps } from '../_types';\nimport { type UMDElement } from '../../../_types';\n\nconst ASPECT_RATIO = '16 / 9';\n\nconst createSlideContent = ({\n slide,\n isThemeDark,\n}: {\n slide: CarouselWideProps['slides'][0];\n isThemeDark?: boolean;\n}) => {\n const children: UMDElement[] = [];\n\n // Create content container first to get reference\n let contentContainer: UMDElement | null = null;\n\n const closeButton = new ElementBuilder('button')\n .withClassName('umd-carousel-wide__slide-content-close')\n .withAttribute('type', 'button')\n .withAttribute('aria-label', 'Close content')\n .withHTML('×')\n .withStyles({\n element: {\n position: 'absolute',\n top: 0,\n right: 0,\n background: 'transparent',\n border: 'none',\n cursor: 'pointer',\n fontSize: '20px',\n fontWeight: 'bold',\n padding: token.spacing.min,\n lineHeight: 1,\n color: token.color.gray.dark,\n transition: 'color 0.2s ease',\n\n [`@media (${token.media.queries.large.max})`]: {\n display: 'none',\n },\n\n '&:hover, &:focus': {\n outline: `2px solid ${token.color.blue}`,\n },\n\n ...(isThemeDark && {\n color: token.color.gray.light,\n '&:hover': {\n color: token.color.white,\n },\n }),\n },\n })\n .withModifier((el) => {\n el.addEventListener('click', () => {\n if (contentContainer) contentContainer.element.style.display = 'none';\n });\n })\n .build();\n\n children.push(closeButton);\n\n if (slide.headline) {\n children.push(\n new ElementBuilder(slide.headline)\n .styled(\n Styles.typography.sans.compose('large', {\n theme: theme.fontColor(isThemeDark),\n }),\n )\n .withStyles({\n element: {\n ...(!isThemeDark && {\n color: `${token.color.black}`,\n }),\n },\n siblingAfter: {\n marginTop: token.spacing.sm,\n },\n })\n .build(),\n );\n }\n\n if (slide.text) {\n children.push(\n new ElementBuilder(slide.text)\n .styled(\n Styles.element.text.rich.composeSimple({\n theme: theme.fontColor(isThemeDark),\n }),\n )\n .build(),\n );\n }\n\n if (children.length === 1) return null;\n\n contentContainer = new ElementBuilder()\n .withClassName('umd-carousel-wide__slide-content')\n .withStyles({\n element: {\n backgroundColor: token.color.white,\n border: `1px solid ${token.color.gray.light}`,\n display: 'block',\n padding: token.spacing.md,\n width: '100%',\n position: 'relative',\n opacity: 0,\n transform: 'translateY(20px)',\n transition: 'opacity 0.6s ease-out, transform 0.6s ease-out',\n\n ...(isThemeDark && {\n backgroundColor: token.color.black,\n border: `1px solid ${token.color.gray.dark}`,\n }),\n\n [`@media (${token.media.queries.large.max})`]: {\n borderTop: 'none',\n },\n\n [`@media (${token.media.queries.tablet.min})`]: {\n border: 'none',\n boxShadow: '0 0 5px 0 rgba(0, 0, 0, 0.4)',\n maxWidth: '50%',\n position: 'absolute',\n bottom: token.spacing.sm,\n left: token.spacing.sm,\n\n ...(isThemeDark && {\n border: 'none',\n boxShadow: 'none',\n }),\n },\n },\n })\n .withChildren(...children)\n .build();\n\n return contentContainer;\n};\n\nconst createMainFrameSlide = (\n slide: CarouselWideProps['slides'][0],\n index: number,\n isThemeDark?: boolean,\n) => {\n const children: UMDElement[] = [];\n const slideContentWrapper = createSlideContent({ slide, isThemeDark });\n\n children.push(\n assets.image.background({\n element: slide.image,\n isScaled: true,\n imageLoading: 'lazy',\n }),\n );\n\n if (slideContentWrapper) children.push(slideContentWrapper);\n\n return new ElementBuilder('figure')\n .withClassName('umd-carousel-wide__slide')\n .withAttribute('data-index', `${index}`)\n .withStyles({\n element: {\n display: 'none',\n opacity: 0,\n transition: 'opacity 0.3s ease-in-out, transform 0.5s ease-in-out',\n transform: 'translateX(0)',\n aspectRatio: ASPECT_RATIO,\n\n [`@media (${token.media.queries.tablet.min})`]: {\n position: 'absolute',\n width: '100%',\n height: '100%',\n top: 0,\n left: 0,\n },\n\n '&[data-active=\"true\"]': {\n opacity: 1,\n transform: 'translateX(0)',\n zIndex: 2,\n display: 'block',\n },\n\n '&[data-animating=\"true\"]': {\n zIndex: 1,\n display: 'block',\n opacity: 1,\n\n [`@media (${token.media.queries.large.max})`]: {\n position: 'absolute',\n width: '100%',\n top: 0,\n left: 0,\n },\n },\n\n '&[data-direction=\"left\"]': {\n transform: 'translateX(-100%)',\n },\n\n '&[data-direction=\"right\"]': {\n transform: 'translateX(100%)',\n },\n\n '&[data-content-visible=\"true\"] .umd-carousel-wide__slide-content': {\n opacity: 1,\n transform: 'translateY(0)',\n },\n },\n })\n .withChildren(...children)\n .build();\n};\n\nconst createPreviewContainer = (position: 'left' | 'right') => {\n const isPositionLeft = position === 'left';\n return new ElementBuilder()\n .withClassName(\n isPositionLeft\n ? 'umd-carousel-wide__preview--left'\n : 'umd-carousel-wide__preview--right',\n )\n .withAttribute('aria-hidden', 'true')\n .withAttribute('role', 'presentation')\n .withStyles({\n element: {\n display: 'none',\n overflow: 'hidden',\n position: 'relative',\n\n [`@media (${token.media.queries.tablet.min})`]: {\n display: 'flex',\n alignItems: 'flex-end',\n height: '100%',\n },\n\n ['& > * ']: {\n position: 'absolute !important',\n bottom: '0 !important',\n left: '0 !important',\n width: 'auto !important',\n height: '75% !important',\n display: 'block !important',\n aspectRatio: ASPECT_RATIO,\n\n ...(isPositionLeft && {\n right: '0 !important',\n left: 'auto !important',\n }),\n\n ['&:before ']: {\n content: '\"\"',\n position: 'absolute',\n top: '0',\n left: '0',\n right: '0',\n bottom: '0',\n background: token.color.gray.darker,\n opacity: 0.5,\n zIndex: 1,\n },\n },\n },\n })\n .build();\n};\n\nconst createMainContainer = (\n slides: CarouselWideProps['slides'],\n isThemeDark?: boolean,\n) => {\n const slideElements = slides.map((slide, index) => {\n return createMainFrameSlide(slide, index, isThemeDark);\n });\n\n // Set first slide as active and content visible\n if (slideElements.length > 0) {\n slideElements[0].element.setAttribute('data-active', 'true');\n slideElements[0].element.setAttribute('data-content-visible', 'true');\n }\n\n return {\n component: new ElementBuilder()\n .withClassName('umd-carousel-wide__main-container')\n .withStyles({\n element: {\n position: 'relative',\n overflow: 'hidden',\n },\n })\n .withChildren(...slideElements)\n .build(),\n refs: slideElements.map((el) => el.element),\n };\n};\n\nexport const createFramesContainer = (\n slides: CarouselWideProps['slides'],\n isThemeDark?: boolean,\n) => {\n const previewLeft = createPreviewContainer('left');\n const previewRight = createPreviewContainer('right');\n const previousButton = createControlButton('prev', isThemeDark);\n const nextButton = createControlButton('next', isThemeDark);\n const mainContainer = createMainContainer(slides, isThemeDark);\n\n return createElementWithRefs({\n className: 'umd-carousel-wide__frames-container',\n children: [\n previewLeft,\n mainContainer.component,\n previewRight,\n previousButton,\n nextButton,\n ],\n elementStyles: {\n element: {\n position: 'relative',\n\n [`@media (${token.media.queries.large.max})`]: {\n padding: `0 ${token.spacing.md}`,\n },\n\n [`@media (${token.media.queries.tablet.min})`]: {\n display: 'grid',\n gridTemplateColumns: '10vw 1fr 10vw',\n gridGap: token.spacing.md,\n height: '56vw',\n maxHeight: '60vh',\n },\n\n [`@media (${token.media.queries.desktop.min})`]: {\n gridTemplateColumns: '15vw 1fr 15vw',\n gridGap: token.spacing.lg,\n },\n\n [`@media (${token.media.queries.highDef.min})`]: {\n gridTemplateColumns: '20vw 1fr 20vw',\n },\n },\n },\n refs: {\n slidesContainer: mainContainer.component.element as HTMLDivElement,\n slides: mainContainer.refs,\n previews: {\n left: previewLeft.element as HTMLElement,\n right: previewRight.element as HTMLElement,\n },\n controls: {\n prev: previousButton.element as HTMLButtonElement,\n next: nextButton.element as HTMLButtonElement,\n },\n },\n });\n};\n"],"names":["index","assets.image.background"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"frames.js","sources":["../../../../source/composite/carousel/wide/frames.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport * as Styles from '@universityofmaryland/web-styles-library';\nimport { theme } from '@universityofmaryland/web-utilities-library/theme';\nimport { assets } from 'atomic';\nimport { createControlButton } from './controls';\nimport { type CarouselWideProps } from '../_types';\nimport { type UMDElement } from '../../../_types';\n\nconst ASPECT_RATIO = '16 / 9';\n\nconst createSlideContent = ({\n slide,\n isThemeDark,\n}: {\n slide: CarouselWideProps['slides'][0];\n isThemeDark?: boolean;\n}) => {\n const children: UMDElement[] = [];\n\n let contentContainer: UMDElement | null = null;\n\n const closeButton = new ElementBuilder('button')\n .withClassName('umd-carousel-wide__slide-content-close')\n .withAttribute('type', 'button')\n .withAttribute('aria-label', 'Close content')\n .withHTML('×')\n .withStyles({\n element: {\n position: 'absolute',\n top: 0,\n right: 0,\n background: 'transparent',\n border: 'none',\n cursor: 'pointer',\n fontSize: '20px',\n fontWeight: 'bold',\n padding: token.spacing.min,\n lineHeight: 1,\n color: token.color.gray.dark,\n transition: 'color 0.2s ease',\n\n display: 'none',\n [`@media (${token.media.queries.desktop.min})`]: {\n display: 'block',\n },\n\n '&:hover, &:focus': {\n outline: `2px solid ${token.color.blue}`,\n },\n\n ...(isThemeDark && {\n color: token.color.gray.light,\n '&:hover': {\n color: token.color.white,\n },\n }),\n },\n })\n .withModifier((element) => {\n element.addEventListener('click', () => {\n if (contentContainer) {\n contentContainer.element.style.display = 'none';\n }\n });\n })\n .build();\n\n children.push(closeButton);\n\n if (slide.headline) {\n children.push(\n new ElementBuilder(slide.headline)\n .styled(\n Styles.typography.sans.compose('large', {\n theme: theme.fontColor(isThemeDark),\n }),\n )\n .withStyles({\n element: {\n ...(!isThemeDark && {\n color: `${token.color.black}`,\n }),\n },\n siblingAfter: {\n marginTop: token.spacing.sm,\n },\n })\n .build(),\n );\n }\n\n if (slide.text) {\n children.push(\n new ElementBuilder(slide.text)\n .styled(\n Styles.element.text.rich.composeSimple({\n theme: theme.fontColor(isThemeDark),\n }),\n )\n .build(),\n );\n }\n\n if (children.length === 1) return null;\n\n contentContainer = new ElementBuilder()\n .withClassName('umd-carousel-wide__slide-content')\n .withStyles({\n element: {\n backgroundColor: token.color.white,\n border: `1px solid ${token.color.gray.light}`,\n display: 'block',\n padding: token.spacing.md,\n width: '100%',\n position: 'relative',\n opacity: 0,\n transform: 'translateY(20px)',\n transition: 'opacity 0.6s ease-out, transform 0.6s ease-out',\n\n ...(isThemeDark && {\n backgroundColor: token.color.black,\n border: `1px solid ${token.color.gray.dark}`,\n }),\n\n borderTop: 'none',\n\n [`@media (${token.media.queries.desktop.min})`]: {\n border: 'none',\n boxShadow: '0 0 5px 0 rgba(0, 0, 0, 0.4)',\n maxWidth: '50%',\n position: 'absolute',\n bottom: token.spacing.sm,\n left: token.spacing.sm,\n\n ...(isThemeDark && {\n border: 'none',\n boxShadow: 'none',\n }),\n },\n },\n })\n .withChildren(...children)\n .build();\n\n return contentContainer;\n};\n\nconst createMainFrameSlide = (\n slide: CarouselWideProps['slides'][0],\n index: number,\n isThemeDark?: boolean,\n) => {\n const children: UMDElement[] = [];\n const slideContentWrapper = createSlideContent({ slide, isThemeDark });\n\n children.push(\n assets.image.background({\n element: slide.image,\n isScaled: true,\n imageLoading: 'lazy',\n }),\n );\n\n if (slideContentWrapper) {\n children.push(slideContentWrapper);\n }\n\n return new ElementBuilder('figure')\n .withClassName('umd-carousel-wide__slide')\n .withAttribute('data-index', `${index}`)\n .withStyles({\n element: {\n display: 'none',\n opacity: 0,\n transition: 'opacity 0.3s ease-in-out, transform 0.5s ease-in-out',\n aspectRatio: ASPECT_RATIO,\n\n [`@media (${token.media.queries.desktop.min})`]: {\n position: 'absolute',\n width: '100%',\n height: '100%',\n top: 0,\n left: 0,\n },\n\n '&[data-active=\"true\"]': {\n opacity: 1,\n transform: 'translateX(0)',\n zIndex: 2,\n display: 'block',\n },\n\n '&[data-animating=\"true\"]': {\n zIndex: 1,\n display: 'block',\n opacity: 1,\n position: 'absolute',\n width: '100%',\n top: 0,\n left: 0,\n },\n\n '&[data-direction=\"left\"]': {\n transform: 'translateX(-100%)',\n },\n\n '&[data-direction=\"right\"]': {\n transform: 'translateX(100%)',\n },\n\n '&[data-content-visible=\"true\"] .umd-carousel-wide__slide-content': {\n opacity: 1,\n transform: 'translateY(0)',\n },\n },\n })\n .withChildren(...children)\n .build();\n};\n\nconst createPreviewContainer = (position: 'left' | 'right') => {\n const isPositionLeft = position === 'left';\n return new ElementBuilder()\n .withClassName(\n isPositionLeft\n ? 'umd-carousel-wide__preview--left'\n : 'umd-carousel-wide__preview--right',\n )\n .withAttribute('aria-hidden', 'true')\n .withAttribute('role', 'presentation')\n .withStyles({\n element: {\n display: 'none',\n overflow: 'hidden',\n position: 'relative',\n\n [`@media (${token.media.queries.desktop.min})`]: {\n display: 'flex',\n alignItems: 'flex-end',\n height: '100%',\n },\n\n ['& > * ']: {\n position: 'absolute !important',\n bottom: '0 !important',\n left: '0 !important',\n width: 'auto !important',\n height: '75% !important',\n display: 'block !important',\n aspectRatio: ASPECT_RATIO,\n\n ...(isPositionLeft && {\n right: '0 !important',\n left: 'auto !important',\n }),\n\n ['&:before ']: {\n content: '\"\"',\n position: 'absolute',\n inset: 0,\n background: token.color.gray.darker,\n opacity: 0.5,\n zIndex: 1,\n },\n },\n },\n })\n .build();\n};\n\nconst createMainContainer = (\n slideElements: ReturnType<typeof createMainFrameSlide>[],\n) =>\n new ElementBuilder()\n .withClassName('umd-carousel-wide__main-container')\n .withStyles({\n element: {\n position: 'relative',\n overflow: 'hidden',\n },\n })\n .withChildren(...slideElements)\n .build();\n\nexport const createFramesContainer = (\n slides: CarouselWideProps['slides'],\n isThemeDark?: boolean,\n) => {\n const previewLeft = createPreviewContainer('left');\n const previewRight = createPreviewContainer('right');\n const previousButton = createControlButton('prev', isThemeDark);\n const nextButton = createControlButton('next', isThemeDark);\n const slideElements = slides.map((slide, index) =>\n createMainFrameSlide(slide, index, isThemeDark),\n );\n\n if (slideElements.length > 0) {\n slideElements[0].element.setAttribute('data-active', 'true');\n slideElements[0].element.setAttribute('data-content-visible', 'true');\n }\n\n const mainContainer = createMainContainer(slideElements);\n\n const model = new ElementBuilder()\n .withClassName('umd-carousel-wide__frames-container')\n .withStyles({\n element: {\n position: 'relative',\n width: '100%',\n padding: `0 ${token.spacing.md} 0`,\n\n [`@media (${token.media.queries.desktop.min})`]: {\n padding: `0 0 ${token.spacing.md}`,\n display: 'grid',\n gridTemplateColumns: '15vw 1fr 15vw',\n gridGap: token.spacing.lg,\n height: '56vw',\n maxHeight: '60vh',\n },\n\n [`@media (${token.media.queries.highDef.min})`]: {\n gridTemplateColumns: '20vw 1fr 20vw',\n },\n },\n })\n .withChildren(previewLeft, mainContainer, previewRight)\n .build();\n\n return {\n element: model.element,\n styles: model.styles,\n buttons: { prev: previousButton, next: nextButton },\n refs: {\n slidesContainer: mainContainer.element as HTMLDivElement,\n slides: slideElements.map((el) => el.element),\n previews: {\n left: previewLeft.element as HTMLElement,\n right: previewRight.element as HTMLElement,\n },\n controls: {\n prev: previousButton.element as HTMLButtonElement,\n next: nextButton.element as HTMLButtonElement,\n },\n },\n };\n};\n"],"names":["index","assets.image.background"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../source/composite/carousel/wide/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../source/composite/carousel/wide/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AA+OnD,eAAO,MAAM,2BAA2B,GAAI,OAAO,iBAAiB,kFA8CnE,CAAC"}
|
|
@@ -12,7 +12,7 @@ import "@universityofmaryland/web-icons-library/files";
|
|
|
12
12
|
import "@universityofmaryland/web-icons-library/brand";
|
|
13
13
|
import "@universityofmaryland/web-icons-library/arrows";
|
|
14
14
|
import "@universityofmaryland/web-utilities-library/performance";
|
|
15
|
-
import "
|
|
15
|
+
import "@universityofmaryland/web-utilities-library/styles";
|
|
16
16
|
import "../../../atomic/animations/brand/card-stack.js";
|
|
17
17
|
import { createImageBackground } from "../../../atomic/assets/image/background.js";
|
|
18
18
|
import "@universityofmaryland/web-styles-library";
|
|
@@ -21,10 +21,10 @@ import "@universityofmaryland/web-icons-library/location";
|
|
|
21
21
|
import "@universityofmaryland/web-icons-library/calendar";
|
|
22
22
|
import "@universityofmaryland/web-utilities-library/theme";
|
|
23
23
|
import "../../../atomic/layout/block/stacked.js";
|
|
24
|
-
import "../../../atomic/layout/overlay/modal.js";
|
|
25
24
|
import "../../../atomic/layout/person/columns.js";
|
|
26
25
|
import "@universityofmaryland/web-icons-library/social";
|
|
27
|
-
import "
|
|
26
|
+
import "@universityofmaryland/web-utilities-library/string";
|
|
27
|
+
import "@universityofmaryland/web-utilities-library/animation";
|
|
28
28
|
import "../../../atomic/text-lockup/small.js";
|
|
29
29
|
import { createContainer } from "./container.js";
|
|
30
30
|
const ANIMATION_TIME = 500;
|
|
@@ -161,13 +161,13 @@ const setupSliderControls = (refs, state) => {
|
|
|
161
161
|
const lastIndex = state.slides.length - 1;
|
|
162
162
|
refs.controls.prev.addEventListener("click", () => {
|
|
163
163
|
if (state.isAnimating) return;
|
|
164
|
-
const newIndex = state.currentIndex ===
|
|
165
|
-
animateSlides(refs, state, newIndex, "
|
|
164
|
+
const newIndex = state.currentIndex === 0 ? lastIndex : state.currentIndex - 1;
|
|
165
|
+
animateSlides(refs, state, newIndex, "reverse");
|
|
166
166
|
});
|
|
167
167
|
refs.controls.next.addEventListener("click", () => {
|
|
168
168
|
if (state.isAnimating) return;
|
|
169
|
-
const newIndex = state.currentIndex ===
|
|
170
|
-
animateSlides(refs, state, newIndex, "
|
|
169
|
+
const newIndex = state.currentIndex === lastIndex ? 0 : state.currentIndex + 1;
|
|
170
|
+
animateSlides(refs, state, newIndex, "advance");
|
|
171
171
|
});
|
|
172
172
|
};
|
|
173
173
|
const createCompositeCarouselWide = (props) => {
|
|
@@ -182,25 +182,17 @@ const createCompositeCarouselWide = (props) => {
|
|
|
182
182
|
const direction = state.currentIndex > index ? "reverse" : "advance";
|
|
183
183
|
animateSlides(refs, state, index, direction);
|
|
184
184
|
});
|
|
185
|
-
const
|
|
186
|
-
|
|
187
|
-
builder.withChild(container);
|
|
188
|
-
if (title) {
|
|
189
|
-
builder.withAttribute("title", title);
|
|
190
|
-
} else {
|
|
191
|
-
builder.withAttribute("title", "Animated Image Carousel");
|
|
192
|
-
}
|
|
193
|
-
builder.withStyles({
|
|
185
|
+
const carouselTitle = title || "Animated Image Carousel";
|
|
186
|
+
const composite = new ElementBuilder().withClassName("umd-carousel-wide").withAttribute("title", carouselTitle).withStyles({
|
|
194
187
|
element: {
|
|
195
|
-
|
|
188
|
+
containerType: "inline-size",
|
|
196
189
|
display: "block",
|
|
197
190
|
position: "relative",
|
|
198
191
|
[`@media (${token.media.queries.large.min})`]: {
|
|
199
192
|
paddingBottom: 0
|
|
200
193
|
}
|
|
201
194
|
}
|
|
202
|
-
});
|
|
203
|
-
const composite = builder.build();
|
|
195
|
+
}).withChild(container).build();
|
|
204
196
|
const refs = {
|
|
205
197
|
container: composite.element,
|
|
206
198
|
...container.refs
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../source/composite/carousel/wide/index.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport { assets } from 'atomic';\nimport { createContainer } from './container';\nimport { type CarouselWideProps } from '../_types';\n\ninterface CarouselState {\n currentIndex: number;\n isAnimating: boolean;\n slides: CarouselWideProps['slides'];\n}\n\ninterface CarouselRefs {\n container: HTMLElement;\n slidesContainer: HTMLDivElement;\n slides: HTMLElement[];\n previews: {\n left: HTMLElement;\n right: HTMLElement;\n };\n controls: {\n prev: HTMLButtonElement;\n next: HTMLButtonElement;\n };\n indicator: {\n element: HTMLElement;\n position: (index: number) => void;\n };\n info: HTMLParagraphElement;\n}\n\n// Constants\nconst ANIMATION_TIME: 500 = 500;\nconst PREVIEW_ANIMATION_TIME: 440 = 440; // 60ms faster than main animation\n\n// Pure animation functions\nconst getAdjacentIndices = (\n currentIndex: number,\n totalSlides: number,\n): { leftIndex: number; rightIndex: number } => {\n const lastIndex = totalSlides - 1;\n return {\n leftIndex: currentIndex === 0 ? lastIndex : currentIndex - 1,\n rightIndex: currentIndex === lastIndex ? 0 : currentIndex + 1,\n };\n};\n\nconst positionSlideOffScreen = (\n slide: HTMLElement,\n direction: 'left' | 'right',\n): void => {\n slide.setAttribute('data-direction', direction);\n slide.setAttribute('data-animating', 'true');\n slide.offsetHeight; // Force reflow\n};\n\nconst activateSlideTransition = (\n slide: HTMLElement,\n direction?: 'left' | 'right',\n): void => {\n if (direction) {\n slide.setAttribute('data-direction', direction);\n } else {\n slide.removeAttribute('data-direction');\n slide.setAttribute('data-active', 'true');\n }\n};\n\nconst cleanupSlideTransition = (slide: HTMLElement, isNew: boolean): void => {\n if (isNew) {\n slide.removeAttribute('data-animating');\n } else {\n slide.removeAttribute('data-active');\n slide.removeAttribute('data-direction');\n slide.removeAttribute('data-content-visible');\n }\n};\n\n// Pure preview functions\nconst createPreviewElement = (\n slide: CarouselWideProps['slides'][0],\n): HTMLElement => {\n const imageCopy = slide.image.cloneNode(true) as HTMLImageElement;\n const preview = assets.image.background({\n element: imageCopy,\n isScaled: true,\n imageLoading: 'lazy',\n });\n\n preview.element.style.transition = `transform ${PREVIEW_ANIMATION_TIME}ms ease-in-out`;\n return preview.element;\n};\n\nconst clearPreviewContainer = (container: HTMLElement): void => {\n while (container.firstChild) {\n container.removeChild(container.firstChild);\n }\n};\n\nconst appendPreviewWithAnimation = (\n container: HTMLElement,\n preview: HTMLElement,\n animationDirection: 'reverse' | 'advance',\n): void => {\n // Position off-screen initially based on animation direction\n // For advance (forward), new content comes from right\n // For reverse (backward), new content comes from left\n preview.style.transform =\n animationDirection === 'advance' ? 'translateX(100%)' : 'translateX(-100%)';\n\n container.appendChild(preview);\n\n // Trigger animation to slide in\n requestAnimationFrame(() => {\n preview.style.transform = 'translateX(0)';\n });\n};\n\nconst animatePreviewOut = (\n preview: HTMLElement,\n animationDirection: 'reverse' | 'advance',\n): Promise<void> => {\n return new Promise((resolve) => {\n // For advance (forward), old content exits to left\n // For reverse (backward), old content exits to right\n preview.style.transform =\n animationDirection === 'advance'\n ? 'translateX(-100%)'\n : 'translateX(100%)';\n\n setTimeout(() => {\n if (preview.parentNode) {\n preview.parentNode.removeChild(preview);\n }\n resolve();\n }, PREVIEW_ANIMATION_TIME);\n });\n};\n\n// State management\nconst updatePreviews = (\n refs: CarouselRefs,\n state: CarouselState,\n direction?: 'reverse' | 'advance',\n): void => {\n const { currentIndex, slides } = state;\n const { leftIndex, rightIndex } = getAdjacentIndices(\n currentIndex,\n slides.length,\n );\n\n // Handle left preview\n if (slides[leftIndex]) {\n const existingLeft = refs.previews.left.firstElementChild as HTMLElement;\n if (existingLeft && direction) {\n animatePreviewOut(existingLeft, direction);\n } else if (existingLeft) {\n clearPreviewContainer(refs.previews.left);\n }\n\n const leftPreview = createPreviewElement(slides[leftIndex]);\n if (direction) {\n appendPreviewWithAnimation(refs.previews.left, leftPreview, direction);\n } else {\n refs.previews.left.appendChild(leftPreview);\n }\n }\n\n // Handle right preview\n if (slides[rightIndex]) {\n const existingRight = refs.previews.right.firstElementChild as HTMLElement;\n if (existingRight && direction) {\n animatePreviewOut(existingRight, direction);\n } else if (existingRight) {\n clearPreviewContainer(refs.previews.right);\n }\n\n const rightPreview = createPreviewElement(slides[rightIndex]);\n if (direction) {\n appendPreviewWithAnimation(refs.previews.right, rightPreview, direction);\n } else {\n refs.previews.right.appendChild(rightPreview);\n }\n }\n};\n\nconst updateInfo = (refs: CarouselRefs, newIndex: number) => {\n refs.info.textContent = `Slide ${newIndex + 1} Selected`;\n};\n\nconst animateSlides = (\n refs: CarouselRefs,\n state: CarouselState,\n newIndex: number,\n direction: 'reverse' | 'advance',\n) => {\n if (state.isAnimating || state.currentIndex === newIndex) return;\n state.isAnimating = true;\n\n const currentSlide = refs.slides[state.currentIndex];\n const newSlide = refs.slides[newIndex];\n\n // Disable controls during animation\n refs.controls.prev.setAttribute('disabled', '');\n refs.controls.next.setAttribute('disabled', '');\n\n // Position new slide off-screen\n const newSlideDirection = direction === 'reverse' ? 'left' : 'right';\n positionSlideOffScreen(newSlide, newSlideDirection);\n\n // Update indicator position\n refs.indicator.position(newIndex);\n\n // Start synchronized animations for all frames\n requestAnimationFrame(() => {\n // Animate main slides\n activateSlideTransition(newSlide);\n const currentSlideDirection = direction === 'reverse' ? 'right' : 'left';\n activateSlideTransition(currentSlide, currentSlideDirection);\n\n // Update previews with animation (this will animate in sync)\n const nextState = { ...state, currentIndex: newIndex };\n updatePreviews(refs, nextState, direction);\n });\n\n // Clean up after animation\n setTimeout(() => {\n // Clean up main slides\n cleanupSlideTransition(currentSlide, false);\n cleanupSlideTransition(newSlide, true);\n\n // Show content with fade-in animation\n newSlide.setAttribute('data-content-visible', 'true');\n\n // Re-enable controls\n refs.controls.prev.removeAttribute('disabled');\n refs.controls.next.removeAttribute('disabled');\n\n // Update state\n state.currentIndex = newIndex;\n state.isAnimating = false;\n\n // Update accessibility info\n updateInfo(refs, newIndex);\n }, ANIMATION_TIME);\n};\n\nconst setupSliderControls = (refs: CarouselRefs, state: CarouselState) => {\n const lastIndex = state.slides.length - 1;\n\n refs.controls.prev.addEventListener('click', () => {\n if (state.isAnimating) return;\n\n const newIndex =\n state.currentIndex === lastIndex ? 0 : state.currentIndex + 1;\n animateSlides(refs, state, newIndex, 'advance');\n });\n\n refs.controls.next.addEventListener('click', () => {\n if (state.isAnimating) return;\n\n const newIndex =\n state.currentIndex === 0 ? lastIndex : state.currentIndex - 1;\n animateSlides(refs, state, newIndex, 'reverse');\n });\n};\n\n// Main component\nexport const createCompositeCarouselWide = (props: CarouselWideProps) => {\n const { title } = props;\n\n // Initialize state early\n const state: CarouselState = {\n currentIndex: 0,\n isAnimating: false,\n slides: props.slides,\n };\n\n const container = createContainer(props, (index: number) => {\n if (state.isAnimating || state.currentIndex === index) return;\n\n const direction = state.currentIndex > index ? 'reverse' : 'advance';\n animateSlides(refs, state, index, direction);\n });\n\n const builder = new ElementBuilder();\n\n builder.withClassName('umd-carousel-wide');\n builder.withChild(container);\n\n if (title) {\n builder.withAttribute('title', title);\n } else {\n builder.withAttribute('title', 'Animated Image Carousel');\n }\n\n builder.withStyles({\n element: {\n container: 'umd-carousel-wide / inline-size',\n display: 'block',\n position: 'relative',\n\n [`@media (${token.media.queries.large.min})`]: {\n paddingBottom: 0,\n },\n },\n });\n\n const composite = builder.build();\n\n // Initialize refs\n const refs: CarouselRefs = {\n container: composite.element,\n ...container.refs,\n };\n\n // Set up event handlers after DOM is ready\n requestAnimationFrame(() => {\n setupSliderControls(refs, state);\n updatePreviews(refs, state); // Initial preview setup without animation\n });\n\n return composite;\n};\n"],"names":["assets.image.background"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../source/composite/carousel/wide/index.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport { assets } from 'atomic';\nimport { createContainer } from './container';\nimport { type CarouselWideProps } from '../_types';\n\ninterface CarouselState {\n currentIndex: number;\n isAnimating: boolean;\n slides: CarouselWideProps['slides'];\n}\n\ninterface CarouselRefs {\n container: HTMLElement;\n slidesContainer: HTMLDivElement;\n slides: HTMLElement[];\n previews: {\n left: HTMLElement;\n right: HTMLElement;\n };\n controls: {\n prev: HTMLButtonElement;\n next: HTMLButtonElement;\n };\n indicator: {\n element: HTMLElement;\n position: (index: number) => void;\n };\n info: HTMLParagraphElement;\n}\n\nconst ANIMATION_TIME = 500;\nconst PREVIEW_ANIMATION_TIME = 440;\n\nconst getAdjacentIndices = (\n currentIndex: number,\n totalSlides: number,\n): { leftIndex: number; rightIndex: number } => {\n const lastIndex = totalSlides - 1;\n return {\n leftIndex: currentIndex === 0 ? lastIndex : currentIndex - 1,\n rightIndex: currentIndex === lastIndex ? 0 : currentIndex + 1,\n };\n};\n\nconst positionSlideOffScreen = (\n slide: HTMLElement,\n direction: 'left' | 'right',\n): void => {\n slide.setAttribute('data-direction', direction);\n slide.setAttribute('data-animating', 'true');\n slide.offsetHeight;\n};\n\nconst activateSlideTransition = (\n slide: HTMLElement,\n direction?: 'left' | 'right',\n): void => {\n if (direction) {\n slide.setAttribute('data-direction', direction);\n } else {\n slide.removeAttribute('data-direction');\n slide.setAttribute('data-active', 'true');\n }\n};\n\nconst cleanupSlideTransition = (slide: HTMLElement, isNew: boolean): void => {\n if (isNew) {\n slide.removeAttribute('data-animating');\n } else {\n slide.removeAttribute('data-active');\n slide.removeAttribute('data-direction');\n slide.removeAttribute('data-content-visible');\n }\n};\n\nconst createPreviewElement = (\n slide: CarouselWideProps['slides'][0],\n): HTMLElement => {\n const imageCopy = slide.image.cloneNode(true) as HTMLImageElement;\n const preview = assets.image.background({\n element: imageCopy,\n isScaled: true,\n imageLoading: 'lazy',\n });\n\n preview.element.style.transition = `transform ${PREVIEW_ANIMATION_TIME}ms ease-in-out`;\n return preview.element;\n};\n\nconst clearPreviewContainer = (container: HTMLElement): void => {\n while (container.firstChild) {\n container.removeChild(container.firstChild);\n }\n};\n\nconst appendPreviewWithAnimation = (\n container: HTMLElement,\n preview: HTMLElement,\n animationDirection: 'reverse' | 'advance',\n): void => {\n preview.style.transform =\n animationDirection === 'advance' ? 'translateX(100%)' : 'translateX(-100%)';\n\n container.appendChild(preview);\n\n requestAnimationFrame(() => {\n preview.style.transform = 'translateX(0)';\n });\n};\n\nconst animatePreviewOut = (\n preview: HTMLElement,\n animationDirection: 'reverse' | 'advance',\n): Promise<void> => {\n return new Promise((resolve) => {\n preview.style.transform =\n animationDirection === 'advance'\n ? 'translateX(-100%)'\n : 'translateX(100%)';\n\n setTimeout(() => {\n if (preview.parentNode) {\n preview.parentNode.removeChild(preview);\n }\n resolve();\n }, PREVIEW_ANIMATION_TIME);\n });\n};\n\nconst updatePreviews = (\n refs: CarouselRefs,\n state: CarouselState,\n direction?: 'reverse' | 'advance',\n): void => {\n const { currentIndex, slides } = state;\n const { leftIndex, rightIndex } = getAdjacentIndices(\n currentIndex,\n slides.length,\n );\n\n if (slides[leftIndex]) {\n const existingLeft = refs.previews.left.firstElementChild as HTMLElement;\n if (existingLeft && direction) {\n animatePreviewOut(existingLeft, direction);\n } else if (existingLeft) {\n clearPreviewContainer(refs.previews.left);\n }\n\n const leftPreview = createPreviewElement(slides[leftIndex]);\n if (direction) {\n appendPreviewWithAnimation(refs.previews.left, leftPreview, direction);\n } else {\n refs.previews.left.appendChild(leftPreview);\n }\n }\n\n if (slides[rightIndex]) {\n const existingRight = refs.previews.right.firstElementChild as HTMLElement;\n if (existingRight && direction) {\n animatePreviewOut(existingRight, direction);\n } else if (existingRight) {\n clearPreviewContainer(refs.previews.right);\n }\n\n const rightPreview = createPreviewElement(slides[rightIndex]);\n if (direction) {\n appendPreviewWithAnimation(refs.previews.right, rightPreview, direction);\n } else {\n refs.previews.right.appendChild(rightPreview);\n }\n }\n};\n\nconst updateInfo = (refs: CarouselRefs, newIndex: number) => {\n refs.info.textContent = `Slide ${newIndex + 1} Selected`;\n};\n\nconst animateSlides = (\n refs: CarouselRefs,\n state: CarouselState,\n newIndex: number,\n direction: 'reverse' | 'advance',\n) => {\n if (state.isAnimating || state.currentIndex === newIndex) return;\n state.isAnimating = true;\n\n const currentSlide = refs.slides[state.currentIndex];\n const newSlide = refs.slides[newIndex];\n\n refs.controls.prev.setAttribute('disabled', '');\n refs.controls.next.setAttribute('disabled', '');\n\n const newSlideDirection = direction === 'reverse' ? 'left' : 'right';\n positionSlideOffScreen(newSlide, newSlideDirection);\n\n refs.indicator.position(newIndex);\n\n requestAnimationFrame(() => {\n activateSlideTransition(newSlide);\n const currentSlideDirection = direction === 'reverse' ? 'right' : 'left';\n activateSlideTransition(currentSlide, currentSlideDirection);\n\n const nextState = { ...state, currentIndex: newIndex };\n updatePreviews(refs, nextState, direction);\n });\n\n setTimeout(() => {\n cleanupSlideTransition(currentSlide, false);\n cleanupSlideTransition(newSlide, true);\n\n newSlide.setAttribute('data-content-visible', 'true');\n\n refs.controls.prev.removeAttribute('disabled');\n refs.controls.next.removeAttribute('disabled');\n\n state.currentIndex = newIndex;\n state.isAnimating = false;\n\n updateInfo(refs, newIndex);\n }, ANIMATION_TIME);\n};\n\nconst setupSliderControls = (refs: CarouselRefs, state: CarouselState) => {\n const lastIndex = state.slides.length - 1;\n\n refs.controls.prev.addEventListener('click', () => {\n if (state.isAnimating) return;\n\n const newIndex =\n state.currentIndex === 0 ? lastIndex : state.currentIndex - 1;\n animateSlides(refs, state, newIndex, 'reverse');\n });\n\n refs.controls.next.addEventListener('click', () => {\n if (state.isAnimating) return;\n\n const newIndex =\n state.currentIndex === lastIndex ? 0 : state.currentIndex + 1;\n animateSlides(refs, state, newIndex, 'advance');\n });\n};\n\nexport const createCompositeCarouselWide = (props: CarouselWideProps) => {\n const { title } = props;\n\n const state: CarouselState = {\n currentIndex: 0,\n isAnimating: false,\n slides: props.slides,\n };\n\n const container = createContainer(props, (index: number) => {\n if (state.isAnimating || state.currentIndex === index) return;\n\n const direction = state.currentIndex > index ? 'reverse' : 'advance';\n animateSlides(refs, state, index, direction);\n });\n\n const carouselTitle = title || 'Animated Image Carousel';\n\n const composite = new ElementBuilder()\n .withClassName('umd-carousel-wide')\n .withAttribute('title', carouselTitle)\n .withStyles({\n element: {\n containerType: 'inline-size',\n display: 'block',\n position: 'relative',\n\n [`@media (${token.media.queries.large.min})`]: {\n paddingBottom: 0,\n },\n },\n })\n .withChild(container)\n .build();\n\n const refs: CarouselRefs = {\n container: composite.element,\n ...container.refs,\n };\n\n requestAnimationFrame(() => {\n setupSliderControls(refs, state);\n updatePreviews(refs, state);\n });\n\n return composite;\n};\n"],"names":["assets.image.background"],"mappings":"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"}
|
|
@@ -14,19 +14,18 @@ import "@universityofmaryland/web-icons-library/files";
|
|
|
14
14
|
import "@universityofmaryland/web-icons-library/brand";
|
|
15
15
|
import "@universityofmaryland/web-icons-library/arrows";
|
|
16
16
|
import "@universityofmaryland/web-utilities-library/performance";
|
|
17
|
-
import "../../../atomic/animations/brand/chevron-scroll.js";
|
|
18
17
|
import "../../../atomic/animations/brand/card-stack.js";
|
|
19
18
|
import { createImageBackground } from "../../../atomic/assets/image/background.js";
|
|
20
|
-
import { createVideoToggle } from "../../../atomic/assets/video/toggle.js";
|
|
21
19
|
import "@universityofmaryland/web-utilities-library/accessibility";
|
|
20
|
+
import { createVideoToggle } from "../../../atomic/assets/video/toggle.js";
|
|
22
21
|
import "@universityofmaryland/web-icons-library/location";
|
|
23
22
|
import "@universityofmaryland/web-icons-library/calendar";
|
|
24
23
|
import "@universityofmaryland/web-utilities-library/theme";
|
|
25
24
|
import "../../../atomic/layout/block/stacked.js";
|
|
26
|
-
import "../../../atomic/layout/overlay/modal.js";
|
|
27
25
|
import "../../../atomic/layout/person/columns.js";
|
|
28
26
|
import "@universityofmaryland/web-icons-library/social";
|
|
29
|
-
import "
|
|
27
|
+
import "@universityofmaryland/web-utilities-library/string";
|
|
28
|
+
import "@universityofmaryland/web-utilities-library/animation";
|
|
30
29
|
import "../../../atomic/text-lockup/small.js";
|
|
31
30
|
const ANIMATION_CONFIG = {
|
|
32
31
|
IMAGE_OVERLAY: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expand.js","sources":["../../../../source/composite/hero/custom/expand.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport * as Styles from '@universityofmaryland/web-styles-library';\nimport { withViewTimelineAnimation } from '@universityofmaryland/web-utilities-library/styles';\nimport { assets } from 'atomic';\nimport { type ElementModel, type ContentElement } from '../../../_types';\nimport { type HeroExpandProps as BaseHeroExpandProps } from '../_types';\n\ninterface HeroExpandProps extends BaseHeroExpandProps {\n eyebrow?: ContentElement;\n additional?: HTMLSlotElement | null;\n}\n\nconst ANIMATION_CONFIG = {\n IMAGE_OVERLAY: {\n NAME: 'img-overlay',\n RANGE: {\n START: '70vh',\n END: '100vh',\n },\n },\n IMAGE_SIZE: {\n NAME: 'img-size',\n INITIAL_HEIGHT: '50vh',\n FINAL_HEIGHT: '100vh',\n RANGE: {\n START: '40vh',\n END: '100vh',\n END_TABLET: '200vh',\n },\n },\n COMPONENT_SIZE: {\n NAME: 'component-size',\n NAME_TABLET: 'component-size-tablet',\n INITIAL_WIDTH: '10%',\n INITIAL_WIDTH_TABLET: '60%',\n FINAL_WIDTH: '100vw',\n RANGE: {\n START: '40vh',\n END: '100vh',\n START_TABLET: '60vh',\n END_TABLET: '200vh',\n },\n },\n} as const;\n\nconst keyFrameImgOverlay = `\n @keyframes ${ANIMATION_CONFIG.IMAGE_OVERLAY.NAME} {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n`;\n\nconst keyFrameImgSize = `\n @keyframes ${ANIMATION_CONFIG.IMAGE_SIZE.NAME} {\n from { height: ${ANIMATION_CONFIG.IMAGE_SIZE.INITIAL_HEIGHT}; }\n to { height: ${ANIMATION_CONFIG.IMAGE_SIZE.FINAL_HEIGHT}; }\n }\n`;\n\nconst keyFrameComponentSize = `\n @keyframes ${ANIMATION_CONFIG.COMPONENT_SIZE.NAME} {\n from { width: ${ANIMATION_CONFIG.COMPONENT_SIZE.INITIAL_WIDTH}; }\n to { width: ${ANIMATION_CONFIG.COMPONENT_SIZE.FINAL_WIDTH}; }\n }\n\n @keyframes ${ANIMATION_CONFIG.COMPONENT_SIZE.NAME_TABLET} {\n from { width: ${ANIMATION_CONFIG.COMPONENT_SIZE.INITIAL_WIDTH_TABLET}; }\n to { width: ${ANIMATION_CONFIG.COMPONENT_SIZE.FINAL_WIDTH}; }\n }\n`;\n\nconst createImageOverlay = () =>\n new ElementBuilder()\n .withClassName('hero-expand-image-overlay')\n .withStyles({\n element: {\n position: 'absolute',\n top: 0,\n left: 0,\n height: '100%',\n width: '100%',\n background: 'rgba(0,0,0,0.65)',\n opacity: 1,\n\n ...withViewTimelineAnimation({\n opacity: 0,\n animation: `${ANIMATION_CONFIG.IMAGE_OVERLAY.NAME} forwards`,\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_CONFIG.IMAGE_OVERLAY.RANGE.START,\n animationRangeEnd: ANIMATION_CONFIG.IMAGE_OVERLAY.RANGE.END,\n }),\n },\n })\n .build();\n\nconst createAssetElement = ({\n image,\n video,\n}: Pick<\n HeroExpandProps,\n 'image' | 'video'\n>): ElementModel<HTMLElement> | null => {\n if (video) {\n return assets.video.toggle({\n video,\n additionalElementStyles: {\n width: '100%',\n height: '100%',\n position: 'relative',\n overflow: 'hidden',\n\n [`& video`]: {\n height: '100%',\n width: '100%',\n objectFit: 'cover',\n },\n },\n });\n }\n if (image) {\n return assets.image.background({\n element: image,\n isScaled: true,\n isGifAllowed: true,\n isShowCaption: true,\n imageLoading: 'eager',\n imageFetchPriority: 'high',\n });\n }\n\n return null;\n};\n\nconst createImageSize = (props: Pick<HeroExpandProps, 'image' | 'video'>) => {\n const overlay = createImageOverlay();\n const asset = createAssetElement(props);\n\n const container = new ElementBuilder()\n .withClassName('hero-expand-image-size')\n .withStyles({\n element: {\n overflow: 'hidden',\n position: 'relative',\n height: '100%',\n width: '100%',\n\n ...withViewTimelineAnimation({\n height: ANIMATION_CONFIG.IMAGE_SIZE.INITIAL_HEIGHT,\n animation: `${ANIMATION_CONFIG.IMAGE_SIZE.NAME} ease-in-out forwards`,\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_CONFIG.IMAGE_SIZE.RANGE.START,\n animationRangeEnd: ANIMATION_CONFIG.IMAGE_SIZE.RANGE.END,\n\n [`@container (${token.media.queries.tablet.min})`]: {\n animationRangeEnd: ANIMATION_CONFIG.IMAGE_SIZE.RANGE.END_TABLET,\n },\n }),\n },\n });\n\n if (asset) {\n container.withChild(asset);\n }\n container.withChild(overlay);\n\n return container.build();\n};\n\nconst createAssetContainer = (\n props: Pick<HeroExpandProps, 'image' | 'video'>,\n) =>\n new ElementBuilder()\n .withClassName('hero-expand-image-container')\n .withChild(createImageSize(props))\n .withStyles({\n element: {\n position: 'absolute',\n top: 0,\n left: '50%',\n transform: 'translateX(-50%)',\n width: '100vw',\n height: '100%',\n overflow: 'clip',\n display: 'flex',\n alignItems: 'center',\n\n ...withViewTimelineAnimation({\n width: ANIMATION_CONFIG.COMPONENT_SIZE.INITIAL_WIDTH,\n position: 'absolute',\n top: 0,\n left: '50%',\n transform: 'translateX(-50%)',\n animation: `${ANIMATION_CONFIG.COMPONENT_SIZE.NAME} ease-in-out forwards`,\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_CONFIG.COMPONENT_SIZE.RANGE.START,\n animationRangeEnd: ANIMATION_CONFIG.COMPONENT_SIZE.RANGE.END,\n\n [`@container (${token.media.queries.tablet.min})`]: {\n width: ANIMATION_CONFIG.COMPONENT_SIZE.INITIAL_WIDTH_TABLET,\n animation: `${ANIMATION_CONFIG.COMPONENT_SIZE.NAME_TABLET} ease-in-out forwards`,\n animationTimeline: 'view()',\n animationRangeStart:\n ANIMATION_CONFIG.COMPONENT_SIZE.RANGE.START_TABLET,\n animationRangeEnd: ANIMATION_CONFIG.COMPONENT_SIZE.RANGE.END_TABLET,\n },\n }),\n },\n })\n .build();\n\nconst createEyebrow = (eyebrow?: HTMLElement | null) => {\n if (!eyebrow) return null;\n\n return new ElementBuilder(eyebrow)\n .styled(Styles.element.text.decoration.ribbon)\n .withStyles({\n siblingAfter: {\n marginTop: token.spacing.md,\n },\n })\n .build();\n};\n\nconst createHeadline = (headline?: HTMLElement | null) => {\n const characterCount = headline?.textContent?.trim().length || 0;\n const isOverwriteHeadline = characterCount > 30;\n\n if (!headline) return null;\n\n return new ElementBuilder(headline)\n .styled(Styles.typography.campaign.fonts.maximum)\n .withStyles({\n element: {\n color: token.color.white,\n fontWeight: 800,\n textTransform: 'uppercase',\n textWrap: 'balance',\n\n [`@container (${token.media.queries.desktop.min})`]: {\n ...(isOverwriteHeadline && {\n fontSize: '96px',\n }),\n },\n },\n })\n .build();\n};\n\nconst createTopTextChildren = ({\n eyebrow,\n headline,\n}: Pick<\n HeroExpandProps,\n 'eyebrow' | 'headline'\n>): ElementModel<HTMLElement>[] => {\n const children: ElementModel<HTMLElement>[] = [];\n\n const eyebrowElement = createEyebrow(eyebrow);\n if (eyebrowElement) {\n children.push(eyebrowElement);\n }\n\n const headlineElement = createHeadline(headline);\n if (headlineElement) {\n children.push(headlineElement);\n }\n\n return children;\n};\n\nconst createBottomTextChildren = ({\n actions,\n additional,\n}: Pick<\n HeroExpandProps,\n 'actions' | 'additional'\n>): ElementModel<HTMLElement>[] => {\n const children: ElementModel<HTMLElement>[] = [];\n\n if (actions) {\n const actionsContainer = new ElementBuilder()\n .withClassName('hero-expand-text-actions')\n .withChild(actions)\n .withStyles({\n siblingAfter: {\n marginTop: token.spacing.lg,\n },\n })\n .build();\n children.push(actionsContainer);\n }\n\n if (additional) {\n const additionalContainer = new ElementBuilder()\n .withClassName('hero-expand-text-additional')\n .withChild(additional)\n .build();\n children.push(additionalContainer);\n }\n\n return children;\n};\n\nconst createTextContainer = (\n props: Pick<\n HeroExpandProps,\n 'eyebrow' | 'headline' | 'actions' | 'additional'\n >,\n) => {\n const container = new ElementBuilder()\n .withClassName('hero-expand-text-container')\n .withStyles({\n element: {\n position: 'relative',\n height: '100%',\n zIndex: 9999,\n textAlign: 'center',\n padding: `${token.spacing.md} 0`,\n\n [`@container (${token.media.queries.tablet.min})`]: {\n padding: `${token.spacing['3xl']} 0`,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n },\n\n [`@container (${token.media.queries.highDef.min})`]: {\n padding: `${token.spacing['6xl']} 0`,\n },\n },\n });\n\n const topTextChildren = createTopTextChildren(props);\n if (topTextChildren.length > 0) {\n const topText = new ElementBuilder()\n .styled(Styles.layout.space.horizontal.normal)\n .withChildren(...topTextChildren)\n .withStyles({\n siblingAfter: {\n marginTop: token.spacing.lg,\n },\n })\n .build();\n container.withChild(topText);\n }\n\n const bottomTextChildren = createBottomTextChildren(props);\n if (bottomTextChildren.length > 0) {\n const bottomText = new ElementBuilder()\n .styled(Styles.layout.space.horizontal.normal)\n .withChildren(...bottomTextChildren)\n .withStyles({\n element: {\n width: '100%',\n },\n })\n .build();\n container.withChild(bottomText);\n }\n\n return container.build();\n};\n\nconst createSticky = (props: HeroExpandProps) => {\n const assetContainer = createAssetContainer(props);\n const textContainer = createTextContainer(props);\n\n return new ElementBuilder()\n .withClassName('hero-expand-sticky')\n .withChildren(assetContainer, textContainer)\n .withStyles({\n element: {\n position: 'relative',\n\n [`@container (${token.media.queries.tablet.min})`]: {\n ...withViewTimelineAnimation({\n position: 'sticky',\n top: 0,\n height: '100vh',\n }),\n },\n\n [`@supports (not (animation-timeline: view()))`]: {\n top: '0 !important',\n },\n },\n })\n .build();\n};\n\nexport const createCompositeHeroExpand = (props: HeroExpandProps) => {\n const sticky = createSticky(props);\n\n const composite = new ElementBuilder()\n .withClassName('umd-hero-expand')\n .withChild(sticky)\n .withStyles({\n element: {\n containerType: 'inline-size',\n ...withViewTimelineAnimation({\n position: 'relative',\n\n [`@container (${token.media.queries.tablet.min})`]: {\n height: '200vh',\n },\n }),\n\n ['& img, & video']: {\n display: 'block',\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n },\n },\n })\n .build();\n\n const setTopPosition = ({ value }: { value: string | null }) => {\n sticky.element.style.top = value || '0';\n };\n\n composite.styles += keyFrameImgOverlay;\n composite.styles += keyFrameImgSize;\n composite.styles += keyFrameComponentSize;\n\n return {\n ...composite,\n events: {\n setTopPosition,\n },\n };\n};\n"],"names":["assets.video.toggle","assets.image.background"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"expand.js","sources":["../../../../source/composite/hero/custom/expand.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport * as Styles from '@universityofmaryland/web-styles-library';\nimport { withViewTimelineAnimation } from '@universityofmaryland/web-utilities-library/styles';\nimport { assets } from 'atomic';\nimport { type ElementModel, type ContentElement } from '../../../_types';\nimport { type HeroExpandProps as BaseHeroExpandProps } from '../_types';\n\ninterface HeroExpandProps extends BaseHeroExpandProps {\n eyebrow?: ContentElement;\n additional?: HTMLSlotElement | null;\n}\n\nconst ANIMATION_CONFIG = {\n IMAGE_OVERLAY: {\n NAME: 'img-overlay',\n RANGE: {\n START: '70vh',\n END: '100vh',\n },\n },\n IMAGE_SIZE: {\n NAME: 'img-size',\n INITIAL_HEIGHT: '50vh',\n FINAL_HEIGHT: '100vh',\n RANGE: {\n START: '40vh',\n END: '100vh',\n END_TABLET: '200vh',\n },\n },\n COMPONENT_SIZE: {\n NAME: 'component-size',\n NAME_TABLET: 'component-size-tablet',\n INITIAL_WIDTH: '10%',\n INITIAL_WIDTH_TABLET: '60%',\n FINAL_WIDTH: '100vw',\n RANGE: {\n START: '40vh',\n END: '100vh',\n START_TABLET: '60vh',\n END_TABLET: '200vh',\n },\n },\n} as const;\n\nconst keyFrameImgOverlay = `\n @keyframes ${ANIMATION_CONFIG.IMAGE_OVERLAY.NAME} {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n`;\n\nconst keyFrameImgSize = `\n @keyframes ${ANIMATION_CONFIG.IMAGE_SIZE.NAME} {\n from { height: ${ANIMATION_CONFIG.IMAGE_SIZE.INITIAL_HEIGHT}; }\n to { height: ${ANIMATION_CONFIG.IMAGE_SIZE.FINAL_HEIGHT}; }\n }\n`;\n\nconst keyFrameComponentSize = `\n @keyframes ${ANIMATION_CONFIG.COMPONENT_SIZE.NAME} {\n from { width: ${ANIMATION_CONFIG.COMPONENT_SIZE.INITIAL_WIDTH}; }\n to { width: ${ANIMATION_CONFIG.COMPONENT_SIZE.FINAL_WIDTH}; }\n }\n\n @keyframes ${ANIMATION_CONFIG.COMPONENT_SIZE.NAME_TABLET} {\n from { width: ${ANIMATION_CONFIG.COMPONENT_SIZE.INITIAL_WIDTH_TABLET}; }\n to { width: ${ANIMATION_CONFIG.COMPONENT_SIZE.FINAL_WIDTH}; }\n }\n`;\n\nconst createImageOverlay = () =>\n new ElementBuilder()\n .withClassName('hero-expand-image-overlay')\n .withStyles({\n element: {\n position: 'absolute',\n top: 0,\n left: 0,\n height: '100%',\n width: '100%',\n background: 'rgba(0,0,0,0.65)',\n opacity: 1,\n\n ...withViewTimelineAnimation({\n opacity: 0,\n animation: `${ANIMATION_CONFIG.IMAGE_OVERLAY.NAME} forwards`,\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_CONFIG.IMAGE_OVERLAY.RANGE.START,\n animationRangeEnd: ANIMATION_CONFIG.IMAGE_OVERLAY.RANGE.END,\n }),\n },\n })\n .build();\n\nconst createAssetElement = ({\n image,\n video,\n}: Pick<\n HeroExpandProps,\n 'image' | 'video'\n>): ElementModel<HTMLElement> | null => {\n if (video) {\n return assets.video.toggle({\n video,\n additionalElementStyles: {\n width: '100%',\n height: '100%',\n position: 'relative',\n overflow: 'hidden',\n\n [`& video`]: {\n height: '100%',\n width: '100%',\n objectFit: 'cover',\n },\n },\n });\n }\n if (image) {\n return assets.image.background({\n element: image,\n isScaled: true,\n isGifAllowed: true,\n isShowCaption: true,\n imageLoading: 'eager',\n imageFetchPriority: 'high',\n });\n }\n\n return null;\n};\n\nconst createImageSize = (props: Pick<HeroExpandProps, 'image' | 'video'>) => {\n const overlay = createImageOverlay();\n const asset = createAssetElement(props);\n\n const container = new ElementBuilder()\n .withClassName('hero-expand-image-size')\n .withStyles({\n element: {\n overflow: 'hidden',\n position: 'relative',\n height: '100%',\n width: '100%',\n\n ...withViewTimelineAnimation({\n height: ANIMATION_CONFIG.IMAGE_SIZE.INITIAL_HEIGHT,\n animation: `${ANIMATION_CONFIG.IMAGE_SIZE.NAME} ease-in-out forwards`,\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_CONFIG.IMAGE_SIZE.RANGE.START,\n animationRangeEnd: ANIMATION_CONFIG.IMAGE_SIZE.RANGE.END,\n\n [`@container (${token.media.queries.tablet.min})`]: {\n animationRangeEnd: ANIMATION_CONFIG.IMAGE_SIZE.RANGE.END_TABLET,\n },\n }),\n },\n });\n\n if (asset) {\n container.withChild(asset);\n }\n container.withChild(overlay);\n\n return container.build();\n};\n\nconst createAssetContainer = (\n props: Pick<HeroExpandProps, 'image' | 'video'>,\n) =>\n new ElementBuilder()\n .withClassName('hero-expand-image-container')\n .withChild(createImageSize(props))\n .withStyles({\n element: {\n position: 'absolute',\n top: 0,\n left: '50%',\n transform: 'translateX(-50%)',\n width: '100vw',\n height: '100%',\n overflow: 'clip',\n display: 'flex',\n alignItems: 'center',\n\n ...withViewTimelineAnimation({\n width: ANIMATION_CONFIG.COMPONENT_SIZE.INITIAL_WIDTH,\n position: 'absolute',\n top: 0,\n left: '50%',\n transform: 'translateX(-50%)',\n animation: `${ANIMATION_CONFIG.COMPONENT_SIZE.NAME} ease-in-out forwards`,\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_CONFIG.COMPONENT_SIZE.RANGE.START,\n animationRangeEnd: ANIMATION_CONFIG.COMPONENT_SIZE.RANGE.END,\n\n [`@container (${token.media.queries.tablet.min})`]: {\n width: ANIMATION_CONFIG.COMPONENT_SIZE.INITIAL_WIDTH_TABLET,\n animation: `${ANIMATION_CONFIG.COMPONENT_SIZE.NAME_TABLET} ease-in-out forwards`,\n animationTimeline: 'view()',\n animationRangeStart:\n ANIMATION_CONFIG.COMPONENT_SIZE.RANGE.START_TABLET,\n animationRangeEnd: ANIMATION_CONFIG.COMPONENT_SIZE.RANGE.END_TABLET,\n },\n }),\n },\n })\n .build();\n\nconst createEyebrow = (eyebrow?: HTMLElement | null) => {\n if (!eyebrow) return null;\n\n return new ElementBuilder(eyebrow)\n .styled(Styles.element.text.decoration.ribbon)\n .withStyles({\n siblingAfter: {\n marginTop: token.spacing.md,\n },\n })\n .build();\n};\n\nconst createHeadline = (headline?: HTMLElement | null) => {\n const characterCount = headline?.textContent?.trim().length || 0;\n const isOverwriteHeadline = characterCount > 30;\n\n if (!headline) return null;\n\n return new ElementBuilder(headline)\n .styled(Styles.typography.campaign.fonts.maximum)\n .withStyles({\n element: {\n color: token.color.white,\n fontWeight: 800,\n textTransform: 'uppercase',\n textWrap: 'balance',\n\n [`@container (${token.media.queries.desktop.min})`]: {\n ...(isOverwriteHeadline && {\n fontSize: '96px',\n }),\n },\n },\n })\n .build();\n};\n\nconst createTopTextChildren = ({\n eyebrow,\n headline,\n}: Pick<\n HeroExpandProps,\n 'eyebrow' | 'headline'\n>): ElementModel<HTMLElement>[] => {\n const children: ElementModel<HTMLElement>[] = [];\n\n const eyebrowElement = createEyebrow(eyebrow);\n if (eyebrowElement) {\n children.push(eyebrowElement);\n }\n\n const headlineElement = createHeadline(headline);\n if (headlineElement) {\n children.push(headlineElement);\n }\n\n return children;\n};\n\nconst createBottomTextChildren = ({\n actions,\n additional,\n}: Pick<\n HeroExpandProps,\n 'actions' | 'additional'\n>): ElementModel<HTMLElement>[] => {\n const children: ElementModel<HTMLElement>[] = [];\n\n if (actions) {\n const actionsContainer = new ElementBuilder()\n .withClassName('hero-expand-text-actions')\n .withChild(actions)\n .withStyles({\n siblingAfter: {\n marginTop: token.spacing.lg,\n },\n })\n .build();\n children.push(actionsContainer);\n }\n\n if (additional) {\n const additionalContainer = new ElementBuilder()\n .withClassName('hero-expand-text-additional')\n .withChild(additional)\n .build();\n children.push(additionalContainer);\n }\n\n return children;\n};\n\nconst createTextContainer = (\n props: Pick<\n HeroExpandProps,\n 'eyebrow' | 'headline' | 'actions' | 'additional'\n >,\n) => {\n const container = new ElementBuilder()\n .withClassName('hero-expand-text-container')\n .withStyles({\n element: {\n position: 'relative',\n height: '100%',\n zIndex: 9999,\n textAlign: 'center',\n padding: `${token.spacing.md} 0`,\n\n [`@container (${token.media.queries.tablet.min})`]: {\n padding: `${token.spacing['3xl']} 0`,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n },\n\n [`@container (${token.media.queries.highDef.min})`]: {\n padding: `${token.spacing['6xl']} 0`,\n },\n },\n });\n\n const topTextChildren = createTopTextChildren(props);\n if (topTextChildren.length > 0) {\n const topText = new ElementBuilder()\n .styled(Styles.layout.space.horizontal.normal)\n .withChildren(...topTextChildren)\n .withStyles({\n siblingAfter: {\n marginTop: token.spacing.lg,\n },\n })\n .build();\n container.withChild(topText);\n }\n\n const bottomTextChildren = createBottomTextChildren(props);\n if (bottomTextChildren.length > 0) {\n const bottomText = new ElementBuilder()\n .styled(Styles.layout.space.horizontal.normal)\n .withChildren(...bottomTextChildren)\n .withStyles({\n element: {\n width: '100%',\n },\n })\n .build();\n container.withChild(bottomText);\n }\n\n return container.build();\n};\n\nconst createSticky = (props: HeroExpandProps) => {\n const assetContainer = createAssetContainer(props);\n const textContainer = createTextContainer(props);\n\n return new ElementBuilder()\n .withClassName('hero-expand-sticky')\n .withChildren(assetContainer, textContainer)\n .withStyles({\n element: {\n position: 'relative',\n\n [`@container (${token.media.queries.tablet.min})`]: {\n ...withViewTimelineAnimation({\n position: 'sticky',\n top: 0,\n height: '100vh',\n }),\n },\n\n [`@supports (not (animation-timeline: view()))`]: {\n top: '0 !important',\n },\n },\n })\n .build();\n};\n\nexport const createCompositeHeroExpand = (props: HeroExpandProps) => {\n const sticky = createSticky(props);\n\n const composite = new ElementBuilder()\n .withClassName('umd-hero-expand')\n .withChild(sticky)\n .withStyles({\n element: {\n containerType: 'inline-size',\n ...withViewTimelineAnimation({\n position: 'relative',\n\n [`@container (${token.media.queries.tablet.min})`]: {\n height: '200vh',\n },\n }),\n\n ['& img, & video']: {\n display: 'block',\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n },\n },\n })\n .build();\n\n const setTopPosition = ({ value }: { value: string | null }) => {\n sticky.element.style.top = value || '0';\n };\n\n composite.styles += keyFrameImgOverlay;\n composite.styles += keyFrameImgSize;\n composite.styles += keyFrameComponentSize;\n\n return {\n ...composite,\n events: {\n setTopPosition,\n },\n };\n};\n"],"names":["assets.video.toggle","assets.image.background"],"mappings":"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"}
|
|
@@ -15,7 +15,6 @@ import "@universityofmaryland/web-icons-library/files";
|
|
|
15
15
|
import "@universityofmaryland/web-icons-library/brand";
|
|
16
16
|
import "@universityofmaryland/web-icons-library/arrows";
|
|
17
17
|
import "@universityofmaryland/web-utilities-library/performance";
|
|
18
|
-
import "../../../atomic/animations/brand/chevron-scroll.js";
|
|
19
18
|
import "../../../atomic/animations/brand/card-stack.js";
|
|
20
19
|
import { createImageBackground } from "../../../atomic/assets/image/background.js";
|
|
21
20
|
import { createVideoObservedAutoPlay } from "../../../atomic/assets/video/observed-auto-play.js";
|
|
@@ -23,10 +22,10 @@ import "@universityofmaryland/web-icons-library/location";
|
|
|
23
22
|
import "@universityofmaryland/web-icons-library/calendar";
|
|
24
23
|
import "@universityofmaryland/web-utilities-library/theme";
|
|
25
24
|
import "../../../atomic/layout/block/stacked.js";
|
|
26
|
-
import "../../../atomic/layout/overlay/modal.js";
|
|
27
25
|
import "../../../atomic/layout/person/columns.js";
|
|
28
26
|
import "@universityofmaryland/web-icons-library/social";
|
|
29
|
-
import "
|
|
27
|
+
import "@universityofmaryland/web-utilities-library/string";
|
|
28
|
+
import "@universityofmaryland/web-utilities-library/animation";
|
|
30
29
|
import { createTextLockupLarge } from "../../../atomic/text-lockup/large.js";
|
|
31
30
|
import "../../../atomic/text-lockup/small.js";
|
|
32
31
|
const isPreferReducedMotion = isPreferredReducedMotion();
|