@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.
Files changed (198) hide show
  1. package/README.md +1 -1
  2. package/dist/atomic/animations/brand/card-stack.js +2 -3
  3. package/dist/atomic/animations/brand/card-stack.js.map +1 -1
  4. package/dist/atomic/animations/brand/chevron-flow.d.ts +1 -7
  5. package/dist/atomic/animations/brand/chevron-flow.d.ts.map +1 -1
  6. package/dist/atomic/animations/brand/chevron-flow.js +82 -159
  7. package/dist/atomic/animations/brand/chevron-flow.js.map +1 -1
  8. package/dist/atomic/animations/brand/chevron-scroll.d.ts +1 -4
  9. package/dist/atomic/animations/brand/chevron-scroll.d.ts.map +1 -1
  10. package/dist/atomic/animations/brand/chevron-scroll.js +89 -143
  11. package/dist/atomic/animations/brand/chevron-scroll.js.map +1 -1
  12. package/dist/atomic/assets/image/caption.d.ts +9 -0
  13. package/dist/atomic/assets/image/caption.d.ts.map +1 -0
  14. package/dist/atomic/assets/image/caption.js +166 -0
  15. package/dist/atomic/assets/image/caption.js.map +1 -0
  16. package/dist/atomic/assets/image/gif.d.ts.map +1 -1
  17. package/dist/atomic/assets/image/gif.js +6 -1
  18. package/dist/atomic/assets/image/gif.js.map +1 -1
  19. package/dist/atomic/assets/image/index.d.ts +1 -0
  20. package/dist/atomic/assets/image/index.d.ts.map +1 -1
  21. package/dist/atomic/assets/image/index.js +2 -0
  22. package/dist/atomic/assets/image/index.js.map +1 -1
  23. package/dist/atomic/assets/video/toggle.d.ts.map +1 -1
  24. package/dist/atomic/assets/video/toggle.js +9 -2
  25. package/dist/atomic/assets/video/toggle.js.map +1 -1
  26. package/dist/atomic/buttons/fullscreen.d.ts +1 -0
  27. package/dist/atomic/buttons/fullscreen.d.ts.map +1 -1
  28. package/dist/atomic/buttons/fullscreen.js +35 -3
  29. package/dist/atomic/buttons/fullscreen.js.map +1 -1
  30. package/dist/atomic/layout/overlay/modal.d.ts +1 -10
  31. package/dist/atomic/layout/overlay/modal.d.ts.map +1 -1
  32. package/dist/atomic/layout/overlay/modal.js +28 -44
  33. package/dist/atomic/layout/overlay/modal.js.map +1 -1
  34. package/dist/atomic/layout/person/columns.js +2 -3
  35. package/dist/atomic/layout/person/columns.js.map +1 -1
  36. package/dist/atomic/text-lockup/date.d.ts +1 -4
  37. package/dist/atomic/text-lockup/date.d.ts.map +1 -1
  38. package/dist/atomic/text-lockup/date.js +42 -75
  39. package/dist/atomic/text-lockup/date.js.map +1 -1
  40. package/dist/composite/accordion/item.d.ts +3 -16
  41. package/dist/composite/accordion/item.d.ts.map +1 -1
  42. package/dist/composite/accordion/item.js +152 -245
  43. package/dist/composite/accordion/item.js.map +1 -1
  44. package/dist/composite/card/block.js +2 -3
  45. package/dist/composite/card/block.js.map +1 -1
  46. package/dist/composite/card/event-time.js +2 -3
  47. package/dist/composite/card/event-time.js.map +1 -1
  48. package/dist/composite/card/list.js +2 -3
  49. package/dist/composite/card/list.js.map +1 -1
  50. package/dist/composite/card/overlay/color.js +3 -3
  51. package/dist/composite/card/overlay/icon.js +3 -3
  52. package/dist/composite/card/overlay/image.d.ts.map +1 -1
  53. package/dist/composite/card/overlay/image.js +9 -12
  54. package/dist/composite/card/overlay/image.js.map +1 -1
  55. package/dist/composite/card/video/block.js +4 -3
  56. package/dist/composite/card/video/block.js.map +1 -1
  57. package/dist/composite/carousel/cards/index.d.ts +1 -8
  58. package/dist/composite/carousel/cards/index.d.ts.map +1 -1
  59. package/dist/composite/carousel/cards/index.js +163 -282
  60. package/dist/composite/carousel/cards/index.js.map +1 -1
  61. package/dist/composite/carousel/default/index.d.ts +9 -15
  62. package/dist/composite/carousel/default/index.d.ts.map +1 -1
  63. package/dist/composite/carousel/default/index.js +78 -129
  64. package/dist/composite/carousel/default/index.js.map +1 -1
  65. package/dist/composite/carousel/elements/equal-width-items.d.ts +37 -0
  66. package/dist/composite/carousel/elements/equal-width-items.d.ts.map +1 -0
  67. package/dist/composite/carousel/elements/{blocks.js → equal-width-items.js} +157 -227
  68. package/dist/composite/carousel/elements/equal-width-items.js.map +1 -0
  69. package/dist/composite/carousel/elements/full-screen.d.ts +3 -2
  70. package/dist/composite/carousel/elements/full-screen.d.ts.map +1 -1
  71. package/dist/composite/carousel/elements/full-screen.js +34 -41
  72. package/dist/composite/carousel/elements/full-screen.js.map +1 -1
  73. package/dist/composite/carousel/elements/image.d.ts +15 -2
  74. package/dist/composite/carousel/elements/image.d.ts.map +1 -1
  75. package/dist/composite/carousel/elements/image.js +176 -151
  76. package/dist/composite/carousel/elements/image.js.map +1 -1
  77. package/dist/composite/carousel/elements/index.d.ts +4 -1
  78. package/dist/composite/carousel/elements/index.d.ts.map +1 -1
  79. package/dist/composite/carousel/elements/indicator-wrapper.d.ts +13 -0
  80. package/dist/composite/carousel/elements/indicator-wrapper.d.ts.map +1 -0
  81. package/dist/composite/carousel/elements/indicator-wrapper.js +67 -0
  82. package/dist/composite/carousel/elements/indicator-wrapper.js.map +1 -0
  83. package/dist/composite/carousel/elements/nav-button.d.ts +82 -0
  84. package/dist/composite/carousel/elements/nav-button.d.ts.map +1 -0
  85. package/dist/composite/carousel/elements/nav-button.js +164 -0
  86. package/dist/composite/carousel/elements/nav-button.js.map +1 -0
  87. package/dist/composite/carousel/elements/overlay.d.ts +3 -2
  88. package/dist/composite/carousel/elements/overlay.d.ts.map +1 -1
  89. package/dist/composite/carousel/elements/overlay.js +85 -55
  90. package/dist/composite/carousel/elements/overlay.js.map +1 -1
  91. package/dist/composite/carousel/image/multiple.d.ts +2 -7
  92. package/dist/composite/carousel/image/multiple.d.ts.map +1 -1
  93. package/dist/composite/carousel/image/multiple.js +85 -150
  94. package/dist/composite/carousel/image/multiple.js.map +1 -1
  95. package/dist/composite/carousel/image/standard.d.ts +2 -7
  96. package/dist/composite/carousel/image/standard.d.ts.map +1 -1
  97. package/dist/composite/carousel/image/standard.js +148 -262
  98. package/dist/composite/carousel/image/standard.js.map +1 -1
  99. package/dist/composite/carousel/thumbnail/index.d.ts +1 -8
  100. package/dist/composite/carousel/thumbnail/index.d.ts.map +1 -1
  101. package/dist/composite/carousel/thumbnail/index.js +72 -113
  102. package/dist/composite/carousel/thumbnail/index.js.map +1 -1
  103. package/dist/composite/carousel/wide/container.d.ts +21 -20
  104. package/dist/composite/carousel/wide/container.d.ts.map +1 -1
  105. package/dist/composite/carousel/wide/container.js +37 -12
  106. package/dist/composite/carousel/wide/container.js.map +1 -1
  107. package/dist/composite/carousel/wide/controls.d.ts +5 -10
  108. package/dist/composite/carousel/wide/controls.d.ts.map +1 -1
  109. package/dist/composite/carousel/wide/controls.js +24 -94
  110. package/dist/composite/carousel/wide/controls.js.map +1 -1
  111. package/dist/composite/carousel/wide/frames.d.ts +18 -10
  112. package/dist/composite/carousel/wide/frames.d.ts.map +1 -1
  113. package/dist/composite/carousel/wide/frames.js +60 -78
  114. package/dist/composite/carousel/wide/frames.js.map +1 -1
  115. package/dist/composite/carousel/wide/index.d.ts.map +1 -1
  116. package/dist/composite/carousel/wide/index.js +11 -19
  117. package/dist/composite/carousel/wide/index.js.map +1 -1
  118. package/dist/composite/hero/custom/expand.js +3 -4
  119. package/dist/composite/hero/custom/expand.js.map +1 -1
  120. package/dist/composite/hero/custom/grid.js +2 -3
  121. package/dist/composite/hero/custom/grid.js.map +1 -1
  122. package/dist/composite/hero/custom/video-arrow.js +4 -3
  123. package/dist/composite/hero/custom/video-arrow.js.map +1 -1
  124. package/dist/composite/hero/logo.js +3 -3
  125. package/dist/composite/hero/minimal.js +3 -3
  126. package/dist/composite/hero/overlay.js +5 -4
  127. package/dist/composite/hero/overlay.js.map +1 -1
  128. package/dist/composite/hero/stacked.js +3 -3
  129. package/dist/composite/hero/standard.js +4 -3
  130. package/dist/composite/hero/standard.js.map +1 -1
  131. package/dist/composite/layout/box/logo.d.ts +1 -4
  132. package/dist/composite/layout/box/logo.d.ts.map +1 -1
  133. package/dist/composite/layout/box/logo.js +55 -103
  134. package/dist/composite/layout/box/logo.js.map +1 -1
  135. package/dist/composite/layout/image/expand.d.ts +1 -4
  136. package/dist/composite/layout/image/expand.d.ts.map +1 -1
  137. package/dist/composite/layout/image/expand.js +136 -243
  138. package/dist/composite/layout/image/expand.js.map +1 -1
  139. package/dist/composite/layout/scroll-top/index.d.ts +1 -7
  140. package/dist/composite/layout/scroll-top/index.d.ts.map +1 -1
  141. package/dist/composite/layout/scroll-top/index.js +65 -77
  142. package/dist/composite/layout/scroll-top/index.js.map +1 -1
  143. package/dist/composite/layout/sticky-columns/index.d.ts +2 -2
  144. package/dist/composite/layout/sticky-columns/index.d.ts.map +1 -1
  145. package/dist/composite/layout/sticky-columns/index.js +42 -70
  146. package/dist/composite/layout/sticky-columns/index.js.map +1 -1
  147. package/dist/composite/media/elements/gif.js +3 -3
  148. package/dist/composite/media/inline/caption.d.ts +4 -2
  149. package/dist/composite/media/inline/caption.d.ts.map +1 -1
  150. package/dist/composite/media/inline/caption.js +56 -67
  151. package/dist/composite/media/inline/caption.js.map +1 -1
  152. package/dist/composite/media/inline/index.d.ts +9 -8
  153. package/dist/composite/media/inline/index.d.ts.map +1 -1
  154. package/dist/composite/media/inline/standard.d.ts +1 -4
  155. package/dist/composite/media/inline/standard.d.ts.map +1 -1
  156. package/dist/composite/media/inline/standard.js +16 -24
  157. package/dist/composite/media/inline/standard.js.map +1 -1
  158. package/dist/composite/media/inline/wrapped.d.ts +4 -2
  159. package/dist/composite/media/inline/wrapped.d.ts.map +1 -1
  160. package/dist/composite/media/inline/wrapped.js +80 -83
  161. package/dist/composite/media/inline/wrapped.js.map +1 -1
  162. package/dist/composite/navigation/elements/slider/slide-first.d.ts.map +1 -1
  163. package/dist/composite/navigation/elements/slider/slide-first.js +4 -1
  164. package/dist/composite/navigation/elements/slider/slide-first.js.map +1 -1
  165. package/dist/composite/navigation/utility/alert.js +3 -4
  166. package/dist/composite/navigation/utility/alert.js.map +1 -1
  167. package/dist/composite/pathway/_common.js +4 -3
  168. package/dist/composite/pathway/_common.js.map +1 -1
  169. package/dist/composite/pathway/hero.js +3 -3
  170. package/dist/composite/person/bio/full.js +3 -3
  171. package/dist/composite/person/bio/small.js +2 -3
  172. package/dist/composite/person/bio/small.js.map +1 -1
  173. package/dist/composite/person/block.js +2 -3
  174. package/dist/composite/person/block.js.map +1 -1
  175. package/dist/composite/person/hero.js +3 -3
  176. package/dist/composite/person/list.js +2 -3
  177. package/dist/composite/person/list.js.map +1 -1
  178. package/dist/composite/person/tabular.js +2 -3
  179. package/dist/composite/person/tabular.js.map +1 -1
  180. package/dist/composite/slider/events.d.ts +6 -12
  181. package/dist/composite/slider/events.d.ts.map +1 -1
  182. package/dist/composite/slider/events.js +304 -428
  183. package/dist/composite/slider/events.js.map +1 -1
  184. package/dist/layout/image.d.ts +5 -10
  185. package/dist/layout/image.d.ts.map +1 -1
  186. package/dist/layout/image.js +27 -88
  187. package/dist/layout/image.js.map +1 -1
  188. package/dist/layout/index.d.ts +1 -1
  189. package/dist/layout/index.d.ts.map +1 -1
  190. package/dist/layout.js +2 -2
  191. package/package.json +5 -5
  192. package/dist/composite/carousel/elements/blocks.d.ts +0 -42
  193. package/dist/composite/carousel/elements/blocks.d.ts.map +0 -1
  194. package/dist/composite/carousel/elements/blocks.js.map +0 -1
  195. package/dist/composite/carousel/wide/_elementModel.d.ts +0 -18
  196. package/dist/composite/carousel/wide/_elementModel.d.ts.map +0 -1
  197. package/dist/composite/carousel/wide/_elementModel.js +0 -29
  198. 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 "../../../atomic/animations/brand/chevron-scroll.js";
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 "../../../atomic/text-lockup/date.js";
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
- [`@media (${token.media.queries.large.max})`]: {
53
- display: "none"
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((el) => {
66
- el.addEventListener("click", () => {
67
- if (contentContainer) contentContainer.element.style.display = "none";
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
- [`@media (${token.media.queries.large.max})`]: {
115
- borderTop: "none"
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) children.push(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.tablet.min})`]: {
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
- [`@media (${token.media.queries.large.max})`]: {
169
- position: "absolute",
170
- width: "100%",
171
- top: 0,
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.tablet.min})`]: {
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
- top: "0",
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 = (slides, isThemeDark) => {
230
- const slideElements = slides.map((slide, index) => {
231
- return createMainFrameSlide(slide, index, isThemeDark);
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
- return {
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 mainContainer = createMainContainer(slides, isThemeDark);
253
- return createElementWithRefs({
254
- className: "umd-carousel-wide__frames-container",
255
- children: [
256
- previewLeft,
257
- mainContainer.component,
258
- previewRight,
259
- previousButton,
260
- nextButton
261
- ],
262
- elementStyles: {
263
- element: {
264
- position: "relative",
265
- [`@media (${token.media.queries.large.max})`]: {
266
- padding: `0 ${token.spacing.md}`
267
- },
268
- [`@media (${token.media.queries.tablet.min})`]: {
269
- display: "grid",
270
- gridTemplateColumns: "10vw 1fr 10vw",
271
- gridGap: token.spacing.md,
272
- height: "56vw",
273
- maxHeight: "60vh"
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.component.element,
286
- slides: mainContainer.refs,
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;AAwQnD,eAAO,MAAM,2BAA2B,GAAI,OAAO,iBAAiB,kFAuDnE,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 "../../../atomic/animations/brand/chevron-scroll.js";
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 "../../../atomic/text-lockup/date.js";
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 === lastIndex ? 0 : state.currentIndex + 1;
165
- animateSlides(refs, state, newIndex, "advance");
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 === 0 ? lastIndex : state.currentIndex - 1;
170
- animateSlides(refs, state, newIndex, "reverse");
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 builder = new ElementBuilder();
186
- builder.withClassName("umd-carousel-wide");
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
- container: "umd-carousel-wide / inline-size",
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 "../../../atomic/text-lockup/date.js";
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,MAAM,mBAAmB;AAAA,EACvB,eAAe;AAAA,IACb,MAAM;AAAA,IACN,OAAO;AAAA,MACL,OAAO;AAAA,MACP,KAAK;AAAA,IAAA;AAAA,EACP;AAAA,EAEF,YAAY;AAAA,IACV,MAAM;AAAA,IACN,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,OAAO;AAAA,MACL,OAAO;AAAA,MACP,KAAK;AAAA,MACL,YAAY;AAAA,IAAA;AAAA,EACd;AAAA,EAEF,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,aAAa;AAAA,IACb,eAAe;AAAA,IACf,sBAAsB;AAAA,IACtB,aAAa;AAAA,IACb,OAAO;AAAA,MACL,OAAO;AAAA,MACP,KAAK;AAAA,MACL,cAAc;AAAA,MACd,YAAY;AAAA,IAAA;AAAA,EACd;AAEJ;AAEA,MAAM,qBAAqB;AAAA,eACZ,iBAAiB,cAAc,IAAI;AAAA;AAAA;AAAA;AAAA;AAMlD,MAAM,kBAAkB;AAAA,eACT,iBAAiB,WAAW,IAAI;AAAA,qBAC1B,iBAAiB,WAAW,cAAc;AAAA,mBAC5C,iBAAiB,WAAW,YAAY;AAAA;AAAA;AAI3D,MAAM,wBAAwB;AAAA,eACf,iBAAiB,eAAe,IAAI;AAAA,oBAC/B,iBAAiB,eAAe,aAAa;AAAA,kBAC/C,iBAAiB,eAAe,WAAW;AAAA;AAAA;AAAA,eAG9C,iBAAiB,eAAe,WAAW;AAAA,oBACtC,iBAAiB,eAAe,oBAAoB;AAAA,kBACtD,iBAAiB,eAAe,WAAW;AAAA;AAAA;AAI7D,MAAM,qBAAqB,MACzB,IAAI,eAAA,EACD,cAAc,2BAA2B,EACzC,WAAW;AAAA,EACV,SAAS;AAAA,IACP,UAAU;AAAA,IACV,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,SAAS;AAAA,IAET,GAAG,0BAA0B;AAAA,MAC3B,SAAS;AAAA,MACT,WAAW,GAAG,iBAAiB,cAAc,IAAI;AAAA,MACjD,mBAAmB;AAAA,MACnB,qBAAqB,iBAAiB,cAAc,MAAM;AAAA,MAC1D,mBAAmB,iBAAiB,cAAc,MAAM;AAAA,IAAA,CACzD;AAAA,EAAA;AAEL,CAAC,EACA,MAAA;AAEL,MAAM,qBAAqB,CAAC;AAAA,EAC1B;AAAA,EACA;AACF,MAGwC;AACtC,MAAI,OAAO;AACT,WAAOA,kBAAoB;AAAA,MACzB;AAAA,MACA,yBAAyB;AAAA,QACvB,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU;AAAA,QAEV,CAAC,SAAS,GAAG;AAAA,UACX,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,WAAW;AAAA,QAAA;AAAA,MACb;AAAA,IACF,CACD;AAAA,EACH;AACA,MAAI,OAAO;AACT,WAAOC,sBAAwB;AAAA,MAC7B,SAAS;AAAA,MACT,UAAU;AAAA,MACV,cAAc;AAAA,MACd,eAAe;AAAA,MACf,cAAc;AAAA,MACd,oBAAoB;AAAA,IAAA,CACrB;AAAA,EACH;AAEA,SAAO;AACT;AAEA,MAAM,kBAAkB,CAAC,UAAoD;AAC3E,QAAM,UAAU,mBAAA;AAChB,QAAM,QAAQ,mBAAmB,KAAK;AAEtC,QAAM,YAAY,IAAI,eAAA,EACnB,cAAc,wBAAwB,EACtC,WAAW;AAAA,IACV,SAAS;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,OAAO;AAAA,MAEP,GAAG,0BAA0B;AAAA,QAC3B,QAAQ,iBAAiB,WAAW;AAAA,QACpC,WAAW,GAAG,iBAAiB,WAAW,IAAI;AAAA,QAC9C,mBAAmB;AAAA,QACnB,qBAAqB,iBAAiB,WAAW,MAAM;AAAA,QACvD,mBAAmB,iBAAiB,WAAW,MAAM;AAAA,QAErD,CAAC,eAAe,MAAM,MAAM,QAAQ,OAAO,GAAG,GAAG,GAAG;AAAA,UAClD,mBAAmB,iBAAiB,WAAW,MAAM;AAAA,QAAA;AAAA,MACvD,CACD;AAAA,IAAA;AAAA,EACH,CACD;AAEH,MAAI,OAAO;AACT,cAAU,UAAU,KAAK;AAAA,EAC3B;AACA,YAAU,UAAU,OAAO;AAE3B,SAAO,UAAU,MAAA;AACnB;AAEA,MAAM,uBAAuB,CAC3B,UAEA,IAAI,iBACD,cAAc,6BAA6B,EAC3C,UAAU,gBAAgB,KAAK,CAAC,EAChC,WAAW;AAAA,EACV,SAAS;AAAA,IACP,UAAU;AAAA,IACV,KAAK;AAAA,IACL,MAAM;AAAA,IACN,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,YAAY;AAAA,IAEZ,GAAG,0BAA0B;AAAA,MAC3B,OAAO,iBAAiB,eAAe;AAAA,MACvC,UAAU;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,MACN,WAAW;AAAA,MACX,WAAW,GAAG,iBAAiB,eAAe,IAAI;AAAA,MAClD,mBAAmB;AAAA,MACnB,qBAAqB,iBAAiB,eAAe,MAAM;AAAA,MAC3D,mBAAmB,iBAAiB,eAAe,MAAM;AAAA,MAEzD,CAAC,eAAe,MAAM,MAAM,QAAQ,OAAO,GAAG,GAAG,GAAG;AAAA,QAClD,OAAO,iBAAiB,eAAe;AAAA,QACvC,WAAW,GAAG,iBAAiB,eAAe,WAAW;AAAA,QACzD,mBAAmB;AAAA,QACnB,qBACE,iBAAiB,eAAe,MAAM;AAAA,QACxC,mBAAmB,iBAAiB,eAAe,MAAM;AAAA,MAAA;AAAA,IAC3D,CACD;AAAA,EAAA;AAEL,CAAC,EACA,MAAA;AAEL,MAAM,gBAAgB,CAAC,YAAiC;AACtD,MAAI,CAAC,QAAS,QAAO;AAErB,SAAO,IAAI,eAAe,OAAO,EAC9B,OAAO,OAAO,QAAQ,KAAK,WAAW,MAAM,EAC5C,WAAW;AAAA,IACV,cAAc;AAAA,MACZ,WAAW,MAAM,QAAQ;AAAA,IAAA;AAAA,EAC3B,CACD,EACA,MAAA;AACL;AAEA,MAAM,iBAAiB,CAAC,aAAkC;AACxD,QAAM,iBAAiB,UAAU,aAAa,KAAA,EAAO,UAAU;AAC/D,QAAM,sBAAsB,iBAAiB;AAE7C,MAAI,CAAC,SAAU,QAAO;AAEtB,SAAO,IAAI,eAAe,QAAQ,EAC/B,OAAO,OAAO,WAAW,SAAS,MAAM,OAAO,EAC/C,WAAW;AAAA,IACV,SAAS;AAAA,MACP,OAAO,MAAM,MAAM;AAAA,MACnB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,UAAU;AAAA,MAEV,CAAC,eAAe,MAAM,MAAM,QAAQ,QAAQ,GAAG,GAAG,GAAG;AAAA,QACnD,GAAI,uBAAuB;AAAA,UACzB,UAAU;AAAA,QAAA;AAAA,MACZ;AAAA,IACF;AAAA,EACF,CACD,EACA,MAAA;AACL;AAEA,MAAM,wBAAwB,CAAC;AAAA,EAC7B;AAAA,EACA;AACF,MAGmC;AACjC,QAAM,WAAwC,CAAA;AAE9C,QAAM,iBAAiB,cAAc,OAAO;AAC5C,MAAI,gBAAgB;AAClB,aAAS,KAAK,cAAc;AAAA,EAC9B;AAEA,QAAM,kBAAkB,eAAe,QAAQ;AAC/C,MAAI,iBAAiB;AACnB,aAAS,KAAK,eAAe;AAAA,EAC/B;AAEA,SAAO;AACT;AAEA,MAAM,2BAA2B,CAAC;AAAA,EAChC;AAAA,EACA;AACF,MAGmC;AACjC,QAAM,WAAwC,CAAA;AAE9C,MAAI,SAAS;AACX,UAAM,mBAAmB,IAAI,eAAA,EAC1B,cAAc,0BAA0B,EACxC,UAAU,OAAO,EACjB,WAAW;AAAA,MACV,cAAc;AAAA,QACZ,WAAW,MAAM,QAAQ;AAAA,MAAA;AAAA,IAC3B,CACD,EACA,MAAA;AACH,aAAS,KAAK,gBAAgB;AAAA,EAChC;AAEA,MAAI,YAAY;AACd,UAAM,sBAAsB,IAAI,eAAA,EAC7B,cAAc,6BAA6B,EAC3C,UAAU,UAAU,EACpB,MAAA;AACH,aAAS,KAAK,mBAAmB;AAAA,EACnC;AAEA,SAAO;AACT;AAEA,MAAM,sBAAsB,CAC1B,UAIG;AACH,QAAM,YAAY,IAAI,eAAA,EACnB,cAAc,4BAA4B,EAC1C,WAAW;AAAA,IACV,SAAS;AAAA,MACP,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,SAAS,GAAG,MAAM,QAAQ,EAAE;AAAA,MAE5B,CAAC,eAAe,MAAM,MAAM,QAAQ,OAAO,GAAG,GAAG,GAAG;AAAA,QAClD,SAAS,GAAG,MAAM,QAAQ,KAAK,CAAC;AAAA,QAChC,SAAS;AAAA,QACT,eAAe;AAAA,QACf,gBAAgB;AAAA,MAAA;AAAA,MAGlB,CAAC,eAAe,MAAM,MAAM,QAAQ,QAAQ,GAAG,GAAG,GAAG;AAAA,QACnD,SAAS,GAAG,MAAM,QAAQ,KAAK,CAAC;AAAA,MAAA;AAAA,IAClC;AAAA,EACF,CACD;AAEH,QAAM,kBAAkB,sBAAsB,KAAK;AACnD,MAAI,gBAAgB,SAAS,GAAG;AAC9B,UAAM,UAAU,IAAI,eAAA,EACjB,OAAO,OAAO,OAAO,MAAM,WAAW,MAAM,EAC5C,aAAa,GAAG,eAAe,EAC/B,WAAW;AAAA,MACV,cAAc;AAAA,QACZ,WAAW,MAAM,QAAQ;AAAA,MAAA;AAAA,IAC3B,CACD,EACA,MAAA;AACH,cAAU,UAAU,OAAO;AAAA,EAC7B;AAEA,QAAM,qBAAqB,yBAAyB,KAAK;AACzD,MAAI,mBAAmB,SAAS,GAAG;AACjC,UAAM,aAAa,IAAI,eAAA,EACpB,OAAO,OAAO,OAAO,MAAM,WAAW,MAAM,EAC5C,aAAa,GAAG,kBAAkB,EAClC,WAAW;AAAA,MACV,SAAS;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,IACT,CACD,EACA,MAAA;AACH,cAAU,UAAU,UAAU;AAAA,EAChC;AAEA,SAAO,UAAU,MAAA;AACnB;AAEA,MAAM,eAAe,CAAC,UAA2B;AAC/C,QAAM,iBAAiB,qBAAqB,KAAK;AACjD,QAAM,gBAAgB,oBAAoB,KAAK;AAE/C,SAAO,IAAI,iBACR,cAAc,oBAAoB,EAClC,aAAa,gBAAgB,aAAa,EAC1C,WAAW;AAAA,IACV,SAAS;AAAA,MACP,UAAU;AAAA,MAEV,CAAC,eAAe,MAAM,MAAM,QAAQ,OAAO,GAAG,GAAG,GAAG;AAAA,QAClD,GAAG,0BAA0B;AAAA,UAC3B,UAAU;AAAA,UACV,KAAK;AAAA,UACL,QAAQ;AAAA,QAAA,CACT;AAAA,MAAA;AAAA,MAGH,CAAC,8CAA8C,GAAG;AAAA,QAChD,KAAK;AAAA,MAAA;AAAA,IACP;AAAA,EACF,CACD,EACA,MAAA;AACL;AAEO,MAAM,4BAA4B,CAAC,UAA2B;AACnE,QAAM,SAAS,aAAa,KAAK;AAEjC,QAAM,YAAY,IAAI,eAAA,EACnB,cAAc,iBAAiB,EAC/B,UAAU,MAAM,EAChB,WAAW;AAAA,IACV,SAAS;AAAA,MACP,eAAe;AAAA,MACf,GAAG,0BAA0B;AAAA,QAC3B,UAAU;AAAA,QAEV,CAAC,eAAe,MAAM,MAAM,QAAQ,OAAO,GAAG,GAAG,GAAG;AAAA,UAClD,QAAQ;AAAA,QAAA;AAAA,MACV,CACD;AAAA,MAED,CAAC,gBAAgB,GAAG;AAAA,QAClB,SAAS;AAAA,QACT,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW;AAAA,MAAA;AAAA,IACb;AAAA,EACF,CACD,EACA,MAAA;AAEH,QAAM,iBAAiB,CAAC,EAAE,YAAsC;AAC9D,WAAO,QAAQ,MAAM,MAAM,SAAS;AAAA,EACtC;AAEA,YAAU,UAAU;AACpB,YAAU,UAAU;AACpB,YAAU,UAAU;AAEpB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ;AAAA,MACN;AAAA,IAAA;AAAA,EACF;AAEJ;"}
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 "../../../atomic/text-lockup/date.js";
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();