@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
@@ -1 +1 @@
1
- {"version":3,"file":"grid.js","sources":["../../../../source/composite/hero/custom/grid.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 { isPreferredReducedMotion } from '@universityofmaryland/web-utilities-library/accessibility';\nimport { withViewTimelineAnimation } from '@universityofmaryland/web-utilities-library/styles';\nimport { assets, textLockup } from 'atomic';\nimport { type ContentElement, type ElementModel } from '../../../_types';\n\ninterface CornerProps {\n images: Array<HTMLImageElement>;\n isCornerLeft: boolean;\n}\n\ninterface CenterProps {\n images: Array<HTMLImageElement>;\n video?: HTMLVideoElement | null;\n}\n\ninterface HeroGridProps {\n headline?: ContentElement;\n text?: ContentElement;\n actions?: ContentElement;\n corners: Array<CornerProps>;\n center: CenterProps | null;\n isThemeDark?: boolean;\n}\n\nconst isPreferReducedMotion = isPreferredReducedMotion();\nconst isScrollTimelineSupported = () =>\n 'ScrollTimeline' in window || CSS.supports('animation-timeline', 'scroll()');\nconst isDisplayWithoutAnimation =\n isPreferReducedMotion || !isScrollTimelineSupported();\n\nconst ANIMATION_RANGES = {\n GRID_COLUMNS: { start: '110vh', end: '230vh' },\n GRID_ROWS: { start: '110vh', end: '230vh' },\n TINT_FADE: { start: '50vh', end: '140vh' },\n} as const;\n\nconst GRID_LAYOUT = {\n COLUMNS: {\n INITIAL: '20% 60% 20%',\n FINAL: '0 100% 0',\n DEFAULT: '25% 50% 25%',\n },\n ROWS: {\n INITIAL: '25vh 1fr 25vh',\n FINAL: '0 1fr 0',\n TRIPLE: '1fr 1fr 1fr',\n },\n} as const;\n\nconst keyFrameColumns = `\n @keyframes grid-columns {\n from {\n grid-template-columns: ${GRID_LAYOUT.COLUMNS.INITIAL};\n }\n to {\n grid-template-columns: ${GRID_LAYOUT.COLUMNS.FINAL};\n grid-gap: 0;\n }\n }\n`;\n\nconst keyFrameRows = `\n @keyframes grid-rows {\n from {\n grid-template-rows: ${GRID_LAYOUT.ROWS.INITIAL};\n }\n to {\n grid-template-rows: ${GRID_LAYOUT.ROWS.FINAL};\n grid-gap: 0;\n }\n }\n`;\n\nconst keyFrameTint = `\n @keyframes tint-fade {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n`;\n\nconst columnBase = {\n display: 'grid',\n gridAutoFlow: 'row dense',\n gridGap: `${token.spacing.min}`,\n width: '100%',\n height: '100vh',\n\n [`@media (${token.media.queries.tablet.min})`]: {\n gridGap: `${token.spacing.md}`,\n },\n\n [`@media (${token.media.queries.desktop.min})`]: {\n gridGap: `${token.spacing.lg}`,\n },\n\n ['& > *']: {\n overflow: 'hidden',\n position: 'relative',\n },\n};\n\nconst createImageWrapper = (image: HTMLImageElement) =>\n assets.image.background({\n element: image,\n isScaled: true,\n isGifAllowed: true,\n isShowCaption: true,\n imageLoading: 'eager',\n imageFetchPriority: 'high',\n });\n\nconst createVideoWrapper = (video: HTMLVideoElement) =>\n assets.video.observedAutoPlay({\n video,\n isAutoplay: true,\n videoPreload: 'auto',\n videoFetchPriority: 'high',\n additionalElementStyles: {\n additionalElementStyles: {\n width: '100%',\n aspectRatio: '1 / 1',\n position: 'relative',\n overflow: 'hidden',\n\n [`& video`]: {\n height: '100%',\n width: '100%',\n objectFit: 'cover',\n },\n },\n },\n });\n\nconst createCorner = ({ images, isCornerLeft }: CornerProps) => {\n const children = images.map((image) => createImageWrapper(image));\n\n return new ElementBuilder()\n .withClassName(\n isCornerLeft ? 'hero-grid-corner-left' : 'hero-grid-corner-right',\n )\n .withChildren(...children)\n .withStyles({\n element: {\n ...columnBase,\n gridTemplateRows: GRID_LAYOUT.ROWS.TRIPLE,\n },\n })\n .withAttribute('role', 'region')\n .withAttribute(\n 'aria-label',\n `${isCornerLeft ? 'Left' : 'Right'} decorative image grid`,\n )\n .build();\n};\n\nconst createCenter = ({ images, video }: CenterProps) => {\n const tint = new ElementBuilder()\n .withClassName('hero-grid-tint')\n .withStyles({\n element: {\n width: '100%',\n height: '100%',\n position: 'absolute',\n top: 0,\n left: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n zIndex: 9,\n opacity: 0,\n ...withViewTimelineAnimation({\n animation: 'tint-fade ease-in-out forwards',\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_RANGES.TINT_FADE.start,\n animationRangeEnd: ANIMATION_RANGES.TINT_FADE.end,\n }),\n },\n })\n .withAttribute('role', 'region')\n .withAttribute('aria-label', 'Main hero content')\n .build();\n\n const container = new ElementBuilder()\n .withClassName('hero-grid-center')\n .withChild(tint)\n .withStyles({\n element: {\n ...columnBase,\n gridTemplateRows: GRID_LAYOUT.ROWS.INITIAL,\n ...withViewTimelineAnimation({\n animation: 'grid-rows ease-in-out forwards',\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_RANGES.GRID_ROWS.start,\n animationRangeEnd: ANIMATION_RANGES.GRID_ROWS.end,\n }),\n },\n });\n\n if (video) {\n container\n .withChild(createImageWrapper(images[0]))\n .withChild(createVideoWrapper(video))\n .withChild(createImageWrapper(images[1]));\n } else {\n images.forEach((image) => {\n container.withChild(createImageWrapper(image));\n });\n }\n\n return container.build();\n};\n\nconst createHeadline = (\n props: Pick<HeroGridProps, 'headline'>,\n): ElementModel<HTMLElement> | null => {\n const { headline } = props;\n const characterCount = headline?.textContent?.trim().length || 0;\n const isOverwriteHeadline = characterCount > 30;\n\n if (!headline) return null;\n\n const desktopStyles = {\n [`@container (${token.media.queries.desktop.min})`]: {\n ...(isOverwriteHeadline && {\n fontSize: '80px',\n }),\n },\n };\n\n return new ElementBuilder(headline)\n .styled(Styles.typography.campaign.fonts.extraLarge)\n .withStyles({\n element: {\n color: token.color.white,\n textTransform: 'uppercase',\n textWrap: 'pretty',\n ...desktopStyles,\n },\n siblingAfter: {\n marginTop: token.spacing.md,\n },\n })\n .build();\n};\n\nconst createTextContainer = (\n props: Pick<HeroGridProps, 'headline' | 'text' | 'actions' | 'isThemeDark'>,\n) => {\n const { actions, headline, text, isThemeDark } = props;\n let shouldRenderBlackText = null;\n\n if (isDisplayWithoutAnimation && !isThemeDark) {\n shouldRenderBlackText = true;\n }\n\n if (!text && !actions && !headline) {\n return null;\n }\n\n const textContainer = 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 ...withViewTimelineAnimation({\n paddingTop: '140vh',\n }),\n\n ['*']: {\n ...(shouldRenderBlackText && {\n color: `${token.color.black} !important`,\n }),\n },\n },\n })\n .build();\n\n const lock = new ElementBuilder()\n .styled(Styles.layout.space.horizontal.smallest)\n .withStyles({\n element: {\n height: '100%',\n width: '100%',\n position: 'relative',\n },\n })\n .build();\n\n const textLockupElement = textLockup.large({\n headlineComposite: createHeadline(props),\n textLargest: text,\n actions,\n isThemeDark: true,\n });\n\n lock.element.appendChild(textLockupElement.element);\n lock.styles += textLockupElement.styles;\n\n textContainer.element.appendChild(lock.element);\n textContainer.styles += lock.styles;\n\n return textContainer;\n};\n\nconst validateGridProps = (\n props: HeroGridProps,\n): {\n leftCorner: CornerProps;\n rightCorner: CornerProps;\n center: CenterProps;\n} | null => {\n const leftCorner = props.corners.find((c) => c.isCornerLeft);\n const rightCorner = props.corners.find((c) => !c.isCornerLeft);\n\n const errors = [];\n\n // Validate corners\n if (!leftCorner) {\n errors.push('Left corner is required for hero grid');\n } else if (!leftCorner.images || leftCorner.images.length === 0) {\n errors.push('Left corner must have at least one image');\n }\n\n if (!rightCorner) {\n errors.push('Right corner is required for hero grid');\n } else if (!rightCorner.images || rightCorner.images.length === 0) {\n errors.push('Right corner must have at least one image');\n }\n\n // Validate center\n if (!props.center) {\n errors.push('Center is required for hero grid');\n } else {\n if (!props.center.images || props.center.images.length === 0) {\n errors.push('Center must have at least one image');\n } else if (props.center.video && props.center.images.length < 2) {\n errors.push('Center must have at least 2 images when video is provided');\n }\n }\n\n if (errors.length > 0) {\n errors.forEach((error) => console.log('Hero Grid Error:', error));\n return null;\n }\n\n return {\n leftCorner: leftCorner as CornerProps,\n rightCorner: rightCorner as CornerProps,\n center: props.center as CenterProps,\n };\n};\n\nconst createGridLayout = (\n leftCorner: CornerProps,\n rightCorner: CornerProps,\n center: CenterProps,\n) => {\n const gridStyles = {\n gridTemplateColumns: GRID_LAYOUT.COLUMNS.DEFAULT,\n height: '100vh',\n width: '100%',\n display: 'grid',\n gridGap: `${token.spacing.min}`,\n\n [`@media (${token.media.queries.tablet.min})`]: {\n gridGap: `${token.spacing.md}`,\n },\n\n [`@media (${token.media.queries.desktop.min})`]: {\n gridGap: `${token.spacing.lg}`,\n },\n\n ...withViewTimelineAnimation({\n position: 'sticky',\n top: 0,\n animation: 'grid-columns ease-in-out forwards',\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_RANGES.GRID_COLUMNS.start,\n animationRangeEnd: ANIMATION_RANGES.GRID_COLUMNS.end,\n }),\n };\n\n return new ElementBuilder()\n .withClassName('hero-grid-layout')\n .withChildren(\n createCorner(leftCorner),\n createCenter(center),\n createCorner(rightCorner),\n )\n .withStyles({ element: gridStyles })\n .withAttribute('role', 'region')\n .withAttribute('aria-label', 'Hero grid layout')\n .build();\n};\n\nexport const createCompositeHeroGrid = (props: HeroGridProps) => {\n const validated = validateGridProps(props);\n if (!validated) return null;\n\n const { leftCorner, rightCorner, center } = validated;\n const text = createTextContainer(props);\n const grid = createGridLayout(leftCorner, rightCorner, center);\n\n const composite = new ElementBuilder()\n .withClassName('hero-grid-container')\n .withChild(grid)\n .withStyles({\n element: {\n width: '100%',\n display: 'block',\n containerType: 'inline-size',\n ...withViewTimelineAnimation({\n height: '300vh',\n }),\n ['img, video']: {\n objectFit: 'cover',\n width: '100%',\n height: '100%',\n },\n },\n })\n .withAttribute('role', 'main')\n .withAttribute('aria-label', 'Hero section');\n\n if (text) {\n composite.withChild(text);\n }\n\n const built = composite.build();\n\n built.styles += keyFrameColumns;\n built.styles += keyFrameRows;\n built.styles += keyFrameTint;\n\n return built;\n};\n"],"names":["assets.image.background","assets.video.observedAutoPlay","textLockup.large"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,MAAM,wBAAwB,yBAAA;AAC9B,MAAM,4BAA4B,MAChC,oBAAoB,UAAU,IAAI,SAAS,sBAAsB,UAAU;AAC7E,MAAM,4BACJ,yBAAyB,CAAC,0BAAA;AAE5B,MAAM,mBAAmB;AAAA,EACvB,cAAc,EAAE,OAAO,SAAS,KAAK,QAAA;AAAA,EACrC,WAAW,EAAE,OAAO,SAAS,KAAK,QAAA;AAAA,EAClC,WAAW,EAAE,OAAO,QAAQ,KAAK,QAAA;AACnC;AAEA,MAAM,cAAc;AAAA,EAClB,SAAS;AAAA,IACP,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,EAAA;AAAA,EAEX,MAAM;AAAA,IACJ,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAEZ;AAEA,MAAM,kBAAkB;AAAA;AAAA;AAAA,+BAGO,YAAY,QAAQ,OAAO;AAAA;AAAA;AAAA,+BAG3B,YAAY,QAAQ,KAAK;AAAA;AAAA;AAAA;AAAA;AAMxD,MAAM,eAAe;AAAA;AAAA;AAAA,4BAGO,YAAY,KAAK,OAAO;AAAA;AAAA;AAAA,4BAGxB,YAAY,KAAK,KAAK;AAAA;AAAA;AAAA;AAAA;AAMlD,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWrB,MAAM,aAAa;AAAA,EACjB,SAAS;AAAA,EACT,cAAc;AAAA,EACd,SAAS,GAAG,MAAM,QAAQ,GAAG;AAAA,EAC7B,OAAO;AAAA,EACP,QAAQ;AAAA,EAER,CAAC,WAAW,MAAM,MAAM,QAAQ,OAAO,GAAG,GAAG,GAAG;AAAA,IAC9C,SAAS,GAAG,MAAM,QAAQ,EAAE;AAAA,EAAA;AAAA,EAG9B,CAAC,WAAW,MAAM,MAAM,QAAQ,QAAQ,GAAG,GAAG,GAAG;AAAA,IAC/C,SAAS,GAAG,MAAM,QAAQ,EAAE;AAAA,EAAA;AAAA,EAG9B,CAAC,OAAO,GAAG;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,EAAA;AAEd;AAEA,MAAM,qBAAqB,CAAC,UAC1BA,sBAAwB;AAAA,EACtB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,cAAc;AAAA,EACd,eAAe;AAAA,EACf,cAAc;AAAA,EACd,oBAAoB;AACtB,CAAC;AAEH,MAAM,qBAAqB,CAAC,UAC1BC,4BAA8B;AAAA,EAC5B;AAAA,EACA,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,IACvB,yBAAyB;AAAA,MACvB,OAAO;AAAA,MACP,aAAa;AAAA,MACb,UAAU;AAAA,MACV,UAAU;AAAA,MAEV,CAAC,SAAS,GAAG;AAAA,QACX,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,WAAW;AAAA,MAAA;AAAA,IACb;AAAA,EACF;AAEJ,CAAC;AAEH,MAAM,eAAe,CAAC,EAAE,QAAQ,mBAAgC;AAC9D,QAAM,WAAW,OAAO,IAAI,CAAC,UAAU,mBAAmB,KAAK,CAAC;AAEhE,SAAO,IAAI,iBACR;AAAA,IACC,eAAe,0BAA0B;AAAA,EAAA,EAE1C,aAAa,GAAG,QAAQ,EACxB,WAAW;AAAA,IACV,SAAS;AAAA,MACP,GAAG;AAAA,MACH,kBAAkB,YAAY,KAAK;AAAA,IAAA;AAAA,EACrC,CACD,EACA,cAAc,QAAQ,QAAQ,EAC9B;AAAA,IACC;AAAA,IACA,GAAG,eAAe,SAAS,OAAO;AAAA,EAAA,EAEnC,MAAA;AACL;AAEA,MAAM,eAAe,CAAC,EAAE,QAAQ,YAAyB;AACvD,QAAM,OAAO,IAAI,eAAA,EACd,cAAc,gBAAgB,EAC9B,WAAW;AAAA,IACV,SAAS;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,MACN,iBAAiB;AAAA,MACjB,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,GAAG,0BAA0B;AAAA,QAC3B,WAAW;AAAA,QACX,mBAAmB;AAAA,QACnB,qBAAqB,iBAAiB,UAAU;AAAA,QAChD,mBAAmB,iBAAiB,UAAU;AAAA,MAAA,CAC/C;AAAA,IAAA;AAAA,EACH,CACD,EACA,cAAc,QAAQ,QAAQ,EAC9B,cAAc,cAAc,mBAAmB,EAC/C,MAAA;AAEH,QAAM,YAAY,IAAI,eAAA,EACnB,cAAc,kBAAkB,EAChC,UAAU,IAAI,EACd,WAAW;AAAA,IACV,SAAS;AAAA,MACP,GAAG;AAAA,MACH,kBAAkB,YAAY,KAAK;AAAA,MACnC,GAAG,0BAA0B;AAAA,QAC3B,WAAW;AAAA,QACX,mBAAmB;AAAA,QACnB,qBAAqB,iBAAiB,UAAU;AAAA,QAChD,mBAAmB,iBAAiB,UAAU;AAAA,MAAA,CAC/C;AAAA,IAAA;AAAA,EACH,CACD;AAEH,MAAI,OAAO;AACT,cACG,UAAU,mBAAmB,OAAO,CAAC,CAAC,CAAC,EACvC,UAAU,mBAAmB,KAAK,CAAC,EACnC,UAAU,mBAAmB,OAAO,CAAC,CAAC,CAAC;AAAA,EAC5C,OAAO;AACL,WAAO,QAAQ,CAAC,UAAU;AACxB,gBAAU,UAAU,mBAAmB,KAAK,CAAC;AAAA,IAC/C,CAAC;AAAA,EACH;AAEA,SAAO,UAAU,MAAA;AACnB;AAEA,MAAM,iBAAiB,CACrB,UACqC;AACrC,QAAM,EAAE,aAAa;AACrB,QAAM,iBAAiB,UAAU,aAAa,KAAA,EAAO,UAAU;AAC/D,QAAM,sBAAsB,iBAAiB;AAE7C,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,gBAAgB;AAAA,IACpB,CAAC,eAAe,MAAM,MAAM,QAAQ,QAAQ,GAAG,GAAG,GAAG;AAAA,MACnD,GAAI,uBAAuB;AAAA,QACzB,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,EACF;AAGF,SAAO,IAAI,eAAe,QAAQ,EAC/B,OAAO,OAAO,WAAW,SAAS,MAAM,UAAU,EAClD,WAAW;AAAA,IACV,SAAS;AAAA,MACP,OAAO,MAAM,MAAM;AAAA,MACnB,eAAe;AAAA,MACf,UAAU;AAAA,MACV,GAAG;AAAA,IAAA;AAAA,IAEL,cAAc;AAAA,MACZ,WAAW,MAAM,QAAQ;AAAA,IAAA;AAAA,EAC3B,CACD,EACA,MAAA;AACL;AAEA,MAAM,sBAAsB,CAC1B,UACG;AACH,QAAM,EAAE,SAAS,UAAU,MAAM,gBAAgB;AACjD,MAAI,wBAAwB;AAE5B,MAAI,6BAA6B,CAAC,aAAa;AAC7C,4BAAwB;AAAA,EAC1B;AAEA,MAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU;AAClC,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,IAAI,eAAA,EACvB,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,MAGlC,GAAG,0BAA0B;AAAA,QAC3B,YAAY;AAAA,MAAA,CACb;AAAA,MAED,CAAC,GAAG,GAAG;AAAA,QACL,GAAI,yBAAyB;AAAA,UAC3B,OAAO,GAAG,MAAM,MAAM,KAAK;AAAA,QAAA;AAAA,MAC7B;AAAA,IACF;AAAA,EACF,CACD,EACA,MAAA;AAEH,QAAM,OAAO,IAAI,eAAA,EACd,OAAO,OAAO,OAAO,MAAM,WAAW,QAAQ,EAC9C,WAAW;AAAA,IACV,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,UAAU;AAAA,IAAA;AAAA,EACZ,CACD,EACA,MAAA;AAEH,QAAM,oBAAoBC,sBAAiB;AAAA,IACzC,mBAAmB,eAAe,KAAK;AAAA,IACvC,aAAa;AAAA,IACb;AAAA,IACA,aAAa;AAAA,EAAA,CACd;AAED,OAAK,QAAQ,YAAY,kBAAkB,OAAO;AAClD,OAAK,UAAU,kBAAkB;AAEjC,gBAAc,QAAQ,YAAY,KAAK,OAAO;AAC9C,gBAAc,UAAU,KAAK;AAE7B,SAAO;AACT;AAEA,MAAM,oBAAoB,CACxB,UAKU;AACV,QAAM,aAAa,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,YAAY;AAC3D,QAAM,cAAc,MAAM,QAAQ,KAAK,CAAC,MAAM,CAAC,EAAE,YAAY;AAE7D,QAAM,SAAS,CAAA;AAGf,MAAI,CAAC,YAAY;AACf,WAAO,KAAK,uCAAuC;AAAA,EACrD,WAAW,CAAC,WAAW,UAAU,WAAW,OAAO,WAAW,GAAG;AAC/D,WAAO,KAAK,0CAA0C;AAAA,EACxD;AAEA,MAAI,CAAC,aAAa;AAChB,WAAO,KAAK,wCAAwC;AAAA,EACtD,WAAW,CAAC,YAAY,UAAU,YAAY,OAAO,WAAW,GAAG;AACjE,WAAO,KAAK,2CAA2C;AAAA,EACzD;AAGA,MAAI,CAAC,MAAM,QAAQ;AACjB,WAAO,KAAK,kCAAkC;AAAA,EAChD,OAAO;AACL,QAAI,CAAC,MAAM,OAAO,UAAU,MAAM,OAAO,OAAO,WAAW,GAAG;AAC5D,aAAO,KAAK,qCAAqC;AAAA,IACnD,WAAW,MAAM,OAAO,SAAS,MAAM,OAAO,OAAO,SAAS,GAAG;AAC/D,aAAO,KAAK,2DAA2D;AAAA,IACzE;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,QAAQ,CAAC,UAAU,QAAQ,IAAI,oBAAoB,KAAK,CAAC;AAChE,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ,MAAM;AAAA,EAAA;AAElB;AAEA,MAAM,mBAAmB,CACvB,YACA,aACA,WACG;AACH,QAAM,aAAa;AAAA,IACjB,qBAAqB,YAAY,QAAQ;AAAA,IACzC,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS,GAAG,MAAM,QAAQ,GAAG;AAAA,IAE7B,CAAC,WAAW,MAAM,MAAM,QAAQ,OAAO,GAAG,GAAG,GAAG;AAAA,MAC9C,SAAS,GAAG,MAAM,QAAQ,EAAE;AAAA,IAAA;AAAA,IAG9B,CAAC,WAAW,MAAM,MAAM,QAAQ,QAAQ,GAAG,GAAG,GAAG;AAAA,MAC/C,SAAS,GAAG,MAAM,QAAQ,EAAE;AAAA,IAAA;AAAA,IAG9B,GAAG,0BAA0B;AAAA,MAC3B,UAAU;AAAA,MACV,KAAK;AAAA,MACL,WAAW;AAAA,MACX,mBAAmB;AAAA,MACnB,qBAAqB,iBAAiB,aAAa;AAAA,MACnD,mBAAmB,iBAAiB,aAAa;AAAA,IAAA,CAClD;AAAA,EAAA;AAGH,SAAO,IAAI,eAAA,EACR,cAAc,kBAAkB,EAChC;AAAA,IACC,aAAa,UAAU;AAAA,IACvB,aAAa,MAAM;AAAA,IACnB,aAAa,WAAW;AAAA,EAAA,EAEzB,WAAW,EAAE,SAAS,YAAY,EAClC,cAAc,QAAQ,QAAQ,EAC9B,cAAc,cAAc,kBAAkB,EAC9C,MAAA;AACL;AAEO,MAAM,0BAA0B,CAAC,UAAyB;AAC/D,QAAM,YAAY,kBAAkB,KAAK;AACzC,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,EAAE,YAAY,aAAa,OAAA,IAAW;AAC5C,QAAM,OAAO,oBAAoB,KAAK;AACtC,QAAM,OAAO,iBAAiB,YAAY,aAAa,MAAM;AAE7D,QAAM,YAAY,IAAI,eAAA,EACnB,cAAc,qBAAqB,EACnC,UAAU,IAAI,EACd,WAAW;AAAA,IACV,SAAS;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,eAAe;AAAA,MACf,GAAG,0BAA0B;AAAA,QAC3B,QAAQ;AAAA,MAAA,CACT;AAAA,MACD,CAAC,YAAY,GAAG;AAAA,QACd,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,MAAA;AAAA,IACV;AAAA,EACF,CACD,EACA,cAAc,QAAQ,MAAM,EAC5B,cAAc,cAAc,cAAc;AAE7C,MAAI,MAAM;AACR,cAAU,UAAU,IAAI;AAAA,EAC1B;AAEA,QAAM,QAAQ,UAAU,MAAA;AAExB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAEhB,SAAO;AACT;"}
1
+ {"version":3,"file":"grid.js","sources":["../../../../source/composite/hero/custom/grid.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 { isPreferredReducedMotion } from '@universityofmaryland/web-utilities-library/accessibility';\nimport { withViewTimelineAnimation } from '@universityofmaryland/web-utilities-library/styles';\nimport { assets, textLockup } from 'atomic';\nimport { type ContentElement, type ElementModel } from '../../../_types';\n\ninterface CornerProps {\n images: Array<HTMLImageElement>;\n isCornerLeft: boolean;\n}\n\ninterface CenterProps {\n images: Array<HTMLImageElement>;\n video?: HTMLVideoElement | null;\n}\n\ninterface HeroGridProps {\n headline?: ContentElement;\n text?: ContentElement;\n actions?: ContentElement;\n corners: Array<CornerProps>;\n center: CenterProps | null;\n isThemeDark?: boolean;\n}\n\nconst isPreferReducedMotion = isPreferredReducedMotion();\nconst isScrollTimelineSupported = () =>\n 'ScrollTimeline' in window || CSS.supports('animation-timeline', 'scroll()');\nconst isDisplayWithoutAnimation =\n isPreferReducedMotion || !isScrollTimelineSupported();\n\nconst ANIMATION_RANGES = {\n GRID_COLUMNS: { start: '110vh', end: '230vh' },\n GRID_ROWS: { start: '110vh', end: '230vh' },\n TINT_FADE: { start: '50vh', end: '140vh' },\n} as const;\n\nconst GRID_LAYOUT = {\n COLUMNS: {\n INITIAL: '20% 60% 20%',\n FINAL: '0 100% 0',\n DEFAULT: '25% 50% 25%',\n },\n ROWS: {\n INITIAL: '25vh 1fr 25vh',\n FINAL: '0 1fr 0',\n TRIPLE: '1fr 1fr 1fr',\n },\n} as const;\n\nconst keyFrameColumns = `\n @keyframes grid-columns {\n from {\n grid-template-columns: ${GRID_LAYOUT.COLUMNS.INITIAL};\n }\n to {\n grid-template-columns: ${GRID_LAYOUT.COLUMNS.FINAL};\n grid-gap: 0;\n }\n }\n`;\n\nconst keyFrameRows = `\n @keyframes grid-rows {\n from {\n grid-template-rows: ${GRID_LAYOUT.ROWS.INITIAL};\n }\n to {\n grid-template-rows: ${GRID_LAYOUT.ROWS.FINAL};\n grid-gap: 0;\n }\n }\n`;\n\nconst keyFrameTint = `\n @keyframes tint-fade {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n`;\n\nconst columnBase = {\n display: 'grid',\n gridAutoFlow: 'row dense',\n gridGap: `${token.spacing.min}`,\n width: '100%',\n height: '100vh',\n\n [`@media (${token.media.queries.tablet.min})`]: {\n gridGap: `${token.spacing.md}`,\n },\n\n [`@media (${token.media.queries.desktop.min})`]: {\n gridGap: `${token.spacing.lg}`,\n },\n\n ['& > *']: {\n overflow: 'hidden',\n position: 'relative',\n },\n};\n\nconst createImageWrapper = (image: HTMLImageElement) =>\n assets.image.background({\n element: image,\n isScaled: true,\n isGifAllowed: true,\n isShowCaption: true,\n imageLoading: 'eager',\n imageFetchPriority: 'high',\n });\n\nconst createVideoWrapper = (video: HTMLVideoElement) =>\n assets.video.observedAutoPlay({\n video,\n isAutoplay: true,\n videoPreload: 'auto',\n videoFetchPriority: 'high',\n additionalElementStyles: {\n additionalElementStyles: {\n width: '100%',\n aspectRatio: '1 / 1',\n position: 'relative',\n overflow: 'hidden',\n\n [`& video`]: {\n height: '100%',\n width: '100%',\n objectFit: 'cover',\n },\n },\n },\n });\n\nconst createCorner = ({ images, isCornerLeft }: CornerProps) => {\n const children = images.map((image) => createImageWrapper(image));\n\n return new ElementBuilder()\n .withClassName(\n isCornerLeft ? 'hero-grid-corner-left' : 'hero-grid-corner-right',\n )\n .withChildren(...children)\n .withStyles({\n element: {\n ...columnBase,\n gridTemplateRows: GRID_LAYOUT.ROWS.TRIPLE,\n },\n })\n .withAttribute('role', 'region')\n .withAttribute(\n 'aria-label',\n `${isCornerLeft ? 'Left' : 'Right'} decorative image grid`,\n )\n .build();\n};\n\nconst createCenter = ({ images, video }: CenterProps) => {\n const tint = new ElementBuilder()\n .withClassName('hero-grid-tint')\n .withStyles({\n element: {\n width: '100%',\n height: '100%',\n position: 'absolute',\n top: 0,\n left: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n zIndex: 9,\n opacity: 0,\n ...withViewTimelineAnimation({\n animation: 'tint-fade ease-in-out forwards',\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_RANGES.TINT_FADE.start,\n animationRangeEnd: ANIMATION_RANGES.TINT_FADE.end,\n }),\n },\n })\n .withAttribute('role', 'region')\n .withAttribute('aria-label', 'Main hero content')\n .build();\n\n const container = new ElementBuilder()\n .withClassName('hero-grid-center')\n .withChild(tint)\n .withStyles({\n element: {\n ...columnBase,\n gridTemplateRows: GRID_LAYOUT.ROWS.INITIAL,\n ...withViewTimelineAnimation({\n animation: 'grid-rows ease-in-out forwards',\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_RANGES.GRID_ROWS.start,\n animationRangeEnd: ANIMATION_RANGES.GRID_ROWS.end,\n }),\n },\n });\n\n if (video) {\n container\n .withChild(createImageWrapper(images[0]))\n .withChild(createVideoWrapper(video))\n .withChild(createImageWrapper(images[1]));\n } else {\n images.forEach((image) => {\n container.withChild(createImageWrapper(image));\n });\n }\n\n return container.build();\n};\n\nconst createHeadline = (\n props: Pick<HeroGridProps, 'headline'>,\n): ElementModel<HTMLElement> | null => {\n const { headline } = props;\n const characterCount = headline?.textContent?.trim().length || 0;\n const isOverwriteHeadline = characterCount > 30;\n\n if (!headline) return null;\n\n const desktopStyles = {\n [`@container (${token.media.queries.desktop.min})`]: {\n ...(isOverwriteHeadline && {\n fontSize: '80px',\n }),\n },\n };\n\n return new ElementBuilder(headline)\n .styled(Styles.typography.campaign.fonts.extraLarge)\n .withStyles({\n element: {\n color: token.color.white,\n textTransform: 'uppercase',\n textWrap: 'pretty',\n ...desktopStyles,\n },\n siblingAfter: {\n marginTop: token.spacing.md,\n },\n })\n .build();\n};\n\nconst createTextContainer = (\n props: Pick<HeroGridProps, 'headline' | 'text' | 'actions' | 'isThemeDark'>,\n) => {\n const { actions, headline, text, isThemeDark } = props;\n let shouldRenderBlackText = null;\n\n if (isDisplayWithoutAnimation && !isThemeDark) {\n shouldRenderBlackText = true;\n }\n\n if (!text && !actions && !headline) {\n return null;\n }\n\n const textContainer = 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 ...withViewTimelineAnimation({\n paddingTop: '140vh',\n }),\n\n ['*']: {\n ...(shouldRenderBlackText && {\n color: `${token.color.black} !important`,\n }),\n },\n },\n })\n .build();\n\n const lock = new ElementBuilder()\n .styled(Styles.layout.space.horizontal.smallest)\n .withStyles({\n element: {\n height: '100%',\n width: '100%',\n position: 'relative',\n },\n })\n .build();\n\n const textLockupElement = textLockup.large({\n headlineComposite: createHeadline(props),\n textLargest: text,\n actions,\n isThemeDark: true,\n });\n\n lock.element.appendChild(textLockupElement.element);\n lock.styles += textLockupElement.styles;\n\n textContainer.element.appendChild(lock.element);\n textContainer.styles += lock.styles;\n\n return textContainer;\n};\n\nconst validateGridProps = (\n props: HeroGridProps,\n): {\n leftCorner: CornerProps;\n rightCorner: CornerProps;\n center: CenterProps;\n} | null => {\n const leftCorner = props.corners.find((c) => c.isCornerLeft);\n const rightCorner = props.corners.find((c) => !c.isCornerLeft);\n\n const errors = [];\n\n // Validate corners\n if (!leftCorner) {\n errors.push('Left corner is required for hero grid');\n } else if (!leftCorner.images || leftCorner.images.length === 0) {\n errors.push('Left corner must have at least one image');\n }\n\n if (!rightCorner) {\n errors.push('Right corner is required for hero grid');\n } else if (!rightCorner.images || rightCorner.images.length === 0) {\n errors.push('Right corner must have at least one image');\n }\n\n // Validate center\n if (!props.center) {\n errors.push('Center is required for hero grid');\n } else {\n if (!props.center.images || props.center.images.length === 0) {\n errors.push('Center must have at least one image');\n } else if (props.center.video && props.center.images.length < 2) {\n errors.push('Center must have at least 2 images when video is provided');\n }\n }\n\n if (errors.length > 0) {\n errors.forEach((error) => console.log('Hero Grid Error:', error));\n return null;\n }\n\n return {\n leftCorner: leftCorner as CornerProps,\n rightCorner: rightCorner as CornerProps,\n center: props.center as CenterProps,\n };\n};\n\nconst createGridLayout = (\n leftCorner: CornerProps,\n rightCorner: CornerProps,\n center: CenterProps,\n) => {\n const gridStyles = {\n gridTemplateColumns: GRID_LAYOUT.COLUMNS.DEFAULT,\n height: '100vh',\n width: '100%',\n display: 'grid',\n gridGap: `${token.spacing.min}`,\n\n [`@media (${token.media.queries.tablet.min})`]: {\n gridGap: `${token.spacing.md}`,\n },\n\n [`@media (${token.media.queries.desktop.min})`]: {\n gridGap: `${token.spacing.lg}`,\n },\n\n ...withViewTimelineAnimation({\n position: 'sticky',\n top: 0,\n animation: 'grid-columns ease-in-out forwards',\n animationTimeline: 'view()',\n animationRangeStart: ANIMATION_RANGES.GRID_COLUMNS.start,\n animationRangeEnd: ANIMATION_RANGES.GRID_COLUMNS.end,\n }),\n };\n\n return new ElementBuilder()\n .withClassName('hero-grid-layout')\n .withChildren(\n createCorner(leftCorner),\n createCenter(center),\n createCorner(rightCorner),\n )\n .withStyles({ element: gridStyles })\n .withAttribute('role', 'region')\n .withAttribute('aria-label', 'Hero grid layout')\n .build();\n};\n\nexport const createCompositeHeroGrid = (props: HeroGridProps) => {\n const validated = validateGridProps(props);\n if (!validated) return null;\n\n const { leftCorner, rightCorner, center } = validated;\n const text = createTextContainer(props);\n const grid = createGridLayout(leftCorner, rightCorner, center);\n\n const composite = new ElementBuilder()\n .withClassName('hero-grid-container')\n .withChild(grid)\n .withStyles({\n element: {\n width: '100%',\n display: 'block',\n containerType: 'inline-size',\n ...withViewTimelineAnimation({\n height: '300vh',\n }),\n ['img, video']: {\n objectFit: 'cover',\n width: '100%',\n height: '100%',\n },\n },\n })\n .withAttribute('role', 'main')\n .withAttribute('aria-label', 'Hero section');\n\n if (text) {\n composite.withChild(text);\n }\n\n const built = composite.build();\n\n built.styles += keyFrameColumns;\n built.styles += keyFrameRows;\n built.styles += keyFrameTint;\n\n return built;\n};\n"],"names":["assets.image.background","assets.video.observedAutoPlay","textLockup.large"],"mappings":"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"}
@@ -13,18 +13,19 @@ import "@universityofmaryland/web-icons-library/files";
13
13
  import "@universityofmaryland/web-icons-library/brand";
14
14
  import "@universityofmaryland/web-icons-library/arrows";
15
15
  import { createAnimationChevronFlow } from "../../../atomic/animations/brand/chevron-flow.js";
16
- import "../../../atomic/animations/brand/chevron-scroll.js";
16
+ import "@universityofmaryland/web-utilities-library/styles";
17
17
  import "../../../atomic/animations/brand/card-stack.js";
18
18
  import "@universityofmaryland/web-styles-library";
19
+ import "@universityofmaryland/web-utilities-library/accessibility";
19
20
  import { createVideoObservedAutoPlay } from "../../../atomic/assets/video/observed-auto-play.js";
20
21
  import "@universityofmaryland/web-icons-library/location";
21
22
  import "@universityofmaryland/web-icons-library/calendar";
22
23
  import "@universityofmaryland/web-utilities-library/theme";
23
24
  import "../../../atomic/layout/block/stacked.js";
24
- import "../../../atomic/layout/overlay/modal.js";
25
25
  import "../../../atomic/layout/person/columns.js";
26
26
  import "@universityofmaryland/web-icons-library/social";
27
- import "../../../atomic/text-lockup/date.js";
27
+ import "@universityofmaryland/web-utilities-library/string";
28
+ import "@universityofmaryland/web-utilities-library/animation";
28
29
  import "../../../atomic/text-lockup/small.js";
29
30
  const OVERLAY_CLASS = "hero-logo-brand-text-overlay";
30
31
  const ANIMATION_CONFIG = {
@@ -1 +1 @@
1
- {"version":3,"file":"video-arrow.js","sources":["../../../../source/composite/hero/custom/video-arrow.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport * as typography from '@universityofmaryland/web-styles-library/typography';\nimport * as elementStyles from '@universityofmaryland/web-styles-library/element';\nimport { debounce } from '@universityofmaryland/web-utilities-library/performance';\nimport { animations, assets } from 'atomic';\nimport { type HeroVideoArrowProps as BaseHeroVideoArrowProps } from '../_types';\nimport { type ElementModel } from '../../../_types';\n\ninterface HeroVideoArrowProps extends Omit<BaseHeroVideoArrowProps, 'video'> {\n video: HTMLVideoElement;\n isAnimationOnLoad?: boolean;\n}\n\nconst OVERLAY_CLASS = 'hero-logo-brand-text-overlay';\n\nconst ANIMATION_CONFIG = {\n TEXT_FADE: {\n DURATION: '1000ms',\n EASING: 'ease-in-out',\n HEADLINE_DELAY: '600ms',\n TEXT_DELAY: '1500ms',\n },\n OVERLAY_FADE: {\n DURATION: '1500ms',\n EASING: 'ease-in-out',\n },\n} as const;\n\nconst createHeadline = (headline?: HTMLElement | null) => {\n if (!headline) return null;\n\n return new ElementBuilder(headline)\n .styled(typography.campaign.extralarge)\n .withStyles({\n element: {\n textTransform: 'uppercase',\n opacity: 0,\n transition: `opacity ${ANIMATION_CONFIG.TEXT_FADE.DURATION} ${ANIMATION_CONFIG.TEXT_FADE.EASING}`,\n transitionDelay: ANIMATION_CONFIG.TEXT_FADE.HEADLINE_DELAY,\n textWrap: 'balance',\n color: token.color.white,\n },\n siblingAfter: {\n marginTop: token.spacing.md,\n },\n })\n .build();\n};\n\nconst createText = (text?: HTMLElement | null) => {\n if (!text) return null;\n\n return new ElementBuilder(text)\n .styled(elementStyles.text.rich.simpleLargest)\n .withStyles({\n element: {\n maxWidth: '720px',\n marginLeft: 'auto',\n marginRight: 'auto',\n opacity: 0,\n transition: `opacity ${ANIMATION_CONFIG.TEXT_FADE.DURATION} ${ANIMATION_CONFIG.TEXT_FADE.EASING}`,\n transitionDelay: ANIMATION_CONFIG.TEXT_FADE.TEXT_DELAY,\n\n ['& p']: {\n color: token.color.white,\n },\n\n [`@media (max-width: 649px)`]: {\n display: 'none',\n },\n },\n })\n .build();\n};\n\nconst createTextChildren = (\n props: Pick<HeroVideoArrowProps, 'headline' | 'text'>,\n): ElementModel<HTMLElement>[] => {\n const { headline, text } = props;\n const children: ElementModel<HTMLElement>[] = [];\n\n const headlineElement = createHeadline(headline);\n if (headlineElement) {\n children.push(headlineElement);\n }\n\n const textElement = createText(text);\n if (textElement) {\n children.push(textElement);\n }\n\n return children;\n};\n\nconst createTextContainer = (\n props: Pick<HeroVideoArrowProps, 'headline' | 'text'>,\n) => {\n const children = createTextChildren(props);\n\n if (children.length === 0) return null;\n\n const container = new ElementBuilder()\n .withClassName('hero-logo-brand-text-container')\n .withChildren(...children)\n .withStyles({\n element: {\n zIndex: 99,\n textAlign: 'center',\n width: `calc(100% - 24px)`,\n maxWidth: '950px',\n padding: `${token.spacing.xl} ${token.spacing.md}`,\n },\n })\n .build();\n\n return new ElementBuilder()\n .withClassName(OVERLAY_CLASS)\n .withChild(container)\n .withStyles({\n element: {\n height: '100%',\n width: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\n zIndex: 98,\n opacity: 0,\n transition: `opacity ${ANIMATION_CONFIG.OVERLAY_FADE.DURATION} ${ANIMATION_CONFIG.OVERLAY_FADE.EASING}`,\n },\n })\n .build();\n};\n\nconst createVideo = (video: HTMLVideoElement) => {\n return assets.video.observedAutoPlay({\n video,\n isScaled: true,\n videoPreload: 'auto',\n videoFetchPriority: 'high',\n additionalElementStyles: {\n width: '100%',\n height: '100%',\n position: 'absolute',\n top: 0,\n left: 0,\n },\n });\n};\n\nconst createAnimationSequence = (container: HTMLElement) => {\n return () => {\n const overlay = container.querySelector(\n `.${OVERLAY_CLASS}`,\n ) as HTMLDivElement;\n const headline = container.querySelector(\n `.${typography.campaign.fonts.extraLarge.className}`,\n ) as HTMLDivElement;\n const text = container.querySelector(\n `.${elementStyles.text.rich.simpleLargest.className}`,\n ) as HTMLDivElement;\n\n if (overlay) overlay.style.opacity = '1';\n if (headline) headline.style.opacity = '1';\n if (text) text.style.opacity = '1';\n };\n};\n\nconst createEventHandlers = (\n composite: ElementModel<HTMLElement>,\n overlay: ReturnType<typeof animations.brand.chevronFlow>,\n) => {\n const eventResize = () => {\n if (composite.element.offsetHeight > window.innerHeight) {\n composite.element.style.height = `${window.innerHeight * 0.9}px`;\n }\n };\n\n const eventLoad = () => {\n overlay.events.load();\n eventResize();\n };\n\n window.addEventListener('resize', debounce(eventResize, 20));\n\n return { load: eventLoad };\n};\n\nexport const createCompositeHeroVideoArrow = (props: HeroVideoArrowProps) => {\n const { video, isAnimationOnLoad } = props;\n\n const videoElement = createVideo(video);\n const textContainer = createTextContainer(props);\n\n const composite = new ElementBuilder('section')\n .withClassName('umd-element-hero-brand-video')\n .withStyles({\n element: {\n aspectRatio: '16 / 9',\n width: '100%',\n },\n })\n .build();\n\n const wrapper = new ElementBuilder()\n .withClassName('hero-logo-brand-video-wrapper')\n .withChild(videoElement)\n .withStyles({\n element: {\n containerType: 'inline-size',\n position: 'relative',\n overflow: 'hidden',\n height: '100%',\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n });\n\n if (textContainer) {\n wrapper.withChild(textContainer);\n }\n\n const wrapperBuilt = wrapper.build();\n\n const overlay = animations.brand.chevronFlow({\n sizedContainer: composite.element,\n sizedWrapper: wrapperBuilt.element,\n completedCallback: createAnimationSequence(composite.element),\n isAnimationOnLoad,\n });\n\n wrapperBuilt.element.appendChild(overlay.element);\n wrapperBuilt.styles += overlay.styles;\n\n composite.element.appendChild(wrapperBuilt.element);\n composite.styles += wrapperBuilt.styles;\n\n const events = createEventHandlers(composite, overlay);\n\n return {\n ...composite,\n events,\n };\n};\n"],"names":["assets.video.observedAutoPlay","animations.brand.chevronFlow"],"mappings":"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"}
1
+ {"version":3,"file":"video-arrow.js","sources":["../../../../source/composite/hero/custom/video-arrow.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport * as typography from '@universityofmaryland/web-styles-library/typography';\nimport * as elementStyles from '@universityofmaryland/web-styles-library/element';\nimport { debounce } from '@universityofmaryland/web-utilities-library/performance';\nimport { animations, assets } from 'atomic';\nimport { type HeroVideoArrowProps as BaseHeroVideoArrowProps } from '../_types';\nimport { type ElementModel } from '../../../_types';\n\ninterface HeroVideoArrowProps extends Omit<BaseHeroVideoArrowProps, 'video'> {\n video: HTMLVideoElement;\n isAnimationOnLoad?: boolean;\n}\n\nconst OVERLAY_CLASS = 'hero-logo-brand-text-overlay';\n\nconst ANIMATION_CONFIG = {\n TEXT_FADE: {\n DURATION: '1000ms',\n EASING: 'ease-in-out',\n HEADLINE_DELAY: '600ms',\n TEXT_DELAY: '1500ms',\n },\n OVERLAY_FADE: {\n DURATION: '1500ms',\n EASING: 'ease-in-out',\n },\n} as const;\n\nconst createHeadline = (headline?: HTMLElement | null) => {\n if (!headline) return null;\n\n return new ElementBuilder(headline)\n .styled(typography.campaign.extralarge)\n .withStyles({\n element: {\n textTransform: 'uppercase',\n opacity: 0,\n transition: `opacity ${ANIMATION_CONFIG.TEXT_FADE.DURATION} ${ANIMATION_CONFIG.TEXT_FADE.EASING}`,\n transitionDelay: ANIMATION_CONFIG.TEXT_FADE.HEADLINE_DELAY,\n textWrap: 'balance',\n color: token.color.white,\n },\n siblingAfter: {\n marginTop: token.spacing.md,\n },\n })\n .build();\n};\n\nconst createText = (text?: HTMLElement | null) => {\n if (!text) return null;\n\n return new ElementBuilder(text)\n .styled(elementStyles.text.rich.simpleLargest)\n .withStyles({\n element: {\n maxWidth: '720px',\n marginLeft: 'auto',\n marginRight: 'auto',\n opacity: 0,\n transition: `opacity ${ANIMATION_CONFIG.TEXT_FADE.DURATION} ${ANIMATION_CONFIG.TEXT_FADE.EASING}`,\n transitionDelay: ANIMATION_CONFIG.TEXT_FADE.TEXT_DELAY,\n\n ['& p']: {\n color: token.color.white,\n },\n\n [`@media (max-width: 649px)`]: {\n display: 'none',\n },\n },\n })\n .build();\n};\n\nconst createTextChildren = (\n props: Pick<HeroVideoArrowProps, 'headline' | 'text'>,\n): ElementModel<HTMLElement>[] => {\n const { headline, text } = props;\n const children: ElementModel<HTMLElement>[] = [];\n\n const headlineElement = createHeadline(headline);\n if (headlineElement) {\n children.push(headlineElement);\n }\n\n const textElement = createText(text);\n if (textElement) {\n children.push(textElement);\n }\n\n return children;\n};\n\nconst createTextContainer = (\n props: Pick<HeroVideoArrowProps, 'headline' | 'text'>,\n) => {\n const children = createTextChildren(props);\n\n if (children.length === 0) return null;\n\n const container = new ElementBuilder()\n .withClassName('hero-logo-brand-text-container')\n .withChildren(...children)\n .withStyles({\n element: {\n zIndex: 99,\n textAlign: 'center',\n width: `calc(100% - 24px)`,\n maxWidth: '950px',\n padding: `${token.spacing.xl} ${token.spacing.md}`,\n },\n })\n .build();\n\n return new ElementBuilder()\n .withClassName(OVERLAY_CLASS)\n .withChild(container)\n .withStyles({\n element: {\n height: '100%',\n width: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\n zIndex: 98,\n opacity: 0,\n transition: `opacity ${ANIMATION_CONFIG.OVERLAY_FADE.DURATION} ${ANIMATION_CONFIG.OVERLAY_FADE.EASING}`,\n },\n })\n .build();\n};\n\nconst createVideo = (video: HTMLVideoElement) => {\n return assets.video.observedAutoPlay({\n video,\n isScaled: true,\n videoPreload: 'auto',\n videoFetchPriority: 'high',\n additionalElementStyles: {\n width: '100%',\n height: '100%',\n position: 'absolute',\n top: 0,\n left: 0,\n },\n });\n};\n\nconst createAnimationSequence = (container: HTMLElement) => {\n return () => {\n const overlay = container.querySelector(\n `.${OVERLAY_CLASS}`,\n ) as HTMLDivElement;\n const headline = container.querySelector(\n `.${typography.campaign.fonts.extraLarge.className}`,\n ) as HTMLDivElement;\n const text = container.querySelector(\n `.${elementStyles.text.rich.simpleLargest.className}`,\n ) as HTMLDivElement;\n\n if (overlay) overlay.style.opacity = '1';\n if (headline) headline.style.opacity = '1';\n if (text) text.style.opacity = '1';\n };\n};\n\nconst createEventHandlers = (\n composite: ElementModel<HTMLElement>,\n overlay: ReturnType<typeof animations.brand.chevronFlow>,\n) => {\n const eventResize = () => {\n if (composite.element.offsetHeight > window.innerHeight) {\n composite.element.style.height = `${window.innerHeight * 0.9}px`;\n }\n };\n\n const eventLoad = () => {\n overlay.events.load();\n eventResize();\n };\n\n window.addEventListener('resize', debounce(eventResize, 20));\n\n return { load: eventLoad };\n};\n\nexport const createCompositeHeroVideoArrow = (props: HeroVideoArrowProps) => {\n const { video, isAnimationOnLoad } = props;\n\n const videoElement = createVideo(video);\n const textContainer = createTextContainer(props);\n\n const composite = new ElementBuilder('section')\n .withClassName('umd-element-hero-brand-video')\n .withStyles({\n element: {\n aspectRatio: '16 / 9',\n width: '100%',\n },\n })\n .build();\n\n const wrapper = new ElementBuilder()\n .withClassName('hero-logo-brand-video-wrapper')\n .withChild(videoElement)\n .withStyles({\n element: {\n containerType: 'inline-size',\n position: 'relative',\n overflow: 'hidden',\n height: '100%',\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n });\n\n if (textContainer) {\n wrapper.withChild(textContainer);\n }\n\n const wrapperBuilt = wrapper.build();\n\n const overlay = animations.brand.chevronFlow({\n sizedContainer: composite.element,\n sizedWrapper: wrapperBuilt.element,\n completedCallback: createAnimationSequence(composite.element),\n isAnimationOnLoad,\n });\n\n wrapperBuilt.element.appendChild(overlay.element);\n wrapperBuilt.styles += overlay.styles;\n\n composite.element.appendChild(wrapperBuilt.element);\n composite.styles += wrapperBuilt.styles;\n\n const events = createEventHandlers(composite, overlay);\n\n return {\n ...composite,\n events,\n };\n};\n"],"names":["assets.video.observedAutoPlay","animations.brand.chevronFlow"],"mappings":"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"}
@@ -14,17 +14,17 @@ 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 { createTextLockupLarge } from "../../atomic/text-lockup/large.js";
29
29
  import "../../atomic/text-lockup/small.js";
30
30
  const getBackgroundColor = (props) => {
@@ -14,17 +14,17 @@ 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 { createTextLockupLarge } from "../../atomic/text-lockup/large.js";
29
29
  import "../../atomic/text-lockup/small.js";
30
30
  const createImageAsset = (image) => {
@@ -13,19 +13,20 @@ import "@universityofmaryland/web-icons-library/files";
13
13
  import "@universityofmaryland/web-icons-library/brand";
14
14
  import "@universityofmaryland/web-icons-library/arrows";
15
15
  import "@universityofmaryland/web-utilities-library/performance";
16
- import "../../atomic/animations/brand/chevron-scroll.js";
16
+ import "@universityofmaryland/web-utilities-library/styles";
17
17
  import "../../atomic/animations/brand/card-stack.js";
18
18
  import { createImageBackground } from "../../atomic/assets/image/background.js";
19
+ import "@universityofmaryland/web-utilities-library/accessibility";
19
20
  import { imagePlaceholder } from "../../atomic/assets/image/placeholder.js";
20
21
  import { createVideoObservedAutoPlay } from "../../atomic/assets/video/observed-auto-play.js";
21
22
  import "@universityofmaryland/web-icons-library/location";
22
23
  import "@universityofmaryland/web-icons-library/calendar";
23
24
  import "@universityofmaryland/web-utilities-library/theme";
24
25
  import "../../atomic/layout/block/stacked.js";
25
- import "../../atomic/layout/overlay/modal.js";
26
26
  import "../../atomic/layout/person/columns.js";
27
27
  import "@universityofmaryland/web-icons-library/social";
28
- import "../../atomic/text-lockup/date.js";
28
+ import "@universityofmaryland/web-utilities-library/string";
29
+ import "@universityofmaryland/web-utilities-library/animation";
29
30
  import { createTextLockupLarge } from "../../atomic/text-lockup/large.js";
30
31
  import "../../atomic/text-lockup/small.js";
31
32
  const ANIMATION_CONFIG = {
@@ -191,7 +192,7 @@ const createText = (props) => {
191
192
  display: "flex",
192
193
  position: "relative",
193
194
  zIndex: 999,
194
- width: "100%",
195
+ width: `calc(100% - 60px)`,
195
196
  [`@container (${token.media.queries.tablet.min})`]: {
196
197
  padding: `${token.spacing["5xl"]} 0`,
197
198
  ...includesAnimation && {
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.js","sources":["../../../source/composite/hero/overlay.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport * as elementStyles from '@universityofmaryland/web-styles-library/element';\nimport * as Styles from '@universityofmaryland/web-styles-library';\nimport { assets, textLockup } from 'atomic';\nimport { type ElementModel } from '../../_types';\nimport { type HeroOverlayProps } from './_types';\n\nconst ANIMATION_CONFIG = {\n RESIZE: {\n DURATION: '1.5s',\n TRANSFORM: {\n FROM: 'scale(1.1)',\n TO: 'scale(1)',\n },\n },\n SLIDE_UP: {\n DURATION: '1.5s',\n TRANSFORM: {\n FROM: 'translateY(25px)',\n TO: 'translateY(0)',\n },\n OPACITY: {\n FROM: 0.2,\n TO: 1,\n },\n },\n} as const;\n\nconst keyFrameHeroResize = `\n @keyframes hero-overlay-resize {\n from { transform: ${ANIMATION_CONFIG.RESIZE.TRANSFORM.FROM}; }\n to { transform: ${ANIMATION_CONFIG.RESIZE.TRANSFORM.TO}; }\n }\n`;\n\nconst keyFrameHeroSlideUp = `\n @keyframes hero-slide-up {\n from {\n transform: ${ANIMATION_CONFIG.SLIDE_UP.TRANSFORM.FROM};\n opacity: ${ANIMATION_CONFIG.SLIDE_UP.OPACITY.FROM};\n }\n to {\n transform: ${ANIMATION_CONFIG.SLIDE_UP.TRANSFORM.TO};\n opacity: ${ANIMATION_CONFIG.SLIDE_UP.OPACITY.TO};\n }\n }\n`;\n\nconst createVideoAsset = (video: HTMLVideoElement) => {\n return assets.video.observedAutoPlay({\n video,\n isScaled: true,\n videoPreload: 'auto',\n videoFetchPriority: 'high',\n });\n};\n\nconst createImageAsset = (image: HTMLImageElement) => {\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\nconst buildAssetChildren = ({\n image,\n video,\n}: Pick<HeroOverlayProps, 'image' | 'video'>): ElementModel<HTMLElement>[] => {\n if (video && video instanceof HTMLVideoElement) {\n return [createVideoAsset(video)];\n }\n\n if (image) {\n return [createImageAsset(image)];\n }\n\n return [assets.image.placeholder.fearlessForward()];\n};\n\nconst createAsset = ({\n image,\n video,\n includesAnimation,\n}: Pick<HeroOverlayProps, 'image' | 'video' | 'includesAnimation'>) => {\n const children = buildAssetChildren({ image, video });\n\n if (children.length === 0) {\n return null;\n }\n\n return new ElementBuilder()\n .withClassName('umd-hero-overlay__asset')\n .withChildren(...children)\n .withStyles({\n element: {\n [`@media (${token.media.queries.large.max})`]: {\n [`&:has(.${elementStyles.asset.gif.toggle.className})`]: {\n minHeight: '56vw',\n display: 'grid',\n },\n },\n\n [`@container (${token.media.queries.tablet.min})`]: {\n position: 'absolute',\n width: '60%',\n height: `calc(100% - ${token.spacing['5xl']})`,\n right: 0,\n top: 0,\n overflow: 'visible',\n\n ...(includesAnimation && {\n [`@media (prefers-reduced-motion: no-preference)`]: {\n animation: `hero-overlay-resize forwards ${ANIMATION_CONFIG.RESIZE.DURATION}`,\n },\n }),\n },\n\n ['& img, & video']: {\n height: '100%',\n minHeight: '300px',\n },\n },\n })\n .build();\n};\n\nconst createHeadline = (\n props: Pick<HeroOverlayProps, 'headline'>,\n): ElementModel<HTMLElement> | null => {\n const { headline } = props;\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.extraLarge)\n .withStyles({\n element: {\n textTransform: 'uppercase',\n textWrap: 'pretty',\n color: token.color.white,\n\n [`@container (${token.media.queries.desktop.min})`]: {\n ...(isOverwriteHeadline && {\n fontSize: '80px',\n }),\n },\n },\n siblingAfter: {\n marginTop: token.spacing.md,\n },\n })\n .build();\n};\n\nconst createTextContent = (\n props: Pick<HeroOverlayProps, 'eyebrow' | 'headline' | 'text' | 'actions'>,\n) => {\n const textLockupElement = textLockup.large({\n ribbon: props.eyebrow,\n headlineComposite: createHeadline(props),\n text: props.text,\n actions: props.actions,\n isThemeDark: true,\n });\n\n return new ElementBuilder()\n .withClassName('umd-hero-overlay__text-content')\n .withChild(textLockupElement)\n .withStyles({\n element: {\n [`@container (${token.media.queries.tablet.min})`]: {\n maxWidth: '55%',\n },\n\n [`& .${elementStyles.text.rich.simpleLargeDark.className}`]: {\n [`@container (${token.media.queries.tablet.min})`]: {\n maxWidth: '60%',\n },\n },\n },\n })\n .build();\n};\n\nconst createText = (\n props: Pick<\n HeroOverlayProps,\n 'eyebrow' | 'headline' | 'text' | 'actions' | 'includesAnimation'\n >,\n) => {\n const { includesAnimation } = props;\n const textContent = createTextContent(props);\n\n const lock = new ElementBuilder()\n .styled(Styles.layout.space.horizontal.larger)\n .withChild(textContent)\n .withStyles({\n element: {\n height: '100%',\n width: '100%',\n position: 'relative',\n },\n })\n .build();\n\n return new ElementBuilder()\n .withClassName('umd-hero-overlay__text')\n .withChild(lock)\n .withStyles({\n element: {\n padding: `${token.spacing.lg} 0`,\n display: 'flex',\n position: 'relative',\n zIndex: 999,\n width: '100%',\n\n [`@container (${token.media.queries.tablet.min})`]: {\n padding: `${token.spacing['5xl']} 0`,\n\n ...(includesAnimation && {\n [`@media (prefers-reduced-motion: no-preference)`]: {\n animation: `hero-slide-up forwards ${ANIMATION_CONFIG.SLIDE_UP.DURATION}`,\n },\n }),\n },\n },\n })\n .build();\n};\n\nexport const createCompositeHeroOverlay = (props: HeroOverlayProps) => {\n const text = createText(props);\n const asset = createAsset(props);\n\n const container = new ElementBuilder()\n .withClassName('umd-hero-overlay__container')\n .withChild(text)\n .withStyles({\n element: {\n position: 'relative',\n backgroundColor: token.color.black,\n overflow: 'clip',\n\n [`@container (${token.media.queries.large.max})`]: {\n display: 'flex',\n flexDirection: 'column-reverse',\n },\n\n [`@container (${token.media.queries.tablet.min})`]: {\n minHeight: '640px',\n display: 'flex',\n alignItems: 'center',\n\n ['&:before']: {\n content: '\"\"',\n position: 'absolute',\n left: 0,\n right: '50px',\n top: 0,\n height: '100%',\n background:\n 'linear-gradient(90deg, rgba(0, 0, 0, 1) 40%, rgba(0, 0, 0, .8) 50%, rgba(0, 0, 0, 0) 75%)',\n zIndex: 999,\n },\n },\n\n [`@container (${token.media.queries.desktop.min})`]: {\n minHeight: '764px',\n },\n },\n });\n\n if (asset) {\n container.withChild(asset);\n }\n\n const containerBuilt = container.build();\n\n const composite = new ElementBuilder()\n .withClassName('umd-hero-overlay')\n .withChild(containerBuilt)\n .withStyles({\n element: {\n containerType: 'inline-size',\n },\n })\n .build();\n\n composite.styles += keyFrameHeroResize;\n composite.styles += keyFrameHeroSlideUp;\n\n return composite;\n};\n"],"names":["assets.video.observedAutoPlay","assets.image.background","assets.image.placeholder","textLockup.large"],"mappings":"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"}
1
+ {"version":3,"file":"overlay.js","sources":["../../../source/composite/hero/overlay.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport * as elementStyles from '@universityofmaryland/web-styles-library/element';\nimport * as Styles from '@universityofmaryland/web-styles-library';\nimport { assets, textLockup } from 'atomic';\nimport { type ElementModel } from '../../_types';\nimport { type HeroOverlayProps } from './_types';\n\nconst ANIMATION_CONFIG = {\n RESIZE: {\n DURATION: '1.5s',\n TRANSFORM: {\n FROM: 'scale(1.1)',\n TO: 'scale(1)',\n },\n },\n SLIDE_UP: {\n DURATION: '1.5s',\n TRANSFORM: {\n FROM: 'translateY(25px)',\n TO: 'translateY(0)',\n },\n OPACITY: {\n FROM: 0.2,\n TO: 1,\n },\n },\n} as const;\n\nconst keyFrameHeroResize = `\n @keyframes hero-overlay-resize {\n from { transform: ${ANIMATION_CONFIG.RESIZE.TRANSFORM.FROM}; }\n to { transform: ${ANIMATION_CONFIG.RESIZE.TRANSFORM.TO}; }\n }\n`;\n\nconst keyFrameHeroSlideUp = `\n @keyframes hero-slide-up {\n from {\n transform: ${ANIMATION_CONFIG.SLIDE_UP.TRANSFORM.FROM};\n opacity: ${ANIMATION_CONFIG.SLIDE_UP.OPACITY.FROM};\n }\n to {\n transform: ${ANIMATION_CONFIG.SLIDE_UP.TRANSFORM.TO};\n opacity: ${ANIMATION_CONFIG.SLIDE_UP.OPACITY.TO};\n }\n }\n`;\n\nconst createVideoAsset = (video: HTMLVideoElement) => {\n return assets.video.observedAutoPlay({\n video,\n isScaled: true,\n videoPreload: 'auto',\n videoFetchPriority: 'high',\n });\n};\n\nconst createImageAsset = (image: HTMLImageElement) => {\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\nconst buildAssetChildren = ({\n image,\n video,\n}: Pick<HeroOverlayProps, 'image' | 'video'>): ElementModel<HTMLElement>[] => {\n if (video && video instanceof HTMLVideoElement) {\n return [createVideoAsset(video)];\n }\n\n if (image) {\n return [createImageAsset(image)];\n }\n\n return [assets.image.placeholder.fearlessForward()];\n};\n\nconst createAsset = ({\n image,\n video,\n includesAnimation,\n}: Pick<HeroOverlayProps, 'image' | 'video' | 'includesAnimation'>) => {\n const children = buildAssetChildren({ image, video });\n\n if (children.length === 0) {\n return null;\n }\n\n return new ElementBuilder()\n .withClassName('umd-hero-overlay__asset')\n .withChildren(...children)\n .withStyles({\n element: {\n [`@media (${token.media.queries.large.max})`]: {\n [`&:has(.${elementStyles.asset.gif.toggle.className})`]: {\n minHeight: '56vw',\n display: 'grid',\n },\n },\n\n [`@container (${token.media.queries.tablet.min})`]: {\n position: 'absolute',\n width: '60%',\n height: `calc(100% - ${token.spacing['5xl']})`,\n right: 0,\n top: 0,\n overflow: 'visible',\n\n ...(includesAnimation && {\n [`@media (prefers-reduced-motion: no-preference)`]: {\n animation: `hero-overlay-resize forwards ${ANIMATION_CONFIG.RESIZE.DURATION}`,\n },\n }),\n },\n\n ['& img, & video']: {\n height: '100%',\n minHeight: '300px',\n },\n },\n })\n .build();\n};\n\nconst createHeadline = (\n props: Pick<HeroOverlayProps, 'headline'>,\n): ElementModel<HTMLElement> | null => {\n const { headline } = props;\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.extraLarge)\n .withStyles({\n element: {\n textTransform: 'uppercase',\n textWrap: 'pretty',\n color: token.color.white,\n\n [`@container (${token.media.queries.desktop.min})`]: {\n ...(isOverwriteHeadline && {\n fontSize: '80px',\n }),\n },\n },\n siblingAfter: {\n marginTop: token.spacing.md,\n },\n })\n .build();\n};\n\nconst createTextContent = (\n props: Pick<HeroOverlayProps, 'eyebrow' | 'headline' | 'text' | 'actions'>,\n) => {\n const textLockupElement = textLockup.large({\n ribbon: props.eyebrow,\n headlineComposite: createHeadline(props),\n text: props.text,\n actions: props.actions,\n isThemeDark: true,\n });\n\n return new ElementBuilder()\n .withClassName('umd-hero-overlay__text-content')\n .withChild(textLockupElement)\n .withStyles({\n element: {\n [`@container (${token.media.queries.tablet.min})`]: {\n maxWidth: '55%',\n },\n\n [`& .${elementStyles.text.rich.simpleLargeDark.className}`]: {\n [`@container (${token.media.queries.tablet.min})`]: {\n maxWidth: '60%',\n },\n },\n },\n })\n .build();\n};\n\nconst createText = (\n props: Pick<\n HeroOverlayProps,\n 'eyebrow' | 'headline' | 'text' | 'actions' | 'includesAnimation'\n >,\n) => {\n const { includesAnimation } = props;\n const textContent = createTextContent(props);\n\n const lock = new ElementBuilder()\n .styled(Styles.layout.space.horizontal.larger)\n .withChild(textContent)\n .withStyles({\n element: {\n height: '100%',\n width: '100%',\n position: 'relative',\n },\n })\n .build();\n\n return new ElementBuilder()\n .withClassName('umd-hero-overlay__text')\n .withChild(lock)\n .withStyles({\n element: {\n padding: `${token.spacing.lg} 0`,\n display: 'flex',\n position: 'relative',\n zIndex: 999,\n width: `calc(100% - 60px)`,\n\n [`@container (${token.media.queries.tablet.min})`]: {\n padding: `${token.spacing['5xl']} 0`,\n\n ...(includesAnimation && {\n [`@media (prefers-reduced-motion: no-preference)`]: {\n animation: `hero-slide-up forwards ${ANIMATION_CONFIG.SLIDE_UP.DURATION}`,\n },\n }),\n },\n },\n })\n .build();\n};\n\nexport const createCompositeHeroOverlay = (props: HeroOverlayProps) => {\n const text = createText(props);\n const asset = createAsset(props);\n\n const container = new ElementBuilder()\n .withClassName('umd-hero-overlay__container')\n .withChild(text)\n .withStyles({\n element: {\n position: 'relative',\n backgroundColor: token.color.black,\n overflow: 'clip',\n\n [`@container (${token.media.queries.large.max})`]: {\n display: 'flex',\n flexDirection: 'column-reverse',\n },\n\n [`@container (${token.media.queries.tablet.min})`]: {\n minHeight: '640px',\n display: 'flex',\n alignItems: 'center',\n\n ['&:before']: {\n content: '\"\"',\n position: 'absolute',\n left: 0,\n right: '50px',\n top: 0,\n height: '100%',\n background:\n 'linear-gradient(90deg, rgba(0, 0, 0, 1) 40%, rgba(0, 0, 0, .8) 50%, rgba(0, 0, 0, 0) 75%)',\n zIndex: 999,\n },\n },\n\n [`@container (${token.media.queries.desktop.min})`]: {\n minHeight: '764px',\n },\n },\n });\n\n if (asset) {\n container.withChild(asset);\n }\n\n const containerBuilt = container.build();\n\n const composite = new ElementBuilder()\n .withClassName('umd-hero-overlay')\n .withChild(containerBuilt)\n .withStyles({\n element: {\n containerType: 'inline-size',\n },\n })\n .build();\n\n composite.styles += keyFrameHeroResize;\n composite.styles += keyFrameHeroSlideUp;\n\n return composite;\n};\n"],"names":["assets.video.observedAutoPlay","assets.image.background","assets.image.placeholder","textLockup.large"],"mappings":"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"}
@@ -14,18 +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";
19
+ import "@universityofmaryland/web-utilities-library/accessibility";
20
20
  import { createVideoObservedAutoPlay } from "../../atomic/assets/video/observed-auto-play.js";
21
21
  import "@universityofmaryland/web-icons-library/location";
22
22
  import "@universityofmaryland/web-icons-library/calendar";
23
23
  import "@universityofmaryland/web-utilities-library/theme";
24
24
  import "../../atomic/layout/block/stacked.js";
25
- import "../../atomic/layout/overlay/modal.js";
26
25
  import "../../atomic/layout/person/columns.js";
27
26
  import "@universityofmaryland/web-icons-library/social";
28
- import "../../atomic/text-lockup/date.js";
27
+ import "@universityofmaryland/web-utilities-library/string";
28
+ import "@universityofmaryland/web-utilities-library/animation";
29
29
  import { createTextLockupLarge } from "../../atomic/text-lockup/large.js";
30
30
  import "../../atomic/text-lockup/small.js";
31
31
  const REF_KEY_FRAME_FADE_OVER = "hero-stacked-fade-over";
@@ -14,18 +14,19 @@ 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
+ import "@universityofmaryland/web-utilities-library/accessibility";
20
21
  import { imagePlaceholder } from "../../atomic/assets/image/placeholder.js";
21
22
  import { createVideoObservedAutoPlay } from "../../atomic/assets/video/observed-auto-play.js";
22
23
  import "@universityofmaryland/web-icons-library/location";
23
24
  import "@universityofmaryland/web-icons-library/calendar";
24
25
  import "../../atomic/layout/block/stacked.js";
25
- import "../../atomic/layout/overlay/modal.js";
26
26
  import "../../atomic/layout/person/columns.js";
27
27
  import "@universityofmaryland/web-icons-library/social";
28
- import "../../atomic/text-lockup/date.js";
28
+ import "@universityofmaryland/web-utilities-library/string";
29
+ import "@universityofmaryland/web-utilities-library/animation";
29
30
  import { createTextLockupLarge } from "../../atomic/text-lockup/large.js";
30
31
  import "../../atomic/text-lockup/small.js";
31
32
  const ANIMATION_CONFIG = {
@@ -1 +1 @@
1
- {"version":3,"file":"standard.js","sources":["../../../source/composite/hero/standard.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport * as elementStyles from '@universityofmaryland/web-styles-library/element';\nimport * as Styles from '@universityofmaryland/web-styles-library';\nimport { theme } from '@universityofmaryland/web-utilities-library/theme';\nimport { assets, textLockup } from 'atomic';\nimport { type HeroStandardProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\nconst ANIMATION_CONFIG = {\n SLIDE_UP: {\n DURATION: '1s',\n TRANSFORM: {\n FROM: 'translateY(25px)',\n TO: 'translateY(0)',\n },\n OPACITY: {\n FROM: 0.2,\n TO: 1,\n },\n },\n SCALE_DOWN: {\n DURATION: '1s',\n TRANSFORM: {\n FROM: 'scale(1.1)',\n TO: 'scale(1)',\n },\n },\n} as const;\n\nconst keyFrameHeroSlideUp = `\n @keyframes hero-slide-up {\n from {\n transform: ${ANIMATION_CONFIG.SLIDE_UP.TRANSFORM.FROM};\n opacity: ${ANIMATION_CONFIG.SLIDE_UP.OPACITY.FROM};\n }\n to {\n transform: ${ANIMATION_CONFIG.SLIDE_UP.TRANSFORM.TO};\n opacity: ${ANIMATION_CONFIG.SLIDE_UP.OPACITY.TO};\n }\n }\n`;\n\nconst keyFrameHeroScaleDown = `\n @keyframes hero-scale-down {\n from {\n transform: ${ANIMATION_CONFIG.SCALE_DOWN.TRANSFORM.FROM};\n }\n to {\n transform: ${ANIMATION_CONFIG.SCALE_DOWN.TRANSFORM.TO};\n }\n }\n`;\n\nconst createVideoAsset = (video: HTMLVideoElement) => {\n return assets.video.observedAutoPlay({\n video,\n isScaled: true,\n videoPreload: 'auto',\n videoFetchPriority: 'high',\n });\n};\n\nconst createImageAsset = (image: HTMLImageElement) => {\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\nconst buildAssetChildren = ({\n image,\n video,\n}: Pick<HeroStandardProps, 'image' | 'video'>): ElementModel<HTMLElement>[] => {\n const children: ElementModel<HTMLElement>[] = [];\n\n if (video) {\n children.push(createVideoAsset(video));\n }\n\n if (image && !video) {\n children.push(createImageAsset(image));\n }\n\n if (!image && !video) {\n children.push(assets.image.placeholder.fearlessForward());\n }\n\n return children;\n};\n\nconst buildAssetStyles = (includesAnimation?: boolean) => {\n return {\n element: {\n [`@container (${token.media.queries.large.max})`]: {\n aspectRatio: '16 / 9',\n },\n\n [`@container (${token.media.queries.tablet.min})`]: {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n },\n\n [`&:before`]: {\n [`@container (${token.media.queries.tablet.min})`]: {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n background:\n 'linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, .8) 85%)',\n zIndex: '99',\n },\n },\n\n ['& img']: {\n ...(includesAnimation && {\n [`@media (prefers-reduced-motion: no-preference)`]: {\n animation: `hero-scale-down forwards ${ANIMATION_CONFIG.SCALE_DOWN.DURATION}`,\n },\n }),\n },\n },\n };\n};\n\nconst createAsset = ({\n image,\n video,\n includesAnimation,\n}: Pick<HeroStandardProps, 'image' | 'video' | 'includesAnimation'>) => {\n const children = buildAssetChildren({ image, video });\n const elementStyles = buildAssetStyles(includesAnimation);\n\n return new ElementBuilder()\n .withClassName('umd-hero-default__asset')\n .withChildren(...children)\n .withStyles(elementStyles)\n .build();\n};\n\nconst createHeadline = (\n props: Pick<\n HeroStandardProps,\n 'headline' | 'isHeightSmall' | 'isThemeDark' | 'isTextCenter'\n >,\n): ElementModel<HTMLElement> | null => {\n const { headline, isHeightSmall, isTextCenter, isThemeDark } = props;\n const characterCount = headline?.textContent?.trim().length || 0;\n const isOverwriteHeadline = characterCount > 10 && isHeightSmall;\n\n if (!headline) return null;\n\n return new ElementBuilder(headline)\n .styled(\n Styles.typography.campaign.compose('extralarge', {\n theme: theme.fontColor(isThemeDark),\n }),\n )\n .withStyles({\n element: {\n textTransform: 'uppercase',\n\n [`@media (${token.media.queries.tablet.min})`]: {\n maxWidth: '700px',\n color: token.color.white,\n\n ...(isTextCenter && { marginLeft: 'auto', marginRight: 'auto' }),\n },\n\n [`@media (${token.media.queries.desktop.min})`]: {\n maxWidth: '816px',\n ...(isOverwriteHeadline && { fontSize: '80px' }),\n },\n },\n subElement: {\n color: 'currentColor',\n },\n siblingAfter: {\n marginTop: token.spacing.sm,\n },\n })\n .build();\n};\n\nconst createText = (props: HeroStandardProps) => {\n const {\n isTextCenter = false,\n isHeightSmall = false,\n includesAnimation,\n } = props;\n\n const text = textLockup.large({\n headlineComposite: createHeadline(props),\n ribbon: props.eyebrow,\n textLargest: props.text,\n actions: props.actions,\n isThemeDark: true,\n });\n\n const textContainer = new ElementBuilder()\n .withClassName('umd-hero-default__text')\n .withChild(text)\n .withStyles({\n element: {\n display: 'flex',\n alignItems: 'flex-end',\n height: '100%',\n\n ...(isTextCenter && {\n textAlign: 'center',\n justifyContent: 'center',\n marginLeft: 'auto',\n marginRight: 'auto',\n maxWidth: '928px',\n }),\n\n ...(includesAnimation && {\n animation: `hero-slide-up forwards ${ANIMATION_CONFIG.SLIDE_UP.DURATION}`,\n }),\n\n [`@container (${token.media.queries.tablet.min})`]: {\n maxWidth: '736px',\n paddingTop: `${token.spacing['2xl']}`,\n paddingBottom: `${token.spacing['2xl']}`,\n ...(!isTextCenter && {\n width: '80%',\n }),\n ...(isHeightSmall && {\n minHeight: '400px',\n alignItems: 'flex-end',\n display: 'flex',\n }),\n },\n\n [`@container (${token.media.queries.desktop.min})`]: {\n maxWidth: '808px',\n },\n },\n })\n .build();\n\n return new ElementBuilder()\n .styled(Styles.layout.space.horizontal.larger)\n .withChild(textContainer)\n .withStyles({\n element: {\n height: '100%',\n width: '100%',\n position: 'relative',\n zIndex: 99,\n\n [`@container (${token.media.queries.tablet.max})`]: {\n paddingTop: `${token.spacing.sm}`,\n\n [`&:has(.${elementStyles.text.decoration.ribbon.className})`]: {\n paddingTop: `0`,\n marginTop: '-14px',\n },\n },\n },\n })\n .build();\n};\n\nexport const createCompositeHeroStandard = (props: HeroStandardProps) => {\n const { isHeightSmall, isThemeDark } = props;\n const asset = createAsset(props);\n const text = createText(props);\n\n const composite = new ElementBuilder()\n .withClassName('umd-hero-default')\n .withChildren(asset, text)\n .withStyles({\n element: {\n position: 'relative',\n overflow: 'hidden',\n containerType: 'inline-size',\n\n ...(isThemeDark && {\n backgroundColor: token.color.black,\n }),\n\n [`@container (${token.media.queries.large.max})`]: {\n ...(isThemeDark && {\n paddingBottom: `${token.spacing.md}`,\n }),\n },\n\n [`@container (${token.media.queries.tablet.min})`]: {\n ...(!isHeightSmall && {\n height: '75vh',\n minHeight: '480px',\n }),\n },\n\n [`@container (${token.media.queries.desktop.min})`]: {\n ...(!isHeightSmall && {\n minHeight: '720px',\n }),\n },\n },\n subElement: {\n [`@container (${token.media.queries.large.max})`]: {\n [`*:not(.${elementStyles.asset.image.caption.className})`]: {\n ...(!isThemeDark && {\n color: `${token.color.black} !important`,\n }),\n },\n },\n },\n })\n .build();\n\n composite.styles += keyFrameHeroScaleDown;\n composite.styles += keyFrameHeroSlideUp;\n\n return composite;\n};\n"],"names":["assets.video.observedAutoPlay","assets.image.background","assets.image.placeholder","elementStyles","textLockup.large"],"mappings":"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"}
1
+ {"version":3,"file":"standard.js","sources":["../../../source/composite/hero/standard.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport * as elementStyles from '@universityofmaryland/web-styles-library/element';\nimport * as Styles from '@universityofmaryland/web-styles-library';\nimport { theme } from '@universityofmaryland/web-utilities-library/theme';\nimport { assets, textLockup } from 'atomic';\nimport { type HeroStandardProps } from './_types';\nimport { type ElementModel } from '../../_types';\n\nconst ANIMATION_CONFIG = {\n SLIDE_UP: {\n DURATION: '1s',\n TRANSFORM: {\n FROM: 'translateY(25px)',\n TO: 'translateY(0)',\n },\n OPACITY: {\n FROM: 0.2,\n TO: 1,\n },\n },\n SCALE_DOWN: {\n DURATION: '1s',\n TRANSFORM: {\n FROM: 'scale(1.1)',\n TO: 'scale(1)',\n },\n },\n} as const;\n\nconst keyFrameHeroSlideUp = `\n @keyframes hero-slide-up {\n from {\n transform: ${ANIMATION_CONFIG.SLIDE_UP.TRANSFORM.FROM};\n opacity: ${ANIMATION_CONFIG.SLIDE_UP.OPACITY.FROM};\n }\n to {\n transform: ${ANIMATION_CONFIG.SLIDE_UP.TRANSFORM.TO};\n opacity: ${ANIMATION_CONFIG.SLIDE_UP.OPACITY.TO};\n }\n }\n`;\n\nconst keyFrameHeroScaleDown = `\n @keyframes hero-scale-down {\n from {\n transform: ${ANIMATION_CONFIG.SCALE_DOWN.TRANSFORM.FROM};\n }\n to {\n transform: ${ANIMATION_CONFIG.SCALE_DOWN.TRANSFORM.TO};\n }\n }\n`;\n\nconst createVideoAsset = (video: HTMLVideoElement) => {\n return assets.video.observedAutoPlay({\n video,\n isScaled: true,\n videoPreload: 'auto',\n videoFetchPriority: 'high',\n });\n};\n\nconst createImageAsset = (image: HTMLImageElement) => {\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\nconst buildAssetChildren = ({\n image,\n video,\n}: Pick<HeroStandardProps, 'image' | 'video'>): ElementModel<HTMLElement>[] => {\n const children: ElementModel<HTMLElement>[] = [];\n\n if (video) {\n children.push(createVideoAsset(video));\n }\n\n if (image && !video) {\n children.push(createImageAsset(image));\n }\n\n if (!image && !video) {\n children.push(assets.image.placeholder.fearlessForward());\n }\n\n return children;\n};\n\nconst buildAssetStyles = (includesAnimation?: boolean) => {\n return {\n element: {\n [`@container (${token.media.queries.large.max})`]: {\n aspectRatio: '16 / 9',\n },\n\n [`@container (${token.media.queries.tablet.min})`]: {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n },\n\n [`&:before`]: {\n [`@container (${token.media.queries.tablet.min})`]: {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n background:\n 'linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, .8) 85%)',\n zIndex: '99',\n },\n },\n\n ['& img']: {\n ...(includesAnimation && {\n [`@media (prefers-reduced-motion: no-preference)`]: {\n animation: `hero-scale-down forwards ${ANIMATION_CONFIG.SCALE_DOWN.DURATION}`,\n },\n }),\n },\n },\n };\n};\n\nconst createAsset = ({\n image,\n video,\n includesAnimation,\n}: Pick<HeroStandardProps, 'image' | 'video' | 'includesAnimation'>) => {\n const children = buildAssetChildren({ image, video });\n const elementStyles = buildAssetStyles(includesAnimation);\n\n return new ElementBuilder()\n .withClassName('umd-hero-default__asset')\n .withChildren(...children)\n .withStyles(elementStyles)\n .build();\n};\n\nconst createHeadline = (\n props: Pick<\n HeroStandardProps,\n 'headline' | 'isHeightSmall' | 'isThemeDark' | 'isTextCenter'\n >,\n): ElementModel<HTMLElement> | null => {\n const { headline, isHeightSmall, isTextCenter, isThemeDark } = props;\n const characterCount = headline?.textContent?.trim().length || 0;\n const isOverwriteHeadline = characterCount > 10 && isHeightSmall;\n\n if (!headline) return null;\n\n return new ElementBuilder(headline)\n .styled(\n Styles.typography.campaign.compose('extralarge', {\n theme: theme.fontColor(isThemeDark),\n }),\n )\n .withStyles({\n element: {\n textTransform: 'uppercase',\n\n [`@media (${token.media.queries.tablet.min})`]: {\n maxWidth: '700px',\n color: token.color.white,\n\n ...(isTextCenter && { marginLeft: 'auto', marginRight: 'auto' }),\n },\n\n [`@media (${token.media.queries.desktop.min})`]: {\n maxWidth: '816px',\n ...(isOverwriteHeadline && { fontSize: '80px' }),\n },\n },\n subElement: {\n color: 'currentColor',\n },\n siblingAfter: {\n marginTop: token.spacing.sm,\n },\n })\n .build();\n};\n\nconst createText = (props: HeroStandardProps) => {\n const {\n isTextCenter = false,\n isHeightSmall = false,\n includesAnimation,\n } = props;\n\n const text = textLockup.large({\n headlineComposite: createHeadline(props),\n ribbon: props.eyebrow,\n textLargest: props.text,\n actions: props.actions,\n isThemeDark: true,\n });\n\n const textContainer = new ElementBuilder()\n .withClassName('umd-hero-default__text')\n .withChild(text)\n .withStyles({\n element: {\n display: 'flex',\n alignItems: 'flex-end',\n height: '100%',\n\n ...(isTextCenter && {\n textAlign: 'center',\n justifyContent: 'center',\n marginLeft: 'auto',\n marginRight: 'auto',\n maxWidth: '928px',\n }),\n\n ...(includesAnimation && {\n animation: `hero-slide-up forwards ${ANIMATION_CONFIG.SLIDE_UP.DURATION}`,\n }),\n\n [`@container (${token.media.queries.tablet.min})`]: {\n maxWidth: '736px',\n paddingTop: `${token.spacing['2xl']}`,\n paddingBottom: `${token.spacing['2xl']}`,\n ...(!isTextCenter && {\n width: '80%',\n }),\n ...(isHeightSmall && {\n minHeight: '400px',\n alignItems: 'flex-end',\n display: 'flex',\n }),\n },\n\n [`@container (${token.media.queries.desktop.min})`]: {\n maxWidth: '808px',\n },\n },\n })\n .build();\n\n return new ElementBuilder()\n .styled(Styles.layout.space.horizontal.larger)\n .withChild(textContainer)\n .withStyles({\n element: {\n height: '100%',\n width: '100%',\n position: 'relative',\n zIndex: 99,\n\n [`@container (${token.media.queries.tablet.max})`]: {\n paddingTop: `${token.spacing.sm}`,\n\n [`&:has(.${elementStyles.text.decoration.ribbon.className})`]: {\n paddingTop: `0`,\n marginTop: '-14px',\n },\n },\n },\n })\n .build();\n};\n\nexport const createCompositeHeroStandard = (props: HeroStandardProps) => {\n const { isHeightSmall, isThemeDark } = props;\n const asset = createAsset(props);\n const text = createText(props);\n\n const composite = new ElementBuilder()\n .withClassName('umd-hero-default')\n .withChildren(asset, text)\n .withStyles({\n element: {\n position: 'relative',\n overflow: 'hidden',\n containerType: 'inline-size',\n\n ...(isThemeDark && {\n backgroundColor: token.color.black,\n }),\n\n [`@container (${token.media.queries.large.max})`]: {\n ...(isThemeDark && {\n paddingBottom: `${token.spacing.md}`,\n }),\n },\n\n [`@container (${token.media.queries.tablet.min})`]: {\n ...(!isHeightSmall && {\n height: '75vh',\n minHeight: '480px',\n }),\n },\n\n [`@container (${token.media.queries.desktop.min})`]: {\n ...(!isHeightSmall && {\n minHeight: '720px',\n }),\n },\n },\n subElement: {\n [`@container (${token.media.queries.large.max})`]: {\n [`*:not(.${elementStyles.asset.image.caption.className})`]: {\n ...(!isThemeDark && {\n color: `${token.color.black} !important`,\n }),\n },\n },\n },\n })\n .build();\n\n composite.styles += keyFrameHeroScaleDown;\n composite.styles += keyFrameHeroSlideUp;\n\n return composite;\n};\n"],"names":["assets.video.observedAutoPlay","assets.image.background","assets.image.placeholder","elementStyles","textLockup.large"],"mappings":"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"}
@@ -4,8 +4,5 @@ export type TypeLogoRequirements = {
4
4
  image: HTMLElement;
5
5
  text?: HTMLElement | null;
6
6
  };
7
- export declare const createCompositeLayoutBoxLogo: (element: TypeLogoRequirements) => {
8
- element: HTMLDivElement;
9
- styles: string;
10
- };
7
+ export declare const createCompositeLayoutBoxLogo: (element: TypeLogoRequirements) => import('../../../../builder/dist/index.d.ts').ElementModel<HTMLElement>;
11
8
  //# sourceMappingURL=logo.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logo.d.ts","sourceRoot":"","sources":["../../../../source/composite/layout/box/logo.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAC3B,CAAC;AA6HF,eAAO,MAAM,4BAA4B,YAtBF,oBAAoB;;;CAsBK,CAAC"}
1
+ {"version":3,"file":"logo.d.ts","sourceRoot":"","sources":["../../../../source/composite/layout/box/logo.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAC3B,CAAC;AA2EF,eAAO,MAAM,4BAA4B,YAzEF,oBAAoB,kFAyEK,CAAC"}