@universityofmaryland/web-elements-library 1.6.0-beta.2 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/atomic/animations/actions/_types.d.ts +7 -0
- package/dist/atomic/animations/actions/_types.d.ts.map +1 -0
- package/dist/atomic/animations/actions/indicator.d.ts +7 -10
- package/dist/atomic/animations/actions/indicator.d.ts.map +1 -1
- package/dist/atomic/animations/actions/indicator.js +102 -104
- package/dist/atomic/animations/actions/indicator.js.map +1 -1
- package/dist/atomic/animations/brand/card-stack.js +1 -2
- package/dist/atomic/animations/brand/card-stack.js.map +1 -1
- package/dist/atomic/layout/person/columns.js +1 -2
- package/dist/atomic/layout/person/columns.js.map +1 -1
- package/dist/atomic/text-lockup/small.d.ts +3 -0
- package/dist/atomic/text-lockup/small.d.ts.map +1 -1
- package/dist/atomic/text-lockup/small.js +4 -1
- package/dist/atomic/text-lockup/small.js.map +1 -1
- package/dist/composite/card/block.js +1 -2
- package/dist/composite/card/block.js.map +1 -1
- package/dist/composite/card/list.js +1 -2
- package/dist/composite/card/list.js.map +1 -1
- package/dist/composite/card/overlay/color.js +1 -2
- package/dist/composite/card/overlay/color.js.map +1 -1
- package/dist/composite/card/overlay/icon.js +1 -2
- package/dist/composite/card/overlay/icon.js.map +1 -1
- package/dist/composite/card/overlay/image.js +1 -2
- package/dist/composite/card/overlay/image.js.map +1 -1
- package/dist/composite/card/video/block.js +1 -2
- package/dist/composite/card/video/block.js.map +1 -1
- package/dist/composite/carousel/elements/full-screen.js +1 -2
- package/dist/composite/carousel/elements/full-screen.js.map +1 -1
- package/dist/composite/carousel/image/multiple.js +1 -2
- package/dist/composite/carousel/image/multiple.js.map +1 -1
- package/dist/composite/carousel/image/standard.d.ts.map +1 -1
- package/dist/composite/carousel/image/standard.js +3 -1
- package/dist/composite/carousel/image/standard.js.map +1 -1
- package/dist/composite/carousel/wide/container.d.ts +5 -3
- package/dist/composite/carousel/wide/container.d.ts.map +1 -1
- package/dist/composite/carousel/wide/controls.d.ts +5 -3
- package/dist/composite/carousel/wide/controls.d.ts.map +1 -1
- package/dist/composite/carousel/wide/frames.js +1 -2
- package/dist/composite/carousel/wide/frames.js.map +1 -1
- package/dist/composite/carousel/wide/index.js +1 -2
- package/dist/composite/carousel/wide/index.js.map +1 -1
- package/dist/composite/footer/base.d.ts +1 -1
- package/dist/composite/hero/custom/expand.js +1 -2
- package/dist/composite/hero/custom/expand.js.map +1 -1
- package/dist/composite/hero/custom/grid.js +1 -2
- package/dist/composite/hero/custom/grid.js.map +1 -1
- package/dist/composite/hero/custom/video-arrow.js +0 -1
- package/dist/composite/hero/custom/video-arrow.js.map +1 -1
- package/dist/composite/hero/logo.js +1 -2
- package/dist/composite/hero/logo.js.map +1 -1
- package/dist/composite/hero/minimal.js +1 -2
- package/dist/composite/hero/minimal.js.map +1 -1
- package/dist/composite/hero/overlay.js +1 -2
- package/dist/composite/hero/overlay.js.map +1 -1
- package/dist/composite/hero/stacked.js +1 -2
- package/dist/composite/hero/stacked.js.map +1 -1
- package/dist/composite/hero/standard.js +1 -2
- package/dist/composite/hero/standard.js.map +1 -1
- package/dist/composite/media/elements/gif.js +1 -2
- package/dist/composite/media/elements/gif.js.map +1 -1
- package/dist/composite/navigation/utility/alert.js +1 -2
- package/dist/composite/navigation/utility/alert.js.map +1 -1
- package/dist/composite/pathway/_common.js +1 -2
- package/dist/composite/pathway/_common.js.map +1 -1
- package/dist/composite/pathway/hero.js +1 -2
- package/dist/composite/pathway/hero.js.map +1 -1
- package/dist/composite/person/bio/full.js +1 -2
- package/dist/composite/person/bio/full.js.map +1 -1
- package/dist/composite/person/bio/small.js +1 -2
- package/dist/composite/person/bio/small.js.map +1 -1
- package/dist/composite/person/block.js +1 -2
- package/dist/composite/person/block.js.map +1 -1
- package/dist/composite/person/hero.js +1 -2
- package/dist/composite/person/hero.js.map +1 -1
- package/dist/composite/person/list.js +1 -2
- package/dist/composite/person/list.js.map +1 -1
- package/dist/composite/person/tabular.js +1 -2
- package/dist/composite/person/tabular.js.map +1 -1
- package/package.json +1 -1
|
@@ -12,11 +12,10 @@ import "@universityofmaryland/web-icons-library/communication";
|
|
|
12
12
|
import "@universityofmaryland/web-icons-library/files";
|
|
13
13
|
import "@universityofmaryland/web-icons-library/brand";
|
|
14
14
|
import "@universityofmaryland/web-icons-library/arrows";
|
|
15
|
-
import "
|
|
15
|
+
import "@universityofmaryland/web-utilities-library/performance";
|
|
16
16
|
import "../../atomic/animations/brand/chevron-scroll.js";
|
|
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/performance";
|
|
20
19
|
import { imagePlaceholder } from "../../atomic/assets/image/placeholder.js";
|
|
21
20
|
import { createVideoObservedAutoPlay } from "../../atomic/assets/video/observed-auto-play.js";
|
|
22
21
|
import "@universityofmaryland/web-icons-library/location";
|
|
@@ -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 });\n};\n\nconst createImageAsset = (image: HTMLImageElement) => {\n return assets.image.background({\n element: image,\n isScaled: true,\n isGifAllowed: true,\n isShowCaption: true,\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 });\n};\n\nconst createImageAsset = (image: HTMLImageElement) => {\n return assets.image.background({\n element: image,\n isScaled: true,\n isGifAllowed: true,\n isShowCaption: true,\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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"}
|
|
@@ -13,11 +13,10 @@ import "@universityofmaryland/web-icons-library/communication";
|
|
|
13
13
|
import "@universityofmaryland/web-icons-library/files";
|
|
14
14
|
import "@universityofmaryland/web-icons-library/brand";
|
|
15
15
|
import "@universityofmaryland/web-icons-library/arrows";
|
|
16
|
-
import "
|
|
16
|
+
import "@universityofmaryland/web-utilities-library/performance";
|
|
17
17
|
import "../../atomic/animations/brand/chevron-scroll.js";
|
|
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/performance";
|
|
21
20
|
import { createVideoObservedAutoPlay } from "../../atomic/assets/video/observed-auto-play.js";
|
|
22
21
|
import "@universityofmaryland/web-icons-library/location";
|
|
23
22
|
import "@universityofmaryland/web-icons-library/calendar";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stacked.js","sources":["../../../source/composite/hero/stacked.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 { withViewTimelineAnimation } from '@universityofmaryland/web-utilities-library/styles';\nimport { assets, textLockup } from 'atomic';\nimport { type ElementModel } from '../../_types';\nimport { type HeroStackedProps } from './_types';\n\nconst REF_KEY_FRAME_FADE_OVER = 'hero-stacked-fade-over';\nconst REF_KEY_FRAME_FONT_COLOR = 'hero-stacked-font-color';\n\nconst keyFrameFadeOver = `\n @keyframes ${REF_KEY_FRAME_FADE_OVER} {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n`;\n\nconst keyFrameFontColor = `\n @keyframes ${REF_KEY_FRAME_FONT_COLOR} {\n from { color: ${token.color.black}; }\n to { color: ${token.color.white}; }\n }\n`;\n\nconst createVideoAsset = (video: HTMLVideoElement) => {\n return assets.video.observedAutoPlay({\n video,\n isScaled: true,\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 customStyles: {\n [`@media (${token.media.queries.large.max})`]: {\n [`&:has(.${elementStyles.asset.gif.toggle.className})`]: {\n minHeight: '56vw',\n },\n },\n\n [`@media (${token.media.queries.tablet.min})`]: {\n [`&:has(.${elementStyles.asset.gif.toggle.className})`]: {\n minHeight: '550px',\n },\n },\n\n [`& .${elementStyles.asset.gif.toggle.className} button`]: {\n zIndex: 99999,\n },\n },\n });\n};\n\nconst createOverlay = (includesAnimation?: boolean) => {\n return new ElementBuilder()\n .withClassName('umd-hero-stacked__overlay')\n .withStyles({\n element: {\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n height: '100vh',\n width: '100vw',\n display: 'block',\n backgroundColor: 'rgba(0,0,0,.7)',\n zIndex: 99,\n opacity: 0,\n\n ...(includesAnimation && {\n [`@media (${token.media.queries.tablet.min})`]: {\n [`@media (prefers-reduced-motion: no-preference)`]: {\n [`@supports (animation-timeline: scroll())`]: {\n animation: `${REF_KEY_FRAME_FADE_OVER} ease-in-out forwards`,\n animationTimeline: 'view()',\n animationRangeStart: '30vh',\n animationRangeEnd: '70vh',\n },\n },\n },\n }),\n },\n })\n .build();\n};\n\nconst createAsset = ({\n image,\n video,\n includesAnimation,\n isWidthLarge = false,\n isHeightSmall = false,\n}: Pick<\n HeroStackedProps,\n 'image' | 'video' | 'includesAnimation' | 'isWidthLarge' | 'isHeightSmall'\n>) => {\n let mediaElement: ElementModel<HTMLElement> | null = null;\n\n if (video && video instanceof HTMLVideoElement) {\n mediaElement = createVideoAsset(video);\n } else if (image) {\n mediaElement = createImageAsset(image);\n }\n\n if (!mediaElement) {\n return null;\n }\n\n const assetInteriorElement = new ElementBuilder()\n .withClassName('umd-hero-stacked__asset--interior')\n .withChildren(mediaElement, createOverlay(includesAnimation))\n .withStyles({\n element: {\n overflow: 'clip',\n position: 'relative',\n height: '100%',\n },\n })\n .build();\n\n const horizontalLock = new ElementBuilder()\n .styled(Styles.layout.space.horizontal.larger)\n .withChild(assetInteriorElement)\n .withStyles({\n element: {\n height: '100%',\n width: '100%',\n },\n })\n .build();\n\n const builder = new ElementBuilder().withClassName('umd-hero-stacked__asset');\n\n if (isWidthLarge) {\n builder.withChild(horizontalLock);\n } else {\n builder.withChildren(mediaElement, createOverlay(includesAnimation));\n }\n\n return builder\n .withStyles({\n element: {\n position: 'relative',\n overflow: 'clip',\n display: 'grid',\n\n ['& img, & video']: {\n objectFit: 'cover',\n aspectRatio: '5 / 4',\n\n [`@container (${token.media.queries.tablet.min})`]: {\n maxHeight: '700px',\n minHeight: '300px',\n\n ...(!isHeightSmall && {\n minHeight: '400px',\n height: '65vh !important',\n }),\n },\n },\n },\n })\n .build();\n};\n\nconst createHeadline = (\n props: Pick<\n HeroStackedProps,\n 'headline' | 'isHeightSmall' | 'includesAnimation' | 'isThemeDark'\n >,\n): ElementModel<HTMLElement> | null => {\n const { headline, isHeightSmall, includesAnimation, isThemeDark } = 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 const animationStyles = {\n [`@container (${token.media.queries.tablet.min})`]: {\n ...withViewTimelineAnimation({\n animation: `${REF_KEY_FRAME_FONT_COLOR} ease-in-out forwards`,\n animationTimeline: 'view()',\n animationRangeStart: '100vh',\n animationRangeEnd: '130vh',\n\n ...(isHeightSmall && {\n animationRangeStart: '120vh',\n animationRangeEnd: '150vh',\n }),\n }),\n },\n };\n\n const elementStyles = {\n element: {\n color: token.color.black,\n margin: '0 auto',\n textTransform: 'uppercase',\n marginTop: `${token.spacing.sm}`,\n\n ...(isThemeDark && {\n color: token.color.white,\n }),\n\n ...(includesAnimation && {\n ...(!isThemeDark && {\n ...animationStyles,\n }),\n }),\n\n ...desktopStyles,\n },\n siblingAfter: {\n marginTop: `${token.spacing.md}`,\n },\n };\n\n return new ElementBuilder(headline)\n .styled(Styles.typography.campaign.fonts.large)\n .withStyles(elementStyles)\n .build();\n};\n\nconst createText = (\n props: Omit<HeroStackedProps, 'image' | 'video' | 'isWidthLarge'>,\n) => {\n const { topPosition, isThemeDark, includesAnimation, isHeightSmall } = props;\n const additionalSpread = topPosition ? parseInt(topPosition) : null;\n const textLockupElement = textLockup.large({\n ...props,\n ribbon: props.eyebrow,\n headlineComposite: createHeadline(props),\n textLargest: props.text,\n });\n\n const lock = new ElementBuilder()\n .styled(Styles.layout.space.horizontal.small)\n .withChild(textLockupElement)\n .withStyles({\n element: {\n position: 'relative',\n },\n })\n .build();\n\n return new ElementBuilder()\n .withClassName('umd-hero-stacked__text')\n .withChild(lock)\n .withStyles({\n element: {\n padding: `${token.spacing.lg} 0`,\n display: 'flex',\n justifyContent: 'center',\n textAlign: 'center',\n position: 'relative',\n zIndex: '999',\n\n [`@container (${token.media.queries.tablet.min})`]: {\n padding: `${token.spacing['6xl']} 0 ${token.spacing['3xl']}`,\n },\n\n ...(includesAnimation && {\n [`@container (${token.media.queries.tablet.min})`]: {\n ...withViewTimelineAnimation({\n position: 'sticky',\n top: additionalSpread || 0,\n }),\n },\n }),\n\n [`& *`]: {\n ...(includesAnimation && {\n ...(!isThemeDark && {\n [`@container (${token.media.queries.tablet.min})`]: {\n ...withViewTimelineAnimation({\n animation: `${REF_KEY_FRAME_FONT_COLOR} ease-in-out forwards`,\n animationTimeline: 'view()',\n animationRangeStart: '90vh',\n animationRangeEnd: '110vh',\n\n ...(isHeightSmall && {\n animationRangeStart: '90vh',\n animationRangeEnd: '110vh',\n }),\n }),\n },\n }),\n }),\n },\n\n [`& .${elementStyles.text.decoration.ribbon.className[0]}`]: {\n animation: 'none !important',\n },\n\n [`& .${elementStyles.text.rich.simpleLargest.className}`]: {\n maxWidth: '860px',\n marginLeft: 'auto',\n marginRight: 'auto',\n },\n },\n })\n .build();\n};\n\nexport const createCompositeHeroStacked = (props: HeroStackedProps) => {\n const asset = createAsset(props);\n const hasAsset = asset !== null;\n const shouldAnimateText = hasAsset && props.includesAnimation;\n\n const text = createText({\n ...props,\n includesAnimation: shouldAnimateText,\n });\n\n const children: ElementModel<HTMLElement>[] = [text];\n if (hasAsset) {\n children.push(asset);\n }\n\n const composite = new ElementBuilder()\n .withClassName('umd-hero-stacked')\n .withChildren(...children)\n .withStyles({\n element: {\n containerType: 'inline-size',\n\n ...(props.isThemeDark && {\n backgroundColor: token.color.black,\n }),\n },\n })\n .build();\n\n composite.styles += keyFrameFadeOver;\n composite.styles += keyFrameFontColor;\n\n return composite;\n};\n"],"names":["assets.video.observedAutoPlay","assets.image.background","elementStyles","textLockup.large"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stacked.js","sources":["../../../source/composite/hero/stacked.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 { withViewTimelineAnimation } from '@universityofmaryland/web-utilities-library/styles';\nimport { assets, textLockup } from 'atomic';\nimport { type ElementModel } from '../../_types';\nimport { type HeroStackedProps } from './_types';\n\nconst REF_KEY_FRAME_FADE_OVER = 'hero-stacked-fade-over';\nconst REF_KEY_FRAME_FONT_COLOR = 'hero-stacked-font-color';\n\nconst keyFrameFadeOver = `\n @keyframes ${REF_KEY_FRAME_FADE_OVER} {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n`;\n\nconst keyFrameFontColor = `\n @keyframes ${REF_KEY_FRAME_FONT_COLOR} {\n from { color: ${token.color.black}; }\n to { color: ${token.color.white}; }\n }\n`;\n\nconst createVideoAsset = (video: HTMLVideoElement) => {\n return assets.video.observedAutoPlay({\n video,\n isScaled: true,\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 customStyles: {\n [`@media (${token.media.queries.large.max})`]: {\n [`&:has(.${elementStyles.asset.gif.toggle.className})`]: {\n minHeight: '56vw',\n },\n },\n\n [`@media (${token.media.queries.tablet.min})`]: {\n [`&:has(.${elementStyles.asset.gif.toggle.className})`]: {\n minHeight: '550px',\n },\n },\n\n [`& .${elementStyles.asset.gif.toggle.className} button`]: {\n zIndex: 99999,\n },\n },\n });\n};\n\nconst createOverlay = (includesAnimation?: boolean) => {\n return new ElementBuilder()\n .withClassName('umd-hero-stacked__overlay')\n .withStyles({\n element: {\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n height: '100vh',\n width: '100vw',\n display: 'block',\n backgroundColor: 'rgba(0,0,0,.7)',\n zIndex: 99,\n opacity: 0,\n\n ...(includesAnimation && {\n [`@media (${token.media.queries.tablet.min})`]: {\n [`@media (prefers-reduced-motion: no-preference)`]: {\n [`@supports (animation-timeline: scroll())`]: {\n animation: `${REF_KEY_FRAME_FADE_OVER} ease-in-out forwards`,\n animationTimeline: 'view()',\n animationRangeStart: '30vh',\n animationRangeEnd: '70vh',\n },\n },\n },\n }),\n },\n })\n .build();\n};\n\nconst createAsset = ({\n image,\n video,\n includesAnimation,\n isWidthLarge = false,\n isHeightSmall = false,\n}: Pick<\n HeroStackedProps,\n 'image' | 'video' | 'includesAnimation' | 'isWidthLarge' | 'isHeightSmall'\n>) => {\n let mediaElement: ElementModel<HTMLElement> | null = null;\n\n if (video && video instanceof HTMLVideoElement) {\n mediaElement = createVideoAsset(video);\n } else if (image) {\n mediaElement = createImageAsset(image);\n }\n\n if (!mediaElement) {\n return null;\n }\n\n const assetInteriorElement = new ElementBuilder()\n .withClassName('umd-hero-stacked__asset--interior')\n .withChildren(mediaElement, createOverlay(includesAnimation))\n .withStyles({\n element: {\n overflow: 'clip',\n position: 'relative',\n height: '100%',\n },\n })\n .build();\n\n const horizontalLock = new ElementBuilder()\n .styled(Styles.layout.space.horizontal.larger)\n .withChild(assetInteriorElement)\n .withStyles({\n element: {\n height: '100%',\n width: '100%',\n },\n })\n .build();\n\n const builder = new ElementBuilder().withClassName('umd-hero-stacked__asset');\n\n if (isWidthLarge) {\n builder.withChild(horizontalLock);\n } else {\n builder.withChildren(mediaElement, createOverlay(includesAnimation));\n }\n\n return builder\n .withStyles({\n element: {\n position: 'relative',\n overflow: 'clip',\n display: 'grid',\n\n ['& img, & video']: {\n objectFit: 'cover',\n aspectRatio: '5 / 4',\n\n [`@container (${token.media.queries.tablet.min})`]: {\n maxHeight: '700px',\n minHeight: '300px',\n\n ...(!isHeightSmall && {\n minHeight: '400px',\n height: '65vh !important',\n }),\n },\n },\n },\n })\n .build();\n};\n\nconst createHeadline = (\n props: Pick<\n HeroStackedProps,\n 'headline' | 'isHeightSmall' | 'includesAnimation' | 'isThemeDark'\n >,\n): ElementModel<HTMLElement> | null => {\n const { headline, isHeightSmall, includesAnimation, isThemeDark } = 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 const animationStyles = {\n [`@container (${token.media.queries.tablet.min})`]: {\n ...withViewTimelineAnimation({\n animation: `${REF_KEY_FRAME_FONT_COLOR} ease-in-out forwards`,\n animationTimeline: 'view()',\n animationRangeStart: '100vh',\n animationRangeEnd: '130vh',\n\n ...(isHeightSmall && {\n animationRangeStart: '120vh',\n animationRangeEnd: '150vh',\n }),\n }),\n },\n };\n\n const elementStyles = {\n element: {\n color: token.color.black,\n margin: '0 auto',\n textTransform: 'uppercase',\n marginTop: `${token.spacing.sm}`,\n\n ...(isThemeDark && {\n color: token.color.white,\n }),\n\n ...(includesAnimation && {\n ...(!isThemeDark && {\n ...animationStyles,\n }),\n }),\n\n ...desktopStyles,\n },\n siblingAfter: {\n marginTop: `${token.spacing.md}`,\n },\n };\n\n return new ElementBuilder(headline)\n .styled(Styles.typography.campaign.fonts.large)\n .withStyles(elementStyles)\n .build();\n};\n\nconst createText = (\n props: Omit<HeroStackedProps, 'image' | 'video' | 'isWidthLarge'>,\n) => {\n const { topPosition, isThemeDark, includesAnimation, isHeightSmall } = props;\n const additionalSpread = topPosition ? parseInt(topPosition) : null;\n const textLockupElement = textLockup.large({\n ...props,\n ribbon: props.eyebrow,\n headlineComposite: createHeadline(props),\n textLargest: props.text,\n });\n\n const lock = new ElementBuilder()\n .styled(Styles.layout.space.horizontal.small)\n .withChild(textLockupElement)\n .withStyles({\n element: {\n position: 'relative',\n },\n })\n .build();\n\n return new ElementBuilder()\n .withClassName('umd-hero-stacked__text')\n .withChild(lock)\n .withStyles({\n element: {\n padding: `${token.spacing.lg} 0`,\n display: 'flex',\n justifyContent: 'center',\n textAlign: 'center',\n position: 'relative',\n zIndex: '999',\n\n [`@container (${token.media.queries.tablet.min})`]: {\n padding: `${token.spacing['6xl']} 0 ${token.spacing['3xl']}`,\n },\n\n ...(includesAnimation && {\n [`@container (${token.media.queries.tablet.min})`]: {\n ...withViewTimelineAnimation({\n position: 'sticky',\n top: additionalSpread || 0,\n }),\n },\n }),\n\n [`& *`]: {\n ...(includesAnimation && {\n ...(!isThemeDark && {\n [`@container (${token.media.queries.tablet.min})`]: {\n ...withViewTimelineAnimation({\n animation: `${REF_KEY_FRAME_FONT_COLOR} ease-in-out forwards`,\n animationTimeline: 'view()',\n animationRangeStart: '90vh',\n animationRangeEnd: '110vh',\n\n ...(isHeightSmall && {\n animationRangeStart: '90vh',\n animationRangeEnd: '110vh',\n }),\n }),\n },\n }),\n }),\n },\n\n [`& .${elementStyles.text.decoration.ribbon.className[0]}`]: {\n animation: 'none !important',\n },\n\n [`& .${elementStyles.text.rich.simpleLargest.className}`]: {\n maxWidth: '860px',\n marginLeft: 'auto',\n marginRight: 'auto',\n },\n },\n })\n .build();\n};\n\nexport const createCompositeHeroStacked = (props: HeroStackedProps) => {\n const asset = createAsset(props);\n const hasAsset = asset !== null;\n const shouldAnimateText = hasAsset && props.includesAnimation;\n\n const text = createText({\n ...props,\n includesAnimation: shouldAnimateText,\n });\n\n const children: ElementModel<HTMLElement>[] = [text];\n if (hasAsset) {\n children.push(asset);\n }\n\n const composite = new ElementBuilder()\n .withClassName('umd-hero-stacked')\n .withChildren(...children)\n .withStyles({\n element: {\n containerType: 'inline-size',\n\n ...(props.isThemeDark && {\n backgroundColor: token.color.black,\n }),\n },\n })\n .build();\n\n composite.styles += keyFrameFadeOver;\n composite.styles += keyFrameFontColor;\n\n return composite;\n};\n"],"names":["assets.video.observedAutoPlay","assets.image.background","elementStyles","textLockup.large"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,MAAM,0BAA0B;AAChC,MAAM,2BAA2B;AAEjC,MAAM,mBAAmB;AAAA,eACV,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAMtC,MAAM,oBAAoB;AAAA,eACX,wBAAwB;AAAA,oBACnB,MAAM,MAAM,KAAK;AAAA,kBACnB,MAAM,MAAM,KAAK;AAAA;AAAA;AAInC,MAAM,mBAAmB,CAAC,UAA4B;AACpD,SAAOA,4BAA8B;AAAA,IACnC;AAAA,IACA,UAAU;AAAA,EAAA,CACX;AACH;AAEA,MAAM,mBAAmB,CAAC,UAA4B;AACpD,SAAOC,sBAAwB;AAAA,IAC7B,SAAS;AAAA,IACT,UAAU;AAAA,IACV,cAAc;AAAA,IACd,eAAe;AAAA,IACf,cAAc;AAAA,MACZ,CAAC,WAAW,MAAM,MAAM,QAAQ,MAAM,GAAG,GAAG,GAAG;AAAA,QAC7C,CAAC,UAAU,cAAc,MAAM,IAAI,OAAO,SAAS,GAAG,GAAG;AAAA,UACvD,WAAW;AAAA,QAAA;AAAA,MACb;AAAA,MAGF,CAAC,WAAW,MAAM,MAAM,QAAQ,OAAO,GAAG,GAAG,GAAG;AAAA,QAC9C,CAAC,UAAU,cAAc,MAAM,IAAI,OAAO,SAAS,GAAG,GAAG;AAAA,UACvD,WAAW;AAAA,QAAA;AAAA,MACb;AAAA,MAGF,CAAC,MAAM,cAAc,MAAM,IAAI,OAAO,SAAS,SAAS,GAAG;AAAA,QACzD,QAAQ;AAAA,MAAA;AAAA,IACV;AAAA,EACF,CACD;AACH;AAEA,MAAM,gBAAgB,CAAC,sBAAgC;AACrD,SAAO,IAAI,eAAA,EACR,cAAc,2BAA2B,EACzC,WAAW;AAAA,IACV,SAAS;AAAA,MACP,UAAU;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,MACN,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,QAAQ;AAAA,MACR,SAAS;AAAA,MAET,GAAI,qBAAqB;AAAA,QACvB,CAAC,WAAW,MAAM,MAAM,QAAQ,OAAO,GAAG,GAAG,GAAG;AAAA,UAC9C,CAAC,gDAAgD,GAAG;AAAA,YAClD,CAAC,0CAA0C,GAAG;AAAA,cAC5C,WAAW,GAAG,uBAAuB;AAAA,cACrC,mBAAmB;AAAA,cACnB,qBAAqB;AAAA,cACrB,mBAAmB;AAAA,YAAA;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CACD,EACA,MAAA;AACL;AAEA,MAAM,cAAc,CAAC;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,gBAAgB;AAClB,MAGM;AACJ,MAAI,eAAiD;AAErD,MAAI,SAAS,iBAAiB,kBAAkB;AAC9C,mBAAe,iBAAiB,KAAK;AAAA,EACvC,WAAW,OAAO;AAChB,mBAAe,iBAAiB,KAAK;AAAA,EACvC;AAEA,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,uBAAuB,IAAI,eAAA,EAC9B,cAAc,mCAAmC,EACjD,aAAa,cAAc,cAAc,iBAAiB,CAAC,EAC3D,WAAW;AAAA,IACV,SAAS;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,IAAA;AAAA,EACV,CACD,EACA,MAAA;AAEH,QAAM,iBAAiB,IAAI,eAAA,EACxB,OAAO,OAAO,OAAO,MAAM,WAAW,MAAM,EAC5C,UAAU,oBAAoB,EAC9B,WAAW;AAAA,IACV,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,IAAA;AAAA,EACT,CACD,EACA,MAAA;AAEH,QAAM,UAAU,IAAI,iBAAiB,cAAc,yBAAyB;AAE5E,MAAI,cAAc;AAChB,YAAQ,UAAU,cAAc;AAAA,EAClC,OAAO;AACL,YAAQ,aAAa,cAAc,cAAc,iBAAiB,CAAC;AAAA,EACrE;AAEA,SAAO,QACJ,WAAW;AAAA,IACV,SAAS;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,SAAS;AAAA,MAET,CAAC,gBAAgB,GAAG;AAAA,QAClB,WAAW;AAAA,QACX,aAAa;AAAA,QAEb,CAAC,eAAe,MAAM,MAAM,QAAQ,OAAO,GAAG,GAAG,GAAG;AAAA,UAClD,WAAW;AAAA,UACX,WAAW;AAAA,UAEX,GAAI,CAAC,iBAAiB;AAAA,YACpB,WAAW;AAAA,YACX,QAAQ;AAAA,UAAA;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF,CACD,EACA,MAAA;AACL;AAEA,MAAM,iBAAiB,CACrB,UAIqC;AACrC,QAAM,EAAE,UAAU,eAAe,mBAAmB,gBAAgB;AACpE,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,QAAM,kBAAkB;AAAA,IACtB,CAAC,eAAe,MAAM,MAAM,QAAQ,OAAO,GAAG,GAAG,GAAG;AAAA,MAClD,GAAG,0BAA0B;AAAA,QAC3B,WAAW,GAAG,wBAAwB;AAAA,QACtC,mBAAmB;AAAA,QACnB,qBAAqB;AAAA,QACrB,mBAAmB;AAAA,QAEnB,GAAI,iBAAiB;AAAA,UACnB,qBAAqB;AAAA,UACrB,mBAAmB;AAAA,QAAA;AAAA,MACrB,CACD;AAAA,IAAA;AAAA,EACH;AAGF,QAAMC,iBAAgB;AAAA,IACpB,SAAS;AAAA,MACP,OAAO,MAAM,MAAM;AAAA,MACnB,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,WAAW,GAAG,MAAM,QAAQ,EAAE;AAAA,MAE9B,GAAI,eAAe;AAAA,QACjB,OAAO,MAAM,MAAM;AAAA,MAAA;AAAA,MAGrB,GAAI,qBAAqB;AAAA,QACvB,GAAI,CAAC,eAAe;AAAA,UAClB,GAAG;AAAA,QAAA;AAAA,MACL;AAAA,MAGF,GAAG;AAAA,IAAA;AAAA,IAEL,cAAc;AAAA,MACZ,WAAW,GAAG,MAAM,QAAQ,EAAE;AAAA,IAAA;AAAA,EAChC;AAGF,SAAO,IAAI,eAAe,QAAQ,EAC/B,OAAO,OAAO,WAAW,SAAS,MAAM,KAAK,EAC7C,WAAWA,cAAa,EACxB,MAAA;AACL;AAEA,MAAM,aAAa,CACjB,UACG;AACH,QAAM,EAAE,aAAa,aAAa,mBAAmB,kBAAkB;AACvE,QAAM,mBAAmB,cAAc,SAAS,WAAW,IAAI;AAC/D,QAAM,oBAAoBC,sBAAiB;AAAA,IACzC,GAAG;AAAA,IACH,QAAQ,MAAM;AAAA,IACd,mBAAmB,eAAe,KAAK;AAAA,IACvC,aAAa,MAAM;AAAA,EAAA,CACpB;AAED,QAAM,OAAO,IAAI,eAAA,EACd,OAAO,OAAO,OAAO,MAAM,WAAW,KAAK,EAC3C,UAAU,iBAAiB,EAC3B,WAAW;AAAA,IACV,SAAS;AAAA,MACP,UAAU;AAAA,IAAA;AAAA,EACZ,CACD,EACA,MAAA;AAEH,SAAO,IAAI,iBACR,cAAc,wBAAwB,EACtC,UAAU,IAAI,EACd,WAAW;AAAA,IACV,SAAS;AAAA,MACP,SAAS,GAAG,MAAM,QAAQ,EAAE;AAAA,MAC5B,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,WAAW;AAAA,MACX,UAAU;AAAA,MACV,QAAQ;AAAA,MAER,CAAC,eAAe,MAAM,MAAM,QAAQ,OAAO,GAAG,GAAG,GAAG;AAAA,QAClD,SAAS,GAAG,MAAM,QAAQ,KAAK,CAAC,MAAM,MAAM,QAAQ,KAAK,CAAC;AAAA,MAAA;AAAA,MAG5D,GAAI,qBAAqB;AAAA,QACvB,CAAC,eAAe,MAAM,MAAM,QAAQ,OAAO,GAAG,GAAG,GAAG;AAAA,UAClD,GAAG,0BAA0B;AAAA,YAC3B,UAAU;AAAA,YACV,KAAK,oBAAoB;AAAA,UAAA,CAC1B;AAAA,QAAA;AAAA,MACH;AAAA,MAGF,CAAC,KAAK,GAAG;AAAA,QACP,GAAI,qBAAqB;AAAA,UACvB,GAAI,CAAC,eAAe;AAAA,YAClB,CAAC,eAAe,MAAM,MAAM,QAAQ,OAAO,GAAG,GAAG,GAAG;AAAA,cAClD,GAAG,0BAA0B;AAAA,gBAC3B,WAAW,GAAG,wBAAwB;AAAA,gBACtC,mBAAmB;AAAA,gBACnB,qBAAqB;AAAA,gBACrB,mBAAmB;AAAA,gBAEnB,GAAI,iBAAiB;AAAA,kBACnB,qBAAqB;AAAA,kBACrB,mBAAmB;AAAA,gBAAA;AAAA,cACrB,CACD;AAAA,YAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,MAGF,CAAC,MAAM,cAAc,KAAK,WAAW,OAAO,UAAU,CAAC,CAAC,EAAE,GAAG;AAAA,QAC3D,WAAW;AAAA,MAAA;AAAA,MAGb,CAAC,MAAM,cAAc,KAAK,KAAK,cAAc,SAAS,EAAE,GAAG;AAAA,QACzD,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,aAAa;AAAA,MAAA;AAAA,IACf;AAAA,EACF,CACD,EACA,MAAA;AACL;AAEO,MAAM,6BAA6B,CAAC,UAA4B;AACrE,QAAM,QAAQ,YAAY,KAAK;AAC/B,QAAM,WAAW,UAAU;AAC3B,QAAM,oBAAoB,YAAY,MAAM;AAE5C,QAAM,OAAO,WAAW;AAAA,IACtB,GAAG;AAAA,IACH,mBAAmB;AAAA,EAAA,CACpB;AAED,QAAM,WAAwC,CAAC,IAAI;AACnD,MAAI,UAAU;AACZ,aAAS,KAAK,KAAK;AAAA,EACrB;AAEA,QAAM,YAAY,IAAI,eAAA,EACnB,cAAc,kBAAkB,EAChC,aAAa,GAAG,QAAQ,EACxB,WAAW;AAAA,IACV,SAAS;AAAA,MACP,eAAe;AAAA,MAEf,GAAI,MAAM,eAAe;AAAA,QACvB,iBAAiB,MAAM,MAAM;AAAA,MAAA;AAAA,IAC/B;AAAA,EACF,CACD,EACA,MAAA;AAEH,YAAU,UAAU;AACpB,YAAU,UAAU;AAEpB,SAAO;AACT;"}
|
|
@@ -13,11 +13,10 @@ import "@universityofmaryland/web-icons-library/communication";
|
|
|
13
13
|
import "@universityofmaryland/web-icons-library/files";
|
|
14
14
|
import "@universityofmaryland/web-icons-library/brand";
|
|
15
15
|
import "@universityofmaryland/web-icons-library/arrows";
|
|
16
|
-
import "
|
|
16
|
+
import "@universityofmaryland/web-utilities-library/performance";
|
|
17
17
|
import "../../atomic/animations/brand/chevron-scroll.js";
|
|
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/performance";
|
|
21
20
|
import { imagePlaceholder } from "../../atomic/assets/image/placeholder.js";
|
|
22
21
|
import { createVideoObservedAutoPlay } from "../../atomic/assets/video/observed-auto-play.js";
|
|
23
22
|
import "@universityofmaryland/web-icons-library/location";
|
|
@@ -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 });\n};\n\nconst createImageAsset = (image: HTMLImageElement) => {\n return assets.image.background({\n element: image,\n isScaled: true,\n isGifAllowed: true,\n isShowCaption: true,\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 });\n};\n\nconst createImageAsset = (image: HTMLImageElement) => {\n return assets.image.background({\n element: image,\n isScaled: true,\n isGifAllowed: true,\n isShowCaption: true,\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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"}
|
|
@@ -11,12 +11,11 @@ import "@universityofmaryland/web-icons-library/communication";
|
|
|
11
11
|
import "@universityofmaryland/web-icons-library/files";
|
|
12
12
|
import "@universityofmaryland/web-icons-library/brand";
|
|
13
13
|
import "@universityofmaryland/web-icons-library/arrows";
|
|
14
|
-
import "
|
|
14
|
+
import "@universityofmaryland/web-utilities-library/performance";
|
|
15
15
|
import "../../../atomic/animations/brand/chevron-scroll.js";
|
|
16
16
|
import "../../../atomic/animations/brand/card-stack.js";
|
|
17
17
|
import { createImageBackground } from "../../../atomic/assets/image/background.js";
|
|
18
18
|
import "@universityofmaryland/web-styles-library";
|
|
19
|
-
import "@universityofmaryland/web-utilities-library/performance";
|
|
20
19
|
import "@universityofmaryland/web-utilities-library/accessibility";
|
|
21
20
|
import "@universityofmaryland/web-icons-library/location";
|
|
22
21
|
import "@universityofmaryland/web-icons-library/calendar";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gif.js","sources":["../../../../source/composite/media/elements/gif.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport { assets } from 'atomic';\n\nconst CreateGifElement = ({ image }: { image: HTMLImageElement }) => {\n const container = document.createElement('div');\n\n const calculateHeight = () => {\n if (!image.naturalWidth || !image.naturalHeight) return;\n\n const aspectRatio = image.naturalHeight / image.naturalWidth;\n const containerWidth = container.offsetWidth;\n\n if (containerWidth > 0) {\n const calculatedHeight = Math.round(containerWidth * aspectRatio);\n container.style.height = `${calculatedHeight}px`;\n } else {\n container.style.width = `${image.naturalWidth}px`;\n\n setTimeout(() => {\n const containerWidth = container.offsetWidth;\n const calculatedHeight = Math.round(containerWidth * aspectRatio);\n container.style.height = `${calculatedHeight}px`;\n }, 100);\n }\n };\n\n const resizeObserver = new ResizeObserver(() => {\n container.style.width = `${image.naturalWidth}px`;\n setTimeout(() => {\n calculateHeight();\n }, 10);\n });\n\n if (image.complete && image.naturalWidth) {\n container.style.width = `${image.naturalWidth}px`;\n setTimeout(() => {\n calculateHeight();\n }, 10);\n } else {\n image.addEventListener('load', calculateHeight);\n }\n\n setTimeout(() => {\n resizeObserver.observe(container);\n }, 0);\n\n const imageElement = assets.image.background({\n element: image,\n isShowCaption: true,\n isScaled: false,\n isGifAllowed: true,\n customStyles: {\n width: 'auto',\n height: '100%',\n display: 'block',\n },\n });\n\n const elementModel = new ElementBuilder(container)\n .withClassName('media-gif')\n .withChild(imageElement)\n .withStyles({\n element: {\n maxHeight: '100%',\n maxWidth: '100%',\n position: 'relative',\n display: 'block',\n overflow: 'hidden',\n },\n })\n .build();\n\n return {\n ...elementModel,\n destroy: () => {\n resizeObserver.disconnect();\n image.removeEventListener('load', calculateHeight);\n },\n };\n};\n\nexport const createCompositeMediaGif = CreateGifElement;\n"],"names":["containerWidth","assets.image.background"],"mappings":"
|
|
1
|
+
{"version":3,"file":"gif.js","sources":["../../../../source/composite/media/elements/gif.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport { assets } from 'atomic';\n\nconst CreateGifElement = ({ image }: { image: HTMLImageElement }) => {\n const container = document.createElement('div');\n\n const calculateHeight = () => {\n if (!image.naturalWidth || !image.naturalHeight) return;\n\n const aspectRatio = image.naturalHeight / image.naturalWidth;\n const containerWidth = container.offsetWidth;\n\n if (containerWidth > 0) {\n const calculatedHeight = Math.round(containerWidth * aspectRatio);\n container.style.height = `${calculatedHeight}px`;\n } else {\n container.style.width = `${image.naturalWidth}px`;\n\n setTimeout(() => {\n const containerWidth = container.offsetWidth;\n const calculatedHeight = Math.round(containerWidth * aspectRatio);\n container.style.height = `${calculatedHeight}px`;\n }, 100);\n }\n };\n\n const resizeObserver = new ResizeObserver(() => {\n container.style.width = `${image.naturalWidth}px`;\n setTimeout(() => {\n calculateHeight();\n }, 10);\n });\n\n if (image.complete && image.naturalWidth) {\n container.style.width = `${image.naturalWidth}px`;\n setTimeout(() => {\n calculateHeight();\n }, 10);\n } else {\n image.addEventListener('load', calculateHeight);\n }\n\n setTimeout(() => {\n resizeObserver.observe(container);\n }, 0);\n\n const imageElement = assets.image.background({\n element: image,\n isShowCaption: true,\n isScaled: false,\n isGifAllowed: true,\n customStyles: {\n width: 'auto',\n height: '100%',\n display: 'block',\n },\n });\n\n const elementModel = new ElementBuilder(container)\n .withClassName('media-gif')\n .withChild(imageElement)\n .withStyles({\n element: {\n maxHeight: '100%',\n maxWidth: '100%',\n position: 'relative',\n display: 'block',\n overflow: 'hidden',\n },\n })\n .build();\n\n return {\n ...elementModel,\n destroy: () => {\n resizeObserver.disconnect();\n image.removeEventListener('load', calculateHeight);\n },\n };\n};\n\nexport const createCompositeMediaGif = CreateGifElement;\n"],"names":["containerWidth","assets.image.background"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,MAAM,mBAAmB,CAAC,EAAE,YAAyC;AACnE,QAAM,YAAY,SAAS,cAAc,KAAK;AAE9C,QAAM,kBAAkB,MAAM;AAC5B,QAAI,CAAC,MAAM,gBAAgB,CAAC,MAAM,cAAe;AAEjD,UAAM,cAAc,MAAM,gBAAgB,MAAM;AAChD,UAAM,iBAAiB,UAAU;AAEjC,QAAI,iBAAiB,GAAG;AACtB,YAAM,mBAAmB,KAAK,MAAM,iBAAiB,WAAW;AAChE,gBAAU,MAAM,SAAS,GAAG,gBAAgB;AAAA,IAC9C,OAAO;AACL,gBAAU,MAAM,QAAQ,GAAG,MAAM,YAAY;AAE7C,iBAAW,MAAM;AACf,cAAMA,kBAAiB,UAAU;AACjC,cAAM,mBAAmB,KAAK,MAAMA,kBAAiB,WAAW;AAChE,kBAAU,MAAM,SAAS,GAAG,gBAAgB;AAAA,MAC9C,GAAG,GAAG;AAAA,IACR;AAAA,EACF;AAEA,QAAM,iBAAiB,IAAI,eAAe,MAAM;AAC9C,cAAU,MAAM,QAAQ,GAAG,MAAM,YAAY;AAC7C,eAAW,MAAM;AACf,sBAAA;AAAA,IACF,GAAG,EAAE;AAAA,EACP,CAAC;AAED,MAAI,MAAM,YAAY,MAAM,cAAc;AACxC,cAAU,MAAM,QAAQ,GAAG,MAAM,YAAY;AAC7C,eAAW,MAAM;AACf,sBAAA;AAAA,IACF,GAAG,EAAE;AAAA,EACP,OAAO;AACL,UAAM,iBAAiB,QAAQ,eAAe;AAAA,EAChD;AAEA,aAAW,MAAM;AACf,mBAAe,QAAQ,SAAS;AAAA,EAClC,GAAG,CAAC;AAEJ,QAAM,eAAeC,sBAAwB;AAAA,IAC3C,SAAS;AAAA,IACT,eAAe;AAAA,IACf,UAAU;AAAA,IACV,cAAc;AAAA,IACd,cAAc;AAAA,MACZ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,IAAA;AAAA,EACX,CACD;AAED,QAAM,eAAe,IAAI,eAAe,SAAS,EAC9C,cAAc,WAAW,EACzB,UAAU,YAAY,EACtB,WAAW;AAAA,IACV,SAAS;AAAA,MACP,WAAW;AAAA,MACX,UAAU;AAAA,MACV,UAAU;AAAA,MACV,SAAS;AAAA,MACT,UAAU;AAAA,IAAA;AAAA,EACZ,CACD,EACA,MAAA;AAEH,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS,MAAM;AACb,qBAAe,WAAA;AACf,YAAM,oBAAoB,QAAQ,eAAe;AAAA,IACnD;AAAA,EAAA;AAEJ;AAEO,MAAM,0BAA0B;"}
|
|
@@ -7,10 +7,9 @@ import "@universityofmaryland/web-builder-library";
|
|
|
7
7
|
import "@universityofmaryland/web-token-library";
|
|
8
8
|
import "@universityofmaryland/web-icons-library/files";
|
|
9
9
|
import "@universityofmaryland/web-icons-library/arrows";
|
|
10
|
-
import "
|
|
10
|
+
import "@universityofmaryland/web-utilities-library/performance";
|
|
11
11
|
import "../../../atomic/animations/brand/chevron-scroll.js";
|
|
12
12
|
import "../../../atomic/animations/brand/card-stack.js";
|
|
13
|
-
import "@universityofmaryland/web-utilities-library/performance";
|
|
14
13
|
import "@universityofmaryland/web-utilities-library/accessibility";
|
|
15
14
|
import "@universityofmaryland/web-styles-library/element";
|
|
16
15
|
import "@universityofmaryland/web-icons-library/location";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alert.js","sources":["../../../../source/composite/navigation/utility/alert.ts"],"sourcesContent":["import {\n element,\n layout,\n token,\n typography,\n} from '@universityofmaryland/web-styles-library';\nimport { fetchGraphQL } from '@universityofmaryland/web-utilities-library/network';\nimport { jssToCSS } from '@universityofmaryland/web-utilities-library/styles';\nimport { close_large as iconCloseLarge } from '@universityofmaryland/web-icons-library/controls';\nimport { actions } from 'atomic';\n\ntype AlertData = {\n id: string;\n type: string;\n title: string;\n headline?: string;\n text: string;\n ctaUrl: string;\n ctaText?: string;\n hidden?: boolean;\n};\n\ntype AlertResponse = {\n data: {\n entries: AlertData[];\n };\n};\n\ntype AlertProps = {\n alertUrl?: string | null;\n};\n\nexport type TypeAlertProps = {\n alertUrl?: string | null;\n};\n\ntype ElementAttributes = Record<string, string>;\n\ntype CacheCheckResult = {\n shouldCheck: boolean;\n cachedData: AlertData | null;\n};\n\nconst QUERY = `\n query CampusAlertsQuery {\n entries: entries(\n limit: 1\n type: \"mainElementsCampusAlert\"\n ) {\n id: uid\n type: optionsType\n headline\n title\n text\n ctaUrl: cta\n ctaText\n }\n }\n`;\n\nconst ELEMENT_NAME = 'umd-element-nav-alert';\nexport const ALERT_CONSTANTS = {\n URLS: {\n DEFAULT: 'https://umd.edu/api/v2',\n },\n STORAGE_KEYS: {\n ALERT_TIME: 'umd-utility-alert-time',\n ALERT: 'umd-utility-alert',\n ALERT_ID: 'umd-utility-alert-id',\n },\n ELEMENTS: {\n ALERT_ID: 'umd-global-alert',\n DECLARATION: 'umd-element-nav-alert-declaration',\n CONTAINER: 'umd-element-nav-alert-container',\n LOCK: 'umd-element-nav-alert-lock',\n WRAPPER: 'umd-element-nav-alert-wrapper',\n TITLE: 'umd-element-nav-alert-title',\n TEXT: 'umd-element-nav-alert-text',\n CTA: 'umd-element-nav-alert-cta',\n CLOSE_BUTTON: 'umd-element-nav-alert-close',\n },\n ATTRIBUTES: {\n TYPE: 'type',\n },\n TYPES: {\n GENERAL: 'general',\n CLOSED: 'closed',\n OPEN: 'open',\n },\n ANIMATION: {\n SPEED: 800,\n },\n BREAKPOINTS: {\n MEDIUM: 768,\n LARGE: 1024,\n },\n CACHE: {\n DURATION: 60 * 1000, // One minute in milliseconds\n },\n} as const;\n\nconst { ATTRIBUTES, ANIMATION, BREAKPOINTS, ELEMENTS, TYPES } = ALERT_CONSTANTS;\nconst IS_TYPE_GENERAL = `[${ATTRIBUTES.TYPE}=${TYPES.GENERAL}]`;\nconst IS_TYPE_CLOSED = `[${ATTRIBUTES.TYPE}=${TYPES.CLOSED}]`;\n\nconst DECLARATION = `.${ELEMENTS.DECLARATION}`;\nconst CONTAINER = `.${ELEMENTS.CONTAINER}`;\nconst WRAPPER = `.${ELEMENTS.WRAPPER}`;\nconst LOCK = `.${ELEMENTS.LOCK}`;\nconst ALERT_TITLE = `.${ELEMENTS.TITLE}`;\nconst ALERT_TEXT = `.${ELEMENTS.TEXT}`;\nconst CLOSE_BUTTON = `.${ELEMENTS.CLOSE_BUTTON}`;\nconst CTA = `.${ELEMENTS.CTA}`;\n\nconst OVERWRITE_CONTAINER_TYPE_GENERAL = `${CONTAINER}${IS_TYPE_GENERAL}`;\nconst OVERWRITE_CONTAINER_TYPE_CLOSED = `${CONTAINER}${IS_TYPE_CLOSED}`;\n\n// prettier-ignore\nconst OverwriteTypeGeneral = `\n ${OVERWRITE_CONTAINER_TYPE_GENERAL} {\n background-color: ${token.color.black};\n }\n\n ${OVERWRITE_CONTAINER_TYPE_GENERAL} * {\n color: ${token.color.white};\n }\n\n ${OVERWRITE_CONTAINER_TYPE_GENERAL} a:hover,\n ${OVERWRITE_CONTAINER_TYPE_GENERAL} a:focus {\n color: ${token.color.white} !important;\n }\n\n ${OVERWRITE_CONTAINER_TYPE_GENERAL} ${ALERT_TITLE} {\n color: ${token.color.gold};\n }\n\n ${OVERWRITE_CONTAINER_TYPE_GENERAL} ${CLOSE_BUTTON} > svg {\n fill: ${token.color.white};\n }\n`\n\n// prettier-ignore\nconst OverwriteTypeClosed = `\n ${OVERWRITE_CONTAINER_TYPE_CLOSED} {\n background-color: ${token.color.gold};\n }\n\n ${OVERWRITE_CONTAINER_TYPE_CLOSED} * {\n color: ${token.color.black};\n }\n\n ${OVERWRITE_CONTAINER_TYPE_CLOSED} .${CLOSE_BUTTON} > svg {\n fill: ${token.color.black};\n }\n`\n\n// prettier-ignore\nconst CloseButtonStyles = `\n ${CLOSE_BUTTON} {\n position: absolute;\n top: 30px;\n right: 10px;\n }\n \n @container (max-width: ${BREAKPOINTS.MEDIUM - 1}px) {\n ${CLOSE_BUTTON} {\n top: 25px;\n right: 5px;\n }\n }\n\n ${CLOSE_BUTTON} > svg {\n fill: ${token.color.black};\n width: 24px;\n height: 24px;\n }\n`\n\n// prettier-ignore\nconst TextStyles = `\n ${jssToCSS({\n styleObj: {\n [`${ALERT_TITLE}`]: typography.sans.large,\n },\n })}\n\n ${ALERT_TITLE} {\n text-transform: uppercase;\n }\n\n ${ALERT_TITLE} + * {\n margin-top: ${token.spacing.sm};\n }\n\n ${jssToCSS({\n styleObj: {\n [`${ALERT_TEXT}`]: element.text.rich.advanced,\n },\n })}\n\n ${ALERT_TEXT},\n ${ALERT_TEXT} * {\n font-size: 16px;;\n }\n\n ${ALERT_TEXT} + * {\n margin-top: ${token.spacing.lg};\n }\n\n ${CTA} {\n text-decoration: none;\n }\n\n ${CTA} svg {\n max-width: 20px;\n }\n`\n\n// prettier-ignore\nconst WrapperStyles = `\n ${WRAPPER} {\n position: relative;\n padding-top: ${token.spacing.md};\n padding-bottom: ${token.spacing.md};\n padding-right: ${token.spacing.lg};\n }\n\n @container (min-width: ${BREAKPOINTS.MEDIUM}px) {\n ${WRAPPER} {\n padding-top: ${token.spacing.lg};\n padding-bottom: ${token.spacing.lg};\n }\n }\n`\n\n// prettier-ignore\nconst LockStyles = `\n ${jssToCSS({\n styleObj: {\n [`${LOCK}`]: layout.space.horizontal.full,\n },\n })}\n`\n\n// prettier-ignore\nconst ContainerStyles = `\n ${CONTAINER} {\n container: ${ELEMENT_NAME} / inline-size;\n background-color: ${token.color.gray.lighter};\n border-left: 4px solid ${token.color.red};\n transition: height ${ANIMATION.SPEED}ms;\n overflow: hidden;\n position: relative;\n }\n\n @container (min-width: ${BREAKPOINTS.LARGE}px) {\n ${CONTAINER} {\n border-left: 8px solid ${token.color.red};\n }\n }\n`\n\n// prettier-ignore\nexport const STYLES_NAV_ALERT = `\n ${DECLARATION} {\n container: ${ELEMENT_NAME} / inline-size;\n }\n\n ${ContainerStyles}\n ${LockStyles}\n ${WrapperStyles}\n ${TextStyles}\n ${CloseButtonStyles}\n ${OverwriteTypeGeneral}\n ${OverwriteTypeClosed}\n`;\n\n// storage.ts\nconst logStorageError = (operation: string, error: Error): void => {\n console.error(`UMD Component - Alert Storage: ${operation} failed:`, error);\n};\n\nconst getStoredValue = <T>(key: string): T | null => {\n try {\n const value = window.localStorage.getItem(key);\n return value ? JSON.parse(value) : null;\n } catch (error) {\n logStorageError(`Reading ${key}`, error as Error);\n return null;\n }\n};\n\nconst setStoredValue = (key: string, value: unknown): void => {\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch (error) {\n logStorageError('Saving value', error as Error);\n }\n};\n\nconst clearAlertStorage = (): void => {\n const { STORAGE_KEYS } = ALERT_CONSTANTS;\n window.localStorage.removeItem(STORAGE_KEYS.ALERT_TIME);\n window.localStorage.removeItem(STORAGE_KEYS.ALERT);\n};\n\nconst checkAlertCache = (): CacheCheckResult => {\n const currentTime = new Date().getTime();\n const { STORAGE_KEYS, CACHE } = ALERT_CONSTANTS;\n\n try {\n const alertTimeStr = getStoredValue<string>(STORAGE_KEYS.ALERT_TIME);\n const cachedResponse = getStoredValue<AlertData>(STORAGE_KEYS.ALERT);\n\n if (!alertTimeStr) {\n setStoredValue(STORAGE_KEYS.ALERT_TIME, currentTime.toString());\n return { shouldCheck: true, cachedData: null };\n }\n\n const alertTime = parseInt(alertTimeStr, 10);\n const timeElapsed = currentTime - alertTime;\n\n if (timeElapsed < CACHE.DURATION && cachedResponse) {\n return { shouldCheck: false, cachedData: cachedResponse };\n }\n\n setStoredValue(STORAGE_KEYS.ALERT_TIME, currentTime.toString());\n return { shouldCheck: true, cachedData: null };\n } catch (error) {\n console.error('Cache check failed:', error);\n return { shouldCheck: true, cachedData: null };\n }\n};\n\nconst updateAlertCache = (alert: AlertData): void => {\n setStoredValue(ALERT_CONSTANTS.STORAGE_KEYS.ALERT, alert);\n};\n\nconst createElement = (\n tag: string,\n className?: string,\n attributes?: ElementAttributes,\n): HTMLElement => {\n const element = document.createElement(tag);\n if (className) element.classList.add(className);\n if (attributes) {\n Object.entries(attributes).forEach(([key, value]) => {\n element.setAttribute(key, value);\n });\n }\n return element;\n};\n\nconst createCloseButton = (container: HTMLElement): HTMLButtonElement => {\n const { ELEMENTS, ANIMATION } = ALERT_CONSTANTS;\n const button = createElement('button', ELEMENTS.CLOSE_BUTTON, {\n 'aria-label': 'remove alert',\n }) as HTMLButtonElement;\n\n button.innerHTML = iconCloseLarge;\n button.addEventListener('click', () => {\n const cachedAlert = getStoredValue<AlertData>(\n ALERT_CONSTANTS.STORAGE_KEYS.ALERT,\n );\n if (cachedAlert) {\n // Animate close\n container.style.height = `${container.offsetHeight}px`;\n container.style.transition = `height ${ANIMATION.SPEED}ms`;\n\n updateAlertCache({ ...cachedAlert, hidden: true });\n\n setTimeout(() => {\n container.style.height = '0px';\n }, 100);\n\n setTimeout(() => {\n container.remove();\n }, ANIMATION.SPEED + 100);\n }\n });\n\n return button;\n};\n\nconst createCTAElement = ({\n ctaText,\n ctaUrl,\n}: {\n ctaText: string;\n ctaUrl: string;\n}) => {\n const link = createElement('a', ALERT_CONSTANTS.ELEMENTS.CTA, {\n href: ctaUrl,\n rel: 'noopener noreferrer',\n target: '_blank',\n });\n link.innerHTML = ctaText;\n\n return actions.options({\n element: link,\n isTypeSecondary: true,\n });\n};\n\nconst createAlertContent = (\n alert: AlertData,\n container: HTMLElement,\n): HTMLElement => {\n const { ELEMENTS } = ALERT_CONSTANTS;\n const wrapper = createElement('div', ELEMENTS.WRAPPER);\n const lock = createElement('div', ELEMENTS.LOCK);\n const headlineText = alert.headline || alert.title;\n\n // Create elements\n const title = createElement('p', ELEMENTS.TITLE);\n title.innerHTML = headlineText;\n\n const closeButton = createCloseButton(container);\n\n wrapper.append(closeButton, title);\n\n if (alert.text) {\n const message = createElement('div', ELEMENTS.TEXT);\n message.innerHTML = alert.text;\n wrapper.append(closeButton, title, message);\n }\n\n // Add CTA if exists\n if (alert.ctaUrl) {\n const cta = createCTAElement({\n ctaText: alert.ctaText || headlineText,\n ctaUrl: alert.ctaUrl,\n });\n\n wrapper.appendChild(cta.element);\n }\n\n lock.appendChild(wrapper);\n return lock;\n};\n\nconst createAlertComponent = (alert: AlertData): HTMLElement => {\n const { ELEMENTS, ATTRIBUTES } = ALERT_CONSTANTS;\n\n const declaration = createElement('div', ELEMENTS.DECLARATION);\n const container = createElement('div', ELEMENTS.CONTAINER, {\n id: ELEMENTS.ALERT_ID,\n [ATTRIBUTES.TYPE]: alert.type,\n });\n\n const content = createAlertContent(alert, container);\n container.appendChild(content);\n declaration.appendChild(container);\n\n return declaration;\n};\n\nconst fetchAlerts = async ({\n alertUrl,\n}: AlertProps): Promise<AlertResponse | null> => {\n try {\n const url = alertUrl || ALERT_CONSTANTS.URLS.DEFAULT;\n\n return await fetchGraphQL({\n query: QUERY,\n url,\n token: 'VIDnMeNYHTrLvWPtPpK5MNpjuv5WmmhU',\n });\n } catch (error) {\n console.error('Failed to fetch alerts:', error);\n return null;\n }\n};\n\nexport const createNavAlert = async ({ alertUrl }: AlertProps) => {\n const alertCache = checkAlertCache();\n\n // Show cached alert if valid\n if (\n !alertCache.shouldCheck &&\n alertCache.cachedData &&\n !alertCache.cachedData.hidden\n ) {\n return { element: createAlertComponent(alertCache.cachedData) };\n }\n\n // Fetch new alerts\n const response = await fetchAlerts({ alertUrl });\n if (!response?.data?.entries[0]) {\n clearAlertStorage();\n return null;\n }\n\n const alert = response.data?.entries[0];\n const cachedAlert = getStoredValue<AlertData>(\n ALERT_CONSTANTS.STORAGE_KEYS.ALERT,\n );\n\n // Handle alert updates\n if (cachedAlert?.id === alert.id) {\n if (!cachedAlert.hidden && alertCache.shouldCheck) {\n return { element: createAlertComponent(cachedAlert) };\n }\n } else {\n clearAlertStorage();\n updateAlertCache(alert);\n return { element: createAlertComponent(alert) };\n }\n\n return null;\n};\n"],"names":["element","ELEMENTS","ANIMATION","iconCloseLarge","actions.options","ATTRIBUTES"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"alert.js","sources":["../../../../source/composite/navigation/utility/alert.ts"],"sourcesContent":["import {\n element,\n layout,\n token,\n typography,\n} from '@universityofmaryland/web-styles-library';\nimport { fetchGraphQL } from '@universityofmaryland/web-utilities-library/network';\nimport { jssToCSS } from '@universityofmaryland/web-utilities-library/styles';\nimport { close_large as iconCloseLarge } from '@universityofmaryland/web-icons-library/controls';\nimport { actions } from 'atomic';\n\ntype AlertData = {\n id: string;\n type: string;\n title: string;\n headline?: string;\n text: string;\n ctaUrl: string;\n ctaText?: string;\n hidden?: boolean;\n};\n\ntype AlertResponse = {\n data: {\n entries: AlertData[];\n };\n};\n\ntype AlertProps = {\n alertUrl?: string | null;\n};\n\nexport type TypeAlertProps = {\n alertUrl?: string | null;\n};\n\ntype ElementAttributes = Record<string, string>;\n\ntype CacheCheckResult = {\n shouldCheck: boolean;\n cachedData: AlertData | null;\n};\n\nconst QUERY = `\n query CampusAlertsQuery {\n entries: entries(\n limit: 1\n type: \"mainElementsCampusAlert\"\n ) {\n id: uid\n type: optionsType\n headline\n title\n text\n ctaUrl: cta\n ctaText\n }\n }\n`;\n\nconst ELEMENT_NAME = 'umd-element-nav-alert';\nexport const ALERT_CONSTANTS = {\n URLS: {\n DEFAULT: 'https://umd.edu/api/v2',\n },\n STORAGE_KEYS: {\n ALERT_TIME: 'umd-utility-alert-time',\n ALERT: 'umd-utility-alert',\n ALERT_ID: 'umd-utility-alert-id',\n },\n ELEMENTS: {\n ALERT_ID: 'umd-global-alert',\n DECLARATION: 'umd-element-nav-alert-declaration',\n CONTAINER: 'umd-element-nav-alert-container',\n LOCK: 'umd-element-nav-alert-lock',\n WRAPPER: 'umd-element-nav-alert-wrapper',\n TITLE: 'umd-element-nav-alert-title',\n TEXT: 'umd-element-nav-alert-text',\n CTA: 'umd-element-nav-alert-cta',\n CLOSE_BUTTON: 'umd-element-nav-alert-close',\n },\n ATTRIBUTES: {\n TYPE: 'type',\n },\n TYPES: {\n GENERAL: 'general',\n CLOSED: 'closed',\n OPEN: 'open',\n },\n ANIMATION: {\n SPEED: 800,\n },\n BREAKPOINTS: {\n MEDIUM: 768,\n LARGE: 1024,\n },\n CACHE: {\n DURATION: 60 * 1000, // One minute in milliseconds\n },\n} as const;\n\nconst { ATTRIBUTES, ANIMATION, BREAKPOINTS, ELEMENTS, TYPES } = ALERT_CONSTANTS;\nconst IS_TYPE_GENERAL = `[${ATTRIBUTES.TYPE}=${TYPES.GENERAL}]`;\nconst IS_TYPE_CLOSED = `[${ATTRIBUTES.TYPE}=${TYPES.CLOSED}]`;\n\nconst DECLARATION = `.${ELEMENTS.DECLARATION}`;\nconst CONTAINER = `.${ELEMENTS.CONTAINER}`;\nconst WRAPPER = `.${ELEMENTS.WRAPPER}`;\nconst LOCK = `.${ELEMENTS.LOCK}`;\nconst ALERT_TITLE = `.${ELEMENTS.TITLE}`;\nconst ALERT_TEXT = `.${ELEMENTS.TEXT}`;\nconst CLOSE_BUTTON = `.${ELEMENTS.CLOSE_BUTTON}`;\nconst CTA = `.${ELEMENTS.CTA}`;\n\nconst OVERWRITE_CONTAINER_TYPE_GENERAL = `${CONTAINER}${IS_TYPE_GENERAL}`;\nconst OVERWRITE_CONTAINER_TYPE_CLOSED = `${CONTAINER}${IS_TYPE_CLOSED}`;\n\n// prettier-ignore\nconst OverwriteTypeGeneral = `\n ${OVERWRITE_CONTAINER_TYPE_GENERAL} {\n background-color: ${token.color.black};\n }\n\n ${OVERWRITE_CONTAINER_TYPE_GENERAL} * {\n color: ${token.color.white};\n }\n\n ${OVERWRITE_CONTAINER_TYPE_GENERAL} a:hover,\n ${OVERWRITE_CONTAINER_TYPE_GENERAL} a:focus {\n color: ${token.color.white} !important;\n }\n\n ${OVERWRITE_CONTAINER_TYPE_GENERAL} ${ALERT_TITLE} {\n color: ${token.color.gold};\n }\n\n ${OVERWRITE_CONTAINER_TYPE_GENERAL} ${CLOSE_BUTTON} > svg {\n fill: ${token.color.white};\n }\n`\n\n// prettier-ignore\nconst OverwriteTypeClosed = `\n ${OVERWRITE_CONTAINER_TYPE_CLOSED} {\n background-color: ${token.color.gold};\n }\n\n ${OVERWRITE_CONTAINER_TYPE_CLOSED} * {\n color: ${token.color.black};\n }\n\n ${OVERWRITE_CONTAINER_TYPE_CLOSED} .${CLOSE_BUTTON} > svg {\n fill: ${token.color.black};\n }\n`\n\n// prettier-ignore\nconst CloseButtonStyles = `\n ${CLOSE_BUTTON} {\n position: absolute;\n top: 30px;\n right: 10px;\n }\n \n @container (max-width: ${BREAKPOINTS.MEDIUM - 1}px) {\n ${CLOSE_BUTTON} {\n top: 25px;\n right: 5px;\n }\n }\n\n ${CLOSE_BUTTON} > svg {\n fill: ${token.color.black};\n width: 24px;\n height: 24px;\n }\n`\n\n// prettier-ignore\nconst TextStyles = `\n ${jssToCSS({\n styleObj: {\n [`${ALERT_TITLE}`]: typography.sans.large,\n },\n })}\n\n ${ALERT_TITLE} {\n text-transform: uppercase;\n }\n\n ${ALERT_TITLE} + * {\n margin-top: ${token.spacing.sm};\n }\n\n ${jssToCSS({\n styleObj: {\n [`${ALERT_TEXT}`]: element.text.rich.advanced,\n },\n })}\n\n ${ALERT_TEXT},\n ${ALERT_TEXT} * {\n font-size: 16px;;\n }\n\n ${ALERT_TEXT} + * {\n margin-top: ${token.spacing.lg};\n }\n\n ${CTA} {\n text-decoration: none;\n }\n\n ${CTA} svg {\n max-width: 20px;\n }\n`\n\n// prettier-ignore\nconst WrapperStyles = `\n ${WRAPPER} {\n position: relative;\n padding-top: ${token.spacing.md};\n padding-bottom: ${token.spacing.md};\n padding-right: ${token.spacing.lg};\n }\n\n @container (min-width: ${BREAKPOINTS.MEDIUM}px) {\n ${WRAPPER} {\n padding-top: ${token.spacing.lg};\n padding-bottom: ${token.spacing.lg};\n }\n }\n`\n\n// prettier-ignore\nconst LockStyles = `\n ${jssToCSS({\n styleObj: {\n [`${LOCK}`]: layout.space.horizontal.full,\n },\n })}\n`\n\n// prettier-ignore\nconst ContainerStyles = `\n ${CONTAINER} {\n container: ${ELEMENT_NAME} / inline-size;\n background-color: ${token.color.gray.lighter};\n border-left: 4px solid ${token.color.red};\n transition: height ${ANIMATION.SPEED}ms;\n overflow: hidden;\n position: relative;\n }\n\n @container (min-width: ${BREAKPOINTS.LARGE}px) {\n ${CONTAINER} {\n border-left: 8px solid ${token.color.red};\n }\n }\n`\n\n// prettier-ignore\nexport const STYLES_NAV_ALERT = `\n ${DECLARATION} {\n container: ${ELEMENT_NAME} / inline-size;\n }\n\n ${ContainerStyles}\n ${LockStyles}\n ${WrapperStyles}\n ${TextStyles}\n ${CloseButtonStyles}\n ${OverwriteTypeGeneral}\n ${OverwriteTypeClosed}\n`;\n\n// storage.ts\nconst logStorageError = (operation: string, error: Error): void => {\n console.error(`UMD Component - Alert Storage: ${operation} failed:`, error);\n};\n\nconst getStoredValue = <T>(key: string): T | null => {\n try {\n const value = window.localStorage.getItem(key);\n return value ? JSON.parse(value) : null;\n } catch (error) {\n logStorageError(`Reading ${key}`, error as Error);\n return null;\n }\n};\n\nconst setStoredValue = (key: string, value: unknown): void => {\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch (error) {\n logStorageError('Saving value', error as Error);\n }\n};\n\nconst clearAlertStorage = (): void => {\n const { STORAGE_KEYS } = ALERT_CONSTANTS;\n window.localStorage.removeItem(STORAGE_KEYS.ALERT_TIME);\n window.localStorage.removeItem(STORAGE_KEYS.ALERT);\n};\n\nconst checkAlertCache = (): CacheCheckResult => {\n const currentTime = new Date().getTime();\n const { STORAGE_KEYS, CACHE } = ALERT_CONSTANTS;\n\n try {\n const alertTimeStr = getStoredValue<string>(STORAGE_KEYS.ALERT_TIME);\n const cachedResponse = getStoredValue<AlertData>(STORAGE_KEYS.ALERT);\n\n if (!alertTimeStr) {\n setStoredValue(STORAGE_KEYS.ALERT_TIME, currentTime.toString());\n return { shouldCheck: true, cachedData: null };\n }\n\n const alertTime = parseInt(alertTimeStr, 10);\n const timeElapsed = currentTime - alertTime;\n\n if (timeElapsed < CACHE.DURATION && cachedResponse) {\n return { shouldCheck: false, cachedData: cachedResponse };\n }\n\n setStoredValue(STORAGE_KEYS.ALERT_TIME, currentTime.toString());\n return { shouldCheck: true, cachedData: null };\n } catch (error) {\n console.error('Cache check failed:', error);\n return { shouldCheck: true, cachedData: null };\n }\n};\n\nconst updateAlertCache = (alert: AlertData): void => {\n setStoredValue(ALERT_CONSTANTS.STORAGE_KEYS.ALERT, alert);\n};\n\nconst createElement = (\n tag: string,\n className?: string,\n attributes?: ElementAttributes,\n): HTMLElement => {\n const element = document.createElement(tag);\n if (className) element.classList.add(className);\n if (attributes) {\n Object.entries(attributes).forEach(([key, value]) => {\n element.setAttribute(key, value);\n });\n }\n return element;\n};\n\nconst createCloseButton = (container: HTMLElement): HTMLButtonElement => {\n const { ELEMENTS, ANIMATION } = ALERT_CONSTANTS;\n const button = createElement('button', ELEMENTS.CLOSE_BUTTON, {\n 'aria-label': 'remove alert',\n }) as HTMLButtonElement;\n\n button.innerHTML = iconCloseLarge;\n button.addEventListener('click', () => {\n const cachedAlert = getStoredValue<AlertData>(\n ALERT_CONSTANTS.STORAGE_KEYS.ALERT,\n );\n if (cachedAlert) {\n // Animate close\n container.style.height = `${container.offsetHeight}px`;\n container.style.transition = `height ${ANIMATION.SPEED}ms`;\n\n updateAlertCache({ ...cachedAlert, hidden: true });\n\n setTimeout(() => {\n container.style.height = '0px';\n }, 100);\n\n setTimeout(() => {\n container.remove();\n }, ANIMATION.SPEED + 100);\n }\n });\n\n return button;\n};\n\nconst createCTAElement = ({\n ctaText,\n ctaUrl,\n}: {\n ctaText: string;\n ctaUrl: string;\n}) => {\n const link = createElement('a', ALERT_CONSTANTS.ELEMENTS.CTA, {\n href: ctaUrl,\n rel: 'noopener noreferrer',\n target: '_blank',\n });\n link.innerHTML = ctaText;\n\n return actions.options({\n element: link,\n isTypeSecondary: true,\n });\n};\n\nconst createAlertContent = (\n alert: AlertData,\n container: HTMLElement,\n): HTMLElement => {\n const { ELEMENTS } = ALERT_CONSTANTS;\n const wrapper = createElement('div', ELEMENTS.WRAPPER);\n const lock = createElement('div', ELEMENTS.LOCK);\n const headlineText = alert.headline || alert.title;\n\n // Create elements\n const title = createElement('p', ELEMENTS.TITLE);\n title.innerHTML = headlineText;\n\n const closeButton = createCloseButton(container);\n\n wrapper.append(closeButton, title);\n\n if (alert.text) {\n const message = createElement('div', ELEMENTS.TEXT);\n message.innerHTML = alert.text;\n wrapper.append(closeButton, title, message);\n }\n\n // Add CTA if exists\n if (alert.ctaUrl) {\n const cta = createCTAElement({\n ctaText: alert.ctaText || headlineText,\n ctaUrl: alert.ctaUrl,\n });\n\n wrapper.appendChild(cta.element);\n }\n\n lock.appendChild(wrapper);\n return lock;\n};\n\nconst createAlertComponent = (alert: AlertData): HTMLElement => {\n const { ELEMENTS, ATTRIBUTES } = ALERT_CONSTANTS;\n\n const declaration = createElement('div', ELEMENTS.DECLARATION);\n const container = createElement('div', ELEMENTS.CONTAINER, {\n id: ELEMENTS.ALERT_ID,\n [ATTRIBUTES.TYPE]: alert.type,\n });\n\n const content = createAlertContent(alert, container);\n container.appendChild(content);\n declaration.appendChild(container);\n\n return declaration;\n};\n\nconst fetchAlerts = async ({\n alertUrl,\n}: AlertProps): Promise<AlertResponse | null> => {\n try {\n const url = alertUrl || ALERT_CONSTANTS.URLS.DEFAULT;\n\n return await fetchGraphQL({\n query: QUERY,\n url,\n token: 'VIDnMeNYHTrLvWPtPpK5MNpjuv5WmmhU',\n });\n } catch (error) {\n console.error('Failed to fetch alerts:', error);\n return null;\n }\n};\n\nexport const createNavAlert = async ({ alertUrl }: AlertProps) => {\n const alertCache = checkAlertCache();\n\n // Show cached alert if valid\n if (\n !alertCache.shouldCheck &&\n alertCache.cachedData &&\n !alertCache.cachedData.hidden\n ) {\n return { element: createAlertComponent(alertCache.cachedData) };\n }\n\n // Fetch new alerts\n const response = await fetchAlerts({ alertUrl });\n if (!response?.data?.entries[0]) {\n clearAlertStorage();\n return null;\n }\n\n const alert = response.data?.entries[0];\n const cachedAlert = getStoredValue<AlertData>(\n ALERT_CONSTANTS.STORAGE_KEYS.ALERT,\n );\n\n // Handle alert updates\n if (cachedAlert?.id === alert.id) {\n if (!cachedAlert.hidden && alertCache.shouldCheck) {\n return { element: createAlertComponent(cachedAlert) };\n }\n } else {\n clearAlertStorage();\n updateAlertCache(alert);\n return { element: createAlertComponent(alert) };\n }\n\n return null;\n};\n"],"names":["element","ELEMENTS","ANIMATION","iconCloseLarge","actions.options","ATTRIBUTES"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,MAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBd,MAAM,eAAe;AACd,MAAM,kBAAkB;AAAA,EAC7B,MAAM;AAAA,IACJ,SAAS;AAAA,EAAA;AAAA,EAEX,cAAc;AAAA,IACZ,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,UAAU;AAAA,EAAA;AAAA,EAEZ,UAAU;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,IACb,WAAW;AAAA,IACX,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,KAAK;AAAA,IACL,cAAc;AAAA,EAAA;AAAA,EAEhB,YAAY;AAAA,IACV,MAAM;AAAA,EAAA;AAAA,EAER,OAAO;AAAA,IACL,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,EAAA;AAAA,EAER,WAAW;AAAA,IACT,OAAO;AAAA,EAAA;AAAA,EAET,aAAa;AAAA,IACX,QAAQ;AAAA,IACR,OAAO;AAAA,EAAA;AAAA,EAET,OAAO;AAAA,IACL,UAAU,KAAK;AAAA;AAAA,EAAA;AAEnB;AAEA,MAAM,EAAE,YAAY,WAAW,aAAa,UAAU,UAAU;AAChE,MAAM,kBAAkB,IAAI,WAAW,IAAI,IAAI,MAAM,OAAO;AAC5D,MAAM,iBAAiB,IAAI,WAAW,IAAI,IAAI,MAAM,MAAM;AAE1D,MAAM,cAAc,IAAI,SAAS,WAAW;AAC5C,MAAM,YAAY,IAAI,SAAS,SAAS;AACxC,MAAM,UAAU,IAAI,SAAS,OAAO;AACpC,MAAM,OAAO,IAAI,SAAS,IAAI;AAC9B,MAAM,cAAc,IAAI,SAAS,KAAK;AACtC,MAAM,aAAa,IAAI,SAAS,IAAI;AACpC,MAAM,eAAe,IAAI,SAAS,YAAY;AAC9C,MAAM,MAAM,IAAI,SAAS,GAAG;AAE5B,MAAM,mCAAmC,GAAG,SAAS,GAAG,eAAe;AACvE,MAAM,kCAAkC,GAAG,SAAS,GAAG,cAAc;AAGrE,MAAM,uBAAuB;AAAA,IACzB,gCAAgC;AAAA,wBACZ,MAAM,MAAM,KAAK;AAAA;AAAA;AAAA,IAGrC,gCAAgC;AAAA,aACvB,MAAM,MAAM,KAAK;AAAA;AAAA;AAAA,IAG1B,gCAAgC;AAAA,IAChC,gCAAgC;AAAA,aACvB,MAAM,MAAM,KAAK;AAAA;AAAA;AAAA,IAG1B,gCAAgC,IAAI,WAAW;AAAA,aACtC,MAAM,MAAM,IAAI;AAAA;AAAA;AAAA,KAGxB,gCAAgC,IAAI,YAAY;AAAA,YACzC,MAAM,MAAM,KAAK;AAAA;AAAA;AAK7B,MAAM,sBAAsB;AAAA,IACxB,+BAA+B;AAAA,wBACX,MAAM,MAAM,IAAI;AAAA;AAAA;AAAA,IAGpC,+BAA+B;AAAA,aACtB,MAAM,MAAM,KAAK;AAAA;AAAA;AAAA,KAGzB,+BAA+B,KAAK,YAAY;AAAA,YACzC,MAAM,MAAM,KAAK;AAAA;AAAA;AAK7B,MAAM,oBAAoB;AAAA,IACtB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAMW,YAAY,SAAS,CAAC;AAAA,MAC3C,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMd,YAAY;AAAA,YACJ,MAAM,MAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAO7B,MAAM,aAAa;AAAA,IACf,SAAS;AAAA,EACT,UAAU;AAAA,IACR,CAAC,GAAG,WAAW,EAAE,GAAG,WAAW,KAAK;AAAA,EAAA;AAExC,CAAC,CAAC;AAAA;AAAA,IAEA,WAAW;AAAA;AAAA;AAAA;AAAA,IAIX,WAAW;AAAA,kBACG,MAAM,QAAQ,EAAE;AAAA;AAAA;AAAA,IAG9B,SAAS;AAAA,EACT,UAAU;AAAA,IACR,CAAC,GAAG,UAAU,EAAE,GAAG,QAAQ,KAAK,KAAK;AAAA,EAAA;AAEzC,CAAC,CAAC;AAAA;AAAA,IAEA,UAAU;AAAA,IACV,UAAU;AAAA;AAAA;AAAA;AAAA,IAIV,UAAU;AAAA,kBACI,MAAM,QAAQ,EAAE;AAAA;AAAA;AAAA,IAG9B,GAAG;AAAA;AAAA;AAAA;AAAA,IAIH,GAAG;AAAA;AAAA;AAAA;AAMP,MAAM,gBAAgB;AAAA,IAClB,OAAO;AAAA;AAAA,mBAEQ,MAAM,QAAQ,EAAE;AAAA,sBACb,MAAM,QAAQ,EAAE;AAAA,qBACjB,MAAM,QAAQ,EAAE;AAAA;AAAA;AAAA,2BAGV,YAAY,MAAM;AAAA,MACvC,OAAO;AAAA,qBACQ,MAAM,QAAQ,EAAE;AAAA,wBACb,MAAM,QAAQ,EAAE;AAAA;AAAA;AAAA;AAMxC,MAAM,aAAa;AAAA,IACf,SAAS;AAAA,EACT,UAAU;AAAA,IACR,CAAC,GAAG,IAAI,EAAE,GAAG,OAAO,MAAM,WAAW;AAAA,EAAA;AAEzC,CAAC,CAAC;AAAA;AAIJ,MAAM,kBAAkB;AAAA,IACpB,SAAS;AAAA,iBACI,YAAY;AAAA,wBACL,MAAM,MAAM,KAAK,OAAO;AAAA,6BACnB,MAAM,MAAM,GAAG;AAAA,yBACnB,UAAU,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,2BAKb,YAAY,KAAK;AAAA,MACtC,SAAS;AAAA,+BACgB,MAAM,MAAM,GAAG;AAAA;AAAA;AAAA;AAMvC,MAAM,mBAAmB;AAAA,IAC5B,WAAW;AAAA,iBACE,YAAY;AAAA;AAAA;AAAA,IAGzB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,mBAAmB;AAAA;AAIvB,MAAM,kBAAkB,CAAC,WAAmB,UAAuB;AACjE,UAAQ,MAAM,kCAAkC,SAAS,YAAY,KAAK;AAC5E;AAEA,MAAM,iBAAiB,CAAI,QAA0B;AACnD,MAAI;AACF,UAAM,QAAQ,OAAO,aAAa,QAAQ,GAAG;AAC7C,WAAO,QAAQ,KAAK,MAAM,KAAK,IAAI;AAAA,EACrC,SAAS,OAAO;AACd,oBAAgB,WAAW,GAAG,IAAI,KAAc;AAChD,WAAO;AAAA,EACT;AACF;AAEA,MAAM,iBAAiB,CAAC,KAAa,UAAyB;AAC5D,MAAI;AACF,WAAO,aAAa,QAAQ,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,EACxD,SAAS,OAAO;AACd,oBAAgB,gBAAgB,KAAc;AAAA,EAChD;AACF;AAEA,MAAM,oBAAoB,MAAY;AACpC,QAAM,EAAE,iBAAiB;AACzB,SAAO,aAAa,WAAW,aAAa,UAAU;AACtD,SAAO,aAAa,WAAW,aAAa,KAAK;AACnD;AAEA,MAAM,kBAAkB,MAAwB;AAC9C,QAAM,eAAc,oBAAI,KAAA,GAAO,QAAA;AAC/B,QAAM,EAAE,cAAc,MAAA,IAAU;AAEhC,MAAI;AACF,UAAM,eAAe,eAAuB,aAAa,UAAU;AACnE,UAAM,iBAAiB,eAA0B,aAAa,KAAK;AAEnE,QAAI,CAAC,cAAc;AACjB,qBAAe,aAAa,YAAY,YAAY,SAAA,CAAU;AAC9D,aAAO,EAAE,aAAa,MAAM,YAAY,KAAA;AAAA,IAC1C;AAEA,UAAM,YAAY,SAAS,cAAc,EAAE;AAC3C,UAAM,cAAc,cAAc;AAElC,QAAI,cAAc,MAAM,YAAY,gBAAgB;AAClD,aAAO,EAAE,aAAa,OAAO,YAAY,eAAA;AAAA,IAC3C;AAEA,mBAAe,aAAa,YAAY,YAAY,SAAA,CAAU;AAC9D,WAAO,EAAE,aAAa,MAAM,YAAY,KAAA;AAAA,EAC1C,SAAS,OAAO;AACd,YAAQ,MAAM,uBAAuB,KAAK;AAC1C,WAAO,EAAE,aAAa,MAAM,YAAY,KAAA;AAAA,EAC1C;AACF;AAEA,MAAM,mBAAmB,CAAC,UAA2B;AACnD,iBAAe,gBAAgB,aAAa,OAAO,KAAK;AAC1D;AAEA,MAAM,gBAAgB,CACpB,KACA,WACA,eACgB;AAChB,QAAMA,WAAU,SAAS,cAAc,GAAG;AAC1C,MAAI,UAAWA,UAAQ,UAAU,IAAI,SAAS;AAC9C,MAAI,YAAY;AACd,WAAO,QAAQ,UAAU,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACnDA,eAAQ,aAAa,KAAK,KAAK;AAAA,IACjC,CAAC;AAAA,EACH;AACA,SAAOA;AACT;AAEA,MAAM,oBAAoB,CAAC,cAA8C;AACvE,QAAM,EAAE,UAAAC,WAAU,WAAAC,eAAc;AAChC,QAAM,SAAS,cAAc,UAAUD,UAAS,cAAc;AAAA,IAC5D,cAAc;AAAA,EAAA,CACf;AAED,SAAO,YAAYE;AACnB,SAAO,iBAAiB,SAAS,MAAM;AACrC,UAAM,cAAc;AAAA,MAClB,gBAAgB,aAAa;AAAA,IAAA;AAE/B,QAAI,aAAa;AAEf,gBAAU,MAAM,SAAS,GAAG,UAAU,YAAY;AAClD,gBAAU,MAAM,aAAa,UAAUD,WAAU,KAAK;AAEtD,uBAAiB,EAAE,GAAG,aAAa,QAAQ,MAAM;AAEjD,iBAAW,MAAM;AACf,kBAAU,MAAM,SAAS;AAAA,MAC3B,GAAG,GAAG;AAEN,iBAAW,MAAM;AACf,kBAAU,OAAA;AAAA,MACZ,GAAGA,WAAU,QAAQ,GAAG;AAAA,IAC1B;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,MAAM,mBAAmB,CAAC;AAAA,EACxB;AAAA,EACA;AACF,MAGM;AACJ,QAAM,OAAO,cAAc,KAAK,gBAAgB,SAAS,KAAK;AAAA,IAC5D,MAAM;AAAA,IACN,KAAK;AAAA,IACL,QAAQ;AAAA,EAAA,CACT;AACD,OAAK,YAAY;AAEjB,SAAOE,QAAgB;AAAA,IACrB,SAAS;AAAA,IACT,iBAAiB;AAAA,EAAA,CAClB;AACH;AAEA,MAAM,qBAAqB,CACzB,OACA,cACgB;AAChB,QAAM,EAAE,UAAAH,UAAAA,IAAa;AACrB,QAAM,UAAU,cAAc,OAAOA,UAAS,OAAO;AACrD,QAAM,OAAO,cAAc,OAAOA,UAAS,IAAI;AAC/C,QAAM,eAAe,MAAM,YAAY,MAAM;AAG7C,QAAM,QAAQ,cAAc,KAAKA,UAAS,KAAK;AAC/C,QAAM,YAAY;AAElB,QAAM,cAAc,kBAAkB,SAAS;AAE/C,UAAQ,OAAO,aAAa,KAAK;AAEjC,MAAI,MAAM,MAAM;AACd,UAAM,UAAU,cAAc,OAAOA,UAAS,IAAI;AAClD,YAAQ,YAAY,MAAM;AAC1B,YAAQ,OAAO,aAAa,OAAO,OAAO;AAAA,EAC5C;AAGA,MAAI,MAAM,QAAQ;AAChB,UAAM,MAAM,iBAAiB;AAAA,MAC3B,SAAS,MAAM,WAAW;AAAA,MAC1B,QAAQ,MAAM;AAAA,IAAA,CACf;AAED,YAAQ,YAAY,IAAI,OAAO;AAAA,EACjC;AAEA,OAAK,YAAY,OAAO;AACxB,SAAO;AACT;AAEA,MAAM,uBAAuB,CAAC,UAAkC;AAC9D,QAAM,EAAE,UAAAA,WAAU,YAAAI,gBAAe;AAEjC,QAAM,cAAc,cAAc,OAAOJ,UAAS,WAAW;AAC7D,QAAM,YAAY,cAAc,OAAOA,UAAS,WAAW;AAAA,IACzD,IAAIA,UAAS;AAAA,IACb,CAACI,YAAW,IAAI,GAAG,MAAM;AAAA,EAAA,CAC1B;AAED,QAAM,UAAU,mBAAmB,OAAO,SAAS;AACnD,YAAU,YAAY,OAAO;AAC7B,cAAY,YAAY,SAAS;AAEjC,SAAO;AACT;AAEA,MAAM,cAAc,OAAO;AAAA,EACzB;AACF,MAAiD;AAC/C,MAAI;AACF,UAAM,MAAM,YAAY,gBAAgB,KAAK;AAE7C,WAAO,MAAM,aAAa;AAAA,MACxB,OAAO;AAAA,MACP;AAAA,MACA,OAAO;AAAA,IAAA,CACR;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,2BAA2B,KAAK;AAC9C,WAAO;AAAA,EACT;AACF;AAEO,MAAM,iBAAiB,OAAO,EAAE,eAA2B;AAChE,QAAM,aAAa,gBAAA;AAGnB,MACE,CAAC,WAAW,eACZ,WAAW,cACX,CAAC,WAAW,WAAW,QACvB;AACA,WAAO,EAAE,SAAS,qBAAqB,WAAW,UAAU,EAAA;AAAA,EAC9D;AAGA,QAAM,WAAW,MAAM,YAAY,EAAE,UAAU;AAC/C,MAAI,CAAC,UAAU,MAAM,QAAQ,CAAC,GAAG;AAC/B,sBAAA;AACA,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,SAAS,MAAM,QAAQ,CAAC;AACtC,QAAM,cAAc;AAAA,IAClB,gBAAgB,aAAa;AAAA,EAAA;AAI/B,MAAI,aAAa,OAAO,MAAM,IAAI;AAChC,QAAI,CAAC,YAAY,UAAU,WAAW,aAAa;AACjD,aAAO,EAAE,SAAS,qBAAqB,WAAW,EAAA;AAAA,IACpD;AAAA,EACF,OAAO;AACL,sBAAA;AACA,qBAAiB,KAAK;AACtB,WAAO,EAAE,SAAS,qBAAqB,KAAK,EAAA;AAAA,EAC9C;AAEA,SAAO;AACT;"}
|
|
@@ -12,12 +12,11 @@ import "@universityofmaryland/web-icons-library/communication";
|
|
|
12
12
|
import "@universityofmaryland/web-icons-library/files";
|
|
13
13
|
import "@universityofmaryland/web-icons-library/brand";
|
|
14
14
|
import "@universityofmaryland/web-icons-library/arrows";
|
|
15
|
-
import "
|
|
15
|
+
import "@universityofmaryland/web-utilities-library/performance";
|
|
16
16
|
import "../../atomic/animations/brand/chevron-scroll.js";
|
|
17
17
|
import "../../atomic/animations/brand/card-stack.js";
|
|
18
18
|
import { createImageBackground } from "../../atomic/assets/image/background.js";
|
|
19
19
|
import "@universityofmaryland/web-styles-library";
|
|
20
|
-
import "@universityofmaryland/web-utilities-library/performance";
|
|
21
20
|
import { createVideoObservedAutoPlay } from "../../atomic/assets/video/observed-auto-play.js";
|
|
22
21
|
import "@universityofmaryland/web-icons-library/location";
|
|
23
22
|
import "@universityofmaryland/web-icons-library/calendar";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_common.js","sources":["../../../source/composite/pathway/_common.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 animationStyles from '@universityofmaryland/web-styles-library/animation';\nimport { theme } from '@universityofmaryland/web-utilities-library/theme';\nimport { wrapTextNodeInSpan } from '@universityofmaryland/web-utilities-library/dom';\nimport * as Atomic from 'atomic';\nimport { type PathwayTextLockupProps, type PathwayAssetProps } from './_types';\n\nexport const createCompositeHeadline = ({\n headline,\n isThemeDark,\n isThemeMaryland,\n}: Pick<\n PathwayTextLockupProps,\n 'headline' | 'isThemeDark' | 'isThemeMaryland'\n>) => {\n const characterCount = headline?.textContent?.trim().length || 0;\n const isOverwriteHeadline = characterCount > 30;\n const finalIsThemeDark = isThemeDark || isThemeMaryland;\n\n if (!headline) return null;\n\n const headlineStyles = {\n ...typography.sans.compose('largest', {\n theme: theme.fontColor(finalIsThemeDark),\n }),\n ...animationStyles.line.composeSlideUnder({\n color: theme.foreground(finalIsThemeDark),\n }),\n };\n\n return new ElementBuilder(headline)\n .styled(headlineStyles)\n .withStyles({\n element: {\n fontWeight: 800,\n textTransform: 'uppercase',\n textWrap: 'balance',\n\n [`@container (${token.media.queries.desktop.min})`]: {\n ...(isOverwriteHeadline && {\n fontSize: '40px',\n }),\n },\n },\n siblingAfter: {\n marginTop: token.spacing.md,\n },\n })\n .withModifier((el) => wrapTextNodeInSpan(el))\n .build();\n};\n\nexport const createCompositeStat = ({\n stats,\n}: Pick<PathwayTextLockupProps, 'stats'>) => {\n const mediumSize = 800;\n\n if (!stats) return null;\n\n const statWrapper = new ElementBuilder()\n .withClassName('text-lockup-medium-stats')\n .withStyles({\n element: {\n marginTop: token.spacing.lg,\n\n [`&:has(> *:nth-child(2))`]: {\n display: `grid`,\n gridGap: `${token.spacing.md}`,\n },\n\n [`@container (max-width: ${mediumSize - 1}px)`]: {\n marginTop: token.spacing.lg,\n paddingTop: token.spacing.md,\n borderTop: `1px solid ${token.color.gray.light}`,\n },\n\n [`@container (min-width: ${mediumSize}px)`]: {\n marginTop: token.spacing['2xl'],\n\n [`&:has(> *:nth-child(2))`]: {\n gridGap: `${token.spacing.lg}`,\n gridTemplateColumns: `repeat(2, 1fr)`,\n },\n },\n },\n })\n .build();\n\n statWrapper.element.innerHTML = stats.innerHTML;\n\n return statWrapper;\n};\n\nexport const createTextLockupMedium = (\n props: Pick<\n PathwayTextLockupProps,\n | 'stats'\n | 'actions'\n | 'eventDetails'\n | 'eyebrow'\n | 'headline'\n | 'stats'\n | 'text'\n | 'isThemeDark'\n | 'isThemeMaryland'\n >,\n) =>\n Atomic.textLockup.medium({\n ...props,\n ribbon: props.eyebrow,\n compositeHeadline: createCompositeHeadline(props),\n compositeStats: createCompositeStat(props),\n });\n\nexport const createAssetContent = (\n props: Pick<\n PathwayAssetProps,\n 'dateSign' | 'image' | 'video' | 'isImageScaled'\n >,\n) => {\n const { dateSign, image, video, isImageScaled = true } = props;\n const children = [];\n\n if (video) {\n children.push(\n Atomic.assets.video.observedAutoPlay({\n video,\n isScaled: isImageScaled,\n additionalElementStyles: {\n [`& video`]: {\n objectFit: 'cover',\n width: '100%',\n height: '100%',\n },\n },\n }),\n );\n }\n\n if (!video && image) {\n children.push(\n Atomic.assets.image.background({\n element: image,\n isScaled: isImageScaled,\n isShowCaption: true,\n isGifAllowed: true,\n dateSign,\n }),\n );\n }\n\n return new ElementBuilder()\n .withClassName('pathway-image-container-wrapper')\n .withChildren(...children)\n .withStyles({\n element: {\n position: 'relative',\n overflow: 'hidden',\n height: '100%',\n width: '100%',\n display: 'grid',\n\n [`&:has(.image-container)`]: {\n alignItems: 'center',\n },\n },\n })\n .build();\n};\n"],"names":["animationStyles","Atomic.textLockup.medium","Atomic.assets.video.observedAutoPlay","Atomic.assets.image.background"],"mappings":"
|
|
1
|
+
{"version":3,"file":"_common.js","sources":["../../../source/composite/pathway/_common.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 animationStyles from '@universityofmaryland/web-styles-library/animation';\nimport { theme } from '@universityofmaryland/web-utilities-library/theme';\nimport { wrapTextNodeInSpan } from '@universityofmaryland/web-utilities-library/dom';\nimport * as Atomic from 'atomic';\nimport { type PathwayTextLockupProps, type PathwayAssetProps } from './_types';\n\nexport const createCompositeHeadline = ({\n headline,\n isThemeDark,\n isThemeMaryland,\n}: Pick<\n PathwayTextLockupProps,\n 'headline' | 'isThemeDark' | 'isThemeMaryland'\n>) => {\n const characterCount = headline?.textContent?.trim().length || 0;\n const isOverwriteHeadline = characterCount > 30;\n const finalIsThemeDark = isThemeDark || isThemeMaryland;\n\n if (!headline) return null;\n\n const headlineStyles = {\n ...typography.sans.compose('largest', {\n theme: theme.fontColor(finalIsThemeDark),\n }),\n ...animationStyles.line.composeSlideUnder({\n color: theme.foreground(finalIsThemeDark),\n }),\n };\n\n return new ElementBuilder(headline)\n .styled(headlineStyles)\n .withStyles({\n element: {\n fontWeight: 800,\n textTransform: 'uppercase',\n textWrap: 'balance',\n\n [`@container (${token.media.queries.desktop.min})`]: {\n ...(isOverwriteHeadline && {\n fontSize: '40px',\n }),\n },\n },\n siblingAfter: {\n marginTop: token.spacing.md,\n },\n })\n .withModifier((el) => wrapTextNodeInSpan(el))\n .build();\n};\n\nexport const createCompositeStat = ({\n stats,\n}: Pick<PathwayTextLockupProps, 'stats'>) => {\n const mediumSize = 800;\n\n if (!stats) return null;\n\n const statWrapper = new ElementBuilder()\n .withClassName('text-lockup-medium-stats')\n .withStyles({\n element: {\n marginTop: token.spacing.lg,\n\n [`&:has(> *:nth-child(2))`]: {\n display: `grid`,\n gridGap: `${token.spacing.md}`,\n },\n\n [`@container (max-width: ${mediumSize - 1}px)`]: {\n marginTop: token.spacing.lg,\n paddingTop: token.spacing.md,\n borderTop: `1px solid ${token.color.gray.light}`,\n },\n\n [`@container (min-width: ${mediumSize}px)`]: {\n marginTop: token.spacing['2xl'],\n\n [`&:has(> *:nth-child(2))`]: {\n gridGap: `${token.spacing.lg}`,\n gridTemplateColumns: `repeat(2, 1fr)`,\n },\n },\n },\n })\n .build();\n\n statWrapper.element.innerHTML = stats.innerHTML;\n\n return statWrapper;\n};\n\nexport const createTextLockupMedium = (\n props: Pick<\n PathwayTextLockupProps,\n | 'stats'\n | 'actions'\n | 'eventDetails'\n | 'eyebrow'\n | 'headline'\n | 'stats'\n | 'text'\n | 'isThemeDark'\n | 'isThemeMaryland'\n >,\n) =>\n Atomic.textLockup.medium({\n ...props,\n ribbon: props.eyebrow,\n compositeHeadline: createCompositeHeadline(props),\n compositeStats: createCompositeStat(props),\n });\n\nexport const createAssetContent = (\n props: Pick<\n PathwayAssetProps,\n 'dateSign' | 'image' | 'video' | 'isImageScaled'\n >,\n) => {\n const { dateSign, image, video, isImageScaled = true } = props;\n const children = [];\n\n if (video) {\n children.push(\n Atomic.assets.video.observedAutoPlay({\n video,\n isScaled: isImageScaled,\n additionalElementStyles: {\n [`& video`]: {\n objectFit: 'cover',\n width: '100%',\n height: '100%',\n },\n },\n }),\n );\n }\n\n if (!video && image) {\n children.push(\n Atomic.assets.image.background({\n element: image,\n isScaled: isImageScaled,\n isShowCaption: true,\n isGifAllowed: true,\n dateSign,\n }),\n );\n }\n\n return new ElementBuilder()\n .withClassName('pathway-image-container-wrapper')\n .withChildren(...children)\n .withStyles({\n element: {\n position: 'relative',\n overflow: 'hidden',\n height: '100%',\n width: '100%',\n display: 'grid',\n\n [`&:has(.image-container)`]: {\n alignItems: 'center',\n },\n },\n })\n .build();\n};\n"],"names":["animationStyles","Atomic.textLockup.medium","Atomic.assets.video.observedAutoPlay","Atomic.assets.image.background"],"mappings":"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"}
|
|
@@ -13,11 +13,10 @@ import "@universityofmaryland/web-icons-library/communication";
|
|
|
13
13
|
import "@universityofmaryland/web-icons-library/files";
|
|
14
14
|
import "@universityofmaryland/web-icons-library/brand";
|
|
15
15
|
import "@universityofmaryland/web-icons-library/arrows";
|
|
16
|
-
import "
|
|
16
|
+
import "@universityofmaryland/web-utilities-library/performance";
|
|
17
17
|
import "../../atomic/animations/brand/chevron-scroll.js";
|
|
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/performance";
|
|
21
20
|
import { createVideoObservedAutoPlay } from "../../atomic/assets/video/observed-auto-play.js";
|
|
22
21
|
import "@universityofmaryland/web-icons-library/location";
|
|
23
22
|
import "@universityofmaryland/web-icons-library/calendar";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hero.js","sources":["../../../source/composite/pathway/hero.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport * as Styles from '@universityofmaryland/web-styles-library';\nimport { withViewTimelineAnimation } from '@universityofmaryland/web-utilities-library/styles';\nimport { assets, textLockup } from 'atomic';\n\ninterface PathwayHeroProps {\n actions: HTMLElement | null;\n eyebrow: HTMLElement | null;\n headline: HTMLElement | null;\n image: HTMLImageElement | null;\n includesAnimation?: boolean;\n isImagePositionLeft?: boolean;\n isThemeDark?: boolean;\n text: HTMLElement | null;\n video: HTMLVideoElement | null;\n}\n\n// Constants\nconst BREAK_SMALL = 999;\nconst BREAK_MEDIUM = 1000;\nconst BREAK_LARGE = 1300;\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\n// Keyframe animations\nconst keyFramePathwayResize = `\n @keyframes pathway-hero-resize {\n from { transform: ${ANIMATION_CONFIG.RESIZE.TRANSFORM.FROM}; }\n to { transform: ${ANIMATION_CONFIG.RESIZE.TRANSFORM.TO}; }\n }\n`;\n\nconst keyFramePathwaySlideUp = `\n @keyframes pathway-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 createAssetColumn = ({\n image,\n video,\n includesAnimation,\n isImagePositionLeft,\n}: Pick<\n PathwayHeroProps,\n 'image' | 'video' | 'includesAnimation' | 'isImagePositionLeft'\n>) => {\n if (!image && !video) return;\n\n const builder = new ElementBuilder()\n .withClassName('pathway-hero-container-asset-wrapper')\n .withStyles({\n element: {\n overflow: 'hidden',\n position: 'relative',\n\n [`@container (max-width: ${BREAK_SMALL}px)`]: {\n aspectRatio: '16 / 9',\n },\n\n [`@container (min-width: ${BREAK_MEDIUM}px)`]: {\n width: '50%',\n position: 'absolute',\n top: 0,\n left: 0,\n bottom: 0,\n height: '100%',\n\n ...(!isImagePositionLeft && {\n left: 'inherit',\n right: 0,\n }),\n },\n\n [`& img, & video`]: {\n [`@container (min-width: ${BREAK_MEDIUM}px)`]: {\n ...(includesAnimation && {\n ...withViewTimelineAnimation({\n animation: `pathway-hero-resize forwards ${ANIMATION_CONFIG.RESIZE.DURATION}`,\n }),\n }),\n },\n },\n },\n });\n\n if (video) {\n builder.withChild(\n assets.video.observedAutoPlay({\n video,\n isScaled: true,\n additionalElementStyles: {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n }),\n );\n }\n\n if (image && !video) {\n builder.withChild(\n assets.image.background({\n element: image,\n isScaled: true,\n isShowCaption: true,\n isGifAllowed: true,\n }),\n );\n }\n\n return builder.build();\n};\n\nconst createHeadline = (props: Pick<PathwayHeroProps, 'headline'>) => {\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 color: token.color.black,\n margin: '0 auto',\n textTransform: 'uppercase',\n marginTop: `${token.spacing.sm}`,\n\n [`@container (${token.media.queries.desktop.min})`]: {\n ...(isOverwriteHeadline && {\n fontSize: '80px',\n }),\n },\n\n ['& a:hover, & a:focus']: {\n textDecoration: 'underline',\n },\n },\n siblingAfter: {\n marginTop: `${token.spacing.md}`,\n },\n })\n .build();\n};\n\nconst createTextColumn = (\n props: Pick<\n PathwayHeroProps,\n 'actions' | 'eyebrow' | 'headline' | 'isThemeDark' | 'text'\n >,\n) => {\n const { headline, eyebrow, text, ...rest } = props;\n\n return textLockup.large({\n ...rest,\n ribbon: eyebrow,\n textLargest: text,\n headlineComposite: createHeadline({ headline }),\n additionalStyles: {\n maxWidth: '720px',\n },\n });\n};\n\nconst createTextWrapper = (props: PathwayHeroProps) =>\n new ElementBuilder()\n .withClassName('pathway-hero-container-lock-wrapper')\n .withChild(createTextColumn(props))\n .withStyles({\n element: {\n width: '100%',\n\n [`@container (max-width: ${BREAK_SMALL}px)`]: {\n padding: `${token.spacing.md} 0`,\n },\n\n [`@container (min-width: ${BREAK_MEDIUM}px)`]: {\n padding: `${token.spacing['4xl']} 0`,\n\n ...(props.isImagePositionLeft && {\n paddingRight: 0,\n }),\n\n ...(!props.isImagePositionLeft && {\n paddingLeft: 0,\n }),\n\n ...(props.includesAnimation && {\n ...withViewTimelineAnimation({\n animation: `pathway-hero-slide-up forwards ${ANIMATION_CONFIG.SLIDE_UP.DURATION}`,\n }),\n }),\n },\n\n [`@container (min-width: ${BREAK_LARGE}px)`]: {\n padding: `${token.spacing['8xl']} 0`,\n },\n },\n })\n .build();\n\nconst createLockColumn = (props: PathwayHeroProps) =>\n new ElementBuilder()\n .styled(Styles.layout.space.horizontal.larger)\n .withChild(createTextWrapper(props))\n .withStyles({\n element: {\n position: 'relative',\n\n [`@container (min-width: ${BREAK_MEDIUM}px)`]: {\n display: 'flex',\n alignItems: 'center',\n minHeight: '720px',\n\n ...(props.isImagePositionLeft && {\n paddingRight: token.spacing['2xl'],\n }),\n\n ...(!props.isImagePositionLeft && {\n paddingLeft: token.spacing['2xl'],\n order: 1,\n }),\n },\n\n [`@container (min-width: ${BREAK_LARGE}px)`]: {\n ...(!props.isImagePositionLeft && {\n paddingRight: token.spacing['4xl'],\n }),\n\n ...(props.isImagePositionLeft && {\n paddingLeft: token.spacing['4xl'],\n }),\n },\n },\n })\n .build();\n\nconst createWrapper = (props: PathwayHeroProps) => {\n const { isImagePositionLeft = false } = props;\n const imageColumn = createAssetColumn(props);\n\n const builder = new ElementBuilder()\n .withClassName('pathway-hero-container-wrapper')\n .withStyles({\n element: {\n position: 'relative',\n\n ...(isImagePositionLeft && {\n [`@container (min-width: ${BREAK_MEDIUM}px)`]: {\n paddingLeft: '50%',\n },\n }),\n\n ...(!isImagePositionLeft && {\n [`@container (min-width: ${BREAK_MEDIUM}px)`]: {\n paddingRight: '50%',\n },\n }),\n },\n });\n\n if (imageColumn) {\n builder.withChild(imageColumn);\n }\n\n builder.withChild(createLockColumn(props));\n\n return builder.build();\n};\n\nconst CreatePathwayHeroElement = (props: PathwayHeroProps) => {\n const composite = new ElementBuilder()\n .withClassName('pathway-hero-container')\n .withChild(createWrapper(props))\n .withStyles({\n element: {\n containerType: 'inline-size',\n position: 'relative',\n },\n })\n .build();\n\n composite.styles += keyFramePathwayResize;\n composite.styles += keyFramePathwaySlideUp;\n\n return composite;\n};\n\nexport const createCompositePathwayHero = CreatePathwayHeroElement;\n"],"names":["assets.video.observedAutoPlay","assets.image.background","textLockup.large"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hero.js","sources":["../../../source/composite/pathway/hero.ts"],"sourcesContent":["import { ElementBuilder } from '@universityofmaryland/web-builder-library';\nimport * as token from '@universityofmaryland/web-token-library';\nimport * as Styles from '@universityofmaryland/web-styles-library';\nimport { withViewTimelineAnimation } from '@universityofmaryland/web-utilities-library/styles';\nimport { assets, textLockup } from 'atomic';\n\ninterface PathwayHeroProps {\n actions: HTMLElement | null;\n eyebrow: HTMLElement | null;\n headline: HTMLElement | null;\n image: HTMLImageElement | null;\n includesAnimation?: boolean;\n isImagePositionLeft?: boolean;\n isThemeDark?: boolean;\n text: HTMLElement | null;\n video: HTMLVideoElement | null;\n}\n\n// Constants\nconst BREAK_SMALL = 999;\nconst BREAK_MEDIUM = 1000;\nconst BREAK_LARGE = 1300;\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\n// Keyframe animations\nconst keyFramePathwayResize = `\n @keyframes pathway-hero-resize {\n from { transform: ${ANIMATION_CONFIG.RESIZE.TRANSFORM.FROM}; }\n to { transform: ${ANIMATION_CONFIG.RESIZE.TRANSFORM.TO}; }\n }\n`;\n\nconst keyFramePathwaySlideUp = `\n @keyframes pathway-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 createAssetColumn = ({\n image,\n video,\n includesAnimation,\n isImagePositionLeft,\n}: Pick<\n PathwayHeroProps,\n 'image' | 'video' | 'includesAnimation' | 'isImagePositionLeft'\n>) => {\n if (!image && !video) return;\n\n const builder = new ElementBuilder()\n .withClassName('pathway-hero-container-asset-wrapper')\n .withStyles({\n element: {\n overflow: 'hidden',\n position: 'relative',\n\n [`@container (max-width: ${BREAK_SMALL}px)`]: {\n aspectRatio: '16 / 9',\n },\n\n [`@container (min-width: ${BREAK_MEDIUM}px)`]: {\n width: '50%',\n position: 'absolute',\n top: 0,\n left: 0,\n bottom: 0,\n height: '100%',\n\n ...(!isImagePositionLeft && {\n left: 'inherit',\n right: 0,\n }),\n },\n\n [`& img, & video`]: {\n [`@container (min-width: ${BREAK_MEDIUM}px)`]: {\n ...(includesAnimation && {\n ...withViewTimelineAnimation({\n animation: `pathway-hero-resize forwards ${ANIMATION_CONFIG.RESIZE.DURATION}`,\n }),\n }),\n },\n },\n },\n });\n\n if (video) {\n builder.withChild(\n assets.video.observedAutoPlay({\n video,\n isScaled: true,\n additionalElementStyles: {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n }),\n );\n }\n\n if (image && !video) {\n builder.withChild(\n assets.image.background({\n element: image,\n isScaled: true,\n isShowCaption: true,\n isGifAllowed: true,\n }),\n );\n }\n\n return builder.build();\n};\n\nconst createHeadline = (props: Pick<PathwayHeroProps, 'headline'>) => {\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 color: token.color.black,\n margin: '0 auto',\n textTransform: 'uppercase',\n marginTop: `${token.spacing.sm}`,\n\n [`@container (${token.media.queries.desktop.min})`]: {\n ...(isOverwriteHeadline && {\n fontSize: '80px',\n }),\n },\n\n ['& a:hover, & a:focus']: {\n textDecoration: 'underline',\n },\n },\n siblingAfter: {\n marginTop: `${token.spacing.md}`,\n },\n })\n .build();\n};\n\nconst createTextColumn = (\n props: Pick<\n PathwayHeroProps,\n 'actions' | 'eyebrow' | 'headline' | 'isThemeDark' | 'text'\n >,\n) => {\n const { headline, eyebrow, text, ...rest } = props;\n\n return textLockup.large({\n ...rest,\n ribbon: eyebrow,\n textLargest: text,\n headlineComposite: createHeadline({ headline }),\n additionalStyles: {\n maxWidth: '720px',\n },\n });\n};\n\nconst createTextWrapper = (props: PathwayHeroProps) =>\n new ElementBuilder()\n .withClassName('pathway-hero-container-lock-wrapper')\n .withChild(createTextColumn(props))\n .withStyles({\n element: {\n width: '100%',\n\n [`@container (max-width: ${BREAK_SMALL}px)`]: {\n padding: `${token.spacing.md} 0`,\n },\n\n [`@container (min-width: ${BREAK_MEDIUM}px)`]: {\n padding: `${token.spacing['4xl']} 0`,\n\n ...(props.isImagePositionLeft && {\n paddingRight: 0,\n }),\n\n ...(!props.isImagePositionLeft && {\n paddingLeft: 0,\n }),\n\n ...(props.includesAnimation && {\n ...withViewTimelineAnimation({\n animation: `pathway-hero-slide-up forwards ${ANIMATION_CONFIG.SLIDE_UP.DURATION}`,\n }),\n }),\n },\n\n [`@container (min-width: ${BREAK_LARGE}px)`]: {\n padding: `${token.spacing['8xl']} 0`,\n },\n },\n })\n .build();\n\nconst createLockColumn = (props: PathwayHeroProps) =>\n new ElementBuilder()\n .styled(Styles.layout.space.horizontal.larger)\n .withChild(createTextWrapper(props))\n .withStyles({\n element: {\n position: 'relative',\n\n [`@container (min-width: ${BREAK_MEDIUM}px)`]: {\n display: 'flex',\n alignItems: 'center',\n minHeight: '720px',\n\n ...(props.isImagePositionLeft && {\n paddingRight: token.spacing['2xl'],\n }),\n\n ...(!props.isImagePositionLeft && {\n paddingLeft: token.spacing['2xl'],\n order: 1,\n }),\n },\n\n [`@container (min-width: ${BREAK_LARGE}px)`]: {\n ...(!props.isImagePositionLeft && {\n paddingRight: token.spacing['4xl'],\n }),\n\n ...(props.isImagePositionLeft && {\n paddingLeft: token.spacing['4xl'],\n }),\n },\n },\n })\n .build();\n\nconst createWrapper = (props: PathwayHeroProps) => {\n const { isImagePositionLeft = false } = props;\n const imageColumn = createAssetColumn(props);\n\n const builder = new ElementBuilder()\n .withClassName('pathway-hero-container-wrapper')\n .withStyles({\n element: {\n position: 'relative',\n\n ...(isImagePositionLeft && {\n [`@container (min-width: ${BREAK_MEDIUM}px)`]: {\n paddingLeft: '50%',\n },\n }),\n\n ...(!isImagePositionLeft && {\n [`@container (min-width: ${BREAK_MEDIUM}px)`]: {\n paddingRight: '50%',\n },\n }),\n },\n });\n\n if (imageColumn) {\n builder.withChild(imageColumn);\n }\n\n builder.withChild(createLockColumn(props));\n\n return builder.build();\n};\n\nconst CreatePathwayHeroElement = (props: PathwayHeroProps) => {\n const composite = new ElementBuilder()\n .withClassName('pathway-hero-container')\n .withChild(createWrapper(props))\n .withStyles({\n element: {\n containerType: 'inline-size',\n position: 'relative',\n },\n })\n .build();\n\n composite.styles += keyFramePathwayResize;\n composite.styles += keyFramePathwaySlideUp;\n\n return composite;\n};\n\nexport const createCompositePathwayHero = CreatePathwayHeroElement;\n"],"names":["assets.video.observedAutoPlay","assets.image.background","textLockup.large"],"mappings":"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"}
|
|
@@ -13,11 +13,10 @@ import "@universityofmaryland/web-icons-library/communication";
|
|
|
13
13
|
import "@universityofmaryland/web-icons-library/files";
|
|
14
14
|
import "@universityofmaryland/web-icons-library/brand";
|
|
15
15
|
import "@universityofmaryland/web-icons-library/arrows";
|
|
16
|
-
import "
|
|
16
|
+
import "@universityofmaryland/web-utilities-library/performance";
|
|
17
17
|
import "../../../atomic/animations/brand/chevron-scroll.js";
|
|
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/performance";
|
|
21
20
|
import "@universityofmaryland/web-utilities-library/accessibility";
|
|
22
21
|
import "@universityofmaryland/web-icons-library/location";
|
|
23
22
|
import "@universityofmaryland/web-icons-library/calendar";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"full.js","sources":["../../../../source/composite/person/bio/full.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 PersonBio } from '../_types';\nimport { type ElementModel } from '../../../_types';\n\nconst CreatePersonBioFullElement = (props: PersonBio): ElementModel<HTMLElement> => {\n const { isThemeDark, image, actions, description } = props;\n const { name, ...textProps } = props;\n\n const builder = new ElementBuilder()\n .withClassName('person-bio-full-container')\n .withStyles({\n element: {\n [`& .${elementStyles.asset.image.wrapper.className}`]: {\n [`@container (max-width: ${token.media.breakpointValues.medium.max}px)`]:\n {\n display: 'flex',\n },\n },\n },\n });\n\n if (image) {\n builder.withChild(\n assets.image.background({\n element: image,\n isScaled: false,\n }),\n );\n }\n\n if (name) {\n builder.withChild(\n new ElementBuilder(name)\n .styled(\n Styles.typography.sans.compose('extralarge', {\n theme: theme.fontColor(isThemeDark),\n }),\n )\n .withStyles({\n element: {\n marginTop: token.spacing.lg,\n textTransform: 'uppercase',\n fontWeight: '800',\n display: 'block',\n\n ...(!isThemeDark && { color: `${token.color.black}` }),\n },\n siblingAfter: {\n marginTop: token.spacing.min,\n },\n })\n .build(),\n );\n }\n\n builder.withChild(textLockup.person(textProps));\n builder.withChild(textLockup.contact(props));\n\n if (description) {\n builder.withChild(\n new ElementBuilder(description)\n .styled(\n Styles.element.text.rich.composeSimple({\n size: 'large',\n theme: theme.fontColor(isThemeDark),\n }),\n )\n .withStyles({\n element: {\n marginTop: token.spacing.lg,\n maxWidth: token.spacing.maxWidth.smallest,\n },\n })\n .build(),\n );\n }\n\n if (actions) {\n builder.withChild(\n new ElementBuilder(actions)\n .styled(Styles.layout.grid.inline.tabletRows)\n .withStyles({\n element: {\n marginTop: token.spacing.sm,\n },\n })\n .build(),\n );\n }\n\n return builder.build();\n};\n\nexport const createCompositePersonBioFull = CreatePersonBioFullElement;\n"],"names":["assets.image.background","textLockup.person","textLockup.contact"],"mappings":"
|
|
1
|
+
{"version":3,"file":"full.js","sources":["../../../../source/composite/person/bio/full.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 PersonBio } from '../_types';\nimport { type ElementModel } from '../../../_types';\n\nconst CreatePersonBioFullElement = (props: PersonBio): ElementModel<HTMLElement> => {\n const { isThemeDark, image, actions, description } = props;\n const { name, ...textProps } = props;\n\n const builder = new ElementBuilder()\n .withClassName('person-bio-full-container')\n .withStyles({\n element: {\n [`& .${elementStyles.asset.image.wrapper.className}`]: {\n [`@container (max-width: ${token.media.breakpointValues.medium.max}px)`]:\n {\n display: 'flex',\n },\n },\n },\n });\n\n if (image) {\n builder.withChild(\n assets.image.background({\n element: image,\n isScaled: false,\n }),\n );\n }\n\n if (name) {\n builder.withChild(\n new ElementBuilder(name)\n .styled(\n Styles.typography.sans.compose('extralarge', {\n theme: theme.fontColor(isThemeDark),\n }),\n )\n .withStyles({\n element: {\n marginTop: token.spacing.lg,\n textTransform: 'uppercase',\n fontWeight: '800',\n display: 'block',\n\n ...(!isThemeDark && { color: `${token.color.black}` }),\n },\n siblingAfter: {\n marginTop: token.spacing.min,\n },\n })\n .build(),\n );\n }\n\n builder.withChild(textLockup.person(textProps));\n builder.withChild(textLockup.contact(props));\n\n if (description) {\n builder.withChild(\n new ElementBuilder(description)\n .styled(\n Styles.element.text.rich.composeSimple({\n size: 'large',\n theme: theme.fontColor(isThemeDark),\n }),\n )\n .withStyles({\n element: {\n marginTop: token.spacing.lg,\n maxWidth: token.spacing.maxWidth.smallest,\n },\n })\n .build(),\n );\n }\n\n if (actions) {\n builder.withChild(\n new ElementBuilder(actions)\n .styled(Styles.layout.grid.inline.tabletRows)\n .withStyles({\n element: {\n marginTop: token.spacing.sm,\n },\n })\n .build(),\n );\n }\n\n return builder.build();\n};\n\nexport const createCompositePersonBioFull = CreatePersonBioFullElement;\n"],"names":["assets.image.background","textLockup.person","textLockup.contact"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,MAAM,6BAA6B,CAAC,UAAgD;AAClF,QAAM,EAAE,aAAa,OAAO,SAAS,gBAAgB;AACrD,QAAM,EAAE,MAAM,GAAG,UAAA,IAAc;AAE/B,QAAM,UAAU,IAAI,eAAA,EACjB,cAAc,2BAA2B,EACzC,WAAW;AAAA,IACV,SAAS;AAAA,MACP,CAAC,MAAM,cAAc,MAAM,MAAM,QAAQ,SAAS,EAAE,GAAG;AAAA,QACrD,CAAC,0BAA0B,MAAM,MAAM,iBAAiB,OAAO,GAAG,KAAK,GACrE;AAAA,UACE,SAAS;AAAA,QAAA;AAAA,MACX;AAAA,IACJ;AAAA,EACF,CACD;AAEH,MAAI,OAAO;AACT,YAAQ;AAAA,MACNA,sBAAwB;AAAA,QACtB,SAAS;AAAA,QACT,UAAU;AAAA,MAAA,CACX;AAAA,IAAA;AAAA,EAEL;AAEA,MAAI,MAAM;AACR,YAAQ;AAAA,MACN,IAAI,eAAe,IAAI,EACpB;AAAA,QACC,OAAO,WAAW,KAAK,QAAQ,cAAc;AAAA,UAC3C,OAAO,MAAM,UAAU,WAAW;AAAA,QAAA,CACnC;AAAA,MAAA,EAEF,WAAW;AAAA,QACV,SAAS;AAAA,UACP,WAAW,MAAM,QAAQ;AAAA,UACzB,eAAe;AAAA,UACf,YAAY;AAAA,UACZ,SAAS;AAAA,UAET,GAAI,CAAC,eAAe,EAAE,OAAO,GAAG,MAAM,MAAM,KAAK,GAAA;AAAA,QAAG;AAAA,QAEtD,cAAc;AAAA,UACZ,WAAW,MAAM,QAAQ;AAAA,QAAA;AAAA,MAC3B,CACD,EACA,MAAA;AAAA,IAAM;AAAA,EAEb;AAEA,UAAQ,UAAUC,uBAAkB,SAAS,CAAC;AAC9C,UAAQ,UAAUC,wBAAmB,KAAK,CAAC;AAE3C,MAAI,aAAa;AACf,YAAQ;AAAA,MACN,IAAI,eAAe,WAAW,EAC3B;AAAA,QACC,OAAO,QAAQ,KAAK,KAAK,cAAc;AAAA,UACrC,MAAM;AAAA,UACN,OAAO,MAAM,UAAU,WAAW;AAAA,QAAA,CACnC;AAAA,MAAA,EAEF,WAAW;AAAA,QACV,SAAS;AAAA,UACP,WAAW,MAAM,QAAQ;AAAA,UACzB,UAAU,MAAM,QAAQ,SAAS;AAAA,QAAA;AAAA,MACnC,CACD,EACA,MAAA;AAAA,IAAM;AAAA,EAEb;AAEA,MAAI,SAAS;AACX,YAAQ;AAAA,MACN,IAAI,eAAe,OAAO,EACvB,OAAO,OAAO,OAAO,KAAK,OAAO,UAAU,EAC3C,WAAW;AAAA,QACV,SAAS;AAAA,UACP,WAAW,MAAM,QAAQ;AAAA,QAAA;AAAA,MAC3B,CACD,EACA,MAAA;AAAA,IAAM;AAAA,EAEb;AAEA,SAAO,QAAQ,MAAA;AACjB;AAEO,MAAM,+BAA+B;"}
|